summaryrefslogtreecommitdiff
path: root/drivers/spi
diff options
context:
space:
mode:
authorShardar Shariff Md <smohammed@nvidia.com>2013-10-25 21:04:07 +0530
committerLaxman Dewangan <ldewangan@nvidia.com>2013-10-30 04:02:01 -0700
commit120d27e85f4cd9a29e94b8ab32d4c4e765d8c47c (patch)
tree660f24486d1dc41ff237df069058a1753f4d0910 /drivers/spi
parentdf0d4b4a5b96077d428682534795f66ef5af501e (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.c38
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);