spi: add support for octal mode I/O data transfer
Add flags for Octal mode I/O data transfer Required for the SPI controller which can do the data transfer (TX/RX) on 8 data lines e.g. NXP FlexSPI controller. SPI_TX_OCTAL: transmit with 8 wires SPI_RX_OCTAL: receive with 8 wires Signed-off-by: Yogesh Gaur <yogeshnarayan.gaur@nxp.com> Reviewed-by: Boris Brezillon <boris.brezillon@bootlin.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
c2b142cc39
commit
6b03061f88
|
@ -1633,6 +1633,9 @@ static int of_spi_parse_dt(struct spi_controller *ctlr, struct spi_device *spi,
|
||||||
case 4:
|
case 4:
|
||||||
spi->mode |= SPI_TX_QUAD;
|
spi->mode |= SPI_TX_QUAD;
|
||||||
break;
|
break;
|
||||||
|
case 8:
|
||||||
|
spi->mode |= SPI_TX_OCTAL;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
dev_warn(&ctlr->dev,
|
dev_warn(&ctlr->dev,
|
||||||
"spi-tx-bus-width %d not supported\n",
|
"spi-tx-bus-width %d not supported\n",
|
||||||
|
@ -1651,6 +1654,9 @@ static int of_spi_parse_dt(struct spi_controller *ctlr, struct spi_device *spi,
|
||||||
case 4:
|
case 4:
|
||||||
spi->mode |= SPI_RX_QUAD;
|
spi->mode |= SPI_RX_QUAD;
|
||||||
break;
|
break;
|
||||||
|
case 8:
|
||||||
|
spi->mode |= SPI_RX_OCTAL;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
dev_warn(&ctlr->dev,
|
dev_warn(&ctlr->dev,
|
||||||
"spi-rx-bus-width %d not supported\n",
|
"spi-rx-bus-width %d not supported\n",
|
||||||
|
@ -2839,7 +2845,8 @@ int spi_setup(struct spi_device *spi)
|
||||||
/* if it is SPI_3WIRE mode, DUAL and QUAD should be forbidden
|
/* if it is SPI_3WIRE mode, DUAL and QUAD should be forbidden
|
||||||
*/
|
*/
|
||||||
if ((spi->mode & SPI_3WIRE) && (spi->mode &
|
if ((spi->mode & SPI_3WIRE) && (spi->mode &
|
||||||
(SPI_TX_DUAL | SPI_TX_QUAD | SPI_RX_DUAL | SPI_RX_QUAD)))
|
(SPI_TX_DUAL | SPI_TX_QUAD | SPI_TX_OCTAL |
|
||||||
|
SPI_RX_DUAL | SPI_RX_QUAD | SPI_RX_OCTAL)))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
/* help drivers fail *cleanly* when they need options
|
/* help drivers fail *cleanly* when they need options
|
||||||
* that aren't supported with their current controller
|
* that aren't supported with their current controller
|
||||||
|
@ -2848,7 +2855,8 @@ int spi_setup(struct spi_device *spi)
|
||||||
*/
|
*/
|
||||||
bad_bits = spi->mode & ~(spi->controller->mode_bits | SPI_CS_WORD);
|
bad_bits = spi->mode & ~(spi->controller->mode_bits | SPI_CS_WORD);
|
||||||
ugly_bits = bad_bits &
|
ugly_bits = bad_bits &
|
||||||
(SPI_TX_DUAL | SPI_TX_QUAD | SPI_RX_DUAL | SPI_RX_QUAD);
|
(SPI_TX_DUAL | SPI_TX_QUAD | SPI_TX_OCTAL |
|
||||||
|
SPI_RX_DUAL | SPI_RX_QUAD | SPI_RX_OCTAL);
|
||||||
if (ugly_bits) {
|
if (ugly_bits) {
|
||||||
dev_warn(&spi->dev,
|
dev_warn(&spi->dev,
|
||||||
"setup: ignoring unsupported mode bits %x\n",
|
"setup: ignoring unsupported mode bits %x\n",
|
||||||
|
|
|
@ -154,7 +154,9 @@ struct spi_device {
|
||||||
#define SPI_TX_QUAD 0x200 /* transmit with 4 wires */
|
#define SPI_TX_QUAD 0x200 /* transmit with 4 wires */
|
||||||
#define SPI_RX_DUAL 0x400 /* receive with 2 wires */
|
#define SPI_RX_DUAL 0x400 /* receive with 2 wires */
|
||||||
#define SPI_RX_QUAD 0x800 /* receive with 4 wires */
|
#define SPI_RX_QUAD 0x800 /* receive with 4 wires */
|
||||||
#define SPI_CS_WORD 0x1000 /* toggle cs after each word */
|
#define SPI_CS_WORD 0x1000 /* toggle cs after each word */
|
||||||
|
#define SPI_TX_OCTAL 0x2000 /* transmit with 8 wires */
|
||||||
|
#define SPI_RX_OCTAL 0x4000 /* receive with 8 wires */
|
||||||
int irq;
|
int irq;
|
||||||
void *controller_state;
|
void *controller_state;
|
||||||
void *controller_data;
|
void *controller_data;
|
||||||
|
|
Loading…
Reference in New Issue