diff options
-rw-r--r-- | Documentation/devicetree/bindings/spi/omap-spi.txt | 4 | ||||
-rw-r--r-- | drivers/spi/spi-bcm63xx.c | 16 | ||||
-rw-r--r-- | drivers/spi/spi-mxs.c | 3 | ||||
-rw-r--r-- | drivers/spi/spi-omap2-mcspi.c | 25 | ||||
-rw-r--r-- | drivers/spi/spi-s3c64xx.c | 32 | ||||
-rw-r--r-- | include/linux/platform_data/spi-omap2-mcspi.h | 4 |
6 files changed, 49 insertions, 35 deletions
diff --git a/Documentation/devicetree/bindings/spi/omap-spi.txt b/Documentation/devicetree/bindings/spi/omap-spi.txt index 81df374adbb9..2ef0a6b85653 100644 --- a/Documentation/devicetree/bindings/spi/omap-spi.txt +++ b/Documentation/devicetree/bindings/spi/omap-spi.txt | |||
@@ -6,7 +6,9 @@ Required properties: | |||
6 | - "ti,omap4-spi" for OMAP4+. | 6 | - "ti,omap4-spi" for OMAP4+. |
7 | - ti,spi-num-cs : Number of chipselect supported by the instance. | 7 | - ti,spi-num-cs : Number of chipselect supported by the instance. |
8 | - ti,hwmods: Name of the hwmod associated to the McSPI | 8 | - ti,hwmods: Name of the hwmod associated to the McSPI |
9 | 9 | - ti,pindir-d0-in-d1-out: Select the D0 pin as input and D1 as | |
10 | output. The default is D0 as output and | ||
11 | D1 as input. | ||
10 | 12 | ||
11 | Example: | 13 | Example: |
12 | 14 | ||
diff --git a/drivers/spi/spi-bcm63xx.c b/drivers/spi/spi-bcm63xx.c index a9f4049c6769..6d97047d9242 100644 --- a/drivers/spi/spi-bcm63xx.c +++ b/drivers/spi/spi-bcm63xx.c | |||
@@ -36,7 +36,6 @@ | |||
36 | #include <bcm63xx_dev_spi.h> | 36 | #include <bcm63xx_dev_spi.h> |
37 | 37 | ||
38 | #define PFX KBUILD_MODNAME | 38 | #define PFX KBUILD_MODNAME |
39 | #define DRV_VER "0.1.2" | ||
40 | 39 | ||
41 | struct bcm63xx_spi { | 40 | struct bcm63xx_spi { |
42 | struct completion done; | 41 | struct completion done; |
@@ -170,13 +169,6 @@ static int bcm63xx_spi_setup(struct spi_device *spi) | |||
170 | return -EINVAL; | 169 | return -EINVAL; |
171 | } | 170 | } |
172 | 171 | ||
173 | ret = bcm63xx_spi_check_transfer(spi, NULL); | ||
174 | if (ret < 0) { | ||
175 | dev_err(&spi->dev, "setup: unsupported mode bits %x\n", | ||
176 | spi->mode & ~MODEBITS); | ||
177 | return ret; | ||
178 | } | ||
179 | |||
180 | dev_dbg(&spi->dev, "%s, mode %d, %u bits/w, %u nsec/bit\n", | 172 | dev_dbg(&spi->dev, "%s, mode %d, %u bits/w, %u nsec/bit\n", |
181 | __func__, spi->mode & MODEBITS, spi->bits_per_word, 0); | 173 | __func__, spi->mode & MODEBITS, spi->bits_per_word, 0); |
182 | 174 | ||
@@ -441,8 +433,8 @@ static int __devinit bcm63xx_spi_probe(struct platform_device *pdev) | |||
441 | goto out_clk_disable; | 433 | goto out_clk_disable; |
442 | } | 434 | } |
443 | 435 | ||
444 | dev_info(dev, "at 0x%08x (irq %d, FIFOs size %d) v%s\n", | 436 | dev_info(dev, "at 0x%08x (irq %d, FIFOs size %d)\n", |
445 | r->start, irq, bs->fifo_size, DRV_VER); | 437 | r->start, irq, bs->fifo_size); |
446 | 438 | ||
447 | return 0; | 439 | return 0; |
448 | 440 | ||
@@ -485,6 +477,8 @@ static int bcm63xx_spi_suspend(struct device *dev) | |||
485 | platform_get_drvdata(to_platform_device(dev)); | 477 | platform_get_drvdata(to_platform_device(dev)); |
486 | struct bcm63xx_spi *bs = spi_master_get_devdata(master); | 478 | struct bcm63xx_spi *bs = spi_master_get_devdata(master); |
487 | 479 | ||
480 | spi_master_suspend(master); | ||
481 | |||
488 | clk_disable(bs->clk); | 482 | clk_disable(bs->clk); |
489 | 483 | ||
490 | return 0; | 484 | return 0; |
@@ -498,6 +492,8 @@ static int bcm63xx_spi_resume(struct device *dev) | |||
498 | 492 | ||
499 | clk_enable(bs->clk); | 493 | clk_enable(bs->clk); |
500 | 494 | ||
495 | spi_master_resume(master); | ||
496 | |||
501 | return 0; | 497 | return 0; |
502 | } | 498 | } |
503 | 499 | ||
diff --git a/drivers/spi/spi-mxs.c b/drivers/spi/spi-mxs.c index edf1360ab09e..86dd04d6bc87 100644 --- a/drivers/spi/spi-mxs.c +++ b/drivers/spi/spi-mxs.c | |||
@@ -323,6 +323,7 @@ static int mxs_spi_txrx_dma(struct mxs_spi *spi, int cs, | |||
323 | if (!ret) { | 323 | if (!ret) { |
324 | dev_err(ssp->dev, "DMA transfer timeout\n"); | 324 | dev_err(ssp->dev, "DMA transfer timeout\n"); |
325 | ret = -ETIMEDOUT; | 325 | ret = -ETIMEDOUT; |
326 | dmaengine_terminate_all(ssp->dmach); | ||
326 | goto err_vmalloc; | 327 | goto err_vmalloc; |
327 | } | 328 | } |
328 | 329 | ||
@@ -480,7 +481,7 @@ static int mxs_spi_transfer_one(struct spi_master *master, | |||
480 | first = last = 0; | 481 | first = last = 0; |
481 | } | 482 | } |
482 | 483 | ||
483 | m->status = 0; | 484 | m->status = status; |
484 | spi_finalize_current_message(master); | 485 | spi_finalize_current_message(master); |
485 | 486 | ||
486 | return status; | 487 | return status; |
diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c index 3542fdc664b1..51046332677c 100644 --- a/drivers/spi/spi-omap2-mcspi.c +++ b/drivers/spi/spi-omap2-mcspi.c | |||
@@ -130,6 +130,7 @@ struct omap2_mcspi { | |||
130 | struct omap2_mcspi_dma *dma_channels; | 130 | struct omap2_mcspi_dma *dma_channels; |
131 | struct device *dev; | 131 | struct device *dev; |
132 | struct omap2_mcspi_regs ctx; | 132 | struct omap2_mcspi_regs ctx; |
133 | unsigned int pin_dir:1; | ||
133 | }; | 134 | }; |
134 | 135 | ||
135 | struct omap2_mcspi_cs { | 136 | struct omap2_mcspi_cs { |
@@ -765,8 +766,15 @@ static int omap2_mcspi_setup_transfer(struct spi_device *spi, | |||
765 | /* standard 4-wire master mode: SCK, MOSI/out, MISO/in, nCS | 766 | /* standard 4-wire master mode: SCK, MOSI/out, MISO/in, nCS |
766 | * REVISIT: this controller could support SPI_3WIRE mode. | 767 | * REVISIT: this controller could support SPI_3WIRE mode. |
767 | */ | 768 | */ |
768 | l &= ~(OMAP2_MCSPI_CHCONF_IS|OMAP2_MCSPI_CHCONF_DPE1); | 769 | if (mcspi->pin_dir == MCSPI_PINDIR_D0_OUT_D1_IN) { |
769 | l |= OMAP2_MCSPI_CHCONF_DPE0; | 770 | l &= ~OMAP2_MCSPI_CHCONF_IS; |
771 | l &= ~OMAP2_MCSPI_CHCONF_DPE1; | ||
772 | l |= OMAP2_MCSPI_CHCONF_DPE0; | ||
773 | } else { | ||
774 | l |= OMAP2_MCSPI_CHCONF_IS; | ||
775 | l |= OMAP2_MCSPI_CHCONF_DPE1; | ||
776 | l &= ~OMAP2_MCSPI_CHCONF_DPE0; | ||
777 | } | ||
770 | 778 | ||
771 | /* wordlength */ | 779 | /* wordlength */ |
772 | l &= ~OMAP2_MCSPI_CHCONF_WL_MASK; | 780 | l &= ~OMAP2_MCSPI_CHCONF_WL_MASK; |
@@ -1167,6 +1175,11 @@ static int __devinit omap2_mcspi_probe(struct platform_device *pdev) | |||
1167 | master->cleanup = omap2_mcspi_cleanup; | 1175 | master->cleanup = omap2_mcspi_cleanup; |
1168 | master->dev.of_node = node; | 1176 | master->dev.of_node = node; |
1169 | 1177 | ||
1178 | dev_set_drvdata(&pdev->dev, master); | ||
1179 | |||
1180 | mcspi = spi_master_get_devdata(master); | ||
1181 | mcspi->master = master; | ||
1182 | |||
1170 | match = of_match_device(omap_mcspi_of_match, &pdev->dev); | 1183 | match = of_match_device(omap_mcspi_of_match, &pdev->dev); |
1171 | if (match) { | 1184 | if (match) { |
1172 | u32 num_cs = 1; /* default number of chipselect */ | 1185 | u32 num_cs = 1; /* default number of chipselect */ |
@@ -1175,19 +1188,17 @@ static int __devinit omap2_mcspi_probe(struct platform_device *pdev) | |||
1175 | of_property_read_u32(node, "ti,spi-num-cs", &num_cs); | 1188 | of_property_read_u32(node, "ti,spi-num-cs", &num_cs); |
1176 | master->num_chipselect = num_cs; | 1189 | master->num_chipselect = num_cs; |
1177 | master->bus_num = bus_num++; | 1190 | master->bus_num = bus_num++; |
1191 | if (of_get_property(node, "ti,pindir-d0-in-d1-out", NULL)) | ||
1192 | mcspi->pin_dir = MCSPI_PINDIR_D0_IN_D1_OUT; | ||
1178 | } else { | 1193 | } else { |
1179 | pdata = pdev->dev.platform_data; | 1194 | pdata = pdev->dev.platform_data; |
1180 | master->num_chipselect = pdata->num_cs; | 1195 | master->num_chipselect = pdata->num_cs; |
1181 | if (pdev->id != -1) | 1196 | if (pdev->id != -1) |
1182 | master->bus_num = pdev->id; | 1197 | master->bus_num = pdev->id; |
1198 | mcspi->pin_dir = pdata->pin_dir; | ||
1183 | } | 1199 | } |
1184 | regs_offset = pdata->regs_offset; | 1200 | regs_offset = pdata->regs_offset; |
1185 | 1201 | ||
1186 | dev_set_drvdata(&pdev->dev, master); | ||
1187 | |||
1188 | mcspi = spi_master_get_devdata(master); | ||
1189 | mcspi->master = master; | ||
1190 | |||
1191 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 1202 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1192 | if (r == NULL) { | 1203 | if (r == NULL) { |
1193 | status = -ENODEV; | 1204 | status = -ENODEV; |
diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c index 1a81c90a4a71..06a5fe777434 100644 --- a/drivers/spi/spi-s3c64xx.c +++ b/drivers/spi/spi-s3c64xx.c | |||
@@ -516,7 +516,7 @@ static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd) | |||
516 | 516 | ||
517 | /* Disable Clock */ | 517 | /* Disable Clock */ |
518 | if (sdd->port_conf->clk_from_cmu) { | 518 | if (sdd->port_conf->clk_from_cmu) { |
519 | clk_disable(sdd->src_clk); | 519 | clk_disable_unprepare(sdd->src_clk); |
520 | } else { | 520 | } else { |
521 | val = readl(regs + S3C64XX_SPI_CLK_CFG); | 521 | val = readl(regs + S3C64XX_SPI_CLK_CFG); |
522 | val &= ~S3C64XX_SPI_ENCLK_ENABLE; | 522 | val &= ~S3C64XX_SPI_ENCLK_ENABLE; |
@@ -564,7 +564,7 @@ static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd) | |||
564 | /* There is half-multiplier before the SPI */ | 564 | /* There is half-multiplier before the SPI */ |
565 | clk_set_rate(sdd->src_clk, sdd->cur_speed * 2); | 565 | clk_set_rate(sdd->src_clk, sdd->cur_speed * 2); |
566 | /* Enable Clock */ | 566 | /* Enable Clock */ |
567 | clk_enable(sdd->src_clk); | 567 | clk_prepare_enable(sdd->src_clk); |
568 | } else { | 568 | } else { |
569 | /* Configure Clock */ | 569 | /* Configure Clock */ |
570 | val = readl(regs + S3C64XX_SPI_CLK_CFG); | 570 | val = readl(regs + S3C64XX_SPI_CLK_CFG); |
@@ -1302,7 +1302,7 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev) | |||
1302 | goto err3; | 1302 | goto err3; |
1303 | } | 1303 | } |
1304 | 1304 | ||
1305 | if (clk_enable(sdd->clk)) { | 1305 | if (clk_prepare_enable(sdd->clk)) { |
1306 | dev_err(&pdev->dev, "Couldn't enable clock 'spi'\n"); | 1306 | dev_err(&pdev->dev, "Couldn't enable clock 'spi'\n"); |
1307 | ret = -EBUSY; | 1307 | ret = -EBUSY; |
1308 | goto err4; | 1308 | goto err4; |
@@ -1317,7 +1317,7 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev) | |||
1317 | goto err5; | 1317 | goto err5; |
1318 | } | 1318 | } |
1319 | 1319 | ||
1320 | if (clk_enable(sdd->src_clk)) { | 1320 | if (clk_prepare_enable(sdd->src_clk)) { |
1321 | dev_err(&pdev->dev, "Couldn't enable clock '%s'\n", clk_name); | 1321 | dev_err(&pdev->dev, "Couldn't enable clock '%s'\n", clk_name); |
1322 | ret = -EBUSY; | 1322 | ret = -EBUSY; |
1323 | goto err6; | 1323 | goto err6; |
@@ -1361,11 +1361,11 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev) | |||
1361 | err8: | 1361 | err8: |
1362 | free_irq(irq, sdd); | 1362 | free_irq(irq, sdd); |
1363 | err7: | 1363 | err7: |
1364 | clk_disable(sdd->src_clk); | 1364 | clk_disable_unprepare(sdd->src_clk); |
1365 | err6: | 1365 | err6: |
1366 | clk_put(sdd->src_clk); | 1366 | clk_put(sdd->src_clk); |
1367 | err5: | 1367 | err5: |
1368 | clk_disable(sdd->clk); | 1368 | clk_disable_unprepare(sdd->clk); |
1369 | err4: | 1369 | err4: |
1370 | clk_put(sdd->clk); | 1370 | clk_put(sdd->clk); |
1371 | err3: | 1371 | err3: |
@@ -1393,10 +1393,10 @@ static int s3c64xx_spi_remove(struct platform_device *pdev) | |||
1393 | 1393 | ||
1394 | free_irq(platform_get_irq(pdev, 0), sdd); | 1394 | free_irq(platform_get_irq(pdev, 0), sdd); |
1395 | 1395 | ||
1396 | clk_disable(sdd->src_clk); | 1396 | clk_disable_unprepare(sdd->src_clk); |
1397 | clk_put(sdd->src_clk); | 1397 | clk_put(sdd->src_clk); |
1398 | 1398 | ||
1399 | clk_disable(sdd->clk); | 1399 | clk_disable_unprepare(sdd->clk); |
1400 | clk_put(sdd->clk); | 1400 | clk_put(sdd->clk); |
1401 | 1401 | ||
1402 | if (!sdd->cntrlr_info->cfg_gpio && pdev->dev.of_node) | 1402 | if (!sdd->cntrlr_info->cfg_gpio && pdev->dev.of_node) |
@@ -1417,8 +1417,8 @@ static int s3c64xx_spi_suspend(struct device *dev) | |||
1417 | spi_master_suspend(master); | 1417 | spi_master_suspend(master); |
1418 | 1418 | ||
1419 | /* Disable the clock */ | 1419 | /* Disable the clock */ |
1420 | clk_disable(sdd->src_clk); | 1420 | clk_disable_unprepare(sdd->src_clk); |
1421 | clk_disable(sdd->clk); | 1421 | clk_disable_unprepare(sdd->clk); |
1422 | 1422 | ||
1423 | if (!sdd->cntrlr_info->cfg_gpio && dev->of_node) | 1423 | if (!sdd->cntrlr_info->cfg_gpio && dev->of_node) |
1424 | s3c64xx_spi_dt_gpio_free(sdd); | 1424 | s3c64xx_spi_dt_gpio_free(sdd); |
@@ -1440,8 +1440,8 @@ static int s3c64xx_spi_resume(struct device *dev) | |||
1440 | sci->cfg_gpio(); | 1440 | sci->cfg_gpio(); |
1441 | 1441 | ||
1442 | /* Enable the clock */ | 1442 | /* Enable the clock */ |
1443 | clk_enable(sdd->src_clk); | 1443 | clk_prepare_enable(sdd->src_clk); |
1444 | clk_enable(sdd->clk); | 1444 | clk_prepare_enable(sdd->clk); |
1445 | 1445 | ||
1446 | s3c64xx_spi_hwinit(sdd, sdd->port_id); | 1446 | s3c64xx_spi_hwinit(sdd, sdd->port_id); |
1447 | 1447 | ||
@@ -1457,8 +1457,8 @@ static int s3c64xx_spi_runtime_suspend(struct device *dev) | |||
1457 | struct spi_master *master = dev_get_drvdata(dev); | 1457 | struct spi_master *master = dev_get_drvdata(dev); |
1458 | struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master); | 1458 | struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master); |
1459 | 1459 | ||
1460 | clk_disable(sdd->clk); | 1460 | clk_disable_unprepare(sdd->clk); |
1461 | clk_disable(sdd->src_clk); | 1461 | clk_disable_unprepare(sdd->src_clk); |
1462 | 1462 | ||
1463 | return 0; | 1463 | return 0; |
1464 | } | 1464 | } |
@@ -1468,8 +1468,8 @@ static int s3c64xx_spi_runtime_resume(struct device *dev) | |||
1468 | struct spi_master *master = dev_get_drvdata(dev); | 1468 | struct spi_master *master = dev_get_drvdata(dev); |
1469 | struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master); | 1469 | struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master); |
1470 | 1470 | ||
1471 | clk_enable(sdd->src_clk); | 1471 | clk_prepare_enable(sdd->src_clk); |
1472 | clk_enable(sdd->clk); | 1472 | clk_prepare_enable(sdd->clk); |
1473 | 1473 | ||
1474 | return 0; | 1474 | return 0; |
1475 | } | 1475 | } |
diff --git a/include/linux/platform_data/spi-omap2-mcspi.h b/include/linux/platform_data/spi-omap2-mcspi.h index a357eb26bd25..ce70f7b5a8e1 100644 --- a/include/linux/platform_data/spi-omap2-mcspi.h +++ b/include/linux/platform_data/spi-omap2-mcspi.h | |||
@@ -7,9 +7,13 @@ | |||
7 | 7 | ||
8 | #define OMAP4_MCSPI_REG_OFFSET 0x100 | 8 | #define OMAP4_MCSPI_REG_OFFSET 0x100 |
9 | 9 | ||
10 | #define MCSPI_PINDIR_D0_OUT_D1_IN 0 | ||
11 | #define MCSPI_PINDIR_D0_IN_D1_OUT 1 | ||
12 | |||
10 | struct omap2_mcspi_platform_config { | 13 | struct omap2_mcspi_platform_config { |
11 | unsigned short num_cs; | 14 | unsigned short num_cs; |
12 | unsigned int regs_offset; | 15 | unsigned int regs_offset; |
16 | unsigned int pin_dir:1; | ||
13 | }; | 17 | }; |
14 | 18 | ||
15 | struct omap2_mcspi_dev_attr { | 19 | struct omap2_mcspi_dev_attr { |