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
df9633a7
Commit
df9633a7
authored
Mar 11, 2016
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'spi/topic/core' into spi-next
parents
bad0ae3f
62826970
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
89 additions
and
0 deletions
+89
-0
drivers/spi/spi.c
drivers/spi/spi.c
+48
-0
include/linux/spi/spi.h
include/linux/spi/spi.h
+41
-0
No files found.
drivers/spi/spi.c
View file @
df9633a7
...
...
@@ -1152,6 +1152,7 @@ static void __spi_pump_messages(struct spi_master *master, bool in_kthread)
}
}
mutex_lock
(
&
master
->
bus_lock_mutex
);
trace_spi_message_start
(
master
->
cur_msg
);
if
(
master
->
prepare_message
)
{
...
...
@@ -1161,6 +1162,7 @@ static void __spi_pump_messages(struct spi_master *master, bool in_kthread)
"failed to prepare message: %d
\n
"
,
ret
);
master
->
cur_msg
->
status
=
ret
;
spi_finalize_current_message
(
master
);
mutex_unlock
(
&
master
->
bus_lock_mutex
);
return
;
}
master
->
cur_msg_prepared
=
true
;
...
...
@@ -1170,6 +1172,7 @@ static void __spi_pump_messages(struct spi_master *master, bool in_kthread)
if
(
ret
)
{
master
->
cur_msg
->
status
=
ret
;
spi_finalize_current_message
(
master
);
mutex_unlock
(
&
master
->
bus_lock_mutex
);
return
;
}
...
...
@@ -1177,8 +1180,13 @@ static void __spi_pump_messages(struct spi_master *master, bool in_kthread)
if
(
ret
)
{
dev_err
(
&
master
->
dev
,
"failed to transfer one message from queue
\n
"
);
mutex_unlock
(
&
master
->
bus_lock_mutex
);
return
;
}
mutex_unlock
(
&
master
->
bus_lock_mutex
);
/* Prod the scheduler in case transfer_one() was busy waiting */
cond_resched
();
}
/**
...
...
@@ -2351,6 +2359,46 @@ int spi_async_locked(struct spi_device *spi, struct spi_message *message)
EXPORT_SYMBOL_GPL
(
spi_async_locked
);
int
spi_flash_read
(
struct
spi_device
*
spi
,
struct
spi_flash_read_message
*
msg
)
{
struct
spi_master
*
master
=
spi
->
master
;
int
ret
;
if
((
msg
->
opcode_nbits
==
SPI_NBITS_DUAL
||
msg
->
addr_nbits
==
SPI_NBITS_DUAL
)
&&
!
(
spi
->
mode
&
(
SPI_TX_DUAL
|
SPI_TX_QUAD
)))
return
-
EINVAL
;
if
((
msg
->
opcode_nbits
==
SPI_NBITS_QUAD
||
msg
->
addr_nbits
==
SPI_NBITS_QUAD
)
&&
!
(
spi
->
mode
&
SPI_TX_QUAD
))
return
-
EINVAL
;
if
(
msg
->
data_nbits
==
SPI_NBITS_DUAL
&&
!
(
spi
->
mode
&
(
SPI_RX_DUAL
|
SPI_RX_QUAD
)))
return
-
EINVAL
;
if
(
msg
->
data_nbits
==
SPI_NBITS_QUAD
&&
!
(
spi
->
mode
&
SPI_RX_QUAD
))
return
-
EINVAL
;
if
(
master
->
auto_runtime_pm
)
{
ret
=
pm_runtime_get_sync
(
master
->
dev
.
parent
);
if
(
ret
<
0
)
{
dev_err
(
&
master
->
dev
,
"Failed to power device: %d
\n
"
,
ret
);
return
ret
;
}
}
mutex_lock
(
&
master
->
bus_lock_mutex
);
ret
=
master
->
spi_flash_read
(
spi
,
msg
);
mutex_unlock
(
&
master
->
bus_lock_mutex
);
if
(
master
->
auto_runtime_pm
)
pm_runtime_put
(
master
->
dev
.
parent
);
return
ret
;
}
EXPORT_SYMBOL_GPL
(
spi_flash_read
);
/*-------------------------------------------------------------------------*/
/* Utility methods for SPI master protocol drivers, layered on
...
...
include/linux/spi/spi.h
View file @
df9633a7
...
...
@@ -25,6 +25,7 @@
struct
dma_chan
;
struct
spi_master
;
struct
spi_transfer
;
struct
spi_flash_read_message
;
/*
* INTERFACES between SPI master-side drivers and SPI infrastructure.
...
...
@@ -361,6 +362,8 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)
* @handle_err: the subsystem calls the driver to handle an error that occurs
* in the generic implementation of transfer_one_message().
* @unprepare_message: undo any work done by prepare_message().
* @spi_flash_read: to support spi-controller hardwares that provide
* accelerated interface to read from flash devices.
* @cs_gpios: Array of GPIOs to use as chip select lines; one per CS
* number. Any individual value may be -ENOENT for CS lines that
* are not GPIOs (driven by the SPI controller itself).
...
...
@@ -513,6 +516,8 @@ struct spi_master {
struct
spi_message
*
message
);
int
(
*
unprepare_message
)(
struct
spi_master
*
master
,
struct
spi_message
*
message
);
int
(
*
spi_flash_read
)(
struct
spi_device
*
spi
,
struct
spi_flash_read_message
*
msg
);
/*
* These hooks are for drivers that use a generic implementation
...
...
@@ -1019,6 +1024,42 @@ static inline ssize_t spi_w8r16be(struct spi_device *spi, u8 cmd)
return
be16_to_cpu
(
result
);
}
/**
* struct spi_flash_read_message - flash specific information for
* spi-masters that provide accelerated flash read interfaces
* @buf: buffer to read data
* @from: offset within the flash from where data is to be read
* @len: length of data to be read
* @retlen: actual length of data read
* @read_opcode: read_opcode to be used to communicate with flash
* @addr_width: number of address bytes
* @dummy_bytes: number of dummy bytes
* @opcode_nbits: number of lines to send opcode
* @addr_nbits: number of lines to send address
* @data_nbits: number of lines for data
*/
struct
spi_flash_read_message
{
void
*
buf
;
loff_t
from
;
size_t
len
;
size_t
retlen
;
u8
read_opcode
;
u8
addr_width
;
u8
dummy_bytes
;
u8
opcode_nbits
;
u8
addr_nbits
;
u8
data_nbits
;
};
/* SPI core interface for flash read support */
static
inline
bool
spi_flash_read_supported
(
struct
spi_device
*
spi
)
{
return
spi
->
master
->
spi_flash_read
?
true
:
false
;
}
int
spi_flash_read
(
struct
spi_device
*
spi
,
struct
spi_flash_read_message
*
msg
);
/*---------------------------------------------------------------------------*/
/*
...
...
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