diff options
author | Shardar Shariff Md <smohammed@nvidia.com> | 2013-10-25 21:04:07 +0530 |
---|---|---|
committer | Laxman Dewangan <ldewangan@nvidia.com> | 2013-10-30 04:02:01 -0700 |
commit | 120d27e85f4cd9a29e94b8ab32d4c4e765d8c47c (patch) | |
tree | 660f24486d1dc41ff237df069058a1753f4d0910 /drivers/spi | |
parent | df0d4b4a5b96077d428682534795f66ef5af501e (diff) |
arm: tegra: spi: Add tegra_spi_cs_low callback
added tegra_spi_cs_low() callback, called
from spi core for spi client users to set chip
select state(low/high).
Bug 1371286
Change-Id: Ifea4282a46f88c1744c44e6fd6dee7d98d72bc05
Signed-off-by: Shardar Shariff Md <smohammed@nvidia.com>
Reviewed-on: http://git-master/r/303904
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
Diffstat (limited to 'drivers/spi')
-rw-r--r-- | drivers/spi/spi-tegra114.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/drivers/spi/spi-tegra114.c b/drivers/spi/spi-tegra114.c index 3a88a8b29c46..8e36ae9a11d5 100644 --- a/drivers/spi/spi-tegra114.c +++ b/drivers/spi/spi-tegra114.c @@ -887,6 +887,43 @@ static int tegra_spi_setup(struct spi_device *spi) return 0; } +static int tegra_spi_cs_low(struct spi_device *spi, + bool state) +{ + struct tegra_spi_data *tspi = spi_master_get_devdata(spi->master); + int ret; + unsigned long val; + unsigned long flags; + unsigned int cs_pol_bit[MAX_CHIP_SELECT] = { + SPI_CS_POL_INACTIVE_0, + SPI_CS_POL_INACTIVE_1, + SPI_CS_POL_INACTIVE_2, + SPI_CS_POL_INACTIVE_3, + }; + + BUG_ON(spi->chip_select >= MAX_CHIP_SELECT); + + ret = pm_runtime_get_sync(tspi->dev); + if (ret < 0) { + dev_err(tspi->dev, "pm runtime failed, e = %d\n", ret); + return ret; + } + + spin_lock_irqsave(&tspi->lock, flags); + if (!(spi->mode & SPI_CS_HIGH)) { + val = tegra_spi_readl(tspi, SPI_COMMAND1); + if (state) + val &= ~cs_pol_bit[spi->chip_select]; + else + val |= cs_pol_bit[spi->chip_select]; + tegra_spi_writel(tspi, val, SPI_COMMAND1); + } + + spin_unlock_irqrestore(&tspi->lock, flags); + pm_runtime_put(tspi->dev); + return 0; +} + static int tegra_spi_transfer_one_message(struct spi_master *master, struct spi_message *msg) { @@ -1169,6 +1206,7 @@ static int tegra_spi_probe(struct platform_device *pdev) master->transfer_one_message = tegra_spi_transfer_one_message; master->num_chipselect = MAX_CHIP_SELECT; master->bus_num = bus_num; + master->spi_cs_low = tegra_spi_cs_low; dev_set_drvdata(&pdev->dev, master); tspi = spi_master_get_devdata(master); |