aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/spi/spi-txx9.c3
-rw-r--r--drivers/spi/spidev.c16
2 files changed, 14 insertions, 5 deletions
diff --git a/drivers/spi/spi-txx9.c b/drivers/spi/spi-txx9.c
index 2501a8373e89..f2ab827c81bb 100644
--- a/drivers/spi/spi-txx9.c
+++ b/drivers/spi/spi-txx9.c
@@ -402,8 +402,7 @@ exit_busy:
402exit: 402exit:
403 if (c->workqueue) 403 if (c->workqueue)
404 destroy_workqueue(c->workqueue); 404 destroy_workqueue(c->workqueue);
405 if (c->clk) 405 clk_disable(c->clk);
406 clk_disable(c->clk);
407 spi_master_put(master); 406 spi_master_put(master);
408 return ret; 407 return ret;
409} 408}
diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
index e50039fb1474..6941e04afb8c 100644
--- a/drivers/spi/spidev.c
+++ b/drivers/spi/spidev.c
@@ -87,6 +87,7 @@ struct spidev_data {
87 unsigned users; 87 unsigned users;
88 u8 *tx_buffer; 88 u8 *tx_buffer;
89 u8 *rx_buffer; 89 u8 *rx_buffer;
90 u32 speed_hz;
90}; 91};
91 92
92static LIST_HEAD(device_list); 93static LIST_HEAD(device_list);
@@ -138,6 +139,7 @@ spidev_sync_write(struct spidev_data *spidev, size_t len)
138 struct spi_transfer t = { 139 struct spi_transfer t = {
139 .tx_buf = spidev->tx_buffer, 140 .tx_buf = spidev->tx_buffer,
140 .len = len, 141 .len = len,
142 .speed_hz = spidev->speed_hz,
141 }; 143 };
142 struct spi_message m; 144 struct spi_message m;
143 145
@@ -152,6 +154,7 @@ spidev_sync_read(struct spidev_data *spidev, size_t len)
152 struct spi_transfer t = { 154 struct spi_transfer t = {
153 .rx_buf = spidev->rx_buffer, 155 .rx_buf = spidev->rx_buffer,
154 .len = len, 156 .len = len,
157 .speed_hz = spidev->speed_hz,
155 }; 158 };
156 struct spi_message m; 159 struct spi_message m;
157 160
@@ -274,6 +277,8 @@ static int spidev_message(struct spidev_data *spidev,
274 k_tmp->bits_per_word = u_tmp->bits_per_word; 277 k_tmp->bits_per_word = u_tmp->bits_per_word;
275 k_tmp->delay_usecs = u_tmp->delay_usecs; 278 k_tmp->delay_usecs = u_tmp->delay_usecs;
276 k_tmp->speed_hz = u_tmp->speed_hz; 279 k_tmp->speed_hz = u_tmp->speed_hz;
280 if (!k_tmp->speed_hz)
281 k_tmp->speed_hz = spidev->speed_hz;
277#ifdef VERBOSE 282#ifdef VERBOSE
278 dev_dbg(&spidev->spi->dev, 283 dev_dbg(&spidev->spi->dev,
279 " xfer len %zd %s%s%s%dbits %u usec %uHz\n", 284 " xfer len %zd %s%s%s%dbits %u usec %uHz\n",
@@ -377,7 +382,7 @@ spidev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
377 retval = __put_user(spi->bits_per_word, (__u8 __user *)arg); 382 retval = __put_user(spi->bits_per_word, (__u8 __user *)arg);
378 break; 383 break;
379 case SPI_IOC_RD_MAX_SPEED_HZ: 384 case SPI_IOC_RD_MAX_SPEED_HZ:
380 retval = __put_user(spi->max_speed_hz, (__u32 __user *)arg); 385 retval = __put_user(spidev->speed_hz, (__u32 __user *)arg);
381 break; 386 break;
382 387
383 /* write requests */ 388 /* write requests */
@@ -441,10 +446,11 @@ spidev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
441 446
442 spi->max_speed_hz = tmp; 447 spi->max_speed_hz = tmp;
443 retval = spi_setup(spi); 448 retval = spi_setup(spi);
444 if (retval < 0) 449 if (retval >= 0)
445 spi->max_speed_hz = save; 450 spidev->speed_hz = tmp;
446 else 451 else
447 dev_dbg(&spi->dev, "%d Hz (max)\n", tmp); 452 dev_dbg(&spi->dev, "%d Hz (max)\n", tmp);
453 spi->max_speed_hz = save;
448 } 454 }
449 break; 455 break;
450 456
@@ -570,6 +576,8 @@ static int spidev_release(struct inode *inode, struct file *filp)
570 kfree(spidev->rx_buffer); 576 kfree(spidev->rx_buffer);
571 spidev->rx_buffer = NULL; 577 spidev->rx_buffer = NULL;
572 578
579 spidev->speed_hz = spidev->spi->max_speed_hz;
580
573 /* ... after we unbound from the underlying device? */ 581 /* ... after we unbound from the underlying device? */
574 spin_lock_irq(&spidev->spi_lock); 582 spin_lock_irq(&spidev->spi_lock);
575 dofree = (spidev->spi == NULL); 583 dofree = (spidev->spi == NULL);
@@ -650,6 +658,8 @@ static int spidev_probe(struct spi_device *spi)
650 } 658 }
651 mutex_unlock(&device_list_lock); 659 mutex_unlock(&device_list_lock);
652 660
661 spidev->speed_hz = spi->max_speed_hz;
662
653 if (status == 0) 663 if (status == 0)
654 spi_set_drvdata(spi, spidev); 664 spi_set_drvdata(spi, spidev);
655 else 665 else