[PATCH] spi: omap2-mcspi: Fix the redifine warning

2012-11-18 Thread Shubhrajyoti D
Fix the below warning
drivers/spi/spi-omap2-mcspi.c:336:34: warning: symbol 'tx' shadows an earlier 
one
drivers/spi/spi-omap2-mcspi.c:327:12: originally declared here

So delete the u8 tx as it is assigned and not used(resigned afterwards).

Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |3 ---
 1 files changed, 0 insertions(+), 3 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 251f6d0..c3dcfb3 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -323,14 +323,11 @@ static void omap2_mcspi_tx_dma(struct spi_device *spi,
struct omap2_mcspi  *mcspi;
struct omap2_mcspi_dma  *mcspi_dma;
unsigned intcount;
-   const u8* tx;
 
mcspi = spi_master_get_devdata(spi->master);
mcspi_dma = &mcspi->dma_channels[spi->chip_select];
count = xfer->len;
 
-   tx = xfer->tx_buf;
-
if (mcspi_dma->dma_tx) {
struct dma_async_tx_descriptor *tx;
struct scatterlist sg;
-- 
1.7.5.4


--
Monitor your physical, virtual and cloud infrastructure from a single
web console. Get in-depth insight into apps, servers, databases, vmware,
SAP, cloud infrastructure, etc. Download 30-day Free Trial.
Pricing starts from $795 for 25 servers or applications!
http://p.sf.net/sfu/zoho_dev2dev_nov
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH] spi: omap2-mcspi: Reorder the wait_for_completion for tx

2012-11-06 Thread Shubhrajyoti D
The commit  d7b4394e[Cleanup the omap2_mcspi_txrx_dma function]
changed the wait_for_completion order. Move the wait so that the
rx doesnot wait for the tx to complete.

Reported-and-tested-by: Sørensen, Stefan 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   39 +++
 1 files changed, 19 insertions(+), 20 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index bcfd062..251f6d0 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -323,18 +323,13 @@ static void omap2_mcspi_tx_dma(struct spi_device *spi,
struct omap2_mcspi  *mcspi;
struct omap2_mcspi_dma  *mcspi_dma;
unsigned intcount;
-   u8  * rx;
const u8* tx;
-   void __iomem*chstat_reg;
-   struct omap2_mcspi_cs   *cs = spi->controller_state;
 
mcspi = spi_master_get_devdata(spi->master);
mcspi_dma = &mcspi->dma_channels[spi->chip_select];
count = xfer->len;
 
-   rx = xfer->rx_buf;
tx = xfer->tx_buf;
-   chstat_reg = cs->base + OMAP2_MCSPI_CHSTAT0;
 
if (mcspi_dma->dma_tx) {
struct dma_async_tx_descriptor *tx;
@@ -359,19 +354,6 @@ static void omap2_mcspi_tx_dma(struct spi_device *spi,
dma_async_issue_pending(mcspi_dma->dma_tx);
omap2_mcspi_set_dma_req(spi, 0, 1);
 
-   wait_for_completion(&mcspi_dma->dma_tx_completion);
-   dma_unmap_single(mcspi->dev, xfer->tx_dma, count,
-DMA_TO_DEVICE);
-
-   /* for TX_ONLY mode, be sure all words have shifted out */
-   if (rx == NULL) {
-   if (mcspi_wait_for_reg_bit(chstat_reg,
-   OMAP2_MCSPI_CHSTAT_TXS) < 0)
-   dev_err(&spi->dev, "TXS timed out\n");
-   else if (mcspi_wait_for_reg_bit(chstat_reg,
-   OMAP2_MCSPI_CHSTAT_EOT) < 0)
-   dev_err(&spi->dev, "EOT timed out\n");
-   }
 }
 
 static unsigned
@@ -492,6 +474,7 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct 
spi_transfer *xfer)
struct dma_slave_config cfg;
enum dma_slave_buswidth width;
unsigned es;
+   void __iomem*chstat_reg;
 
mcspi = spi_master_get_devdata(spi->master);
mcspi_dma = &mcspi->dma_channels[spi->chip_select];
@@ -526,8 +509,24 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct 
spi_transfer *xfer)
omap2_mcspi_tx_dma(spi, xfer, cfg);
 
if (rx != NULL)
-   return omap2_mcspi_rx_dma(spi, xfer, cfg, es);
-
+   count = omap2_mcspi_rx_dma(spi, xfer, cfg, es);
+
+   if (tx != NULL) {
+   chstat_reg = cs->base + OMAP2_MCSPI_CHSTAT0;
+   wait_for_completion(&mcspi_dma->dma_tx_completion);
+   dma_unmap_single(mcspi->dev, xfer->tx_dma, xfer->len,
+DMA_TO_DEVICE);
+
+   /* for TX_ONLY mode, be sure all words have shifted out */
+   if (rx == NULL) {
+   if (mcspi_wait_for_reg_bit(chstat_reg,
+   OMAP2_MCSPI_CHSTAT_TXS) < 0)
+   dev_err(&spi->dev, "TXS timed out\n");
+   else if (mcspi_wait_for_reg_bit(chstat_reg,
+   OMAP2_MCSPI_CHSTAT_EOT) < 0)
+   dev_err(&spi->dev, "EOT timed out\n");
+   }
+   }
return count;
 }
 
-- 
1.7.5.4


--
LogMeIn Central: Instant, anywhere, Remote PC access and management.
Stay in control, update software, and manage PCs from one command center
Diagnose problems and improve visibility into emerging IT issues
Automate, monitor and manage. Do more in less time with Central
http://p.sf.net/sfu/logmein12331_d2d
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH] spi: omap2-mcspi: Reorder the wait_for_completion for tx

2012-11-06 Thread Shubhrajyoti D
The commit  d7b4394e[Cleanup the omap2_mcspi_txrx_dma function]
changed the wait_for_completion order. Move the wait so that the
rx doesnot wait for the tx to complete.

Reported-and-tested-by: Sørensen, Stefan 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   39 +++
 1 files changed, 19 insertions(+), 20 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index bcfd062..251f6d0 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -323,18 +323,13 @@ static void omap2_mcspi_tx_dma(struct spi_device *spi,
struct omap2_mcspi  *mcspi;
struct omap2_mcspi_dma  *mcspi_dma;
unsigned intcount;
-   u8  * rx;
const u8* tx;
-   void __iomem*chstat_reg;
-   struct omap2_mcspi_cs   *cs = spi->controller_state;
 
mcspi = spi_master_get_devdata(spi->master);
mcspi_dma = &mcspi->dma_channels[spi->chip_select];
count = xfer->len;
 
-   rx = xfer->rx_buf;
tx = xfer->tx_buf;
-   chstat_reg = cs->base + OMAP2_MCSPI_CHSTAT0;
 
if (mcspi_dma->dma_tx) {
struct dma_async_tx_descriptor *tx;
@@ -359,19 +354,6 @@ static void omap2_mcspi_tx_dma(struct spi_device *spi,
dma_async_issue_pending(mcspi_dma->dma_tx);
omap2_mcspi_set_dma_req(spi, 0, 1);
 
-   wait_for_completion(&mcspi_dma->dma_tx_completion);
-   dma_unmap_single(mcspi->dev, xfer->tx_dma, count,
-DMA_TO_DEVICE);
-
-   /* for TX_ONLY mode, be sure all words have shifted out */
-   if (rx == NULL) {
-   if (mcspi_wait_for_reg_bit(chstat_reg,
-   OMAP2_MCSPI_CHSTAT_TXS) < 0)
-   dev_err(&spi->dev, "TXS timed out\n");
-   else if (mcspi_wait_for_reg_bit(chstat_reg,
-   OMAP2_MCSPI_CHSTAT_EOT) < 0)
-   dev_err(&spi->dev, "EOT timed out\n");
-   }
 }
 
 static unsigned
@@ -492,6 +474,7 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct 
spi_transfer *xfer)
struct dma_slave_config cfg;
enum dma_slave_buswidth width;
unsigned es;
+   void __iomem*chstat_reg;
 
mcspi = spi_master_get_devdata(spi->master);
mcspi_dma = &mcspi->dma_channels[spi->chip_select];
@@ -526,8 +509,24 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct 
spi_transfer *xfer)
omap2_mcspi_tx_dma(spi, xfer, cfg);
 
if (rx != NULL)
-   return omap2_mcspi_rx_dma(spi, xfer, cfg, es);
-
+   count = omap2_mcspi_rx_dma(spi, xfer, cfg, es);
+
+   if (tx != NULL) {
+   chstat_reg = cs->base + OMAP2_MCSPI_CHSTAT0;
+   wait_for_completion(&mcspi_dma->dma_tx_completion);
+   dma_unmap_single(mcspi->dev, xfer->tx_dma, xfer->len,
+DMA_TO_DEVICE);
+
+   /* for TX_ONLY mode, be sure all words have shifted out */
+   if (rx == NULL) {
+   if (mcspi_wait_for_reg_bit(chstat_reg,
+   OMAP2_MCSPI_CHSTAT_TXS) < 0)
+   dev_err(&spi->dev, "TXS timed out\n");
+   else if (mcspi_wait_for_reg_bit(chstat_reg,
+   OMAP2_MCSPI_CHSTAT_EOT) < 0)
+   dev_err(&spi->dev, "EOT timed out\n");
+   }
+   }
return count;
 }
 
-- 
1.7.5.4


--
LogMeIn Central: Instant, anywhere, Remote PC access and management.
Stay in control, update software, and manage PCs from one command center
Diagnose problems and improve visibility into emerging IT issues
Automate, monitor and manage. Do more in less time with Central
http://p.sf.net/sfu/logmein12331_d2d
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH] spi: omap2-mcspi: Cleanup the omap2_mcspi_txrx_dma function

2012-09-10 Thread Shubhrajyoti D
Currently in omap2_mcspi_txrx_dma the tx and the rx support is
interleaved. Make the rx related code in omap2_mcspi_rx_dma
and the tx related code omap2_mcspi_tx_dma and call the functions.

While at it remove the braces in the if statements which has only
one line.
Also fix ["foo * bar" to "foo *bar"] warn for the rx and tx variables.

Only a cleanup no functional change.

Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |  256 +++--
 1 files changed, 144 insertions(+), 112 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 1c1dd34..dd8fc88 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -315,49 +315,27 @@ static void omap2_mcspi_tx_callback(void *data)
omap2_mcspi_set_dma_req(spi, 0, 0);
 }
 
-static unsigned
-omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer)
+static void omap2_mcspi_tx_dma(struct spi_device *spi,
+   struct spi_transfer *xfer,
+   struct dma_slave_config cfg)
 {
struct omap2_mcspi  *mcspi;
-   struct omap2_mcspi_cs   *cs = spi->controller_state;
struct omap2_mcspi_dma  *mcspi_dma;
unsigned intcount;
-   int word_len, element_count;
-   int elements = 0;
-   u32 l;
u8  * rx;
const u8* tx;
void __iomem*chstat_reg;
-   struct dma_slave_config cfg;
-   enum dma_slave_buswidth width;
-   unsigned es;
+   struct omap2_mcspi_cs   *cs = spi->controller_state;
 
mcspi = spi_master_get_devdata(spi->master);
mcspi_dma = &mcspi->dma_channels[spi->chip_select];
-   l = mcspi_cached_chconf0(spi);
+   count = xfer->len;
 
+   rx = xfer->rx_buf;
+   tx = xfer->tx_buf;
chstat_reg = cs->base + OMAP2_MCSPI_CHSTAT0;
 
-   if (cs->word_len <= 8) {
-   width = DMA_SLAVE_BUSWIDTH_1_BYTE;
-   es = 1;
-   } else if (cs->word_len <= 16) {
-   width = DMA_SLAVE_BUSWIDTH_2_BYTES;
-   es = 2;
-   } else {
-   width = DMA_SLAVE_BUSWIDTH_4_BYTES;
-   es = 4;
-   }
-
-   memset(&cfg, 0, sizeof(cfg));
-   cfg.src_addr = cs->phys + OMAP2_MCSPI_RX0;
-   cfg.dst_addr = cs->phys + OMAP2_MCSPI_TX0;
-   cfg.src_addr_width = width;
-   cfg.dst_addr_width = width;
-   cfg.src_maxburst = 1;
-   cfg.dst_maxburst = 1;
-
-   if (xfer->tx_buf && mcspi_dma->dma_tx) {
+   if (mcspi_dma->dma_tx) {
struct dma_async_tx_descriptor *tx;
struct scatterlist sg;
 
@@ -368,7 +346,7 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct 
spi_transfer *xfer)
sg_dma_len(&sg) = xfer->len;
 
tx = dmaengine_prep_slave_sg(mcspi_dma->dma_tx, &sg, 1,
-   DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
+   DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
if (tx) {
tx->callback = omap2_mcspi_tx_callback;
tx->callback_param = spi;
@@ -377,8 +355,50 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct 
spi_transfer *xfer)
/* FIXME: fall back to PIO? */
}
}
+   dma_async_issue_pending(mcspi_dma->dma_tx);
+   omap2_mcspi_set_dma_req(spi, 0, 1);
 
-   if (xfer->rx_buf && mcspi_dma->dma_rx) {
+   wait_for_completion(&mcspi_dma->dma_tx_completion);
+   dma_unmap_single(mcspi->dev, xfer->tx_dma, count,
+DMA_TO_DEVICE);
+
+   /* for TX_ONLY mode, be sure all words have shifted out */
+   if (rx == NULL) {
+   if (mcspi_wait_for_reg_bit(chstat_reg,
+   OMAP2_MCSPI_CHSTAT_TXS) < 0)
+   dev_err(&spi->dev, "TXS timed out\n");
+   else if (mcspi_wait_for_reg_bit(chstat_reg,
+   OMAP2_MCSPI_CHSTAT_EOT) < 0)
+   dev_err(&spi->dev, "EOT timed out\n");
+   }
+}
+
+static unsigned
+omap2_mcspi_rx_dma(struct spi_device *spi, struct spi_transfer *xfer,
+   struct dma_slave_config cfg,
+   unsigned es)
+{
+   struct omap2_mcspi  *mcspi;
+   struct omap2_mcspi_dma  *mcspi_dma;
+   unsigned intcount;
+   u32 l;
+   int elements = 0;
+   int word_len, element_count;
+   struct omap2_mcspi_cs   *cs = spi->controller_state;
+   mcspi = spi_master_get_devdata(sp

[PATCH] spi: omap2-mcspi: Cleanup the omap2_mcspi_txrx_dma function

2012-09-03 Thread Shubhrajyoti D
Currently in omap2_mcspi_txrx_dma the tx and the rx support is
interleaved. Make the rx related code in omap2_mcspi_rx_dma
and the tx related code omap2_mcspi_tx_dma and call the functions.

While at it remove the braces in the if statements which has only
one line.
Also fix ["foo * bar" to "foo *bar"] warn for the rx and tx variables.

Only a cleanup no functional change.

Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |  256 +++--
 1 files changed, 144 insertions(+), 112 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 1c1dd34..dd8fc88 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -315,49 +315,27 @@ static void omap2_mcspi_tx_callback(void *data)
omap2_mcspi_set_dma_req(spi, 0, 0);
 }
 
-static unsigned
-omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer)
+static void omap2_mcspi_tx_dma(struct spi_device *spi,
+   struct spi_transfer *xfer,
+   struct dma_slave_config cfg)
 {
struct omap2_mcspi  *mcspi;
-   struct omap2_mcspi_cs   *cs = spi->controller_state;
struct omap2_mcspi_dma  *mcspi_dma;
unsigned intcount;
-   int word_len, element_count;
-   int elements = 0;
-   u32 l;
u8  * rx;
const u8* tx;
void __iomem*chstat_reg;
-   struct dma_slave_config cfg;
-   enum dma_slave_buswidth width;
-   unsigned es;
+   struct omap2_mcspi_cs   *cs = spi->controller_state;
 
mcspi = spi_master_get_devdata(spi->master);
mcspi_dma = &mcspi->dma_channels[spi->chip_select];
-   l = mcspi_cached_chconf0(spi);
+   count = xfer->len;
 
+   rx = xfer->rx_buf;
+   tx = xfer->tx_buf;
chstat_reg = cs->base + OMAP2_MCSPI_CHSTAT0;
 
-   if (cs->word_len <= 8) {
-   width = DMA_SLAVE_BUSWIDTH_1_BYTE;
-   es = 1;
-   } else if (cs->word_len <= 16) {
-   width = DMA_SLAVE_BUSWIDTH_2_BYTES;
-   es = 2;
-   } else {
-   width = DMA_SLAVE_BUSWIDTH_4_BYTES;
-   es = 4;
-   }
-
-   memset(&cfg, 0, sizeof(cfg));
-   cfg.src_addr = cs->phys + OMAP2_MCSPI_RX0;
-   cfg.dst_addr = cs->phys + OMAP2_MCSPI_TX0;
-   cfg.src_addr_width = width;
-   cfg.dst_addr_width = width;
-   cfg.src_maxburst = 1;
-   cfg.dst_maxburst = 1;
-
-   if (xfer->tx_buf && mcspi_dma->dma_tx) {
+   if (mcspi_dma->dma_tx) {
struct dma_async_tx_descriptor *tx;
struct scatterlist sg;
 
@@ -368,7 +346,7 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct 
spi_transfer *xfer)
sg_dma_len(&sg) = xfer->len;
 
tx = dmaengine_prep_slave_sg(mcspi_dma->dma_tx, &sg, 1,
-   DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
+   DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
if (tx) {
tx->callback = omap2_mcspi_tx_callback;
tx->callback_param = spi;
@@ -377,8 +355,50 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct 
spi_transfer *xfer)
/* FIXME: fall back to PIO? */
}
}
+   dma_async_issue_pending(mcspi_dma->dma_tx);
+   omap2_mcspi_set_dma_req(spi, 0, 1);
 
-   if (xfer->rx_buf && mcspi_dma->dma_rx) {
+   wait_for_completion(&mcspi_dma->dma_tx_completion);
+   dma_unmap_single(mcspi->dev, xfer->tx_dma, count,
+DMA_TO_DEVICE);
+
+   /* for TX_ONLY mode, be sure all words have shifted out */
+   if (rx == NULL) {
+   if (mcspi_wait_for_reg_bit(chstat_reg,
+   OMAP2_MCSPI_CHSTAT_TXS) < 0)
+   dev_err(&spi->dev, "TXS timed out\n");
+   else if (mcspi_wait_for_reg_bit(chstat_reg,
+   OMAP2_MCSPI_CHSTAT_EOT) < 0)
+   dev_err(&spi->dev, "EOT timed out\n");
+   }
+}
+
+static unsigned
+omap2_mcspi_rx_dma(struct spi_device *spi, struct spi_transfer *xfer,
+   struct dma_slave_config cfg,
+   unsigned es)
+{
+   struct omap2_mcspi  *mcspi;
+   struct omap2_mcspi_dma  *mcspi_dma;
+   unsigned intcount;
+   u32 l;
+   int elements = 0;
+   int word_len, element_count;
+   struct omap2_mcspi_cs   *cs = spi->controller_state;
+   mcspi = spi_master_get_devdata(sp

[PATCH] spi: omap2-mcspi: Cleanup the omap2_mcspi_txrx_dma function

2012-09-03 Thread Shubhrajyoti D
Currently in omap2_mcspi_txrx_dma has the rx and the rx support
interleaved. Make the rx related code in omap2_mcspi_rx_dma
and the tx related code omap2_mcspi_tx_dma and call functions.

While at it also remove the braces in the if statements which has only
one line.
Also fix ["foo * bar" to "foo *bar"] warn for the rx and tx variables.

Only a cleanup no functional change.

Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |  256 +++--
 1 files changed, 144 insertions(+), 112 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 1c1dd34..dd8fc88 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -315,49 +315,27 @@ static void omap2_mcspi_tx_callback(void *data)
omap2_mcspi_set_dma_req(spi, 0, 0);
 }
 
-static unsigned
-omap2_mcspi_txrx_dma(struct spi_device *spi, struct spi_transfer *xfer)
+static void omap2_mcspi_tx_dma(struct spi_device *spi,
+   struct spi_transfer *xfer,
+   struct dma_slave_config cfg)
 {
struct omap2_mcspi  *mcspi;
-   struct omap2_mcspi_cs   *cs = spi->controller_state;
struct omap2_mcspi_dma  *mcspi_dma;
unsigned intcount;
-   int word_len, element_count;
-   int elements = 0;
-   u32 l;
u8  * rx;
const u8* tx;
void __iomem*chstat_reg;
-   struct dma_slave_config cfg;
-   enum dma_slave_buswidth width;
-   unsigned es;
+   struct omap2_mcspi_cs   *cs = spi->controller_state;
 
mcspi = spi_master_get_devdata(spi->master);
mcspi_dma = &mcspi->dma_channels[spi->chip_select];
-   l = mcspi_cached_chconf0(spi);
+   count = xfer->len;
 
+   rx = xfer->rx_buf;
+   tx = xfer->tx_buf;
chstat_reg = cs->base + OMAP2_MCSPI_CHSTAT0;
 
-   if (cs->word_len <= 8) {
-   width = DMA_SLAVE_BUSWIDTH_1_BYTE;
-   es = 1;
-   } else if (cs->word_len <= 16) {
-   width = DMA_SLAVE_BUSWIDTH_2_BYTES;
-   es = 2;
-   } else {
-   width = DMA_SLAVE_BUSWIDTH_4_BYTES;
-   es = 4;
-   }
-
-   memset(&cfg, 0, sizeof(cfg));
-   cfg.src_addr = cs->phys + OMAP2_MCSPI_RX0;
-   cfg.dst_addr = cs->phys + OMAP2_MCSPI_TX0;
-   cfg.src_addr_width = width;
-   cfg.dst_addr_width = width;
-   cfg.src_maxburst = 1;
-   cfg.dst_maxburst = 1;
-
-   if (xfer->tx_buf && mcspi_dma->dma_tx) {
+   if (mcspi_dma->dma_tx) {
struct dma_async_tx_descriptor *tx;
struct scatterlist sg;
 
@@ -368,7 +346,7 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct 
spi_transfer *xfer)
sg_dma_len(&sg) = xfer->len;
 
tx = dmaengine_prep_slave_sg(mcspi_dma->dma_tx, &sg, 1,
-   DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
+   DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
if (tx) {
tx->callback = omap2_mcspi_tx_callback;
tx->callback_param = spi;
@@ -377,8 +355,50 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct 
spi_transfer *xfer)
/* FIXME: fall back to PIO? */
}
}
+   dma_async_issue_pending(mcspi_dma->dma_tx);
+   omap2_mcspi_set_dma_req(spi, 0, 1);
 
-   if (xfer->rx_buf && mcspi_dma->dma_rx) {
+   wait_for_completion(&mcspi_dma->dma_tx_completion);
+   dma_unmap_single(mcspi->dev, xfer->tx_dma, count,
+DMA_TO_DEVICE);
+
+   /* for TX_ONLY mode, be sure all words have shifted out */
+   if (rx == NULL) {
+   if (mcspi_wait_for_reg_bit(chstat_reg,
+   OMAP2_MCSPI_CHSTAT_TXS) < 0)
+   dev_err(&spi->dev, "TXS timed out\n");
+   else if (mcspi_wait_for_reg_bit(chstat_reg,
+   OMAP2_MCSPI_CHSTAT_EOT) < 0)
+   dev_err(&spi->dev, "EOT timed out\n");
+   }
+}
+
+static unsigned
+omap2_mcspi_rx_dma(struct spi_device *spi, struct spi_transfer *xfer,
+   struct dma_slave_config cfg,
+   unsigned es)
+{
+   struct omap2_mcspi  *mcspi;
+   struct omap2_mcspi_dma  *mcspi_dma;
+   unsigned intcount;
+   u32 l;
+   int elements = 0;
+   int word_len, element_count;
+   struct omap2_mcspi_cs   *cs = spi->controller_state;
+   mcspi = spi_master_get_devdata(sp

[PATCHv2 1/3] spi: omap2-mcspi: Call pm_runtime_* functions directly

2012-08-21 Thread Shubhrajyoti D
Call the pm_runtime functions directly making room for possible
pm optimisations. Also the runtime functions aren't just about
enabling and disabling of clocks though it does enable clocks also.

Acked-by: Felipe Balbi 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   28 +++-
 1 files changed, 11 insertions(+), 17 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index b2fb141..f542f3d 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -260,16 +260,6 @@ static void omap2_mcspi_restore_ctx(struct omap2_mcspi 
*mcspi)
list_for_each_entry(cs, &ctx->cs, node)
__raw_writel(cs->chconf0, cs->base + OMAP2_MCSPI_CHCONF0);
 }
-static void omap2_mcspi_disable_clocks(struct omap2_mcspi *mcspi)
-{
-   pm_runtime_mark_last_busy(mcspi->dev);
-   pm_runtime_put_autosuspend(mcspi->dev);
-}
-
-static int omap2_mcspi_enable_clocks(struct omap2_mcspi *mcspi)
-{
-   return pm_runtime_get_sync(mcspi->dev);
-}
 
 static int omap2_prepare_transfer(struct spi_master *master)
 {
@@ -848,12 +838,13 @@ static int omap2_mcspi_setup(struct spi_device *spi)
return ret;
}
 
-   ret = omap2_mcspi_enable_clocks(mcspi);
+   ret = pm_runtime_get_sync(mcspi->dev);
if (ret < 0)
return ret;
 
ret = omap2_mcspi_setup_transfer(spi, NULL);
-   omap2_mcspi_disable_clocks(mcspi);
+   pm_runtime_mark_last_busy(mcspi->dev);
+   pm_runtime_put_autosuspend(mcspi->dev);
 
return ret;
 }
@@ -1067,7 +1058,7 @@ static int __devinit omap2_mcspi_master_setup(struct 
omap2_mcspi *mcspi)
struct omap2_mcspi_regs *ctx = &mcspi->ctx;
int ret = 0;
 
-   ret = omap2_mcspi_enable_clocks(mcspi);
+   ret = pm_runtime_get_sync(mcspi->dev);
if (ret < 0)
return ret;
 
@@ -1076,7 +1067,8 @@ static int __devinit omap2_mcspi_master_setup(struct 
omap2_mcspi *mcspi)
ctx->wakeupenable = OMAP2_MCSPI_WAKEUPENABLE_WKEN;
 
omap2_mcspi_set_master_mode(master);
-   omap2_mcspi_disable_clocks(mcspi);
+   pm_runtime_mark_last_busy(mcspi->dev);
+   pm_runtime_put_autosuspend(mcspi->dev);
return 0;
 }
 
@@ -1252,7 +1244,8 @@ static int __devexit omap2_mcspi_remove(struct 
platform_device *pdev)
mcspi = spi_master_get_devdata(master);
dma_channels = mcspi->dma_channels;
 
-   omap2_mcspi_disable_clocks(mcspi);
+   pm_runtime_mark_last_busy(mcspi->dev);
+   pm_runtime_put_autosuspend(mcspi->dev);
pm_runtime_disable(&pdev->dev);
 
spi_unregister_master(master);
@@ -1278,7 +1271,7 @@ static int omap2_mcspi_resume(struct device *dev)
struct omap2_mcspi_regs *ctx = &mcspi->ctx;
struct omap2_mcspi_cs   *cs;
 
-   omap2_mcspi_enable_clocks(mcspi);
+   pm_runtime_get_sync(mcspi->dev);
list_for_each_entry(cs, &ctx->cs, node) {
if ((cs->chconf0 & OMAP2_MCSPI_CHCONF_FORCE) == 0) {
/*
@@ -1291,7 +1284,8 @@ static int omap2_mcspi_resume(struct device *dev)
__raw_writel(cs->chconf0, cs->base + 
OMAP2_MCSPI_CHCONF0);
}
}
-   omap2_mcspi_disable_clocks(mcspi);
+   pm_runtime_mark_last_busy(mcspi->dev);
+   pm_runtime_put_autosuspend(mcspi->dev);
return 0;
 }
 #else
-- 
1.7.5.4


--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCHv2 3/3] spi: omap2-mcspi: At remove dont use the runtime_autosuspend calls

2012-08-21 Thread Shubhrajyoti D
At remove we shouldnt be using the autosuspend timeout as we are
calling pm_runtime_disable immediately after.

Acked-by: Felipe Balbi 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 8a5e2c0..1c1dd34 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -1244,8 +1244,7 @@ static int __devexit omap2_mcspi_remove(struct 
platform_device *pdev)
mcspi = spi_master_get_devdata(master);
dma_channels = mcspi->dma_channels;
 
-   pm_runtime_mark_last_busy(mcspi->dev);
-   pm_runtime_put_autosuspend(mcspi->dev);
+   pm_runtime_put_sync(mcspi->dev);
pm_runtime_disable(&pdev->dev);
 
spi_unregister_master(master);
-- 
1.7.5.4


--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCHv2 2/3] spi: omap2-mcspi: Remove the macro MOD_REG_BIT

2012-08-21 Thread Shubhrajyoti D
Remove the macro MOD_REG_BIT instead make the bit field modifications
directly. This deletes a branch operation in cases where the the set
is predecided. While at it optimise two sequential bit clear in one step.

Acked-by: Felipe Balbi 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   28 ++--
 1 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index f542f3d..8a5e2c0 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -140,13 +140,6 @@ struct omap2_mcspi_cs {
u32 chconf0;
 };
 
-#define MOD_REG_BIT(val, mask, set) do { \
-   if (set) \
-   val |= mask; \
-   else \
-   val &= ~mask; \
-} while (0)
-
 static inline void mcspi_write_reg(struct spi_master *master,
int idx, u32 val)
 {
@@ -205,7 +198,11 @@ static void omap2_mcspi_set_dma_req(const struct 
spi_device *spi,
else
rw = OMAP2_MCSPI_CHCONF_DMAW;
 
-   MOD_REG_BIT(l, rw, enable);
+   if (enable)
+   l |= rw;
+   else
+   l &= ~rw;
+
mcspi_write_chconf0(spi, l);
 }
 
@@ -224,7 +221,11 @@ static void omap2_mcspi_force_cs(struct spi_device *spi, 
int cs_active)
u32 l;
 
l = mcspi_cached_chconf0(spi);
-   MOD_REG_BIT(l, OMAP2_MCSPI_CHCONF_FORCE, cs_active);
+   if (cs_active)
+   l |= OMAP2_MCSPI_CHCONF_FORCE;
+   else
+   l &= ~OMAP2_MCSPI_CHCONF_FORCE;
+
mcspi_write_chconf0(spi, l);
 }
 
@@ -239,9 +240,8 @@ static void omap2_mcspi_set_master_mode(struct spi_master 
*master)
 * to single-channel master mode
 */
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, 0);
-   MOD_REG_BIT(l, OMAP2_MCSPI_MODULCTRL_SINGLE, 1);
+   l &= ~(OMAP2_MCSPI_MODULCTRL_STEST | OMAP2_MCSPI_MODULCTRL_MS);
+   l |= OMAP2_MCSPI_MODULCTRL_SINGLE;
mcspi_write_reg(master, OMAP2_MCSPI_MODULCTRL, l);
 
ctx->modulctrl = l;
@@ -1278,9 +1278,9 @@ static int omap2_mcspi_resume(struct device *dev)
 * We need to toggle CS state for OMAP take this
 * change in account.
 */
-   MOD_REG_BIT(cs->chconf0, OMAP2_MCSPI_CHCONF_FORCE, 1);
+   cs->chconf0 |= OMAP2_MCSPI_CHCONF_FORCE;
__raw_writel(cs->chconf0, cs->base + 
OMAP2_MCSPI_CHCONF0);
-   MOD_REG_BIT(cs->chconf0, OMAP2_MCSPI_CHCONF_FORCE, 0);
+   cs->chconf0 &= ~OMAP2_MCSPI_CHCONF_FORCE;
__raw_writel(cs->chconf0, cs->base + 
OMAP2_MCSPI_CHCONF0);
}
}
-- 
1.7.5.4


--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCHv2 0/3] spi: omap2-mcspi: spi cleanups

2012-08-21 Thread Shubhrajyoti D
This patch does the following

Calls the pm_runtime_* functions directly.
Remove the MOD_REG_BIT macro usage thereby removiing un-needed branch.
At remove dont use the autosuspend runtime calls.

Changes from v1:
Fix the comments on changelogs.
Add acks to the patches.

The following changes since commit 23dcfa61bac244e1200ff9ad19c6e9144dcb6bb5:

  Merge branch 'akpm' (Andrew's patch-bomb) (2012-08-21 17:22:22 -0700)

are available in the git repository at:

  git://gitorious.org/linus-tree/linus-tree.git for_3.6/spi




Shubhrajyoti D (3):
  spi: omap2-mcspi: Call pm_runtime_* functions directly
  spi: omap2-mcspi: Remove the macro MOD_REG_BIT
  spi: omap2-mcspi: At remove dont use the runtime_autosuspend calls

 drivers/spi/spi-omap2-mcspi.c |   55 ++---
 1 files changed, 24 insertions(+), 31 deletions(-)

-- 
1.7.5.4


--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH 3/3] spi: omap2-mcspi: At remove dont use the runtime_autosuspend calls

2012-08-20 Thread Shubhrajyoti D
At remove we shouldnt be using the autosuspend timeout as we are
calling pm_runtime_disable immediately after.

Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |3 +--
 1 files changed, 1 insertions(+), 2 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 5642111..f5bf628 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -1243,8 +1243,7 @@ static int __devexit omap2_mcspi_remove(struct 
platform_device *pdev)
mcspi = spi_master_get_devdata(master);
dma_channels = mcspi->dma_channels;
 
-   pm_runtime_mark_last_busy(mcspi->dev);
-   pm_runtime_put_autosuspend(mcspi->dev);
+   pm_runtime_put_sync(mcspi->dev);
pm_runtime_disable(&pdev->dev);
 
spi_unregister_master(master);
-- 
1.7.5.4


--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH 0/3] spi: omap2-mcspi: spi cleanups

2012-08-20 Thread Shubhrajyoti D
This patch does the following

Calls the pm_runtime_* functions directly.
Remove the MOD_REG_BIT macro usage thereby removiing un-needed branch.
At remove dont use the autosuspend runtime calls.

Shubhrajyoti D (3):
  spi: omap2-mcspi: Call pm_runtime_* functions directly
  spi: omap2-mcspi: Remove the macro MOD_REG_BIT
  spi: omap2-mcspi: At remove dont use the runtime_autosuspend calls

 drivers/spi/spi-omap2-mcspi.c |   55 ++---
 1 files changed, 24 insertions(+), 31 deletions(-)

-- 
1.7.5.4


--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH 1/3] spi: omap2-mcspi: Call pm_runtime_* functions directly

2012-08-20 Thread Shubhrajyoti D
Call the pm_runtime functions directly making room for possible
pm optimisations. Also the runtime functions aren't just about
enabling and disabling of clocks though it does enable clocks also.

Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   28 +++-
 1 files changed, 11 insertions(+), 17 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 259f601..dd887eb 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -260,16 +260,6 @@ static void omap2_mcspi_restore_ctx(struct omap2_mcspi 
*mcspi)
list_for_each_entry(cs, &ctx->cs, node)
__raw_writel(cs->chconf0, cs->base + OMAP2_MCSPI_CHCONF0);
 }
-static void omap2_mcspi_disable_clocks(struct omap2_mcspi *mcspi)
-{
-   pm_runtime_mark_last_busy(mcspi->dev);
-   pm_runtime_put_autosuspend(mcspi->dev);
-}
-
-static int omap2_mcspi_enable_clocks(struct omap2_mcspi *mcspi)
-{
-   return pm_runtime_get_sync(mcspi->dev);
-}
 
 static int omap2_prepare_transfer(struct spi_master *master)
 {
@@ -848,12 +838,13 @@ static int omap2_mcspi_setup(struct spi_device *spi)
return ret;
}
 
-   ret = omap2_mcspi_enable_clocks(mcspi);
+   ret = pm_runtime_get_sync(mcspi->dev);
if (ret < 0)
return ret;
 
ret = omap2_mcspi_setup_transfer(spi, NULL);
-   omap2_mcspi_disable_clocks(mcspi);
+   pm_runtime_mark_last_busy(mcspi->dev);
+   pm_runtime_put_autosuspend(mcspi->dev);
 
return ret;
 }
@@ -1067,7 +1058,7 @@ static int __devinit omap2_mcspi_master_setup(struct 
omap2_mcspi *mcspi)
struct omap2_mcspi_regs *ctx = &mcspi->ctx;
int ret = 0;
 
-   ret = omap2_mcspi_enable_clocks(mcspi);
+   ret = pm_runtime_get_sync(mcspi->dev);
if (ret < 0)
return ret;
 
@@ -1076,7 +1067,8 @@ static int __devinit omap2_mcspi_master_setup(struct 
omap2_mcspi *mcspi)
ctx->wakeupenable = OMAP2_MCSPI_WAKEUPENABLE_WKEN;
 
omap2_mcspi_set_master_mode(master);
-   omap2_mcspi_disable_clocks(mcspi);
+   pm_runtime_mark_last_busy(mcspi->dev);
+   pm_runtime_put_autosuspend(mcspi->dev);
return 0;
 }
 
@@ -1251,7 +1243,8 @@ static int __devexit omap2_mcspi_remove(struct 
platform_device *pdev)
mcspi = spi_master_get_devdata(master);
dma_channels = mcspi->dma_channels;
 
-   omap2_mcspi_disable_clocks(mcspi);
+   pm_runtime_mark_last_busy(mcspi->dev);
+   pm_runtime_put_autosuspend(mcspi->dev);
pm_runtime_disable(&pdev->dev);
 
spi_unregister_master(master);
@@ -1276,7 +1269,7 @@ static int omap2_mcspi_resume(struct device *dev)
struct omap2_mcspi_regs *ctx = &mcspi->ctx;
struct omap2_mcspi_cs   *cs;
 
-   omap2_mcspi_enable_clocks(mcspi);
+   pm_runtime_get_sync(mcspi->dev);
list_for_each_entry(cs, &ctx->cs, node) {
if ((cs->chconf0 & OMAP2_MCSPI_CHCONF_FORCE) == 0) {
/*
@@ -1289,7 +1282,8 @@ static int omap2_mcspi_resume(struct device *dev)
__raw_writel(cs->chconf0, cs->base + 
OMAP2_MCSPI_CHCONF0);
}
}
-   omap2_mcspi_disable_clocks(mcspi);
+   pm_runtime_mark_last_busy(mcspi->dev);
+   pm_runtime_put_autosuspend(mcspi->dev);
return 0;
 }
 #else
-- 
1.7.5.4


--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH 2/3] spi: omap2-mcspi: Remove the macro MOD_REG_BIT

2012-08-20 Thread Shubhrajyoti D
Remove the macro MOD_REG_BIT instead make the bit field modifications
directly. This deletes a branch operation in cases where the the set
is predecided.While at it optimise two sequential bit clear in one step.

Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   28 ++--
 1 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index dd887eb..5642111 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -140,13 +140,6 @@ struct omap2_mcspi_cs {
u32 chconf0;
 };
 
-#define MOD_REG_BIT(val, mask, set) do { \
-   if (set) \
-   val |= mask; \
-   else \
-   val &= ~mask; \
-} while (0)
-
 static inline void mcspi_write_reg(struct spi_master *master,
int idx, u32 val)
 {
@@ -205,7 +198,11 @@ static void omap2_mcspi_set_dma_req(const struct 
spi_device *spi,
else
rw = OMAP2_MCSPI_CHCONF_DMAW;
 
-   MOD_REG_BIT(l, rw, enable);
+   if (enable)
+   l |= rw;
+   else
+   l &= ~rw;
+
mcspi_write_chconf0(spi, l);
 }
 
@@ -224,7 +221,11 @@ static void omap2_mcspi_force_cs(struct spi_device *spi, 
int cs_active)
u32 l;
 
l = mcspi_cached_chconf0(spi);
-   MOD_REG_BIT(l, OMAP2_MCSPI_CHCONF_FORCE, cs_active);
+   if (cs_active)
+   l |= OMAP2_MCSPI_CHCONF_FORCE;
+   else
+   l &= ~OMAP2_MCSPI_CHCONF_FORCE;
+
mcspi_write_chconf0(spi, l);
 }
 
@@ -239,9 +240,8 @@ static void omap2_mcspi_set_master_mode(struct spi_master 
*master)
 * to single-channel master mode
 */
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, 0);
-   MOD_REG_BIT(l, OMAP2_MCSPI_MODULCTRL_SINGLE, 1);
+   l &= ~(OMAP2_MCSPI_MODULCTRL_STEST | OMAP2_MCSPI_MODULCTRL_MS);
+   l |= OMAP2_MCSPI_MODULCTRL_SINGLE;
mcspi_write_reg(master, OMAP2_MCSPI_MODULCTRL, l);
 
ctx->modulctrl = l;
@@ -1276,9 +1276,9 @@ static int omap2_mcspi_resume(struct device *dev)
 * We need to toggle CS state for OMAP take this
 * change in account.
 */
-   MOD_REG_BIT(cs->chconf0, OMAP2_MCSPI_CHCONF_FORCE, 1);
+   cs->chconf0 |= OMAP2_MCSPI_CHCONF_FORCE;
__raw_writel(cs->chconf0, cs->base + 
OMAP2_MCSPI_CHCONF0);
-   MOD_REG_BIT(cs->chconf0, OMAP2_MCSPI_CHCONF_FORCE, 0);
+   cs->chconf0 &= ~OMAP2_MCSPI_CHCONF_FORCE;
__raw_writel(cs->chconf0, cs->base + 
OMAP2_MCSPI_CHCONF0);
}
}
-- 
1.7.5.4


--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH] spi: omap2-mcspi: Remove the call to platform_set_drvdata(pdev, NULL)

2012-08-16 Thread Shubhrajyoti D
Remove the call of platform_set_drvdata(pdev, NULL) as they are not
needed anymore.

Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |2 --
 1 files changed, 0 insertions(+), 2 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index bc47781..84aeaf0 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -1240,7 +1240,6 @@ dma_chnl_free:
kfree(mcspi->dma_channels);
 free_master:
kfree(master);
-   platform_set_drvdata(pdev, NULL);
return status;
 }
 
@@ -1259,7 +1258,6 @@ static int __devexit omap2_mcspi_remove(struct 
platform_device *pdev)
 
spi_unregister_master(master);
kfree(dma_channels);
-   platform_set_drvdata(pdev, NULL);
 
return 0;
 }
-- 
1.7.5.4


--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH] spi: omap2-mcspi: Fix the error handling in probe

2012-08-02 Thread Shubhrajyoti D
The kfree() is taken care of by the spi core (spi_master_release() function)
that is called once the last reference to the underlying struct device has
been released. So the driver need not call kfree.

Also the put was missed in some of the error handling fix the same.
There by fixing the missing device_put in some of the error paths.

Acked-by: Guenter Roeck 
Reported-by: Guenter Roeck 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |6 ++
 1 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index bc47781..b2fb141 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -1228,18 +1228,16 @@ static int __devinit omap2_mcspi_probe(struct 
platform_device *pdev)
 
status = spi_register_master(master);
if (status < 0)
-   goto err_spi_register;
+   goto disable_pm;
 
return status;
 
-err_spi_register:
-   spi_master_put(master);
 disable_pm:
pm_runtime_disable(&pdev->dev);
 dma_chnl_free:
kfree(mcspi->dma_channels);
 free_master:
-   kfree(master);
+   spi_master_put(master);
platform_set_drvdata(pdev, NULL);
return status;
 }
-- 
1.7.5.4


--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH] spi: omap2-mcspi: Fix the error handling in probe

2012-08-01 Thread Shubhrajyoti D
The kfree() is taken care of by the spi core (spi_master_release() function)
that is called once the last reference to the underlying struct device has
been released. So the driver need not call kfree.

Also the put was missed in some of the error handling fix the same.
There by fixing the missing device_put in some of the error paths.

Cc: Guenter Roeck 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |6 ++
 1 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 7d46b15..b5035e2 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -1203,18 +1203,16 @@ static int __devinit omap2_mcspi_probe(struct 
platform_device *pdev)
 
status = spi_register_master(master);
if (status < 0)
-   goto err_spi_register;
+   goto disable_pm;
 
return status;
 
-err_spi_register:
-   spi_master_put(master);
 disable_pm:
pm_runtime_disable(&pdev->dev);
 dma_chnl_free:
kfree(mcspi->dma_channels);
 free_master:
-   kfree(master);
+   spi_master_put(master);
platform_set_drvdata(pdev, NULL);
return status;
 }
-- 
1.7.5.4


--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH] spi: omap2-mcspi: In case of dma errors fall back to pio

2012-07-24 Thread Shubhrajyoti D
In case there are dma errors currently the driver exits.
Make the spi driver fall back to pio mode in case of dma errors.

If the DMA engine is not selected the driver
exits.This patch makes the spi fall back to pio in that case.

Also adds a field dma_unusable to struct omap2_mcspi.
 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   21 +
 1 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index bc47781..f243a39 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -129,6 +129,7 @@ struct omap2_mcspi {
struct omap2_mcspi_dma  *dma_channels;
struct device   *dev;
struct omap2_mcspi_regs ctx;
+   int dma_unusable;
 };
 
 struct omap2_mcspi_cs {
@@ -845,7 +846,7 @@ static int omap2_mcspi_setup(struct spi_device *spi)
if (!mcspi_dma->dma_rx || !mcspi_dma->dma_tx) {
ret = omap2_mcspi_request_dma(spi);
if (ret < 0)
-   return ret;
+   mcspi->dma_unusable = 1;
}
 
ret = omap2_mcspi_enable_clocks(mcspi);
@@ -956,7 +957,8 @@ static void omap2_mcspi_work(struct omap2_mcspi *mcspi, 
struct spi_message *m)
__raw_writel(0, cs->base
+ OMAP2_MCSPI_TX0);
 
-   if (m->is_dma_mapped || t->len >= DMA_MIN_BYTES)
+   if (!mcspi->dma_unusable && (m->is_dma_mapped ||
+   t->len >= DMA_MIN_BYTES))
count = omap2_mcspi_txrx_dma(spi, t);
else
count = omap2_mcspi_txrx_pio(spi, t);
@@ -1030,7 +1032,8 @@ static int omap2_mcspi_transfer_one_message(struct 
spi_master *master,
return -EINVAL;
}
 
-   if (m->is_dma_mapped || len < DMA_MIN_BYTES)
+   if (mcspi->dma_unusable || m->is_dma_mapped ||
+   len < DMA_MIN_BYTES)
continue;
 
if (tx_buf != NULL) {
@@ -1054,6 +1057,7 @@ static int omap2_mcspi_transfer_one_message(struct 
spi_master *master,
return -EINVAL;
}
}
+
}
 
omap2_mcspi_work(mcspi, m);
@@ -1216,9 +1220,12 @@ static int __devinit omap2_mcspi_probe(struct 
platform_device *pdev)
mcspi->dma_channels[i].dma_tx_sync_dev = dma_res->start;
}
 
-   if (status < 0)
-   goto dma_chnl_free;
-
+   if (status < 0) {
+   dev_err(&pdev->dev, "cannot get DMA channel switching to 
pio\n");
+   mcspi->dma_unusable = 1;
+   status = 0;
+   kfree(mcspi->dma_channels);
+   }
pm_runtime_use_autosuspend(&pdev->dev);
pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT);
pm_runtime_enable(&pdev->dev);
@@ -1229,14 +1236,12 @@ static int __devinit omap2_mcspi_probe(struct 
platform_device *pdev)
status = spi_register_master(master);
if (status < 0)
goto err_spi_register;
-
return status;
 
 err_spi_register:
spi_master_put(master);
 disable_pm:
pm_runtime_disable(&pdev->dev);
-dma_chnl_free:
kfree(mcspi->dma_channels);
 free_master:
kfree(master);
-- 
1.7.5.4


--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH] spi/omap2: mark omap2_mcspi_master_setup as __devinit

2012-07-20 Thread Shubhrajyoti D
From: Arnd Bergmann 

This warning recently appeared with omap2plus_defconfig:

WARNING: drivers/spi/built-in.o(.devinit.text+0x3c4): Section mismatch in 
reference from the function omap2_mcspi_probe() to the function 
.init.text:omap2_mcspi_master_setup()
The function __devinit omap2_mcspi_probe() references
a function __init omap2_mcspi_master_setup().
If omap2_mcspi_master_setup is only used by omap2_mcspi_probe then
annotate omap2_mcspi_master_setup with a matching annotation.

The fix is obviously to mark the omap2_mcspi_master_setup function as
__devinit, rather than __init.

Signed-off-by: Arnd Bergmann 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 37ccdb7..7d46b15 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -1034,7 +1034,7 @@ static int omap2_mcspi_transfer_one_message(struct 
spi_master *master,
return 0;
 }
 
-static int __init omap2_mcspi_master_setup(struct omap2_mcspi *mcspi)
+static int __devinit omap2_mcspi_master_setup(struct omap2_mcspi *mcspi)
 {
struct spi_master   *master = mcspi->master;
struct omap2_mcspi_regs *ctx = &mcspi->ctx;
-- 
1.7.5.4


--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH] spi: omap2-mcspi: Fix the below warning

2012-07-19 Thread Shubhrajyoti D
The dma_map and dma_unmap should have same parameter
passed otherwise we get the below warn.

ks8851 spi1.0: DMA-API: device driver tries to free DMA memory it has not 
allocated [device address=0x9f22]

[2.066925] Modules linked in:
[2.070312]
[2.071929] [] (unwind_backtrace+0x0/0x130) from [] 
(warn_slowpath_common+0x4c/0x64)
[2.081909] [] (warn_slowpath_common+0x4c/0x64) from [] 
(warn_slowpath_fmt+0x30/0x40)
[2.091949] [] (warn_slowpath_fmt+0x30/0x40) from [] 
(check_unmap+0x6d0/0x7b0)
[2.101348] [] (check_unmap+0x6d0/0x7b0) from [] 
(debug_dma_unmap_page+0x64/0x70)
[2.111053] [] (debug_dma_unmap_page+0x64/0x70) from [] 
(omap2_mcspi_txrx_dma+0x2d8/0x4fc)
[2.121582] [] (omap2_mcspi_txrx_dma+0x2d8/0x4fc) from 
[] (omap2_mcspi_work.clone.4+0xf0/0x290)
[2.132537] [] (omap2_mcspi_work.clone.4+0xf0/0x290) from 
[] (omap2_mcspi_transfer_one_message+0x288/0x438)
[2.144592] [] (omap2_mcspi_transfer_one_message+0x288/0x438) from 
[] (spi_pump_messages+0x100/0x160)
[2.156127] [] (spi_pump_messages+0x100/0x160) from [] 
(kthread_worker_fn+0xac/0x180)
[2.166168] [] (kthread_worker_fn+0xac/0x180) from [] 
(kthread+0x90/0x9c)
[2.175140] [] (kthread+0x90/0x9c) from [] 
(kernel_thread_exit+0x0/0x8)
[2.183898] ---[ end trace d1830ce6e44292f2 ]---

Fix the warn by changing the unmap parameter.

Reported-by: Russell King - ARM Linux 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |6 --
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 0c73dd4..37ccdb7 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -388,7 +388,8 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct 
spi_transfer *xfer)
 
if (tx != NULL) {
wait_for_completion(&mcspi_dma->dma_tx_completion);
-   dma_unmap_single(&spi->dev, xfer->tx_dma, count, DMA_TO_DEVICE);
+   dma_unmap_single(mcspi->dev, xfer->tx_dma, count,
+DMA_TO_DEVICE);
 
/* for TX_ONLY mode, be sure all words have shifted out */
if (rx == NULL) {
@@ -403,7 +404,8 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct 
spi_transfer *xfer)
 
if (rx != NULL) {
wait_for_completion(&mcspi_dma->dma_rx_completion);
-   dma_unmap_single(&spi->dev, xfer->rx_dma, count, 
DMA_FROM_DEVICE);
+   dma_unmap_single(mcspi->dev, xfer->rx_dma, count,
+DMA_FROM_DEVICE);
omap2_mcspi_set_enable(spi, 0);
 
if (l & OMAP2_MCSPI_CHCONF_TURBO) {
-- 
1.7.5.4


--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH RFC] spi: omap2-mcspi: Fix the dma_unmap warning

2012-07-05 Thread Shubhrajyoti D
The dma_map and dma_unmap should have same parameter
passed otherwise we get the below warn.

ks8851 spi1.0: DMA-API: device driver tries to free DMA memory it has not 
allocated [device address=0x9f22]

[2.066925] Modules linked in:
[2.070312]
[2.071929] [] (unwind_backtrace+0x0/0x130) from [] 
(warn_slowpath_common+0x4c/0x64)
[2.081909] [] (warn_slowpath_common+0x4c/0x64) from [] 
(warn_slowpath_fmt+0x30/0x40)
[2.091949] [] (warn_slowpath_fmt+0x30/0x40) from [] 
(check_unmap+0x6d0/0x7b0)
[2.101348] [] (check_unmap+0x6d0/0x7b0) from [] 
(debug_dma_unmap_page+0x64/0x70)
[2.111053] [] (debug_dma_unmap_page+0x64/0x70) from [] 
(omap2_mcspi_txrx_dma+0x2d8/0x4fc)
[2.121582] [] (omap2_mcspi_txrx_dma+0x2d8/0x4fc) from 
[] (omap2_mcspi_work.clone.4+0xf0/0x290)
[2.132537] [] (omap2_mcspi_work.clone.4+0xf0/0x290) from 
[] (omap2_mcspi_transfer_one_message+0x288/0x438)
[2.144592] [] (omap2_mcspi_transfer_one_message+0x288/0x438) from 
[] (spi_pump_messages+0x100/0x160)
[2.156127] [] (spi_pump_messages+0x100/0x160) from [] 
(kthread_worker_fn+0xac/0x180)
[2.166168] [] (kthread_worker_fn+0xac/0x180) from [] 
(kthread+0x90/0x9c)
[2.175140] [] (kthread+0x90/0x9c) from [] 
(kernel_thread_exit+0x0/0x8)
[2.183898] ---[ end trace d1830ce6e44292f2 ]---

Fix the warn by changing the unmap parameter to the one used while doing
dma_map.

Reported-by: Russell King 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |6 --
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 0c73dd4..37ccdb7 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -388,7 +388,8 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct 
spi_transfer *xfer)
 
if (tx != NULL) {
wait_for_completion(&mcspi_dma->dma_tx_completion);
-   dma_unmap_single(&spi->dev, xfer->tx_dma, count, DMA_TO_DEVICE);
+   dma_unmap_single(mcspi->dev, xfer->tx_dma, count,
+DMA_TO_DEVICE);
 
/* for TX_ONLY mode, be sure all words have shifted out */
if (rx == NULL) {
@@ -403,7 +404,8 @@ omap2_mcspi_txrx_dma(struct spi_device *spi, struct 
spi_transfer *xfer)
 
if (rx != NULL) {
wait_for_completion(&mcspi_dma->dma_rx_completion);
-   dma_unmap_single(&spi->dev, xfer->rx_dma, count, 
DMA_FROM_DEVICE);
+   dma_unmap_single(mcspi->dev, xfer->rx_dma, count,
+DMA_FROM_DEVICE);
omap2_mcspi_set_enable(spi, 0);
 
if (l & OMAP2_MCSPI_CHCONF_TURBO) {
-- 
1.7.5.4


--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH RFC] spi: Dont call prepare/unprepare transfer if not populated

2012-05-10 Thread Shubhrajyoti D
Currently the prepare/unprepare transfer are called unconditionally.
The assumption is that every driver using the spi core queue infrastructure
has to populate the prepare and unprepare functions. This encourages
drivers to populate empty functions to prevent crashing.
This patch prevents the call to prepare/unprepare if not populated.

Cc: Linus Walleij 
Signed-off-by: Shubhrajyoti D 
---

 drivers/spi/spi.c |4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
index 37c555e..30e114c 100644
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
@@ -532,7 +532,7 @@ static void spi_pump_messages(struct kthread_work *work)
/* Lock queue and check for queue work */
spin_lock_irqsave(&master->queue_lock, flags);
if (list_empty(&master->queue) || !master->running) {
-   if (master->busy) {
+   if (master->busy &&  master->unprepare_transfer_hardware) {
ret = master->unprepare_transfer_hardware(master);
if (ret) {
spin_unlock_irqrestore(&master->queue_lock, 
flags);
@@ -562,7 +562,7 @@ static void spi_pump_messages(struct kthread_work *work)
master->busy = true;
spin_unlock_irqrestore(&master->queue_lock, flags);
 
-   if (!was_busy) {
+   if (!was_busy && master->prepare_transfer_hardware) {
ret = master->prepare_transfer_hardware(master);
if (ret) {
dev_err(&master->dev,
-- 
1.7.5.4


--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH] spi/omap2-mcspi: convert to the pump message infrastructure

2012-05-10 Thread Shubhrajyoti D
This patch converts the OMAP SPI driver to use the SPI infrastructure
pump message queue.Also fixes the below warning.
master is unqueued, this is deprecated

Signed-off-by: Shubhrajyoti D 
---
Applies on spi/next branch

 drivers/spi/spi-omap2-mcspi.c |  243 +++--
 1 files changed, 110 insertions(+), 133 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index f374eee..46ef5fe 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -120,10 +120,6 @@ struct omap2_mcspi_regs {
 };
 
 struct omap2_mcspi {
-   struct work_struct  work;
-   /* lock protects queue and registers */
-   spinlock_t  lock;
-   struct list_headmsg_queue;
struct spi_master   *master;
/* Virtual base address of the controller */
void __iomem*base;
@@ -131,7 +127,6 @@ struct omap2_mcspi {
/* SPI1 has 4 channels, while SPI2 has 2 */
struct omap2_mcspi_dma  *dma_channels;
struct device   *dev;
-   struct workqueue_struct *wq;
struct omap2_mcspi_regs ctx;
 };
 
@@ -275,6 +270,23 @@ static int omap2_mcspi_enable_clocks(struct omap2_mcspi 
*mcspi)
return pm_runtime_get_sync(mcspi->dev);
 }
 
+static int omap2_prepare_transfer(struct spi_master *master)
+{
+   struct omap2_mcspi *mcspi = spi_master_get_devdata(master);
+
+   pm_runtime_get_sync(mcspi->dev);
+   return 0;
+}
+
+static int omap2_unprepare_transfer(struct spi_master *master)
+{
+   struct omap2_mcspi *mcspi = spi_master_get_devdata(master);
+
+   pm_runtime_mark_last_busy(mcspi->dev);
+   pm_runtime_put_autosuspend(mcspi->dev);
+   return 0;
+}
+
 static int mcspi_wait_for_reg_bit(void __iomem *reg, unsigned long bit)
 {
unsigned long timeout;
@@ -846,144 +858,122 @@ static void omap2_mcspi_cleanup(struct spi_device *spi)
}
 }
 
-static void omap2_mcspi_work(struct work_struct *work)
+static void omap2_mcspi_work(struct omap2_mcspi *mcspi, struct spi_message *m)
 {
-   struct omap2_mcspi  *mcspi;
-
-   mcspi = container_of(work, struct omap2_mcspi, work);
-
-   if (omap2_mcspi_enable_clocks(mcspi) < 0)
-   return;
-
-   spin_lock_irq(&mcspi->lock);
 
/* We only enable one channel at a time -- the one whose message is
-* at the head of the queue -- although this controller would gladly
+* -- although this controller would gladly
 * arbitrate among multiple channels.  This corresponds to "single
 * channel" master mode.  As a side effect, we need to manage the
 * chipselect with the FORCE bit ... CS != channel enable.
 */
-   while (!list_empty(&mcspi->msg_queue)) {
-   struct spi_message  *m;
-   struct spi_device   *spi;
-   struct spi_transfer *t = NULL;
-   int cs_active = 0;
-   struct omap2_mcspi_cs   *cs;
-   struct omap2_mcspi_device_config *cd;
-   int par_override = 0;
-   int status = 0;
-   u32 chconf;
-
-   m = container_of(mcspi->msg_queue.next, struct spi_message,
-queue);
-
-   list_del_init(&m->queue);
-   spin_unlock_irq(&mcspi->lock);
-
-   spi = m->spi;
-   cs = spi->controller_state;
-   cd = spi->controller_data;
 
-   omap2_mcspi_set_enable(spi, 1);
-   list_for_each_entry(t, &m->transfers, transfer_list) {
-   if (t->tx_buf == NULL && t->rx_buf == NULL && t->len) {
-   status = -EINVAL;
-   break;
-   }
-   if (par_override || t->speed_hz || t->bits_per_word) {
-   par_override = 1;
-   status = omap2_mcspi_setup_transfer(spi, t);
-   if (status < 0)
-   break;
-   if (!t->speed_hz && !t->bits_per_word)
-   par_override = 0;
-   }
+   struct spi_device   *spi;
+   struct spi_transfer *t = NULL;
+   int cs_active = 0;
+   struct omap2_mcspi_cs   *cs;
+   struct omap2_mcspi_device_config *cd;
+   int par_override = 0;
+   int status = 0;
+   u32 chconf;
 
-   if (!

[PATCH] spi/omap2-mcspi: convert to the pump message infrastructure

2012-05-09 Thread Shubhrajyoti D
This patch converts the OMAP SPI driver to use the SPI infrastructure
pump message queue.Also fixes the below warning.
master is unqueued, this is deprecated

Signed-off-by: Shubhrajyoti D 
---
Applies on Grants spi next branch.

 drivers/spi/spi-omap2-mcspi.c |  244 +++--
 1 files changed, 114 insertions(+), 130 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index f374eee..44f76df 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -120,10 +120,8 @@ struct omap2_mcspi_regs {
 };
 
 struct omap2_mcspi {
-   struct work_struct  work;
/* lock protects queue and registers */
spinlock_t  lock;
-   struct list_headmsg_queue;
struct spi_master   *master;
/* Virtual base address of the controller */
void __iomem*base;
@@ -131,7 +129,6 @@ struct omap2_mcspi {
/* SPI1 has 4 channels, while SPI2 has 2 */
struct omap2_mcspi_dma  *dma_channels;
struct device   *dev;
-   struct workqueue_struct *wq;
struct omap2_mcspi_regs ctx;
 };
 
@@ -275,6 +272,23 @@ static int omap2_mcspi_enable_clocks(struct omap2_mcspi 
*mcspi)
return pm_runtime_get_sync(mcspi->dev);
 }
 
+static int omap2_prepare_transfer(struct spi_master *master)
+{
+   struct omap2_mcspi *mcspi = spi_master_get_devdata(master);
+
+   pm_runtime_get_sync(mcspi->dev);
+   return 0;
+}
+
+static int omap2_unprepare_transfer(struct spi_master *master)
+{
+   struct omap2_mcspi *mcspi = spi_master_get_devdata(master);
+
+   pm_runtime_mark_last_busy(mcspi->dev);
+   pm_runtime_put_autosuspend(mcspi->dev);
+   return 0;
+}
+
 static int mcspi_wait_for_reg_bit(void __iomem *reg, unsigned long bit)
 {
unsigned long timeout;
@@ -846,144 +860,126 @@ static void omap2_mcspi_cleanup(struct spi_device *spi)
}
 }
 
-static void omap2_mcspi_work(struct work_struct *work)
+static void omap2_mcspi_work(struct omap2_mcspi *mcspi, struct spi_message *m)
 {
-   struct omap2_mcspi  *mcspi;
-
-   mcspi = container_of(work, struct omap2_mcspi, work);
-
-   if (omap2_mcspi_enable_clocks(mcspi) < 0)
-   return;
-
-   spin_lock_irq(&mcspi->lock);
 
/* We only enable one channel at a time -- the one whose message is
-* at the head of the queue -- although this controller would gladly
+* -- although this controller would gladly
 * arbitrate among multiple channels.  This corresponds to "single
 * channel" master mode.  As a side effect, we need to manage the
 * chipselect with the FORCE bit ... CS != channel enable.
 */
-   while (!list_empty(&mcspi->msg_queue)) {
-   struct spi_message  *m;
-   struct spi_device   *spi;
-   struct spi_transfer *t = NULL;
-   int cs_active = 0;
-   struct omap2_mcspi_cs   *cs;
-   struct omap2_mcspi_device_config *cd;
-   int par_override = 0;
-   int status = 0;
-   u32 chconf;
-
-   m = container_of(mcspi->msg_queue.next, struct spi_message,
-queue);
-
-   list_del_init(&m->queue);
-   spin_unlock_irq(&mcspi->lock);
-
-   spi = m->spi;
-   cs = spi->controller_state;
-   cd = spi->controller_data;
 
-   omap2_mcspi_set_enable(spi, 1);
-   list_for_each_entry(t, &m->transfers, transfer_list) {
-   if (t->tx_buf == NULL && t->rx_buf == NULL && t->len) {
-   status = -EINVAL;
-   break;
-   }
-   if (par_override || t->speed_hz || t->bits_per_word) {
-   par_override = 1;
-   status = omap2_mcspi_setup_transfer(spi, t);
-   if (status < 0)
-   break;
-   if (!t->speed_hz && !t->bits_per_word)
-   par_override = 0;
-   }
+   struct spi_device   *spi;
+   struct spi_transfer *t = NULL;
+   int cs_active = 0;
+   struct omap2_mcspi_cs   *cs;
+   struct omap2_mcspi_device_config *cd;
+   int par_override = 0;
+   int status = 0;
+   u32 chconf;
 
-   if (!

[PATCHv3 3/3] spi: omap2-mcspi: Trivial optimisation

2012-03-31 Thread Shubhrajyoti D
Trivial optimisation of tmp variable by directly writing the value
to the register.

Cc :  Tarun Kanti DebBarma 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |7 +++
 1 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 0b0da2f..f374eee 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -1050,16 +1050,15 @@ static int __init omap2_mcspi_master_setup(struct 
omap2_mcspi *mcspi)
 {
struct spi_master   *master = mcspi->master;
struct omap2_mcspi_regs *ctx = &mcspi->ctx;
-   u32 tmp;
int ret = 0;
 
ret = omap2_mcspi_enable_clocks(mcspi);
if (ret < 0)
return ret;
 
-   tmp = OMAP2_MCSPI_WAKEUPENABLE_WKEN;
-   mcspi_write_reg(master, OMAP2_MCSPI_WAKEUPENABLE, tmp);
-   ctx->wakeupenable = tmp;
+   mcspi_write_reg(master, OMAP2_MCSPI_WAKEUPENABLE,
+   OMAP2_MCSPI_WAKEUPENABLE_WKEN);
+   ctx->wakeupenable = OMAP2_MCSPI_WAKEUPENABLE_WKEN;
 
omap2_mcspi_set_master_mode(master);
omap2_mcspi_disable_clocks(mcspi);
-- 
1.7.1


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCHv3 1/3] spi/omap: Remove bus_num usage for instance index

2012-03-31 Thread Shubhrajyoti D
From: Benoit Cousson 

bus_num was used to reference the mcspi controller instance in a fixed array.
Remove this array and store this information directly inside drvdata structure.

bus_num is now just set if the pdev->id is present or with -1 for dynamic
allocation by SPI core, but the driver does not access it anymore.

Clean some bad comments format, and remove un-needed space.

Signed-off-by: Benoit Cousson 
[Cleanup the OMAP2_MCSPI_MAX_CTRL macro as it is not needed anymore]
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   75 ++--
 1 files changed, 34 insertions(+), 41 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 33f54cd..1907ed2 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -45,9 +45,6 @@
 
 #define OMAP2_MCSPI_MAX_FREQ   4800
 
-/* OMAP2 has 3 SPI controllers, while OMAP3 has 4 */
-#define OMAP2_MCSPI_MAX_CTRL   4
-
 #define OMAP2_MCSPI_REVISION   0x00
 #define OMAP2_MCSPI_SYSSTATUS  0x14
 #define OMAP2_MCSPI_IRQSTATUS  0x18
@@ -111,6 +108,16 @@ struct omap2_mcspi_dma {
 #define DMA_MIN_BYTES  160
 
 
+/*
+ * Used for context save and restore, structure members to be updated whenever
+ * corresponding registers are modified.
+ */
+struct omap2_mcspi_regs {
+   u32 modulctrl;
+   u32 wakeupenable;
+   struct list_head cs;
+};
+
 struct omap2_mcspi {
struct work_struct  work;
/* lock protects queue and registers */
@@ -122,8 +129,9 @@ struct omap2_mcspi {
unsigned long   phys;
/* SPI1 has 4 channels, while SPI2 has 2 */
struct omap2_mcspi_dma  *dma_channels;
-   struct  device  *dev;
+   struct device   *dev;
struct workqueue_struct *wq;
+   struct omap2_mcspi_regs ctx;
 };
 
 struct omap2_mcspi_cs {
@@ -135,17 +143,6 @@ struct omap2_mcspi_cs {
u32 chconf0;
 };
 
-/* used for context save and restore, structure members to be updated whenever
- * corresponding registers are modified.
- */
-struct omap2_mcspi_regs {
-   u32 modulctrl;
-   u32 wakeupenable;
-   struct list_head cs;
-};
-
-static struct omap2_mcspi_regs omap2_mcspi_ctx[OMAP2_MCSPI_MAX_CTRL];
-
 #define MOD_REG_BIT(val, mask, set) do { \
if (set) \
val |= mask; \
@@ -236,9 +233,12 @@ static void omap2_mcspi_force_cs(struct spi_device *spi, 
int cs_active)
 
 static void omap2_mcspi_set_master_mode(struct spi_master *master)
 {
+   struct omap2_mcspi  *mcspi = spi_master_get_devdata(master);
+   struct omap2_mcspi_regs *ctx = &mcspi->ctx;
u32 l;
 
-   /* setup when switching from (reset default) slave mode
+   /*
+* Setup when switching from (reset default) slave mode
 * to single-channel master mode
 */
l = mcspi_read_reg(master, OMAP2_MCSPI_MODULCTRL);
@@ -247,24 +247,20 @@ static void omap2_mcspi_set_master_mode(struct spi_master 
*master)
MOD_REG_BIT(l, OMAP2_MCSPI_MODULCTRL_SINGLE, 1);
mcspi_write_reg(master, OMAP2_MCSPI_MODULCTRL, l);
 
-   omap2_mcspi_ctx[master->bus_num - 1].modulctrl = l;
+   ctx->modulctrl = l;
 }
 
 static void omap2_mcspi_restore_ctx(struct omap2_mcspi *mcspi)
 {
-   struct spi_master *spi_cntrl;
-   struct omap2_mcspi_cs *cs;
-   spi_cntrl = mcspi->master;
+   struct spi_master   *spi_cntrl = mcspi->master;
+   struct omap2_mcspi_regs *ctx = &mcspi->ctx;
+   struct omap2_mcspi_cs   *cs;
 
/* McSPI: context restore */
-   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_MODULCTRL,
-   omap2_mcspi_ctx[spi_cntrl->bus_num - 1].modulctrl);
+   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_MODULCTRL, ctx->modulctrl);
+   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_WAKEUPENABLE, ctx->wakeupenable);
 
-   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_WAKEUPENABLE,
-   omap2_mcspi_ctx[spi_cntrl->bus_num - 1].wakeupenable);
-
-   list_for_each_entry(cs, &omap2_mcspi_ctx[spi_cntrl->bus_num - 1].cs,
-   node)
+   list_for_each_entry(cs, &ctx->cs, node)
__raw_writel(cs->chconf0, cs->base + OMAP2_MCSPI_CHCONF0);
 }
 static void omap2_mcspi_disable_clocks(struct omap2_mcspi *mcspi)
@@ -777,7 +773,8 @@ static int omap2_mcspi_request_dma(struct spi_device *spi)
 static int omap2_mcspi_setup(struct spi_device *spi)
 {
int ret;
-   struct omap2_mcspi  *mcspi;
+   struct omap2_mcspi  *mcspi = spi_master_get_devdata(spi->master);
+   struct omap2_mcspi_regs *ctx = &mcspi->ctx;
struct omap2_mcspi_dma  *mcspi_dma;
struct omap2_mcspi_cs   *cs = spi->controller_state;
 
@@ -787,7 +784,6 @@ static int omap2_mcspi_setup(struct spi_device *spi)

[PATCHv3 2/3] spi: omap2-mcspi: add support for pm_runtime autosuspend

2012-03-31 Thread Shubhrajyoti D
Adds support for configuring the omap2-mcspi driver use autosuspend for
runtime power management. This can reduce the latency in starting an
spi transfer by not suspending the device immediately following
completion of a transfer. If another transfer then takes place before
the autosuspend timeout (2 secs), the call to resume the device can
return immediately saving some save/ restore cycles.

Acked-by: Govindraj.R 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |6 +-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 1907ed2..0b0da2f 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -44,6 +44,7 @@
 #include 
 
 #define OMAP2_MCSPI_MAX_FREQ   4800
+#define SPI_AUTOSUSPEND_TIMEOUT2000
 
 #define OMAP2_MCSPI_REVISION   0x00
 #define OMAP2_MCSPI_SYSSTATUS  0x14
@@ -265,7 +266,8 @@ static void omap2_mcspi_restore_ctx(struct omap2_mcspi 
*mcspi)
 }
 static void omap2_mcspi_disable_clocks(struct omap2_mcspi *mcspi)
 {
-   pm_runtime_put_sync(mcspi->dev);
+   pm_runtime_mark_last_busy(mcspi->dev);
+   pm_runtime_put_autosuspend(mcspi->dev);
 }
 
 static int omap2_mcspi_enable_clocks(struct omap2_mcspi *mcspi)
@@ -1212,6 +1214,8 @@ static int __devinit omap2_mcspi_probe(struct 
platform_device *pdev)
if (status < 0)
goto dma_chnl_free;
 
+   pm_runtime_use_autosuspend(&pdev->dev);
+   pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT);
pm_runtime_enable(&pdev->dev);
 
if (status || omap2_mcspi_master_setup(mcspi) < 0)
-- 
1.7.1


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCHv3 0/3] spi: omap2-mcspi: driver updates

2012-03-31 Thread Shubhrajyoti D
The patch series does the following cleanups
- Makes the driver use autosuspend
- Folds Benoit's bus_num removal patch in the series
- The tmp variable is used to write this can be optimised 
 as it is not needed if the value is directly written.
 Acknowledge  Tarun for the suggestion.

This is also available through
git : git://gitorious.org/linus-tree/linus-tree.git
branch  : spi_next

Rebased to Grant's spi/next branch.

 

Benoit Cousson (1):
  spi/omap: Remove bus_num usage for instance index

Shubhrajyoti D (2):
  spi: omap2-mcspi: add support for pm_runtime autosuspend
  spi: omap2-mcspi: Trivial optimisation

 drivers/spi/spi-omap2-mcspi.c |   86 +++-
 1 files changed, 41 insertions(+), 45 deletions(-)


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCHv3 4/6] spi: omap2-mcspi: use devm_* functions

2012-03-30 Thread Shubhrajyoti D
The various devm_* functions allocate memory that is released when a driver
detaches. This patch uses devm_request_and_ioremap
to request memory in probe function. Since the freeing is not
needed the calls are deleted from remove function.Also use
use devm_kzalloc for the cs memory allocation.

Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   24 
 1 files changed, 4 insertions(+), 20 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 66cbf22..1907ed2 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -787,7 +787,7 @@ static int omap2_mcspi_setup(struct spi_device *spi)
mcspi_dma = &mcspi->dma_channels[spi->chip_select];
 
if (!cs) {
-   cs = kzalloc(sizeof *cs, GFP_KERNEL);
+   cs = devm_kzalloc(&spi->dev , sizeof *cs, GFP_KERNEL);
if (!cs)
return -ENOMEM;
cs->base = mcspi->base + spi->chip_select * 0x14;
@@ -828,7 +828,6 @@ static void omap2_mcspi_cleanup(struct spi_device *spi)
cs = spi->controller_state;
list_del(&cs->node);
 
-   kfree(spi->controller_state);
}
 
if (spi->chip_select < spi->master->num_chipselect) {
@@ -1160,17 +1159,12 @@ static int __devinit omap2_mcspi_probe(struct 
platform_device *pdev)
r->start += regs_offset;
r->end += regs_offset;
mcspi->phys = r->start;
-   if (!request_mem_region(r->start, resource_size(r),
-   dev_name(&pdev->dev))) {
-   status = -EBUSY;
-   goto free_master;
-   }
 
-   mcspi->base = ioremap(r->start, resource_size(r));
+   mcspi->base = devm_request_and_ioremap(&pdev->dev, r);
if (!mcspi->base) {
dev_dbg(&pdev->dev, "can't ioremap MCSPI\n");
status = -ENOMEM;
-   goto release_region;
+   goto free_master;
}
 
mcspi->dev = &pdev->dev;
@@ -1185,7 +1179,7 @@ static int __devinit omap2_mcspi_probe(struct 
platform_device *pdev)
GFP_KERNEL);
 
if (mcspi->dma_channels == NULL)
-   goto unmap_io;
+   goto free_master;
 
for (i = 0; i < master->num_chipselect; i++) {
char dma_ch_name[14];
@@ -1235,10 +1229,6 @@ disable_pm:
pm_runtime_disable(&pdev->dev);
 dma_chnl_free:
kfree(mcspi->dma_channels);
-unmap_io:
-   iounmap(mcspi->base);
-release_region:
-   release_mem_region(r->start, resource_size(r));
 free_master:
kfree(master);
platform_set_drvdata(pdev, NULL);
@@ -1250,8 +1240,6 @@ static int __devexit omap2_mcspi_remove(struct 
platform_device *pdev)
struct spi_master   *master;
struct omap2_mcspi  *mcspi;
struct omap2_mcspi_dma  *dma_channels;
-   struct resource *r;
-   void __iomem *base;
 
master = dev_get_drvdata(&pdev->dev);
mcspi = spi_master_get_devdata(master);
@@ -1259,12 +1247,8 @@ static int __devexit omap2_mcspi_remove(struct 
platform_device *pdev)
 
omap2_mcspi_disable_clocks(mcspi);
pm_runtime_disable(&pdev->dev);
-   r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   release_mem_region(r->start, resource_size(r));
 
-   base = mcspi->base;
spi_unregister_master(master);
-   iounmap(base);
kfree(dma_channels);
destroy_workqueue(mcspi->wq);
platform_set_drvdata(pdev, NULL);
-- 
1.7.1


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCHv3 1/6] spi/omap: Remove bus_num usage for instance index

2012-03-30 Thread Shubhrajyoti D
From: Benoit Cousson 

bus_num was used to reference the mcspi controller instance in a fixed array.
Remove this array and store this information directly inside drvdata structure.

bus_num is now just set if the pdev->id is present or with -1 for dynamic
allocation by SPI core, but the driver does not access it anymore.

Clean some bad comments format, and remove un-needed space.

Signed-off-by: Benoit Cousson 
[Cleanup the OMAP2_MCSPI_MAX_CTRL macro as it is not needed anymore]
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   75 ++--
 1 files changed, 34 insertions(+), 41 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index bb9274c..7785091 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -45,9 +45,6 @@
 
 #define OMAP2_MCSPI_MAX_FREQ   4800
 
-/* OMAP2 has 3 SPI controllers, while OMAP3 has 4 */
-#define OMAP2_MCSPI_MAX_CTRL   4
-
 #define OMAP2_MCSPI_REVISION   0x00
 #define OMAP2_MCSPI_SYSSTATUS  0x14
 #define OMAP2_MCSPI_IRQSTATUS  0x18
@@ -111,6 +108,16 @@ struct omap2_mcspi_dma {
 #define DMA_MIN_BYTES  160
 
 
+/*
+ * Used for context save and restore, structure members to be updated whenever
+ * corresponding registers are modified.
+ */
+struct omap2_mcspi_regs {
+   u32 modulctrl;
+   u32 wakeupenable;
+   struct list_head cs;
+};
+
 struct omap2_mcspi {
struct work_struct  work;
/* lock protects queue and registers */
@@ -122,8 +129,9 @@ struct omap2_mcspi {
unsigned long   phys;
/* SPI1 has 4 channels, while SPI2 has 2 */
struct omap2_mcspi_dma  *dma_channels;
-   struct  device  *dev;
+   struct device   *dev;
struct workqueue_struct *wq;
+   struct omap2_mcspi_regs ctx;
 };
 
 struct omap2_mcspi_cs {
@@ -135,17 +143,6 @@ struct omap2_mcspi_cs {
u32 chconf0;
 };
 
-/* used for context save and restore, structure members to be updated whenever
- * corresponding registers are modified.
- */
-struct omap2_mcspi_regs {
-   u32 modulctrl;
-   u32 wakeupenable;
-   struct list_head cs;
-};
-
-static struct omap2_mcspi_regs omap2_mcspi_ctx[OMAP2_MCSPI_MAX_CTRL];
-
 #define MOD_REG_BIT(val, mask, set) do { \
if (set) \
val |= mask; \
@@ -236,9 +233,12 @@ static void omap2_mcspi_force_cs(struct spi_device *spi, 
int cs_active)
 
 static void omap2_mcspi_set_master_mode(struct spi_master *master)
 {
+   struct omap2_mcspi  *mcspi = spi_master_get_devdata(master);
+   struct omap2_mcspi_regs *ctx = &mcspi->ctx;
u32 l;
 
-   /* setup when switching from (reset default) slave mode
+   /*
+* Setup when switching from (reset default) slave mode
 * to single-channel master mode
 */
l = mcspi_read_reg(master, OMAP2_MCSPI_MODULCTRL);
@@ -247,24 +247,20 @@ static void omap2_mcspi_set_master_mode(struct spi_master 
*master)
MOD_REG_BIT(l, OMAP2_MCSPI_MODULCTRL_SINGLE, 1);
mcspi_write_reg(master, OMAP2_MCSPI_MODULCTRL, l);
 
-   omap2_mcspi_ctx[master->bus_num - 1].modulctrl = l;
+   ctx->modulctrl = l;
 }
 
 static void omap2_mcspi_restore_ctx(struct omap2_mcspi *mcspi)
 {
-   struct spi_master *spi_cntrl;
-   struct omap2_mcspi_cs *cs;
-   spi_cntrl = mcspi->master;
+   struct spi_master   *spi_cntrl = mcspi->master;
+   struct omap2_mcspi_regs *ctx = &mcspi->ctx;
+   struct omap2_mcspi_cs   *cs;
 
/* McSPI: context restore */
-   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_MODULCTRL,
-   omap2_mcspi_ctx[spi_cntrl->bus_num - 1].modulctrl);
+   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_MODULCTRL, ctx->modulctrl);
+   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_WAKEUPENABLE, ctx->wakeupenable);
 
-   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_WAKEUPENABLE,
-   omap2_mcspi_ctx[spi_cntrl->bus_num - 1].wakeupenable);
-
-   list_for_each_entry(cs, &omap2_mcspi_ctx[spi_cntrl->bus_num - 1].cs,
-   node)
+   list_for_each_entry(cs, &ctx->cs, node)
__raw_writel(cs->chconf0, cs->base + OMAP2_MCSPI_CHCONF0);
 }
 static void omap2_mcspi_disable_clocks(struct omap2_mcspi *mcspi)
@@ -777,7 +773,8 @@ static int omap2_mcspi_request_dma(struct spi_device *spi)
 static int omap2_mcspi_setup(struct spi_device *spi)
 {
int ret;
-   struct omap2_mcspi  *mcspi;
+   struct omap2_mcspi  *mcspi = spi_master_get_devdata(spi->master);
+   struct omap2_mcspi_regs *ctx = &mcspi->ctx;
struct omap2_mcspi_dma  *mcspi_dma;
struct omap2_mcspi_cs   *cs = spi->controller_state;
 
@@ -787,7 +784,6 @@ static int omap2_mcspi_setup(struct spi_device *spi)

[PATCHv3 2/6] spi: omap2-mcspi: make it behave as a module

2012-03-30 Thread Shubhrajyoti D
From: Felipe Balbi 

move probe away from __init section and use
platform_driver_register() instead of
platform_driver_probe().

Signed-off-by: Felipe Balbi 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |9 +
 1 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 7785091..26dd79f 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -1098,7 +1098,7 @@ static const struct of_device_id omap_mcspi_of_match[] = {
 };
 MODULE_DEVICE_TABLE(of, omap_mcspi_of_match);
 
-static int __init omap2_mcspi_probe(struct platform_device *pdev)
+static int __devinit omap2_mcspi_probe(struct platform_device *pdev)
 {
struct spi_master   *master;
struct omap2_mcspi_platform_config *pdata;
@@ -1245,7 +1245,7 @@ free_master:
return status;
 }
 
-static int __exit omap2_mcspi_remove(struct platform_device *pdev)
+static int __devexit omap2_mcspi_remove(struct platform_device *pdev)
 {
struct spi_master   *master;
struct omap2_mcspi  *mcspi;
@@ -1320,13 +1320,14 @@ static struct platform_driver omap2_mcspi_driver = {
.pm =   &omap2_mcspi_pm_ops,
.of_match_table = omap_mcspi_of_match,
},
-   .remove =   __exit_p(omap2_mcspi_remove),
+   .probe =omap2_mcspi_probe,
+   .remove =   __devexit_p(omap2_mcspi_remove),
 };
 
 
 static int __init omap2_mcspi_init(void)
 {
-   return platform_driver_probe(&omap2_mcspi_driver, omap2_mcspi_probe);
+   return platform_driver_register(&omap2_mcspi_driver);
 }
 subsys_initcall(omap2_mcspi_init);
 
-- 
1.7.1


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCHv3 3/6] spi: omap2-mcspi: convert to module_platform_driver

2012-03-30 Thread Shubhrajyoti D
From: Felipe Balbi 

this will delete a few lines of code, no functional
changes.

Signed-off-by: Felipe Balbi 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   15 +--
 1 files changed, 1 insertions(+), 14 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 26dd79f..66cbf22 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -1324,18 +1324,5 @@ static struct platform_driver omap2_mcspi_driver = {
.remove =   __devexit_p(omap2_mcspi_remove),
 };
 
-
-static int __init omap2_mcspi_init(void)
-{
-   return platform_driver_register(&omap2_mcspi_driver);
-}
-subsys_initcall(omap2_mcspi_init);
-
-static void __exit omap2_mcspi_exit(void)
-{
-   platform_driver_unregister(&omap2_mcspi_driver);
-
-}
-module_exit(omap2_mcspi_exit);
-
+module_platform_driver(omap2_mcspi_driver);
 MODULE_LICENSE("GPL");
-- 
1.7.1


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCHv3 0/6] spi: omap2-mcspi: driver updates

2012-03-30 Thread Shubhrajyoti D
The patch series does the following cleanups
- Converts the spi to module_platform_driver
- Use the devm functions so that the freeing need not 
  be done in the driver.
- Makes the driver use autosuspend
- Folds Benoit's bus_num removal patch in the series

Changes from v1
- Makes the driver use autosuspend
- Folds Benoit's bus_num removal patch in the series

Changes from v2
- The tmp variable is used to write this can be optimised 
 as it is not needed if the value is directly written.
 Acknowledge  Tarun for the suggestion.

This is also available through
git : git://gitorious.org/linus-tree/linus-tree.git
branch  : spi

This is targeted for v3.5. 

Benoit Cousson (1):
  spi/omap: Remove bus_num usage for instance index

Felipe Balbi (2):
  spi: omap2-mcspi: make it behave as a module
  spi: omap2-mcspi: convert to module_platform_driver

Shubhrajyoti D (3):
  spi: omap2-mcspi: use devm_* functions
  spi: omap2-mcspi: add support for pm_runtime autosuspend
  spi: omap2-mcspi: Trivial optimisation

 drivers/spi/spi-omap2-mcspi.c |  132 +++-
 1 files changed, 50 insertions(+), 82 deletions(-)


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCHv3 1/6] spi/omap: Remove bus_num usage for instance index

2012-03-30 Thread Shubhrajyoti D
From: Benoit Cousson 

bus_num was used to reference the mcspi controller instance in a fixed array.
Remove this array and store this information directly inside drvdata structure.

bus_num is now just set if the pdev->id is present or with -1 for dynamic
allocation by SPI core, but the driver does not access it anymore.

Clean some bad comments format, and remove un-needed space.

Signed-off-by: Benoit Cousson 
[Cleanup the OMAP2_MCSPI_MAX_CTRL macro as it is not needed anymore]
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   75 ++--
 1 files changed, 34 insertions(+), 41 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index bb9274c..7785091 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -45,9 +45,6 @@
 
 #define OMAP2_MCSPI_MAX_FREQ   4800
 
-/* OMAP2 has 3 SPI controllers, while OMAP3 has 4 */
-#define OMAP2_MCSPI_MAX_CTRL   4
-
 #define OMAP2_MCSPI_REVISION   0x00
 #define OMAP2_MCSPI_SYSSTATUS  0x14
 #define OMAP2_MCSPI_IRQSTATUS  0x18
@@ -111,6 +108,16 @@ struct omap2_mcspi_dma {
 #define DMA_MIN_BYTES  160
 
 
+/*
+ * Used for context save and restore, structure members to be updated whenever
+ * corresponding registers are modified.
+ */
+struct omap2_mcspi_regs {
+   u32 modulctrl;
+   u32 wakeupenable;
+   struct list_head cs;
+};
+
 struct omap2_mcspi {
struct work_struct  work;
/* lock protects queue and registers */
@@ -122,8 +129,9 @@ struct omap2_mcspi {
unsigned long   phys;
/* SPI1 has 4 channels, while SPI2 has 2 */
struct omap2_mcspi_dma  *dma_channels;
-   struct  device  *dev;
+   struct device   *dev;
struct workqueue_struct *wq;
+   struct omap2_mcspi_regs ctx;
 };
 
 struct omap2_mcspi_cs {
@@ -135,17 +143,6 @@ struct omap2_mcspi_cs {
u32 chconf0;
 };
 
-/* used for context save and restore, structure members to be updated whenever
- * corresponding registers are modified.
- */
-struct omap2_mcspi_regs {
-   u32 modulctrl;
-   u32 wakeupenable;
-   struct list_head cs;
-};
-
-static struct omap2_mcspi_regs omap2_mcspi_ctx[OMAP2_MCSPI_MAX_CTRL];
-
 #define MOD_REG_BIT(val, mask, set) do { \
if (set) \
val |= mask; \
@@ -236,9 +233,12 @@ static void omap2_mcspi_force_cs(struct spi_device *spi, 
int cs_active)
 
 static void omap2_mcspi_set_master_mode(struct spi_master *master)
 {
+   struct omap2_mcspi  *mcspi = spi_master_get_devdata(master);
+   struct omap2_mcspi_regs *ctx = &mcspi->ctx;
u32 l;
 
-   /* setup when switching from (reset default) slave mode
+   /*
+* Setup when switching from (reset default) slave mode
 * to single-channel master mode
 */
l = mcspi_read_reg(master, OMAP2_MCSPI_MODULCTRL);
@@ -247,24 +247,20 @@ static void omap2_mcspi_set_master_mode(struct spi_master 
*master)
MOD_REG_BIT(l, OMAP2_MCSPI_MODULCTRL_SINGLE, 1);
mcspi_write_reg(master, OMAP2_MCSPI_MODULCTRL, l);
 
-   omap2_mcspi_ctx[master->bus_num - 1].modulctrl = l;
+   ctx->modulctrl = l;
 }
 
 static void omap2_mcspi_restore_ctx(struct omap2_mcspi *mcspi)
 {
-   struct spi_master *spi_cntrl;
-   struct omap2_mcspi_cs *cs;
-   spi_cntrl = mcspi->master;
+   struct spi_master   *spi_cntrl = mcspi->master;
+   struct omap2_mcspi_regs *ctx = &mcspi->ctx;
+   struct omap2_mcspi_cs   *cs;
 
/* McSPI: context restore */
-   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_MODULCTRL,
-   omap2_mcspi_ctx[spi_cntrl->bus_num - 1].modulctrl);
+   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_MODULCTRL, ctx->modulctrl);
+   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_WAKEUPENABLE, ctx->wakeupenable);
 
-   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_WAKEUPENABLE,
-   omap2_mcspi_ctx[spi_cntrl->bus_num - 1].wakeupenable);
-
-   list_for_each_entry(cs, &omap2_mcspi_ctx[spi_cntrl->bus_num - 1].cs,
-   node)
+   list_for_each_entry(cs, &ctx->cs, node)
__raw_writel(cs->chconf0, cs->base + OMAP2_MCSPI_CHCONF0);
 }
 static void omap2_mcspi_disable_clocks(struct omap2_mcspi *mcspi)
@@ -777,7 +773,8 @@ static int omap2_mcspi_request_dma(struct spi_device *spi)
 static int omap2_mcspi_setup(struct spi_device *spi)
 {
int ret;
-   struct omap2_mcspi  *mcspi;
+   struct omap2_mcspi  *mcspi = spi_master_get_devdata(spi->master);
+   struct omap2_mcspi_regs *ctx = &mcspi->ctx;
struct omap2_mcspi_dma  *mcspi_dma;
struct omap2_mcspi_cs   *cs = spi->controller_state;
 
@@ -787,7 +784,6 @@ static int omap2_mcspi_setup(struct spi_device *spi)

[PATCHv3 6/6] spi: omap2-mcspi: Trivial optimisation

2012-03-30 Thread Shubhrajyoti D
Trivial optimisation of tmp variable by directly writing the value
to the register.

Cc :  Tarun Kanti DebBarma 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |7 +++
 1 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 0b0da2f..f374eee 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -1050,16 +1050,15 @@ static int __init omap2_mcspi_master_setup(struct 
omap2_mcspi *mcspi)
 {
struct spi_master   *master = mcspi->master;
struct omap2_mcspi_regs *ctx = &mcspi->ctx;
-   u32 tmp;
int ret = 0;
 
ret = omap2_mcspi_enable_clocks(mcspi);
if (ret < 0)
return ret;
 
-   tmp = OMAP2_MCSPI_WAKEUPENABLE_WKEN;
-   mcspi_write_reg(master, OMAP2_MCSPI_WAKEUPENABLE, tmp);
-   ctx->wakeupenable = tmp;
+   mcspi_write_reg(master, OMAP2_MCSPI_WAKEUPENABLE,
+   OMAP2_MCSPI_WAKEUPENABLE_WKEN);
+   ctx->wakeupenable = OMAP2_MCSPI_WAKEUPENABLE_WKEN;
 
omap2_mcspi_set_master_mode(master);
omap2_mcspi_disable_clocks(mcspi);
-- 
1.7.1


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCHv3 5/6] spi: omap2-mcspi: add support for pm_runtime autosuspend

2012-03-30 Thread Shubhrajyoti D
Adds support for configuring the omap2-mcspi driver use autosuspend for
runtime power management. This can reduce the latency in starting an
spi transfer by not suspending the device immediately following
completion of a transfer. If another transfer then takes place before
the autosuspend timeout (2 secs), the call to resume the device can
return immediately saving some save/ restore cycles.

Acked-by: Govindraj.R 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |6 +-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 1907ed2..0b0da2f 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -44,6 +44,7 @@
 #include 
 
 #define OMAP2_MCSPI_MAX_FREQ   4800
+#define SPI_AUTOSUSPEND_TIMEOUT2000
 
 #define OMAP2_MCSPI_REVISION   0x00
 #define OMAP2_MCSPI_SYSSTATUS  0x14
@@ -265,7 +266,8 @@ static void omap2_mcspi_restore_ctx(struct omap2_mcspi 
*mcspi)
 }
 static void omap2_mcspi_disable_clocks(struct omap2_mcspi *mcspi)
 {
-   pm_runtime_put_sync(mcspi->dev);
+   pm_runtime_mark_last_busy(mcspi->dev);
+   pm_runtime_put_autosuspend(mcspi->dev);
 }
 
 static int omap2_mcspi_enable_clocks(struct omap2_mcspi *mcspi)
@@ -1212,6 +1214,8 @@ static int __devinit omap2_mcspi_probe(struct 
platform_device *pdev)
if (status < 0)
goto dma_chnl_free;
 
+   pm_runtime_use_autosuspend(&pdev->dev);
+   pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT);
pm_runtime_enable(&pdev->dev);
 
if (status || omap2_mcspi_master_setup(mcspi) < 0)
-- 
1.7.1


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCHv3 0/6] spi: omap2-mcspi: driver updates

2012-03-30 Thread Shubhrajyoti D
The patch series does the following cleanups
- Converts the spi to module_platform_driver
- Use the devm functions so that the freeing need not 
  be done in the driver.
- Makes the driver use autosuspend
- Folds Benoit's bus_num removal patch in the series

Changes from v1
- Makes the driver use autosuspend
- Folds Benoit's bus_num removal patch in the series

Changes from v2
- The tmp variable is used to write this can be optimised 
 as it is not needed if the value is directly written.
 Acknowledge  Tarun for the suggestion.

This is also available through
git : git://gitorious.org/linus-tree/linus-tree.git
branch  : spi

This is targeted for v3.5. 

Benoit Cousson (1):
  spi/omap: Remove bus_num usage for instance index

Felipe Balbi (2):
  spi: omap2-mcspi: make it behave as a module
  spi: omap2-mcspi: convert to module_platform_driver

Shubhrajyoti D (3):
  spi: omap2-mcspi: use devm_* functions
  spi: omap2-mcspi: add support for pm_runtime autosuspend
  spi: omap2-mcspi: Trivial optimisation

 drivers/spi/spi-omap2-mcspi.c |  132 +++-
 1 files changed, 50 insertions(+), 82 deletions(-)


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH v2 1/5] spi/omap: Remove bus_num usage for instance index

2012-03-26 Thread Shubhrajyoti D
From: Benoit Cousson 

bus_num was used to reference the mcspi controller instance in a fixed array.
Remove this array and store this information directly inside drvdata structure.

bus_num is now just set if the pdev->id is present or with -1 for dynamic
allocation by SPI core, but the driver does not access it anymore.

Clean some bad comments format, and remove un-needed space.

Signed-off-by: Benoit Cousson 
[Cleanup the OMAP2_MCSPI_MAX_CTRL macro as it is not needed anymore]
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   75 ++--
 1 files changed, 34 insertions(+), 41 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index bb9274c..7785091 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -45,9 +45,6 @@
 
 #define OMAP2_MCSPI_MAX_FREQ   4800
 
-/* OMAP2 has 3 SPI controllers, while OMAP3 has 4 */
-#define OMAP2_MCSPI_MAX_CTRL   4
-
 #define OMAP2_MCSPI_REVISION   0x00
 #define OMAP2_MCSPI_SYSSTATUS  0x14
 #define OMAP2_MCSPI_IRQSTATUS  0x18
@@ -111,6 +108,16 @@ struct omap2_mcspi_dma {
 #define DMA_MIN_BYTES  160
 
 
+/*
+ * Used for context save and restore, structure members to be updated whenever
+ * corresponding registers are modified.
+ */
+struct omap2_mcspi_regs {
+   u32 modulctrl;
+   u32 wakeupenable;
+   struct list_head cs;
+};
+
 struct omap2_mcspi {
struct work_struct  work;
/* lock protects queue and registers */
@@ -122,8 +129,9 @@ struct omap2_mcspi {
unsigned long   phys;
/* SPI1 has 4 channels, while SPI2 has 2 */
struct omap2_mcspi_dma  *dma_channels;
-   struct  device  *dev;
+   struct device   *dev;
struct workqueue_struct *wq;
+   struct omap2_mcspi_regs ctx;
 };
 
 struct omap2_mcspi_cs {
@@ -135,17 +143,6 @@ struct omap2_mcspi_cs {
u32 chconf0;
 };
 
-/* used for context save and restore, structure members to be updated whenever
- * corresponding registers are modified.
- */
-struct omap2_mcspi_regs {
-   u32 modulctrl;
-   u32 wakeupenable;
-   struct list_head cs;
-};
-
-static struct omap2_mcspi_regs omap2_mcspi_ctx[OMAP2_MCSPI_MAX_CTRL];
-
 #define MOD_REG_BIT(val, mask, set) do { \
if (set) \
val |= mask; \
@@ -236,9 +233,12 @@ static void omap2_mcspi_force_cs(struct spi_device *spi, 
int cs_active)
 
 static void omap2_mcspi_set_master_mode(struct spi_master *master)
 {
+   struct omap2_mcspi  *mcspi = spi_master_get_devdata(master);
+   struct omap2_mcspi_regs *ctx = &mcspi->ctx;
u32 l;
 
-   /* setup when switching from (reset default) slave mode
+   /*
+* Setup when switching from (reset default) slave mode
 * to single-channel master mode
 */
l = mcspi_read_reg(master, OMAP2_MCSPI_MODULCTRL);
@@ -247,24 +247,20 @@ static void omap2_mcspi_set_master_mode(struct spi_master 
*master)
MOD_REG_BIT(l, OMAP2_MCSPI_MODULCTRL_SINGLE, 1);
mcspi_write_reg(master, OMAP2_MCSPI_MODULCTRL, l);
 
-   omap2_mcspi_ctx[master->bus_num - 1].modulctrl = l;
+   ctx->modulctrl = l;
 }
 
 static void omap2_mcspi_restore_ctx(struct omap2_mcspi *mcspi)
 {
-   struct spi_master *spi_cntrl;
-   struct omap2_mcspi_cs *cs;
-   spi_cntrl = mcspi->master;
+   struct spi_master   *spi_cntrl = mcspi->master;
+   struct omap2_mcspi_regs *ctx = &mcspi->ctx;
+   struct omap2_mcspi_cs   *cs;
 
/* McSPI: context restore */
-   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_MODULCTRL,
-   omap2_mcspi_ctx[spi_cntrl->bus_num - 1].modulctrl);
+   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_MODULCTRL, ctx->modulctrl);
+   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_WAKEUPENABLE, ctx->wakeupenable);
 
-   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_WAKEUPENABLE,
-   omap2_mcspi_ctx[spi_cntrl->bus_num - 1].wakeupenable);
-
-   list_for_each_entry(cs, &omap2_mcspi_ctx[spi_cntrl->bus_num - 1].cs,
-   node)
+   list_for_each_entry(cs, &ctx->cs, node)
__raw_writel(cs->chconf0, cs->base + OMAP2_MCSPI_CHCONF0);
 }
 static void omap2_mcspi_disable_clocks(struct omap2_mcspi *mcspi)
@@ -777,7 +773,8 @@ static int omap2_mcspi_request_dma(struct spi_device *spi)
 static int omap2_mcspi_setup(struct spi_device *spi)
 {
int ret;
-   struct omap2_mcspi  *mcspi;
+   struct omap2_mcspi  *mcspi = spi_master_get_devdata(spi->master);
+   struct omap2_mcspi_regs *ctx = &mcspi->ctx;
struct omap2_mcspi_dma  *mcspi_dma;
struct omap2_mcspi_cs   *cs = spi->controller_state;
 
@@ -787,7 +784,6 @@ static int omap2_mcspi_setup(struct spi_device *spi)

[PATCH v2 5/5] spi: omap2-mcspi: add support for pm_runtime autosuspend

2012-03-26 Thread Shubhrajyoti D
Adds support for configuring the omap2-mcspi driver use autosuspend for
runtime power management. This can reduce the latency in starting an
spi transfer by not suspending the device immediately following
completion of a transfer. If another transfer then takes place before
the autosuspend timeout (2 secs), the call to resume the device can
return immediately saving some save/ restore cycles.

Acked-by: Govindraj.R 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |6 +-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 1907ed2..0b0da2f 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -44,6 +44,7 @@
 #include 
 
 #define OMAP2_MCSPI_MAX_FREQ   4800
+#define SPI_AUTOSUSPEND_TIMEOUT2000
 
 #define OMAP2_MCSPI_REVISION   0x00
 #define OMAP2_MCSPI_SYSSTATUS  0x14
@@ -265,7 +266,8 @@ static void omap2_mcspi_restore_ctx(struct omap2_mcspi 
*mcspi)
 }
 static void omap2_mcspi_disable_clocks(struct omap2_mcspi *mcspi)
 {
-   pm_runtime_put_sync(mcspi->dev);
+   pm_runtime_mark_last_busy(mcspi->dev);
+   pm_runtime_put_autosuspend(mcspi->dev);
 }
 
 static int omap2_mcspi_enable_clocks(struct omap2_mcspi *mcspi)
@@ -1212,6 +1214,8 @@ static int __devinit omap2_mcspi_probe(struct 
platform_device *pdev)
if (status < 0)
goto dma_chnl_free;
 
+   pm_runtime_use_autosuspend(&pdev->dev);
+   pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT);
pm_runtime_enable(&pdev->dev);
 
if (status || omap2_mcspi_master_setup(mcspi) < 0)
-- 
1.7.1


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH v2 4/5] spi: omap2-mcspi: use devm_* functions

2012-03-26 Thread Shubhrajyoti D
The various devm_* functions allocate memory that is released when a driver
detaches. This patch uses devm_request_and_ioremap
to request memory in probe function. Since the freeing is not
needed the calls are deleted from remove function.Also use
use devm_kzalloc for the cs memory allocation.

Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   24 
 1 files changed, 4 insertions(+), 20 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 66cbf22..1907ed2 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -787,7 +787,7 @@ static int omap2_mcspi_setup(struct spi_device *spi)
mcspi_dma = &mcspi->dma_channels[spi->chip_select];
 
if (!cs) {
-   cs = kzalloc(sizeof *cs, GFP_KERNEL);
+   cs = devm_kzalloc(&spi->dev , sizeof *cs, GFP_KERNEL);
if (!cs)
return -ENOMEM;
cs->base = mcspi->base + spi->chip_select * 0x14;
@@ -828,7 +828,6 @@ static void omap2_mcspi_cleanup(struct spi_device *spi)
cs = spi->controller_state;
list_del(&cs->node);
 
-   kfree(spi->controller_state);
}
 
if (spi->chip_select < spi->master->num_chipselect) {
@@ -1160,17 +1159,12 @@ static int __devinit omap2_mcspi_probe(struct 
platform_device *pdev)
r->start += regs_offset;
r->end += regs_offset;
mcspi->phys = r->start;
-   if (!request_mem_region(r->start, resource_size(r),
-   dev_name(&pdev->dev))) {
-   status = -EBUSY;
-   goto free_master;
-   }
 
-   mcspi->base = ioremap(r->start, resource_size(r));
+   mcspi->base = devm_request_and_ioremap(&pdev->dev, r);
if (!mcspi->base) {
dev_dbg(&pdev->dev, "can't ioremap MCSPI\n");
status = -ENOMEM;
-   goto release_region;
+   goto free_master;
}
 
mcspi->dev = &pdev->dev;
@@ -1185,7 +1179,7 @@ static int __devinit omap2_mcspi_probe(struct 
platform_device *pdev)
GFP_KERNEL);
 
if (mcspi->dma_channels == NULL)
-   goto unmap_io;
+   goto free_master;
 
for (i = 0; i < master->num_chipselect; i++) {
char dma_ch_name[14];
@@ -1235,10 +1229,6 @@ disable_pm:
pm_runtime_disable(&pdev->dev);
 dma_chnl_free:
kfree(mcspi->dma_channels);
-unmap_io:
-   iounmap(mcspi->base);
-release_region:
-   release_mem_region(r->start, resource_size(r));
 free_master:
kfree(master);
platform_set_drvdata(pdev, NULL);
@@ -1250,8 +1240,6 @@ static int __devexit omap2_mcspi_remove(struct 
platform_device *pdev)
struct spi_master   *master;
struct omap2_mcspi  *mcspi;
struct omap2_mcspi_dma  *dma_channels;
-   struct resource *r;
-   void __iomem *base;
 
master = dev_get_drvdata(&pdev->dev);
mcspi = spi_master_get_devdata(master);
@@ -1259,12 +1247,8 @@ static int __devexit omap2_mcspi_remove(struct 
platform_device *pdev)
 
omap2_mcspi_disable_clocks(mcspi);
pm_runtime_disable(&pdev->dev);
-   r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   release_mem_region(r->start, resource_size(r));
 
-   base = mcspi->base;
spi_unregister_master(master);
-   iounmap(base);
kfree(dma_channels);
destroy_workqueue(mcspi->wq);
platform_set_drvdata(pdev, NULL);
-- 
1.7.1


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH v2 2/5] spi: omap2-mcspi: make it behave as a module

2012-03-26 Thread Shubhrajyoti D
From: Felipe Balbi 

move probe away from __init section and use
platform_driver_register() instead of
platform_driver_probe().

Signed-off-by: Felipe Balbi 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |9 +
 1 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 7785091..26dd79f 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -1098,7 +1098,7 @@ static const struct of_device_id omap_mcspi_of_match[] = {
 };
 MODULE_DEVICE_TABLE(of, omap_mcspi_of_match);
 
-static int __init omap2_mcspi_probe(struct platform_device *pdev)
+static int __devinit omap2_mcspi_probe(struct platform_device *pdev)
 {
struct spi_master   *master;
struct omap2_mcspi_platform_config *pdata;
@@ -1245,7 +1245,7 @@ free_master:
return status;
 }
 
-static int __exit omap2_mcspi_remove(struct platform_device *pdev)
+static int __devexit omap2_mcspi_remove(struct platform_device *pdev)
 {
struct spi_master   *master;
struct omap2_mcspi  *mcspi;
@@ -1320,13 +1320,14 @@ static struct platform_driver omap2_mcspi_driver = {
.pm =   &omap2_mcspi_pm_ops,
.of_match_table = omap_mcspi_of_match,
},
-   .remove =   __exit_p(omap2_mcspi_remove),
+   .probe =omap2_mcspi_probe,
+   .remove =   __devexit_p(omap2_mcspi_remove),
 };
 
 
 static int __init omap2_mcspi_init(void)
 {
-   return platform_driver_probe(&omap2_mcspi_driver, omap2_mcspi_probe);
+   return platform_driver_register(&omap2_mcspi_driver);
 }
 subsys_initcall(omap2_mcspi_init);
 
-- 
1.7.1


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH 0/5] spi: omap2-mcspi: driver updates

2012-03-26 Thread Shubhrajyoti D
The patch series does the following cleanups
- Converts the spi to module_platform_driver
- Use the devm functions so that the freeing need not 
  be done in the driver.
- Makes the driver use autosuspend
- Folds Benoit's bus_num removal patch in the series

Changes from the previous version
- Makes the driver use autosuspend
- Folds Benoit's bus_num removal patch in the series


This is also available through
git : git://gitorious.org/linus-tree/linus-tree.git
branch  : spi



Benoit Cousson (1):
  spi/omap: Remove bus_num usage for instance index

Felipe Balbi (2):
  spi: omap2-mcspi: make it behave as a module
  spi: omap2-mcspi: convert to module_platform_driver

Shubhrajyoti D (2):
  spi: omap2-mcspi: use devm_* functions
  spi: omap2-mcspi: add support for pm_runtime autosuspend

 drivers/spi/spi-omap2-mcspi.c |  127 +++-
 1 files changed, 48 insertions(+), 79 deletions(-)


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH v2 3/5] spi: omap2-mcspi: convert to module_platform_driver

2012-03-26 Thread Shubhrajyoti D
From: Felipe Balbi 

this will delete a few lines of code, no functional
changes.

Signed-off-by: Felipe Balbi 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   15 +--
 1 files changed, 1 insertions(+), 14 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 26dd79f..66cbf22 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -1324,18 +1324,5 @@ static struct platform_driver omap2_mcspi_driver = {
.remove =   __devexit_p(omap2_mcspi_remove),
 };
 
-
-static int __init omap2_mcspi_init(void)
-{
-   return platform_driver_register(&omap2_mcspi_driver);
-}
-subsys_initcall(omap2_mcspi_init);
-
-static void __exit omap2_mcspi_exit(void)
-{
-   platform_driver_unregister(&omap2_mcspi_driver);
-
-}
-module_exit(omap2_mcspi_exit);
-
+module_platform_driver(omap2_mcspi_driver);
 MODULE_LICENSE("GPL");
-- 
1.7.1


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH] spi: omap2_mcspi: Make the runtime functions depend on CONFIG_PM_RUNTIME

2012-03-20 Thread Shubhrajyoti D
Makes the function omap_mcspi_runtime_resume depend on CONFIG_PM_RUNTIME.

Signed-off-by: Felipe Balbi 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   41 +++--
 1 files changed, 23 insertions(+), 18 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index cb2c0e3..f9d694d 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -248,23 +248,6 @@ static void omap2_mcspi_set_master_mode(struct spi_master 
*master)
omap2_mcspi_ctx[master->bus_num - 1].modulctrl = l;
 }
 
-static void omap2_mcspi_restore_ctx(struct omap2_mcspi *mcspi)
-{
-   struct spi_master *spi_cntrl;
-   struct omap2_mcspi_cs *cs;
-   spi_cntrl = mcspi->master;
-
-   /* McSPI: context restore */
-   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_MODULCTRL,
-   omap2_mcspi_ctx[spi_cntrl->bus_num - 1].modulctrl);
-
-   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_WAKEUPENABLE,
-   omap2_mcspi_ctx[spi_cntrl->bus_num - 1].wakeupenable);
-
-   list_for_each_entry(cs, &omap2_mcspi_ctx[spi_cntrl->bus_num - 1].cs,
-   node)
-   __raw_writel(cs->chconf0, cs->base + OMAP2_MCSPI_CHCONF0);
-}
 static void omap2_mcspi_disable_clocks(struct omap2_mcspi *mcspi)
 {
pm_runtime_put_sync(mcspi->dev);
@@ -1066,6 +1049,26 @@ static int __init omap2_mcspi_master_setup(struct 
omap2_mcspi *mcspi)
return 0;
 }
 
+#ifdef CONFIG_PM_RUNTIME
+static void omap2_mcspi_restore_ctx(struct omap2_mcspi *mcspi)
+{
+   struct spi_master *spi_cntrl;
+   struct omap2_mcspi_cs *cs;
+
+   spi_cntrl = mcspi->master;
+
+   /* McSPI: context restore */
+   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_MODULCTRL,
+   omap2_mcspi_ctx[spi_cntrl->bus_num - 1].modulctrl);
+
+   mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_WAKEUPENABLE,
+   omap2_mcspi_ctx[spi_cntrl->bus_num - 1].wakeupenable);
+
+   list_for_each_entry(cs, &omap2_mcspi_ctx[spi_cntrl->bus_num - 1].cs,
+   node)
+   __raw_writel(cs->chconf0, cs->base + OMAP2_MCSPI_CHCONF0);
+}
+
 static int omap_mcspi_runtime_resume(struct device *dev)
 {
struct omap2_mcspi  *mcspi;
@@ -1077,7 +1080,9 @@ static int omap_mcspi_runtime_resume(struct device *dev)
 
return 0;
 }
-
+#else
+#defineomap_mcspi_runtime_resume   NULL
+#endif
 
 static int __devinit omap2_mcspi_probe(struct platform_device *pdev)
 {
-- 
1.7.1


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH RFC] spi: spi-davinci: Fix DMA API usage in davinci

2012-03-20 Thread Shubhrajyoti D
The driver uses NULL for dma_unmap_single instead of
the struct device that the API expects.

Signed-off-by: Shubhrajyoti D 
---
I do not have the board ,untested.

 drivers/spi/spi-davinci.c |6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/spi/spi-davinci.c b/drivers/spi/spi-davinci.c
index 31bfba8..9b2901f 100644
--- a/drivers/spi/spi-davinci.c
+++ b/drivers/spi/spi-davinci.c
@@ -653,7 +653,7 @@ static int davinci_spi_bufs(struct spi_device *spi, struct 
spi_transfer *t)
dev_dbg(sdev, "Couldn't DMA map a %d bytes RX buffer\n",
rx_buf_count);
if (t->tx_buf)
-   dma_unmap_single(NULL, t->tx_dma, t->len,
+   dma_unmap_single(&spi->dev, t->tx_dma, t->len,
DMA_TO_DEVICE);
return -ENOMEM;
}
@@ -692,10 +692,10 @@ static int davinci_spi_bufs(struct spi_device *spi, 
struct spi_transfer *t)
if (spicfg->io_type == SPI_IO_TYPE_DMA) {
 
if (t->tx_buf)
-   dma_unmap_single(NULL, t->tx_dma, t->len,
+   dma_unmap_single(&spi->dev, t->tx_dma, t->len,
DMA_TO_DEVICE);
 
-   dma_unmap_single(NULL, t->rx_dma, rx_buf_count,
+   dma_unmap_single(&spi->dev, t->rx_dma, rx_buf_count,
DMA_FROM_DEVICE);
 
clear_io_bits(dspi->base + SPIINT, SPIINT_DMA_REQ_EN);
-- 
1.7.1


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH 3/3] spi: omap2-mcspi: use devm_* functions

2012-03-20 Thread Shubhrajyoti D
The various devm_* functions allocate memory that is released when a driver
detaches. This patch uses devm_request_and_ioremap
to request memory in probe function. Since the freeing is not
needed the calls are deleted from remove function.Also use
use devm_kzalloc for the cs memory allocation.

Signed-off-by: Felipe Balbi 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   24 
 1 files changed, 4 insertions(+), 20 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 7745f91..cb2c0e3 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -789,7 +789,7 @@ static int omap2_mcspi_setup(struct spi_device *spi)
mcspi_dma = &mcspi->dma_channels[spi->chip_select];
 
if (!cs) {
-   cs = kzalloc(sizeof *cs, GFP_KERNEL);
+   cs = devm_kzalloc(&spi->dev , sizeof *cs, GFP_KERNEL);
if (!cs)
return -ENOMEM;
cs->base = mcspi->base + spi->chip_select * 0x14;
@@ -831,7 +831,6 @@ static void omap2_mcspi_cleanup(struct spi_device *spi)
cs = spi->controller_state;
list_del(&cs->node);
 
-   kfree(spi->controller_state);
}
 
if (spi->chip_select < spi->master->num_chipselect) {
@@ -1127,17 +1126,12 @@ static int __devinit omap2_mcspi_probe(struct 
platform_device *pdev)
r->start += pdata->regs_offset;
r->end += pdata->regs_offset;
mcspi->phys = r->start;
-   if (!request_mem_region(r->start, resource_size(r),
-   dev_name(&pdev->dev))) {
-   status = -EBUSY;
-   goto free_master;
-   }
 
-   mcspi->base = ioremap(r->start, resource_size(r));
+   mcspi->base = devm_request_and_ioremap(&pdev->dev, r);
if (!mcspi->base) {
dev_dbg(&pdev->dev, "can't ioremap MCSPI\n");
status = -ENOMEM;
-   goto release_region;
+   goto free_master;
}
 
mcspi->dev = &pdev->dev;
@@ -1152,7 +1146,7 @@ static int __devinit omap2_mcspi_probe(struct 
platform_device *pdev)
GFP_KERNEL);
 
if (mcspi->dma_channels == NULL)
-   goto unmap_io;
+   goto free_master;
 
for (i = 0; i < master->num_chipselect; i++) {
char dma_ch_name[14];
@@ -1202,10 +1196,6 @@ disable_pm:
pm_runtime_disable(&pdev->dev);
 dma_chnl_free:
kfree(mcspi->dma_channels);
-unmap_io:
-   iounmap(mcspi->base);
-release_region:
-   release_mem_region(r->start, resource_size(r));
 free_master:
kfree(master);
platform_set_drvdata(pdev, NULL);
@@ -1217,8 +1207,6 @@ static int __devexit omap2_mcspi_remove(struct 
platform_device *pdev)
struct spi_master   *master;
struct omap2_mcspi  *mcspi;
struct omap2_mcspi_dma  *dma_channels;
-   struct resource *r;
-   void __iomem *base;
 
master = dev_get_drvdata(&pdev->dev);
mcspi = spi_master_get_devdata(master);
@@ -1226,12 +1214,8 @@ static int __devexit omap2_mcspi_remove(struct 
platform_device *pdev)
 
omap2_mcspi_disable_clocks(mcspi);
pm_runtime_disable(&pdev->dev);
-   r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-   release_mem_region(r->start, resource_size(r));
 
-   base = mcspi->base;
spi_unregister_master(master);
-   iounmap(base);
kfree(dma_channels);
destroy_workqueue(mcspi->wq);
platform_set_drvdata(pdev, NULL);
-- 
1.7.1


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH 2/3] spi: omap2-mcspi: convert to module_platform_driver

2012-03-20 Thread Shubhrajyoti D
From: Felipe Balbi 

this will delete a few lines of code, no functional
changes.

Signed-off-by: Felipe Balbi 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   15 +--
 1 files changed, 1 insertions(+), 14 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 5f4419e..7745f91 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -1291,18 +1291,5 @@ static struct platform_driver omap2_mcspi_driver = {
.remove =   __devexit_p(omap2_mcspi_remove),
 };
 
-
-static int __init omap2_mcspi_init(void)
-{
-   return platform_driver_register(&omap2_mcspi_driver);
-}
-subsys_initcall(omap2_mcspi_init);
-
-static void __exit omap2_mcspi_exit(void)
-{
-   platform_driver_unregister(&omap2_mcspi_driver);
-
-}
-module_exit(omap2_mcspi_exit);
-
+module_platform_driver(omap2_mcspi_driver);
 MODULE_LICENSE("GPL");
-- 
1.7.1


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH 1/3] spi: omap2-mcspi: make it behave as a module

2012-03-20 Thread Shubhrajyoti D
From: Felipe Balbi 

move probe away from __init section and use
platform_driver_register() instead of
platform_driver_probe().

Signed-off-by: Felipe Balbi 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |9 +
 1 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 0b0dfb7..5f4419e 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -1080,7 +1080,7 @@ static int omap_mcspi_runtime_resume(struct device *dev)
 }
 
 
-static int __init omap2_mcspi_probe(struct platform_device *pdev)
+static int __devinit omap2_mcspi_probe(struct platform_device *pdev)
 {
struct spi_master   *master;
struct omap2_mcspi_platform_config *pdata = pdev->dev.platform_data;
@@ -1212,7 +1212,7 @@ free_master:
return status;
 }
 
-static int __exit omap2_mcspi_remove(struct platform_device *pdev)
+static int __devexit omap2_mcspi_remove(struct platform_device *pdev)
 {
struct spi_master   *master;
struct omap2_mcspi  *mcspi;
@@ -1287,13 +1287,14 @@ static struct platform_driver omap2_mcspi_driver = {
.owner =THIS_MODULE,
.pm =   &omap2_mcspi_pm_ops
},
-   .remove =   __exit_p(omap2_mcspi_remove),
+   .probe =omap2_mcspi_probe,
+   .remove =   __devexit_p(omap2_mcspi_remove),
 };
 
 
 static int __init omap2_mcspi_init(void)
 {
-   return platform_driver_probe(&omap2_mcspi_driver, omap2_mcspi_probe);
+   return platform_driver_register(&omap2_mcspi_driver);
 }
 subsys_initcall(omap2_mcspi_init);
 
-- 
1.7.1


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH 0/3] SPI updates

2012-03-20 Thread Shubhrajyoti D
The patch series does the following cleanups
- Converts the spi to module_platform_driver
- Use the devm functions so that the freeing need not 
  be done in the driver.

This is also available through
git : git://gitorious.org/linus-tree/linus-tree.git
branch  : spi


Felipe Balbi (2):
  spi: omap2-mcspi: make it behave as a module
  spi: omap2-mcspi: convert to module_platform_driver

Shubhrajyoti D (1):
  spi: omap2-mcspi: use devm_* functions

 drivers/spi/spi-omap2-mcspi.c |   46 -
 1 files changed, 9 insertions(+), 37 deletions(-)


--
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH RFC] spi/omap: Trivial cleanup

2012-02-29 Thread Shubhrajyoti D
The context is stored directly inside drvdata structure post 
[f887876 spi/omap: Remove bus_num usage for instance index]. 
Remove the OMAP2_MCSPI_MAX_CTRL macro as it is not needed anymore.

Cc: Benoit Cousson 
Signed-off-by: Shubhrajyoti D 
---
Applies on Benoit's for_3.4/dt_spi_eth

 drivers/spi/spi-omap2-mcspi.c |3 ---
 1 files changed, 0 insertions(+), 3 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index d1eb26c..3526281 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -45,9 +45,6 @@
 
 #define OMAP2_MCSPI_MAX_FREQ   4800
 
-/* OMAP2 has 3 SPI controllers, while OMAP3 has 4 */
-#define OMAP2_MCSPI_MAX_CTRL   4
-
 #define OMAP2_MCSPI_REVISION   0x00
 #define OMAP2_MCSPI_SYSSTATUS  0x14
 #define OMAP2_MCSPI_IRQSTATUS  0x18
-- 
1.7.1


--
Virtualization & Cloud Management Using Capacity Planning
Cloud computing makes use of virtualization - but cloud computing 
also focuses on allowing computing to be delivered as a service.
http://www.accelacomm.com/jaw/sfnl/114/51521223/
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH] spi: Trivial warning fix

2012-02-27 Thread Shubhrajyoti D
The loop count i traverses for ntrans which is unsigned
so make the loop count i also unsigned.

Fix the below warning
In file included from drivers/spi/spi-omap2-mcspi.c:38:
include/linux/spi/spi.h: In function 'spi_message_alloc':
include/linux/spi/spi.h:556: warning: comparison between signed and unsigned 
integer expressions

Cc: Vitaly Wool 
Signed-off-by: Shubhrajyoti D 
---
Untested !

 include/linux/spi/spi.h |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
index 176fce9..6ae4993 100644
--- a/include/linux/spi/spi.h
+++ b/include/linux/spi/spi.h
@@ -549,7 +549,7 @@ static inline struct spi_message 
*spi_message_alloc(unsigned ntrans, gfp_t flags
+ ntrans * sizeof(struct spi_transfer),
flags);
if (m) {
-   int i;
+   unsigned i;
struct spi_transfer *t = (struct spi_transfer *)(m + 1);
 
INIT_LIST_HEAD(&m->transfers);
-- 
1.7.0.4


--
Try before you buy = See our experts in action!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-dev2
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH RFC] spi-pl022.c: Make the suspend functions depend on CONFIG_PM_SLEEP.

2012-01-10 Thread Shubhrajyoti D
The macro SET_SYSTEM_SLEEP_PM_OPS  depends CONFIG_PM_SLEEP. The patch
defines the suspend and resume functions for CONFIG_PM_SLEEP.

Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-pl022.c |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/spi/spi-pl022.c b/drivers/spi/spi-pl022.c
index 5559b22..4709475 100644
--- a/drivers/spi/spi-pl022.c
+++ b/drivers/spi/spi-pl022.c
@@ -2293,7 +2293,7 @@ pl022_remove(struct amba_device *adev)
return 0;
 }
 
-#ifdef CONFIG_SUSPEND
+#ifdef CONFIG_PM_SLEEP
 static int pl022_suspend(struct device *dev)
 {
struct pl022 *pl022 = dev_get_drvdata(dev);
-- 
1.7.1


--
Ridiculously easy VDI. With Citrix VDI-in-a-Box, you don't need a complex
infrastructure or vast IT resources to deliver seamless, secure access to
virtual desktops. With this all-in-one solution, easily deploy virtual 
desktops for less than the cost of PCs and save 60% on VDI infrastructure 
costs. Try it free! http://p.sf.net/sfu/Citrix-VDIinabox
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH 0/3] OMAP: SPI: Driver updates

2011-10-28 Thread Shubhrajyoti D
The patch series does the following
1. Optimises the workqueue to have 1 workqueue per controller so
 that one data of one queue doesnt interfere with other.
 Earlier discussion thread 

http://sourceforge.net/mailarchive/forum.php?thread_name=1319210705-18677-1-git-send-email-shubhrajyoti%40ti.com&forum_name=spi-devel-general

2. Call pm_runtime_disable as it got missed out.
3. Error handling in the spi driver is corrected.


Shubhrajyoti D (3):
  OMAP: SPI: Use a workqueue per omap2_mcspi controller
  OMAP: SPI: call pm_runtime_disable in error path and remove
  OMAP: SPI: Correct the error path

 drivers/spi/spi-omap2-mcspi.c |   51 +---
 1 files changed, 32 insertions(+), 19 deletions(-)


--
The demand for IT networking professionals continues to grow, and the
demand for specialized networking skills is growing even more rapidly.
Take a complimentary Learning@Cisco Self-Assessment and learn 
about Cisco certifications, training, and career opportunities. 
http://p.sf.net/sfu/cisco-dev2dev
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH 2/3] OMAP: SPI: call pm_runtime_disable in error path and remove

2011-10-28 Thread Shubhrajyoti D
omap mcspi probe() doesnt call pm_runtime  disable functions
in case of failure. remove() doesnt call pm_runtime disable. This could
lead to warnings as below on subsequent insmod.

~# insmod spi-omap2-mcspi.ko
[  255.383671] omap2_mcspi omap2_mcspi.1: Unbalanced pm_runtime_enable!
...

This patch adds the pm_runtime disable() at appropriate stages.

Signed-off-by: Hebbar, Gururaja 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 471b0f3..6875a0b 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -1195,6 +1195,7 @@ static int __init omap2_mcspi_probe(struct 
platform_device *pdev)
 err4:
spi_master_put(master);
 err3:
+   pm_runtime_disable(&pdev->dev);
kfree(mcspi->dma_channels);
 err2:
release_mem_region(r->start, resource_size(r));
@@ -1216,6 +1217,7 @@ static int __exit omap2_mcspi_remove(struct 
platform_device *pdev)
dma_channels = mcspi->dma_channels;
 
omap2_mcspi_disable_clocks(mcspi);
+   pm_runtime_disable(&pdev->dev);
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
release_mem_region(r->start, resource_size(r));
 
-- 
1.7.1


--
The demand for IT networking professionals continues to grow, and the
demand for specialized networking skills is growing even more rapidly.
Take a complimentary Learning@Cisco Self-Assessment and learn 
about Cisco certifications, training, and career opportunities. 
http://p.sf.net/sfu/cisco-dev2dev
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH 3/3] OMAP: SPI: Correct the error path

2011-10-28 Thread Shubhrajyoti D
Currently McSPI driver doesnt follow correct failure fallback steps
attempting to correct the same.
Also
-  label names changed  to give meaningful names.
- Setting the driver data to NULL in remove

Signed-off-by: Hebbar, Gururaja 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   32 
 1 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 6875a0b..abe2fee 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -1115,13 +1115,13 @@ static int __init omap2_mcspi_probe(struct 
platform_device *pdev)
mcspi->wq = alloc_workqueue(wq_name, WQ_MEM_RECLAIM, 1);
if (mcspi->wq == NULL) {
status = -ENOMEM;
-   goto err1;
+   goto free_master;
}
 
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (r == NULL) {
status = -ENODEV;
-   goto err1;
+   goto free_master;
}
r->start += pdata->regs_offset;
r->end += pdata->regs_offset;
@@ -1129,14 +1129,14 @@ static int __init omap2_mcspi_probe(struct 
platform_device *pdev)
if (!request_mem_region(r->start, resource_size(r),
dev_name(&pdev->dev))) {
status = -EBUSY;
-   goto err1;
+   goto free_master;
}
 
mcspi->base = ioremap(r->start, resource_size(r));
if (!mcspi->base) {
dev_dbg(&pdev->dev, "can't ioremap MCSPI\n");
status = -ENOMEM;
-   goto err2;
+   goto release_region;
}
 
mcspi->dev = &pdev->dev;
@@ -1151,7 +1151,7 @@ static int __init omap2_mcspi_probe(struct 
platform_device *pdev)
GFP_KERNEL);
 
if (mcspi->dma_channels == NULL)
-   goto err2;
+   goto unmap_io;
 
for (i = 0; i < master->num_chipselect; i++) {
char dma_ch_name[14];
@@ -1181,26 +1181,33 @@ static int __init omap2_mcspi_probe(struct 
platform_device *pdev)
mcspi->dma_channels[i].dma_tx_sync_dev = dma_res->start;
}
 
+   if (status < 0)
+   goto dma_chnl_free;
+
pm_runtime_enable(&pdev->dev);
 
if (status || omap2_mcspi_master_setup(mcspi) < 0)
-   goto err3;
+   goto disable_pm;
 
status = spi_register_master(master);
if (status < 0)
-   goto err4;
+   goto err_spi_register;
 
return status;
 
-err4:
+err_spi_register:
spi_master_put(master);
-err3:
+disable_pm:
pm_runtime_disable(&pdev->dev);
+dma_chnl_free:
kfree(mcspi->dma_channels);
-err2:
-   release_mem_region(r->start, resource_size(r));
+unmap_io:
iounmap(mcspi->base);
-err1:
+release_region:
+   release_mem_region(r->start, resource_size(r));
+free_master:
+   kfree(master);
+   platform_set_drvdata(pdev, NULL);
return status;
 }
 
@@ -1226,6 +1233,7 @@ static int __exit omap2_mcspi_remove(struct 
platform_device *pdev)
iounmap(base);
kfree(dma_channels);
destroy_workqueue(mcspi->wq);
+   platform_set_drvdata(pdev, NULL);
 
return 0;
 }
-- 
1.7.1


--
The demand for IT networking professionals continues to grow, and the
demand for specialized networking skills is growing even more rapidly.
Take a complimentary Learning@Cisco Self-Assessment and learn 
about Cisco certifications, training, and career opportunities. 
http://p.sf.net/sfu/cisco-dev2dev
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH 1/3] OMAP: SPI: Use a workqueue per omap2_mcspi controller

2011-10-28 Thread Shubhrajyoti D
Currently all the spi controllers share the work queue.
This patch allocates a work queue per controller.

Signed-off-by: Steve Wilkins 
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   19 +++
 1 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index a8b614b..471b0f3 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -121,6 +121,7 @@ struct omap2_mcspi {
/* SPI1 has 4 channels, while SPI2 has 2 */
struct omap2_mcspi_dma  *dma_channels;
struct  device  *dev;
+   struct workqueue_struct *wq;
 };
 
 struct omap2_mcspi_cs {
@@ -143,8 +144,6 @@ struct omap2_mcspi_regs {
 
 static struct omap2_mcspi_regs omap2_mcspi_ctx[OMAP2_MCSPI_MAX_CTRL];
 
-static struct workqueue_struct *omap2_mcspi_wq;
-
 #define MOD_REG_BIT(val, mask, set) do { \
if (set) \
val |= mask; \
@@ -1043,7 +1042,7 @@ static int omap2_mcspi_transfer(struct spi_device *spi, 
struct spi_message *m)
 
spin_lock_irqsave(&mcspi->lock, flags);
list_add_tail(&m->queue, &mcspi->msg_queue);
-   queue_work(omap2_mcspi_wq, &mcspi->work);
+   queue_work(mcspi->wq, &mcspi->work);
spin_unlock_irqrestore(&mcspi->lock, flags);
 
return 0;
@@ -1088,6 +1087,7 @@ static int __init omap2_mcspi_probe(struct 
platform_device *pdev)
struct omap2_mcspi  *mcspi;
struct resource *r;
int status = 0, i;
+   charwq_name[20];
 
master = spi_alloc_master(&pdev->dev, sizeof *mcspi);
if (master == NULL) {
@@ -,6 +,13 @@ static int __init omap2_mcspi_probe(struct 
platform_device *pdev)
mcspi = spi_master_get_devdata(master);
mcspi->master = master;
 
+   sprintf(wq_name, "omap2_mcspi/%d", master->bus_num);
+   mcspi->wq = alloc_workqueue(wq_name, WQ_MEM_RECLAIM, 1);
+   if (mcspi->wq == NULL) {
+   status = -ENOMEM;
+   goto err1;
+   }
+
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (r == NULL) {
status = -ENODEV;
@@ -1216,6 +1223,7 @@ static int __exit omap2_mcspi_remove(struct 
platform_device *pdev)
spi_unregister_master(master);
iounmap(base);
kfree(dma_channels);
+   destroy_workqueue(mcspi->wq);
 
return 0;
 }
@@ -1274,10 +1282,6 @@ static struct platform_driver omap2_mcspi_driver = {
 
 static int __init omap2_mcspi_init(void)
 {
-   omap2_mcspi_wq = create_singlethread_workqueue(
-   omap2_mcspi_driver.driver.name);
-   if (omap2_mcspi_wq == NULL)
-   return -1;
return platform_driver_probe(&omap2_mcspi_driver, omap2_mcspi_probe);
 }
 subsys_initcall(omap2_mcspi_init);
@@ -1286,7 +1290,6 @@ static void __exit omap2_mcspi_exit(void)
 {
platform_driver_unregister(&omap2_mcspi_driver);
 
-   destroy_workqueue(omap2_mcspi_wq);
 }
 module_exit(omap2_mcspi_exit);
 
-- 
1.7.1


--
The demand for IT networking professionals continues to grow, and the
demand for specialized networking skills is growing even more rapidly.
Take a complimentary Learning@Cisco Self-Assessment and learn 
about Cisco certifications, training, and career opportunities. 
http://p.sf.net/sfu/cisco-dev2dev
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH 0/3] OMAP: SPI: Driver updates

2011-10-28 Thread Shubhrajyoti D
The patch series does the following
1. Optimises the workqueue to have 1 workqueue per controller so
 that one data of one queue doesnt interfere with other.
 Earlier discussion thread 

http://sourceforge.net/mailarchive/forum.php?thread_name=1319210705-18677-1-git-send-email-shubhrajyoti%40ti.com&forum_name=spi-devel-general

2. Call pm_runtime_disable as it got missed out.
3. Error handling in the spi driver is corrected.


Shubhrajyoti D (3):
  OMAP: SPI: Use a workqueue per omap2_mcspi controller
  OMAP: SPI: call pm_runtime_disable in error path and remove
  OMAP: SPI: Correct the error path

 drivers/spi/spi-omap2-mcspi.c |   51 +---
 1 files changed, 32 insertions(+), 19 deletions(-)


--
The demand for IT networking professionals continues to grow, and the
demand for specialized networking skills is growing even more rapidly.
Take a complimentary Learning@Cisco Self-Assessment and learn 
about Cisco certifications, training, and career opportunities. 
http://p.sf.net/sfu/cisco-dev2dev
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH] OMAP: SPI: Fix the trying to free nonexistent resource error

2011-10-24 Thread Shubhrajyoti D
Currently there is a request_mem_region(r->start, ..
followed by r->start += pdata->regs_offset;

And then in remove

   r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
   release_mem_region(r->start, resource_size(r));

Here the offset addition is not taken care. Fix the code for the
same.

Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index 06dc9a9..471b0f3 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -1123,15 +1123,15 @@ static int __init omap2_mcspi_probe(struct 
platform_device *pdev)
status = -ENODEV;
goto err1;
}
+   r->start += pdata->regs_offset;
+   r->end += pdata->regs_offset;
+   mcspi->phys = r->start;
if (!request_mem_region(r->start, resource_size(r),
dev_name(&pdev->dev))) {
status = -EBUSY;
goto err1;
}
 
-   r->start += pdata->regs_offset;
-   r->end += pdata->regs_offset;
-   mcspi->phys = r->start;
mcspi->base = ioremap(r->start, resource_size(r));
if (!mcspi->base) {
dev_dbg(&pdev->dev, "can't ioremap MCSPI\n");
-- 
1.7.1


--
The demand for IT networking professionals continues to grow, and the
demand for specialized networking skills is growing even more rapidly.
Take a complimentary Learning@Cisco Self-Assessment and learn 
about Cisco certifications, training, and career opportunities. 
http://p.sf.net/sfu/cisco-dev2dev
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general


[PATCH RFC] OMAP: SPI: Use a workqueue per omap2_mcspi controller

2011-10-21 Thread Shubhrajyoti D
Currently all the spi controllers share the work queue.
This patch allocates a work queue per controller.

Signed-off-by: Steve Wilkins  
Signed-off-by: Shubhrajyoti D 
---
 drivers/spi/spi-omap2-mcspi.c |   19 +++
 1 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/drivers/spi/spi-omap2-mcspi.c b/drivers/spi/spi-omap2-mcspi.c
index fde3a2d..62173ec 100644
--- a/drivers/spi/spi-omap2-mcspi.c
+++ b/drivers/spi/spi-omap2-mcspi.c
@@ -121,6 +121,7 @@ struct omap2_mcspi {
/* SPI1 has 4 channels, while SPI2 has 2 */
struct omap2_mcspi_dma  *dma_channels;
struct  device  *dev;
+   struct workqueue_struct *wq;
 };
 
 struct omap2_mcspi_cs {
@@ -143,8 +144,6 @@ struct omap2_mcspi_regs {
 
 static struct omap2_mcspi_regs omap2_mcspi_ctx[OMAP2_MCSPI_MAX_CTRL];
 
-static struct workqueue_struct *omap2_mcspi_wq;
-
 #define MOD_REG_BIT(val, mask, set) do { \
if (set) \
val |= mask; \
@@ -1043,7 +1042,7 @@ static int omap2_mcspi_transfer(struct spi_device *spi, 
struct spi_message *m)
 
spin_lock_irqsave(&mcspi->lock, flags);
list_add_tail(&m->queue, &mcspi->msg_queue);
-   queue_work(omap2_mcspi_wq, &mcspi->work);
+   queue_work(mcspi->wq, &mcspi->work);
spin_unlock_irqrestore(&mcspi->lock, flags);
 
return 0;
@@ -1088,6 +1087,7 @@ static int __init omap2_mcspi_probe(struct 
platform_device *pdev)
struct omap2_mcspi  *mcspi;
struct resource *r;
int status = 0, i;
+   charwq_name[20];
 
master = spi_alloc_master(&pdev->dev, sizeof *mcspi);
if (master == NULL) {
@@ -,6 +,13 @@ static int __init omap2_mcspi_probe(struct 
platform_device *pdev)
mcspi = spi_master_get_devdata(master);
mcspi->master = master;
 
+   sprintf(wq_name, "omap2_mcspi/%d", master->bus_num);
+   mcspi->wq = alloc_workqueue(wq_name, WQ_MEM_RECLAIM, 1);
+   if (mcspi->wq == NULL) {
+   status = -ENOMEM;
+   goto err1;
+   }
+
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (r == NULL) {
status = -ENODEV;
@@ -1216,6 +1223,7 @@ static int __exit omap2_mcspi_remove(struct 
platform_device *pdev)
spi_unregister_master(master);
iounmap(base);
kfree(dma_channels);
+   destroy_workqueue(mcspi->wq);
 
return 0;
 }
@@ -1274,10 +1282,6 @@ static struct platform_driver omap2_mcspi_driver = {
 
 static int __init omap2_mcspi_init(void)
 {
-   omap2_mcspi_wq = create_singlethread_workqueue(
-   omap2_mcspi_driver.driver.name);
-   if (omap2_mcspi_wq == NULL)
-   return -1;
return platform_driver_probe(&omap2_mcspi_driver, omap2_mcspi_probe);
 }
 subsys_initcall(omap2_mcspi_init);
@@ -1286,7 +1290,6 @@ static void __exit omap2_mcspi_exit(void)
 {
platform_driver_unregister(&omap2_mcspi_driver);
 
-   destroy_workqueue(omap2_mcspi_wq);
 }
 module_exit(omap2_mcspi_exit);
 
-- 
1.7.1


--
The demand for IT networking professionals continues to grow, and the
demand for specialized networking skills is growing even more rapidly.
Take a complimentary Learning@Cisco Self-Assessment and learn 
about Cisco certifications, training, and career opportunities. 
http://p.sf.net/sfu/cisco-dev2dev
___
spi-devel-general mailing list
spi-devel-general@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/spi-devel-general