aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spidev.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/spi/spidev.c')
-rw-r--r--drivers/spi/spidev.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
index d7c6e36021e8..e3bc23bb5883 100644
--- a/drivers/spi/spidev.c
+++ b/drivers/spi/spidev.c
@@ -73,7 +73,8 @@ static DECLARE_BITMAP(minors, N_SPI_MINORS);
73 */ 73 */
74#define SPI_MODE_MASK (SPI_CPHA | SPI_CPOL | SPI_CS_HIGH \ 74#define SPI_MODE_MASK (SPI_CPHA | SPI_CPOL | SPI_CS_HIGH \
75 | SPI_LSB_FIRST | SPI_3WIRE | SPI_LOOP \ 75 | SPI_LSB_FIRST | SPI_3WIRE | SPI_LOOP \
76 | SPI_NO_CS | SPI_READY) 76 | SPI_NO_CS | SPI_READY | SPI_TX_DUAL \
77 | SPI_TX_QUAD | SPI_RX_DUAL | SPI_RX_QUAD)
77 78
78struct spidev_data { 79struct spidev_data {
79 dev_t devt; 80 dev_t devt;
@@ -265,6 +266,8 @@ static int spidev_message(struct spidev_data *spidev,
265 buf += k_tmp->len; 266 buf += k_tmp->len;
266 267
267 k_tmp->cs_change = !!u_tmp->cs_change; 268 k_tmp->cs_change = !!u_tmp->cs_change;
269 k_tmp->tx_nbits = u_tmp->tx_nbits;
270 k_tmp->rx_nbits = u_tmp->rx_nbits;
268 k_tmp->bits_per_word = u_tmp->bits_per_word; 271 k_tmp->bits_per_word = u_tmp->bits_per_word;
269 k_tmp->delay_usecs = u_tmp->delay_usecs; 272 k_tmp->delay_usecs = u_tmp->delay_usecs;
270 k_tmp->speed_hz = u_tmp->speed_hz; 273 k_tmp->speed_hz = u_tmp->speed_hz;
@@ -359,6 +362,10 @@ spidev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
359 retval = __put_user(spi->mode & SPI_MODE_MASK, 362 retval = __put_user(spi->mode & SPI_MODE_MASK,
360 (__u8 __user *)arg); 363 (__u8 __user *)arg);
361 break; 364 break;
365 case SPI_IOC_RD_MODE32:
366 retval = __put_user(spi->mode & SPI_MODE_MASK,
367 (__u32 __user *)arg);
368 break;
362 case SPI_IOC_RD_LSB_FIRST: 369 case SPI_IOC_RD_LSB_FIRST:
363 retval = __put_user((spi->mode & SPI_LSB_FIRST) ? 1 : 0, 370 retval = __put_user((spi->mode & SPI_LSB_FIRST) ? 1 : 0,
364 (__u8 __user *)arg); 371 (__u8 __user *)arg);
@@ -372,9 +379,13 @@ spidev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
372 379
373 /* write requests */ 380 /* write requests */
374 case SPI_IOC_WR_MODE: 381 case SPI_IOC_WR_MODE:
375 retval = __get_user(tmp, (u8 __user *)arg); 382 case SPI_IOC_WR_MODE32:
383 if (cmd == SPI_IOC_WR_MODE)
384 retval = __get_user(tmp, (u8 __user *)arg);
385 else
386 retval = __get_user(tmp, (u32 __user *)arg);
376 if (retval == 0) { 387 if (retval == 0) {
377 u8 save = spi->mode; 388 u32 save = spi->mode;
378 389
379 if (tmp & ~SPI_MODE_MASK) { 390 if (tmp & ~SPI_MODE_MASK) {
380 retval = -EINVAL; 391 retval = -EINVAL;
@@ -382,18 +393,18 @@ spidev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
382 } 393 }
383 394
384 tmp |= spi->mode & ~SPI_MODE_MASK; 395 tmp |= spi->mode & ~SPI_MODE_MASK;
385 spi->mode = (u8)tmp; 396 spi->mode = (u16)tmp;
386 retval = spi_setup(spi); 397 retval = spi_setup(spi);
387 if (retval < 0) 398 if (retval < 0)
388 spi->mode = save; 399 spi->mode = save;
389 else 400 else
390 dev_dbg(&spi->dev, "spi mode %02x\n", tmp); 401 dev_dbg(&spi->dev, "spi mode %x\n", tmp);
391 } 402 }
392 break; 403 break;
393 case SPI_IOC_WR_LSB_FIRST: 404 case SPI_IOC_WR_LSB_FIRST:
394 retval = __get_user(tmp, (__u8 __user *)arg); 405 retval = __get_user(tmp, (__u8 __user *)arg);
395 if (retval == 0) { 406 if (retval == 0) {
396 u8 save = spi->mode; 407 u32 save = spi->mode;
397 408
398 if (tmp) 409 if (tmp)
399 spi->mode |= SPI_LSB_FIRST; 410 spi->mode |= SPI_LSB_FIRST;