linux-spi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 7/7 v2] OMAP: runtime: McSPI driver runtime conversion
@ 2010-12-01 14:02 Govindraj.R
  2010-12-30 19:29 ` Grant Likely
  0 siblings, 1 reply; 4+ messages in thread
From: Govindraj.R @ 2010-12-01 14:02 UTC (permalink / raw)
  To: linux-omap, spi-devel-general, linux-arm-kernel
  Cc: Charulatha V, khilman, tony, p-basak2, grant.likely

McSPI runtime conversion.
Changes involves:
1) remove clock framework apis to use runtime framework apis.
2) context restore from runtime resume which is a callback for get_sync.
3) Remove SYSCONFIG(sysc) register handling
        (a) Remove context save and restore of sysc reg and remove soft reset
            done from sysc reg as this will be done with hwmod framework.
        (b) Also cleanup sysc reg bit macros.
4) Rename the omap2_mcspi_reset function to omap2_mcspi_master_setup
   function as with hwmod changes soft reset will be done in
   hwmod framework itself and use the return value from clock
   enable function to return for failure scenarios.

Signed-off-by: Charulatha V <charu@ti.com>
Signed-off-by: Govindraj.R <govindraj.raja@ti.com>
Reviewed-by: Partha Basak <p-basak2@ti.com>
---
 drivers/spi/omap2_mcspi.c |  120 +++++++++++++++++---------------------------
 1 files changed, 46 insertions(+), 74 deletions(-)

diff --git a/drivers/spi/omap2_mcspi.c b/drivers/spi/omap2_mcspi.c
index ad3811e..a1b157f 100644
--- a/drivers/spi/omap2_mcspi.c
+++ b/drivers/spi/omap2_mcspi.c
@@ -33,6 +33,7 @@
 #include <linux/clk.h>
 #include <linux/io.h>
 #include <linux/slab.h>
+#include <linux/pm_runtime.h>

 #include <linux/spi/spi.h>

@@ -46,7 +47,6 @@
 #define OMAP2_MCSPI_MAX_CTRL 		4

 #define OMAP2_MCSPI_REVISION		0x00
-#define OMAP2_MCSPI_SYSCONFIG		0x10
 #define OMAP2_MCSPI_SYSSTATUS		0x14
 #define OMAP2_MCSPI_IRQSTATUS		0x18
 #define OMAP2_MCSPI_IRQENABLE		0x1c
@@ -63,13 +63,6 @@

 /* per-register bitmasks: */

-#define OMAP2_MCSPI_SYSCONFIG_SMARTIDLE	BIT(4)
-#define OMAP2_MCSPI_SYSCONFIG_ENAWAKEUP	BIT(2)
-#define OMAP2_MCSPI_SYSCONFIG_AUTOIDLE	BIT(0)
-#define OMAP2_MCSPI_SYSCONFIG_SOFTRESET	BIT(1)
-
-#define OMAP2_MCSPI_SYSSTATUS_RESETDONE	BIT(0)
-
 #define OMAP2_MCSPI_MODULCTRL_SINGLE	BIT(0)
 #define OMAP2_MCSPI_MODULCTRL_MS	BIT(2)
 #define OMAP2_MCSPI_MODULCTRL_STEST	BIT(3)
@@ -122,13 +115,12 @@ struct omap2_mcspi {
 	spinlock_t		lock;
 	struct list_head	msg_queue;
 	struct spi_master	*master;
-	struct clk		*ick;
-	struct clk		*fck;
 	/* Virtual base address of the controller */
 	void __iomem		*base;
 	unsigned long		phys;
 	/* SPI1 has 4 channels, while SPI2 has 2 */
 	struct omap2_mcspi_dma	*dma_channels;
+	struct  device          *dev;
 };

 struct omap2_mcspi_cs {
@@ -144,7 +136,6 @@ struct omap2_mcspi_cs {
  * corresponding registers are modified.
  */
 struct omap2_mcspi_regs {
-	u32 sysconfig;
 	u32 modulctrl;
 	u32 wakeupenable;
 	struct list_head cs;
@@ -268,9 +259,6 @@ static void omap2_mcspi_restore_ctx(struct omap2_mcspi *mcspi)
 	mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_MODULCTRL,
 			omap2_mcspi_ctx[spi_cntrl->bus_num - 1].modulctrl);

-	mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_SYSCONFIG,
-			omap2_mcspi_ctx[spi_cntrl->bus_num - 1].sysconfig);
-
 	mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_WAKEUPENABLE,
 			omap2_mcspi_ctx[spi_cntrl->bus_num - 1].wakeupenable);

@@ -280,20 +268,12 @@ static void omap2_mcspi_restore_ctx(struct omap2_mcspi *mcspi)
 }
 static void omap2_mcspi_disable_clocks(struct omap2_mcspi *mcspi)
 {
-	clk_disable(mcspi->ick);
-	clk_disable(mcspi->fck);
+	pm_runtime_put_sync(mcspi->dev);
 }

 static int omap2_mcspi_enable_clocks(struct omap2_mcspi *mcspi)
 {
-	if (clk_enable(mcspi->ick))
-		return -ENODEV;
-	if (clk_enable(mcspi->fck))
-		return -ENODEV;
-
-	omap2_mcspi_restore_ctx(mcspi);
-
-	return 0;
+	return pm_runtime_get_sync(mcspi->dev);
 }

 static int mcspi_wait_for_reg_bit(void __iomem *reg, unsigned long bit)
@@ -819,8 +799,9 @@ static int omap2_mcspi_setup(struct spi_device *spi)
 			return ret;
 	}

-	if (omap2_mcspi_enable_clocks(mcspi))
-		return -ENODEV;
+	ret = omap2_mcspi_enable_clocks(mcspi);
+	if (ret < 0)
+		return ret;

 	ret = omap2_mcspi_setup_transfer(spi, NULL);
 	omap2_mcspi_disable_clocks(mcspi);
@@ -863,10 +844,11 @@ static void omap2_mcspi_work(struct work_struct *work)
 	struct omap2_mcspi	*mcspi;

 	mcspi = container_of(work, struct omap2_mcspi, work);
-	spin_lock_irq(&mcspi->lock);

-	if (omap2_mcspi_enable_clocks(mcspi))
-		goto out;
+	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
@@ -979,10 +961,9 @@ static void omap2_mcspi_work(struct work_struct *work)
 		spin_lock_irq(&mcspi->lock);
 	}

-	omap2_mcspi_disable_clocks(mcspi);
-
-out:
 	spin_unlock_irq(&mcspi->lock);
+
+	omap2_mcspi_disable_clocks(mcspi);
 }

 static int omap2_mcspi_transfer(struct spi_device *spi, struct spi_message *m)
@@ -1063,25 +1044,15 @@ static int omap2_mcspi_transfer(struct spi_device *spi, struct spi_message
*m)
 	return 0;
 }

-static int __init omap2_mcspi_reset(struct omap2_mcspi *mcspi)
+static int __init omap2_mcspi_master_setup(struct omap2_mcspi *mcspi)
 {
 	struct spi_master	*master = mcspi->master;
 	u32			tmp;
+	int ret = 0;

-	if (omap2_mcspi_enable_clocks(mcspi))
-		return -1;
-
-	mcspi_write_reg(master, OMAP2_MCSPI_SYSCONFIG,
-			OMAP2_MCSPI_SYSCONFIG_SOFTRESET);
-	do {
-		tmp = mcspi_read_reg(master, OMAP2_MCSPI_SYSSTATUS);
-	} while (!(tmp & OMAP2_MCSPI_SYSSTATUS_RESETDONE));
-
-	tmp = OMAP2_MCSPI_SYSCONFIG_AUTOIDLE |
-		OMAP2_MCSPI_SYSCONFIG_ENAWAKEUP |
-		OMAP2_MCSPI_SYSCONFIG_SMARTIDLE;
-	mcspi_write_reg(master, OMAP2_MCSPI_SYSCONFIG, tmp);
-	omap2_mcspi_ctx[master->bus_num - 1].sysconfig = tmp;
+	ret = omap2_mcspi_enable_clocks(mcspi);
+	if (ret < 0)
+		return ret;

 	tmp = OMAP2_MCSPI_WAKEUPENABLE_WKEN;
 	mcspi_write_reg(master, OMAP2_MCSPI_WAKEUPENABLE, tmp);
@@ -1092,6 +1063,18 @@ static int __init omap2_mcspi_reset(struct omap2_mcspi *mcspi)
 	return 0;
 }

+static int omap_mcspi_runtime_resume(struct device *dev)
+{
+	struct omap2_mcspi	*mcspi;
+	struct spi_master	*master;
+
+	master = dev_get_drvdata(dev);
+	mcspi = spi_master_get_devdata(master);
+	omap2_mcspi_restore_ctx(mcspi);
+
+	return 0;
+}
+

 static int __init omap2_mcspi_probe(struct platform_device *pdev)
 {
@@ -1142,34 +1125,22 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)
 	if (!mcspi->base) {
 		dev_dbg(&pdev->dev, "can't ioremap MCSPI\n");
 		status = -ENOMEM;
-		goto err1aa;
+		goto err2;
 	}

+	mcspi->dev = &pdev->dev;
 	INIT_WORK(&mcspi->work, omap2_mcspi_work);

 	spin_lock_init(&mcspi->lock);
 	INIT_LIST_HEAD(&mcspi->msg_queue);
 	INIT_LIST_HEAD(&omap2_mcspi_ctx[master->bus_num - 1].cs);

-	mcspi->ick = clk_get(&pdev->dev, "ick");
-	if (IS_ERR(mcspi->ick)) {
-		dev_dbg(&pdev->dev, "can't get mcspi_ick\n");
-		status = PTR_ERR(mcspi->ick);
-		goto err1a;
-	}
-	mcspi->fck = clk_get(&pdev->dev, "fck");
-	if (IS_ERR(mcspi->fck)) {
-		dev_dbg(&pdev->dev, "can't get mcspi_fck\n");
-		status = PTR_ERR(mcspi->fck);
-		goto err2;
-	}
-
 	mcspi->dma_channels = kcalloc(master->num_chipselect,
 			sizeof(struct omap2_mcspi_dma),
 			GFP_KERNEL);

 	if (mcspi->dma_channels == NULL)
-		goto err3;
+		goto err2;

 	for (i = 0; i < master->num_chipselect; i++) {
 		char dma_ch_name[14];
@@ -1199,8 +1170,10 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)
 		mcspi->dma_channels[i].dma_tx_sync_dev = dma_res->start;
 	}

-	if (omap2_mcspi_reset(mcspi) < 0)
-		goto err4;
+	pm_runtime_enable(&pdev->dev);
+
+	if (status || omap2_mcspi_master_setup(mcspi) < 0)
+		goto err3;

 	status = spi_register_master(master);
 	if (status < 0)
@@ -1209,17 +1182,13 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)
 	return status;

 err4:
-	kfree(mcspi->dma_channels);
+	spi_master_put(master);
 err3:
-	clk_put(mcspi->fck);
+	kfree(mcspi->dma_channels);
 err2:
-	clk_put(mcspi->ick);
-err1a:
-	iounmap(mcspi->base);
-err1aa:
 	release_mem_region(r->start, (r->end - r->start) + 1);
+	iounmap(mcspi->base);
 err1:
-	spi_master_put(master);
 	return status;
 }

@@ -1235,9 +1204,7 @@ static int __exit omap2_mcspi_remove(struct platform_device *pdev)
 	mcspi = spi_master_get_devdata(master);
 	dma_channels = mcspi->dma_channels;

-	clk_put(mcspi->fck);
-	clk_put(mcspi->ick);
-
+	omap2_mcspi_disable_clocks(mcspi);
 	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 	release_mem_region(r->start, (r->end - r->start) + 1);

@@ -1252,10 +1219,15 @@ static int __exit omap2_mcspi_remove(struct platform_device *pdev)
 /* work with hotplug and coldplug */
 MODULE_ALIAS("platform:omap2_mcspi");

+static const struct dev_pm_ops omap_mcspi_dev_pm_ops = {
+	.runtime_resume	= omap_mcspi_runtime_resume,
+};
+
 static struct platform_driver omap2_mcspi_driver = {
 	.driver = {
 		.name =		"omap2_mcspi",
 		.owner =	THIS_MODULE,
+		.pm = &omap_mcspi_dev_pm_ops,
 	},
 	.remove =	__exit_p(omap2_mcspi_remove),
 };
-- 
1.7.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 7/7 v2] OMAP: runtime: McSPI driver runtime conversion
  2010-12-01 14:02 [PATCH 7/7 v2] OMAP: runtime: McSPI driver runtime conversion Govindraj.R
@ 2010-12-30 19:29 ` Grant Likely
  2011-01-07 22:49   ` Kevin Hilman
  0 siblings, 1 reply; 4+ messages in thread
From: Grant Likely @ 2010-12-30 19:29 UTC (permalink / raw)
  To: Govindraj.R
  Cc: linux-omap, spi-devel-general, linux-arm-kernel, Charulatha V,
	khilman, tony, p-basak2

On Wed, Dec 01, 2010 at 07:32:11PM +0530, Govindraj.R wrote:
> McSPI runtime conversion.
> Changes involves:
> 1) remove clock framework apis to use runtime framework apis.
> 2) context restore from runtime resume which is a callback for get_sync.
> 3) Remove SYSCONFIG(sysc) register handling
>         (a) Remove context save and restore of sysc reg and remove soft reset
>             done from sysc reg as this will be done with hwmod framework.
>         (b) Also cleanup sysc reg bit macros.
> 4) Rename the omap2_mcspi_reset function to omap2_mcspi_master_setup
>    function as with hwmod changes soft reset will be done in
>    hwmod framework itself and use the return value from clock
>    enable function to return for failure scenarios.
> 
> Signed-off-by: Charulatha V <charu@ti.com>
> Signed-off-by: Govindraj.R <govindraj.raja@ti.com>
> Reviewed-by: Partha Basak <p-basak2@ti.com>

One comment below, but otherwise looks good to me.  Since the majority
of the changes are in arch/arm, feel free to add my Acked-by for the
whole series and merge via the omap tree.  None of my comments are
showstoppers, so I'm even fine with merging them as-is as long as
followup patches are posted to address the comments.

In particular, I'd really like to see the data duplication issue from
the first 4 patches addressed.

Acked-by: Grant Likely <grant.likely@secretlab.ca>


> ---
>  drivers/spi/omap2_mcspi.c |  120 +++++++++++++++++---------------------------
>  1 files changed, 46 insertions(+), 74 deletions(-)
> 
> diff --git a/drivers/spi/omap2_mcspi.c b/drivers/spi/omap2_mcspi.c
> index ad3811e..a1b157f 100644
> --- a/drivers/spi/omap2_mcspi.c
> +++ b/drivers/spi/omap2_mcspi.c
> @@ -33,6 +33,7 @@
>  #include <linux/clk.h>
>  #include <linux/io.h>
>  #include <linux/slab.h>
> +#include <linux/pm_runtime.h>
> 
>  #include <linux/spi/spi.h>
> 
> @@ -46,7 +47,6 @@
>  #define OMAP2_MCSPI_MAX_CTRL 		4
> 
>  #define OMAP2_MCSPI_REVISION		0x00
> -#define OMAP2_MCSPI_SYSCONFIG		0x10
>  #define OMAP2_MCSPI_SYSSTATUS		0x14
>  #define OMAP2_MCSPI_IRQSTATUS		0x18
>  #define OMAP2_MCSPI_IRQENABLE		0x1c
> @@ -63,13 +63,6 @@
> 
>  /* per-register bitmasks: */
> 
> -#define OMAP2_MCSPI_SYSCONFIG_SMARTIDLE	BIT(4)
> -#define OMAP2_MCSPI_SYSCONFIG_ENAWAKEUP	BIT(2)
> -#define OMAP2_MCSPI_SYSCONFIG_AUTOIDLE	BIT(0)
> -#define OMAP2_MCSPI_SYSCONFIG_SOFTRESET	BIT(1)
> -
> -#define OMAP2_MCSPI_SYSSTATUS_RESETDONE	BIT(0)
> -
>  #define OMAP2_MCSPI_MODULCTRL_SINGLE	BIT(0)
>  #define OMAP2_MCSPI_MODULCTRL_MS	BIT(2)
>  #define OMAP2_MCSPI_MODULCTRL_STEST	BIT(3)
> @@ -122,13 +115,12 @@ struct omap2_mcspi {
>  	spinlock_t		lock;
>  	struct list_head	msg_queue;
>  	struct spi_master	*master;
> -	struct clk		*ick;
> -	struct clk		*fck;
>  	/* Virtual base address of the controller */
>  	void __iomem		*base;
>  	unsigned long		phys;
>  	/* SPI1 has 4 channels, while SPI2 has 2 */
>  	struct omap2_mcspi_dma	*dma_channels;
> +	struct  device          *dev;

Inconsistent indentation with the rest of the structure (tabs vs. spaces).

>  };
> 
>  struct omap2_mcspi_cs {
> @@ -144,7 +136,6 @@ struct omap2_mcspi_cs {
>   * corresponding registers are modified.
>   */
>  struct omap2_mcspi_regs {
> -	u32 sysconfig;
>  	u32 modulctrl;
>  	u32 wakeupenable;
>  	struct list_head cs;
> @@ -268,9 +259,6 @@ static void omap2_mcspi_restore_ctx(struct omap2_mcspi *mcspi)
>  	mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_MODULCTRL,
>  			omap2_mcspi_ctx[spi_cntrl->bus_num - 1].modulctrl);
> 
> -	mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_SYSCONFIG,
> -			omap2_mcspi_ctx[spi_cntrl->bus_num - 1].sysconfig);
> -
>  	mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_WAKEUPENABLE,
>  			omap2_mcspi_ctx[spi_cntrl->bus_num - 1].wakeupenable);
> 
> @@ -280,20 +268,12 @@ static void omap2_mcspi_restore_ctx(struct omap2_mcspi *mcspi)
>  }
>  static void omap2_mcspi_disable_clocks(struct omap2_mcspi *mcspi)
>  {
> -	clk_disable(mcspi->ick);
> -	clk_disable(mcspi->fck);
> +	pm_runtime_put_sync(mcspi->dev);
>  }
> 
>  static int omap2_mcspi_enable_clocks(struct omap2_mcspi *mcspi)
>  {
> -	if (clk_enable(mcspi->ick))
> -		return -ENODEV;
> -	if (clk_enable(mcspi->fck))
> -		return -ENODEV;
> -
> -	omap2_mcspi_restore_ctx(mcspi);
> -
> -	return 0;
> +	return pm_runtime_get_sync(mcspi->dev);
>  }
> 
>  static int mcspi_wait_for_reg_bit(void __iomem *reg, unsigned long bit)
> @@ -819,8 +799,9 @@ static int omap2_mcspi_setup(struct spi_device *spi)
>  			return ret;
>  	}
> 
> -	if (omap2_mcspi_enable_clocks(mcspi))
> -		return -ENODEV;
> +	ret = omap2_mcspi_enable_clocks(mcspi);
> +	if (ret < 0)
> +		return ret;
> 
>  	ret = omap2_mcspi_setup_transfer(spi, NULL);
>  	omap2_mcspi_disable_clocks(mcspi);
> @@ -863,10 +844,11 @@ static void omap2_mcspi_work(struct work_struct *work)
>  	struct omap2_mcspi	*mcspi;
> 
>  	mcspi = container_of(work, struct omap2_mcspi, work);
> -	spin_lock_irq(&mcspi->lock);
> 
> -	if (omap2_mcspi_enable_clocks(mcspi))
> -		goto out;
> +	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
> @@ -979,10 +961,9 @@ static void omap2_mcspi_work(struct work_struct *work)
>  		spin_lock_irq(&mcspi->lock);
>  	}
> 
> -	omap2_mcspi_disable_clocks(mcspi);
> -
> -out:
>  	spin_unlock_irq(&mcspi->lock);
> +
> +	omap2_mcspi_disable_clocks(mcspi);
>  }
> 
>  static int omap2_mcspi_transfer(struct spi_device *spi, struct spi_message *m)
> @@ -1063,25 +1044,15 @@ static int omap2_mcspi_transfer(struct spi_device *spi, struct spi_message
> *m)
>  	return 0;
>  }
> 
> -static int __init omap2_mcspi_reset(struct omap2_mcspi *mcspi)
> +static int __init omap2_mcspi_master_setup(struct omap2_mcspi *mcspi)
>  {
>  	struct spi_master	*master = mcspi->master;
>  	u32			tmp;
> +	int ret = 0;
> 
> -	if (omap2_mcspi_enable_clocks(mcspi))
> -		return -1;
> -
> -	mcspi_write_reg(master, OMAP2_MCSPI_SYSCONFIG,
> -			OMAP2_MCSPI_SYSCONFIG_SOFTRESET);
> -	do {
> -		tmp = mcspi_read_reg(master, OMAP2_MCSPI_SYSSTATUS);
> -	} while (!(tmp & OMAP2_MCSPI_SYSSTATUS_RESETDONE));
> -
> -	tmp = OMAP2_MCSPI_SYSCONFIG_AUTOIDLE |
> -		OMAP2_MCSPI_SYSCONFIG_ENAWAKEUP |
> -		OMAP2_MCSPI_SYSCONFIG_SMARTIDLE;
> -	mcspi_write_reg(master, OMAP2_MCSPI_SYSCONFIG, tmp);
> -	omap2_mcspi_ctx[master->bus_num - 1].sysconfig = tmp;
> +	ret = omap2_mcspi_enable_clocks(mcspi);
> +	if (ret < 0)
> +		return ret;
> 
>  	tmp = OMAP2_MCSPI_WAKEUPENABLE_WKEN;
>  	mcspi_write_reg(master, OMAP2_MCSPI_WAKEUPENABLE, tmp);
> @@ -1092,6 +1063,18 @@ static int __init omap2_mcspi_reset(struct omap2_mcspi *mcspi)
>  	return 0;
>  }
> 
> +static int omap_mcspi_runtime_resume(struct device *dev)
> +{
> +	struct omap2_mcspi	*mcspi;
> +	struct spi_master	*master;
> +
> +	master = dev_get_drvdata(dev);
> +	mcspi = spi_master_get_devdata(master);
> +	omap2_mcspi_restore_ctx(mcspi);
> +
> +	return 0;
> +}
> +
> 
>  static int __init omap2_mcspi_probe(struct platform_device *pdev)
>  {
> @@ -1142,34 +1125,22 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)
>  	if (!mcspi->base) {
>  		dev_dbg(&pdev->dev, "can't ioremap MCSPI\n");
>  		status = -ENOMEM;
> -		goto err1aa;
> +		goto err2;
>  	}
> 
> +	mcspi->dev = &pdev->dev;
>  	INIT_WORK(&mcspi->work, omap2_mcspi_work);
> 
>  	spin_lock_init(&mcspi->lock);
>  	INIT_LIST_HEAD(&mcspi->msg_queue);
>  	INIT_LIST_HEAD(&omap2_mcspi_ctx[master->bus_num - 1].cs);
> 
> -	mcspi->ick = clk_get(&pdev->dev, "ick");
> -	if (IS_ERR(mcspi->ick)) {
> -		dev_dbg(&pdev->dev, "can't get mcspi_ick\n");
> -		status = PTR_ERR(mcspi->ick);
> -		goto err1a;
> -	}
> -	mcspi->fck = clk_get(&pdev->dev, "fck");
> -	if (IS_ERR(mcspi->fck)) {
> -		dev_dbg(&pdev->dev, "can't get mcspi_fck\n");
> -		status = PTR_ERR(mcspi->fck);
> -		goto err2;
> -	}
> -
>  	mcspi->dma_channels = kcalloc(master->num_chipselect,
>  			sizeof(struct omap2_mcspi_dma),
>  			GFP_KERNEL);
> 
>  	if (mcspi->dma_channels == NULL)
> -		goto err3;
> +		goto err2;
> 
>  	for (i = 0; i < master->num_chipselect; i++) {
>  		char dma_ch_name[14];
> @@ -1199,8 +1170,10 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)
>  		mcspi->dma_channels[i].dma_tx_sync_dev = dma_res->start;
>  	}
> 
> -	if (omap2_mcspi_reset(mcspi) < 0)
> -		goto err4;
> +	pm_runtime_enable(&pdev->dev);
> +
> +	if (status || omap2_mcspi_master_setup(mcspi) < 0)
> +		goto err3;
> 
>  	status = spi_register_master(master);
>  	if (status < 0)
> @@ -1209,17 +1182,13 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)
>  	return status;
> 
>  err4:
> -	kfree(mcspi->dma_channels);
> +	spi_master_put(master);
>  err3:
> -	clk_put(mcspi->fck);
> +	kfree(mcspi->dma_channels);
>  err2:
> -	clk_put(mcspi->ick);
> -err1a:
> -	iounmap(mcspi->base);
> -err1aa:
>  	release_mem_region(r->start, (r->end - r->start) + 1);
> +	iounmap(mcspi->base);
>  err1:
> -	spi_master_put(master);
>  	return status;
>  }
> 
> @@ -1235,9 +1204,7 @@ static int __exit omap2_mcspi_remove(struct platform_device *pdev)
>  	mcspi = spi_master_get_devdata(master);
>  	dma_channels = mcspi->dma_channels;
> 
> -	clk_put(mcspi->fck);
> -	clk_put(mcspi->ick);
> -
> +	omap2_mcspi_disable_clocks(mcspi);
>  	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>  	release_mem_region(r->start, (r->end - r->start) + 1);
> 
> @@ -1252,10 +1219,15 @@ static int __exit omap2_mcspi_remove(struct platform_device *pdev)
>  /* work with hotplug and coldplug */
>  MODULE_ALIAS("platform:omap2_mcspi");
> 
> +static const struct dev_pm_ops omap_mcspi_dev_pm_ops = {
> +	.runtime_resume	= omap_mcspi_runtime_resume,
> +};
> +
>  static struct platform_driver omap2_mcspi_driver = {
>  	.driver = {
>  		.name =		"omap2_mcspi",
>  		.owner =	THIS_MODULE,
> +		.pm = &omap_mcspi_dev_pm_ops,
>  	},
>  	.remove =	__exit_p(omap2_mcspi_remove),
>  };
> -- 
> 1.7.1
> 
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 7/7 v2] OMAP: runtime: McSPI driver runtime conversion
  2010-12-30 19:29 ` Grant Likely
@ 2011-01-07 22:49   ` Kevin Hilman
  2011-01-11 14:30     ` Govindraj
  0 siblings, 1 reply; 4+ messages in thread
From: Kevin Hilman @ 2011-01-07 22:49 UTC (permalink / raw)
  To: Govindraj.R, Grant Likely
  Cc: linux-omap, spi-devel-general, linux-arm-kernel, Charulatha V,
	tony, p-basak2

Grant Likely <grant.likely@secretlab.ca> writes:

> On Wed, Dec 01, 2010 at 07:32:11PM +0530, Govindraj.R wrote:
>> McSPI runtime conversion.
>> Changes involves:
>> 1) remove clock framework apis to use runtime framework apis.
>> 2) context restore from runtime resume which is a callback for get_sync.
>> 3) Remove SYSCONFIG(sysc) register handling
>>         (a) Remove context save and restore of sysc reg and remove soft reset
>>             done from sysc reg as this will be done with hwmod framework.
>>         (b) Also cleanup sysc reg bit macros.
>> 4) Rename the omap2_mcspi_reset function to omap2_mcspi_master_setup
>>    function as with hwmod changes soft reset will be done in
>>    hwmod framework itself and use the return value from clock
>>    enable function to return for failure scenarios.
>> 
>> Signed-off-by: Charulatha V <charu@ti.com>
>> Signed-off-by: Govindraj.R <govindraj.raja@ti.com>
>> Reviewed-by: Partha Basak <p-basak2@ti.com>
>
> One comment below, but otherwise looks good to me.  Since the majority
> of the changes are in arch/arm, feel free to add my Acked-by for the
> whole series and merge via the omap tree.  

Thanks, we'll merge this through the OMAP tree.

> None of my comments are showstoppers, so I'm even fine with merging
> them as-is as long as followup patches are posted to address the
> comments.

Govindraj, since we've missed 2.6.38 for this series, I'd like to see the last few
minor issues cleaned up before merge, especially the various casting and
CodingStyle issues that Grant found.

Kevin

> In particular, I'd really like to see the data duplication issue from
> the first 4 patches addressed.
>
> Acked-by: Grant Likely <grant.likely@secretlab.ca>
>
>
>> ---
>>  drivers/spi/omap2_mcspi.c |  120 +++++++++++++++++---------------------------
>>  1 files changed, 46 insertions(+), 74 deletions(-)
>> 
>> diff --git a/drivers/spi/omap2_mcspi.c b/drivers/spi/omap2_mcspi.c
>> index ad3811e..a1b157f 100644
>> --- a/drivers/spi/omap2_mcspi.c
>> +++ b/drivers/spi/omap2_mcspi.c
>> @@ -33,6 +33,7 @@
>>  #include <linux/clk.h>
>>  #include <linux/io.h>
>>  #include <linux/slab.h>
>> +#include <linux/pm_runtime.h>
>> 
>>  #include <linux/spi/spi.h>
>> 
>> @@ -46,7 +47,6 @@
>>  #define OMAP2_MCSPI_MAX_CTRL 		4
>> 
>>  #define OMAP2_MCSPI_REVISION		0x00
>> -#define OMAP2_MCSPI_SYSCONFIG		0x10
>>  #define OMAP2_MCSPI_SYSSTATUS		0x14
>>  #define OMAP2_MCSPI_IRQSTATUS		0x18
>>  #define OMAP2_MCSPI_IRQENABLE		0x1c
>> @@ -63,13 +63,6 @@
>> 
>>  /* per-register bitmasks: */
>> 
>> -#define OMAP2_MCSPI_SYSCONFIG_SMARTIDLE	BIT(4)
>> -#define OMAP2_MCSPI_SYSCONFIG_ENAWAKEUP	BIT(2)
>> -#define OMAP2_MCSPI_SYSCONFIG_AUTOIDLE	BIT(0)
>> -#define OMAP2_MCSPI_SYSCONFIG_SOFTRESET	BIT(1)
>> -
>> -#define OMAP2_MCSPI_SYSSTATUS_RESETDONE	BIT(0)
>> -
>>  #define OMAP2_MCSPI_MODULCTRL_SINGLE	BIT(0)
>>  #define OMAP2_MCSPI_MODULCTRL_MS	BIT(2)
>>  #define OMAP2_MCSPI_MODULCTRL_STEST	BIT(3)
>> @@ -122,13 +115,12 @@ struct omap2_mcspi {
>>  	spinlock_t		lock;
>>  	struct list_head	msg_queue;
>>  	struct spi_master	*master;
>> -	struct clk		*ick;
>> -	struct clk		*fck;
>>  	/* Virtual base address of the controller */
>>  	void __iomem		*base;
>>  	unsigned long		phys;
>>  	/* SPI1 has 4 channels, while SPI2 has 2 */
>>  	struct omap2_mcspi_dma	*dma_channels;
>> +	struct  device          *dev;
>
> Inconsistent indentation with the rest of the structure (tabs vs. spaces).
>
>>  };
>> 
>>  struct omap2_mcspi_cs {
>> @@ -144,7 +136,6 @@ struct omap2_mcspi_cs {
>>   * corresponding registers are modified.
>>   */
>>  struct omap2_mcspi_regs {
>> -	u32 sysconfig;
>>  	u32 modulctrl;
>>  	u32 wakeupenable;
>>  	struct list_head cs;
>> @@ -268,9 +259,6 @@ static void omap2_mcspi_restore_ctx(struct omap2_mcspi *mcspi)
>>  	mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_MODULCTRL,
>>  			omap2_mcspi_ctx[spi_cntrl->bus_num - 1].modulctrl);
>> 
>> -	mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_SYSCONFIG,
>> -			omap2_mcspi_ctx[spi_cntrl->bus_num - 1].sysconfig);
>> -
>>  	mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_WAKEUPENABLE,
>>  			omap2_mcspi_ctx[spi_cntrl->bus_num - 1].wakeupenable);
>> 
>> @@ -280,20 +268,12 @@ static void omap2_mcspi_restore_ctx(struct omap2_mcspi *mcspi)
>>  }
>>  static void omap2_mcspi_disable_clocks(struct omap2_mcspi *mcspi)
>>  {
>> -	clk_disable(mcspi->ick);
>> -	clk_disable(mcspi->fck);
>> +	pm_runtime_put_sync(mcspi->dev);
>>  }
>> 
>>  static int omap2_mcspi_enable_clocks(struct omap2_mcspi *mcspi)
>>  {
>> -	if (clk_enable(mcspi->ick))
>> -		return -ENODEV;
>> -	if (clk_enable(mcspi->fck))
>> -		return -ENODEV;
>> -
>> -	omap2_mcspi_restore_ctx(mcspi);
>> -
>> -	return 0;
>> +	return pm_runtime_get_sync(mcspi->dev);
>>  }
>> 
>>  static int mcspi_wait_for_reg_bit(void __iomem *reg, unsigned long bit)
>> @@ -819,8 +799,9 @@ static int omap2_mcspi_setup(struct spi_device *spi)
>>  			return ret;
>>  	}
>> 
>> -	if (omap2_mcspi_enable_clocks(mcspi))
>> -		return -ENODEV;
>> +	ret = omap2_mcspi_enable_clocks(mcspi);
>> +	if (ret < 0)
>> +		return ret;
>> 
>>  	ret = omap2_mcspi_setup_transfer(spi, NULL);
>>  	omap2_mcspi_disable_clocks(mcspi);
>> @@ -863,10 +844,11 @@ static void omap2_mcspi_work(struct work_struct *work)
>>  	struct omap2_mcspi	*mcspi;
>> 
>>  	mcspi = container_of(work, struct omap2_mcspi, work);
>> -	spin_lock_irq(&mcspi->lock);
>> 
>> -	if (omap2_mcspi_enable_clocks(mcspi))
>> -		goto out;
>> +	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
>> @@ -979,10 +961,9 @@ static void omap2_mcspi_work(struct work_struct *work)
>>  		spin_lock_irq(&mcspi->lock);
>>  	}
>> 
>> -	omap2_mcspi_disable_clocks(mcspi);
>> -
>> -out:
>>  	spin_unlock_irq(&mcspi->lock);
>> +
>> +	omap2_mcspi_disable_clocks(mcspi);
>>  }
>> 
>>  static int omap2_mcspi_transfer(struct spi_device *spi, struct spi_message *m)
>> @@ -1063,25 +1044,15 @@ static int omap2_mcspi_transfer(struct spi_device *spi, struct spi_message
>> *m)
>>  	return 0;
>>  }
>> 
>> -static int __init omap2_mcspi_reset(struct omap2_mcspi *mcspi)
>> +static int __init omap2_mcspi_master_setup(struct omap2_mcspi *mcspi)
>>  {
>>  	struct spi_master	*master = mcspi->master;
>>  	u32			tmp;
>> +	int ret = 0;
>> 
>> -	if (omap2_mcspi_enable_clocks(mcspi))
>> -		return -1;
>> -
>> -	mcspi_write_reg(master, OMAP2_MCSPI_SYSCONFIG,
>> -			OMAP2_MCSPI_SYSCONFIG_SOFTRESET);
>> -	do {
>> -		tmp = mcspi_read_reg(master, OMAP2_MCSPI_SYSSTATUS);
>> -	} while (!(tmp & OMAP2_MCSPI_SYSSTATUS_RESETDONE));
>> -
>> -	tmp = OMAP2_MCSPI_SYSCONFIG_AUTOIDLE |
>> -		OMAP2_MCSPI_SYSCONFIG_ENAWAKEUP |
>> -		OMAP2_MCSPI_SYSCONFIG_SMARTIDLE;
>> -	mcspi_write_reg(master, OMAP2_MCSPI_SYSCONFIG, tmp);
>> -	omap2_mcspi_ctx[master->bus_num - 1].sysconfig = tmp;
>> +	ret = omap2_mcspi_enable_clocks(mcspi);
>> +	if (ret < 0)
>> +		return ret;
>> 
>>  	tmp = OMAP2_MCSPI_WAKEUPENABLE_WKEN;
>>  	mcspi_write_reg(master, OMAP2_MCSPI_WAKEUPENABLE, tmp);
>> @@ -1092,6 +1063,18 @@ static int __init omap2_mcspi_reset(struct omap2_mcspi *mcspi)
>>  	return 0;
>>  }
>> 
>> +static int omap_mcspi_runtime_resume(struct device *dev)
>> +{
>> +	struct omap2_mcspi	*mcspi;
>> +	struct spi_master	*master;
>> +
>> +	master = dev_get_drvdata(dev);
>> +	mcspi = spi_master_get_devdata(master);
>> +	omap2_mcspi_restore_ctx(mcspi);
>> +
>> +	return 0;
>> +}
>> +
>> 
>>  static int __init omap2_mcspi_probe(struct platform_device *pdev)
>>  {
>> @@ -1142,34 +1125,22 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)
>>  	if (!mcspi->base) {
>>  		dev_dbg(&pdev->dev, "can't ioremap MCSPI\n");
>>  		status = -ENOMEM;
>> -		goto err1aa;
>> +		goto err2;
>>  	}
>> 
>> +	mcspi->dev = &pdev->dev;
>>  	INIT_WORK(&mcspi->work, omap2_mcspi_work);
>> 
>>  	spin_lock_init(&mcspi->lock);
>>  	INIT_LIST_HEAD(&mcspi->msg_queue);
>>  	INIT_LIST_HEAD(&omap2_mcspi_ctx[master->bus_num - 1].cs);
>> 
>> -	mcspi->ick = clk_get(&pdev->dev, "ick");
>> -	if (IS_ERR(mcspi->ick)) {
>> -		dev_dbg(&pdev->dev, "can't get mcspi_ick\n");
>> -		status = PTR_ERR(mcspi->ick);
>> -		goto err1a;
>> -	}
>> -	mcspi->fck = clk_get(&pdev->dev, "fck");
>> -	if (IS_ERR(mcspi->fck)) {
>> -		dev_dbg(&pdev->dev, "can't get mcspi_fck\n");
>> -		status = PTR_ERR(mcspi->fck);
>> -		goto err2;
>> -	}
>> -
>>  	mcspi->dma_channels = kcalloc(master->num_chipselect,
>>  			sizeof(struct omap2_mcspi_dma),
>>  			GFP_KERNEL);
>> 
>>  	if (mcspi->dma_channels == NULL)
>> -		goto err3;
>> +		goto err2;
>> 
>>  	for (i = 0; i < master->num_chipselect; i++) {
>>  		char dma_ch_name[14];
>> @@ -1199,8 +1170,10 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)
>>  		mcspi->dma_channels[i].dma_tx_sync_dev = dma_res->start;
>>  	}
>> 
>> -	if (omap2_mcspi_reset(mcspi) < 0)
>> -		goto err4;
>> +	pm_runtime_enable(&pdev->dev);
>> +
>> +	if (status || omap2_mcspi_master_setup(mcspi) < 0)
>> +		goto err3;
>> 
>>  	status = spi_register_master(master);
>>  	if (status < 0)
>> @@ -1209,17 +1182,13 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)
>>  	return status;
>> 
>>  err4:
>> -	kfree(mcspi->dma_channels);
>> +	spi_master_put(master);
>>  err3:
>> -	clk_put(mcspi->fck);
>> +	kfree(mcspi->dma_channels);
>>  err2:
>> -	clk_put(mcspi->ick);
>> -err1a:
>> -	iounmap(mcspi->base);
>> -err1aa:
>>  	release_mem_region(r->start, (r->end - r->start) + 1);
>> +	iounmap(mcspi->base);
>>  err1:
>> -	spi_master_put(master);
>>  	return status;
>>  }
>> 
>> @@ -1235,9 +1204,7 @@ static int __exit omap2_mcspi_remove(struct platform_device *pdev)
>>  	mcspi = spi_master_get_devdata(master);
>>  	dma_channels = mcspi->dma_channels;
>> 
>> -	clk_put(mcspi->fck);
>> -	clk_put(mcspi->ick);
>> -
>> +	omap2_mcspi_disable_clocks(mcspi);
>>  	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>>  	release_mem_region(r->start, (r->end - r->start) + 1);
>> 
>> @@ -1252,10 +1219,15 @@ static int __exit omap2_mcspi_remove(struct platform_device *pdev)
>>  /* work with hotplug and coldplug */
>>  MODULE_ALIAS("platform:omap2_mcspi");
>> 
>> +static const struct dev_pm_ops omap_mcspi_dev_pm_ops = {
>> +	.runtime_resume	= omap_mcspi_runtime_resume,
>> +};
>> +
>>  static struct platform_driver omap2_mcspi_driver = {
>>  	.driver = {
>>  		.name =		"omap2_mcspi",
>>  		.owner =	THIS_MODULE,
>> +		.pm = &omap_mcspi_dev_pm_ops,
>>  	},
>>  	.remove =	__exit_p(omap2_mcspi_remove),
>>  };
>> -- 
>> 1.7.1
>> 
>> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 7/7 v2] OMAP: runtime: McSPI driver runtime conversion
  2011-01-07 22:49   ` Kevin Hilman
@ 2011-01-11 14:30     ` Govindraj
  0 siblings, 0 replies; 4+ messages in thread
From: Govindraj @ 2011-01-11 14:30 UTC (permalink / raw)
  To: Kevin Hilman
  Cc: Govindraj.R, Grant Likely, linux-omap, spi-devel-general,
	linux-arm-kernel, Charulatha V, tony, p-basak2

On Sat, Jan 8, 2011 at 4:19 AM, Kevin Hilman <khilman@ti.com> wrote:
> Grant Likely <grant.likely@secretlab.ca> writes:
>
>> On Wed, Dec 01, 2010 at 07:32:11PM +0530, Govindraj.R wrote:
>>> McSPI runtime conversion.
>>> Changes involves:
>>> 1) remove clock framework apis to use runtime framework apis.
>>> 2) context restore from runtime resume which is a callback for get_sync.
>>> 3) Remove SYSCONFIG(sysc) register handling
>>>         (a) Remove context save and restore of sysc reg and remove soft reset
>>>             done from sysc reg as this will be done with hwmod framework.
>>>         (b) Also cleanup sysc reg bit macros.
>>> 4) Rename the omap2_mcspi_reset function to omap2_mcspi_master_setup
>>>    function as with hwmod changes soft reset will be done in
>>>    hwmod framework itself and use the return value from clock
>>>    enable function to return for failure scenarios.
>>>
>>> Signed-off-by: Charulatha V <charu@ti.com>
>>> Signed-off-by: Govindraj.R <govindraj.raja@ti.com>
>>> Reviewed-by: Partha Basak <p-basak2@ti.com>
>>
>> One comment below, but otherwise looks good to me.  Since the majority
>> of the changes are in arch/arm, feel free to add my Acked-by for the
>> whole series and merge via the omap tree.
>
> Thanks, we'll merge this through the OMAP tree.
>
>> None of my comments are showstoppers, so I'm even fine with merging
>> them as-is as long as followup patches are posted to address the
>> comments.
>
> Govindraj, since we've missed 2.6.38 for this series, I'd like to see the last few
> minor issues cleaned up before merge, especially the various casting and
> CodingStyle issues that Grant found.

Yes sure will post out v3 in a weeks time. Fixing comments and
adding ack from Grant.

--
Thanks,
Govindraj.R


>
> Kevin
>
>> In particular, I'd really like to see the data duplication issue from
>> the first 4 patches addressed.
>>
>> Acked-by: Grant Likely <grant.likely@secretlab.ca>
>>
>>
>>> ---
>>>  drivers/spi/omap2_mcspi.c |  120 +++++++++++++++++---------------------------
>>>  1 files changed, 46 insertions(+), 74 deletions(-)
>>>
>>> diff --git a/drivers/spi/omap2_mcspi.c b/drivers/spi/omap2_mcspi.c
>>> index ad3811e..a1b157f 100644
>>> --- a/drivers/spi/omap2_mcspi.c
>>> +++ b/drivers/spi/omap2_mcspi.c
>>> @@ -33,6 +33,7 @@
>>>  #include <linux/clk.h>
>>>  #include <linux/io.h>
>>>  #include <linux/slab.h>
>>> +#include <linux/pm_runtime.h>
>>>
>>>  #include <linux/spi/spi.h>
>>>
>>> @@ -46,7 +47,6 @@
>>>  #define OMAP2_MCSPI_MAX_CTRL                4
>>>
>>>  #define OMAP2_MCSPI_REVISION                0x00
>>> -#define OMAP2_MCSPI_SYSCONFIG               0x10
>>>  #define OMAP2_MCSPI_SYSSTATUS               0x14
>>>  #define OMAP2_MCSPI_IRQSTATUS               0x18
>>>  #define OMAP2_MCSPI_IRQENABLE               0x1c
>>> @@ -63,13 +63,6 @@
>>>
>>>  /* per-register bitmasks: */
>>>
>>> -#define OMAP2_MCSPI_SYSCONFIG_SMARTIDLE     BIT(4)
>>> -#define OMAP2_MCSPI_SYSCONFIG_ENAWAKEUP     BIT(2)
>>> -#define OMAP2_MCSPI_SYSCONFIG_AUTOIDLE      BIT(0)
>>> -#define OMAP2_MCSPI_SYSCONFIG_SOFTRESET     BIT(1)
>>> -
>>> -#define OMAP2_MCSPI_SYSSTATUS_RESETDONE     BIT(0)
>>> -
>>>  #define OMAP2_MCSPI_MODULCTRL_SINGLE        BIT(0)
>>>  #define OMAP2_MCSPI_MODULCTRL_MS    BIT(2)
>>>  #define OMAP2_MCSPI_MODULCTRL_STEST BIT(3)
>>> @@ -122,13 +115,12 @@ struct omap2_mcspi {
>>>      spinlock_t              lock;
>>>      struct list_head        msg_queue;
>>>      struct spi_master       *master;
>>> -    struct clk              *ick;
>>> -    struct clk              *fck;
>>>      /* Virtual base address of the controller */
>>>      void __iomem            *base;
>>>      unsigned long           phys;
>>>      /* SPI1 has 4 channels, while SPI2 has 2 */
>>>      struct omap2_mcspi_dma  *dma_channels;
>>> +    struct  device          *dev;
>>
>> Inconsistent indentation with the rest of the structure (tabs vs. spaces).
>>
>>>  };
>>>
>>>  struct omap2_mcspi_cs {
>>> @@ -144,7 +136,6 @@ struct omap2_mcspi_cs {
>>>   * corresponding registers are modified.
>>>   */
>>>  struct omap2_mcspi_regs {
>>> -    u32 sysconfig;
>>>      u32 modulctrl;
>>>      u32 wakeupenable;
>>>      struct list_head cs;
>>> @@ -268,9 +259,6 @@ static void omap2_mcspi_restore_ctx(struct omap2_mcspi *mcspi)
>>>      mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_MODULCTRL,
>>>                      omap2_mcspi_ctx[spi_cntrl->bus_num - 1].modulctrl);
>>>
>>> -    mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_SYSCONFIG,
>>> -                    omap2_mcspi_ctx[spi_cntrl->bus_num - 1].sysconfig);
>>> -
>>>      mcspi_write_reg(spi_cntrl, OMAP2_MCSPI_WAKEUPENABLE,
>>>                      omap2_mcspi_ctx[spi_cntrl->bus_num - 1].wakeupenable);
>>>
>>> @@ -280,20 +268,12 @@ static void omap2_mcspi_restore_ctx(struct omap2_mcspi *mcspi)
>>>  }
>>>  static void omap2_mcspi_disable_clocks(struct omap2_mcspi *mcspi)
>>>  {
>>> -    clk_disable(mcspi->ick);
>>> -    clk_disable(mcspi->fck);
>>> +    pm_runtime_put_sync(mcspi->dev);
>>>  }
>>>
>>>  static int omap2_mcspi_enable_clocks(struct omap2_mcspi *mcspi)
>>>  {
>>> -    if (clk_enable(mcspi->ick))
>>> -            return -ENODEV;
>>> -    if (clk_enable(mcspi->fck))
>>> -            return -ENODEV;
>>> -
>>> -    omap2_mcspi_restore_ctx(mcspi);
>>> -
>>> -    return 0;
>>> +    return pm_runtime_get_sync(mcspi->dev);
>>>  }
>>>
>>>  static int mcspi_wait_for_reg_bit(void __iomem *reg, unsigned long bit)
>>> @@ -819,8 +799,9 @@ static int omap2_mcspi_setup(struct spi_device *spi)
>>>                      return ret;
>>>      }
>>>
>>> -    if (omap2_mcspi_enable_clocks(mcspi))
>>> -            return -ENODEV;
>>> +    ret = omap2_mcspi_enable_clocks(mcspi);
>>> +    if (ret < 0)
>>> +            return ret;
>>>
>>>      ret = omap2_mcspi_setup_transfer(spi, NULL);
>>>      omap2_mcspi_disable_clocks(mcspi);
>>> @@ -863,10 +844,11 @@ static void omap2_mcspi_work(struct work_struct *work)
>>>      struct omap2_mcspi      *mcspi;
>>>
>>>      mcspi = container_of(work, struct omap2_mcspi, work);
>>> -    spin_lock_irq(&mcspi->lock);
>>>
>>> -    if (omap2_mcspi_enable_clocks(mcspi))
>>> -            goto out;
>>> +    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
>>> @@ -979,10 +961,9 @@ static void omap2_mcspi_work(struct work_struct *work)
>>>              spin_lock_irq(&mcspi->lock);
>>>      }
>>>
>>> -    omap2_mcspi_disable_clocks(mcspi);
>>> -
>>> -out:
>>>      spin_unlock_irq(&mcspi->lock);
>>> +
>>> +    omap2_mcspi_disable_clocks(mcspi);
>>>  }
>>>
>>>  static int omap2_mcspi_transfer(struct spi_device *spi, struct spi_message *m)
>>> @@ -1063,25 +1044,15 @@ static int omap2_mcspi_transfer(struct spi_device *spi, struct spi_message
>>> *m)
>>>      return 0;
>>>  }
>>>
>>> -static int __init omap2_mcspi_reset(struct omap2_mcspi *mcspi)
>>> +static int __init omap2_mcspi_master_setup(struct omap2_mcspi *mcspi)
>>>  {
>>>      struct spi_master       *master = mcspi->master;
>>>      u32                     tmp;
>>> +    int ret = 0;
>>>
>>> -    if (omap2_mcspi_enable_clocks(mcspi))
>>> -            return -1;
>>> -
>>> -    mcspi_write_reg(master, OMAP2_MCSPI_SYSCONFIG,
>>> -                    OMAP2_MCSPI_SYSCONFIG_SOFTRESET);
>>> -    do {
>>> -            tmp = mcspi_read_reg(master, OMAP2_MCSPI_SYSSTATUS);
>>> -    } while (!(tmp & OMAP2_MCSPI_SYSSTATUS_RESETDONE));
>>> -
>>> -    tmp = OMAP2_MCSPI_SYSCONFIG_AUTOIDLE |
>>> -            OMAP2_MCSPI_SYSCONFIG_ENAWAKEUP |
>>> -            OMAP2_MCSPI_SYSCONFIG_SMARTIDLE;
>>> -    mcspi_write_reg(master, OMAP2_MCSPI_SYSCONFIG, tmp);
>>> -    omap2_mcspi_ctx[master->bus_num - 1].sysconfig = tmp;
>>> +    ret = omap2_mcspi_enable_clocks(mcspi);
>>> +    if (ret < 0)
>>> +            return ret;
>>>
>>>      tmp = OMAP2_MCSPI_WAKEUPENABLE_WKEN;
>>>      mcspi_write_reg(master, OMAP2_MCSPI_WAKEUPENABLE, tmp);
>>> @@ -1092,6 +1063,18 @@ static int __init omap2_mcspi_reset(struct omap2_mcspi *mcspi)
>>>      return 0;
>>>  }
>>>
>>> +static int omap_mcspi_runtime_resume(struct device *dev)
>>> +{
>>> +    struct omap2_mcspi      *mcspi;
>>> +    struct spi_master       *master;
>>> +
>>> +    master = dev_get_drvdata(dev);
>>> +    mcspi = spi_master_get_devdata(master);
>>> +    omap2_mcspi_restore_ctx(mcspi);
>>> +
>>> +    return 0;
>>> +}
>>> +
>>>
>>>  static int __init omap2_mcspi_probe(struct platform_device *pdev)
>>>  {
>>> @@ -1142,34 +1125,22 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)
>>>      if (!mcspi->base) {
>>>              dev_dbg(&pdev->dev, "can't ioremap MCSPI\n");
>>>              status = -ENOMEM;
>>> -            goto err1aa;
>>> +            goto err2;
>>>      }
>>>
>>> +    mcspi->dev = &pdev->dev;
>>>      INIT_WORK(&mcspi->work, omap2_mcspi_work);
>>>
>>>      spin_lock_init(&mcspi->lock);
>>>      INIT_LIST_HEAD(&mcspi->msg_queue);
>>>      INIT_LIST_HEAD(&omap2_mcspi_ctx[master->bus_num - 1].cs);
>>>
>>> -    mcspi->ick = clk_get(&pdev->dev, "ick");
>>> -    if (IS_ERR(mcspi->ick)) {
>>> -            dev_dbg(&pdev->dev, "can't get mcspi_ick\n");
>>> -            status = PTR_ERR(mcspi->ick);
>>> -            goto err1a;
>>> -    }
>>> -    mcspi->fck = clk_get(&pdev->dev, "fck");
>>> -    if (IS_ERR(mcspi->fck)) {
>>> -            dev_dbg(&pdev->dev, "can't get mcspi_fck\n");
>>> -            status = PTR_ERR(mcspi->fck);
>>> -            goto err2;
>>> -    }
>>> -
>>>      mcspi->dma_channels = kcalloc(master->num_chipselect,
>>>                      sizeof(struct omap2_mcspi_dma),
>>>                      GFP_KERNEL);
>>>
>>>      if (mcspi->dma_channels == NULL)
>>> -            goto err3;
>>> +            goto err2;
>>>
>>>      for (i = 0; i < master->num_chipselect; i++) {
>>>              char dma_ch_name[14];
>>> @@ -1199,8 +1170,10 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)
>>>              mcspi->dma_channels[i].dma_tx_sync_dev = dma_res->start;
>>>      }
>>>
>>> -    if (omap2_mcspi_reset(mcspi) < 0)
>>> -            goto err4;
>>> +    pm_runtime_enable(&pdev->dev);
>>> +
>>> +    if (status || omap2_mcspi_master_setup(mcspi) < 0)
>>> +            goto err3;
>>>
>>>      status = spi_register_master(master);
>>>      if (status < 0)
>>> @@ -1209,17 +1182,13 @@ static int __init omap2_mcspi_probe(struct platform_device *pdev)
>>>      return status;
>>>
>>>  err4:
>>> -    kfree(mcspi->dma_channels);
>>> +    spi_master_put(master);
>>>  err3:
>>> -    clk_put(mcspi->fck);
>>> +    kfree(mcspi->dma_channels);
>>>  err2:
>>> -    clk_put(mcspi->ick);
>>> -err1a:
>>> -    iounmap(mcspi->base);
>>> -err1aa:
>>>      release_mem_region(r->start, (r->end - r->start) + 1);
>>> +    iounmap(mcspi->base);
>>>  err1:
>>> -    spi_master_put(master);
>>>      return status;
>>>  }
>>>
>>> @@ -1235,9 +1204,7 @@ static int __exit omap2_mcspi_remove(struct platform_device *pdev)
>>>      mcspi = spi_master_get_devdata(master);
>>>      dma_channels = mcspi->dma_channels;
>>>
>>> -    clk_put(mcspi->fck);
>>> -    clk_put(mcspi->ick);
>>> -
>>> +    omap2_mcspi_disable_clocks(mcspi);
>>>      r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>>>      release_mem_region(r->start, (r->end - r->start) + 1);
>>>
>>> @@ -1252,10 +1219,15 @@ static int __exit omap2_mcspi_remove(struct platform_device *pdev)
>>>  /* work with hotplug and coldplug */
>>>  MODULE_ALIAS("platform:omap2_mcspi");
>>>
>>> +static const struct dev_pm_ops omap_mcspi_dev_pm_ops = {
>>> +    .runtime_resume = omap_mcspi_runtime_resume,
>>> +};
>>> +
>>>  static struct platform_driver omap2_mcspi_driver = {
>>>      .driver = {
>>>              .name =         "omap2_mcspi",
>>>              .owner =        THIS_MODULE,
>>> +            .pm = &omap_mcspi_dev_pm_ops,
>>>      },
>>>      .remove =       __exit_p(omap2_mcspi_remove),
>>>  };
>>> --
>>> 1.7.1
>>>
>>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-01-11 14:30 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-12-01 14:02 [PATCH 7/7 v2] OMAP: runtime: McSPI driver runtime conversion Govindraj.R
2010-12-30 19:29 ` Grant Likely
2011-01-07 22:49   ` Kevin Hilman
2011-01-11 14:30     ` Govindraj

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).