History

Merge tag 'spi-fix-v3.9-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/misc

Pull spi fixes from Mark Brown: "A bunch of small driver fixes plus a fix for error handling in the core - nothing too exciting overall." * tag 'spi-fix-v3.9-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/misc: spi/mpc512x-psc: optionally keep PSC SS asserted across xfer segmensts spi: Unlock a spinlock before calling into the controller driver. spi/s3c64xx: modified error interrupt handling and init spi/bcm63xx: don't disable non enabled clocks in probe error path spi/bcm63xx: Remove unused variable spi: slink-tegra20: move runtime pm calls to transfer_one_message

Linus Torvalds committed 13 years ago

Commit e0a77f22 parents e24b0bf 1ad849a5 files · +42 −44Browse files

Unified · Split

5 files
  1. drivers/spi/spi-bcm63xx.c +1 −2
  2. drivers/spi/spi-mpc512x-psc.c +1 −1
  3. drivers/spi/spi-s3c64xx.c +25 −16
  4. drivers/spi/spi-tegra20-slink.c +8 −17
  5. drivers/spi/spi.c +7 −8
drivers/spi/spi-bcm63xx.c+1−2
@@ -152,7 +152,6 @@ static void bcm63xx_spi_setup_transfer(struct spi_device *spi, · 151 unmodified lines
152152 static int bcm63xx_spi_setup(struct spi_device *spi)
153153 {
154154 struct bcm63xx_spi *bs;
155− int ret;
156155
157156 bs = spi_master_get_devdata(spi->master);
158157
@@ -490,7 +489,7 @@ static int bcm63xx_spi_probe(struct platform_device *pdev) · 331 unmodified lines
490489 default:
491490 dev_err(dev, "unsupported MSG_CTL width: %d\n",
492491 bs->msg_ctl_width);
493− goto out_clk_disable;
492+ goto out_err;
494493 }
495494
496495 /* Initialize hardware */
drivers/spi/spi-mpc512x-psc.c+1−1
@@ -164,7 +164,7 @@ static int mpc512x_psc_spi_transfer_rxtx(struct spi_device *spi, · 163 unmodified lines
164164
165165 for (i = count; i > 0; i--) {
166166 data = tx_buf ? *tx_buf++ : 0;
167− if (len == EOFBYTE)
167+ if (len == EOFBYTE && t->cs_change)
168168 setbits32(&fifo->txcmd, MPC512x_PSC_FIFO_EOF);
169169 out_8(&fifo->txdata_8, data);
170170 len--;
drivers/spi/spi-s3c64xx.c+25−16
@@ -994,25 +994,30 @@ static irqreturn_t s3c64xx_spi_irq(int irq, void *data) · 993 unmodified lines
994994 {
995995 struct s3c64xx_spi_driver_data *sdd = data;
996996 struct spi_master *spi = sdd->master;
997− unsigned int val;
997+ unsigned int val, clr = 0;
998998
999− val = readl(sdd->regs + S3C64XX_SPI_PENDING_CLR);
999+ val = readl(sdd->regs + S3C64XX_SPI_STATUS);
10001000
1001− val &= S3C64XX_SPI_PND_RX_OVERRUN_CLR |
1002− S3C64XX_SPI_PND_RX_UNDERRUN_CLR |
1003− S3C64XX_SPI_PND_TX_OVERRUN_CLR |
1004− S3C64XX_SPI_PND_TX_UNDERRUN_CLR;
1005−
1006− writel(val, sdd->regs + S3C64XX_SPI_PENDING_CLR);
1007−
1008− if (val & S3C64XX_SPI_PND_RX_OVERRUN_CLR)
1001+ if (val & S3C64XX_SPI_ST_RX_OVERRUN_ERR) {
1002+ clr = S3C64XX_SPI_PND_RX_OVERRUN_CLR;
10091003 dev_err(&spi->dev, "RX overrun\n");
1010− if (val & S3C64XX_SPI_PND_RX_UNDERRUN_CLR)
1004+ }
1005+ if (val & S3C64XX_SPI_ST_RX_UNDERRUN_ERR) {
1006+ clr |= S3C64XX_SPI_PND_RX_UNDERRUN_CLR;
10111007 dev_err(&spi->dev, "RX underrun\n");
1012− if (val & S3C64XX_SPI_PND_TX_OVERRUN_CLR)
1008+ }
1009+ if (val & S3C64XX_SPI_ST_TX_OVERRUN_ERR) {
1010+ clr |= S3C64XX_SPI_PND_TX_OVERRUN_CLR;
10131011 dev_err(&spi->dev, "TX overrun\n");
1014− if (val & S3C64XX_SPI_PND_TX_UNDERRUN_CLR)
1012+ }
1013+ if (val & S3C64XX_SPI_ST_TX_UNDERRUN_ERR) {
1014+ clr |= S3C64XX_SPI_PND_TX_UNDERRUN_CLR;
10151015 dev_err(&spi->dev, "TX underrun\n");
1016+ }
1017+
1018+ /* Clear the pending irq by setting and then clearing it */
1019+ writel(clr, sdd->regs + S3C64XX_SPI_PENDING_CLR);
1020+ writel(0, sdd->regs + S3C64XX_SPI_PENDING_CLR);
10161021
10171022 return IRQ_HANDLED;
10181023 }
@@ -1036,9 +1041,13 @@ static void s3c64xx_spi_hwinit(struct s3c64xx_spi_driver_data *sdd, int channel) · 17 unmodified lines
10361041 writel(0, regs + S3C64XX_SPI_MODE_CFG);
10371042 writel(0, regs + S3C64XX_SPI_PACKET_CNT);
10381043
1039− /* Clear any irq pending bits */
1040− writel(readl(regs + S3C64XX_SPI_PENDING_CLR),
1041− regs + S3C64XX_SPI_PENDING_CLR);
1044+ /* Clear any irq pending bits, should set and clear the bits */
1045+ val = S3C64XX_SPI_PND_RX_OVERRUN_CLR |
1046+ S3C64XX_SPI_PND_RX_UNDERRUN_CLR |
1047+ S3C64XX_SPI_PND_TX_OVERRUN_CLR |
1048+ S3C64XX_SPI_PND_TX_UNDERRUN_CLR;
1049+ writel(val, regs + S3C64XX_SPI_PENDING_CLR);
1050+ writel(0, regs + S3C64XX_SPI_PENDING_CLR);
10421051
10431052 writel(0, regs + S3C64XX_SPI_SWAP_CFG);
10441053
drivers/spi/spi-tegra20-slink.c+8−17
@@ -858,21 +858,6 @@ static int tegra_slink_setup(struct spi_device *spi) · 857 unmodified lines
858858 return 0;
859859 }
860860
861−static int tegra_slink_prepare_transfer(struct spi_master *master)
862−{
863− struct tegra_slink_data *tspi = spi_master_get_devdata(master);
864−
865− return pm_runtime_get_sync(tspi->dev);
866−}
867−
868−static int tegra_slink_unprepare_transfer(struct spi_master *master)
869−{
870− struct tegra_slink_data *tspi = spi_master_get_devdata(master);
871−
872− pm_runtime_put(tspi->dev);
873− return 0;
874−}
875−
876861 static int tegra_slink_transfer_one_message(struct spi_master *master,
877862 struct spi_message *msg)
878863 {
@@ -885,6 +870,12 @@ static int tegra_slink_transfer_one_message(struct spi_master *master, · 6 unmodified lines
885870
886871 msg->status = 0;
887872 msg->actual_length = 0;
873+ ret = pm_runtime_get_sync(tspi->dev);
874+ if (ret < 0) {
875+ dev_err(tspi->dev, "runtime get failed: %d\n", ret);
876+ goto done;
877+ }
878+
888879 single_xfer = list_is_singular(&msg->transfers);
889880 list_for_each_entry(xfer, &msg->transfers, transfer_list) {
890881 INIT_COMPLETION(tspi->xfer_completion);
@@ -921,6 +912,8 @@ static int tegra_slink_transfer_one_message(struct spi_master *master, · 30 unmodified lines
921912 exit:
922913 tegra_slink_writel(tspi, tspi->def_command_reg, SLINK_COMMAND);
923914 tegra_slink_writel(tspi, tspi->def_command2_reg, SLINK_COMMAND2);
915+ pm_runtime_put(tspi->dev);
916+done:
924917 msg->status = ret;
925918 spi_finalize_current_message(master);
926919 return ret;
@@ -1148,9 +1141,7 @@ static int tegra_slink_probe(struct platform_device *pdev) · 221 unmodified lines
11481141 /* the spi->mode bits understood by this driver: */
11491142 master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH;
11501143 master->setup = tegra_slink_setup;
1151− master->prepare_transfer_hardware = tegra_slink_prepare_transfer;
11521144 master->transfer_one_message = tegra_slink_transfer_one_message;
1153− master->unprepare_transfer_hardware = tegra_slink_unprepare_transfer;
11541145 master->num_chipselect = MAX_CHIP_SELECT;
11551146 master->bus_num = -1;
11561147
drivers/spi/spi.c+7−8
@@ -543,17 +543,16 @@ static void spi_pump_messages(struct kthread_work *work) · 542 unmodified lines
543543 /* Lock queue and check for queue work */
544544 spin_lock_irqsave(&master->queue_lock, flags);
545545 if (list_empty(&master->queue) || !master->running) {
546− if (master->busy && master->unprepare_transfer_hardware) {
547− ret = master->unprepare_transfer_hardware(master);
548− if (ret) {
549− spin_unlock_irqrestore(&master->queue_lock, flags);
550− dev_err(&master->dev,
551− "failed to unprepare transfer hardware\n");
552− return;
553− }
546+ if (!master->busy) {
547+ spin_unlock_irqrestore(&master->queue_lock, flags);
548+ return;
554549 }
555550 master->busy = false;
556551 spin_unlock_irqrestore(&master->queue_lock, flags);
552+ if (master->unprepare_transfer_hardware &&
553+ master->unprepare_transfer_hardware(master))
554+ dev_err(&master->dev,
555+ "failed to unprepare transfer hardware\n");
557556 return;
558557 }
559558

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t