Patchwork ARM: imx: move pwm driver to use platform device id table

login
register
mail settings
Submitter Eric Miao
Date Sept. 8, 2011, 11:22 p.m.
Message ID <1315524142-10566-1-git-send-email-eric.miao@linaro.org>
Download mbox | patch
Permalink /patch/114000/
State New
Headers show

Comments

Eric Miao - Sept. 8, 2011, 11:22 p.m.
Signed-off-by: Eric Miao <eric.miao@linaro.org>
---
 arch/arm/mach-imx/clock-imx25.c              |    8 ++++----
 arch/arm/mach-imx/clock-imx27.c              |    2 +-
 arch/arm/mach-imx/devices-imx25.h            |    2 +-
 arch/arm/mach-mx5/clock-mx51-mx53.c          |    4 ++--
 arch/arm/mach-mx5/devices-imx51.h            |    2 +-
 arch/arm/plat-mxc/devices/platform-mxc_pwm.c |    4 ++--
 arch/arm/plat-mxc/pwm.c                      |   19 ++++++++++++++++---
 7 files changed, 27 insertions(+), 14 deletions(-)
Fabio Estevam - Sept. 9, 2011, 12:42 a.m.
On Thu, Sep 8, 2011 at 8:22 PM, Eric Miao <eric.miao@linaro.org> wrote:
> Signed-off-by: Eric Miao <eric.miao@linaro.org>
> ---
>  arch/arm/mach-imx/clock-imx25.c              |    8 ++++----
>  arch/arm/mach-imx/clock-imx27.c              |    2 +-
>  arch/arm/mach-imx/devices-imx25.h            |    2 +-
>  arch/arm/mach-mx5/clock-mx51-mx53.c          |    4 ++--
>  arch/arm/mach-mx5/devices-imx51.h            |    2 +-
>  arch/arm/plat-mxc/devices/platform-mxc_pwm.c |    4 ++--
>  arch/arm/plat-mxc/pwm.c                      |   19 ++++++++++++++++---
>  7 files changed, 27 insertions(+), 14 deletions(-)

Looks like you missed mx1, mx21, mx31, mx27, mx35 and mx53.
Eric Miao - Sept. 9, 2011, 12:49 a.m.
On Thu, Sep 8, 2011 at 5:42 PM, Fabio Estevam <festevam@gmail.com> wrote:
> On Thu, Sep 8, 2011 at 8:22 PM, Eric Miao <eric.miao@linaro.org> wrote:
>> Signed-off-by: Eric Miao <eric.miao@linaro.org>
>> ---
>>  arch/arm/mach-imx/clock-imx25.c              |    8 ++++----
>>  arch/arm/mach-imx/clock-imx27.c              |    2 +-
>>  arch/arm/mach-imx/devices-imx25.h            |    2 +-
>>  arch/arm/mach-mx5/clock-mx51-mx53.c          |    4 ++--
>>  arch/arm/mach-mx5/devices-imx51.h            |    2 +-
>>  arch/arm/plat-mxc/devices/platform-mxc_pwm.c |    4 ++--
>>  arch/arm/plat-mxc/pwm.c                      |   19 ++++++++++++++++---
>>  7 files changed, 27 insertions(+), 14 deletions(-)
>
> Looks like you missed mx1, mx21, mx31, mx27, mx35 and mx53.

Did a search of 'mxc_pwm' string, but they didn't seem to be there,
which is a bit strange.
Fabio Estevam - Sept. 9, 2011, 1:29 a.m.
On Thu, Sep 8, 2011 at 9:49 PM, Eric Miao <eric.miao@linaro.org> wrote:
> On Thu, Sep 8, 2011 at 5:42 PM, Fabio Estevam <festevam@gmail.com> wrote:
>> On Thu, Sep 8, 2011 at 8:22 PM, Eric Miao <eric.miao@linaro.org> wrote:
>>> Signed-off-by: Eric Miao <eric.miao@linaro.org>
>>> ---
>>>  arch/arm/mach-imx/clock-imx25.c              |    8 ++++----
>>>  arch/arm/mach-imx/clock-imx27.c              |    2 +-
>>>  arch/arm/mach-imx/devices-imx25.h            |    2 +-
>>>  arch/arm/mach-mx5/clock-mx51-mx53.c          |    4 ++--
>>>  arch/arm/mach-mx5/devices-imx51.h            |    2 +-
>>>  arch/arm/plat-mxc/devices/platform-mxc_pwm.c |    4 ++--
>>>  arch/arm/plat-mxc/pwm.c                      |   19 ++++++++++++++++---
>>>  7 files changed, 27 insertions(+), 14 deletions(-)
>>
>> Looks like you missed mx1, mx21, mx31, mx27, mx35 and mx53.
>
> Did a search of 'mxc_pwm' string, but they didn't seem to be there,
> which is a bit strange.

The PWM clock are currently registered differently for each SoC:

On MX21: _REGISTER_CLOCK(NULL, "pwm", pwm_clk[0])
On MX25: _REGISTER_CLOCK("mxc_pwm.0", NULL, pwm1_clk)
On MX27: _REGISTER_CLOCK("mxc_pwm.0", NULL, pwm_clk)
On MX31: _REGISTER_CLOCK(NULL, "pwm", pwm_clk)
On MX35: _REGISTER_CLOCK(NULL, "pwm", pwm_clk)
On MX51:  _REGISTER_CLOCK("mxc_pwm.0", "pwm", pwm1_clk)
Eric Miao - Sept. 9, 2011, 2:46 a.m.
On Thu, Sep 8, 2011 at 6:29 PM, Fabio Estevam <festevam@gmail.com> wrote:
> On Thu, Sep 8, 2011 at 9:49 PM, Eric Miao <eric.miao@linaro.org> wrote:
>> On Thu, Sep 8, 2011 at 5:42 PM, Fabio Estevam <festevam@gmail.com> wrote:
>>> On Thu, Sep 8, 2011 at 8:22 PM, Eric Miao <eric.miao@linaro.org> wrote:
>>>> Signed-off-by: Eric Miao <eric.miao@linaro.org>
>>>> ---
>>>>  arch/arm/mach-imx/clock-imx25.c              |    8 ++++----
>>>>  arch/arm/mach-imx/clock-imx27.c              |    2 +-
>>>>  arch/arm/mach-imx/devices-imx25.h            |    2 +-
>>>>  arch/arm/mach-mx5/clock-mx51-mx53.c          |    4 ++--
>>>>  arch/arm/mach-mx5/devices-imx51.h            |    2 +-
>>>>  arch/arm/plat-mxc/devices/platform-mxc_pwm.c |    4 ++--
>>>>  arch/arm/plat-mxc/pwm.c                      |   19 ++++++++++++++++---
>>>>  7 files changed, 27 insertions(+), 14 deletions(-)
>>>
>>> Looks like you missed mx1, mx21, mx31, mx27, mx35 and mx53.
>>
>> Did a search of 'mxc_pwm' string, but they didn't seem to be there,
>> which is a bit strange.
>
> The PWM clock are currently registered differently for each SoC:
>
> On MX21: _REGISTER_CLOCK(NULL, "pwm", pwm_clk[0])

The NULL pointer should be fixed first then.

> On MX25: _REGISTER_CLOCK("mxc_pwm.0", NULL, pwm1_clk)
> On MX27: _REGISTER_CLOCK("mxc_pwm.0", NULL, pwm_clk)
> On MX31: _REGISTER_CLOCK(NULL, "pwm", pwm_clk)
> On MX35: _REGISTER_CLOCK(NULL, "pwm", pwm_clk)
> On MX51:  _REGISTER_CLOCK("mxc_pwm.0", "pwm", pwm1_clk)
>

Another git grep of the imx_add_mxc_pwm shows:

linux-2.6$ git grep imx_add_mxc_pwm
arch/arm/mach-imx/devices-imx25.h:      imx_add_mxc_pwm("imx25-pwm",
&imx25_mxc_pwm_data[id])
arch/arm/mach-mx5/devices-imx51.h:      imx_add_mxc_pwm("imx51-pwm",
&imx51_mxc_pwm_data[id])
arch/arm/plat-mxc/devices/platform-mxc_pwm.c:struct platform_device
*__init imx_add_mxc_pwm(const char *name,
arch/arm/plat-mxc/include/mach/devices-common.h:struct platform_device
*__init imx_add_mxc_pwm(

So I assume only imx25 and imx51 boards are registering the pwm
device. If other i.mx are registering the mxc_pwm device, they should
have turned up in the 'git grep mxc_pwm' list then, but unfortunately
I didn't find them. Unless it's using even opaque code for the registration??


> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>

Patch

diff --git a/arch/arm/mach-imx/clock-imx25.c b/arch/arm/mach-imx/clock-imx25.c
index b0fec74c..249f1be 100644
--- a/arch/arm/mach-imx/clock-imx25.c
+++ b/arch/arm/mach-imx/clock-imx25.c
@@ -288,10 +288,10 @@  static struct clk_lookup lookups[] = {
 	_REGISTER_CLOCK("imx35-cspi.0", NULL, cspi1_clk)
 	_REGISTER_CLOCK("imx35-cspi.1", NULL, cspi2_clk)
 	_REGISTER_CLOCK("imx35-cspi.2", NULL, cspi3_clk)
-	_REGISTER_CLOCK("mxc_pwm.0", NULL, pwm1_clk)
-	_REGISTER_CLOCK("mxc_pwm.1", NULL, pwm2_clk)
-	_REGISTER_CLOCK("mxc_pwm.2", NULL, pwm3_clk)
-	_REGISTER_CLOCK("mxc_pwm.3", NULL, pwm4_clk)
+	_REGISTER_CLOCK("imx25-pwm.0", NULL, pwm1_clk)
+	_REGISTER_CLOCK("imx25-pwm.1", NULL, pwm2_clk)
+	_REGISTER_CLOCK("imx25-pwm.2", NULL, pwm3_clk)
+	_REGISTER_CLOCK("imx25-pwm.3", NULL, pwm4_clk)
 	_REGISTER_CLOCK("imx-keypad", NULL, kpp_clk)
 	_REGISTER_CLOCK("mx25-adc", NULL, tsc_clk)
 	_REGISTER_CLOCK("imx-i2c.0", NULL, i2c_clk)
diff --git a/arch/arm/mach-imx/clock-imx27.c b/arch/arm/mach-imx/clock-imx27.c
index 88fe00a..3ee46ad 100644
--- a/arch/arm/mach-imx/clock-imx27.c
+++ b/arch/arm/mach-imx/clock-imx27.c
@@ -637,7 +637,7 @@  static struct clk_lookup lookups[] = {
 	_REGISTER_CLOCK(NULL, "gpt4", gpt4_clk)
 	_REGISTER_CLOCK(NULL, "gpt5", gpt5_clk)
 	_REGISTER_CLOCK(NULL, "gpt6", gpt6_clk)
-	_REGISTER_CLOCK("mxc_pwm.0", NULL, pwm_clk)
+	_REGISTER_CLOCK("imx25-pwm.0", NULL, pwm_clk)
 	_REGISTER_CLOCK("mxc-mmc.0", NULL, sdhc1_clk)
 	_REGISTER_CLOCK("mxc-mmc.1", NULL, sdhc2_clk)
 	_REGISTER_CLOCK("mxc-mmc.2", NULL, sdhc3_clk)
diff --git a/arch/arm/mach-imx/devices-imx25.h b/arch/arm/mach-imx/devices-imx25.h
index efa0761..fe09a17 100644
--- a/arch/arm/mach-imx/devices-imx25.h
+++ b/arch/arm/mach-imx/devices-imx25.h
@@ -87,4 +87,4 @@  extern const struct imx_spi_imx_data imx25_cspi_data[];
 
 extern struct imx_mxc_pwm_data imx25_mxc_pwm_data[];
 #define imx25_add_mxc_pwm(id)	\
-	imx_add_mxc_pwm(&imx25_mxc_pwm_data[id])
+	imx_add_mxc_pwm("imx25-pwm", &imx25_mxc_pwm_data[id])
diff --git a/arch/arm/mach-mx5/clock-mx51-mx53.c b/arch/arm/mach-mx5/clock-mx51-mx53.c
index afecd78ce..1a95cf7 100644
--- a/arch/arm/mach-mx5/clock-mx51-mx53.c
+++ b/arch/arm/mach-mx5/clock-mx51-mx53.c
@@ -1437,8 +1437,8 @@  static struct clk_lookup mx51_lookups[] = {
 	_REGISTER_CLOCK(NULL, "gpt", gpt_clk)
 	/* i.mx51 has the i.mx27 type fec */
 	_REGISTER_CLOCK("imx27-fec.0", NULL, fec_clk)
-	_REGISTER_CLOCK("mxc_pwm.0", "pwm", pwm1_clk)
-	_REGISTER_CLOCK("mxc_pwm.1", "pwm", pwm2_clk)
+	_REGISTER_CLOCK("imx51-pwm.0", "pwm", pwm1_clk)
+	_REGISTER_CLOCK("imx51-pwm.1", "pwm", pwm2_clk)
 	_REGISTER_CLOCK("imx-i2c.0", NULL, i2c1_clk)
 	_REGISTER_CLOCK("imx-i2c.1", NULL, i2c2_clk)
 	_REGISTER_CLOCK("imx-i2c.2", NULL, hsi2c_clk)
diff --git a/arch/arm/mach-mx5/devices-imx51.h b/arch/arm/mach-mx5/devices-imx51.h
index 89fe77f..1760810 100644
--- a/arch/arm/mach-mx5/devices-imx51.h
+++ b/arch/arm/mach-mx5/devices-imx51.h
@@ -47,7 +47,7 @@  extern const struct imx_imx2_wdt_data imx51_imx2_wdt_data[];
 
 extern const struct imx_mxc_pwm_data imx51_mxc_pwm_data[];
 #define imx51_add_mxc_pwm(id)	\
-	imx_add_mxc_pwm(&imx51_mxc_pwm_data[id])
+	imx_add_mxc_pwm("imx51-pwm", &imx51_mxc_pwm_data[id])
 
 extern const struct imx_imx_keypad_data imx51_imx_keypad_data;
 #define imx51_add_imx_keypad(pdata)	\
diff --git a/arch/arm/plat-mxc/devices/platform-mxc_pwm.c b/arch/arm/plat-mxc/devices/platform-mxc_pwm.c
index b0c4ae2..e51bbd2 100644
--- a/arch/arm/plat-mxc/devices/platform-mxc_pwm.c
+++ b/arch/arm/plat-mxc/devices/platform-mxc_pwm.c
@@ -49,7 +49,7 @@  const struct imx_mxc_pwm_data imx51_mxc_pwm_data[] __initconst = {
 };
 #endif /* ifdef CONFIG_SOC_IMX51 */
 
-struct platform_device *__init imx_add_mxc_pwm(
+struct platform_device *__init imx_add_mxc_pwm(const char *name,
 		const struct imx_mxc_pwm_data *data)
 {
 	struct resource res[] = {
@@ -64,6 +64,6 @@  struct platform_device *__init imx_add_mxc_pwm(
 		},
 	};
 
-	return imx_add_platform_device("mxc_pwm", data->id,
+	return imx_add_platform_device(name, data->id,
 			res, ARRAY_SIZE(res), NULL, 0);
 }
diff --git a/arch/arm/plat-mxc/pwm.c b/arch/arm/plat-mxc/pwm.c
index 42d74ea..96c9f91 100644
--- a/arch/arm/plat-mxc/pwm.c
+++ b/arch/arm/plat-mxc/pwm.c
@@ -36,7 +36,10 @@ 
 #define MX3_PWMCR_CLKSRC_IPG      (1 << 16)
 #define MX3_PWMCR_EN              (1 << 0)
 
-
+enum {
+	PWM_TYPE_MX1,
+	PWM_TYPE_MX3,
+};
 
 struct pwm_device {
 	struct list_head	node;
@@ -50,6 +53,7 @@  struct pwm_device {
 
 	unsigned int	use_count;
 	unsigned int	pwm_id;
+	int		type;
 };
 
 int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
@@ -57,7 +61,7 @@  int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
 	if (pwm == NULL || period_ns == 0 || duty_ns > period_ns)
 		return -EINVAL;
 
-	if (!(cpu_is_mx1() || cpu_is_mx21())) {
+	if (pwm->type == PWM_TYPE_MX3) {
 		unsigned long long c;
 		unsigned long period_cycles, duty_cycles, prescale;
 		u32 cr;
@@ -85,7 +89,9 @@  int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns)
 			cr |= MX3_PWMCR_CLKSRC_IPG_HIGH;
 
 		writel(cr, pwm->mmio_base + MX3_PWMCR);
-	} else if (cpu_is_mx1() || cpu_is_mx21()) {
+	}
+
+	if (pwm->type == PWM_TYPE_MX1) {
 		/* The PWM subsystem allows for exact frequencies. However,
 		 * I cannot connect a scope on my device to the PWM line and
 		 * thus cannot provide the program the PWM controller
@@ -268,10 +274,17 @@  static int __devexit mxc_pwm_remove(struct platform_device *pdev)
 	return 0;
 }
 
+static const struct platform_device_id mxc_pwm_ids[] = {
+	{ "imx25-pwm", PWM_TYPE_MX3 },
+	{ "imx51-pwm", PWM_TYPE_MX3 },
+	{ },
+};
+
 static struct platform_driver mxc_pwm_driver = {
 	.driver		= {
 		.name	= "mxc_pwm",
 	},
+	.id_table	= mxc_pwm_ids,
 	.probe		= mxc_pwm_probe,
 	.remove		= __devexit_p(mxc_pwm_remove),
 };