[RFC][PATCH] spi: s3c64xx: Use clkdev for bus clock lookup

Padmavathi Venna padma.v at samsung.com
Tue Jul 26 07:00:12 EDT 2011


Create a clkdev alias for spi bus clock and modify the spi
driver to lookup the clock using the alias name instead of
passing clock name from platform data.

Signed-off-by: Padmavathi Venna <padma.v at samsung.com>
---
This patch is tested for S5PV210 platform and similar
changes can be adopted for rest of the Samsung's s3c
and s5p platforms, if this approach is accepted.

 arch/arm/mach-s5pv210/dev-spi.c                  |   16 ++++++++++++++--
 arch/arm/plat-samsung/include/plat/s3c64xx-spi.h |    2 --
 drivers/spi/spi_s3c64xx.c                        |   13 +++----------
 3 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/arch/arm/mach-s5pv210/dev-spi.c b/arch/arm/mach-s5pv210/dev-spi.c
index eaf9a7b..44480d1 100644
--- a/arch/arm/mach-s5pv210/dev-spi.c
+++ b/arch/arm/mach-s5pv210/dev-spi.c
@@ -11,6 +11,7 @@
 #include <linux/platform_device.h>
 #include <linux/dma-mapping.h>
 #include <linux/gpio.h>
+#include <linux/clk.h>
 
 #include <mach/dma.h>
 #include <mach/map.h>
@@ -148,6 +149,9 @@ struct platform_device s5pv210_device_spi1 = {
 void __init s5pv210_spi_set_info(int cntrlr, int src_clk_nr, int num_cs)
 {
 	struct s3c64xx_spi_info *pd;
+	struct device *dev;
+	char devname[16];
+	int ret;
 
 	/* Reject invalid configuration */
 	if (!num_cs || src_clk_nr < 0
@@ -159,17 +163,25 @@ void __init s5pv210_spi_set_info(int cntrlr, int src_clk_nr, int num_cs)
 	switch (cntrlr) {
 	case 0:
 		pd = &s5pv210_spi0_pdata;
+		dev = (src_clk_nr) ? &s5pv210_device_spi0.dev : NULL;
 		break;
 	case 1:
 		pd = &s5pv210_spi1_pdata;
+		dev = (src_clk_nr) ? &s5pv210_device_spi1.dev : NULL;
 		break;
 	default:
 		printk(KERN_ERR "%s: Invalid SPI controller(%d)\n",
 							__func__, cntrlr);
 		return;
 	}
-
+	sprintf(devname, "s3c64xx-spi.%d", cntrlr);
+	ret = clk_add_alias("clk_spi_bus", devname,
+				spi_src_clks[src_clk_nr], dev);
+	if (0 != ret) {
+		printk(KERN_ERR "failed to create alias for SPI%d clock",
+			cntrlr);
+		return;
+	}
 	pd->num_cs = num_cs;
 	pd->src_clk_nr = src_clk_nr;
-	pd->src_clk_name = spi_src_clks[src_clk_nr];
 }
diff --git a/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h b/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h
index 4c16fa3..c3d82a5 100644
--- a/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h
+++ b/arch/arm/plat-samsung/include/plat/s3c64xx-spi.h
@@ -31,7 +31,6 @@ struct s3c64xx_spi_csinfo {
 /**
  * struct s3c64xx_spi_info - SPI Controller defining structure
  * @src_clk_nr: Clock source index for the CLK_CFG[SPI_CLKSEL] field.
- * @src_clk_name: Platform name of the corresponding clock.
  * @clk_from_cmu: If the SPI clock/prescalar control block is present
  *     by the platform's clock-management-unit and not in SPI controller.
  * @num_cs: Number of CS this controller emulates.
@@ -43,7 +42,6 @@ struct s3c64xx_spi_csinfo {
  */
 struct s3c64xx_spi_info {
 	int src_clk_nr;
-	char *src_clk_name;
 	bool clk_from_cmu;
 
 	int num_cs;
diff --git a/drivers/spi/spi_s3c64xx.c b/drivers/spi/spi_s3c64xx.c
index 8945e20..e5431bd 100644
--- a/drivers/spi/spi_s3c64xx.c
+++ b/drivers/spi/spi_s3c64xx.c
@@ -978,11 +978,6 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev)
 	}
 
 	sci = pdev->dev.platform_data;
-	if (!sci->src_clk_name) {
-		dev_err(&pdev->dev,
-			"Board init must call s3c64xx_spi_set_info()\n");
-		return -EINVAL;
-	}
 
 	/* Check for availability of necessary resource */
 
@@ -1065,17 +1060,15 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev)
 		goto err4;
 	}
 
-	sdd->src_clk = clk_get(&pdev->dev, sci->src_clk_name);
+	sdd->src_clk = clk_get(&pdev->dev, "clk_spi_bus");
 	if (IS_ERR(sdd->src_clk)) {
-		dev_err(&pdev->dev,
-			"Unable to acquire clock '%s'\n", sci->src_clk_name);
+		dev_err(&pdev->dev, "Unable to acquire clock 'clk_spi_bus'\n");
 		ret = PTR_ERR(sdd->src_clk);
 		goto err5;
 	}
 
 	if (clk_enable(sdd->src_clk)) {
-		dev_err(&pdev->dev, "Couldn't enable clock '%s'\n",
-							sci->src_clk_name);
+		dev_err(&pdev->dev, "Couldn't enable clock 'clk_spi_bus'\n");
 		ret = -EBUSY;
 		goto err6;
 	}
-- 
1.7.0.4




More information about the linux-arm-kernel mailing list