support DUAL and QUAD[patch v1]

Trent Piepho tpiepho at gmail.com
Wed Jul 17 22:25:55 EDT 2013


On Wed, Jul 17, 2013 at 6:58 PM, yuhang wang <wangyuhang2014 at gmail.com> wrote:
> >> > >
> >> > > > [Pekon]: Instead of adding new fields you can use existing 'mode'
> >> > > > field
> >> to
> >> > > > pass on the platform specific configurations. And if 'u8 mode'
> >> > > > does not
> >> > > > suffice you can increase it to 'u32'.

But what about spidev?

> diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
> index 004b10f..36d2451 100644
> --- a/drivers/spi/spi.c
> +++ b/drivers/spi/spi.c
> @@ -868,6 +868,14 @@ static void of_register_spi_devices(struct
> spi_master *master)
>   spi->mode |= SPI_CS_HIGH;
>   if (of_find_property(nc, "spi-3wire", NULL))
>   spi->mode |= SPI_3WIRE;
> + if (of_find_property(nc, "spi-tx-dual", NULL))
> + spi->mode |= SPI_TX_DUAL;
> + if (of_find_property(nc, "spi-tx-quad", NULL))
> + spi->mode |= SPI_TX_QUAD;
> + if (of_find_property(nc, "spi-rx-dual", NULL))
> + spi->mode |= SPI_RX_DUAL;
> + if (of_find_property(nc, "spi-rx-quad", NULL))
> + spi->mode |= SPI_RX_QUAD;
>
>   /* Device speed */
>   prop = of_get_property(nc, "spi-max-frequency", &len);
> @@ -1316,6 +1324,12 @@ int spi_setup(struct spi_device *spi)
>   /* help drivers fail *cleanly* when they need options
>   * that aren't supported with their current master
>   */
> + if (((spi->mode >> 8) & 0x03) == 0x03 ||
> + ((spi->mode >> 10) & 0x03) == 0x03) {
> + dev_err(&spi->dev,
> + "setup: can not select dual and quad at the same time\n");
> + return -EINVAL;
> + }

Maybe it would make more sense to have a spi-rx-width and spi-tx-width
than can be set to 1, 2, 4, etc. bits instead of a bunch of properties
that are mutually exclusive?  Sooner or later someone is going to want
8 bits.

> diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
> index 38c2b92..e9ba1cf 100644
> --- a/include/linux/spi/spi.h
> +++ b/include/linux/spi/spi.h
> @@ -74,7 +74,7 @@ struct spi_device {
>   struct spi_master *master;
>   u32 max_speed_hz;
>   u8 chip_select;
> - u8 mode;
> + u16 mode;

What about this, from include/uapi/linux/spi/spidev.h:

/* Read / Write of SPI mode (SPI_MODE_0..SPI_MODE_3) */
#define SPI_IOC_RD_MODE                 _IOR(SPI_IOC_MAGIC, 1, __u8)
#define SPI_IOC_WR_MODE                 _IOW(SPI_IOC_MAGIC, 1, __u8)

Note that you can't just change the type in the ioctl define, as it
won't be backward compatible.



More information about the linux-mtd mailing list