diff options
author | Varadarajan, Charulatha <charu@ti.com> | 2010-12-07 19:26:57 -0500 |
---|---|---|
committer | Tony Lindgren <tony@atomide.com> | 2010-12-07 19:26:57 -0500 |
commit | 77640aabd7558e43b65bc1a0311be2dbb42c3ff8 (patch) | |
tree | 59a77126b13f4280c13b144fe3bb3a01d46df649 /arch/arm/mach-omap1 | |
parent | f547170fe721f145b7b7d6eb8b252e45f489dc4b (diff) |
OMAP: GPIO: Implement GPIO as a platform device
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>
Diffstat (limited to 'arch/arm/mach-omap1')
-rw-r--r-- | arch/arm/mach-omap1/Makefile | 6 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-ams-delta.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-fsample.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-h2.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-h3.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-htcherald.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-innovator.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-nokia770.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-osk.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-palmte.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-palmz71.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-perseus2.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-sx1.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap1/board-voiceblue.c | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap1/clock_data.c | 4 |
15 files changed, 8 insertions, 16 deletions
diff --git a/arch/arm/mach-omap1/Makefile b/arch/arm/mach-omap1/Makefile index de3cc130ab8e..0b1c07ffa2f1 100644 --- a/arch/arm/mach-omap1/Makefile +++ b/arch/arm/mach-omap1/Makefile | |||
@@ -49,6 +49,12 @@ ifeq ($(CONFIG_ARCH_OMAP15XX),y) | |||
49 | obj-$(CONFIG_MACH_OMAP_INNOVATOR) += fpga.o | 49 | obj-$(CONFIG_MACH_OMAP_INNOVATOR) += fpga.o |
50 | endif | 50 | endif |
51 | 51 | ||
52 | # GPIO | ||
53 | obj-$(CONFIG_ARCH_OMAP730) += gpio7xx.o | ||
54 | obj-$(CONFIG_ARCH_OMAP850) += gpio7xx.o | ||
55 | obj-$(CONFIG_ARCH_OMAP15XX) += gpio15xx.o | ||
56 | obj-$(CONFIG_ARCH_OMAP16XX) += gpio16xx.o | ||
57 | |||
52 | # LEDs support | 58 | # LEDs support |
53 | led-$(CONFIG_MACH_OMAP_H2) += leds-h2p2-debug.o | 59 | led-$(CONFIG_MACH_OMAP_H2) += leds-h2p2-debug.o |
54 | led-$(CONFIG_MACH_OMAP_H3) += leds-h2p2-debug.o | 60 | led-$(CONFIG_MACH_OMAP_H3) += leds-h2p2-debug.o |
diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c index 9d97a72c5393..ce4d69ca15fe 100644 --- a/arch/arm/mach-omap1/board-ams-delta.c +++ b/arch/arm/mach-omap1/board-ams-delta.c | |||
@@ -141,7 +141,6 @@ static void __init ams_delta_init_irq(void) | |||
141 | { | 141 | { |
142 | omap1_init_common_hw(); | 142 | omap1_init_common_hw(); |
143 | omap_init_irq(); | 143 | omap_init_irq(); |
144 | omap_gpio_init(); | ||
145 | } | 144 | } |
146 | 145 | ||
147 | static struct map_desc ams_delta_io_desc[] __initdata = { | 146 | static struct map_desc ams_delta_io_desc[] __initdata = { |
diff --git a/arch/arm/mach-omap1/board-fsample.c b/arch/arm/mach-omap1/board-fsample.c index 295ab6713670..0c3f396328bd 100644 --- a/arch/arm/mach-omap1/board-fsample.c +++ b/arch/arm/mach-omap1/board-fsample.c | |||
@@ -327,7 +327,6 @@ static void __init omap_fsample_init_irq(void) | |||
327 | { | 327 | { |
328 | omap1_init_common_hw(); | 328 | omap1_init_common_hw(); |
329 | omap_init_irq(); | 329 | omap_init_irq(); |
330 | omap_gpio_init(); | ||
331 | } | 330 | } |
332 | 331 | ||
333 | /* Only FPGA needs to be mapped here. All others are done with ioremap */ | 332 | /* Only FPGA needs to be mapped here. All others are done with ioremap */ |
diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index dd35efdefcf7..082a73ca5564 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c | |||
@@ -374,7 +374,6 @@ static void __init h2_init_irq(void) | |||
374 | { | 374 | { |
375 | omap1_init_common_hw(); | 375 | omap1_init_common_hw(); |
376 | omap_init_irq(); | 376 | omap_init_irq(); |
377 | omap_gpio_init(); | ||
378 | } | 377 | } |
379 | 378 | ||
380 | static struct omap_usb_config h2_usb_config __initdata = { | 379 | static struct omap_usb_config h2_usb_config __initdata = { |
diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index 78719198809e..d2cff5022fe5 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c | |||
@@ -437,7 +437,6 @@ static void __init h3_init_irq(void) | |||
437 | { | 437 | { |
438 | omap1_init_common_hw(); | 438 | omap1_init_common_hw(); |
439 | omap_init_irq(); | 439 | omap_init_irq(); |
440 | omap_gpio_init(); | ||
441 | } | 440 | } |
442 | 441 | ||
443 | static void __init h3_map_io(void) | 442 | static void __init h3_map_io(void) |
diff --git a/arch/arm/mach-omap1/board-htcherald.c b/arch/arm/mach-omap1/board-htcherald.c index 071af3e47789..faa344f734dc 100644 --- a/arch/arm/mach-omap1/board-htcherald.c +++ b/arch/arm/mach-omap1/board-htcherald.c | |||
@@ -577,8 +577,6 @@ static void __init htcherald_init(void) | |||
577 | printk(KERN_INFO "HTC Herald init.\n"); | 577 | printk(KERN_INFO "HTC Herald init.\n"); |
578 | 578 | ||
579 | /* Do board initialization before we register all the devices */ | 579 | /* Do board initialization before we register all the devices */ |
580 | omap_gpio_init(); | ||
581 | |||
582 | omap_board_config = htcherald_config; | 580 | omap_board_config = htcherald_config; |
583 | omap_board_config_size = ARRAY_SIZE(htcherald_config); | 581 | omap_board_config_size = ARRAY_SIZE(htcherald_config); |
584 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 582 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index 0feaa6731c7e..a051acdc526a 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c | |||
@@ -290,7 +290,6 @@ static void __init innovator_init_irq(void) | |||
290 | { | 290 | { |
291 | omap1_init_common_hw(); | 291 | omap1_init_common_hw(); |
292 | omap_init_irq(); | 292 | omap_init_irq(); |
293 | omap_gpio_init(); | ||
294 | #ifdef CONFIG_ARCH_OMAP15XX | 293 | #ifdef CONFIG_ARCH_OMAP15XX |
295 | if (cpu_is_omap1510()) { | 294 | if (cpu_is_omap1510()) { |
296 | omap1510_fpga_init_irq(); | 295 | omap1510_fpga_init_irq(); |
diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c index aa8375b2a0a3..605495bbc583 100644 --- a/arch/arm/mach-omap1/board-nokia770.c +++ b/arch/arm/mach-omap1/board-nokia770.c | |||
@@ -246,7 +246,6 @@ static void __init omap_nokia770_init(void) | |||
246 | platform_add_devices(nokia770_devices, ARRAY_SIZE(nokia770_devices)); | 246 | platform_add_devices(nokia770_devices, ARRAY_SIZE(nokia770_devices)); |
247 | spi_register_board_info(nokia770_spi_board_info, | 247 | spi_register_board_info(nokia770_spi_board_info, |
248 | ARRAY_SIZE(nokia770_spi_board_info)); | 248 | ARRAY_SIZE(nokia770_spi_board_info)); |
249 | omap_gpio_init(); | ||
250 | omap_serial_init(); | 249 | omap_serial_init(); |
251 | omap_register_i2c_bus(1, 100, NULL, 0); | 250 | omap_register_i2c_bus(1, 100, NULL, 0); |
252 | hwa742_dev_init(); | 251 | hwa742_dev_init(); |
diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c index 30bdbdb93636..d44e7172efc2 100644 --- a/arch/arm/mach-omap1/board-osk.c +++ b/arch/arm/mach-omap1/board-osk.c | |||
@@ -283,7 +283,6 @@ static void __init osk_init_irq(void) | |||
283 | { | 283 | { |
284 | omap1_init_common_hw(); | 284 | omap1_init_common_hw(); |
285 | omap_init_irq(); | 285 | omap_init_irq(); |
286 | omap_gpio_init(); | ||
287 | } | 286 | } |
288 | 287 | ||
289 | static struct omap_usb_config osk_usb_config __initdata = { | 288 | static struct omap_usb_config osk_usb_config __initdata = { |
diff --git a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c index f32738b1eb6b..994dc6f50729 100644 --- a/arch/arm/mach-omap1/board-palmte.c +++ b/arch/arm/mach-omap1/board-palmte.c | |||
@@ -63,7 +63,6 @@ static void __init omap_palmte_init_irq(void) | |||
63 | { | 63 | { |
64 | omap1_init_common_hw(); | 64 | omap1_init_common_hw(); |
65 | omap_init_irq(); | 65 | omap_init_irq(); |
66 | omap_gpio_init(); | ||
67 | } | 66 | } |
68 | 67 | ||
69 | static const int palmte_keymap[] = { | 68 | static const int palmte_keymap[] = { |
diff --git a/arch/arm/mach-omap1/board-palmz71.c b/arch/arm/mach-omap1/board-palmz71.c index d7a245cef9a4..2afac598baee 100644 --- a/arch/arm/mach-omap1/board-palmz71.c +++ b/arch/arm/mach-omap1/board-palmz71.c | |||
@@ -62,7 +62,6 @@ omap_palmz71_init_irq(void) | |||
62 | { | 62 | { |
63 | omap1_init_common_hw(); | 63 | omap1_init_common_hw(); |
64 | omap_init_irq(); | 64 | omap_init_irq(); |
65 | omap_gpio_init(); | ||
66 | } | 65 | } |
67 | 66 | ||
68 | static int palmz71_keymap[] = { | 67 | static int palmz71_keymap[] = { |
diff --git a/arch/arm/mach-omap1/board-perseus2.c b/arch/arm/mach-omap1/board-perseus2.c index 07660be4f228..69fda218fb45 100644 --- a/arch/arm/mach-omap1/board-perseus2.c +++ b/arch/arm/mach-omap1/board-perseus2.c | |||
@@ -295,7 +295,6 @@ static void __init omap_perseus2_init_irq(void) | |||
295 | { | 295 | { |
296 | omap1_init_common_hw(); | 296 | omap1_init_common_hw(); |
297 | omap_init_irq(); | 297 | omap_init_irq(); |
298 | omap_gpio_init(); | ||
299 | } | 298 | } |
300 | /* Only FPGA needs to be mapped here. All others are done with ioremap */ | 299 | /* Only FPGA needs to be mapped here. All others are done with ioremap */ |
301 | static struct map_desc omap_perseus2_io_desc[] __initdata = { | 300 | static struct map_desc omap_perseus2_io_desc[] __initdata = { |
diff --git a/arch/arm/mach-omap1/board-sx1.c b/arch/arm/mach-omap1/board-sx1.c index d25f59e5a773..463862c67819 100644 --- a/arch/arm/mach-omap1/board-sx1.c +++ b/arch/arm/mach-omap1/board-sx1.c | |||
@@ -409,7 +409,6 @@ static void __init omap_sx1_init_irq(void) | |||
409 | { | 409 | { |
410 | omap1_init_common_hw(); | 410 | omap1_init_common_hw(); |
411 | omap_init_irq(); | 411 | omap_init_irq(); |
412 | omap_gpio_init(); | ||
413 | } | 412 | } |
414 | /*----------------------------------------*/ | 413 | /*----------------------------------------*/ |
415 | 414 | ||
diff --git a/arch/arm/mach-omap1/board-voiceblue.c b/arch/arm/mach-omap1/board-voiceblue.c index f5992c239bcd..789f5bac7359 100644 --- a/arch/arm/mach-omap1/board-voiceblue.c +++ b/arch/arm/mach-omap1/board-voiceblue.c | |||
@@ -158,7 +158,6 @@ static void __init voiceblue_init_irq(void) | |||
158 | { | 158 | { |
159 | omap1_init_common_hw(); | 159 | omap1_init_common_hw(); |
160 | omap_init_irq(); | 160 | omap_init_irq(); |
161 | omap_gpio_init(); | ||
162 | } | 161 | } |
163 | 162 | ||
164 | static void __init voiceblue_init(void) | 163 | static void __init voiceblue_init(void) |
diff --git a/arch/arm/mach-omap1/clock_data.c b/arch/arm/mach-omap1/clock_data.c index af54114b8f08..423d21d8c190 100644 --- a/arch/arm/mach-omap1/clock_data.c +++ b/arch/arm/mach-omap1/clock_data.c | |||
@@ -143,7 +143,7 @@ static struct arm_idlect1_clk armper_ck = { | |||
143 | * activation. [ GPIO code for 1510 ] | 143 | * activation. [ GPIO code for 1510 ] |
144 | */ | 144 | */ |
145 | static struct clk arm_gpio_ck = { | 145 | static struct clk arm_gpio_ck = { |
146 | .name = "arm_gpio_ck", | 146 | .name = "ick", |
147 | .ops = &clkops_generic, | 147 | .ops = &clkops_generic, |
148 | .parent = &ck_dpll1, | 148 | .parent = &ck_dpll1, |
149 | .flags = ENABLE_ON_INIT, | 149 | .flags = ENABLE_ON_INIT, |
@@ -684,7 +684,7 @@ static struct omap_clk omap_clks[] = { | |||
684 | CLK(NULL, "ck_sossi", &sossi_ck, CK_16XX), | 684 | CLK(NULL, "ck_sossi", &sossi_ck, CK_16XX), |
685 | CLK(NULL, "arm_ck", &arm_ck, CK_16XX | CK_1510 | CK_310), | 685 | CLK(NULL, "arm_ck", &arm_ck, CK_16XX | CK_1510 | CK_310), |
686 | CLK(NULL, "armper_ck", &armper_ck.clk, CK_16XX | CK_1510 | CK_310), | 686 | CLK(NULL, "armper_ck", &armper_ck.clk, CK_16XX | CK_1510 | CK_310), |
687 | CLK(NULL, "arm_gpio_ck", &arm_gpio_ck, CK_1510 | CK_310), | 687 | CLK("omap_gpio.0", "ick", &arm_gpio_ck, CK_1510 | CK_310), |
688 | CLK(NULL, "armxor_ck", &armxor_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX), | 688 | CLK(NULL, "armxor_ck", &armxor_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX), |
689 | CLK(NULL, "armtim_ck", &armtim_ck.clk, CK_16XX | CK_1510 | CK_310), | 689 | CLK(NULL, "armtim_ck", &armtim_ck.clk, CK_16XX | CK_1510 | CK_310), |
690 | CLK("omap_wdt", "fck", &armwdt_ck.clk, CK_16XX | CK_1510 | CK_310), | 690 | CLK("omap_wdt", "fck", &armwdt_ck.clk, CK_16XX | CK_1510 | CK_310), |