OMAP: GPIO: Implement GPIO as a platform device
authorVaradarajan, Charulatha <charu@ti.com>
Wed, 8 Dec 2010 00:26:57 +0000 (16:26 -0800)
committerTony Lindgren <tony@atomide.com>
Wed, 8 Dec 2010 00:26:57 +0000 (16:26 -0800)
Implement GPIO as a platform device.

GPIO APIs are used in machine_init functions. Hence it is
required to complete GPIO probe before board_init. Therefore
GPIO device register and driver register are implemented as
postcore_initcalls.

omap_gpio_init() does nothing now and this function would be
removed in the next patch as it's usage is spread across most
of the board files.

Inorder to convert GPIO as platform device, modifications are
required in clockxxxx_data.c file for OMAP1 so that device names
can be used to obtain clock instead of getting clocks by
name/NULL ptr.

Use runtime pm APIs (pm_runtime_put*/pm_runtime_get*) for enabling
or disabling the clocks, modify sysconfig settings and remove usage
of clock FW APIs.
Note 1: Converting GPIO driver to use runtime PM APIs is not done as a
separate patch because GPIO clock names are different for various OMAPs
and are different for some of the banks in the same CPU. This would need
usage of cpu_is checks and bank id checks while using clock FW APIs in
the gpio driver. Hence while making GPIO a platform driver framework,
PM runtime APIs are used directly.

Note 2: While implementing GPIO as a platform device, pm runtime APIs
are used as mentioned above and modification is not done in gpio's
prepare for idle/ resume after idle functions. This would be done
in the next patch series and GPIO driver would be made to use dev_pm_ops
instead of sysdev_class in that series only.

Due to the above, the GPIO driver implicitly relies on
CM_AUTOIDLE = 1 on its iclk for power management to work, since the
driver never disables its iclk.
This would be taken care in the next patch series (see Note 3 below).

Refer to
http://www.mail-archive.com/linux-omap@vger.kernel.org/msg39112.html
for more details.

Note 3: only pm_runtime_get_sync is called in gpio's probe() and
pm_runtime_put* is never called. This is to make the implementation
similar to the existing GPIO code. Another patch series would be sent
to correct this.

In OMAP3 and OMAP4 gpio's debounce clocks are optional clocks. They
are enabled/ disabled whenever required using clock framework APIs

TODO:
1. Cleanup the GPIO driver. Use function pointers and register
offest pointers instead of using hardcoded values
2. Remove all cpu_is_ checks and OMAP specific macros
3. Remove usage of gpio_bank array so that only
   instance specific information is used in driver code
4. Rename 'method'/ avoid it's usage
5. Fix the non-wakeup gpios handling for OMAP2430, OMAP3 & OMAP4
6. Modify gpio's prepare for idle/ resume after idle functions
   to use runtime pm implentation.

Signed-off-by: Charulatha V <charu@ti.com>
Signed-off-by: Rajendra Nayak <rnayak@ti.com>
Reviewed-by: Basak, Partha <p-basak2@ti.com>
Acked-by: Kevin Hilman <khilman@deeprootsystems.com>
[tony@atomide.com: updated for bank specific revision and updated boards]
Signed-off-by: Tony Lindgren <tony@atomide.com>
43 files changed:
arch/arm/mach-omap1/Makefile
arch/arm/mach-omap1/board-ams-delta.c
arch/arm/mach-omap1/board-fsample.c
arch/arm/mach-omap1/board-h2.c
arch/arm/mach-omap1/board-h3.c
arch/arm/mach-omap1/board-htcherald.c
arch/arm/mach-omap1/board-innovator.c
arch/arm/mach-omap1/board-nokia770.c
arch/arm/mach-omap1/board-osk.c
arch/arm/mach-omap1/board-palmte.c
arch/arm/mach-omap1/board-palmz71.c
arch/arm/mach-omap1/board-perseus2.c
arch/arm/mach-omap1/board-sx1.c
arch/arm/mach-omap1/board-voiceblue.c
arch/arm/mach-omap1/clock_data.c
arch/arm/mach-omap2/Makefile
arch/arm/mach-omap2/board-2430sdp.c
arch/arm/mach-omap2/board-3430sdp.c
arch/arm/mach-omap2/board-3630sdp.c
arch/arm/mach-omap2/board-4430sdp.c
arch/arm/mach-omap2/board-am3517crane.c
arch/arm/mach-omap2/board-am3517evm.c
arch/arm/mach-omap2/board-apollon.c
arch/arm/mach-omap2/board-cm-t35.c
arch/arm/mach-omap2/board-cm-t3517.c
arch/arm/mach-omap2/board-devkit8000.c
arch/arm/mach-omap2/board-h4.c
arch/arm/mach-omap2/board-igep0020.c
arch/arm/mach-omap2/board-igep0030.c
arch/arm/mach-omap2/board-ldp.c
arch/arm/mach-omap2/board-n8x0.c
arch/arm/mach-omap2/board-omap3beagle.c
arch/arm/mach-omap2/board-omap3evm.c
arch/arm/mach-omap2/board-omap3logic.c
arch/arm/mach-omap2/board-omap3pandora.c
arch/arm/mach-omap2/board-omap3stalker.c
arch/arm/mach-omap2/board-omap3touchbook.c
arch/arm/mach-omap2/board-omap4panda.c
arch/arm/mach-omap2/board-overo.c
arch/arm/mach-omap2/board-rx51.c
arch/arm/mach-omap2/board-zoom.c
arch/arm/plat-omap/gpio.c
arch/arm/plat-omap/include/plat/gpio.h

index de3cc130ab8e182dacde7d7e949c4952deeb8216..0b1c07ffa2f1271c9cd05feb7e10b26e006dec7d 100644 (file)
@@ -49,6 +49,12 @@ ifeq ($(CONFIG_ARCH_OMAP15XX),y)
 obj-$(CONFIG_MACH_OMAP_INNOVATOR)      += fpga.o
 endif
 
+# GPIO
+obj-$(CONFIG_ARCH_OMAP730)             += gpio7xx.o
+obj-$(CONFIG_ARCH_OMAP850)             += gpio7xx.o
+obj-$(CONFIG_ARCH_OMAP15XX)            += gpio15xx.o
+obj-$(CONFIG_ARCH_OMAP16XX)            += gpio16xx.o
+
 # LEDs support
 led-$(CONFIG_MACH_OMAP_H2)             += leds-h2p2-debug.o
 led-$(CONFIG_MACH_OMAP_H3)             += leds-h2p2-debug.o
index 9d97a72c5393c6a4a0a5ec18d1c0ba84c97944c9..ce4d69ca15fea54a2e56199d42ec16312bc91311 100644 (file)
@@ -141,7 +141,6 @@ static void __init ams_delta_init_irq(void)
 {
        omap1_init_common_hw();
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static struct map_desc ams_delta_io_desc[] __initdata = {
index 295ab67136707d7107e398d1be408cf0a14d4835..0c3f396328bd45681899cffa5e9b9f0ea915f345 100644 (file)
@@ -327,7 +327,6 @@ static void __init omap_fsample_init_irq(void)
 {
        omap1_init_common_hw();
        omap_init_irq();
-       omap_gpio_init();
 }
 
 /* Only FPGA needs to be mapped here. All others are done with ioremap */
index dd35efdefcf757b4f6c618e30e2caa791610054e..082a73ca55641d0f9687ddeb5fa4f1155eab1c57 100644 (file)
@@ -374,7 +374,6 @@ static void __init h2_init_irq(void)
 {
        omap1_init_common_hw();
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static struct omap_usb_config h2_usb_config __initdata = {
index 78719198809ee09fe458bb32176037bd526d7335..d2cff5022fe5d45d800d3c5ba052223d5d3969c2 100644 (file)
@@ -437,7 +437,6 @@ static void __init h3_init_irq(void)
 {
        omap1_init_common_hw();
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static void __init h3_map_io(void)
index 071af3e4778914400eed44218b4c423071ec8c3f..faa344f734dcd326b0eb0df86e4db2d7d99829ae 100644 (file)
@@ -577,8 +577,6 @@ static void __init htcherald_init(void)
        printk(KERN_INFO "HTC Herald init.\n");
 
        /* Do board initialization before we register all the devices */
-       omap_gpio_init();
-
        omap_board_config = htcherald_config;
        omap_board_config_size = ARRAY_SIZE(htcherald_config);
        platform_add_devices(devices, ARRAY_SIZE(devices));
index 0feaa6731c7e28167c5e13fce84068c01d4521d3..a051acdc526aeff9d5e32a2c32d993fecc49b87f 100644 (file)
@@ -290,7 +290,6 @@ static void __init innovator_init_irq(void)
 {
        omap1_init_common_hw();
        omap_init_irq();
-       omap_gpio_init();
 #ifdef CONFIG_ARCH_OMAP15XX
        if (cpu_is_omap1510()) {
                omap1510_fpga_init_irq();
index aa8375b2a0a3df0778f8ba9680f32d80d61482dd..605495bbc58302215e5aa7571885951f95848246 100644 (file)
@@ -246,7 +246,6 @@ static void __init omap_nokia770_init(void)
        platform_add_devices(nokia770_devices, ARRAY_SIZE(nokia770_devices));
        spi_register_board_info(nokia770_spi_board_info,
                                ARRAY_SIZE(nokia770_spi_board_info));
-       omap_gpio_init();
        omap_serial_init();
        omap_register_i2c_bus(1, 100, NULL, 0);
        hwa742_dev_init();
index 30bdbdb936361b64fb2172106b75b4c2100fddf6..d44e7172efc2031a9317d7ce8adfa2e9a08be659 100644 (file)
@@ -283,7 +283,6 @@ static void __init osk_init_irq(void)
 {
        omap1_init_common_hw();
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static struct omap_usb_config osk_usb_config __initdata = {
index f32738b1eb6bcce83a8e20fcb9d9121270a876a9..994dc6f50729831e8ebfb2b2e1199eee97025f2c 100644 (file)
@@ -63,7 +63,6 @@ static void __init omap_palmte_init_irq(void)
 {
        omap1_init_common_hw();
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static const int palmte_keymap[] = {
index d7a245cef9a426ba180708b222c16efbcfce1cdd..2afac598baee889c76b3e8cb8f2ad86e36b29b07 100644 (file)
@@ -62,7 +62,6 @@ omap_palmz71_init_irq(void)
 {
        omap1_init_common_hw();
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static int palmz71_keymap[] = {
index 07660be4f2289d719a40f3404675e98e07811ebc..69fda218fb4551cea4ddeeb1f925b2eaa74d7bf7 100644 (file)
@@ -295,7 +295,6 @@ static void __init omap_perseus2_init_irq(void)
 {
        omap1_init_common_hw();
        omap_init_irq();
-       omap_gpio_init();
 }
 /* Only FPGA needs to be mapped here. All others are done with ioremap */
 static struct map_desc omap_perseus2_io_desc[] __initdata = {
index d25f59e5a7733ca79c23b18662bf701aa49f936b..463862c67819b6c48b0a50c983693a92f931e59c 100644 (file)
@@ -409,7 +409,6 @@ static void __init omap_sx1_init_irq(void)
 {
        omap1_init_common_hw();
        omap_init_irq();
-       omap_gpio_init();
 }
 /*----------------------------------------*/
 
index f5992c239bcd18b3a773b732fc6787b804acd7e3..789f5bac73595655d255c04e2dbff195f8cb203f 100644 (file)
@@ -158,7 +158,6 @@ static void __init voiceblue_init_irq(void)
 {
        omap1_init_common_hw();
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static void __init voiceblue_init(void)
index af54114b8f08660c447a35fbc2d4fbbb2482df69..423d21d8c19047c04c6a09ac69cf91a1885f136c 100644 (file)
@@ -143,7 +143,7 @@ static struct arm_idlect1_clk armper_ck = {
  * activation.  [ GPIO code for 1510 ]
  */
 static struct clk arm_gpio_ck = {
-       .name           = "arm_gpio_ck",
+       .name           = "ick",
        .ops            = &clkops_generic,
        .parent         = &ck_dpll1,
        .flags          = ENABLE_ON_INIT,
@@ -684,7 +684,7 @@ static struct omap_clk omap_clks[] = {
        CLK(NULL,       "ck_sossi",     &sossi_ck,      CK_16XX),
        CLK(NULL,       "arm_ck",       &arm_ck,        CK_16XX | CK_1510 | CK_310),
        CLK(NULL,       "armper_ck",    &armper_ck.clk, CK_16XX | CK_1510 | CK_310),
-       CLK(NULL,       "arm_gpio_ck",  &arm_gpio_ck,   CK_1510 | CK_310),
+       CLK("omap_gpio.0", "ick",       &arm_gpio_ck,   CK_1510 | CK_310),
        CLK(NULL,       "armxor_ck",    &armxor_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),
        CLK(NULL,       "armtim_ck",    &armtim_ck.clk, CK_16XX | CK_1510 | CK_310),
        CLK("omap_wdt", "fck",          &armwdt_ck.clk, CK_16XX | CK_1510 | CK_310),
index ce7b1f0176707ec49c9f57f87fc0cc2b622877cf..fbc87395a02507287934f2e7be08cfe68263f3a1 100644 (file)
@@ -4,7 +4,7 @@
 
 # Common support
 obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer-gp.o pm.o \
-        common.o
+        common.o gpio.o
 
 omap-2-3-common                                = irq.o sdrc.o prm2xxx_3xxx.o
 hwmod-common                           = omap_hwmod.o \
index b527f8d187ad571f3d3ee7e04514393f1891f2b7..0f14001c164198362246eee272fdd19ff4584988 100644 (file)
@@ -145,7 +145,6 @@ static void __init omap_2430sdp_init_irq(void)
        omap_board_config_size = ARRAY_SIZE(sdp2430_config);
        omap2_init_common_hw(NULL, NULL);
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static struct twl4030_gpio_platform_data sdp2430_gpio_data = {
index 4e3742c512b81f3da619c7cb9895bad8fe61b39e..5cb23f3d4fc0dbb2576c72a9144734866bee03a4 100644 (file)
@@ -328,7 +328,6 @@ static void __init omap_3430sdp_init_irq(void)
        omap3_pm_init_cpuidle(omap3_cpuidle_params_table);
        omap2_init_common_hw(hyb18m512160af6_sdrc_params, NULL);
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static int sdp3430_batt_table[] = {
index bbcf580fa097101056b1fc98545fd5cae9c1fdf8..b23f401aa6b6c0b34ba4a92f0f2ceb5187f29311 100644 (file)
@@ -76,7 +76,6 @@ static void __init omap_sdp_init_irq(void)
        omap2_init_common_hw(h8mbx00u0mer0em_sdrc_params,
                        h8mbx00u0mer0em_sdrc_params);
        omap_init_irq();
-       omap_gpio_init();
 }
 
 #ifdef CONFIG_OMAP_MUX
index 94d989bee8ad0594feee3af4289ab56b34f541f9..8842ec5e51e36d73a2fafc7d99aa64f8a68ed76f 100644 (file)
@@ -223,7 +223,6 @@ static void __init omap_4430sdp_init_irq(void)
        omap2_gp_clockevent_set_gptimer(1);
 #endif
        gic_init_irq();
-       omap_gpio_init();
 }
 
 static struct omap_musb_board_data musb_board_data = {
index 13ead330e389aebc2fd313877f7a96bde4c8c056..8ba404770e75fe86584ecbc9db42b5970b770a5b 100644 (file)
@@ -19,7 +19,6 @@
 
 #include <linux/kernel.h>
 #include <linux/init.h>
-#include <linux/gpio.h>
 
 #include <mach/hardware.h>
 #include <asm/mach-types.h>
@@ -50,7 +49,6 @@ static void __init am3517_crane_init_irq(void)
 
        omap2_init_common_hw(NULL, NULL);
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static void __init am3517_crane_init(void)
index 07399505312b19fac8331d1d0b5367e85418a422..df6900e8ad5a09d7897cb69efb1144c44bef5f14 100644 (file)
@@ -392,7 +392,6 @@ static void __init am3517_evm_init_irq(void)
 
        omap2_init_common_hw(NULL, NULL);
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static struct omap_musb_board_data musb_board_data = {
index 6ae777e088961ed5a1bcca274c1a784707225f6f..f51f4f1e07f788875e4a9731832f728096e44012 100644 (file)
@@ -280,7 +280,6 @@ static void __init omap_apollon_init_irq(void)
        omap_board_config_size = ARRAY_SIZE(apollon_config);
        omap2_init_common_hw(NULL, NULL);
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static void __init apollon_led_init(void)
index 63f764e2af3ff31c9b5edceb6da2e9dcc307cd90..78b67fb790bf281f8498c0d29144f5bca271ff3f 100644 (file)
@@ -686,7 +686,6 @@ static void __init cm_t35_init_irq(void)
        omap2_init_common_hw(mt46h32m32lf6_sdrc_params,
                             mt46h32m32lf6_sdrc_params);
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static struct omap_board_mux board_mux[] __initdata = {
index 1dd303e9a267a34158b6d5cbb6904743ae2db155..7ee23dab84fe8156ecff7533fb7f4d7051fab0ad 100644 (file)
@@ -250,7 +250,6 @@ static void __init cm_t3517_init_irq(void)
 
        omap2_init_common_hw(NULL, NULL);
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static struct omap_board_mux board_mux[] __initdata = {
index 53ac762518bd7361c28833b626ef06ac5a836996..a30a7fce8cbfb7841f1c0050b1c5103e757a6b92 100644 (file)
@@ -450,7 +450,6 @@ static void __init devkit8000_init_irq(void)
 #ifdef CONFIG_OMAP_32K_TIMER
        omap2_gp_clockevent_set_gptimer(12);
 #endif
-       omap_gpio_init();
 }
 
 static void __init devkit8000_ads7846_init(void)
index 929993b4bf26bbb77cbcb385a570d15adc50f231..68e6f4c8e00af2c4068871288f98f1c1c516b394 100644 (file)
@@ -293,7 +293,6 @@ static void __init omap_h4_init_irq(void)
        omap_board_config_size = ARRAY_SIZE(h4_config);
        omap2_init_common_hw(NULL, NULL);
        omap_init_irq();
-       omap_gpio_init();
        h4_init_flash();
 }
 
index fe76b59b13edb80a80e14f38c45a27e20107023d..3bda186fe6777d54413a5ed491534c8fa59de587 100644 (file)
@@ -484,7 +484,6 @@ static void __init igep2_init_irq(void)
 {
        omap2_init_common_hw(m65kxxxxam_sdrc_params, m65kxxxxam_sdrc_params);
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static struct twl4030_codec_audio_data igep2_audio_data = {
index 22b0b253e16b4cc0858fcc8608172692155f6f7c..c7c57cdf83d623978e8cdcaeedb6db03e3e19508 100644 (file)
@@ -291,7 +291,6 @@ static void __init igep3_init_irq(void)
 {
        omap2_init_common_hw(m65kxxxxam_sdrc_params, m65kxxxxam_sdrc_params);
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static struct twl4030_platform_data igep3_twl4030_pdata = {
index 3dab44e3eb4255638026670d4cf4a4a6066ccb6a..d97e3caed7c0fc1e8e0ef0b40842dcc84a5f2be5 100644 (file)
@@ -294,7 +294,6 @@ static void __init omap_ldp_init_irq(void)
        omap_board_config_size = ARRAY_SIZE(ldp_config);
        omap2_init_common_hw(NULL, NULL);
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static struct twl4030_usb_data ldp_usb_data = {
index e823c7042ab31271145959530454b05dfb7830eb..d8a489338e0c2887ebb5100426b52ccbf1ab01c4 100644 (file)
@@ -641,7 +641,6 @@ static void __init n8x0_init_irq(void)
 {
        omap2_init_common_hw(NULL, NULL);
        omap_init_irq();
-       omap_gpio_init();
 }
 
 #ifdef CONFIG_OMAP_MUX
index 14f42240ae792bf01fcd289d60d441d9d55eb328..a4131bef50fbcee778c2dc5883376eb7bc983edb 100644 (file)
@@ -490,7 +490,6 @@ static void __init omap3_beagle_init_irq(void)
 #ifdef CONFIG_OMAP_32K_TIMER
        omap2_gp_clockevent_set_gptimer(12);
 #endif
-       omap_gpio_init();
 }
 
 static struct platform_device *omap3_beagle_devices[] __initdata = {
index b04365c6bb10895e4ebdf45fd5fa8465c722e518..5ca02202d6086a6c42e380e54fc63b27d24a74d0 100644 (file)
@@ -625,7 +625,6 @@ static void __init omap3_evm_init_irq(void)
        omap_board_config_size = ARRAY_SIZE(omap3_evm_config);
        omap2_init_common_hw(mt46h32m32lf6_sdrc_params, NULL);
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static struct platform_device *omap3_evm_devices[] __initdata = {
index 5f7d2c1e7ef5e90d211425eac739a609b70a0e28..263294044c7eac8784ad45f91c38f4007afa1a15 100644 (file)
@@ -199,7 +199,6 @@ static void __init omap3logic_init_irq(void)
 {
        omap2_init_common_hw(NULL, NULL);
        omap_init_irq();
-       omap_gpio_init();
 }
 
 #ifdef CONFIG_OMAP_MUX
index 89ed1be2d62e0d7214ef968e44d73170ebe35a22..1031d7cadb3a48d28a7f37dd4dd676869bb99487 100644 (file)
@@ -639,7 +639,6 @@ static void __init omap3pandora_init_irq(void)
        omap2_init_common_hw(mt46h32m32lf6_sdrc_params,
                             mt46h32m32lf6_sdrc_params);
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static void pandora_wl1251_set_power(bool enable)
index f2527212541347afc144cc1c2df375304c6ce6a1..ea13e2aeeec5824c11d28a2cf4b1be38a8bf4543 100644 (file)
@@ -589,7 +589,6 @@ static void __init omap3_stalker_init_irq(void)
 #ifdef CONFIG_OMAP_32K_TIMER
        omap2_gp_clockevent_set_gptimer(12);
 #endif
-       omap_gpio_init();
 }
 
 static struct platform_device *omap3_stalker_devices[] __initdata = {
index 41104bb8774cf3a42fa96996ae4376b4624449cf..2339964058ccc2b8daa7670cc1b003ee13e2ebac 100644 (file)
@@ -428,7 +428,6 @@ static void __init omap3_touchbook_init_irq(void)
 #ifdef CONFIG_OMAP_32K_TIMER
        omap2_gp_clockevent_set_gptimer(12);
 #endif
-       omap_gpio_init();
 }
 
 static struct platform_device *omap3_touchbook_devices[] __initdata = {
index 801f8146b00c9162c0a298599e223adb642f2712..38f942beb121ed3bdb667d7f588f43b49889b1d6 100644 (file)
@@ -79,7 +79,6 @@ static void __init omap4_panda_init_irq(void)
 {
        omap2_init_common_hw(NULL, NULL);
        gic_init_irq();
-       omap_gpio_init();
 }
 
 static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
index 7053bc0b46dbf4531387990a7d4019551533c693..805b783933932b5951946e765d8cb252c4a511d7 100644 (file)
@@ -416,7 +416,6 @@ static void __init overo_init_irq(void)
        omap2_init_common_hw(mt46h32m32lf6_sdrc_params,
                             mt46h32m32lf6_sdrc_params);
        omap_init_irq();
-       omap_gpio_init();
 }
 
 static struct platform_device *overo_devices[] __initdata = {
index 36f2cf4efd57630b593bf42ca28965891c14f906..1c3b0795c6e2aeb2e8f61dc551faa8d4e86271d7 100644 (file)
@@ -108,7 +108,6 @@ static void __init rx51_init_irq(void)
        sdrc_params = rx51_get_sdram_timings();
        omap2_init_common_hw(sdrc_params, sdrc_params);
        omap_init_irq();
-       omap_gpio_init();
 }
 
 extern void __init rx51_peripherals_init(void);
index 3da69e4102a4a23b21331872f3915543a1a43196..abd864a50b4eac026756681a6e488d2ee6452cbd 100644 (file)
@@ -43,7 +43,6 @@ static void __init omap_zoom_init_irq(void)
                                h8mbx00u0mer0em_sdrc_params);
 
        omap_init_irq();
-       omap_gpio_init();
 }
 
 #ifdef CONFIG_OMAP_MUX
index 2b0d90109828ca384e485121284836d526997433..6f53dee98a91e0349547545a6fc42774bd21d807 100644 (file)
@@ -21,6 +21,8 @@
 #include <linux/err.h>
 #include <linux/clk.h>
 #include <linux/io.h>
+#include <linux/slab.h>
+#include <linux/pm_runtime.h>
 
 #include <mach/hardware.h>
 #include <asm/irq.h>
@@ -32,7 +34,6 @@
 /*
  * OMAP1510 GPIO registers
  */
-#define OMAP1510_GPIO_BASE             0xfffce000
 #define OMAP1510_GPIO_DATA_INPUT       0x00
 #define OMAP1510_GPIO_DATA_OUTPUT      0x04
 #define OMAP1510_GPIO_DIR_CONTROL      0x08
 /*
  * OMAP1610 specific GPIO registers
  */
-#define OMAP1610_GPIO1_BASE            0xfffbe400
-#define OMAP1610_GPIO2_BASE            0xfffbec00
-#define OMAP1610_GPIO3_BASE            0xfffbb400
-#define OMAP1610_GPIO4_BASE            0xfffbbc00
 #define OMAP1610_GPIO_REVISION         0x0000
 #define OMAP1610_GPIO_SYSCONFIG                0x0010
 #define OMAP1610_GPIO_SYSSTATUS                0x0014
 /*
  * OMAP7XX specific GPIO registers
  */
-#define OMAP7XX_GPIO1_BASE             0xfffbc000
-#define OMAP7XX_GPIO2_BASE             0xfffbc800
-#define OMAP7XX_GPIO3_BASE             0xfffbd000
-#define OMAP7XX_GPIO4_BASE             0xfffbd800
-#define OMAP7XX_GPIO5_BASE             0xfffbe000
-#define OMAP7XX_GPIO6_BASE             0xfffbe800
 #define OMAP7XX_GPIO_DATA_INPUT                0x00
 #define OMAP7XX_GPIO_DATA_OUTPUT       0x04
 #define OMAP7XX_GPIO_DIR_CONTROL       0x08
 #define OMAP7XX_GPIO_INT_MASK          0x10
 #define OMAP7XX_GPIO_INT_STATUS                0x14
 
-#define OMAP1_MPUIO_VBASE              OMAP1_MPUIO_BASE
-
 /*
- * omap24xx specific GPIO registers
+ * omap2+ specific GPIO registers
  */
-#define OMAP242X_GPIO1_BASE            0x48018000
-#define OMAP242X_GPIO2_BASE            0x4801a000
-#define OMAP242X_GPIO3_BASE            0x4801c000
-#define OMAP242X_GPIO4_BASE            0x4801e000
-
-#define OMAP243X_GPIO1_BASE            0x4900C000
-#define OMAP243X_GPIO2_BASE            0x4900E000
-#define OMAP243X_GPIO3_BASE            0x49010000
-#define OMAP243X_GPIO4_BASE            0x49012000
-#define OMAP243X_GPIO5_BASE            0x480B6000
-
 #define OMAP24XX_GPIO_REVISION         0x0000
-#define OMAP24XX_GPIO_SYSCONFIG                0x0010
-#define OMAP24XX_GPIO_SYSSTATUS                0x0014
 #define OMAP24XX_GPIO_IRQSTATUS1       0x0018
 #define OMAP24XX_GPIO_IRQSTATUS2       0x0028
 #define OMAP24XX_GPIO_IRQENABLE2       0x002c
 #define OMAP24XX_GPIO_SETDATAOUT       0x0094
 
 #define OMAP4_GPIO_REVISION            0x0000
-#define OMAP4_GPIO_SYSCONFIG           0x0010
 #define OMAP4_GPIO_EOI                 0x0020
 #define OMAP4_GPIO_IRQSTATUSRAW0       0x0024
 #define OMAP4_GPIO_IRQSTATUSRAW1       0x0028
 #define OMAP4_GPIO_IRQSTATUSCLR1       0x0040
 #define OMAP4_GPIO_IRQWAKEN0           0x0044
 #define OMAP4_GPIO_IRQWAKEN1           0x0048
-#define OMAP4_GPIO_SYSSTATUS           0x0114
 #define OMAP4_GPIO_IRQENABLE1          0x011c
 #define OMAP4_GPIO_WAKE_EN             0x0120
 #define OMAP4_GPIO_IRQSTATUS2          0x0128
 #define OMAP4_GPIO_SETWKUENA           0x0184
 #define OMAP4_GPIO_CLEARDATAOUT                0x0190
 #define OMAP4_GPIO_SETDATAOUT          0x0194
-/*
- * omap34xx specific GPIO registers
- */
-
-#define OMAP34XX_GPIO1_BASE            0x48310000
-#define OMAP34XX_GPIO2_BASE            0x49050000
-#define OMAP34XX_GPIO3_BASE            0x49052000
-#define OMAP34XX_GPIO4_BASE            0x49054000
-#define OMAP34XX_GPIO5_BASE            0x49056000
-#define OMAP34XX_GPIO6_BASE            0x49058000
-
-/*
- * OMAP44XX  specific GPIO registers
- */
-#define OMAP44XX_GPIO1_BASE             0x4a310000
-#define OMAP44XX_GPIO2_BASE             0x48055000
-#define OMAP44XX_GPIO3_BASE             0x48057000
-#define OMAP44XX_GPIO4_BASE             0x48059000
-#define OMAP44XX_GPIO5_BASE             0x4805B000
-#define OMAP44XX_GPIO6_BASE             0x4805D000
 
 struct gpio_bank {
        unsigned long pbase;
@@ -203,97 +157,12 @@ struct gpio_bank {
        struct clk *dbck;
        u32 mod_usage;
        u32 dbck_enable_mask;
+       struct device *dev;
+       bool dbck_flag;
 };
 
-#ifdef CONFIG_ARCH_OMAP16XX
-static struct gpio_bank gpio_bank_1610[5] = {
-       { OMAP1_MPUIO_VBASE, NULL, INT_MPUIO, IH_MPUIO_BASE,
-               METHOD_MPUIO },
-       { OMAP1610_GPIO1_BASE, NULL, INT_GPIO_BANK1, IH_GPIO_BASE,
-               METHOD_GPIO_1610 },
-       { OMAP1610_GPIO2_BASE, NULL, INT_1610_GPIO_BANK2, IH_GPIO_BASE + 16,
-               METHOD_GPIO_1610 },
-       { OMAP1610_GPIO3_BASE, NULL, INT_1610_GPIO_BANK3, IH_GPIO_BASE + 32,
-               METHOD_GPIO_1610 },
-       { OMAP1610_GPIO4_BASE, NULL, INT_1610_GPIO_BANK4, IH_GPIO_BASE + 48,
-               METHOD_GPIO_1610 },
-};
-#endif
-
-#ifdef CONFIG_ARCH_OMAP15XX
-static struct gpio_bank gpio_bank_1510[2] = {
-       { OMAP1_MPUIO_VBASE, NULL, INT_MPUIO, IH_MPUIO_BASE,
-               METHOD_MPUIO },
-       { OMAP1510_GPIO_BASE, NULL, INT_GPIO_BANK1, IH_GPIO_BASE,
-               METHOD_GPIO_1510 }
-};
-#endif
-
-#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
-static struct gpio_bank gpio_bank_7xx[7] = {
-       { OMAP1_MPUIO_VBASE, NULL, INT_7XX_MPUIO, IH_MPUIO_BASE,
-               METHOD_MPUIO },
-       { OMAP7XX_GPIO1_BASE, NULL, INT_7XX_GPIO_BANK1, IH_GPIO_BASE,
-               METHOD_GPIO_7XX },
-       { OMAP7XX_GPIO2_BASE, NULL, INT_7XX_GPIO_BANK2, IH_GPIO_BASE + 32,
-               METHOD_GPIO_7XX },
-       { OMAP7XX_GPIO3_BASE, NULL, INT_7XX_GPIO_BANK3, IH_GPIO_BASE + 64,
-               METHOD_GPIO_7XX },
-       { OMAP7XX_GPIO4_BASE, NULL, INT_7XX_GPIO_BANK4,  IH_GPIO_BASE + 96,
-               METHOD_GPIO_7XX },
-       { OMAP7XX_GPIO5_BASE, NULL, INT_7XX_GPIO_BANK5,  IH_GPIO_BASE + 128,
-               METHOD_GPIO_7XX },
-       { OMAP7XX_GPIO6_BASE, NULL, INT_7XX_GPIO_BANK6,  IH_GPIO_BASE + 160,
-               METHOD_GPIO_7XX },
-};
-#endif
-
-#ifdef CONFIG_ARCH_OMAP2
-
-static struct gpio_bank gpio_bank_242x[4] = {
-       { OMAP242X_GPIO1_BASE, NULL, INT_24XX_GPIO_BANK1, IH_GPIO_BASE,
-               METHOD_GPIO_24XX },
-       { OMAP242X_GPIO2_BASE, NULL, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32,
-               METHOD_GPIO_24XX },
-       { OMAP242X_GPIO3_BASE, NULL, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64,
-               METHOD_GPIO_24XX },
-       { OMAP242X_GPIO4_BASE, NULL, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96,
-               METHOD_GPIO_24XX },
-};
-
-static struct gpio_bank gpio_bank_243x[5] = {
-       { OMAP243X_GPIO1_BASE, NULL, INT_24XX_GPIO_BANK1, IH_GPIO_BASE,
-               METHOD_GPIO_24XX },
-       { OMAP243X_GPIO2_BASE, NULL, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32,
-               METHOD_GPIO_24XX },
-       { OMAP243X_GPIO3_BASE, NULL, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64,
-               METHOD_GPIO_24XX },
-       { OMAP243X_GPIO4_BASE, NULL, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96,
-               METHOD_GPIO_24XX },
-       { OMAP243X_GPIO5_BASE, NULL, INT_24XX_GPIO_BANK5, IH_GPIO_BASE + 128,
-               METHOD_GPIO_24XX },
-};
-
-#endif
-
 #ifdef CONFIG_ARCH_OMAP3
-static struct gpio_bank gpio_bank_34xx[6] = {
-       { OMAP34XX_GPIO1_BASE, NULL, INT_34XX_GPIO_BANK1, IH_GPIO_BASE,
-               METHOD_GPIO_24XX },
-       { OMAP34XX_GPIO2_BASE, NULL, INT_34XX_GPIO_BANK2, IH_GPIO_BASE + 32,
-               METHOD_GPIO_24XX },
-       { OMAP34XX_GPIO3_BASE, NULL, INT_34XX_GPIO_BANK3, IH_GPIO_BASE + 64,
-               METHOD_GPIO_24XX },
-       { OMAP34XX_GPIO4_BASE, NULL, INT_34XX_GPIO_BANK4, IH_GPIO_BASE + 96,
-               METHOD_GPIO_24XX },
-       { OMAP34XX_GPIO5_BASE, NULL, INT_34XX_GPIO_BANK5, IH_GPIO_BASE + 128,
-               METHOD_GPIO_24XX },
-       { OMAP34XX_GPIO6_BASE, NULL, INT_34XX_GPIO_BANK6, IH_GPIO_BASE + 160,
-               METHOD_GPIO_24XX },
-};
-
 struct omap3_gpio_regs {
-       u32 sysconfig;
        u32 irqenable1;
        u32 irqenable2;
        u32 wake_en;
@@ -309,25 +178,14 @@ struct omap3_gpio_regs {
 static struct omap3_gpio_regs gpio_context[OMAP34XX_NR_GPIOS];
 #endif
 
-#ifdef CONFIG_ARCH_OMAP4
-static struct gpio_bank gpio_bank_44xx[6] = {
-       { OMAP44XX_GPIO1_BASE, NULL, OMAP44XX_IRQ_GPIO1, IH_GPIO_BASE,
-               METHOD_GPIO_44XX },
-       { OMAP44XX_GPIO2_BASE, NULL, OMAP44XX_IRQ_GPIO2, IH_GPIO_BASE + 32,
-               METHOD_GPIO_44XX },
-       { OMAP44XX_GPIO3_BASE, NULL, OMAP44XX_IRQ_GPIO3, IH_GPIO_BASE + 64,
-               METHOD_GPIO_44XX },
-       { OMAP44XX_GPIO4_BASE, NULL, OMAP44XX_IRQ_GPIO4, IH_GPIO_BASE + 96,
-               METHOD_GPIO_44XX },
-       { OMAP44XX_GPIO5_BASE, NULL, OMAP44XX_IRQ_GPIO5, IH_GPIO_BASE + 128,
-               METHOD_GPIO_44XX },
-       { OMAP44XX_GPIO6_BASE, NULL, OMAP44XX_IRQ_GPIO6, IH_GPIO_BASE + 160,
-               METHOD_GPIO_44XX },
-};
+/*
+ * TODO: Cleanup gpio_bank usage as it is having information
+ * related to all instances of the device
+ */
+static struct gpio_bank *gpio_bank;
 
-#endif
+static int bank_width;
 
-static struct gpio_bank *gpio_bank;
 /* TODO: Analyze removing gpio_bank_count usage from driver code */
 int gpio_bank_count;
 
@@ -634,6 +492,9 @@ static void _set_gpio_debounce(struct gpio_bank *bank, unsigned gpio,
        u32                     val;
        u32                     l;
 
+       if (!bank->dbck_flag)
+               return;
+
        if (debounce < 32)
                debounce = 0x01;
        else if (debounce > 7936)
@@ -643,7 +504,7 @@ static void _set_gpio_debounce(struct gpio_bank *bank, unsigned gpio,
 
        l = 1 << get_gpio_index(gpio);
 
-       if (cpu_is_omap44xx())
+       if (bank->method == METHOD_GPIO_44XX)
                reg += OMAP4_GPIO_DEBOUNCINGTIME;
        else
                reg += OMAP24XX_GPIO_DEBOUNCE_VAL;
@@ -651,7 +512,7 @@ static void _set_gpio_debounce(struct gpio_bank *bank, unsigned gpio,
        __raw_writel(debounce, reg);
 
        reg = bank->base;
-       if (cpu_is_omap44xx())
+       if (bank->method == METHOD_GPIO_44XX)
                reg += OMAP4_GPIO_DEBOUNCENABLE;
        else
                reg += OMAP24XX_GPIO_DEBOUNCE_EN;
@@ -660,12 +521,10 @@ static void _set_gpio_debounce(struct gpio_bank *bank, unsigned gpio,
 
        if (debounce) {
                val |= l;
-               if (cpu_is_omap34xx() || cpu_is_omap44xx())
-                       clk_enable(bank->dbck);
+               clk_enable(bank->dbck);
        } else {
                val &= ~l;
-               if (cpu_is_omap34xx() || cpu_is_omap44xx())
-                       clk_disable(bank->dbck);
+               clk_disable(bank->dbck);
        }
        bank->dbck_enable_mask = val;
 
@@ -1537,7 +1396,8 @@ static struct platform_device omap_mpuio_device = {
 
 static inline void mpuio_init(void)
 {
-       platform_set_drvdata(&omap_mpuio_device, &gpio_bank_1610[0]);
+       struct gpio_bank *bank = get_gpio_bank(OMAP_MPUIO(0));
+       platform_set_drvdata(&omap_mpuio_device, bank);
 
        if (platform_driver_register(&omap_mpuio_driver) == 0)
                (void) platform_device_register(&omap_mpuio_device);
@@ -1642,6 +1502,13 @@ static int gpio_debounce(struct gpio_chip *chip, unsigned offset,
        unsigned long flags;
 
        bank = container_of(chip, struct gpio_bank, chip);
+
+       if (!bank->dbck) {
+               bank->dbck = clk_get(bank->dev, "dbclk");
+               if (IS_ERR(bank->dbck))
+                       dev_err(bank->dev, "Could not get gpio dbck\n");
+       }
+
        spin_lock_irqsave(&bank->lock, flags);
        _set_gpio_debounce(bank, offset, debounce);
        spin_unlock_irqrestore(&bank->lock, flags);
@@ -1670,24 +1537,6 @@ static int gpio_2irq(struct gpio_chip *chip, unsigned offset)
 
 /*---------------------------------------------------------------------*/
 
-static int initialized;
-#if defined(CONFIG_ARCH_OMAP1) || defined(CONFIG_ARCH_OMAP2)
-static struct clk * gpio_ick;
-#endif
-
-#if defined(CONFIG_ARCH_OMAP2)
-static struct clk * gpio_fck;
-#endif
-
-#if defined(CONFIG_ARCH_OMAP2430)
-static struct clk * gpio5_ick;
-static struct clk * gpio5_fck;
-#endif
-
-#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
-static struct clk *gpio_iclks[OMAP34XX_NR_GPIOS];
-#endif
-
 static void __init omap_gpio_show_rev(struct gpio_bank *bank)
 {
        u32 rev;
@@ -1710,6 +1559,19 @@ static void __init omap_gpio_show_rev(struct gpio_bank *bank)
  */
 static struct lock_class_key gpio_lock_class;
 
+static inline int init_gpio_info(struct platform_device *pdev)
+{
+       /* TODO: Analyze removing gpio_bank_count usage from driver code */
+       gpio_bank = kzalloc(gpio_bank_count * sizeof(struct gpio_bank),
+                               GFP_KERNEL);
+       if (!gpio_bank) {
+               dev_err(&pdev->dev, "Memory alloc failed for gpio_bank\n");
+               return -ENOMEM;
+       }
+       return 0;
+}
+
+/* TODO: Cleanup cpu_is_* checks */
 static void omap_gpio_mod_init(struct gpio_bank *bank, int id)
 {
        if (cpu_class_is_omap2()) {
@@ -1773,16 +1635,9 @@ static void omap_gpio_mod_init(struct gpio_bank *bank, int id)
 
 static void __init omap_gpio_chip_init(struct gpio_bank *bank)
 {
-       int j, bank_width = 16;
+       int j;
        static int gpio;
 
-       if (cpu_is_omap7xx() && bank->method == METHOD_GPIO_7XX)
-               bank_width = 32; /* 7xx has 32-bit GPIOs */
-
-       if ((bank->method == METHOD_GPIO_24XX) ||
-                       (bank->method == METHOD_GPIO_44XX))
-               bank_width = 32;
-
        bank->mod_usage = 0;
        /*
         * REVISIT eventually switch from OMAP-specific gpio structs
@@ -1826,139 +1681,68 @@ static void __init omap_gpio_chip_init(struct gpio_bank *bank)
        set_irq_data(bank->irq, bank);
 }
 
-static int __init _omap_gpio_init(void)
+static int __devinit omap_gpio_probe(struct platform_device *pdev)
 {
-       int i;
+       static int gpio_init_done;
+       struct omap_gpio_platform_data *pdata;
+       struct resource *res;
+       int id;
        struct gpio_bank *bank;
-       int bank_size = SZ_8K;  /* Module 4KB + L4 4KB except on omap1 */
-       char clk_name[11];
 
-       initialized = 1;
+       if (!pdev->dev.platform_data)
+               return -EINVAL;
 
-#if defined(CONFIG_ARCH_OMAP1)
-       if (cpu_is_omap15xx()) {
-               gpio_ick = clk_get(NULL, "arm_gpio_ck");
-               if (IS_ERR(gpio_ick))
-                       printk("Could not get arm_gpio_ck\n");
-               else
-                       clk_enable(gpio_ick);
-       }
-#endif
-#if defined(CONFIG_ARCH_OMAP2)
-       if (cpu_class_is_omap2()) {
-               gpio_ick = clk_get(NULL, "gpios_ick");
-               if (IS_ERR(gpio_ick))
-                       printk("Could not get gpios_ick\n");
-               else
-                       clk_enable(gpio_ick);
-               gpio_fck = clk_get(NULL, "gpios_fck");
-               if (IS_ERR(gpio_fck))
-                       printk("Could not get gpios_fck\n");
-               else
-                       clk_enable(gpio_fck);
+       pdata = pdev->dev.platform_data;
 
-               /*
-                * On 2430 & 3430 GPIO 5 uses CORE L4 ICLK
-                */
-#if defined(CONFIG_ARCH_OMAP2430)
-               if (cpu_is_omap2430()) {
-                       gpio5_ick = clk_get(NULL, "gpio5_ick");
-                       if (IS_ERR(gpio5_ick))
-                               printk("Could not get gpio5_ick\n");
-                       else
-                               clk_enable(gpio5_ick);
-                       gpio5_fck = clk_get(NULL, "gpio5_fck");
-                       if (IS_ERR(gpio5_fck))
-                               printk("Could not get gpio5_fck\n");
-                       else
-                               clk_enable(gpio5_fck);
-               }
-#endif
-       }
-#endif
+       if (!gpio_init_done) {
+               int ret;
 
-#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
-       if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
-               for (i = 0; i < OMAP34XX_NR_GPIOS; i++) {
-                       sprintf(clk_name, "gpio%d_ick", i + 1);
-                       gpio_iclks[i] = clk_get(NULL, clk_name);
-                       if (IS_ERR(gpio_iclks[i]))
-                               printk(KERN_ERR "Could not get %s\n", clk_name);
-                       else
-                               clk_enable(gpio_iclks[i]);
-               }
+               ret = init_gpio_info(pdev);
+               if (ret)
+                       return ret;
        }
-#endif
 
+       id = pdev->id;
+       bank = &gpio_bank[id];
 
-#ifdef CONFIG_ARCH_OMAP15XX
-       if (cpu_is_omap15xx()) {
-               gpio_bank_count = 2;
-               gpio_bank = gpio_bank_1510;
-               bank_size = SZ_2K;
-       }
-#endif
-#if defined(CONFIG_ARCH_OMAP16XX)
-       if (cpu_is_omap16xx()) {
-               gpio_bank_count = 5;
-               gpio_bank = gpio_bank_1610;
-               bank_size = SZ_2K;
-       }
-#endif
-#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
-       if (cpu_is_omap7xx()) {
-               gpio_bank_count = 7;
-               gpio_bank = gpio_bank_7xx;
-               bank_size = SZ_2K;
-       }
-#endif
-#ifdef CONFIG_ARCH_OMAP2
-       if (cpu_is_omap242x()) {
-               gpio_bank_count = 4;
-               gpio_bank = gpio_bank_242x;
-       }
-       if (cpu_is_omap243x()) {
-               gpio_bank_count = 5;
-               gpio_bank = gpio_bank_243x;
-       }
-#endif
-#ifdef CONFIG_ARCH_OMAP3
-       if (cpu_is_omap34xx()) {
-               gpio_bank_count = OMAP34XX_NR_GPIOS;
-               gpio_bank = gpio_bank_34xx;
-       }
-#endif
-#ifdef CONFIG_ARCH_OMAP4
-       if (cpu_is_omap44xx()) {
-               gpio_bank_count = OMAP34XX_NR_GPIOS;
-               gpio_bank = gpio_bank_44xx;
+       res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
+       if (unlikely(!res)) {
+               dev_err(&pdev->dev, "GPIO Bank %i Invalid IRQ resource\n", id);
+               return -ENODEV;
        }
-#endif
-       for (i = 0; i < gpio_bank_count; i++) {
 
-               bank = &gpio_bank[i];
-               spin_lock_init(&bank->lock);
+       bank->irq = res->start;
+       bank->virtual_irq_start = pdata->virtual_irq_start;
+       bank->method = pdata->bank_type;
+       bank->dev = &pdev->dev;
+       bank->dbck_flag = pdata->dbck_flag;
+       bank_width = pdata->bank_width;
 
-               /* Static mapping, never released */
-               bank->base = ioremap(bank->pbase, bank_size);
-               if (!bank->base) {
-                       printk(KERN_ERR "Could not ioremap gpio bank%i\n", i);
-                       continue;
-               }
+       spin_lock_init(&bank->lock);
 
-               omap_gpio_mod_init(bank, i);
-               omap_gpio_chip_init(bank);
+       /* Static mapping, never released */
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       if (unlikely(!res)) {
+               dev_err(&pdev->dev, "GPIO Bank %i Invalid mem resource\n", id);
+               return -ENODEV;
+       }
 
-               if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
-                       sprintf(clk_name, "gpio%d_dbck", i + 1);
-                       bank->dbck = clk_get(NULL, clk_name);
-                       if (IS_ERR(bank->dbck))
-                               printk(KERN_ERR "Could not get %s\n", clk_name);
-               }
+       bank->base = ioremap(res->start, resource_size(res));
+       if (!bank->base) {
+               dev_err(&pdev->dev, "Could not ioremap gpio bank%i\n", id);
+               return -ENOMEM;
        }
 
+       pm_runtime_enable(bank->dev);
+       pm_runtime_get_sync(bank->dev);
+
+       omap_gpio_mod_init(bank, id);
+       omap_gpio_chip_init(bank);
        omap_gpio_show_rev(bank);
 
+       if (!gpio_init_done)
+               gpio_init_done = 1;
+
        return 0;
 }
 
@@ -2252,8 +2036,6 @@ void omap_gpio_save_context(void)
        /* saving banks from 2-6 only since GPIO1 is in WKUP */
        for (i = 1; i < gpio_bank_count; i++) {
                struct gpio_bank *bank = &gpio_bank[i];
-               gpio_context[i].sysconfig =
-                       __raw_readl(bank->base + OMAP24XX_GPIO_SYSCONFIG);
                gpio_context[i].irqenable1 =
                        __raw_readl(bank->base + OMAP24XX_GPIO_IRQENABLE1);
                gpio_context[i].irqenable2 =
@@ -2284,8 +2066,6 @@ void omap_gpio_restore_context(void)
 
        for (i = 1; i < gpio_bank_count; i++) {
                struct gpio_bank *bank = &gpio_bank[i];
-               __raw_writel(gpio_context[i].sysconfig,
-                               bank->base + OMAP24XX_GPIO_SYSCONFIG);
                __raw_writel(gpio_context[i].irqenable1,
                                bank->base + OMAP24XX_GPIO_IRQENABLE1);
                __raw_writel(gpio_context[i].irqenable2,
@@ -2310,25 +2090,28 @@ void omap_gpio_restore_context(void)
 }
 #endif
 
+static struct platform_driver omap_gpio_driver = {
+       .probe          = omap_gpio_probe,
+       .driver         = {
+               .name   = "omap_gpio",
+       },
+};
+
 /*
- * This may get called early from board specific init
- * for boards that have interrupts routed via FPGA.
+ * gpio driver register needs to be done before
+ * machine_init functions access gpio APIs.
+ * Hence omap_gpio_drv_reg() is a postcore_initcall.
  */
-int __init omap_gpio_init(void)
+static int __init omap_gpio_drv_reg(void)
 {
-       if (!initialized)
-               return _omap_gpio_init();
-       else
-               return 0;
+       return platform_driver_register(&omap_gpio_driver);
 }
+postcore_initcall(omap_gpio_drv_reg);
 
 static int __init omap_gpio_sysinit(void)
 {
        int ret = 0;
 
-       if (!initialized)
-               ret = _omap_gpio_init();
-
        mpuio_init();
 
 #if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP2PLUS)
index 24892a6707c44cff7cf9a29ae6de53dd68ff76e7..5f118ff0d3ebd45f4994038117ea407132972205 100644 (file)
@@ -94,7 +94,6 @@ struct omap_gpio_platform_data {
 /* TODO: Analyze removing gpio_bank_count usage from driver code */
 extern int gpio_bank_count;
 
-extern int omap_gpio_init(void);       /* Call from board init only */
 extern void omap2_gpio_prepare_for_idle(int power_state);
 extern void omap2_gpio_resume_after_idle(void);
 extern void omap_set_gpio_debounce(int gpio, int enable);