--- zzzz-none-000/linux-2.6.39.4/drivers/spi/spidev.c 2011-08-03 19:43:28.000000000 +0000 +++ puma6-arm-6490-729/linux-2.6.39.4/drivers/spi/spidev.c 2021-11-10 13:23:10.000000000 +0000 @@ -84,9 +84,15 @@ unsigned users; u8 *buffer; }; - +#ifdef CONFIG_GEN3_SPI +LIST_HEAD(device_list); +DEFINE_MUTEX(device_list_lock); +EXPORT_SYMBOL(device_list); +EXPORT_SYMBOL(device_list_lock); +#else static LIST_HEAD(device_list); static DEFINE_MUTEX(device_list_lock); +#endif static unsigned bufsiz = 4096; module_param(bufsiz, uint, S_IRUGO); @@ -102,9 +108,13 @@ { complete(arg); } - +#ifdef CONFIG_GEN3_SPI +ssize_t +spidev_sync(struct spidev_data *spidev, struct spi_message *message) +#else static ssize_t spidev_sync(struct spidev_data *spidev, struct spi_message *message) +#endif { DECLARE_COMPLETION_ONSTACK(done); int status; @@ -127,9 +137,17 @@ } return status; } +#ifdef CONFIG_GEN3_SPI +EXPORT_SYMBOL(spidev_sync); +#endif +#ifdef CONFIG_GEN3_SPI +ssize_t +spidev_sync_write(struct spidev_data *spidev, size_t len) +#else static inline ssize_t spidev_sync_write(struct spidev_data *spidev, size_t len) +#endif { struct spi_transfer t = { .tx_buf = spidev->buffer, @@ -141,9 +159,17 @@ spi_message_add_tail(&t, &m); return spidev_sync(spidev, &m); } +#ifdef CONFIG_GEN3_SPI +EXPORT_SYMBOL(spidev_sync_write); +#endif +#ifdef CONFIG_GEN3_SPI +ssize_t +spidev_sync_read(struct spidev_data *spidev, size_t len) +#else static inline ssize_t spidev_sync_read(struct spidev_data *spidev, size_t len) +#endif { struct spi_transfer t = { .rx_buf = spidev->buffer, @@ -155,6 +181,9 @@ spi_message_add_tail(&t, &m); return spidev_sync(spidev, &m); } +#ifdef CONFIG_GEN3_SPI +EXPORT_SYMBOL(spidev_sync_read); +#endif /*-------------------------------------------------------------------------*/ @@ -266,6 +295,12 @@ k_tmp->bits_per_word = u_tmp->bits_per_word; k_tmp->delay_usecs = u_tmp->delay_usecs; k_tmp->speed_hz = u_tmp->speed_hz; + + if ((k_tmp->len*8) < k_tmp->bits_per_word) { + printk(KERN_ERR "error :transfer data lenth < bits_per_word\n"); + status = -EMSGSIZE; + goto done; + } #ifdef VERBOSE dev_dbg(&spidev->spi->dev, " xfer len %zd %s%s%s%dbits %u usec %uHz\n", @@ -502,6 +537,8 @@ dev_dbg(&spidev->spi->dev, "open/ENOMEM\n"); status = -ENOMEM; } + if (spidev->spi->master->using_slave) + spidev->spi->master->setup(spidev->spi); } if (status == 0) { spidev->users++; @@ -532,6 +569,8 @@ kfree(spidev->buffer); spidev->buffer = NULL; + if (spidev->spi->master->using_slave) + spidev->spi->master->cleanup(spidev->spi); /* ... after we unbound from the underlying device? */ spin_lock_irq(&spidev->spi_lock); dofree = (spidev->spi == NULL);