summaryrefslogtreecommitdiff
path: root/drivers/spi/spi-pxa2xx.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-09-03 10:08:25 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2013-09-03 10:08:25 -0700
commit5d3fed701d75ac6888f892ea2eb7c5dcc7831750 (patch)
tree897612dbf321bc740df8a1825cf5580d6ceec872 /drivers/spi/spi-pxa2xx.c
parent8243b7f5dc1dced123145566291015704f2b4ba7 (diff)
parent578739259875a93b1869d25cdf4a8bd963b7d0a7 (diff)
Merge tag 'spi-v3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi
Pull spi updates from Mark Brown: "Business as usual for SPI - some new drivers, lots of fixes and updates to existing drivers plus some new framework features. Notable changes are: - Support for dual and quad data lines, commonly used by flash chips to improve performance, from Wang Yuhang. - Factored out a common pattern for runtime PM implementation into the core saving a bunch of code. - A particularly nice set of updates to the ep93xx driver from H Hartley Sweeten, modernising it and reducing the code size a lot. - New drivers for Blackfin v3, EFM32, Freescale DSPI and TI QSPI" * tag 'spi-v3.12' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi: (133 commits) spi/qspi: fix missing unlock on error in ti_qspi_start_transfer_one() spi: quad: fix the name of DT property spi: core: Fix spi_register_master error handling spi: efm32: Fix build error spi: altera: Use DIV_ROUND_UP to calculate hw->bytes_per_word spi: rspi: Add spi_master_get() call to prevent use after free spi: quad: Make DT properties optional spi: quad: Fix missing return spi: Use dev_get_drvdata at appropriate places spi: use dev_get_platdata() spi: nuc900: Fix mode_bits setting spi: simplify devm_request_mem_region/devm_ioremap spi: altera: Simplify altera_spi_txrx implementation for noirq case spi: spi-rspi: fix inconsistent spin_lock_irqsave spi/qspi: Add compatible string for am4372. spi/qspi: Fix device table entry spi/sirf: fix the misunderstanding about len of spi_transfer spi/qspi: Add dual/quad spi read support spi: sirf: fix error return code in spi_sirfsoc_probe() spi: bcm2835: Add spi_master_get() call to prevent use after free ...
Diffstat (limited to 'drivers/spi/spi-pxa2xx.c')
-rw-r--r--drivers/spi/spi-pxa2xx.c21
1 files changed, 9 insertions, 12 deletions
diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
index f440dcee852b..2eb06ee0b326 100644
--- a/drivers/spi/spi-pxa2xx.c
+++ b/drivers/spi/spi-pxa2xx.c
@@ -69,6 +69,8 @@ MODULE_ALIAS("platform:pxa2xx-spi");
#define LPSS_TX_HITHRESH_DFLT 224
/* Offset from drv_data->lpss_base */
+#define GENERAL_REG 0x08
+#define GENERAL_REG_RXTO_HOLDOFF_DISABLE BIT(24)
#define SSP_REG 0x0c
#define SPI_CS_CONTROL 0x18
#define SPI_CS_CONTROL_SW_MODE BIT(0)
@@ -142,8 +144,13 @@ detection_done:
__lpss_ssp_write_priv(drv_data, SPI_CS_CONTROL, value);
/* Enable multiblock DMA transfers */
- if (drv_data->master_info->enable_dma)
+ if (drv_data->master_info->enable_dma) {
__lpss_ssp_write_priv(drv_data, SSP_REG, 1);
+
+ value = __lpss_ssp_read_priv(drv_data, GENERAL_REG);
+ value |= GENERAL_REG_RXTO_HOLDOFF_DISABLE;
+ __lpss_ssp_write_priv(drv_data, GENERAL_REG, value);
+ }
}
static void lpss_ssp_cs_control(struct driver_data *drv_data, bool enable)
@@ -804,14 +811,6 @@ static int pxa2xx_spi_transfer_one_message(struct spi_master *master,
return 0;
}
-static int pxa2xx_spi_prepare_transfer(struct spi_master *master)
-{
- struct driver_data *drv_data = spi_master_get_devdata(master);
-
- pm_runtime_get_sync(&drv_data->pdev->dev);
- return 0;
-}
-
static int pxa2xx_spi_unprepare_transfer(struct spi_master *master)
{
struct driver_data *drv_data = spi_master_get_devdata(master);
@@ -820,8 +819,6 @@ static int pxa2xx_spi_unprepare_transfer(struct spi_master *master)
write_SSCR0(read_SSCR0(drv_data->ioaddr) & ~SSCR0_SSE,
drv_data->ioaddr);
- pm_runtime_mark_last_busy(&drv_data->pdev->dev);
- pm_runtime_put_autosuspend(&drv_data->pdev->dev);
return 0;
}
@@ -1134,8 +1131,8 @@ static int pxa2xx_spi_probe(struct platform_device *pdev)
master->cleanup = cleanup;
master->setup = setup;
master->transfer_one_message = pxa2xx_spi_transfer_one_message;
- master->prepare_transfer_hardware = pxa2xx_spi_prepare_transfer;
master->unprepare_transfer_hardware = pxa2xx_spi_unprepare_transfer;
+ master->auto_runtime_pm = true;
drv_data->ssp_type = ssp->type;
drv_data->null_dma_buf = (u32 *)PTR_ALIGN(&drv_data[1], DMA_ALIGNMENT);