summaryrefslogtreecommitdiff
path: root/drivers/spi
diff options
context:
space:
mode:
authorGovindraj.R <govindraj.raja@ti.com>2010-09-07 12:15:51 +0530
committerRicardo Perez Olivares <x0081762@ti.com>2010-09-14 19:27:48 -0500
commit2413053b1f1db5ca724cd009660f2a000e3d8f08 (patch)
tree4f1d31ca57bec01a3a52788cf9d6da3f40a72ca5 /drivers/spi
parentaf908f760a88230506a2ef8e363d10c7240002bc (diff)
OMAP: McSPI: Add McSPI slave support.
This patch adds support for mcspi slave mode. Signed-off-by: Hemanth V <hemanthv@ti.com> Signed-off-by: Govindraj.R <govindraj.raja@ti.com>
Diffstat (limited to 'drivers/spi')
-rw-r--r--drivers/spi/omap2_mcspi.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/drivers/spi/omap2_mcspi.c b/drivers/spi/omap2_mcspi.c
index 1f2b8512a1bb..551c9eae81ff 100644
--- a/drivers/spi/omap2_mcspi.c
+++ b/drivers/spi/omap2_mcspi.c
@@ -411,6 +411,16 @@ static void omap2_mcspi_set_master_mode(struct spi_master *master)
omap2_mcspi_ctx[master->bus_num - 1].modulctrl = l;
}
+static void omap2_mcspi_set_slave_mode(struct spi_master *master)
+{
+ u32 l;
+
+ l = mcspi_read_reg(master, OMAP2_MCSPI_MODULCTRL);
+ MOD_REG_BIT(l, OMAP2_MCSPI_MODULCTRL_STEST, 0);
+ MOD_REG_BIT(l, OMAP2_MCSPI_MODULCTRL_MS, 1);
+ mcspi_write_reg(master, OMAP2_MCSPI_MODULCTRL, l);
+}
+
static int mcspi_wait_for_reg_bit(void __iomem *reg, unsigned long bit)
{
unsigned long timeout;
@@ -881,10 +891,11 @@ static int omap2_mcspi_setup_transfer(struct spi_device *spi,
l &= ~(OMAP2_MCSPI_CHCONF_IS|OMAP2_MCSPI_CHCONF_DPE1);
l |= OMAP2_MCSPI_CHCONF_DPE0;
} else {
- return -EINVAL;
+ l |= OMAP2_MCSPI_CHCONF_IS;
+ l |= OMAP2_MCSPI_CHCONF_DPE1;
+ l &= ~OMAP2_MCSPI_CHCONF_DPE0;
}
-
/* wordlength */
l &= ~OMAP2_MCSPI_CHCONF_WL_MASK;
l |= (word_len - 1) << 7;
@@ -1284,7 +1295,6 @@ static int __init omap2_mcspi_reset(struct omap2_mcspi *mcspi)
{
struct spi_master *master = mcspi->master;
u32 tmp;
- u32 error = 0;
if (omap2_mcspi_enable_clocks(mcspi) < 0)
return -1;
@@ -1296,10 +1306,10 @@ static int __init omap2_mcspi_reset(struct omap2_mcspi *mcspi)
if (mcspi->mcspi_mode == OMAP2_MCSPI_MASTER)
omap2_mcspi_set_master_mode(master);
else
- error = -EINVAL;
+ omap2_mcspi_set_slave_mode(master);
omap2_mcspi_disable_clocks(mcspi);
- return error;
+ return 0;
}
static int omap_mcspi_runtime_suspend(struct device *dev)
@@ -1349,7 +1359,7 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)
mcspi = spi_master_get_devdata(master);
mcspi->master = master;
- mcspi->mcspi_mode = OMAP2_MCSPI_MASTER;
+ mcspi->mcspi_mode = pdata->mode;
mcspi->dma_mode = pdata->dma_mode;
mcspi->force_cs_mode = pdata->force_cs_mode;
mcspi->regs = pdata->regs_data;