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
nexedi
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