Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
8c603485
Commit
8c603485
authored
Nov 04, 2015
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'spi/topic/doc' into spi-next
parents
f0a2a049
97d56dc6
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
117 additions
and
23 deletions
+117
-23
drivers/spi/spi.c
drivers/spi/spi.c
+93
-9
include/linux/spi/spi.h
include/linux/spi/spi.h
+24
-14
No files found.
drivers/spi/spi.c
View file @
8c603485
...
...
@@ -123,6 +123,28 @@ SPI_STATISTICS_SHOW(bytes, "%llu");
SPI_STATISTICS_SHOW
(
bytes_rx
,
"%llu"
);
SPI_STATISTICS_SHOW
(
bytes_tx
,
"%llu"
);
#define SPI_STATISTICS_TRANSFER_BYTES_HISTO(index, number) \
SPI_STATISTICS_SHOW_NAME(transfer_bytes_histo##index, \
"transfer_bytes_histo_" number, \
transfer_bytes_histo[index], "%lu")
SPI_STATISTICS_TRANSFER_BYTES_HISTO
(
0
,
"0-1"
);
SPI_STATISTICS_TRANSFER_BYTES_HISTO
(
1
,
"2-3"
);
SPI_STATISTICS_TRANSFER_BYTES_HISTO
(
2
,
"4-7"
);
SPI_STATISTICS_TRANSFER_BYTES_HISTO
(
3
,
"8-15"
);
SPI_STATISTICS_TRANSFER_BYTES_HISTO
(
4
,
"16-31"
);
SPI_STATISTICS_TRANSFER_BYTES_HISTO
(
5
,
"32-63"
);
SPI_STATISTICS_TRANSFER_BYTES_HISTO
(
6
,
"64-127"
);
SPI_STATISTICS_TRANSFER_BYTES_HISTO
(
7
,
"128-255"
);
SPI_STATISTICS_TRANSFER_BYTES_HISTO
(
8
,
"256-511"
);
SPI_STATISTICS_TRANSFER_BYTES_HISTO
(
9
,
"512-1023"
);
SPI_STATISTICS_TRANSFER_BYTES_HISTO
(
10
,
"1024-2047"
);
SPI_STATISTICS_TRANSFER_BYTES_HISTO
(
11
,
"2048-4095"
);
SPI_STATISTICS_TRANSFER_BYTES_HISTO
(
12
,
"4096-8191"
);
SPI_STATISTICS_TRANSFER_BYTES_HISTO
(
13
,
"8192-16383"
);
SPI_STATISTICS_TRANSFER_BYTES_HISTO
(
14
,
"16384-32767"
);
SPI_STATISTICS_TRANSFER_BYTES_HISTO
(
15
,
"32768-65535"
);
SPI_STATISTICS_TRANSFER_BYTES_HISTO
(
16
,
"65536+"
);
static
struct
attribute
*
spi_dev_attrs
[]
=
{
&
dev_attr_modalias
.
attr
,
NULL
,
...
...
@@ -143,6 +165,23 @@ static struct attribute *spi_device_statistics_attrs[] = {
&
dev_attr_spi_device_bytes
.
attr
,
&
dev_attr_spi_device_bytes_rx
.
attr
,
&
dev_attr_spi_device_bytes_tx
.
attr
,
&
dev_attr_spi_device_transfer_bytes_histo0
.
attr
,
&
dev_attr_spi_device_transfer_bytes_histo1
.
attr
,
&
dev_attr_spi_device_transfer_bytes_histo2
.
attr
,
&
dev_attr_spi_device_transfer_bytes_histo3
.
attr
,
&
dev_attr_spi_device_transfer_bytes_histo4
.
attr
,
&
dev_attr_spi_device_transfer_bytes_histo5
.
attr
,
&
dev_attr_spi_device_transfer_bytes_histo6
.
attr
,
&
dev_attr_spi_device_transfer_bytes_histo7
.
attr
,
&
dev_attr_spi_device_transfer_bytes_histo8
.
attr
,
&
dev_attr_spi_device_transfer_bytes_histo9
.
attr
,
&
dev_attr_spi_device_transfer_bytes_histo10
.
attr
,
&
dev_attr_spi_device_transfer_bytes_histo11
.
attr
,
&
dev_attr_spi_device_transfer_bytes_histo12
.
attr
,
&
dev_attr_spi_device_transfer_bytes_histo13
.
attr
,
&
dev_attr_spi_device_transfer_bytes_histo14
.
attr
,
&
dev_attr_spi_device_transfer_bytes_histo15
.
attr
,
&
dev_attr_spi_device_transfer_bytes_histo16
.
attr
,
NULL
,
};
...
...
@@ -168,6 +207,23 @@ static struct attribute *spi_master_statistics_attrs[] = {
&
dev_attr_spi_master_bytes
.
attr
,
&
dev_attr_spi_master_bytes_rx
.
attr
,
&
dev_attr_spi_master_bytes_tx
.
attr
,
&
dev_attr_spi_master_transfer_bytes_histo0
.
attr
,
&
dev_attr_spi_master_transfer_bytes_histo1
.
attr
,
&
dev_attr_spi_master_transfer_bytes_histo2
.
attr
,
&
dev_attr_spi_master_transfer_bytes_histo3
.
attr
,
&
dev_attr_spi_master_transfer_bytes_histo4
.
attr
,
&
dev_attr_spi_master_transfer_bytes_histo5
.
attr
,
&
dev_attr_spi_master_transfer_bytes_histo6
.
attr
,
&
dev_attr_spi_master_transfer_bytes_histo7
.
attr
,
&
dev_attr_spi_master_transfer_bytes_histo8
.
attr
,
&
dev_attr_spi_master_transfer_bytes_histo9
.
attr
,
&
dev_attr_spi_master_transfer_bytes_histo10
.
attr
,
&
dev_attr_spi_master_transfer_bytes_histo11
.
attr
,
&
dev_attr_spi_master_transfer_bytes_histo12
.
attr
,
&
dev_attr_spi_master_transfer_bytes_histo13
.
attr
,
&
dev_attr_spi_master_transfer_bytes_histo14
.
attr
,
&
dev_attr_spi_master_transfer_bytes_histo15
.
attr
,
&
dev_attr_spi_master_transfer_bytes_histo16
.
attr
,
NULL
,
};
...
...
@@ -186,10 +242,15 @@ void spi_statistics_add_transfer_stats(struct spi_statistics *stats,
struct
spi_master
*
master
)
{
unsigned
long
flags
;
int
l2len
=
min
(
fls
(
xfer
->
len
),
SPI_STATISTICS_HISTO_SIZE
)
-
1
;
if
(
l2len
<
0
)
l2len
=
0
;
spin_lock_irqsave
(
&
stats
->
lock
,
flags
);
stats
->
transfers
++
;
stats
->
transfer_bytes_histo
[
l2len
]
++
;
stats
->
bytes
+=
xfer
->
len
;
if
((
xfer
->
tx_buf
)
&&
...
...
@@ -317,6 +378,8 @@ static void spi_drv_shutdown(struct device *dev)
* spi_register_driver - register a SPI driver
* @sdrv: the driver to register
* Context: can sleep
*
* Return: zero on success, else a negative error code.
*/
int
spi_register_driver
(
struct
spi_driver
*
sdrv
)
{
...
...
@@ -368,7 +431,7 @@ static DEFINE_MUTEX(board_lock);
* needs to discard the spi_device without adding it, then it should
* call spi_dev_put() on it.
*
* Return
s
a pointer to the new device, or NULL.
* Return
:
a pointer to the new device, or NULL.
*/
struct
spi_device
*
spi_alloc_device
(
struct
spi_master
*
master
)
{
...
...
@@ -427,7 +490,7 @@ static int spi_dev_check(struct device *dev, void *data)
* Companion function to spi_alloc_device. Devices allocated with
* spi_alloc_device can be added onto the spi bus with this function.
*
* Return
s
0 on success; negative errno on failure
* Return
:
0 on success; negative errno on failure
*/
int
spi_add_device
(
struct
spi_device
*
spi
)
{
...
...
@@ -500,7 +563,7 @@ EXPORT_SYMBOL_GPL(spi_add_device);
* this is exported so that for example a USB or parport based adapter
* driver could add devices (which it would learn about out-of-band).
*
* Return
s
the new device, or NULL.
* Return
:
the new device, or NULL.
*/
struct
spi_device
*
spi_new_device
(
struct
spi_master
*
master
,
struct
spi_board_info
*
chip
)
...
...
@@ -572,6 +635,8 @@ static void spi_match_master_to_boardinfo(struct spi_master *master,
*
* The board info passed can safely be __initdata ... but be careful of
* any embedded pointers (platform_data, etc), they're copied as-is.
*
* Return: zero on success, else a negative error code.
*/
int
spi_register_board_info
(
struct
spi_board_info
const
*
info
,
unsigned
n
)
{
...
...
@@ -1149,6 +1214,8 @@ static int spi_init_queue(struct spi_master *master)
*
* If there are more messages in the queue, the next message is returned from
* this call.
*
* Return: the next message in the queue, else NULL if the queue is empty.
*/
struct
spi_message
*
spi_get_next_queued_message
(
struct
spi_master
*
master
)
{
...
...
@@ -1312,6 +1379,8 @@ static int __spi_queued_transfer(struct spi_device *spi,
* spi_queued_transfer - transfer function for queued transfers
* @spi: spi device which is requesting transfer
* @msg: spi message which is to handled is queued to driver queue
*
* Return: zero on success, else a negative error code.
*/
static
int
spi_queued_transfer
(
struct
spi_device
*
spi
,
struct
spi_message
*
msg
)
{
...
...
@@ -1611,12 +1680,13 @@ static struct class spi_master_class = {
* only ones directly touching chip registers. It's how they allocate
* an spi_master structure, prior to calling spi_register_master().
*
* This must be called from context that can sleep. It returns the SPI
* master structure on success, else NULL.
* This must be called from context that can sleep.
*
* The caller is responsible for assigning the bus number and initializing
* the master's methods before calling spi_register_master(); and (after errors
* adding the device) calling spi_master_put() to prevent a memory leak.
*
* Return: the SPI master structure on success, else NULL.
*/
struct
spi_master
*
spi_alloc_master
(
struct
device
*
dev
,
unsigned
size
)
{
...
...
@@ -1700,6 +1770,8 @@ static int of_spi_register_master(struct spi_master *master)
* success, else a negative error code (dropping the master's refcount).
* After a successful return, the caller is responsible for calling
* spi_unregister_master().
*
* Return: zero on success, else a negative error code.
*/
int
spi_register_master
(
struct
spi_master
*
master
)
{
...
...
@@ -1793,6 +1865,8 @@ static void devm_spi_unregister(struct device *dev, void *res)
*
* Register a SPI device as with spi_register_master() which will
* automatically be unregister
*
* Return: zero on success, else a negative error code.
*/
int
devm_spi_register_master
(
struct
device
*
dev
,
struct
spi_master
*
master
)
{
...
...
@@ -1898,6 +1972,8 @@ static int __spi_master_match(struct device *dev, const void *data)
* arch init time. It returns a refcounted pointer to the relevant
* spi_master (which the caller must release), or NULL if there is
* no such master registered.
*
* Return: the SPI master structure on success, else NULL.
*/
struct
spi_master
*
spi_busnum_to_master
(
u16
bus_num
)
{
...
...
@@ -1951,6 +2027,8 @@ static int __spi_validate_bits_per_word(struct spi_master *master, u8 bits_per_w
* that the underlying controller or its driver does not support. For
* example, not all hardware supports wire transfers using nine bit words,
* LSB-first wire encoding, or active-high chipselects.
*
* Return: zero on success, else a negative error code.
*/
int
spi_setup
(
struct
spi_device
*
spi
)
{
...
...
@@ -2169,6 +2247,8 @@ static int __spi_async(struct spi_device *spi, struct spi_message *message)
* no other spi_message queued to that device will be processed.
* (This rule applies equally to all the synchronous transfer calls,
* which are wrappers around this core asynchronous primitive.)
*
* Return: zero on success, else a negative error code.
*/
int
spi_async
(
struct
spi_device
*
spi
,
struct
spi_message
*
message
)
{
...
...
@@ -2221,6 +2301,8 @@ EXPORT_SYMBOL_GPL(spi_async);
* no other spi_message queued to that device will be processed.
* (This rule applies equally to all the synchronous transfer calls,
* which are wrappers around this core asynchronous primitive.)
*
* Return: zero on success, else a negative error code.
*/
int
spi_async_locked
(
struct
spi_device
*
spi
,
struct
spi_message
*
message
)
{
...
...
@@ -2336,7 +2418,7 @@ static int __spi_sync(struct spi_device *spi, struct spi_message *message,
* Also, the caller is guaranteeing that the memory associated with the
* message will not be freed before this call returns.
*
*
It returns
zero on success, else a negative error code.
*
Return:
zero on success, else a negative error code.
*/
int
spi_sync
(
struct
spi_device
*
spi
,
struct
spi_message
*
message
)
{
...
...
@@ -2358,7 +2440,7 @@ EXPORT_SYMBOL_GPL(spi_sync);
* SPI bus. It has to be preceded by a spi_bus_lock call. The SPI bus must
* be released by a spi_bus_unlock call when the exclusive access is over.
*
*
It returns
zero on success, else a negative error code.
*
Return:
zero on success, else a negative error code.
*/
int
spi_sync_locked
(
struct
spi_device
*
spi
,
struct
spi_message
*
message
)
{
...
...
@@ -2379,7 +2461,7 @@ EXPORT_SYMBOL_GPL(spi_sync_locked);
* exclusive access is over. Data transfer must be done by spi_sync_locked
* and spi_async_locked calls when the SPI bus lock is held.
*
*
It returns zero on success, else a negative error code
.
*
Return: always zero
.
*/
int
spi_bus_lock
(
struct
spi_master
*
master
)
{
...
...
@@ -2408,7 +2490,7 @@ EXPORT_SYMBOL_GPL(spi_bus_lock);
* This call releases an SPI bus lock previously obtained by an spi_bus_lock
* call.
*
*
It returns zero on success, else a negative error code
.
*
Return: always zero
.
*/
int
spi_bus_unlock
(
struct
spi_master
*
master
)
{
...
...
@@ -2443,6 +2525,8 @@ static u8 *buf;
* portable code should never use this for more than 32 bytes.
* Performance-sensitive or bulk transfer code should instead use
* spi_{async,sync}() calls with dma-safe buffers.
*
* Return: zero on success, else a negative error code.
*/
int
spi_write_then_read
(
struct
spi_device
*
spi
,
const
void
*
txbuf
,
unsigned
n_tx
,
...
...
include/linux/spi/spi.h
View file @
8c603485
...
...
@@ -51,6 +51,8 @@ extern struct bus_type spi_bus_type;
* @bytes_tx: number of bytes sent to device
* @bytes_rx: number of bytes received from device
*
* @transfer_bytes_histo:
* transfer bytes histogramm
*/
struct
spi_statistics
{
spinlock_t
lock
;
/* lock for the whole structure */
...
...
@@ -68,6 +70,8 @@ struct spi_statistics {
unsigned
long
long
bytes_rx
;
unsigned
long
long
bytes_tx
;
#define SPI_STATISTICS_HISTO_SIZE 17
unsigned
long
transfer_bytes_histo
[
SPI_STATISTICS_HISTO_SIZE
];
};
void
spi_statistics_add_transfer_stats
(
struct
spi_statistics
*
stats
,
...
...
@@ -843,8 +847,10 @@ extern int spi_bus_unlock(struct spi_master *master);
* @len: data buffer size
* Context: can sleep
*
* This
writes the buffer and returns zero or a negative error code
.
* This
function writes the buffer @buf
.
* Callable only from contexts that can sleep.
*
* Return: zero on success, else a negative error code.
*/
static
inline
int
spi_write
(
struct
spi_device
*
spi
,
const
void
*
buf
,
size_t
len
)
...
...
@@ -867,8 +873,10 @@ spi_write(struct spi_device *spi, const void *buf, size_t len)
* @len: data buffer size
* Context: can sleep
*
* This
reads the buffer and returns zero or a negative error code
.
* This
function reads the buffer @buf
.
* Callable only from contexts that can sleep.
*
* Return: zero on success, else a negative error code.
*/
static
inline
int
spi_read
(
struct
spi_device
*
spi
,
void
*
buf
,
size_t
len
)
...
...
@@ -895,7 +903,7 @@ spi_read(struct spi_device *spi, void *buf, size_t len)
*
* For more specific semantics see spi_sync().
*
*
It returns
zero on success, else a negative error code.
*
Return: Return:
zero on success, else a negative error code.
*/
static
inline
int
spi_sync_transfer
(
struct
spi_device
*
spi
,
struct
spi_transfer
*
xfers
,
...
...
@@ -919,9 +927,10 @@ extern int spi_write_then_read(struct spi_device *spi,
* @cmd: command to be written before data is read back
* Context: can sleep
*
* This returns the (unsigned) eight bit number returned by the
* device, or else a negative error code. Callable only from
* contexts that can sleep.
* Callable only from contexts that can sleep.
*
* Return: the (unsigned) eight bit number returned by the
* device, or else a negative error code.
*/
static
inline
ssize_t
spi_w8r8
(
struct
spi_device
*
spi
,
u8
cmd
)
{
...
...
@@ -940,12 +949,13 @@ static inline ssize_t spi_w8r8(struct spi_device *spi, u8 cmd)
* @cmd: command to be written before data is read back
* Context: can sleep
*
* This returns the (unsigned) sixteen bit number returned by the
* device, or else a negative error code. Callable only from
* contexts that can sleep.
*
* The number is returned in wire-order, which is at least sometimes
* big-endian.
*
* Callable only from contexts that can sleep.
*
* Return: the (unsigned) sixteen bit number returned by the
* device, or else a negative error code.
*/
static
inline
ssize_t
spi_w8r16
(
struct
spi_device
*
spi
,
u8
cmd
)
{
...
...
@@ -964,13 +974,13 @@ static inline ssize_t spi_w8r16(struct spi_device *spi, u8 cmd)
* @cmd: command to be written before data is read back
* Context: can sleep
*
* This returns the (unsigned) sixteen bit number returned by the device in cpu
* endianness, or else a negative error code. Callable only from contexts that
* can sleep.
*
* This function is similar to spi_w8r16, with the exception that it will
* convert the read 16 bit data word from big-endian to native endianness.
*
* Callable only from contexts that can sleep.
*
* Return: the (unsigned) sixteen bit number returned by the device in cpu
* endianness, or else a negative error code.
*/
static
inline
ssize_t
spi_w8r16be
(
struct
spi_device
*
spi
,
u8
cmd
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment