ARM: imx: dynamically allocate mxc_pwm devices
authorUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Fri, 5 Nov 2010 14:01:16 +0000 (15:01 +0100)
committerUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Wed, 17 Nov 2010 09:01:28 +0000 (10:01 +0100)
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
arch/arm/mach-imx/devices.c
arch/arm/mach-imx/devices.h
arch/arm/plat-mxc/devices/Kconfig
arch/arm/plat-mxc/devices/Makefile
arch/arm/plat-mxc/devices/platform-mxc_pwm.c [new file with mode: 0644]
arch/arm/plat-mxc/include/mach/devices-common.h

index d78456411f3f7a6a9f8bb7c3f622beedbaeb9376..9ee0e0924f55573aaaf1ccf6297fd512d985e1a4 100644 (file)
@@ -77,25 +77,6 @@ int __init imx1_register_gpios(void)
 #endif
 
 #if defined(CONFIG_MACH_MX21) || defined(CONFIG_MACH_MX27)
-static struct resource mxc_pwm_resources[] = {
-       {
-               .start = MX2x_PWM_BASE_ADDR,
-               .end = MX2x_PWM_BASE_ADDR + SZ_4K - 1,
-               .flags = IORESOURCE_MEM,
-       }, {
-               .start = MX2x_INT_PWM,
-               .end = MX2x_INT_PWM,
-               .flags = IORESOURCE_IRQ,
-       }
-};
-
-struct platform_device mxc_pwm_device = {
-       .name = "mxc_pwm",
-       .id = 0,
-       .num_resources = ARRAY_SIZE(mxc_pwm_resources),
-       .resource = mxc_pwm_resources,
-};
-
 #define DEFINE_MXC_MMC_DEVICE(n, baseaddr, irq, dmareq)                        \
        static struct resource mxc_sdhc_resources ## n[] = {            \
                {                                                       \
index 407e90aa0bc4085c82d7e53f123d35e55e6f91f8..1ba5042067eccbdd7b6f4fbd9da9bb58116b09dc 100644 (file)
@@ -1,5 +1,4 @@
 #if defined(CONFIG_MACH_MX21) || defined(CONFIG_MACH_MX27)
-extern struct platform_device mxc_pwm_device;
 extern struct platform_device mxc_sdhc_device0;
 extern struct platform_device mxc_sdhc_device1;
 extern struct platform_device mxc_otg_udc_device;
index 25423713b49843ed61e0bf06589a0f257670c88a..2ded17b51fc24612aba614a8a8c1d3a5b8027ee5 100644 (file)
@@ -40,6 +40,9 @@ config IMX_HAVE_PLATFORM_MX2_CAMERA
 config IMX_HAVE_PLATFORM_MXC_NAND
        bool
 
+config IMX_HAVE_PLATFORM_MXC_PWM
+       bool
+
 config IMX_HAVE_PLATFORM_MXC_W1
        bool
 
index d3f845eea1cade78e5e38f6736031aa6f388ce93..8ecd974c40e03d33afc9bf3428490d141657afa4 100644 (file)
@@ -12,5 +12,6 @@ obj-$(CONFIG_IMX_HAVE_PLATFORM_IMX_UDC) += platform-imx_udc.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_MX1_CAMERA) += platform-mx1-camera.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_MX2_CAMERA) += platform-mx2-camera.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_MXC_NAND) += platform-mxc_nand.o
+obj-$(CONFIG_IMX_HAVE_PLATFORM_MXC_PWM) += platform-mxc_pwm.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_MXC_W1) += platform-mxc_w1.o
 obj-$(CONFIG_IMX_HAVE_PLATFORM_SPI_IMX) +=  platform-spi_imx.o
diff --git a/arch/arm/plat-mxc/devices/platform-mxc_pwm.c b/arch/arm/plat-mxc/devices/platform-mxc_pwm.c
new file mode 100644 (file)
index 0000000..3ebbc67
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2009-2010 Pengutronix
+ * Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License version 2 as published by the
+ * Free Software Foundation.
+ */
+#include <mach/hardware.h>
+#include <mach/devices-common.h>
+
+#define imx_mxc_pwm_data_entry_single(soc)                             \
+       {                                                               \
+               .iobase = soc ## _PWM_BASE_ADDR,                        \
+               .irq = soc ## _INT_PWM,                                 \
+       }
+
+#ifdef CONFIG_SOC_IMX21
+const struct imx_mxc_pwm_data imx21_mxc_pwm_data __initconst =
+       imx_mxc_pwm_data_entry_single(MX21);
+#endif /* ifdef CONFIG_SOC_IMX21 */
+
+#ifdef CONFIG_SOC_IMX27
+const struct imx_mxc_pwm_data imx27_mxc_pwm_data __initconst =
+       imx_mxc_pwm_data_entry_single(MX27);
+#endif /* ifdef CONFIG_SOC_IMX27 */
+
+struct platform_device *__init imx_add_mxc_pwm(
+               const struct imx_mxc_pwm_data *data)
+{
+       struct resource res[] = {
+               {
+                       .start = data->iobase,
+                       .end = data->iobase + SZ_4K - 1,
+                       .flags = IORESOURCE_MEM,
+               }, {
+                       .start = data->irq,
+                       .end = data->irq,
+                       .flags = IORESOURCE_IRQ,
+               },
+       };
+
+       return imx_add_platform_device("mxc_pwm", 0,
+                       res, ARRAY_SIZE(res), NULL, 0);
+}
index b1d765634860d197ba5ce3ec94d8b36abd07cf68..e241e41e7484ead6d54af4a416c6b6fc08fe5101 100644 (file)
@@ -168,6 +168,13 @@ struct platform_device *__init imx_add_mxc_nand(
                const struct imx_mxc_nand_data *data,
                const struct mxc_nand_platform_data *pdata);
 
+struct imx_mxc_pwm_data {
+       resource_size_t iobase;
+       resource_size_t irq;
+};
+struct platform_device *__init imx_add_mxc_pwm(
+               const struct imx_mxc_pwm_data *data);
+
 struct imx_mxc_w1_data {
        resource_size_t iobase;
 };