diff options
author | Jon Hunter <jon-hunter@ti.com> | 2013-04-01 15:33:50 -0400 |
---|---|---|
committer | Jon Hunter <jon-hunter@ti.com> | 2013-04-01 15:33:50 -0400 |
commit | dca3a783400a18e2bf4503b1d4a85c4d0ca1a7e4 (patch) | |
tree | a3689b801070c1360b120b7280c6adc4de5f692a /arch/arm/mach-omap2 | |
parent | 71856843fb1d8ee455a4c1a60696c74afa4809e5 (diff) | |
parent | 31d9adca82ce65e5c99d045b5fd917c702b6fce3 (diff) |
Merge commit '31d9adca82ce65e5c99d045b5fd917c702b6fce3' into tmp
Conflicts:
arch/arm/plat-omap/dmtimer.c
Diffstat (limited to 'arch/arm/mach-omap2')
121 files changed, 2358 insertions, 2923 deletions
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 41b581fd0213..49ac3dfebef9 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
@@ -1,3 +1,26 @@ | |||
1 | config ARCH_OMAP | ||
2 | bool | ||
3 | |||
4 | config ARCH_OMAP2PLUS | ||
5 | bool "TI OMAP2/3/4/5 SoCs with device tree support" if (ARCH_MULTI_V6 || ARCH_MULTI_V7) | ||
6 | select ARCH_HAS_CPUFREQ | ||
7 | select ARCH_HAS_HOLES_MEMORYMODEL | ||
8 | select ARCH_OMAP | ||
9 | select ARCH_REQUIRE_GPIOLIB | ||
10 | select CLKDEV_LOOKUP | ||
11 | select CLKSRC_MMIO | ||
12 | select GENERIC_CLOCKEVENTS | ||
13 | select GENERIC_IRQ_CHIP | ||
14 | select HAVE_CLK | ||
15 | select OMAP_DM_TIMER | ||
16 | select PINCTRL | ||
17 | select PROC_DEVICETREE if PROC_FS | ||
18 | select SPARSE_IRQ | ||
19 | select USE_OF | ||
20 | help | ||
21 | Systems based on OMAP2, OMAP3, OMAP4 or OMAP5 | ||
22 | |||
23 | |||
1 | if ARCH_OMAP2PLUS | 24 | if ARCH_OMAP2PLUS |
2 | 25 | ||
3 | menu "TI OMAP2/3/4 Specific Features" | 26 | menu "TI OMAP2/3/4 Specific Features" |
@@ -76,12 +99,12 @@ config ARCH_OMAP4 | |||
76 | 99 | ||
77 | config SOC_OMAP5 | 100 | config SOC_OMAP5 |
78 | bool "TI OMAP5" | 101 | bool "TI OMAP5" |
79 | select ARM_ARCH_TIMER | ||
80 | select ARM_CPU_SUSPEND if PM | 102 | select ARM_CPU_SUSPEND if PM |
81 | select ARM_GIC | 103 | select ARM_GIC |
82 | select CPU_V7 | 104 | select CPU_V7 |
83 | select HAVE_SMP | 105 | select HAVE_SMP |
84 | select COMMON_CLK | 106 | select COMMON_CLK |
107 | select HAVE_ARM_ARCH_TIMER | ||
85 | 108 | ||
86 | comment "OMAP Core Type" | 109 | comment "OMAP Core Type" |
87 | depends on ARCH_OMAP2 | 110 | depends on ARCH_OMAP2 |
@@ -165,12 +188,6 @@ config MACH_OMAP_H4 | |||
165 | select OMAP_DEBUG_DEVICES | 188 | select OMAP_DEBUG_DEVICES |
166 | select OMAP_PACKAGE_ZAF | 189 | select OMAP_PACKAGE_ZAF |
167 | 190 | ||
168 | config MACH_OMAP_APOLLON | ||
169 | bool "OMAP 2420 Apollon board" | ||
170 | depends on SOC_OMAP2420 | ||
171 | default y | ||
172 | select OMAP_PACKAGE_ZAC | ||
173 | |||
174 | config MACH_OMAP_2430SDP | 191 | config MACH_OMAP_2430SDP |
175 | bool "OMAP 2430 SDP board" | 192 | bool "OMAP 2430 SDP board" |
176 | depends on SOC_OMAP2430 | 193 | depends on SOC_OMAP2430 |
@@ -397,7 +414,7 @@ config OMAP3_SDRC_AC_TIMING | |||
397 | 414 | ||
398 | config OMAP4_ERRATA_I688 | 415 | config OMAP4_ERRATA_I688 |
399 | bool "OMAP4 errata: Async Bridge Corruption" | 416 | bool "OMAP4 errata: Async Bridge Corruption" |
400 | depends on ARCH_OMAP4 | 417 | depends on ARCH_OMAP4 && !ARCH_MULTIPLATFORM |
401 | select ARCH_HAS_BARRIERS | 418 | select ARCH_HAS_BARRIERS |
402 | help | 419 | help |
403 | If a data is stalled inside asynchronous bridge because of back | 420 | If a data is stalled inside asynchronous bridge because of back |
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index 947cafe65aef..b068b7fe99ef 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile | |||
@@ -2,13 +2,16 @@ | |||
2 | # Makefile for the linux kernel. | 2 | # Makefile for the linux kernel. |
3 | # | 3 | # |
4 | 4 | ||
5 | ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include \ | ||
6 | -I$(srctree)/arch/arm/plat-omap/include | ||
7 | |||
5 | # Common support | 8 | # Common support |
6 | obj-y := id.o io.o control.o mux.o devices.o fb.o serial.o gpmc.o timer.o pm.o \ | 9 | obj-y := id.o io.o control.o mux.o devices.o fb.o serial.o gpmc.o timer.o pm.o \ |
7 | common.o gpio.o dma.o wd_timer.o display.o i2c.o hdq1w.o omap_hwmod.o \ | 10 | common.o gpio.o dma.o wd_timer.o display.o i2c.o hdq1w.o omap_hwmod.o \ |
8 | omap_device.o sram.o | 11 | omap_device.o sram.o |
9 | 12 | ||
10 | omap-2-3-common = irq.o | 13 | omap-2-3-common = irq.o |
11 | hwmod-common = omap_hwmod.o \ | 14 | hwmod-common = omap_hwmod.o omap_hwmod_reset.o \ |
12 | omap_hwmod_common_data.o | 15 | omap_hwmod_common_data.o |
13 | clock-common = clock.o clock_common_data.o \ | 16 | clock-common = clock.o clock_common_data.o \ |
14 | clkt_dpll.o clkt_clksel.o | 17 | clkt_dpll.o clkt_clksel.o |
@@ -53,6 +56,7 @@ AFLAGS_sram34xx.o :=-Wa,-march=armv7-a | |||
53 | # Restart code (OMAP4/5 currently in omap4-common.c) | 56 | # Restart code (OMAP4/5 currently in omap4-common.c) |
54 | obj-$(CONFIG_SOC_OMAP2420) += omap2-restart.o | 57 | obj-$(CONFIG_SOC_OMAP2420) += omap2-restart.o |
55 | obj-$(CONFIG_SOC_OMAP2430) += omap2-restart.o | 58 | obj-$(CONFIG_SOC_OMAP2430) += omap2-restart.o |
59 | obj-$(CONFIG_SOC_AM33XX) += am33xx-restart.o | ||
56 | obj-$(CONFIG_ARCH_OMAP3) += omap3-restart.o | 60 | obj-$(CONFIG_ARCH_OMAP3) += omap3-restart.o |
57 | 61 | ||
58 | # Pin multiplexing | 62 | # Pin multiplexing |
@@ -220,7 +224,6 @@ endif | |||
220 | obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o | 224 | obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o |
221 | obj-$(CONFIG_MACH_OMAP_H4) += board-h4.o | 225 | obj-$(CONFIG_MACH_OMAP_H4) += board-h4.o |
222 | obj-$(CONFIG_MACH_OMAP_2430SDP) += board-2430sdp.o | 226 | obj-$(CONFIG_MACH_OMAP_2430SDP) += board-2430sdp.o |
223 | obj-$(CONFIG_MACH_OMAP_APOLLON) += board-apollon.o | ||
224 | obj-$(CONFIG_MACH_OMAP3_BEAGLE) += board-omap3beagle.o | 227 | obj-$(CONFIG_MACH_OMAP3_BEAGLE) += board-omap3beagle.o |
225 | obj-$(CONFIG_MACH_DEVKIT8000) += board-devkit8000.o | 228 | obj-$(CONFIG_MACH_DEVKIT8000) += board-devkit8000.o |
226 | obj-$(CONFIG_MACH_OMAP_LDP) += board-ldp.o | 229 | obj-$(CONFIG_MACH_OMAP_LDP) += board-ldp.o |
diff --git a/arch/arm/mach-omap2/am33xx-restart.c b/arch/arm/mach-omap2/am33xx-restart.c new file mode 100644 index 000000000000..88e4fa8af031 --- /dev/null +++ b/arch/arm/mach-omap2/am33xx-restart.c | |||
@@ -0,0 +1,34 @@ | |||
1 | /* | ||
2 | * am33xx-restart.c - Code common to all AM33xx machines. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License version 2 as | ||
6 | * published by the Free Software Foundation. | ||
7 | */ | ||
8 | #include <linux/kernel.h> | ||
9 | |||
10 | #include "common.h" | ||
11 | #include "prm-regbits-33xx.h" | ||
12 | #include "prm33xx.h" | ||
13 | |||
14 | /** | ||
15 | * am3xx_restart - trigger a software restart of the SoC | ||
16 | * @mode: the "reboot mode", see arch/arm/kernel/{setup,process}.c | ||
17 | * @cmd: passed from the userspace program rebooting the system (if provided) | ||
18 | * | ||
19 | * Resets the SoC. For @cmd, see the 'reboot' syscall in | ||
20 | * kernel/sys.c. No return value. | ||
21 | */ | ||
22 | void am33xx_restart(char mode, const char *cmd) | ||
23 | { | ||
24 | /* TODO: Handle mode and cmd if necessary */ | ||
25 | |||
26 | am33xx_prm_rmw_reg_bits(AM33XX_GLOBAL_WARM_SW_RST_MASK, | ||
27 | AM33XX_GLOBAL_WARM_SW_RST_MASK, | ||
28 | AM33XX_PRM_DEVICE_MOD, | ||
29 | AM33XX_PRM_RSTCTRL_OFFSET); | ||
30 | |||
31 | /* OCP barrier */ | ||
32 | (void)am33xx_prm_read_reg(AM33XX_PRM_DEVICE_MOD, | ||
33 | AM33XX_PRM_RSTCTRL_OFFSET); | ||
34 | } | ||
diff --git a/arch/arm/mach-omap2/am35xx-emac.c b/arch/arm/mach-omap2/am35xx-emac.c index af11dcdb7e2c..25b79a297365 100644 --- a/arch/arm/mach-omap2/am35xx-emac.c +++ b/arch/arm/mach-omap2/am35xx-emac.c | |||
@@ -62,8 +62,7 @@ static int __init omap_davinci_emac_dev_init(struct omap_hwmod *oh, | |||
62 | { | 62 | { |
63 | struct platform_device *pdev; | 63 | struct platform_device *pdev; |
64 | 64 | ||
65 | pdev = omap_device_build(oh->class->name, 0, oh, pdata, pdata_len, | 65 | pdev = omap_device_build(oh->class->name, 0, oh, pdata, pdata_len); |
66 | NULL, 0, false); | ||
67 | if (IS_ERR(pdev)) { | 66 | if (IS_ERR(pdev)) { |
68 | WARN(1, "Can't build omap_device for %s:%s.\n", | 67 | WARN(1, "Can't build omap_device for %s:%s.\n", |
69 | oh->class->name, oh->name); | 68 | oh->class->name, oh->name); |
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c index 4815ea6f8f5d..a3e0aaa4886b 100644 --- a/arch/arm/mach-omap2/board-2430sdp.c +++ b/arch/arm/mach-omap2/board-2430sdp.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/clk.h> | 27 | #include <linux/clk.h> |
28 | #include <linux/io.h> | 28 | #include <linux/io.h> |
29 | #include <linux/gpio.h> | 29 | #include <linux/gpio.h> |
30 | #include <linux/usb/phy.h> | ||
30 | 31 | ||
31 | #include <asm/mach-types.h> | 32 | #include <asm/mach-types.h> |
32 | #include <asm/mach/arch.h> | 33 | #include <asm/mach/arch.h> |
@@ -263,6 +264,7 @@ static void __init omap_2430sdp_init(void) | |||
263 | omap_hsmmc_init(mmc); | 264 | omap_hsmmc_init(mmc); |
264 | 265 | ||
265 | omap_mux_init_signal("usb0hs_stp", OMAP_PULL_ENA | OMAP_PULL_UP); | 266 | omap_mux_init_signal("usb0hs_stp", OMAP_PULL_ENA | OMAP_PULL_UP); |
267 | usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb"); | ||
266 | usb_musb_init(NULL); | 268 | usb_musb_init(NULL); |
267 | 269 | ||
268 | board_smc91x_init(); | 270 | board_smc91x_init(); |
@@ -284,6 +286,6 @@ MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board") | |||
284 | .handle_irq = omap2_intc_handle_irq, | 286 | .handle_irq = omap2_intc_handle_irq, |
285 | .init_machine = omap_2430sdp_init, | 287 | .init_machine = omap_2430sdp_init, |
286 | .init_late = omap2430_init_late, | 288 | .init_late = omap2430_init_late, |
287 | .timer = &omap2_timer, | 289 | .init_time = omap2_sync32k_timer_init, |
288 | .restart = omap2xxx_restart, | 290 | .restart = omap2xxx_restart, |
289 | MACHINE_END | 291 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c index bb73afc9ac17..ce812decfaca 100644 --- a/arch/arm/mach-omap2/board-3430sdp.c +++ b/arch/arm/mach-omap2/board-3430sdp.c | |||
@@ -25,6 +25,8 @@ | |||
25 | #include <linux/gpio.h> | 25 | #include <linux/gpio.h> |
26 | #include <linux/mmc/host.h> | 26 | #include <linux/mmc/host.h> |
27 | #include <linux/platform_data/spi-omap2-mcspi.h> | 27 | #include <linux/platform_data/spi-omap2-mcspi.h> |
28 | #include <linux/platform_data/omap-twl4030.h> | ||
29 | #include <linux/usb/phy.h> | ||
28 | 30 | ||
29 | #include <asm/mach-types.h> | 31 | #include <asm/mach-types.h> |
30 | #include <asm/mach/arch.h> | 32 | #include <asm/mach/arch.h> |
@@ -209,6 +211,19 @@ static struct omap2_hsmmc_info mmc[] = { | |||
209 | {} /* Terminator */ | 211 | {} /* Terminator */ |
210 | }; | 212 | }; |
211 | 213 | ||
214 | static struct omap_tw4030_pdata omap_twl4030_audio_data = { | ||
215 | .voice_connected = true, | ||
216 | .custom_routing = true, | ||
217 | |||
218 | .has_hs = OMAP_TWL4030_LEFT | OMAP_TWL4030_RIGHT, | ||
219 | .has_hf = OMAP_TWL4030_LEFT | OMAP_TWL4030_RIGHT, | ||
220 | |||
221 | .has_mainmic = true, | ||
222 | .has_submic = true, | ||
223 | .has_hsmic = true, | ||
224 | .has_linein = OMAP_TWL4030_LEFT | OMAP_TWL4030_RIGHT, | ||
225 | }; | ||
226 | |||
212 | static int sdp3430_twl_gpio_setup(struct device *dev, | 227 | static int sdp3430_twl_gpio_setup(struct device *dev, |
213 | unsigned gpio, unsigned ngpio) | 228 | unsigned gpio, unsigned ngpio) |
214 | { | 229 | { |
@@ -225,6 +240,9 @@ static int sdp3430_twl_gpio_setup(struct device *dev, | |||
225 | /* gpio + 15 is "sub_lcd_nRST" (output) */ | 240 | /* gpio + 15 is "sub_lcd_nRST" (output) */ |
226 | gpio_request_one(gpio + 15, GPIOF_OUT_INIT_LOW, "sub_lcd_nRST"); | 241 | gpio_request_one(gpio + 15, GPIOF_OUT_INIT_LOW, "sub_lcd_nRST"); |
227 | 242 | ||
243 | omap_twl4030_audio_data.jack_detect = gpio + 2; | ||
244 | omap_twl4030_audio_init("SDP3430", &omap_twl4030_audio_data); | ||
245 | |||
228 | return 0; | 246 | return 0; |
229 | } | 247 | } |
230 | 248 | ||
@@ -382,6 +400,9 @@ static int __init omap3430_i2c_init(void) | |||
382 | sdp3430_twldata.vpll2->constraints.apply_uV = true; | 400 | sdp3430_twldata.vpll2->constraints.apply_uV = true; |
383 | sdp3430_twldata.vpll2->constraints.name = "VDVI"; | 401 | sdp3430_twldata.vpll2->constraints.name = "VDVI"; |
384 | 402 | ||
403 | sdp3430_twldata.audio->codec->hs_extmute = 1; | ||
404 | sdp3430_twldata.audio->codec->hs_extmute_gpio = -EINVAL; | ||
405 | |||
385 | omap3_pmic_init("twl4030", &sdp3430_twldata); | 406 | omap3_pmic_init("twl4030", &sdp3430_twldata); |
386 | 407 | ||
387 | /* i2c2 on camera connector (for sensor control) and optional isp1301 */ | 408 | /* i2c2 on camera connector (for sensor control) and optional isp1301 */ |
@@ -424,7 +445,7 @@ static void enable_board_wakeup_source(void) | |||
424 | OMAP_WAKEUP_EN | OMAP_PIN_INPUT_PULLUP); | 445 | OMAP_WAKEUP_EN | OMAP_PIN_INPUT_PULLUP); |
425 | } | 446 | } |
426 | 447 | ||
427 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | 448 | static struct usbhs_omap_platform_data usbhs_bdata __initdata = { |
428 | 449 | ||
429 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, | 450 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, |
430 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, | 451 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, |
@@ -579,6 +600,7 @@ static void __init omap_3430sdp_init(void) | |||
579 | omap_ads7846_init(1, gpio_pendown, 310, NULL); | 600 | omap_ads7846_init(1, gpio_pendown, 310, NULL); |
580 | omap_serial_init(); | 601 | omap_serial_init(); |
581 | omap_sdrc_init(hyb18m512160af6_sdrc_params, NULL); | 602 | omap_sdrc_init(hyb18m512160af6_sdrc_params, NULL); |
603 | usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb"); | ||
582 | usb_musb_init(NULL); | 604 | usb_musb_init(NULL); |
583 | board_smc91x_init(); | 605 | board_smc91x_init(); |
584 | board_flash_init(sdp_flash_partitions, chip_sel_3430, 0); | 606 | board_flash_init(sdp_flash_partitions, chip_sel_3430, 0); |
@@ -597,6 +619,6 @@ MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board") | |||
597 | .handle_irq = omap3_intc_handle_irq, | 619 | .handle_irq = omap3_intc_handle_irq, |
598 | .init_machine = omap_3430sdp_init, | 620 | .init_machine = omap_3430sdp_init, |
599 | .init_late = omap3430_init_late, | 621 | .init_late = omap3430_init_late, |
600 | .timer = &omap3_timer, | 622 | .init_time = omap3_sync32k_timer_init, |
601 | .restart = omap3xxx_restart, | 623 | .restart = omap3xxx_restart, |
602 | MACHINE_END | 624 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-3630sdp.c b/arch/arm/mach-omap2/board-3630sdp.c index 050aaa771254..67447bd4564f 100644 --- a/arch/arm/mach-omap2/board-3630sdp.c +++ b/arch/arm/mach-omap2/board-3630sdp.c | |||
@@ -53,7 +53,7 @@ static void enable_board_wakeup_source(void) | |||
53 | OMAP_WAKEUP_EN | OMAP_PIN_INPUT_PULLUP); | 53 | OMAP_WAKEUP_EN | OMAP_PIN_INPUT_PULLUP); |
54 | } | 54 | } |
55 | 55 | ||
56 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | 56 | static struct usbhs_omap_platform_data usbhs_bdata __initdata = { |
57 | 57 | ||
58 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, | 58 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, |
59 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, | 59 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, |
@@ -211,6 +211,6 @@ MACHINE_START(OMAP_3630SDP, "OMAP 3630SDP board") | |||
211 | .handle_irq = omap3_intc_handle_irq, | 211 | .handle_irq = omap3_intc_handle_irq, |
212 | .init_machine = omap_sdp_init, | 212 | .init_machine = omap_sdp_init, |
213 | .init_late = omap3630_init_late, | 213 | .init_late = omap3630_init_late, |
214 | .timer = &omap3_timer, | 214 | .init_time = omap3_sync32k_timer_init, |
215 | .restart = omap3xxx_restart, | 215 | .restart = omap3xxx_restart, |
216 | MACHINE_END | 216 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c index 1cc6696594fd..35f3ad0cb7c7 100644 --- a/arch/arm/mach-omap2/board-4430sdp.c +++ b/arch/arm/mach-omap2/board-4430sdp.c | |||
@@ -24,12 +24,15 @@ | |||
24 | #include <linux/gpio_keys.h> | 24 | #include <linux/gpio_keys.h> |
25 | #include <linux/regulator/machine.h> | 25 | #include <linux/regulator/machine.h> |
26 | #include <linux/regulator/fixed.h> | 26 | #include <linux/regulator/fixed.h> |
27 | #include <linux/pwm.h> | ||
27 | #include <linux/leds.h> | 28 | #include <linux/leds.h> |
28 | #include <linux/leds_pwm.h> | 29 | #include <linux/leds_pwm.h> |
30 | #include <linux/pwm_backlight.h> | ||
31 | #include <linux/irqchip/arm-gic.h> | ||
29 | #include <linux/platform_data/omap4-keypad.h> | 32 | #include <linux/platform_data/omap4-keypad.h> |
30 | #include <linux/usb/musb.h> | 33 | #include <linux/usb/musb.h> |
34 | #include <linux/usb/phy.h> | ||
31 | 35 | ||
32 | #include <asm/hardware/gic.h> | ||
33 | #include <asm/mach-types.h> | 36 | #include <asm/mach-types.h> |
34 | #include <asm/mach/arch.h> | 37 | #include <asm/mach/arch.h> |
35 | #include <asm/mach/map.h> | 38 | #include <asm/mach/map.h> |
@@ -256,10 +259,20 @@ static struct gpio_led_platform_data sdp4430_led_data = { | |||
256 | .num_leds = ARRAY_SIZE(sdp4430_gpio_leds), | 259 | .num_leds = ARRAY_SIZE(sdp4430_gpio_leds), |
257 | }; | 260 | }; |
258 | 261 | ||
262 | static struct pwm_lookup sdp4430_pwm_lookup[] = { | ||
263 | PWM_LOOKUP("twl-pwm", 0, "leds_pwm", "omap4::keypad"), | ||
264 | PWM_LOOKUP("twl-pwm", 1, "pwm-backlight", NULL), | ||
265 | PWM_LOOKUP("twl-pwmled", 0, "leds_pwm", "omap4:green:chrg"), | ||
266 | }; | ||
267 | |||
259 | static struct led_pwm sdp4430_pwm_leds[] = { | 268 | static struct led_pwm sdp4430_pwm_leds[] = { |
260 | { | 269 | { |
270 | .name = "omap4::keypad", | ||
271 | .max_brightness = 127, | ||
272 | .pwm_period_ns = 7812500, | ||
273 | }, | ||
274 | { | ||
261 | .name = "omap4:green:chrg", | 275 | .name = "omap4:green:chrg", |
262 | .pwm_id = 1, | ||
263 | .max_brightness = 255, | 276 | .max_brightness = 255, |
264 | .pwm_period_ns = 7812500, | 277 | .pwm_period_ns = 7812500, |
265 | }, | 278 | }, |
@@ -278,6 +291,20 @@ static struct platform_device sdp4430_leds_pwm = { | |||
278 | }, | 291 | }, |
279 | }; | 292 | }; |
280 | 293 | ||
294 | static struct platform_pwm_backlight_data sdp4430_backlight_data = { | ||
295 | .max_brightness = 127, | ||
296 | .dft_brightness = 127, | ||
297 | .pwm_period_ns = 7812500, | ||
298 | }; | ||
299 | |||
300 | static struct platform_device sdp4430_backlight_pwm = { | ||
301 | .name = "pwm-backlight", | ||
302 | .id = -1, | ||
303 | .dev = { | ||
304 | .platform_data = &sdp4430_backlight_data, | ||
305 | }, | ||
306 | }; | ||
307 | |||
281 | static int omap_prox_activate(struct device *dev) | 308 | static int omap_prox_activate(struct device *dev) |
282 | { | 309 | { |
283 | gpio_set_value(OMAP4_SFH7741_ENABLE_GPIO , 1); | 310 | gpio_set_value(OMAP4_SFH7741_ENABLE_GPIO , 1); |
@@ -412,6 +439,7 @@ static struct platform_device *sdp4430_devices[] __initdata = { | |||
412 | &sdp4430_gpio_keys_device, | 439 | &sdp4430_gpio_keys_device, |
413 | &sdp4430_leds_gpio, | 440 | &sdp4430_leds_gpio, |
414 | &sdp4430_leds_pwm, | 441 | &sdp4430_leds_pwm, |
442 | &sdp4430_backlight_pwm, | ||
415 | &sdp4430_vbat, | 443 | &sdp4430_vbat, |
416 | &sdp4430_dmic_codec, | 444 | &sdp4430_dmic_codec, |
417 | &sdp4430_abe_audio, | 445 | &sdp4430_abe_audio, |
@@ -696,6 +724,7 @@ static void __init omap_4430sdp_init(void) | |||
696 | omap4_sdp4430_wifi_init(); | 724 | omap4_sdp4430_wifi_init(); |
697 | omap4_twl6030_hsmmc_init(mmc); | 725 | omap4_twl6030_hsmmc_init(mmc); |
698 | 726 | ||
727 | usb_bind_phy("musb-hdrc.0.auto", 0, "omap-usb2.1.auto"); | ||
699 | usb_musb_init(&musb_board_data); | 728 | usb_musb_init(&musb_board_data); |
700 | 729 | ||
701 | status = omap_ethernet_init(); | 730 | status = omap_ethernet_init(); |
@@ -707,6 +736,7 @@ static void __init omap_4430sdp_init(void) | |||
707 | ARRAY_SIZE(sdp4430_spi_board_info)); | 736 | ARRAY_SIZE(sdp4430_spi_board_info)); |
708 | } | 737 | } |
709 | 738 | ||
739 | pwm_add_table(sdp4430_pwm_lookup, ARRAY_SIZE(sdp4430_pwm_lookup)); | ||
710 | status = omap4_keyboard_init(&sdp4430_keypad_data, &keypad_data); | 740 | status = omap4_keyboard_init(&sdp4430_keypad_data, &keypad_data); |
711 | if (status) | 741 | if (status) |
712 | pr_err("Keypad initialization failed: %d\n", status); | 742 | pr_err("Keypad initialization failed: %d\n", status); |
@@ -722,9 +752,8 @@ MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board") | |||
722 | .map_io = omap4_map_io, | 752 | .map_io = omap4_map_io, |
723 | .init_early = omap4430_init_early, | 753 | .init_early = omap4430_init_early, |
724 | .init_irq = gic_init_irq, | 754 | .init_irq = gic_init_irq, |
725 | .handle_irq = gic_handle_irq, | ||
726 | .init_machine = omap_4430sdp_init, | 755 | .init_machine = omap_4430sdp_init, |
727 | .init_late = omap4430_init_late, | 756 | .init_late = omap4430_init_late, |
728 | .timer = &omap4_timer, | 757 | .init_time = omap4_local_timer_init, |
729 | .restart = omap44xx_restart, | 758 | .restart = omap44xx_restart, |
730 | MACHINE_END | 759 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-am3517crane.c b/arch/arm/mach-omap2/board-am3517crane.c index 51b96a1206d1..7d3358b2e593 100644 --- a/arch/arm/mach-omap2/board-am3517crane.c +++ b/arch/arm/mach-omap2/board-am3517crane.c | |||
@@ -20,12 +20,18 @@ | |||
20 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/gpio.h> | 22 | #include <linux/gpio.h> |
23 | #include <linux/mfd/tps65910.h> | ||
24 | #include <linux/mtd/mtd.h> | ||
25 | #include <linux/mtd/nand.h> | ||
26 | #include <linux/mtd/partitions.h> | ||
23 | 27 | ||
24 | #include <asm/mach-types.h> | 28 | #include <asm/mach-types.h> |
25 | #include <asm/mach/arch.h> | 29 | #include <asm/mach/arch.h> |
26 | #include <asm/mach/map.h> | 30 | #include <asm/mach/map.h> |
27 | 31 | ||
28 | #include "common.h" | 32 | #include "common.h" |
33 | #include "common-board-devices.h" | ||
34 | #include "board-flash.h" | ||
29 | 35 | ||
30 | #include "am35xx-emac.h" | 36 | #include "am35xx-emac.h" |
31 | #include "mux.h" | 37 | #include "mux.h" |
@@ -36,11 +42,12 @@ | |||
36 | 42 | ||
37 | #ifdef CONFIG_OMAP_MUX | 43 | #ifdef CONFIG_OMAP_MUX |
38 | static struct omap_board_mux board_mux[] __initdata = { | 44 | static struct omap_board_mux board_mux[] __initdata = { |
45 | OMAP3_MUX(SYS_NIRQ, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP), | ||
39 | { .reg_offset = OMAP_MUX_TERMINATOR }, | 46 | { .reg_offset = OMAP_MUX_TERMINATOR }, |
40 | }; | 47 | }; |
41 | #endif | 48 | #endif |
42 | 49 | ||
43 | static struct usbhs_omap_board_data usbhs_bdata __initdata = { | 50 | static struct usbhs_omap_platform_data usbhs_bdata __initdata = { |
44 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, | 51 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, |
45 | .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED, | 52 | .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED, |
46 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, | 53 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, |
@@ -51,6 +58,54 @@ static struct usbhs_omap_board_data usbhs_bdata __initdata = { | |||
51 | .reset_gpio_port[2] = -EINVAL | 58 | .reset_gpio_port[2] = -EINVAL |
52 | }; | 59 | }; |
53 | 60 | ||
61 | static struct mtd_partition crane_nand_partitions[] = { | ||
62 | { | ||
63 | .name = "X-Loader", | ||
64 | .offset = 0, | ||
65 | .size = 4 * NAND_BLOCK_SIZE, | ||
66 | .mask_flags = MTD_WRITEABLE, | ||
67 | }, | ||
68 | { | ||
69 | .name = "U-Boot", | ||
70 | .offset = MTDPART_OFS_APPEND, | ||
71 | .size = 14 * NAND_BLOCK_SIZE, | ||
72 | .mask_flags = MTD_WRITEABLE, | ||
73 | }, | ||
74 | { | ||
75 | .name = "U-Boot Env", | ||
76 | .offset = MTDPART_OFS_APPEND, | ||
77 | .size = 2 * NAND_BLOCK_SIZE, | ||
78 | }, | ||
79 | { | ||
80 | .name = "Kernel", | ||
81 | .offset = MTDPART_OFS_APPEND, | ||
82 | .size = 40 * NAND_BLOCK_SIZE, | ||
83 | }, | ||
84 | { | ||
85 | .name = "File System", | ||
86 | .offset = MTDPART_OFS_APPEND, | ||
87 | .size = MTDPART_SIZ_FULL, | ||
88 | }, | ||
89 | }; | ||
90 | |||
91 | static struct tps65910_board tps65910_pdata = { | ||
92 | .irq = 7 + OMAP_INTC_START, | ||
93 | .en_ck32k_xtal = true, | ||
94 | }; | ||
95 | |||
96 | static struct i2c_board_info __initdata tps65910_board_info[] = { | ||
97 | { | ||
98 | I2C_BOARD_INFO("tps65910", 0x2d), | ||
99 | .platform_data = &tps65910_pdata, | ||
100 | }, | ||
101 | }; | ||
102 | |||
103 | static void __init am3517_crane_i2c_init(void) | ||
104 | { | ||
105 | omap_register_i2c_bus(1, 2600, tps65910_board_info, | ||
106 | ARRAY_SIZE(tps65910_board_info)); | ||
107 | } | ||
108 | |||
54 | static void __init am3517_crane_init(void) | 109 | static void __init am3517_crane_init(void) |
55 | { | 110 | { |
56 | int ret; | 111 | int ret; |
@@ -58,6 +113,10 @@ static void __init am3517_crane_init(void) | |||
58 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); | 113 | omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); |
59 | omap_serial_init(); | 114 | omap_serial_init(); |
60 | omap_sdrc_init(NULL, NULL); | 115 | omap_sdrc_init(NULL, NULL); |
116 | board_nand_init(crane_nand_partitions, | ||
117 | ARRAY_SIZE(crane_nand_partitions), 0, | ||
118 | NAND_BUSWIDTH_16, NULL); | ||
119 | am3517_crane_i2c_init(); | ||
61 | 120 | ||
62 | /* Configure GPIO for EHCI port */ | 121 | /* Configure GPIO for EHCI port */ |
63 | if (omap_mux_init_gpio(GPIO_USB_NRESET, OMAP_PIN_OUTPUT)) { | 122 | if (omap_mux_init_gpio(GPIO_USB_NRESET, OMAP_PIN_OUTPUT)) { |
@@ -92,6 +151,6 @@ MACHINE_START(CRANEBOARD, "AM3517/05 CRANEBOARD") | |||
92 | .handle_irq = omap3_intc_handle_irq, | 151 | .handle_irq = omap3_intc_handle_irq, |
93 | .init_machine = am3517_crane_init, | 152 | .init_machine = am3517_crane_init, |
94 | .init_late = am35xx_init_late, | 153 | .init_late = am35xx_init_late, |
95 | .timer = &omap3_timer, | 154 | .init_time = omap3_sync32k_timer_init, |
96 | .restart = omap3xxx_restart, | 155 | .restart = omap3xxx_restart, |
97 | MACHINE_END | 156 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-am3517evm.c b/arch/arm/mach-omap2/board-am3517evm.c index f81a303b87ff..9fb85908a61e 100644 --- a/arch/arm/mach-omap2/board-am3517evm.c +++ b/arch/arm/mach-omap2/board-am3517evm.c | |||
@@ -274,7 +274,7 @@ static __init void am3517_evm_mcbsp1_init(void) | |||
274 | omap_ctrl_writel(devconf0, OMAP2_CONTROL_DEVCONF0); | 274 | omap_ctrl_writel(devconf0, OMAP2_CONTROL_DEVCONF0); |
275 | } | 275 | } |
276 | 276 | ||
277 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | 277 | static struct usbhs_omap_platform_data usbhs_bdata __initdata = { |
278 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, | 278 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, |
279 | #if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \ | 279 | #if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \ |
280 | defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE) | 280 | defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE) |
@@ -393,6 +393,6 @@ MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM") | |||
393 | .handle_irq = omap3_intc_handle_irq, | 393 | .handle_irq = omap3_intc_handle_irq, |
394 | .init_machine = am3517_evm_init, | 394 | .init_machine = am3517_evm_init, |
395 | .init_late = am35xx_init_late, | 395 | .init_late = am35xx_init_late, |
396 | .timer = &omap3_timer, | 396 | .init_time = omap3_sync32k_timer_init, |
397 | .restart = omap3xxx_restart, | 397 | .restart = omap3xxx_restart, |
398 | MACHINE_END | 398 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c deleted file mode 100644 index 5d0a61f54165..000000000000 --- a/arch/arm/mach-omap2/board-apollon.c +++ /dev/null | |||
@@ -1,342 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-omap2/board-apollon.c | ||
3 | * | ||
4 | * Copyright (C) 2005,2006 Samsung Electronics | ||
5 | * Author: Kyungmin Park <kyungmin.park@samsung.com> | ||
6 | * | ||
7 | * Modified from mach-omap/omap2/board-h4.c | ||
8 | * | ||
9 | * Code for apollon OMAP2 board. Should work on many OMAP2 systems where | ||
10 | * the bootloader passes the board-specific data to the kernel. | ||
11 | * Do not put any board specific code to this file; create a new machine | ||
12 | * type if you need custom low-level initializations. | ||
13 | * | ||
14 | * This program is free software; you can redistribute it and/or modify | ||
15 | * it under the terms of the GNU General Public License version 2 as | ||
16 | * published by the Free Software Foundation. | ||
17 | */ | ||
18 | |||
19 | #include <linux/kernel.h> | ||
20 | #include <linux/init.h> | ||
21 | #include <linux/platform_device.h> | ||
22 | #include <linux/mtd/mtd.h> | ||
23 | #include <linux/mtd/partitions.h> | ||
24 | #include <linux/mtd/onenand.h> | ||
25 | #include <linux/delay.h> | ||
26 | #include <linux/leds.h> | ||
27 | #include <linux/err.h> | ||
28 | #include <linux/clk.h> | ||
29 | #include <linux/smc91x.h> | ||
30 | #include <linux/gpio.h> | ||
31 | #include <linux/platform_data/leds-omap.h> | ||
32 | |||
33 | #include <asm/mach-types.h> | ||
34 | #include <asm/mach/arch.h> | ||
35 | #include <asm/mach/flash.h> | ||
36 | |||
37 | #include "common.h" | ||
38 | #include "gpmc.h" | ||
39 | |||
40 | #include <video/omapdss.h> | ||
41 | #include <video/omap-panel-generic-dpi.h> | ||
42 | |||
43 | #include "mux.h" | ||
44 | #include "control.h" | ||
45 | |||
46 | /* LED & Switch macros */ | ||
47 | #define LED0_GPIO13 13 | ||
48 | #define LED1_GPIO14 14 | ||
49 | #define LED2_GPIO15 15 | ||
50 | #define SW_ENTER_GPIO16 16 | ||
51 | #define SW_UP_GPIO17 17 | ||
52 | #define SW_DOWN_GPIO58 58 | ||
53 | |||
54 | #define APOLLON_FLASH_CS 0 | ||
55 | #define APOLLON_ETH_CS 1 | ||
56 | #define APOLLON_ETHR_GPIO_IRQ 74 | ||
57 | |||
58 | static struct mtd_partition apollon_partitions[] = { | ||
59 | { | ||
60 | .name = "X-Loader + U-Boot", | ||
61 | .offset = 0, | ||
62 | .size = SZ_128K, | ||
63 | .mask_flags = MTD_WRITEABLE, | ||
64 | }, | ||
65 | { | ||
66 | .name = "params", | ||
67 | .offset = MTDPART_OFS_APPEND, | ||
68 | .size = SZ_128K, | ||
69 | }, | ||
70 | { | ||
71 | .name = "kernel", | ||
72 | .offset = MTDPART_OFS_APPEND, | ||
73 | .size = SZ_2M, | ||
74 | }, | ||
75 | { | ||
76 | .name = "rootfs", | ||
77 | .offset = MTDPART_OFS_APPEND, | ||
78 | .size = SZ_16M, | ||
79 | }, | ||
80 | { | ||
81 | .name = "filesystem00", | ||
82 | .offset = MTDPART_OFS_APPEND, | ||
83 | .size = SZ_32M, | ||
84 | }, | ||
85 | { | ||
86 | .name = "filesystem01", | ||
87 | .offset = MTDPART_OFS_APPEND, | ||
88 | .size = MTDPART_SIZ_FULL, | ||
89 | }, | ||
90 | }; | ||
91 | |||
92 | static struct onenand_platform_data apollon_flash_data = { | ||
93 | .parts = apollon_partitions, | ||
94 | .nr_parts = ARRAY_SIZE(apollon_partitions), | ||
95 | }; | ||
96 | |||
97 | static struct resource apollon_flash_resource[] = { | ||
98 | [0] = { | ||
99 | .flags = IORESOURCE_MEM, | ||
100 | }, | ||
101 | }; | ||
102 | |||
103 | static struct platform_device apollon_onenand_device = { | ||
104 | .name = "onenand-flash", | ||
105 | .id = -1, | ||
106 | .dev = { | ||
107 | .platform_data = &apollon_flash_data, | ||
108 | }, | ||
109 | .num_resources = ARRAY_SIZE(apollon_flash_resource), | ||
110 | .resource = apollon_flash_resource, | ||
111 | }; | ||
112 | |||
113 | static void __init apollon_flash_init(void) | ||
114 | { | ||
115 | unsigned long base; | ||
116 | |||
117 | if (gpmc_cs_request(APOLLON_FLASH_CS, SZ_128K, &base) < 0) { | ||
118 | printk(KERN_ERR "Cannot request OneNAND GPMC CS\n"); | ||
119 | return; | ||
120 | } | ||
121 | apollon_flash_resource[0].start = base; | ||
122 | apollon_flash_resource[0].end = base + SZ_128K - 1; | ||
123 | } | ||
124 | |||
125 | static struct smc91x_platdata appolon_smc91x_info = { | ||
126 | .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, | ||
127 | .leda = RPC_LED_100_10, | ||
128 | .ledb = RPC_LED_TX_RX, | ||
129 | }; | ||
130 | |||
131 | static struct resource apollon_smc91x_resources[] = { | ||
132 | [0] = { | ||
133 | .flags = IORESOURCE_MEM, | ||
134 | }, | ||
135 | [1] = { | ||
136 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE, | ||
137 | }, | ||
138 | }; | ||
139 | |||
140 | static struct platform_device apollon_smc91x_device = { | ||
141 | .name = "smc91x", | ||
142 | .id = -1, | ||
143 | .dev = { | ||
144 | .platform_data = &appolon_smc91x_info, | ||
145 | }, | ||
146 | .num_resources = ARRAY_SIZE(apollon_smc91x_resources), | ||
147 | .resource = apollon_smc91x_resources, | ||
148 | }; | ||
149 | |||
150 | static struct omap_led_config apollon_led_config[] = { | ||
151 | { | ||
152 | .cdev = { | ||
153 | .name = "apollon:led0", | ||
154 | }, | ||
155 | .gpio = LED0_GPIO13, | ||
156 | }, | ||
157 | { | ||
158 | .cdev = { | ||
159 | .name = "apollon:led1", | ||
160 | }, | ||
161 | .gpio = LED1_GPIO14, | ||
162 | }, | ||
163 | { | ||
164 | .cdev = { | ||
165 | .name = "apollon:led2", | ||
166 | }, | ||
167 | .gpio = LED2_GPIO15, | ||
168 | }, | ||
169 | }; | ||
170 | |||
171 | static struct omap_led_platform_data apollon_led_data = { | ||
172 | .nr_leds = ARRAY_SIZE(apollon_led_config), | ||
173 | .leds = apollon_led_config, | ||
174 | }; | ||
175 | |||
176 | static struct platform_device apollon_led_device = { | ||
177 | .name = "omap-led", | ||
178 | .id = -1, | ||
179 | .dev = { | ||
180 | .platform_data = &apollon_led_data, | ||
181 | }, | ||
182 | }; | ||
183 | |||
184 | static struct platform_device *apollon_devices[] __initdata = { | ||
185 | &apollon_onenand_device, | ||
186 | &apollon_smc91x_device, | ||
187 | &apollon_led_device, | ||
188 | }; | ||
189 | |||
190 | static inline void __init apollon_init_smc91x(void) | ||
191 | { | ||
192 | unsigned long base; | ||
193 | |||
194 | unsigned int rate; | ||
195 | struct clk *gpmc_fck; | ||
196 | int eth_cs; | ||
197 | int err; | ||
198 | |||
199 | gpmc_fck = clk_get(NULL, "gpmc_fck"); /* Always on ENABLE_ON_INIT */ | ||
200 | if (IS_ERR(gpmc_fck)) { | ||
201 | WARN_ON(1); | ||
202 | return; | ||
203 | } | ||
204 | |||
205 | clk_prepare_enable(gpmc_fck); | ||
206 | rate = clk_get_rate(gpmc_fck); | ||
207 | |||
208 | eth_cs = APOLLON_ETH_CS; | ||
209 | |||
210 | /* Make sure CS1 timings are correct */ | ||
211 | gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG1, 0x00011200); | ||
212 | |||
213 | if (rate >= 160000000) { | ||
214 | gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f01); | ||
215 | gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080803); | ||
216 | gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1c0b1c0a); | ||
217 | gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x041f1F1F); | ||
218 | gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000004C4); | ||
219 | } else if (rate >= 130000000) { | ||
220 | gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f00); | ||
221 | gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080802); | ||
222 | gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1C091C09); | ||
223 | gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x041f1F1F); | ||
224 | gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000004C4); | ||
225 | } else {/* rate = 100000000 */ | ||
226 | gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f00); | ||
227 | gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080802); | ||
228 | gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1C091C09); | ||
229 | gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x031A1F1F); | ||
230 | gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000003C2); | ||
231 | } | ||
232 | |||
233 | if (gpmc_cs_request(APOLLON_ETH_CS, SZ_16M, &base) < 0) { | ||
234 | printk(KERN_ERR "Failed to request GPMC CS for smc91x\n"); | ||
235 | goto out; | ||
236 | } | ||
237 | apollon_smc91x_resources[0].start = base + 0x300; | ||
238 | apollon_smc91x_resources[0].end = base + 0x30f; | ||
239 | udelay(100); | ||
240 | |||
241 | omap_mux_init_gpio(APOLLON_ETHR_GPIO_IRQ, 0); | ||
242 | err = gpio_request_one(APOLLON_ETHR_GPIO_IRQ, GPIOF_IN, "SMC91x irq"); | ||
243 | if (err) { | ||
244 | printk(KERN_ERR "Failed to request GPIO%d for smc91x IRQ\n", | ||
245 | APOLLON_ETHR_GPIO_IRQ); | ||
246 | gpmc_cs_free(APOLLON_ETH_CS); | ||
247 | } | ||
248 | out: | ||
249 | clk_disable_unprepare(gpmc_fck); | ||
250 | clk_put(gpmc_fck); | ||
251 | } | ||
252 | |||
253 | static struct panel_generic_dpi_data apollon_panel_data = { | ||
254 | .name = "apollon", | ||
255 | }; | ||
256 | |||
257 | static struct omap_dss_device apollon_lcd_device = { | ||
258 | .name = "lcd", | ||
259 | .driver_name = "generic_dpi_panel", | ||
260 | .type = OMAP_DISPLAY_TYPE_DPI, | ||
261 | .phy.dpi.data_lines = 18, | ||
262 | .data = &apollon_panel_data, | ||
263 | }; | ||
264 | |||
265 | static struct omap_dss_device *apollon_dss_devices[] = { | ||
266 | &apollon_lcd_device, | ||
267 | }; | ||
268 | |||
269 | static struct omap_dss_board_info apollon_dss_data = { | ||
270 | .num_devices = ARRAY_SIZE(apollon_dss_devices), | ||
271 | .devices = apollon_dss_devices, | ||
272 | .default_device = &apollon_lcd_device, | ||
273 | }; | ||
274 | |||
275 | static struct gpio apollon_gpio_leds[] __initdata = { | ||
276 | { LED0_GPIO13, GPIOF_OUT_INIT_LOW, "LED0" }, /* LED0 - AA10 */ | ||
277 | { LED1_GPIO14, GPIOF_OUT_INIT_LOW, "LED1" }, /* LED1 - AA6 */ | ||
278 | { LED2_GPIO15, GPIOF_OUT_INIT_LOW, "LED2" }, /* LED2 - AA4 */ | ||
279 | }; | ||
280 | |||
281 | static void __init apollon_led_init(void) | ||
282 | { | ||
283 | omap_mux_init_signal("vlynq_clk.gpio_13", 0); | ||
284 | omap_mux_init_signal("vlynq_rx1.gpio_14", 0); | ||
285 | omap_mux_init_signal("vlynq_rx0.gpio_15", 0); | ||
286 | |||
287 | gpio_request_array(apollon_gpio_leds, ARRAY_SIZE(apollon_gpio_leds)); | ||
288 | } | ||
289 | |||
290 | #ifdef CONFIG_OMAP_MUX | ||
291 | static struct omap_board_mux board_mux[] __initdata = { | ||
292 | { .reg_offset = OMAP_MUX_TERMINATOR }, | ||
293 | }; | ||
294 | #endif | ||
295 | |||
296 | static void __init omap_apollon_init(void) | ||
297 | { | ||
298 | u32 v; | ||
299 | |||
300 | omap2420_mux_init(board_mux, OMAP_PACKAGE_ZAC); | ||
301 | |||
302 | apollon_init_smc91x(); | ||
303 | apollon_led_init(); | ||
304 | apollon_flash_init(); | ||
305 | |||
306 | /* REVISIT: where's the correct place */ | ||
307 | omap_mux_init_signal("sys_nirq", OMAP_PULL_ENA | OMAP_PULL_UP); | ||
308 | |||
309 | /* LCD PWR_EN */ | ||
310 | omap_mux_init_signal("mcbsp2_dr.gpio_11", OMAP_PULL_ENA | OMAP_PULL_UP); | ||
311 | |||
312 | /* Use Internal loop-back in MMC/SDIO Module Input Clock selection */ | ||
313 | v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0); | ||
314 | v |= (1 << 24); | ||
315 | omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0); | ||
316 | |||
317 | /* | ||
318 | * Make sure the serial ports are muxed on at this point. | ||
319 | * You have to mux them off in device drivers later on | ||
320 | * if not needed. | ||
321 | */ | ||
322 | apollon_smc91x_resources[1].start = gpio_to_irq(APOLLON_ETHR_GPIO_IRQ); | ||
323 | apollon_smc91x_resources[1].end = gpio_to_irq(APOLLON_ETHR_GPIO_IRQ); | ||
324 | platform_add_devices(apollon_devices, ARRAY_SIZE(apollon_devices)); | ||
325 | omap_serial_init(); | ||
326 | omap_sdrc_init(NULL, NULL); | ||
327 | omap_display_init(&apollon_dss_data); | ||
328 | } | ||
329 | |||
330 | MACHINE_START(OMAP_APOLLON, "OMAP24xx Apollon") | ||
331 | /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */ | ||
332 | .atag_offset = 0x100, | ||
333 | .reserve = omap_reserve, | ||
334 | .map_io = omap242x_map_io, | ||
335 | .init_early = omap2420_init_early, | ||
336 | .init_irq = omap2_init_irq, | ||
337 | .handle_irq = omap2_intc_handle_irq, | ||
338 | .init_machine = omap_apollon_init, | ||
339 | .init_late = omap2420_init_late, | ||
340 | .timer = &omap2_timer, | ||
341 | .restart = omap2xxx_restart, | ||
342 | MACHINE_END | ||
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c index b3102c2f4a3c..af2bb219e214 100644 --- a/arch/arm/mach-omap2/board-cm-t35.c +++ b/arch/arm/mach-omap2/board-cm-t35.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/regulator/fixed.h> | 30 | #include <linux/regulator/fixed.h> |
31 | #include <linux/regulator/machine.h> | 31 | #include <linux/regulator/machine.h> |
32 | #include <linux/mmc/host.h> | 32 | #include <linux/mmc/host.h> |
33 | #include <linux/usb/phy.h> | ||
33 | 34 | ||
34 | #include <linux/spi/spi.h> | 35 | #include <linux/spi/spi.h> |
35 | #include <linux/spi/tdo24m.h> | 36 | #include <linux/spi/tdo24m.h> |
@@ -418,7 +419,7 @@ static struct omap2_hsmmc_info mmc[] = { | |||
418 | {} /* Terminator */ | 419 | {} /* Terminator */ |
419 | }; | 420 | }; |
420 | 421 | ||
421 | static struct usbhs_omap_board_data usbhs_bdata __initdata = { | 422 | static struct usbhs_omap_platform_data usbhs_bdata __initdata = { |
422 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, | 423 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, |
423 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, | 424 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, |
424 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, | 425 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, |
@@ -722,8 +723,9 @@ static void __init cm_t3x_common_init(void) | |||
722 | cm_t35_init_ethernet(); | 723 | cm_t35_init_ethernet(); |
723 | cm_t35_init_led(); | 724 | cm_t35_init_led(); |
724 | cm_t35_init_display(); | 725 | cm_t35_init_display(); |
725 | omap_twl4030_audio_init("cm-t3x"); | 726 | omap_twl4030_audio_init("cm-t3x", NULL); |
726 | 727 | ||
728 | usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb"); | ||
727 | usb_musb_init(NULL); | 729 | usb_musb_init(NULL); |
728 | cm_t35_init_usbh(); | 730 | cm_t35_init_usbh(); |
729 | cm_t35_init_camera(); | 731 | cm_t35_init_camera(); |
@@ -751,7 +753,7 @@ MACHINE_START(CM_T35, "Compulab CM-T35") | |||
751 | .handle_irq = omap3_intc_handle_irq, | 753 | .handle_irq = omap3_intc_handle_irq, |
752 | .init_machine = cm_t35_init, | 754 | .init_machine = cm_t35_init, |
753 | .init_late = omap35xx_init_late, | 755 | .init_late = omap35xx_init_late, |
754 | .timer = &omap3_timer, | 756 | .init_time = omap3_sync32k_timer_init, |
755 | .restart = omap3xxx_restart, | 757 | .restart = omap3xxx_restart, |
756 | MACHINE_END | 758 | MACHINE_END |
757 | 759 | ||
@@ -764,6 +766,6 @@ MACHINE_START(CM_T3730, "Compulab CM-T3730") | |||
764 | .handle_irq = omap3_intc_handle_irq, | 766 | .handle_irq = omap3_intc_handle_irq, |
765 | .init_machine = cm_t3730_init, | 767 | .init_machine = cm_t3730_init, |
766 | .init_late = omap3630_init_late, | 768 | .init_late = omap3630_init_late, |
767 | .timer = &omap3_timer, | 769 | .init_time = omap3_sync32k_timer_init, |
768 | .restart = omap3xxx_restart, | 770 | .restart = omap3xxx_restart, |
769 | MACHINE_END | 771 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-cm-t3517.c b/arch/arm/mach-omap2/board-cm-t3517.c index ebbc2adb499e..a66da808cc4a 100644 --- a/arch/arm/mach-omap2/board-cm-t3517.c +++ b/arch/arm/mach-omap2/board-cm-t3517.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/mtd/mtd.h> | 32 | #include <linux/mtd/mtd.h> |
33 | #include <linux/mtd/nand.h> | 33 | #include <linux/mtd/nand.h> |
34 | #include <linux/mtd/partitions.h> | 34 | #include <linux/mtd/partitions.h> |
35 | #include <linux/mmc/host.h> | ||
35 | #include <linux/can/platform/ti_hecc.h> | 36 | #include <linux/can/platform/ti_hecc.h> |
36 | 37 | ||
37 | #include <asm/mach-types.h> | 38 | #include <asm/mach-types.h> |
@@ -46,6 +47,7 @@ | |||
46 | 47 | ||
47 | #include "mux.h" | 48 | #include "mux.h" |
48 | #include "control.h" | 49 | #include "control.h" |
50 | #include "hsmmc.h" | ||
49 | #include "common-board-devices.h" | 51 | #include "common-board-devices.h" |
50 | #include "am35xx-emac.h" | 52 | #include "am35xx-emac.h" |
51 | #include "gpmc-nand.h" | 53 | #include "gpmc-nand.h" |
@@ -121,6 +123,26 @@ static void cm_t3517_init_hecc(void) | |||
121 | static inline void cm_t3517_init_hecc(void) {} | 123 | static inline void cm_t3517_init_hecc(void) {} |
122 | #endif | 124 | #endif |
123 | 125 | ||
126 | #if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) | ||
127 | static struct omap2_hsmmc_info cm_t3517_mmc[] = { | ||
128 | { | ||
129 | .mmc = 1, | ||
130 | .caps = MMC_CAP_4_BIT_DATA, | ||
131 | .gpio_cd = 144, | ||
132 | .gpio_wp = 59, | ||
133 | }, | ||
134 | { | ||
135 | .mmc = 2, | ||
136 | .caps = MMC_CAP_4_BIT_DATA, | ||
137 | .gpio_cd = -EINVAL, | ||
138 | .gpio_wp = -EINVAL, | ||
139 | }, | ||
140 | {} /* Terminator */ | ||
141 | }; | ||
142 | #else | ||
143 | #define cm_t3517_mmc NULL | ||
144 | #endif | ||
145 | |||
124 | #if defined(CONFIG_RTC_DRV_V3020) || defined(CONFIG_RTC_DRV_V3020_MODULE) | 146 | #if defined(CONFIG_RTC_DRV_V3020) || defined(CONFIG_RTC_DRV_V3020_MODULE) |
125 | #define RTC_IO_GPIO (153) | 147 | #define RTC_IO_GPIO (153) |
126 | #define RTC_WR_GPIO (154) | 148 | #define RTC_WR_GPIO (154) |
@@ -166,7 +188,7 @@ static inline void cm_t3517_init_rtc(void) {} | |||
166 | #define HSUSB2_RESET_GPIO (147) | 188 | #define HSUSB2_RESET_GPIO (147) |
167 | #define USB_HUB_RESET_GPIO (152) | 189 | #define USB_HUB_RESET_GPIO (152) |
168 | 190 | ||
169 | static struct usbhs_omap_board_data cm_t3517_ehci_pdata __initdata = { | 191 | static struct usbhs_omap_platform_data cm_t3517_ehci_pdata __initdata = { |
170 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, | 192 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, |
171 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, | 193 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, |
172 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, | 194 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, |
@@ -271,6 +293,10 @@ static struct omap_board_mux board_mux[] __initdata = { | |||
271 | /* CM-T3517 USB HUB nRESET */ | 293 | /* CM-T3517 USB HUB nRESET */ |
272 | OMAP3_MUX(MCBSP4_CLKX, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT), | 294 | OMAP3_MUX(MCBSP4_CLKX, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT), |
273 | 295 | ||
296 | /* CD - GPIO144 and WP - GPIO59 for MMC1 - SB-T35 */ | ||
297 | OMAP3_MUX(UART2_CTS, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP), | ||
298 | OMAP3_MUX(GPMC_CLK, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP), | ||
299 | |||
274 | { .reg_offset = OMAP_MUX_TERMINATOR }, | 300 | { .reg_offset = OMAP_MUX_TERMINATOR }, |
275 | }; | 301 | }; |
276 | #endif | 302 | #endif |
@@ -286,6 +312,7 @@ static void __init cm_t3517_init(void) | |||
286 | cm_t3517_init_usbh(); | 312 | cm_t3517_init_usbh(); |
287 | cm_t3517_init_hecc(); | 313 | cm_t3517_init_hecc(); |
288 | am35xx_emac_init(AM35XX_DEFAULT_MDIO_FREQUENCY, 1); | 314 | am35xx_emac_init(AM35XX_DEFAULT_MDIO_FREQUENCY, 1); |
315 | omap_hsmmc_init(cm_t3517_mmc); | ||
289 | } | 316 | } |
290 | 317 | ||
291 | MACHINE_START(CM_T3517, "Compulab CM-T3517") | 318 | MACHINE_START(CM_T3517, "Compulab CM-T3517") |
@@ -297,6 +324,6 @@ MACHINE_START(CM_T3517, "Compulab CM-T3517") | |||
297 | .handle_irq = omap3_intc_handle_irq, | 324 | .handle_irq = omap3_intc_handle_irq, |
298 | .init_machine = cm_t3517_init, | 325 | .init_machine = cm_t3517_init, |
299 | .init_late = am35xx_init_late, | 326 | .init_late = am35xx_init_late, |
300 | .timer = &omap3_gp_timer, | 327 | .init_time = omap3_gp_gptimer_timer_init, |
301 | .restart = omap3xxx_restart, | 328 | .restart = omap3xxx_restart, |
302 | MACHINE_END | 329 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c index 12865af25d3a..53056c3b0836 100644 --- a/arch/arm/mach-omap2/board-devkit8000.c +++ b/arch/arm/mach-omap2/board-devkit8000.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/mtd/partitions.h> | 29 | #include <linux/mtd/partitions.h> |
30 | #include <linux/mtd/nand.h> | 30 | #include <linux/mtd/nand.h> |
31 | #include <linux/mmc/host.h> | 31 | #include <linux/mmc/host.h> |
32 | #include <linux/usb/phy.h> | ||
32 | 33 | ||
33 | #include <linux/regulator/machine.h> | 34 | #include <linux/regulator/machine.h> |
34 | #include <linux/i2c/twl.h> | 35 | #include <linux/i2c/twl.h> |
@@ -435,7 +436,7 @@ static struct platform_device *devkit8000_devices[] __initdata = { | |||
435 | &omap_dm9000_dev, | 436 | &omap_dm9000_dev, |
436 | }; | 437 | }; |
437 | 438 | ||
438 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | 439 | static struct usbhs_omap_platform_data usbhs_bdata __initdata = { |
439 | 440 | ||
440 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, | 441 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, |
441 | .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED, | 442 | .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED, |
@@ -622,12 +623,13 @@ static void __init devkit8000_init(void) | |||
622 | 623 | ||
623 | omap_ads7846_init(2, OMAP3_DEVKIT_TS_GPIO, 0, NULL); | 624 | omap_ads7846_init(2, OMAP3_DEVKIT_TS_GPIO, 0, NULL); |
624 | 625 | ||
626 | usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb"); | ||
625 | usb_musb_init(NULL); | 627 | usb_musb_init(NULL); |
626 | usbhs_init(&usbhs_bdata); | 628 | usbhs_init(&usbhs_bdata); |
627 | board_nand_init(devkit8000_nand_partitions, | 629 | board_nand_init(devkit8000_nand_partitions, |
628 | ARRAY_SIZE(devkit8000_nand_partitions), NAND_CS, | 630 | ARRAY_SIZE(devkit8000_nand_partitions), NAND_CS, |
629 | NAND_BUSWIDTH_16, NULL); | 631 | NAND_BUSWIDTH_16, NULL); |
630 | omap_twl4030_audio_init("omap3beagle"); | 632 | omap_twl4030_audio_init("omap3beagle", NULL); |
631 | 633 | ||
632 | /* Ensure SDRC pins are mux'd for self-refresh */ | 634 | /* Ensure SDRC pins are mux'd for self-refresh */ |
633 | omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); | 635 | omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); |
@@ -643,6 +645,6 @@ MACHINE_START(DEVKIT8000, "OMAP3 Devkit8000") | |||
643 | .handle_irq = omap3_intc_handle_irq, | 645 | .handle_irq = omap3_intc_handle_irq, |
644 | .init_machine = devkit8000_init, | 646 | .init_machine = devkit8000_init, |
645 | .init_late = omap35xx_init_late, | 647 | .init_late = omap35xx_init_late, |
646 | .timer = &omap3_secure_timer, | 648 | .init_time = omap3_secure_sync32k_timer_init, |
647 | .restart = omap3xxx_restart, | 649 | .restart = omap3xxx_restart, |
648 | MACHINE_END | 650 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 53cb380b7877..0274ff7a2a2b 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c | |||
@@ -16,7 +16,6 @@ | |||
16 | #include <linux/of_platform.h> | 16 | #include <linux/of_platform.h> |
17 | #include <linux/irqdomain.h> | 17 | #include <linux/irqdomain.h> |
18 | 18 | ||
19 | #include <asm/hardware/gic.h> | ||
20 | #include <asm/mach/arch.h> | 19 | #include <asm/mach/arch.h> |
21 | 20 | ||
22 | #include "common.h" | 21 | #include "common.h" |
@@ -65,7 +64,7 @@ DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)") | |||
65 | .init_irq = omap_intc_of_init, | 64 | .init_irq = omap_intc_of_init, |
66 | .handle_irq = omap2_intc_handle_irq, | 65 | .handle_irq = omap2_intc_handle_irq, |
67 | .init_machine = omap_generic_init, | 66 | .init_machine = omap_generic_init, |
68 | .timer = &omap2_timer, | 67 | .init_time = omap2_sync32k_timer_init, |
69 | .dt_compat = omap242x_boards_compat, | 68 | .dt_compat = omap242x_boards_compat, |
70 | .restart = omap2xxx_restart, | 69 | .restart = omap2xxx_restart, |
71 | MACHINE_END | 70 | MACHINE_END |
@@ -84,7 +83,7 @@ DT_MACHINE_START(OMAP243X_DT, "Generic OMAP2430 (Flattened Device Tree)") | |||
84 | .init_irq = omap_intc_of_init, | 83 | .init_irq = omap_intc_of_init, |
85 | .handle_irq = omap2_intc_handle_irq, | 84 | .handle_irq = omap2_intc_handle_irq, |
86 | .init_machine = omap_generic_init, | 85 | .init_machine = omap_generic_init, |
87 | .timer = &omap2_timer, | 86 | .init_time = omap2_sync32k_timer_init, |
88 | .dt_compat = omap243x_boards_compat, | 87 | .dt_compat = omap243x_boards_compat, |
89 | .restart = omap2xxx_restart, | 88 | .restart = omap2xxx_restart, |
90 | MACHINE_END | 89 | MACHINE_END |
@@ -103,7 +102,7 @@ DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)") | |||
103 | .init_irq = omap_intc_of_init, | 102 | .init_irq = omap_intc_of_init, |
104 | .handle_irq = omap3_intc_handle_irq, | 103 | .handle_irq = omap3_intc_handle_irq, |
105 | .init_machine = omap_generic_init, | 104 | .init_machine = omap_generic_init, |
106 | .timer = &omap3_timer, | 105 | .init_time = omap3_sync32k_timer_init, |
107 | .dt_compat = omap3_boards_compat, | 106 | .dt_compat = omap3_boards_compat, |
108 | .restart = omap3xxx_restart, | 107 | .restart = omap3xxx_restart, |
109 | MACHINE_END | 108 | MACHINE_END |
@@ -120,7 +119,7 @@ DT_MACHINE_START(OMAP3_GP_DT, "Generic OMAP3-GP (Flattened Device Tree)") | |||
120 | .init_irq = omap_intc_of_init, | 119 | .init_irq = omap_intc_of_init, |
121 | .handle_irq = omap3_intc_handle_irq, | 120 | .handle_irq = omap3_intc_handle_irq, |
122 | .init_machine = omap_generic_init, | 121 | .init_machine = omap_generic_init, |
123 | .timer = &omap3_secure_timer, | 122 | .init_time = omap3_secure_sync32k_timer_init, |
124 | .dt_compat = omap3_gp_boards_compat, | 123 | .dt_compat = omap3_gp_boards_compat, |
125 | .restart = omap3xxx_restart, | 124 | .restart = omap3xxx_restart, |
126 | MACHINE_END | 125 | MACHINE_END |
@@ -139,8 +138,9 @@ DT_MACHINE_START(AM33XX_DT, "Generic AM33XX (Flattened Device Tree)") | |||
139 | .init_irq = omap_intc_of_init, | 138 | .init_irq = omap_intc_of_init, |
140 | .handle_irq = omap3_intc_handle_irq, | 139 | .handle_irq = omap3_intc_handle_irq, |
141 | .init_machine = omap_generic_init, | 140 | .init_machine = omap_generic_init, |
142 | .timer = &omap3_am33xx_timer, | 141 | .init_time = omap3_am33xx_gptimer_timer_init, |
143 | .dt_compat = am33xx_boards_compat, | 142 | .dt_compat = am33xx_boards_compat, |
143 | .restart = am33xx_restart, | ||
144 | MACHINE_END | 144 | MACHINE_END |
145 | #endif | 145 | #endif |
146 | 146 | ||
@@ -156,10 +156,9 @@ DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)") | |||
156 | .map_io = omap4_map_io, | 156 | .map_io = omap4_map_io, |
157 | .init_early = omap4430_init_early, | 157 | .init_early = omap4430_init_early, |
158 | .init_irq = omap_gic_of_init, | 158 | .init_irq = omap_gic_of_init, |
159 | .handle_irq = gic_handle_irq, | ||
160 | .init_machine = omap_generic_init, | 159 | .init_machine = omap_generic_init, |
161 | .init_late = omap4430_init_late, | 160 | .init_late = omap4430_init_late, |
162 | .timer = &omap4_timer, | 161 | .init_time = omap4_local_timer_init, |
163 | .dt_compat = omap4_boards_compat, | 162 | .dt_compat = omap4_boards_compat, |
164 | .restart = omap44xx_restart, | 163 | .restart = omap44xx_restart, |
165 | MACHINE_END | 164 | MACHINE_END |
@@ -177,9 +176,8 @@ DT_MACHINE_START(OMAP5_DT, "Generic OMAP5 (Flattened Device Tree)") | |||
177 | .map_io = omap5_map_io, | 176 | .map_io = omap5_map_io, |
178 | .init_early = omap5_init_early, | 177 | .init_early = omap5_init_early, |
179 | .init_irq = omap_gic_of_init, | 178 | .init_irq = omap_gic_of_init, |
180 | .handle_irq = gic_handle_irq, | ||
181 | .init_machine = omap_generic_init, | 179 | .init_machine = omap_generic_init, |
182 | .timer = &omap5_timer, | 180 | .init_time = omap5_realtime_timer_init, |
183 | .dt_compat = omap5_boards_compat, | 181 | .dt_compat = omap5_boards_compat, |
184 | .restart = omap44xx_restart, | 182 | .restart = omap44xx_restart, |
185 | MACHINE_END | 183 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index 3be1311f9e33..812c829fa46f 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c | |||
@@ -342,6 +342,6 @@ MACHINE_START(OMAP_H4, "OMAP2420 H4 board") | |||
342 | .handle_irq = omap2_intc_handle_irq, | 342 | .handle_irq = omap2_intc_handle_irq, |
343 | .init_machine = omap_h4_init, | 343 | .init_machine = omap_h4_init, |
344 | .init_late = omap2420_init_late, | 344 | .init_late = omap2420_init_late, |
345 | .timer = &omap2_timer, | 345 | .init_time = omap2_sync32k_timer_init, |
346 | .restart = omap2xxx_restart, | 346 | .restart = omap2xxx_restart, |
347 | MACHINE_END | 347 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c index 0f24cb84ba5a..bf92678a01d0 100644 --- a/arch/arm/mach-omap2/board-igep0020.c +++ b/arch/arm/mach-omap2/board-igep0020.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/gpio.h> | 18 | #include <linux/gpio.h> |
19 | #include <linux/interrupt.h> | 19 | #include <linux/interrupt.h> |
20 | #include <linux/input.h> | 20 | #include <linux/input.h> |
21 | #include <linux/usb/phy.h> | ||
21 | 22 | ||
22 | #include <linux/regulator/machine.h> | 23 | #include <linux/regulator/machine.h> |
23 | #include <linux/regulator/fixed.h> | 24 | #include <linux/regulator/fixed.h> |
@@ -300,20 +301,20 @@ static struct omap2_hsmmc_info mmc[] = { | |||
300 | 301 | ||
301 | static struct gpio_led igep_gpio_leds[] = { | 302 | static struct gpio_led igep_gpio_leds[] = { |
302 | [0] = { | 303 | [0] = { |
303 | .name = "gpio-led:red:d0", | 304 | .name = "omap3:red:user0", |
304 | .default_trigger = "default-off" | 305 | .default_state = 0, |
305 | }, | 306 | }, |
306 | [1] = { | 307 | [1] = { |
307 | .name = "gpio-led:green:d0", | 308 | .name = "omap3:green:boot", |
308 | .default_trigger = "default-off", | 309 | .default_state = 1, |
309 | }, | 310 | }, |
310 | [2] = { | 311 | [2] = { |
311 | .name = "gpio-led:red:d1", | 312 | .name = "omap3:red:user1", |
312 | .default_trigger = "default-off", | 313 | .default_state = 0, |
313 | }, | 314 | }, |
314 | [3] = { | 315 | [3] = { |
315 | .name = "gpio-led:green:d1", | 316 | .name = "omap3:green:user1", |
316 | .default_trigger = "heartbeat", | 317 | .default_state = 0, |
317 | .gpio = -EINVAL, /* gets replaced */ | 318 | .gpio = -EINVAL, /* gets replaced */ |
318 | .active_low = 1, | 319 | .active_low = 1, |
319 | }, | 320 | }, |
@@ -526,7 +527,7 @@ static void __init igep_i2c_init(void) | |||
526 | omap3_pmic_init("twl4030", &igep_twldata); | 527 | omap3_pmic_init("twl4030", &igep_twldata); |
527 | } | 528 | } |
528 | 529 | ||
529 | static const struct usbhs_omap_board_data igep2_usbhs_bdata __initconst = { | 530 | static struct usbhs_omap_platform_data igep2_usbhs_bdata __initdata = { |
530 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, | 531 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, |
531 | .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED, | 532 | .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED, |
532 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, | 533 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, |
@@ -537,7 +538,7 @@ static const struct usbhs_omap_board_data igep2_usbhs_bdata __initconst = { | |||
537 | .reset_gpio_port[2] = -EINVAL, | 538 | .reset_gpio_port[2] = -EINVAL, |
538 | }; | 539 | }; |
539 | 540 | ||
540 | static const struct usbhs_omap_board_data igep3_usbhs_bdata __initconst = { | 541 | static struct usbhs_omap_platform_data igep3_usbhs_bdata __initdata = { |
541 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, | 542 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, |
542 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, | 543 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, |
543 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, | 544 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, |
@@ -625,11 +626,12 @@ static void __init igep_init(void) | |||
625 | omap_serial_init(); | 626 | omap_serial_init(); |
626 | omap_sdrc_init(m65kxxxxam_sdrc_params, | 627 | omap_sdrc_init(m65kxxxxam_sdrc_params, |
627 | m65kxxxxam_sdrc_params); | 628 | m65kxxxxam_sdrc_params); |
629 | usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb"); | ||
628 | usb_musb_init(NULL); | 630 | usb_musb_init(NULL); |
629 | 631 | ||
630 | igep_flash_init(); | 632 | igep_flash_init(); |
631 | igep_leds_init(); | 633 | igep_leds_init(); |
632 | omap_twl4030_audio_init("igep2"); | 634 | omap_twl4030_audio_init("igep2", NULL); |
633 | 635 | ||
634 | /* | 636 | /* |
635 | * WLAN-BT combo module from MuRata which has a Marvell WLAN | 637 | * WLAN-BT combo module from MuRata which has a Marvell WLAN |
@@ -655,7 +657,7 @@ MACHINE_START(IGEP0020, "IGEP v2 board") | |||
655 | .handle_irq = omap3_intc_handle_irq, | 657 | .handle_irq = omap3_intc_handle_irq, |
656 | .init_machine = igep_init, | 658 | .init_machine = igep_init, |
657 | .init_late = omap35xx_init_late, | 659 | .init_late = omap35xx_init_late, |
658 | .timer = &omap3_timer, | 660 | .init_time = omap3_sync32k_timer_init, |
659 | .restart = omap3xxx_restart, | 661 | .restart = omap3xxx_restart, |
660 | MACHINE_END | 662 | MACHINE_END |
661 | 663 | ||
@@ -668,6 +670,6 @@ MACHINE_START(IGEP0030, "IGEP OMAP3 module") | |||
668 | .handle_irq = omap3_intc_handle_irq, | 670 | .handle_irq = omap3_intc_handle_irq, |
669 | .init_machine = igep_init, | 671 | .init_machine = igep_init, |
670 | .init_late = omap35xx_init_late, | 672 | .init_late = omap35xx_init_late, |
671 | .timer = &omap3_timer, | 673 | .init_time = omap3_sync32k_timer_init, |
672 | .restart = omap3xxx_restart, | 674 | .restart = omap3xxx_restart, |
673 | MACHINE_END | 675 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index 0869f4f3d3e1..b12fe966a7b9 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/io.h> | 28 | #include <linux/io.h> |
29 | #include <linux/smsc911x.h> | 29 | #include <linux/smsc911x.h> |
30 | #include <linux/mmc/host.h> | 30 | #include <linux/mmc/host.h> |
31 | #include <linux/usb/phy.h> | ||
31 | #include <linux/platform_data/spi-omap2-mcspi.h> | 32 | #include <linux/platform_data/spi-omap2-mcspi.h> |
32 | 33 | ||
33 | #include <asm/mach-types.h> | 34 | #include <asm/mach-types.h> |
@@ -418,6 +419,7 @@ static void __init omap_ldp_init(void) | |||
418 | omap_ads7846_init(1, 54, 310, NULL); | 419 | omap_ads7846_init(1, 54, 310, NULL); |
419 | omap_serial_init(); | 420 | omap_serial_init(); |
420 | omap_sdrc_init(NULL, NULL); | 421 | omap_sdrc_init(NULL, NULL); |
422 | usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb"); | ||
421 | usb_musb_init(NULL); | 423 | usb_musb_init(NULL); |
422 | board_nand_init(ldp_nand_partitions, ARRAY_SIZE(ldp_nand_partitions), | 424 | board_nand_init(ldp_nand_partitions, ARRAY_SIZE(ldp_nand_partitions), |
423 | ZOOM_NAND_CS, 0, nand_default_timings); | 425 | ZOOM_NAND_CS, 0, nand_default_timings); |
@@ -435,6 +437,6 @@ MACHINE_START(OMAP_LDP, "OMAP LDP board") | |||
435 | .handle_irq = omap3_intc_handle_irq, | 437 | .handle_irq = omap3_intc_handle_irq, |
436 | .init_machine = omap_ldp_init, | 438 | .init_machine = omap_ldp_init, |
437 | .init_late = omap3430_init_late, | 439 | .init_late = omap3430_init_late, |
438 | .timer = &omap3_timer, | 440 | .init_time = omap3_sync32k_timer_init, |
439 | .restart = omap3xxx_restart, | 441 | .restart = omap3xxx_restart, |
440 | MACHINE_END | 442 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c index 0abb30fe399c..f6eeb87e4e95 100644 --- a/arch/arm/mach-omap2/board-n8x0.c +++ b/arch/arm/mach-omap2/board-n8x0.c | |||
@@ -731,7 +731,7 @@ MACHINE_START(NOKIA_N800, "Nokia N800") | |||
731 | .handle_irq = omap2_intc_handle_irq, | 731 | .handle_irq = omap2_intc_handle_irq, |
732 | .init_machine = n8x0_init_machine, | 732 | .init_machine = n8x0_init_machine, |
733 | .init_late = omap2420_init_late, | 733 | .init_late = omap2420_init_late, |
734 | .timer = &omap2_timer, | 734 | .init_time = omap2_sync32k_timer_init, |
735 | .restart = omap2xxx_restart, | 735 | .restart = omap2xxx_restart, |
736 | MACHINE_END | 736 | MACHINE_END |
737 | 737 | ||
@@ -744,7 +744,7 @@ MACHINE_START(NOKIA_N810, "Nokia N810") | |||
744 | .handle_irq = omap2_intc_handle_irq, | 744 | .handle_irq = omap2_intc_handle_irq, |
745 | .init_machine = n8x0_init_machine, | 745 | .init_machine = n8x0_init_machine, |
746 | .init_late = omap2420_init_late, | 746 | .init_late = omap2420_init_late, |
747 | .timer = &omap2_timer, | 747 | .init_time = omap2_sync32k_timer_init, |
748 | .restart = omap2xxx_restart, | 748 | .restart = omap2xxx_restart, |
749 | MACHINE_END | 749 | MACHINE_END |
750 | 750 | ||
@@ -757,6 +757,6 @@ MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX") | |||
757 | .handle_irq = omap2_intc_handle_irq, | 757 | .handle_irq = omap2_intc_handle_irq, |
758 | .init_machine = n8x0_init_machine, | 758 | .init_machine = n8x0_init_machine, |
759 | .init_late = omap2420_init_late, | 759 | .init_late = omap2420_init_late, |
760 | .timer = &omap2_timer, | 760 | .init_time = omap2_sync32k_timer_init, |
761 | .restart = omap2xxx_restart, | 761 | .restart = omap2xxx_restart, |
762 | MACHINE_END | 762 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c index 1957426b96fe..6c949bc86256 100644 --- a/arch/arm/mach-omap2/board-omap3beagle.c +++ b/arch/arm/mach-omap2/board-omap3beagle.c | |||
@@ -20,6 +20,8 @@ | |||
20 | #include <linux/clk.h> | 20 | #include <linux/clk.h> |
21 | #include <linux/io.h> | 21 | #include <linux/io.h> |
22 | #include <linux/leds.h> | 22 | #include <linux/leds.h> |
23 | #include <linux/pwm.h> | ||
24 | #include <linux/leds_pwm.h> | ||
23 | #include <linux/gpio.h> | 25 | #include <linux/gpio.h> |
24 | #include <linux/input.h> | 26 | #include <linux/input.h> |
25 | #include <linux/gpio_keys.h> | 27 | #include <linux/gpio_keys.h> |
@@ -30,6 +32,7 @@ | |||
30 | #include <linux/mtd/partitions.h> | 32 | #include <linux/mtd/partitions.h> |
31 | #include <linux/mtd/nand.h> | 33 | #include <linux/mtd/nand.h> |
32 | #include <linux/mmc/host.h> | 34 | #include <linux/mmc/host.h> |
35 | #include <linux/usb/phy.h> | ||
33 | 36 | ||
34 | #include <linux/regulator/machine.h> | 37 | #include <linux/regulator/machine.h> |
35 | #include <linux/i2c/twl.h> | 38 | #include <linux/i2c/twl.h> |
@@ -55,6 +58,32 @@ | |||
55 | 58 | ||
56 | #define NAND_CS 0 | 59 | #define NAND_CS 0 |
57 | 60 | ||
61 | static struct pwm_lookup pwm_lookup[] = { | ||
62 | /* LEDB -> PMU_STAT */ | ||
63 | PWM_LOOKUP("twl-pwmled", 1, "leds_pwm", "beagleboard::pmu_stat"), | ||
64 | }; | ||
65 | |||
66 | static struct led_pwm pwm_leds[] = { | ||
67 | { | ||
68 | .name = "beagleboard::pmu_stat", | ||
69 | .max_brightness = 127, | ||
70 | .pwm_period_ns = 7812500, | ||
71 | }, | ||
72 | }; | ||
73 | |||
74 | static struct led_pwm_platform_data pwm_data = { | ||
75 | .num_leds = ARRAY_SIZE(pwm_leds), | ||
76 | .leds = pwm_leds, | ||
77 | }; | ||
78 | |||
79 | static struct platform_device leds_pwm = { | ||
80 | .name = "leds_pwm", | ||
81 | .id = -1, | ||
82 | .dev = { | ||
83 | .platform_data = &pwm_data, | ||
84 | }, | ||
85 | }; | ||
86 | |||
58 | /* | 87 | /* |
59 | * OMAP3 Beagle revision | 88 | * OMAP3 Beagle revision |
60 | * Run time detection of Beagle revision is done by reading GPIO. | 89 | * Run time detection of Beagle revision is done by reading GPIO. |
@@ -292,9 +321,6 @@ static int beagle_twl_gpio_setup(struct device *dev, | |||
292 | gpio_request_one(gpio + TWL4030_GPIO_MAX, beagle_config.usb_pwr_level, | 321 | gpio_request_one(gpio + TWL4030_GPIO_MAX, beagle_config.usb_pwr_level, |
293 | "nEN_USB_PWR"); | 322 | "nEN_USB_PWR"); |
294 | 323 | ||
295 | /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ | ||
296 | gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; | ||
297 | |||
298 | return 0; | 324 | return 0; |
299 | } | 325 | } |
300 | 326 | ||
@@ -376,11 +402,6 @@ static struct gpio_led gpio_leds[] = { | |||
376 | .default_trigger = "mmc0", | 402 | .default_trigger = "mmc0", |
377 | .gpio = 149, | 403 | .gpio = 149, |
378 | }, | 404 | }, |
379 | { | ||
380 | .name = "beagleboard::pmu_stat", | ||
381 | .gpio = -EINVAL, /* gets replaced */ | ||
382 | .active_low = true, | ||
383 | }, | ||
384 | }; | 405 | }; |
385 | 406 | ||
386 | static struct gpio_led_platform_data gpio_led_info = { | 407 | static struct gpio_led_platform_data gpio_led_info = { |
@@ -428,9 +449,10 @@ static struct platform_device *omap3_beagle_devices[] __initdata = { | |||
428 | &leds_gpio, | 449 | &leds_gpio, |
429 | &keys_gpio, | 450 | &keys_gpio, |
430 | &madc_hwmon, | 451 | &madc_hwmon, |
452 | &leds_pwm, | ||
431 | }; | 453 | }; |
432 | 454 | ||
433 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | 455 | static struct usbhs_omap_platform_data usbhs_bdata __initdata = { |
434 | 456 | ||
435 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, | 457 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, |
436 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, | 458 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, |
@@ -494,7 +516,7 @@ static int __init beagle_opp_init(void) | |||
494 | } | 516 | } |
495 | return 0; | 517 | return 0; |
496 | } | 518 | } |
497 | device_initcall(beagle_opp_init); | 519 | omap_device_initcall(beagle_opp_init); |
498 | 520 | ||
499 | static void __init omap3_beagle_init(void) | 521 | static void __init omap3_beagle_init(void) |
500 | { | 522 | { |
@@ -519,12 +541,13 @@ static void __init omap3_beagle_init(void) | |||
519 | omap_sdrc_init(mt46h32m32lf6_sdrc_params, | 541 | omap_sdrc_init(mt46h32m32lf6_sdrc_params, |
520 | mt46h32m32lf6_sdrc_params); | 542 | mt46h32m32lf6_sdrc_params); |
521 | 543 | ||
544 | usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb"); | ||
522 | usb_musb_init(NULL); | 545 | usb_musb_init(NULL); |
523 | usbhs_init(&usbhs_bdata); | 546 | usbhs_init(&usbhs_bdata); |
524 | board_nand_init(omap3beagle_nand_partitions, | 547 | board_nand_init(omap3beagle_nand_partitions, |
525 | ARRAY_SIZE(omap3beagle_nand_partitions), NAND_CS, | 548 | ARRAY_SIZE(omap3beagle_nand_partitions), NAND_CS, |
526 | NAND_BUSWIDTH_16, NULL); | 549 | NAND_BUSWIDTH_16, NULL); |
527 | omap_twl4030_audio_init("omap3beagle"); | 550 | omap_twl4030_audio_init("omap3beagle", NULL); |
528 | 551 | ||
529 | /* Ensure msecure is mux'd to be able to set the RTC. */ | 552 | /* Ensure msecure is mux'd to be able to set the RTC. */ |
530 | omap_mux_init_signal("sys_drm_msecure", OMAP_PIN_OFF_OUTPUT_HIGH); | 553 | omap_mux_init_signal("sys_drm_msecure", OMAP_PIN_OFF_OUTPUT_HIGH); |
@@ -532,6 +555,8 @@ static void __init omap3_beagle_init(void) | |||
532 | /* Ensure SDRC pins are mux'd for self-refresh */ | 555 | /* Ensure SDRC pins are mux'd for self-refresh */ |
533 | omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); | 556 | omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); |
534 | omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT); | 557 | omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT); |
558 | |||
559 | pwm_add_table(pwm_lookup, ARRAY_SIZE(pwm_lookup)); | ||
535 | } | 560 | } |
536 | 561 | ||
537 | MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board") | 562 | MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board") |
@@ -544,6 +569,6 @@ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board") | |||
544 | .handle_irq = omap3_intc_handle_irq, | 569 | .handle_irq = omap3_intc_handle_irq, |
545 | .init_machine = omap3_beagle_init, | 570 | .init_machine = omap3_beagle_init, |
546 | .init_late = omap3_init_late, | 571 | .init_late = omap3_init_late, |
547 | .timer = &omap3_secure_timer, | 572 | .init_time = omap3_secure_sync32k_timer_init, |
548 | .restart = omap3xxx_restart, | 573 | .restart = omap3xxx_restart, |
549 | MACHINE_END | 574 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c index 3985f35aee06..48789e0bb915 100644 --- a/arch/arm/mach-omap2/board-omap3evm.c +++ b/arch/arm/mach-omap2/board-omap3evm.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <linux/regulator/machine.h> | 41 | #include <linux/regulator/machine.h> |
42 | #include <linux/mmc/host.h> | 42 | #include <linux/mmc/host.h> |
43 | #include <linux/export.h> | 43 | #include <linux/export.h> |
44 | #include <linux/usb/phy.h> | ||
44 | 45 | ||
45 | #include <asm/mach-types.h> | 46 | #include <asm/mach-types.h> |
46 | #include <asm/mach/arch.h> | 47 | #include <asm/mach/arch.h> |
@@ -309,7 +310,7 @@ static struct omap2_hsmmc_info mmc[] = { | |||
309 | .gpio_wp = 63, | 310 | .gpio_wp = 63, |
310 | .deferred = true, | 311 | .deferred = true, |
311 | }, | 312 | }, |
312 | #ifdef CONFIG_WL12XX_PLATFORM_DATA | 313 | #ifdef CONFIG_WILINK_PLATFORM_DATA |
313 | { | 314 | { |
314 | .name = "wl1271", | 315 | .name = "wl1271", |
315 | .mmc = 2, | 316 | .mmc = 2, |
@@ -450,7 +451,7 @@ static struct regulator_init_data omap3evm_vio = { | |||
450 | .consumer_supplies = omap3evm_vio_supply, | 451 | .consumer_supplies = omap3evm_vio_supply, |
451 | }; | 452 | }; |
452 | 453 | ||
453 | #ifdef CONFIG_WL12XX_PLATFORM_DATA | 454 | #ifdef CONFIG_WILINK_PLATFORM_DATA |
454 | 455 | ||
455 | #define OMAP3EVM_WLAN_PMENA_GPIO (150) | 456 | #define OMAP3EVM_WLAN_PMENA_GPIO (150) |
456 | #define OMAP3EVM_WLAN_IRQ_GPIO (149) | 457 | #define OMAP3EVM_WLAN_IRQ_GPIO (149) |
@@ -538,7 +539,7 @@ static int __init omap3_evm_i2c_init(void) | |||
538 | return 0; | 539 | return 0; |
539 | } | 540 | } |
540 | 541 | ||
541 | static struct usbhs_omap_board_data usbhs_bdata __initdata = { | 542 | static struct usbhs_omap_platform_data usbhs_bdata __initdata = { |
542 | 543 | ||
543 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, | 544 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, |
544 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, | 545 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, |
@@ -563,7 +564,7 @@ static struct omap_board_mux omap35x_board_mux[] __initdata = { | |||
563 | OMAP_PIN_OFF_NONE), | 564 | OMAP_PIN_OFF_NONE), |
564 | OMAP3_MUX(GPMC_WAIT2, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP | | 565 | OMAP3_MUX(GPMC_WAIT2, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP | |
565 | OMAP_PIN_OFF_NONE), | 566 | OMAP_PIN_OFF_NONE), |
566 | #ifdef CONFIG_WL12XX_PLATFORM_DATA | 567 | #ifdef CONFIG_WILINK_PLATFORM_DATA |
567 | /* WLAN IRQ - GPIO 149 */ | 568 | /* WLAN IRQ - GPIO 149 */ |
568 | OMAP3_MUX(UART1_RTS, OMAP_MUX_MODE4 | OMAP_PIN_INPUT), | 569 | OMAP3_MUX(UART1_RTS, OMAP_MUX_MODE4 | OMAP_PIN_INPUT), |
569 | 570 | ||
@@ -601,7 +602,7 @@ static struct omap_board_mux omap36x_board_mux[] __initdata = { | |||
601 | OMAP3_MUX(SYS_BOOT4, OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE), | 602 | OMAP3_MUX(SYS_BOOT4, OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE), |
602 | OMAP3_MUX(SYS_BOOT5, OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE), | 603 | OMAP3_MUX(SYS_BOOT5, OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE), |
603 | OMAP3_MUX(SYS_BOOT6, OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE), | 604 | OMAP3_MUX(SYS_BOOT6, OMAP_MUX_MODE3 | OMAP_PIN_OFF_NONE), |
604 | #ifdef CONFIG_WL12XX_PLATFORM_DATA | 605 | #ifdef CONFIG_WILINK_PLATFORM_DATA |
605 | /* WLAN IRQ - GPIO 149 */ | 606 | /* WLAN IRQ - GPIO 149 */ |
606 | OMAP3_MUX(UART1_RTS, OMAP_MUX_MODE4 | OMAP_PIN_INPUT), | 607 | OMAP3_MUX(UART1_RTS, OMAP_MUX_MODE4 | OMAP_PIN_INPUT), |
607 | 608 | ||
@@ -637,7 +638,7 @@ static struct gpio omap3_evm_ehci_gpios[] __initdata = { | |||
637 | 638 | ||
638 | static void __init omap3_evm_wl12xx_init(void) | 639 | static void __init omap3_evm_wl12xx_init(void) |
639 | { | 640 | { |
640 | #ifdef CONFIG_WL12XX_PLATFORM_DATA | 641 | #ifdef CONFIG_WILINK_PLATFORM_DATA |
641 | int ret; | 642 | int ret; |
642 | 643 | ||
643 | /* WL12xx WLAN Init */ | 644 | /* WL12xx WLAN Init */ |
@@ -734,6 +735,7 @@ static void __init omap3_evm_init(void) | |||
734 | omap_mux_init_gpio(135, OMAP_PIN_OUTPUT); | 735 | omap_mux_init_gpio(135, OMAP_PIN_OUTPUT); |
735 | usbhs_bdata.reset_gpio_port[1] = 135; | 736 | usbhs_bdata.reset_gpio_port[1] = 135; |
736 | } | 737 | } |
738 | usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb"); | ||
737 | usb_musb_init(&musb_board_data); | 739 | usb_musb_init(&musb_board_data); |
738 | usbhs_init(&usbhs_bdata); | 740 | usbhs_init(&usbhs_bdata); |
739 | board_nand_init(omap3evm_nand_partitions, | 741 | board_nand_init(omap3evm_nand_partitions, |
@@ -744,7 +746,7 @@ static void __init omap3_evm_init(void) | |||
744 | omap3evm_init_smsc911x(); | 746 | omap3evm_init_smsc911x(); |
745 | omap3_evm_display_init(); | 747 | omap3_evm_display_init(); |
746 | omap3_evm_wl12xx_init(); | 748 | omap3_evm_wl12xx_init(); |
747 | omap_twl4030_audio_init("omap3evm"); | 749 | omap_twl4030_audio_init("omap3evm", NULL); |
748 | } | 750 | } |
749 | 751 | ||
750 | MACHINE_START(OMAP3EVM, "OMAP3 EVM") | 752 | MACHINE_START(OMAP3EVM, "OMAP3 EVM") |
@@ -757,6 +759,6 @@ MACHINE_START(OMAP3EVM, "OMAP3 EVM") | |||
757 | .handle_irq = omap3_intc_handle_irq, | 759 | .handle_irq = omap3_intc_handle_irq, |
758 | .init_machine = omap3_evm_init, | 760 | .init_machine = omap3_evm_init, |
759 | .init_late = omap35xx_init_late, | 761 | .init_late = omap35xx_init_late, |
760 | .timer = &omap3_timer, | 762 | .init_time = omap3_sync32k_timer_init, |
761 | .restart = omap3xxx_restart, | 763 | .restart = omap3xxx_restart, |
762 | MACHINE_END | 764 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3logic.c b/arch/arm/mach-omap2/board-omap3logic.c index 2a065ba6eb58..bab51e64c4b5 100644 --- a/arch/arm/mach-omap2/board-omap3logic.c +++ b/arch/arm/mach-omap2/board-omap3logic.c | |||
@@ -29,6 +29,7 @@ | |||
29 | 29 | ||
30 | #include <linux/i2c/twl.h> | 30 | #include <linux/i2c/twl.h> |
31 | #include <linux/mmc/host.h> | 31 | #include <linux/mmc/host.h> |
32 | #include <linux/usb/phy.h> | ||
32 | 33 | ||
33 | #include <asm/mach-types.h> | 34 | #include <asm/mach-types.h> |
34 | #include <asm/mach/arch.h> | 35 | #include <asm/mach/arch.h> |
@@ -215,6 +216,7 @@ static void __init omap3logic_init(void) | |||
215 | board_mmc_init(); | 216 | board_mmc_init(); |
216 | board_smsc911x_init(); | 217 | board_smsc911x_init(); |
217 | 218 | ||
219 | usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb"); | ||
218 | usb_musb_init(NULL); | 220 | usb_musb_init(NULL); |
219 | 221 | ||
220 | /* Ensure SDRC pins are mux'd for self-refresh */ | 222 | /* Ensure SDRC pins are mux'd for self-refresh */ |
@@ -231,7 +233,7 @@ MACHINE_START(OMAP3_TORPEDO, "Logic OMAP3 Torpedo board") | |||
231 | .handle_irq = omap3_intc_handle_irq, | 233 | .handle_irq = omap3_intc_handle_irq, |
232 | .init_machine = omap3logic_init, | 234 | .init_machine = omap3logic_init, |
233 | .init_late = omap35xx_init_late, | 235 | .init_late = omap35xx_init_late, |
234 | .timer = &omap3_timer, | 236 | .init_time = omap3_sync32k_timer_init, |
235 | .restart = omap3xxx_restart, | 237 | .restart = omap3xxx_restart, |
236 | MACHINE_END | 238 | MACHINE_END |
237 | 239 | ||
@@ -244,6 +246,6 @@ MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board") | |||
244 | .handle_irq = omap3_intc_handle_irq, | 246 | .handle_irq = omap3_intc_handle_irq, |
245 | .init_machine = omap3logic_init, | 247 | .init_machine = omap3logic_init, |
246 | .init_late = omap35xx_init_late, | 248 | .init_late = omap35xx_init_late, |
247 | .timer = &omap3_timer, | 249 | .init_time = omap3_sync32k_timer_init, |
248 | .restart = omap3xxx_restart, | 250 | .restart = omap3xxx_restart, |
249 | MACHINE_END | 251 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c index a53a6683c1b8..2bba362148a0 100644 --- a/arch/arm/mach-omap2/board-omap3pandora.c +++ b/arch/arm/mach-omap2/board-omap3pandora.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <linux/mmc/host.h> | 35 | #include <linux/mmc/host.h> |
36 | #include <linux/mmc/card.h> | 36 | #include <linux/mmc/card.h> |
37 | #include <linux/regulator/fixed.h> | 37 | #include <linux/regulator/fixed.h> |
38 | #include <linux/usb/phy.h> | ||
38 | #include <linux/platform_data/spi-omap2-mcspi.h> | 39 | #include <linux/platform_data/spi-omap2-mcspi.h> |
39 | 40 | ||
40 | #include <asm/mach-types.h> | 41 | #include <asm/mach-types.h> |
@@ -567,7 +568,7 @@ static struct platform_device *omap3pandora_devices[] __initdata = { | |||
567 | &pandora_backlight, | 568 | &pandora_backlight, |
568 | }; | 569 | }; |
569 | 570 | ||
570 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | 571 | static struct usbhs_omap_platform_data usbhs_bdata __initdata = { |
571 | 572 | ||
572 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, | 573 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, |
573 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, | 574 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, |
@@ -601,6 +602,7 @@ static void __init omap3pandora_init(void) | |||
601 | ARRAY_SIZE(omap3pandora_spi_board_info)); | 602 | ARRAY_SIZE(omap3pandora_spi_board_info)); |
602 | omap_ads7846_init(1, OMAP3_PANDORA_TS_GPIO, 0, NULL); | 603 | omap_ads7846_init(1, OMAP3_PANDORA_TS_GPIO, 0, NULL); |
603 | usbhs_init(&usbhs_bdata); | 604 | usbhs_init(&usbhs_bdata); |
605 | usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb"); | ||
604 | usb_musb_init(NULL); | 606 | usb_musb_init(NULL); |
605 | gpmc_nand_init(&pandora_nand_data, NULL); | 607 | gpmc_nand_init(&pandora_nand_data, NULL); |
606 | 608 | ||
@@ -618,6 +620,6 @@ MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console") | |||
618 | .handle_irq = omap3_intc_handle_irq, | 620 | .handle_irq = omap3_intc_handle_irq, |
619 | .init_machine = omap3pandora_init, | 621 | .init_machine = omap3pandora_init, |
620 | .init_late = omap35xx_init_late, | 622 | .init_late = omap35xx_init_late, |
621 | .timer = &omap3_timer, | 623 | .init_time = omap3_sync32k_timer_init, |
622 | .restart = omap3xxx_restart, | 624 | .restart = omap3xxx_restart, |
623 | MACHINE_END | 625 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3stalker.c b/arch/arm/mach-omap2/board-omap3stalker.c index 53a6cbcf9747..95c10b3aa678 100644 --- a/arch/arm/mach-omap2/board-omap3stalker.c +++ b/arch/arm/mach-omap2/board-omap3stalker.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/interrupt.h> | 33 | #include <linux/interrupt.h> |
34 | #include <linux/smsc911x.h> | 34 | #include <linux/smsc911x.h> |
35 | #include <linux/i2c/at24.h> | 35 | #include <linux/i2c/at24.h> |
36 | #include <linux/usb/phy.h> | ||
36 | 37 | ||
37 | #include <asm/mach-types.h> | 38 | #include <asm/mach-types.h> |
38 | #include <asm/mach/arch.h> | 39 | #include <asm/mach/arch.h> |
@@ -361,7 +362,7 @@ static struct platform_device *omap3_stalker_devices[] __initdata = { | |||
361 | &keys_gpio, | 362 | &keys_gpio, |
362 | }; | 363 | }; |
363 | 364 | ||
364 | static struct usbhs_omap_board_data usbhs_bdata __initconst = { | 365 | static struct usbhs_omap_platform_data usbhs_bdata __initdata = { |
365 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, | 366 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, |
366 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, | 367 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, |
367 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, | 368 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, |
@@ -404,6 +405,7 @@ static void __init omap3_stalker_init(void) | |||
404 | 405 | ||
405 | omap_serial_init(); | 406 | omap_serial_init(); |
406 | omap_sdrc_init(mt46h32m32lf6_sdrc_params, NULL); | 407 | omap_sdrc_init(mt46h32m32lf6_sdrc_params, NULL); |
408 | usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb"); | ||
407 | usb_musb_init(NULL); | 409 | usb_musb_init(NULL); |
408 | usbhs_init(&usbhs_bdata); | 410 | usbhs_init(&usbhs_bdata); |
409 | omap_ads7846_init(1, OMAP3_STALKER_TS_GPIO, 310, NULL); | 411 | omap_ads7846_init(1, OMAP3_STALKER_TS_GPIO, 310, NULL); |
@@ -427,6 +429,6 @@ MACHINE_START(SBC3530, "OMAP3 STALKER") | |||
427 | .handle_irq = omap3_intc_handle_irq, | 429 | .handle_irq = omap3_intc_handle_irq, |
428 | .init_machine = omap3_stalker_init, | 430 | .init_machine = omap3_stalker_init, |
429 | .init_late = omap35xx_init_late, | 431 | .init_late = omap35xx_init_late, |
430 | .timer = &omap3_secure_timer, | 432 | .init_time = omap3_secure_sync32k_timer_init, |
431 | .restart = omap3xxx_restart, | 433 | .restart = omap3xxx_restart, |
432 | MACHINE_END | 434 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c index 263cb9cfbf37..bcd44fbcd877 100644 --- a/arch/arm/mach-omap2/board-omap3touchbook.c +++ b/arch/arm/mach-omap2/board-omap3touchbook.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/mtd/partitions.h> | 28 | #include <linux/mtd/partitions.h> |
29 | #include <linux/mtd/nand.h> | 29 | #include <linux/mtd/nand.h> |
30 | #include <linux/mmc/host.h> | 30 | #include <linux/mmc/host.h> |
31 | #include <linux/usb/phy.h> | ||
31 | 32 | ||
32 | #include <linux/platform_data/spi-omap2-mcspi.h> | 33 | #include <linux/platform_data/spi-omap2-mcspi.h> |
33 | #include <linux/spi/spi.h> | 34 | #include <linux/spi/spi.h> |
@@ -309,7 +310,7 @@ static struct platform_device *omap3_touchbook_devices[] __initdata = { | |||
309 | &keys_gpio, | 310 | &keys_gpio, |
310 | }; | 311 | }; |
311 | 312 | ||
312 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | 313 | static struct usbhs_omap_platform_data usbhs_bdata __initdata = { |
313 | 314 | ||
314 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, | 315 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, |
315 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, | 316 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, |
@@ -365,6 +366,7 @@ static void __init omap3_touchbook_init(void) | |||
365 | 366 | ||
366 | /* Touchscreen and accelerometer */ | 367 | /* Touchscreen and accelerometer */ |
367 | omap_ads7846_init(4, OMAP3_TS_GPIO, 310, &ads7846_pdata); | 368 | omap_ads7846_init(4, OMAP3_TS_GPIO, 310, &ads7846_pdata); |
369 | usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb"); | ||
368 | usb_musb_init(NULL); | 370 | usb_musb_init(NULL); |
369 | usbhs_init(&usbhs_bdata); | 371 | usbhs_init(&usbhs_bdata); |
370 | board_nand_init(omap3touchbook_nand_partitions, | 372 | board_nand_init(omap3touchbook_nand_partitions, |
@@ -386,6 +388,6 @@ MACHINE_START(TOUCHBOOK, "OMAP3 touchbook Board") | |||
386 | .handle_irq = omap3_intc_handle_irq, | 388 | .handle_irq = omap3_intc_handle_irq, |
387 | .init_machine = omap3_touchbook_init, | 389 | .init_machine = omap3_touchbook_init, |
388 | .init_late = omap3430_init_late, | 390 | .init_late = omap3430_init_late, |
389 | .timer = &omap3_secure_timer, | 391 | .init_time = omap3_secure_sync32k_timer_init, |
390 | .restart = omap3xxx_restart, | 392 | .restart = omap3xxx_restart, |
391 | MACHINE_END | 393 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c index 769c1feee1c4..b02c2f00609b 100644 --- a/arch/arm/mach-omap2/board-omap4panda.c +++ b/arch/arm/mach-omap2/board-omap4panda.c | |||
@@ -30,10 +30,11 @@ | |||
30 | #include <linux/regulator/fixed.h> | 30 | #include <linux/regulator/fixed.h> |
31 | #include <linux/ti_wilink_st.h> | 31 | #include <linux/ti_wilink_st.h> |
32 | #include <linux/usb/musb.h> | 32 | #include <linux/usb/musb.h> |
33 | #include <linux/usb/phy.h> | ||
33 | #include <linux/wl12xx.h> | 34 | #include <linux/wl12xx.h> |
35 | #include <linux/irqchip/arm-gic.h> | ||
34 | #include <linux/platform_data/omap-abe-twl6040.h> | 36 | #include <linux/platform_data/omap-abe-twl6040.h> |
35 | 37 | ||
36 | #include <asm/hardware/gic.h> | ||
37 | #include <asm/mach-types.h> | 38 | #include <asm/mach-types.h> |
38 | #include <asm/mach/arch.h> | 39 | #include <asm/mach/arch.h> |
39 | #include <asm/mach/map.h> | 40 | #include <asm/mach/map.h> |
@@ -139,7 +140,7 @@ static struct platform_device *panda_devices[] __initdata = { | |||
139 | &btwilink_device, | 140 | &btwilink_device, |
140 | }; | 141 | }; |
141 | 142 | ||
142 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | 143 | static struct usbhs_omap_platform_data usbhs_bdata __initdata = { |
143 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, | 144 | .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, |
144 | .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED, | 145 | .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED, |
145 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, | 146 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, |
@@ -447,6 +448,7 @@ static void __init omap4_panda_init(void) | |||
447 | omap_sdrc_init(NULL, NULL); | 448 | omap_sdrc_init(NULL, NULL); |
448 | omap4_twl6030_hsmmc_init(mmc); | 449 | omap4_twl6030_hsmmc_init(mmc); |
449 | omap4_ehci_init(); | 450 | omap4_ehci_init(); |
451 | usb_bind_phy("musb-hdrc.0.auto", 0, "omap-usb2.1.auto"); | ||
450 | usb_musb_init(&musb_board_data); | 452 | usb_musb_init(&musb_board_data); |
451 | omap4_panda_display_init(); | 453 | omap4_panda_display_init(); |
452 | } | 454 | } |
@@ -459,9 +461,8 @@ MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board") | |||
459 | .map_io = omap4_map_io, | 461 | .map_io = omap4_map_io, |
460 | .init_early = omap4430_init_early, | 462 | .init_early = omap4430_init_early, |
461 | .init_irq = gic_init_irq, | 463 | .init_irq = gic_init_irq, |
462 | .handle_irq = gic_handle_irq, | ||
463 | .init_machine = omap4_panda_init, | 464 | .init_machine = omap4_panda_init, |
464 | .init_late = omap4430_init_late, | 465 | .init_late = omap4430_init_late, |
465 | .timer = &omap4_timer, | 466 | .init_time = omap4_local_timer_init, |
466 | .restart = omap44xx_restart, | 467 | .restart = omap44xx_restart, |
467 | MACHINE_END | 468 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c index c8fde3e56441..86bab51154ee 100644 --- a/arch/arm/mach-omap2/board-overo.c +++ b/arch/arm/mach-omap2/board-overo.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <linux/mtd/nand.h> | 36 | #include <linux/mtd/nand.h> |
37 | #include <linux/mtd/partitions.h> | 37 | #include <linux/mtd/partitions.h> |
38 | #include <linux/mmc/host.h> | 38 | #include <linux/mmc/host.h> |
39 | #include <linux/usb/phy.h> | ||
39 | 40 | ||
40 | #include <linux/platform_data/mtd-nand-omap2.h> | 41 | #include <linux/platform_data/mtd-nand-omap2.h> |
41 | #include <linux/platform_data/spi-omap2-mcspi.h> | 42 | #include <linux/platform_data/spi-omap2-mcspi.h> |
@@ -457,7 +458,7 @@ static int __init overo_spi_init(void) | |||
457 | return 0; | 458 | return 0; |
458 | } | 459 | } |
459 | 460 | ||
460 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | 461 | static struct usbhs_omap_platform_data usbhs_bdata __initdata = { |
461 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, | 462 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, |
462 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, | 463 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, |
463 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, | 464 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, |
@@ -499,6 +500,7 @@ static void __init overo_init(void) | |||
499 | mt46h32m32lf6_sdrc_params); | 500 | mt46h32m32lf6_sdrc_params); |
500 | board_nand_init(overo_nand_partitions, | 501 | board_nand_init(overo_nand_partitions, |
501 | ARRAY_SIZE(overo_nand_partitions), NAND_CS, 0, NULL); | 502 | ARRAY_SIZE(overo_nand_partitions), NAND_CS, 0, NULL); |
503 | usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb"); | ||
502 | usb_musb_init(NULL); | 504 | usb_musb_init(NULL); |
503 | usbhs_init(&usbhs_bdata); | 505 | usbhs_init(&usbhs_bdata); |
504 | overo_spi_init(); | 506 | overo_spi_init(); |
@@ -506,7 +508,7 @@ static void __init overo_init(void) | |||
506 | overo_display_init(); | 508 | overo_display_init(); |
507 | overo_init_led(); | 509 | overo_init_led(); |
508 | overo_init_keys(); | 510 | overo_init_keys(); |
509 | omap_twl4030_audio_init("overo"); | 511 | omap_twl4030_audio_init("overo", NULL); |
510 | 512 | ||
511 | /* Ensure SDRC pins are mux'd for self-refresh */ | 513 | /* Ensure SDRC pins are mux'd for self-refresh */ |
512 | omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); | 514 | omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); |
@@ -551,6 +553,6 @@ MACHINE_START(OVERO, "Gumstix Overo") | |||
551 | .handle_irq = omap3_intc_handle_irq, | 553 | .handle_irq = omap3_intc_handle_irq, |
552 | .init_machine = overo_init, | 554 | .init_machine = overo_init, |
553 | .init_late = omap35xx_init_late, | 555 | .init_late = omap35xx_init_late, |
554 | .timer = &omap3_timer, | 556 | .init_time = omap3_sync32k_timer_init, |
555 | .restart = omap3xxx_restart, | 557 | .restart = omap3xxx_restart, |
556 | MACHINE_END | 558 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-rm680.c b/arch/arm/mach-omap2/board-rm680.c index 0c777b75e484..345e8c4b8731 100644 --- a/arch/arm/mach-omap2/board-rm680.c +++ b/arch/arm/mach-omap2/board-rm680.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/regulator/machine.h> | 18 | #include <linux/regulator/machine.h> |
19 | #include <linux/regulator/consumer.h> | 19 | #include <linux/regulator/consumer.h> |
20 | #include <linux/platform_data/mtd-onenand-omap2.h> | 20 | #include <linux/platform_data/mtd-onenand-omap2.h> |
21 | #include <linux/usb/phy.h> | ||
21 | 22 | ||
22 | #include <asm/mach/arch.h> | 23 | #include <asm/mach/arch.h> |
23 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
@@ -134,6 +135,7 @@ static void __init rm680_init(void) | |||
134 | sdrc_params = nokia_get_sdram_timings(); | 135 | sdrc_params = nokia_get_sdram_timings(); |
135 | omap_sdrc_init(sdrc_params, sdrc_params); | 136 | omap_sdrc_init(sdrc_params, sdrc_params); |
136 | 137 | ||
138 | usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb"); | ||
137 | usb_musb_init(NULL); | 139 | usb_musb_init(NULL); |
138 | rm680_peripherals_init(); | 140 | rm680_peripherals_init(); |
139 | } | 141 | } |
@@ -147,7 +149,7 @@ MACHINE_START(NOKIA_RM680, "Nokia RM-680 board") | |||
147 | .handle_irq = omap3_intc_handle_irq, | 149 | .handle_irq = omap3_intc_handle_irq, |
148 | .init_machine = rm680_init, | 150 | .init_machine = rm680_init, |
149 | .init_late = omap3630_init_late, | 151 | .init_late = omap3630_init_late, |
150 | .timer = &omap3_timer, | 152 | .init_time = omap3_sync32k_timer_init, |
151 | .restart = omap3xxx_restart, | 153 | .restart = omap3xxx_restart, |
152 | MACHINE_END | 154 | MACHINE_END |
153 | 155 | ||
@@ -160,6 +162,6 @@ MACHINE_START(NOKIA_RM696, "Nokia RM-696 board") | |||
160 | .handle_irq = omap3_intc_handle_irq, | 162 | .handle_irq = omap3_intc_handle_irq, |
161 | .init_machine = rm680_init, | 163 | .init_machine = rm680_init, |
162 | .init_late = omap3630_init_late, | 164 | .init_late = omap3630_init_late, |
163 | .timer = &omap3_timer, | 165 | .init_time = omap3_sync32k_timer_init, |
164 | .restart = omap3xxx_restart, | 166 | .restart = omap3xxx_restart, |
165 | MACHINE_END | 167 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c index cf07e289b4ea..3a077df6b8df 100644 --- a/arch/arm/mach-omap2/board-rx51-peripherals.c +++ b/arch/arm/mach-omap2/board-rx51-peripherals.c | |||
@@ -40,9 +40,9 @@ | |||
40 | #include <sound/tpa6130a2-plat.h> | 40 | #include <sound/tpa6130a2-plat.h> |
41 | #include <media/radio-si4713.h> | 41 | #include <media/radio-si4713.h> |
42 | #include <media/si4713.h> | 42 | #include <media/si4713.h> |
43 | #include <linux/leds-lp5523.h> | 43 | #include <linux/platform_data/leds-lp55xx.h> |
44 | 44 | ||
45 | #include <../drivers/staging/iio/light/tsl2563.h> | 45 | #include <linux/platform_data/tsl2563.h> |
46 | #include <linux/lis3lv02d.h> | 46 | #include <linux/lis3lv02d.h> |
47 | 47 | ||
48 | #if defined(CONFIG_IR_RX51) || defined(CONFIG_IR_RX51_MODULE) | 48 | #if defined(CONFIG_IR_RX51) || defined(CONFIG_IR_RX51_MODULE) |
@@ -160,32 +160,41 @@ static struct tsl2563_platform_data rx51_tsl2563_platform_data = { | |||
160 | #endif | 160 | #endif |
161 | 161 | ||
162 | #if defined(CONFIG_LEDS_LP5523) || defined(CONFIG_LEDS_LP5523_MODULE) | 162 | #if defined(CONFIG_LEDS_LP5523) || defined(CONFIG_LEDS_LP5523_MODULE) |
163 | static struct lp5523_led_config rx51_lp5523_led_config[] = { | 163 | static struct lp55xx_led_config rx51_lp5523_led_config[] = { |
164 | { | 164 | { |
165 | .name = "lp5523:kb1", | ||
165 | .chan_nr = 0, | 166 | .chan_nr = 0, |
166 | .led_current = 50, | 167 | .led_current = 50, |
167 | }, { | 168 | }, { |
169 | .name = "lp5523:kb2", | ||
168 | .chan_nr = 1, | 170 | .chan_nr = 1, |
169 | .led_current = 50, | 171 | .led_current = 50, |
170 | }, { | 172 | }, { |
173 | .name = "lp5523:kb3", | ||
171 | .chan_nr = 2, | 174 | .chan_nr = 2, |
172 | .led_current = 50, | 175 | .led_current = 50, |
173 | }, { | 176 | }, { |
177 | .name = "lp5523:kb4", | ||
174 | .chan_nr = 3, | 178 | .chan_nr = 3, |
175 | .led_current = 50, | 179 | .led_current = 50, |
176 | }, { | 180 | }, { |
181 | .name = "lp5523:b", | ||
177 | .chan_nr = 4, | 182 | .chan_nr = 4, |
178 | .led_current = 50, | 183 | .led_current = 50, |
179 | }, { | 184 | }, { |
185 | .name = "lp5523:g", | ||
180 | .chan_nr = 5, | 186 | .chan_nr = 5, |
181 | .led_current = 50, | 187 | .led_current = 50, |
182 | }, { | 188 | }, { |
189 | .name = "lp5523:r", | ||
183 | .chan_nr = 6, | 190 | .chan_nr = 6, |
184 | .led_current = 50, | 191 | .led_current = 50, |
185 | }, { | 192 | }, { |
193 | .name = "lp5523:kb5", | ||
186 | .chan_nr = 7, | 194 | .chan_nr = 7, |
187 | .led_current = 50, | 195 | .led_current = 50, |
188 | }, { | 196 | }, { |
197 | .name = "lp5523:kb6", | ||
189 | .chan_nr = 8, | 198 | .chan_nr = 8, |
190 | .led_current = 50, | 199 | .led_current = 50, |
191 | } | 200 | } |
@@ -207,10 +216,10 @@ static void rx51_lp5523_enable(bool state) | |||
207 | gpio_set_value(RX51_LP5523_CHIP_EN_GPIO, !!state); | 216 | gpio_set_value(RX51_LP5523_CHIP_EN_GPIO, !!state); |
208 | } | 217 | } |
209 | 218 | ||
210 | static struct lp5523_platform_data rx51_lp5523_platform_data = { | 219 | static struct lp55xx_platform_data rx51_lp5523_platform_data = { |
211 | .led_config = rx51_lp5523_led_config, | 220 | .led_config = rx51_lp5523_led_config, |
212 | .num_channels = ARRAY_SIZE(rx51_lp5523_led_config), | 221 | .num_channels = ARRAY_SIZE(rx51_lp5523_led_config), |
213 | .clock_mode = LP5523_CLOCK_AUTO, | 222 | .clock_mode = LP55XX_CLOCK_AUTO, |
214 | .setup_resources = rx51_lp5523_setup, | 223 | .setup_resources = rx51_lp5523_setup, |
215 | .release_resources = rx51_lp5523_release, | 224 | .release_resources = rx51_lp5523_release, |
216 | .enable = rx51_lp5523_enable, | 225 | .enable = rx51_lp5523_enable, |
@@ -1253,6 +1262,16 @@ static void __init rx51_init_lirc(void) | |||
1253 | } | 1262 | } |
1254 | #endif | 1263 | #endif |
1255 | 1264 | ||
1265 | static struct platform_device madc_hwmon = { | ||
1266 | .name = "twl4030_madc_hwmon", | ||
1267 | .id = -1, | ||
1268 | }; | ||
1269 | |||
1270 | static void __init rx51_init_twl4030_hwmon(void) | ||
1271 | { | ||
1272 | platform_device_register(&madc_hwmon); | ||
1273 | } | ||
1274 | |||
1256 | void __init rx51_peripherals_init(void) | 1275 | void __init rx51_peripherals_init(void) |
1257 | { | 1276 | { |
1258 | rx51_i2c_init(); | 1277 | rx51_i2c_init(); |
@@ -1272,5 +1291,6 @@ void __init rx51_peripherals_init(void) | |||
1272 | omap_hsmmc_init(mmc); | 1291 | omap_hsmmc_init(mmc); |
1273 | 1292 | ||
1274 | rx51_charger_init(); | 1293 | rx51_charger_init(); |
1294 | rx51_init_twl4030_hwmon(); | ||
1275 | } | 1295 | } |
1276 | 1296 | ||
diff --git a/arch/arm/mach-omap2/board-rx51-video.c b/arch/arm/mach-omap2/board-rx51-video.c index 46f4fc982766..eb667261df08 100644 --- a/arch/arm/mach-omap2/board-rx51-video.c +++ b/arch/arm/mach-omap2/board-rx51-video.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <video/omapdss.h> | 18 | #include <video/omapdss.h> |
19 | #include <linux/platform_data/spi-omap2-mcspi.h> | 19 | #include <linux/platform_data/spi-omap2-mcspi.h> |
20 | 20 | ||
21 | #include "soc.h" | ||
21 | #include "board-rx51.h" | 22 | #include "board-rx51.h" |
22 | 23 | ||
23 | #include "mux.h" | 24 | #include "mux.h" |
@@ -85,5 +86,5 @@ static int __init rx51_video_init(void) | |||
85 | return 0; | 86 | return 0; |
86 | } | 87 | } |
87 | 88 | ||
88 | subsys_initcall(rx51_video_init); | 89 | omap_subsys_initcall(rx51_video_init); |
89 | #endif /* defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE) */ | 90 | #endif /* defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE) */ |
diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c index d0374ea2dfb0..f7c4616cbb60 100644 --- a/arch/arm/mach-omap2/board-rx51.c +++ b/arch/arm/mach-omap2/board-rx51.c | |||
@@ -123,6 +123,6 @@ MACHINE_START(NOKIA_RX51, "Nokia RX-51 board") | |||
123 | .handle_irq = omap3_intc_handle_irq, | 123 | .handle_irq = omap3_intc_handle_irq, |
124 | .init_machine = rx51_init, | 124 | .init_machine = rx51_init, |
125 | .init_late = omap3430_init_late, | 125 | .init_late = omap3430_init_late, |
126 | .timer = &omap3_timer, | 126 | .init_time = omap3_sync32k_timer_init, |
127 | .restart = omap3xxx_restart, | 127 | .restart = omap3xxx_restart, |
128 | MACHINE_END | 128 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/board-ti8168evm.c b/arch/arm/mach-omap2/board-ti8168evm.c index 1a3e056d63a7..6273c286e1d8 100644 --- a/arch/arm/mach-omap2/board-ti8168evm.c +++ b/arch/arm/mach-omap2/board-ti8168evm.c | |||
@@ -43,7 +43,7 @@ MACHINE_START(TI8168EVM, "ti8168evm") | |||
43 | .map_io = ti81xx_map_io, | 43 | .map_io = ti81xx_map_io, |
44 | .init_early = ti81xx_init_early, | 44 | .init_early = ti81xx_init_early, |
45 | .init_irq = ti81xx_init_irq, | 45 | .init_irq = ti81xx_init_irq, |
46 | .timer = &omap3_timer, | 46 | .init_time = omap3_sync32k_timer_init, |
47 | .init_machine = ti81xx_evm_init, | 47 | .init_machine = ti81xx_evm_init, |
48 | .init_late = ti81xx_init_late, | 48 | .init_late = ti81xx_init_late, |
49 | .restart = omap44xx_restart, | 49 | .restart = omap44xx_restart, |
@@ -55,7 +55,7 @@ MACHINE_START(TI8148EVM, "ti8148evm") | |||
55 | .map_io = ti81xx_map_io, | 55 | .map_io = ti81xx_map_io, |
56 | .init_early = ti81xx_init_early, | 56 | .init_early = ti81xx_init_early, |
57 | .init_irq = ti81xx_init_irq, | 57 | .init_irq = ti81xx_init_irq, |
58 | .timer = &omap3_timer, | 58 | .init_time = omap3_sync32k_timer_init, |
59 | .init_machine = ti81xx_evm_init, | 59 | .init_machine = ti81xx_evm_init, |
60 | .init_late = ti81xx_init_late, | 60 | .init_late = ti81xx_init_late, |
61 | .restart = omap44xx_restart, | 61 | .restart = omap44xx_restart, |
diff --git a/arch/arm/mach-omap2/board-zoom-display.c b/arch/arm/mach-omap2/board-zoom-display.c index 1c7c834a5b5f..8cef477d6b00 100644 --- a/arch/arm/mach-omap2/board-zoom-display.c +++ b/arch/arm/mach-omap2/board-zoom-display.c | |||
@@ -49,13 +49,13 @@ static void zoom_panel_disable_lcd(struct omap_dss_device *dssdev) | |||
49 | { | 49 | { |
50 | } | 50 | } |
51 | 51 | ||
52 | /* | 52 | /* Register offsets in TWL4030_MODULE_INTBR */ |
53 | * PWMA/B register offsets (TWL4030_MODULE_PWMA) | ||
54 | */ | ||
55 | #define TWL_INTBR_PMBR1 0xD | 53 | #define TWL_INTBR_PMBR1 0xD |
56 | #define TWL_INTBR_GPBR1 0xC | 54 | #define TWL_INTBR_GPBR1 0xC |
57 | #define TWL_LED_PWMON 0x0 | 55 | |
58 | #define TWL_LED_PWMOFF 0x1 | 56 | /* Register offsets in TWL_MODULE_PWM */ |
57 | #define TWL_LED_PWMON 0x3 | ||
58 | #define TWL_LED_PWMOFF 0x4 | ||
59 | 59 | ||
60 | static int zoom_set_bl_intensity(struct omap_dss_device *dssdev, int level) | 60 | static int zoom_set_bl_intensity(struct omap_dss_device *dssdev, int level) |
61 | { | 61 | { |
@@ -93,8 +93,8 @@ static int zoom_set_bl_intensity(struct omap_dss_device *dssdev, int level) | |||
93 | } | 93 | } |
94 | 94 | ||
95 | c = ((50 * (100 - level)) / 100) + 1; | 95 | c = ((50 * (100 - level)) / 100) + 1; |
96 | twl_i2c_write_u8(TWL4030_MODULE_PWM1, 0x7F, TWL_LED_PWMOFF); | 96 | twl_i2c_write_u8(TWL_MODULE_PWM, 0x7F, TWL_LED_PWMOFF); |
97 | twl_i2c_write_u8(TWL4030_MODULE_PWM1, c, TWL_LED_PWMON); | 97 | twl_i2c_write_u8(TWL_MODULE_PWM, c, TWL_LED_PWMON); |
98 | #else | 98 | #else |
99 | pr_warn("Backlight not enabled\n"); | 99 | pr_warn("Backlight not enabled\n"); |
100 | #endif | 100 | #endif |
diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c index 26e07addc9d7..cdc0c1021863 100644 --- a/arch/arm/mach-omap2/board-zoom-peripherals.c +++ b/arch/arm/mach-omap2/board-zoom-peripherals.c | |||
@@ -20,6 +20,8 @@ | |||
20 | #include <linux/wl12xx.h> | 20 | #include <linux/wl12xx.h> |
21 | #include <linux/mmc/host.h> | 21 | #include <linux/mmc/host.h> |
22 | #include <linux/platform_data/gpio-omap.h> | 22 | #include <linux/platform_data/gpio-omap.h> |
23 | #include <linux/platform_data/omap-twl4030.h> | ||
24 | #include <linux/usb/phy.h> | ||
23 | 25 | ||
24 | #include <asm/mach-types.h> | 26 | #include <asm/mach-types.h> |
25 | #include <asm/mach/arch.h> | 27 | #include <asm/mach/arch.h> |
@@ -34,11 +36,9 @@ | |||
34 | #include "common-board-devices.h" | 36 | #include "common-board-devices.h" |
35 | 37 | ||
36 | #define OMAP_ZOOM_WLAN_PMENA_GPIO (101) | 38 | #define OMAP_ZOOM_WLAN_PMENA_GPIO (101) |
37 | #define ZOOM2_HEADSET_EXTMUTE_GPIO (153) | 39 | #define OMAP_ZOOM_TSC2004_IRQ_GPIO (153) |
38 | #define OMAP_ZOOM_WLAN_IRQ_GPIO (162) | 40 | #define OMAP_ZOOM_WLAN_IRQ_GPIO (162) |
39 | 41 | ||
40 | #define LCD_PANEL_ENABLE_GPIO (7 + OMAP_MAX_GPIO_LINES) | ||
41 | |||
42 | /* Zoom2 has Qwerty keyboard*/ | 42 | /* Zoom2 has Qwerty keyboard*/ |
43 | static uint32_t board_keymap[] = { | 43 | static uint32_t board_keymap[] = { |
44 | KEY(0, 0, KEY_E), | 44 | KEY(0, 0, KEY_E), |
@@ -226,22 +226,31 @@ static struct omap2_hsmmc_info mmc[] = { | |||
226 | {} /* Terminator */ | 226 | {} /* Terminator */ |
227 | }; | 227 | }; |
228 | 228 | ||
229 | static struct omap_tw4030_pdata omap_twl4030_audio_data = { | ||
230 | .voice_connected = true, | ||
231 | .custom_routing = true, | ||
232 | |||
233 | .has_hs = OMAP_TWL4030_LEFT | OMAP_TWL4030_RIGHT, | ||
234 | .has_hf = OMAP_TWL4030_LEFT | OMAP_TWL4030_RIGHT, | ||
235 | |||
236 | .has_mainmic = true, | ||
237 | .has_submic = true, | ||
238 | .has_hsmic = true, | ||
239 | .has_linein = OMAP_TWL4030_LEFT | OMAP_TWL4030_RIGHT, | ||
240 | }; | ||
241 | |||
229 | static int zoom_twl_gpio_setup(struct device *dev, | 242 | static int zoom_twl_gpio_setup(struct device *dev, |
230 | unsigned gpio, unsigned ngpio) | 243 | unsigned gpio, unsigned ngpio) |
231 | { | 244 | { |
232 | int ret; | ||
233 | |||
234 | /* gpio + 0 is "mmc0_cd" (input/IRQ) */ | 245 | /* gpio + 0 is "mmc0_cd" (input/IRQ) */ |
235 | mmc[0].gpio_cd = gpio + 0; | 246 | mmc[0].gpio_cd = gpio + 0; |
236 | omap_hsmmc_late_init(mmc); | 247 | omap_hsmmc_late_init(mmc); |
237 | 248 | ||
238 | ret = gpio_request_one(LCD_PANEL_ENABLE_GPIO, GPIOF_OUT_INIT_LOW, | 249 | /* Audio setup */ |
239 | "lcd enable"); | 250 | omap_twl4030_audio_data.jack_detect = gpio + 2; |
240 | if (ret) | 251 | omap_twl4030_audio_init("Zoom2", &omap_twl4030_audio_data); |
241 | pr_err("Failed to get LCD_PANEL_ENABLE_GPIO (gpio%d).\n", | ||
242 | LCD_PANEL_ENABLE_GPIO); | ||
243 | 252 | ||
244 | return ret; | 253 | return 0; |
245 | } | 254 | } |
246 | 255 | ||
247 | static struct twl4030_gpio_platform_data zoom_gpio_data = { | 256 | static struct twl4030_gpio_platform_data zoom_gpio_data = { |
@@ -264,14 +273,9 @@ static int __init omap_i2c_init(void) | |||
264 | TWL_COMMON_PDATA_MADC | TWL_COMMON_PDATA_AUDIO, | 273 | TWL_COMMON_PDATA_MADC | TWL_COMMON_PDATA_AUDIO, |
265 | TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2); | 274 | TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2); |
266 | 275 | ||
267 | if (machine_is_omap_zoom2()) { | 276 | if (machine_is_omap_zoom2()) |
268 | struct twl4030_codec_data *codec_data; | 277 | zoom_twldata.audio->codec->ramp_delay_value = 3; /* 161 ms */ |
269 | codec_data = zoom_twldata.audio->codec; | ||
270 | 278 | ||
271 | codec_data->ramp_delay_value = 3; /* 161 ms */ | ||
272 | codec_data->hs_extmute = 1; | ||
273 | codec_data->hs_extmute_gpio = ZOOM2_HEADSET_EXTMUTE_GPIO; | ||
274 | } | ||
275 | omap_pmic_init(1, 2400, "twl5030", 7 + OMAP_INTC_START, &zoom_twldata); | 279 | omap_pmic_init(1, 2400, "twl5030", 7 + OMAP_INTC_START, &zoom_twldata); |
276 | omap_register_i2c_bus(2, 400, NULL, 0); | 280 | omap_register_i2c_bus(2, 400, NULL, 0); |
277 | omap_register_i2c_bus(3, 400, NULL, 0); | 281 | omap_register_i2c_bus(3, 400, NULL, 0); |
@@ -298,6 +302,7 @@ void __init zoom_peripherals_init(void) | |||
298 | omap_hsmmc_init(mmc); | 302 | omap_hsmmc_init(mmc); |
299 | omap_i2c_init(); | 303 | omap_i2c_init(); |
300 | platform_device_register(&omap_vwlan_device); | 304 | platform_device_register(&omap_vwlan_device); |
305 | usb_bind_phy("musb-hdrc.0.auto", 0, "twl4030_usb"); | ||
301 | usb_musb_init(NULL); | 306 | usb_musb_init(NULL); |
302 | enable_board_wakeup_source(); | 307 | enable_board_wakeup_source(); |
303 | omap_serial_init(); | 308 | omap_serial_init(); |
diff --git a/arch/arm/mach-omap2/board-zoom.c b/arch/arm/mach-omap2/board-zoom.c index d7fa31e67238..5e4d4c9fe61a 100644 --- a/arch/arm/mach-omap2/board-zoom.c +++ b/arch/arm/mach-omap2/board-zoom.c | |||
@@ -92,7 +92,7 @@ static struct mtd_partition zoom_nand_partitions[] = { | |||
92 | }, | 92 | }, |
93 | }; | 93 | }; |
94 | 94 | ||
95 | static const struct usbhs_omap_board_data usbhs_bdata __initconst = { | 95 | static struct usbhs_omap_platform_data usbhs_bdata __initdata = { |
96 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, | 96 | .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED, |
97 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, | 97 | .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY, |
98 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, | 98 | .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, |
@@ -137,7 +137,7 @@ MACHINE_START(OMAP_ZOOM2, "OMAP Zoom2 board") | |||
137 | .handle_irq = omap3_intc_handle_irq, | 137 | .handle_irq = omap3_intc_handle_irq, |
138 | .init_machine = omap_zoom_init, | 138 | .init_machine = omap_zoom_init, |
139 | .init_late = omap3430_init_late, | 139 | .init_late = omap3430_init_late, |
140 | .timer = &omap3_timer, | 140 | .init_time = omap3_sync32k_timer_init, |
141 | .restart = omap3xxx_restart, | 141 | .restart = omap3xxx_restart, |
142 | MACHINE_END | 142 | MACHINE_END |
143 | 143 | ||
@@ -150,6 +150,6 @@ MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board") | |||
150 | .handle_irq = omap3_intc_handle_irq, | 150 | .handle_irq = omap3_intc_handle_irq, |
151 | .init_machine = omap_zoom_init, | 151 | .init_machine = omap_zoom_init, |
152 | .init_late = omap3630_init_late, | 152 | .init_late = omap3630_init_late, |
153 | .timer = &omap3_timer, | 153 | .init_time = omap3_sync32k_timer_init, |
154 | .restart = omap3xxx_restart, | 154 | .restart = omap3xxx_restart, |
155 | MACHINE_END | 155 | MACHINE_END |
diff --git a/arch/arm/mach-omap2/cclock2420_data.c b/arch/arm/mach-omap2/cclock2420_data.c index ab7e952d2070..0f0a97c1fcc0 100644 --- a/arch/arm/mach-omap2/cclock2420_data.c +++ b/arch/arm/mach-omap2/cclock2420_data.c | |||
@@ -622,15 +622,10 @@ static struct clk_hw_omap gpios_fck_hw = { | |||
622 | 622 | ||
623 | DEFINE_STRUCT_CLK(gpios_fck, gpios_fck_parent_names, aes_ick_ops); | 623 | DEFINE_STRUCT_CLK(gpios_fck, gpios_fck_parent_names, aes_ick_ops); |
624 | 624 | ||
625 | static struct clk wu_l4_ick; | ||
626 | |||
627 | DEFINE_STRUCT_CLK_HW_OMAP(wu_l4_ick, "wkup_clkdm"); | ||
628 | DEFINE_STRUCT_CLK(wu_l4_ick, dpll_ck_parent_names, core_ck_ops); | ||
629 | |||
630 | static struct clk gpios_ick; | 625 | static struct clk gpios_ick; |
631 | 626 | ||
632 | static const char *gpios_ick_parent_names[] = { | 627 | static const char *gpios_ick_parent_names[] = { |
633 | "wu_l4_ick", | 628 | "sys_ck", |
634 | }; | 629 | }; |
635 | 630 | ||
636 | static struct clk_hw_omap gpios_ick_hw = { | 631 | static struct clk_hw_omap gpios_ick_hw = { |
@@ -1682,13 +1677,6 @@ static struct clk_hw_omap wdt1_ick_hw = { | |||
1682 | 1677 | ||
1683 | DEFINE_STRUCT_CLK(wdt1_ick, gpios_ick_parent_names, aes_ick_ops); | 1678 | DEFINE_STRUCT_CLK(wdt1_ick, gpios_ick_parent_names, aes_ick_ops); |
1684 | 1679 | ||
1685 | static struct clk wdt1_osc_ck; | ||
1686 | |||
1687 | static const struct clk_ops wdt1_osc_ck_ops = {}; | ||
1688 | |||
1689 | DEFINE_STRUCT_CLK_HW_OMAP(wdt1_osc_ck, NULL); | ||
1690 | DEFINE_STRUCT_CLK(wdt1_osc_ck, sys_ck_parent_names, wdt1_osc_ck_ops); | ||
1691 | |||
1692 | static struct clk wdt3_fck; | 1680 | static struct clk wdt3_fck; |
1693 | 1681 | ||
1694 | static struct clk_hw_omap wdt3_fck_hw = { | 1682 | static struct clk_hw_omap wdt3_fck_hw = { |
@@ -1767,7 +1755,6 @@ static struct omap_clk omap2420_clks[] = { | |||
1767 | CLK(NULL, "func_96m_ck", &func_96m_ck, CK_242X), | 1755 | CLK(NULL, "func_96m_ck", &func_96m_ck, CK_242X), |
1768 | CLK(NULL, "func_48m_ck", &func_48m_ck, CK_242X), | 1756 | CLK(NULL, "func_48m_ck", &func_48m_ck, CK_242X), |
1769 | CLK(NULL, "func_12m_ck", &func_12m_ck, CK_242X), | 1757 | CLK(NULL, "func_12m_ck", &func_12m_ck, CK_242X), |
1770 | CLK(NULL, "ck_wdt1_osc", &wdt1_osc_ck, CK_242X), | ||
1771 | CLK(NULL, "sys_clkout_src", &sys_clkout_src, CK_242X), | 1758 | CLK(NULL, "sys_clkout_src", &sys_clkout_src, CK_242X), |
1772 | CLK(NULL, "sys_clkout", &sys_clkout, CK_242X), | 1759 | CLK(NULL, "sys_clkout", &sys_clkout, CK_242X), |
1773 | CLK(NULL, "sys_clkout2_src", &sys_clkout2_src, CK_242X), | 1760 | CLK(NULL, "sys_clkout2_src", &sys_clkout2_src, CK_242X), |
@@ -1797,7 +1784,6 @@ static struct omap_clk omap2420_clks[] = { | |||
1797 | /* L4 domain clocks */ | 1784 | /* L4 domain clocks */ |
1798 | CLK(NULL, "l4_ck", &l4_ck, CK_242X), | 1785 | CLK(NULL, "l4_ck", &l4_ck, CK_242X), |
1799 | CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_242X), | 1786 | CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_242X), |
1800 | CLK(NULL, "wu_l4_ick", &wu_l4_ick, CK_242X), | ||
1801 | /* virtual meta-group clock */ | 1787 | /* virtual meta-group clock */ |
1802 | CLK(NULL, "virt_prcm_set", &virt_prcm_set, CK_242X), | 1788 | CLK(NULL, "virt_prcm_set", &virt_prcm_set, CK_242X), |
1803 | /* general l4 interface ck, multi-parent functional clk */ | 1789 | /* general l4 interface ck, multi-parent functional clk */ |
diff --git a/arch/arm/mach-omap2/cclock2430_data.c b/arch/arm/mach-omap2/cclock2430_data.c index eb3dab68d536..aed8f74ca076 100644 --- a/arch/arm/mach-omap2/cclock2430_data.c +++ b/arch/arm/mach-omap2/cclock2430_data.c | |||
@@ -601,15 +601,10 @@ static struct clk_hw_omap gpios_fck_hw = { | |||
601 | 601 | ||
602 | DEFINE_STRUCT_CLK(gpios_fck, gpio5_fck_parent_names, aes_ick_ops); | 602 | DEFINE_STRUCT_CLK(gpios_fck, gpio5_fck_parent_names, aes_ick_ops); |
603 | 603 | ||
604 | static struct clk wu_l4_ick; | ||
605 | |||
606 | DEFINE_STRUCT_CLK_HW_OMAP(wu_l4_ick, "wkup_clkdm"); | ||
607 | DEFINE_STRUCT_CLK(wu_l4_ick, dpll_ck_parent_names, core_ck_ops); | ||
608 | |||
609 | static struct clk gpios_ick; | 604 | static struct clk gpios_ick; |
610 | 605 | ||
611 | static const char *gpios_ick_parent_names[] = { | 606 | static const char *gpios_ick_parent_names[] = { |
612 | "wu_l4_ick", | 607 | "sys_ck", |
613 | }; | 608 | }; |
614 | 609 | ||
615 | static struct clk_hw_omap gpios_ick_hw = { | 610 | static struct clk_hw_omap gpios_ick_hw = { |
@@ -1811,13 +1806,6 @@ static struct clk_hw_omap wdt1_ick_hw = { | |||
1811 | 1806 | ||
1812 | DEFINE_STRUCT_CLK(wdt1_ick, gpios_ick_parent_names, aes_ick_ops); | 1807 | DEFINE_STRUCT_CLK(wdt1_ick, gpios_ick_parent_names, aes_ick_ops); |
1813 | 1808 | ||
1814 | static struct clk wdt1_osc_ck; | ||
1815 | |||
1816 | static const struct clk_ops wdt1_osc_ck_ops = {}; | ||
1817 | |||
1818 | DEFINE_STRUCT_CLK_HW_OMAP(wdt1_osc_ck, NULL); | ||
1819 | DEFINE_STRUCT_CLK(wdt1_osc_ck, sys_ck_parent_names, wdt1_osc_ck_ops); | ||
1820 | |||
1821 | static struct clk wdt4_fck; | 1809 | static struct clk wdt4_fck; |
1822 | 1810 | ||
1823 | static struct clk_hw_omap wdt4_fck_hw = { | 1811 | static struct clk_hw_omap wdt4_fck_hw = { |
@@ -1869,7 +1857,6 @@ static struct omap_clk omap2430_clks[] = { | |||
1869 | CLK(NULL, "func_96m_ck", &func_96m_ck, CK_243X), | 1857 | CLK(NULL, "func_96m_ck", &func_96m_ck, CK_243X), |
1870 | CLK(NULL, "func_48m_ck", &func_48m_ck, CK_243X), | 1858 | CLK(NULL, "func_48m_ck", &func_48m_ck, CK_243X), |
1871 | CLK(NULL, "func_12m_ck", &func_12m_ck, CK_243X), | 1859 | CLK(NULL, "func_12m_ck", &func_12m_ck, CK_243X), |
1872 | CLK(NULL, "ck_wdt1_osc", &wdt1_osc_ck, CK_243X), | ||
1873 | CLK(NULL, "sys_clkout_src", &sys_clkout_src, CK_243X), | 1860 | CLK(NULL, "sys_clkout_src", &sys_clkout_src, CK_243X), |
1874 | CLK(NULL, "sys_clkout", &sys_clkout, CK_243X), | 1861 | CLK(NULL, "sys_clkout", &sys_clkout, CK_243X), |
1875 | CLK(NULL, "emul_ck", &emul_ck, CK_243X), | 1862 | CLK(NULL, "emul_ck", &emul_ck, CK_243X), |
@@ -1898,7 +1885,6 @@ static struct omap_clk omap2430_clks[] = { | |||
1898 | /* L4 domain clocks */ | 1885 | /* L4 domain clocks */ |
1899 | CLK(NULL, "l4_ck", &l4_ck, CK_243X), | 1886 | CLK(NULL, "l4_ck", &l4_ck, CK_243X), |
1900 | CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_243X), | 1887 | CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_243X), |
1901 | CLK(NULL, "wu_l4_ick", &wu_l4_ick, CK_243X), | ||
1902 | /* virtual meta-group clock */ | 1888 | /* virtual meta-group clock */ |
1903 | CLK(NULL, "virt_prcm_set", &virt_prcm_set, CK_243X), | 1889 | CLK(NULL, "virt_prcm_set", &virt_prcm_set, CK_243X), |
1904 | /* general l4 interface ck, multi-parent functional clk */ | 1890 | /* general l4 interface ck, multi-parent functional clk */ |
diff --git a/arch/arm/mach-omap2/cclock33xx_data.c b/arch/arm/mach-omap2/cclock33xx_data.c index ea64ad606759..476b82066cb6 100644 --- a/arch/arm/mach-omap2/cclock33xx_data.c +++ b/arch/arm/mach-omap2/cclock33xx_data.c | |||
@@ -284,9 +284,10 @@ DEFINE_STRUCT_CLK(dpll_disp_ck, dpll_core_ck_parents, dpll_ddr_ck_ops); | |||
284 | * TODO: Add clksel here (sys_clkin, CORE_CLKOUTM6, PER_CLKOUTM2 | 284 | * TODO: Add clksel here (sys_clkin, CORE_CLKOUTM6, PER_CLKOUTM2 |
285 | * and ALT_CLK1/2) | 285 | * and ALT_CLK1/2) |
286 | */ | 286 | */ |
287 | DEFINE_CLK_DIVIDER(dpll_disp_m2_ck, "dpll_disp_ck", &dpll_disp_ck, 0x0, | 287 | DEFINE_CLK_DIVIDER(dpll_disp_m2_ck, "dpll_disp_ck", &dpll_disp_ck, |
288 | AM33XX_CM_DIV_M2_DPLL_DISP, AM33XX_DPLL_CLKOUT_DIV_SHIFT, | 288 | CLK_SET_RATE_PARENT, AM33XX_CM_DIV_M2_DPLL_DISP, |
289 | AM33XX_DPLL_CLKOUT_DIV_WIDTH, CLK_DIVIDER_ONE_BASED, NULL); | 289 | AM33XX_DPLL_CLKOUT_DIV_SHIFT, AM33XX_DPLL_CLKOUT_DIV_WIDTH, |
290 | CLK_DIVIDER_ONE_BASED, NULL); | ||
290 | 291 | ||
291 | /* DPLL_PER */ | 292 | /* DPLL_PER */ |
292 | static struct dpll_data dpll_per_dd = { | 293 | static struct dpll_data dpll_per_dd = { |
@@ -723,7 +724,8 @@ static struct clk_hw_omap lcd_gclk_hw = { | |||
723 | .clksel_mask = AM33XX_CLKSEL_0_1_MASK, | 724 | .clksel_mask = AM33XX_CLKSEL_0_1_MASK, |
724 | }; | 725 | }; |
725 | 726 | ||
726 | DEFINE_STRUCT_CLK(lcd_gclk, lcd_ck_parents, gpio_fck_ops); | 727 | DEFINE_STRUCT_CLK_FLAGS(lcd_gclk, lcd_ck_parents, |
728 | gpio_fck_ops, CLK_SET_RATE_PARENT); | ||
727 | 729 | ||
728 | DEFINE_CLK_FIXED_FACTOR(mmc_clk, "dpll_per_m2_ck", &dpll_per_m2_ck, 0x0, 1, 2); | 730 | DEFINE_CLK_FIXED_FACTOR(mmc_clk, "dpll_per_m2_ck", &dpll_per_m2_ck, 0x0, 1, 2); |
729 | 731 | ||
diff --git a/arch/arm/mach-omap2/cclock3xxx_data.c b/arch/arm/mach-omap2/cclock3xxx_data.c index 6ef87580c33f..4579c3c5338f 100644 --- a/arch/arm/mach-omap2/cclock3xxx_data.c +++ b/arch/arm/mach-omap2/cclock3xxx_data.c | |||
@@ -426,6 +426,7 @@ static struct clk dpll4_m5x2_ck_3630 = { | |||
426 | .parent_names = dpll4_m5x2_ck_parent_names, | 426 | .parent_names = dpll4_m5x2_ck_parent_names, |
427 | .num_parents = ARRAY_SIZE(dpll4_m5x2_ck_parent_names), | 427 | .num_parents = ARRAY_SIZE(dpll4_m5x2_ck_parent_names), |
428 | .ops = &dpll4_m5x2_ck_3630_ops, | 428 | .ops = &dpll4_m5x2_ck_3630_ops, |
429 | .flags = CLK_SET_RATE_PARENT, | ||
429 | }; | 430 | }; |
430 | 431 | ||
431 | static struct clk cam_mclk; | 432 | static struct clk cam_mclk; |
@@ -443,7 +444,14 @@ static struct clk_hw_omap cam_mclk_hw = { | |||
443 | .clkdm_name = "cam_clkdm", | 444 | .clkdm_name = "cam_clkdm", |
444 | }; | 445 | }; |
445 | 446 | ||
446 | DEFINE_STRUCT_CLK(cam_mclk, cam_mclk_parent_names, aes2_ick_ops); | 447 | static struct clk cam_mclk = { |
448 | .name = "cam_mclk", | ||
449 | .hw = &cam_mclk_hw.hw, | ||
450 | .parent_names = cam_mclk_parent_names, | ||
451 | .num_parents = ARRAY_SIZE(cam_mclk_parent_names), | ||
452 | .ops = &aes2_ick_ops, | ||
453 | .flags = CLK_SET_RATE_PARENT, | ||
454 | }; | ||
447 | 455 | ||
448 | static const struct clksel_rate clkout2_src_core_rates[] = { | 456 | static const struct clksel_rate clkout2_src_core_rates[] = { |
449 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, | 457 | { .div = 1, .val = 0, .flags = RATE_IN_3XXX }, |
diff --git a/arch/arm/mach-omap2/cclock44xx_data.c b/arch/arm/mach-omap2/cclock44xx_data.c index a2cc046b47f4..3d58f335f173 100644 --- a/arch/arm/mach-omap2/cclock44xx_data.c +++ b/arch/arm/mach-omap2/cclock44xx_data.c | |||
@@ -16,6 +16,10 @@ | |||
16 | * XXX Some of the ES1 clocks have been removed/changed; once support | 16 | * XXX Some of the ES1 clocks have been removed/changed; once support |
17 | * is added for discriminating clocks by ES level, these should be added back | 17 | * is added for discriminating clocks by ES level, these should be added back |
18 | * in. | 18 | * in. |
19 | * | ||
20 | * XXX All of the remaining MODULEMODE clock nodes should be removed | ||
21 | * once the drivers are updated to use pm_runtime or to use the appropriate | ||
22 | * upstream clock node for rate/parent selection. | ||
19 | */ | 23 | */ |
20 | 24 | ||
21 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
@@ -315,7 +319,7 @@ DEFINE_CLK_DIVIDER(dpll_abe_m2_ck, "dpll_abe_ck", &dpll_abe_ck, 0x0, | |||
315 | OMAP4430_CM_DIV_M2_DPLL_ABE, OMAP4430_DPLL_CLKOUT_DIV_SHIFT, | 319 | OMAP4430_CM_DIV_M2_DPLL_ABE, OMAP4430_DPLL_CLKOUT_DIV_SHIFT, |
316 | OMAP4430_DPLL_CLKOUT_DIV_WIDTH, CLK_DIVIDER_ONE_BASED, NULL); | 320 | OMAP4430_DPLL_CLKOUT_DIV_WIDTH, CLK_DIVIDER_ONE_BASED, NULL); |
317 | 321 | ||
318 | static const struct clk_ops dmic_fck_ops = { | 322 | static const struct clk_ops dpll_hsd_ops = { |
319 | .enable = &omap2_dflt_clk_enable, | 323 | .enable = &omap2_dflt_clk_enable, |
320 | .disable = &omap2_dflt_clk_disable, | 324 | .disable = &omap2_dflt_clk_disable, |
321 | .is_enabled = &omap2_dflt_clk_is_enabled, | 325 | .is_enabled = &omap2_dflt_clk_is_enabled, |
@@ -325,6 +329,12 @@ static const struct clk_ops dmic_fck_ops = { | |||
325 | .init = &omap2_init_clk_clkdm, | 329 | .init = &omap2_init_clk_clkdm, |
326 | }; | 330 | }; |
327 | 331 | ||
332 | static const struct clk_ops func_dmic_abe_gfclk_ops = { | ||
333 | .recalc_rate = &omap2_clksel_recalc, | ||
334 | .get_parent = &omap2_clksel_find_parent_index, | ||
335 | .set_parent = &omap2_clksel_set_parent, | ||
336 | }; | ||
337 | |||
328 | static const char *dpll_core_m3x2_ck_parents[] = { | 338 | static const char *dpll_core_m3x2_ck_parents[] = { |
329 | "dpll_core_x2_ck", | 339 | "dpll_core_x2_ck", |
330 | }; | 340 | }; |
@@ -340,7 +350,7 @@ DEFINE_CLK_OMAP_MUX_GATE(dpll_core_m3x2_ck, NULL, dpll_core_m3x2_div, | |||
340 | OMAP4430_DPLL_CLKOUTHIF_DIV_MASK, | 350 | OMAP4430_DPLL_CLKOUTHIF_DIV_MASK, |
341 | OMAP4430_CM_DIV_M3_DPLL_CORE, | 351 | OMAP4430_CM_DIV_M3_DPLL_CORE, |
342 | OMAP4430_DPLL_CLKOUTHIF_GATE_CTRL_SHIFT, NULL, | 352 | OMAP4430_DPLL_CLKOUTHIF_GATE_CTRL_SHIFT, NULL, |
343 | dpll_core_m3x2_ck_parents, dmic_fck_ops); | 353 | dpll_core_m3x2_ck_parents, dpll_hsd_ops); |
344 | 354 | ||
345 | DEFINE_CLK_OMAP_HSDIVIDER(dpll_core_m7x2_ck, "dpll_core_x2_ck", | 355 | DEFINE_CLK_OMAP_HSDIVIDER(dpll_core_m7x2_ck, "dpll_core_x2_ck", |
346 | &dpll_core_x2_ck, 0x0, OMAP4430_CM_DIV_M7_DPLL_CORE, | 356 | &dpll_core_x2_ck, 0x0, OMAP4430_CM_DIV_M7_DPLL_CORE, |
@@ -547,7 +557,7 @@ DEFINE_CLK_OMAP_MUX_GATE(dpll_per_m3x2_ck, NULL, dpll_per_m3x2_div, | |||
547 | OMAP4430_DPLL_CLKOUTHIF_DIV_MASK, | 557 | OMAP4430_DPLL_CLKOUTHIF_DIV_MASK, |
548 | OMAP4430_CM_DIV_M3_DPLL_PER, | 558 | OMAP4430_CM_DIV_M3_DPLL_PER, |
549 | OMAP4430_DPLL_CLKOUTHIF_GATE_CTRL_SHIFT, NULL, | 559 | OMAP4430_DPLL_CLKOUTHIF_GATE_CTRL_SHIFT, NULL, |
550 | dpll_per_m3x2_ck_parents, dmic_fck_ops); | 560 | dpll_per_m3x2_ck_parents, dpll_hsd_ops); |
551 | 561 | ||
552 | DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m4x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck, | 562 | DEFINE_CLK_OMAP_HSDIVIDER(dpll_per_m4x2_ck, "dpll_per_x2_ck", &dpll_per_x2_ck, |
553 | 0x0, OMAP4430_CM_DIV_M4_DPLL_PER, | 563 | 0x0, OMAP4430_CM_DIV_M4_DPLL_PER, |
@@ -595,15 +605,26 @@ static const char *dpll_usb_ck_parents[] = { | |||
595 | 605 | ||
596 | static struct clk dpll_usb_ck; | 606 | static struct clk dpll_usb_ck; |
597 | 607 | ||
608 | static const struct clk_ops dpll_usb_ck_ops = { | ||
609 | .enable = &omap3_noncore_dpll_enable, | ||
610 | .disable = &omap3_noncore_dpll_disable, | ||
611 | .recalc_rate = &omap3_dpll_recalc, | ||
612 | .round_rate = &omap2_dpll_round_rate, | ||
613 | .set_rate = &omap3_noncore_dpll_set_rate, | ||
614 | .get_parent = &omap2_init_dpll_parent, | ||
615 | .init = &omap2_init_clk_clkdm, | ||
616 | }; | ||
617 | |||
598 | static struct clk_hw_omap dpll_usb_ck_hw = { | 618 | static struct clk_hw_omap dpll_usb_ck_hw = { |
599 | .hw = { | 619 | .hw = { |
600 | .clk = &dpll_usb_ck, | 620 | .clk = &dpll_usb_ck, |
601 | }, | 621 | }, |
602 | .dpll_data = &dpll_usb_dd, | 622 | .dpll_data = &dpll_usb_dd, |
623 | .clkdm_name = "l3_init_clkdm", | ||
603 | .ops = &clkhwops_omap3_dpll, | 624 | .ops = &clkhwops_omap3_dpll, |
604 | }; | 625 | }; |
605 | 626 | ||
606 | DEFINE_STRUCT_CLK(dpll_usb_ck, dpll_usb_ck_parents, dpll_ck_ops); | 627 | DEFINE_STRUCT_CLK(dpll_usb_ck, dpll_usb_ck_parents, dpll_usb_ck_ops); |
607 | 628 | ||
608 | static const char *dpll_usb_clkdcoldo_ck_parents[] = { | 629 | static const char *dpll_usb_clkdcoldo_ck_parents[] = { |
609 | "dpll_usb_ck", | 630 | "dpll_usb_ck", |
@@ -749,10 +770,6 @@ DEFINE_CLK_GATE(aes2_fck, "l3_div_ck", &l3_div_ck, 0x0, | |||
749 | OMAP4430_CM_L4SEC_AES2_CLKCTRL, | 770 | OMAP4430_CM_L4SEC_AES2_CLKCTRL, |
750 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | 771 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); |
751 | 772 | ||
752 | DEFINE_CLK_GATE(aess_fck, "aess_fclk", &aess_fclk, 0x0, | ||
753 | OMAP4430_CM1_ABE_AESS_CLKCTRL, OMAP4430_MODULEMODE_SWCTRL_SHIFT, | ||
754 | 0x0, NULL); | ||
755 | |||
756 | DEFINE_CLK_GATE(bandgap_fclk, "sys_32k_ck", &sys_32k_ck, 0x0, | 773 | DEFINE_CLK_GATE(bandgap_fclk, "sys_32k_ck", &sys_32k_ck, 0x0, |
757 | OMAP4430_CM_WKUP_BANDGAP_CLKCTRL, | 774 | OMAP4430_CM_WKUP_BANDGAP_CLKCTRL, |
758 | OMAP4430_OPTFCLKEN_BGAP_32K_SHIFT, 0x0, NULL); | 775 | OMAP4430_OPTFCLKEN_BGAP_32K_SHIFT, 0x0, NULL); |
@@ -774,11 +791,6 @@ DEFINE_CLK_GATE(bandgap_ts_fclk, "div_ts_ck", &div_ts_ck, 0x0, | |||
774 | OMAP4460_OPTFCLKEN_TS_FCLK_SHIFT, | 791 | OMAP4460_OPTFCLKEN_TS_FCLK_SHIFT, |
775 | 0x0, NULL); | 792 | 0x0, NULL); |
776 | 793 | ||
777 | DEFINE_CLK_GATE(des3des_fck, "l4_div_ck", &l4_div_ck, 0x0, | ||
778 | OMAP4430_CM_L4SEC_DES3DES_CLKCTRL, | ||
779 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, | ||
780 | 0x0, NULL); | ||
781 | |||
782 | static const char *dmic_sync_mux_ck_parents[] = { | 794 | static const char *dmic_sync_mux_ck_parents[] = { |
783 | "abe_24m_fclk", "syc_clk_div_ck", "func_24m_clk", | 795 | "abe_24m_fclk", "syc_clk_div_ck", "func_24m_clk", |
784 | }; | 796 | }; |
@@ -795,23 +807,13 @@ static const struct clksel func_dmic_abe_gfclk_sel[] = { | |||
795 | { .parent = NULL }, | 807 | { .parent = NULL }, |
796 | }; | 808 | }; |
797 | 809 | ||
798 | static const char *dmic_fck_parents[] = { | 810 | static const char *func_dmic_abe_gfclk_parents[] = { |
799 | "dmic_sync_mux_ck", "pad_clks_ck", "slimbus_clk", | 811 | "dmic_sync_mux_ck", "pad_clks_ck", "slimbus_clk", |
800 | }; | 812 | }; |
801 | 813 | ||
802 | /* Merged func_dmic_abe_gfclk into dmic */ | 814 | DEFINE_CLK_OMAP_MUX(func_dmic_abe_gfclk, "abe_clkdm", func_dmic_abe_gfclk_sel, |
803 | static struct clk dmic_fck; | 815 | OMAP4430_CM1_ABE_DMIC_CLKCTRL, OMAP4430_CLKSEL_SOURCE_MASK, |
804 | 816 | func_dmic_abe_gfclk_parents, func_dmic_abe_gfclk_ops); | |
805 | DEFINE_CLK_OMAP_MUX_GATE(dmic_fck, "abe_clkdm", func_dmic_abe_gfclk_sel, | ||
806 | OMAP4430_CM1_ABE_DMIC_CLKCTRL, | ||
807 | OMAP4430_CLKSEL_SOURCE_MASK, | ||
808 | OMAP4430_CM1_ABE_DMIC_CLKCTRL, | ||
809 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | ||
810 | dmic_fck_parents, dmic_fck_ops); | ||
811 | |||
812 | DEFINE_CLK_GATE(dsp_fck, "dpll_iva_m4x2_ck", &dpll_iva_m4x2_ck, 0x0, | ||
813 | OMAP4430_CM_TESLA_TESLA_CLKCTRL, | ||
814 | OMAP4430_MODULEMODE_HWCTRL_SHIFT, 0x0, NULL); | ||
815 | 817 | ||
816 | DEFINE_CLK_GATE(dss_sys_clk, "syc_clk_div_ck", &syc_clk_div_ck, 0x0, | 818 | DEFINE_CLK_GATE(dss_sys_clk, "syc_clk_div_ck", &syc_clk_div_ck, 0x0, |
817 | OMAP4430_CM_DSS_DSS_CLKCTRL, | 819 | OMAP4430_CM_DSS_DSS_CLKCTRL, |
@@ -833,177 +835,57 @@ DEFINE_CLK_GATE(dss_fck, "l3_div_ck", &l3_div_ck, 0x0, | |||
833 | OMAP4430_CM_DSS_DSS_CLKCTRL, OMAP4430_MODULEMODE_SWCTRL_SHIFT, | 835 | OMAP4430_CM_DSS_DSS_CLKCTRL, OMAP4430_MODULEMODE_SWCTRL_SHIFT, |
834 | 0x0, NULL); | 836 | 0x0, NULL); |
835 | 837 | ||
836 | DEFINE_CLK_GATE(efuse_ctrl_cust_fck, "sys_clkin_ck", &sys_clkin_ck, 0x0, | ||
837 | OMAP4430_CM_CEFUSE_CEFUSE_CLKCTRL, | ||
838 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
839 | |||
840 | DEFINE_CLK_GATE(emif1_fck, "ddrphy_ck", &ddrphy_ck, 0x0, | ||
841 | OMAP4430_CM_MEMIF_EMIF_1_CLKCTRL, | ||
842 | OMAP4430_MODULEMODE_HWCTRL_SHIFT, 0x0, NULL); | ||
843 | |||
844 | DEFINE_CLK_GATE(emif2_fck, "ddrphy_ck", &ddrphy_ck, 0x0, | ||
845 | OMAP4430_CM_MEMIF_EMIF_2_CLKCTRL, | ||
846 | OMAP4430_MODULEMODE_HWCTRL_SHIFT, 0x0, NULL); | ||
847 | |||
848 | DEFINE_CLK_DIVIDER(fdif_fck, "dpll_per_m4x2_ck", &dpll_per_m4x2_ck, 0x0, | 838 | DEFINE_CLK_DIVIDER(fdif_fck, "dpll_per_m4x2_ck", &dpll_per_m4x2_ck, 0x0, |
849 | OMAP4430_CM_CAM_FDIF_CLKCTRL, OMAP4430_CLKSEL_FCLK_SHIFT, | 839 | OMAP4430_CM_CAM_FDIF_CLKCTRL, OMAP4430_CLKSEL_FCLK_SHIFT, |
850 | OMAP4430_CLKSEL_FCLK_WIDTH, CLK_DIVIDER_POWER_OF_TWO, NULL); | 840 | OMAP4430_CLKSEL_FCLK_WIDTH, CLK_DIVIDER_POWER_OF_TWO, NULL); |
851 | 841 | ||
852 | DEFINE_CLK_GATE(fpka_fck, "l4_div_ck", &l4_div_ck, 0x0, | ||
853 | OMAP4430_CM_L4SEC_PKAEIP29_CLKCTRL, | ||
854 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
855 | |||
856 | DEFINE_CLK_GATE(gpio1_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0, | 842 | DEFINE_CLK_GATE(gpio1_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0, |
857 | OMAP4430_CM_WKUP_GPIO1_CLKCTRL, | 843 | OMAP4430_CM_WKUP_GPIO1_CLKCTRL, |
858 | OMAP4430_OPTFCLKEN_DBCLK_SHIFT, 0x0, NULL); | 844 | OMAP4430_OPTFCLKEN_DBCLK_SHIFT, 0x0, NULL); |
859 | 845 | ||
860 | DEFINE_CLK_GATE(gpio1_ick, "l4_wkup_clk_mux_ck", &l4_wkup_clk_mux_ck, 0x0, | ||
861 | OMAP4430_CM_WKUP_GPIO1_CLKCTRL, | ||
862 | OMAP4430_MODULEMODE_HWCTRL_SHIFT, 0x0, NULL); | ||
863 | |||
864 | DEFINE_CLK_GATE(gpio2_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0, | 846 | DEFINE_CLK_GATE(gpio2_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0, |
865 | OMAP4430_CM_L4PER_GPIO2_CLKCTRL, OMAP4430_OPTFCLKEN_DBCLK_SHIFT, | 847 | OMAP4430_CM_L4PER_GPIO2_CLKCTRL, OMAP4430_OPTFCLKEN_DBCLK_SHIFT, |
866 | 0x0, NULL); | 848 | 0x0, NULL); |
867 | 849 | ||
868 | DEFINE_CLK_GATE(gpio2_ick, "l4_div_ck", &l4_div_ck, 0x0, | ||
869 | OMAP4430_CM_L4PER_GPIO2_CLKCTRL, | ||
870 | OMAP4430_MODULEMODE_HWCTRL_SHIFT, 0x0, NULL); | ||
871 | |||
872 | DEFINE_CLK_GATE(gpio3_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0, | 850 | DEFINE_CLK_GATE(gpio3_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0, |
873 | OMAP4430_CM_L4PER_GPIO3_CLKCTRL, | 851 | OMAP4430_CM_L4PER_GPIO3_CLKCTRL, |
874 | OMAP4430_OPTFCLKEN_DBCLK_SHIFT, 0x0, NULL); | 852 | OMAP4430_OPTFCLKEN_DBCLK_SHIFT, 0x0, NULL); |
875 | 853 | ||
876 | DEFINE_CLK_GATE(gpio3_ick, "l4_div_ck", &l4_div_ck, 0x0, | ||
877 | OMAP4430_CM_L4PER_GPIO3_CLKCTRL, | ||
878 | OMAP4430_MODULEMODE_HWCTRL_SHIFT, 0x0, NULL); | ||
879 | |||
880 | DEFINE_CLK_GATE(gpio4_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0, | 854 | DEFINE_CLK_GATE(gpio4_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0, |
881 | OMAP4430_CM_L4PER_GPIO4_CLKCTRL, OMAP4430_OPTFCLKEN_DBCLK_SHIFT, | 855 | OMAP4430_CM_L4PER_GPIO4_CLKCTRL, OMAP4430_OPTFCLKEN_DBCLK_SHIFT, |
882 | 0x0, NULL); | 856 | 0x0, NULL); |
883 | 857 | ||
884 | DEFINE_CLK_GATE(gpio4_ick, "l4_div_ck", &l4_div_ck, 0x0, | ||
885 | OMAP4430_CM_L4PER_GPIO4_CLKCTRL, | ||
886 | OMAP4430_MODULEMODE_HWCTRL_SHIFT, 0x0, NULL); | ||
887 | |||
888 | DEFINE_CLK_GATE(gpio5_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0, | 858 | DEFINE_CLK_GATE(gpio5_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0, |
889 | OMAP4430_CM_L4PER_GPIO5_CLKCTRL, OMAP4430_OPTFCLKEN_DBCLK_SHIFT, | 859 | OMAP4430_CM_L4PER_GPIO5_CLKCTRL, OMAP4430_OPTFCLKEN_DBCLK_SHIFT, |
890 | 0x0, NULL); | 860 | 0x0, NULL); |
891 | 861 | ||
892 | DEFINE_CLK_GATE(gpio5_ick, "l4_div_ck", &l4_div_ck, 0x0, | ||
893 | OMAP4430_CM_L4PER_GPIO5_CLKCTRL, | ||
894 | OMAP4430_MODULEMODE_HWCTRL_SHIFT, 0x0, NULL); | ||
895 | |||
896 | DEFINE_CLK_GATE(gpio6_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0, | 862 | DEFINE_CLK_GATE(gpio6_dbclk, "sys_32k_ck", &sys_32k_ck, 0x0, |
897 | OMAP4430_CM_L4PER_GPIO6_CLKCTRL, OMAP4430_OPTFCLKEN_DBCLK_SHIFT, | 863 | OMAP4430_CM_L4PER_GPIO6_CLKCTRL, OMAP4430_OPTFCLKEN_DBCLK_SHIFT, |
898 | 0x0, NULL); | 864 | 0x0, NULL); |
899 | 865 | ||
900 | DEFINE_CLK_GATE(gpio6_ick, "l4_div_ck", &l4_div_ck, 0x0, | ||
901 | OMAP4430_CM_L4PER_GPIO6_CLKCTRL, | ||
902 | OMAP4430_MODULEMODE_HWCTRL_SHIFT, 0x0, NULL); | ||
903 | |||
904 | DEFINE_CLK_GATE(gpmc_ick, "l3_div_ck", &l3_div_ck, 0x0, | ||
905 | OMAP4430_CM_L3_2_GPMC_CLKCTRL, OMAP4430_MODULEMODE_HWCTRL_SHIFT, | ||
906 | 0x0, NULL); | ||
907 | |||
908 | static const struct clksel sgx_clk_mux_sel[] = { | 866 | static const struct clksel sgx_clk_mux_sel[] = { |
909 | { .parent = &dpll_core_m7x2_ck, .rates = div_1_0_rates }, | 867 | { .parent = &dpll_core_m7x2_ck, .rates = div_1_0_rates }, |
910 | { .parent = &dpll_per_m7x2_ck, .rates = div_1_1_rates }, | 868 | { .parent = &dpll_per_m7x2_ck, .rates = div_1_1_rates }, |
911 | { .parent = NULL }, | 869 | { .parent = NULL }, |
912 | }; | 870 | }; |
913 | 871 | ||
914 | static const char *gpu_fck_parents[] = { | 872 | static const char *sgx_clk_mux_parents[] = { |
915 | "dpll_core_m7x2_ck", "dpll_per_m7x2_ck", | 873 | "dpll_core_m7x2_ck", "dpll_per_m7x2_ck", |
916 | }; | 874 | }; |
917 | 875 | ||
918 | /* Merged sgx_clk_mux into gpu */ | 876 | DEFINE_CLK_OMAP_MUX(sgx_clk_mux, "l3_gfx_clkdm", sgx_clk_mux_sel, |
919 | DEFINE_CLK_OMAP_MUX_GATE(gpu_fck, "l3_gfx_clkdm", sgx_clk_mux_sel, | 877 | OMAP4430_CM_GFX_GFX_CLKCTRL, OMAP4430_CLKSEL_SGX_FCLK_MASK, |
920 | OMAP4430_CM_GFX_GFX_CLKCTRL, | 878 | sgx_clk_mux_parents, func_dmic_abe_gfclk_ops); |
921 | OMAP4430_CLKSEL_SGX_FCLK_MASK, | ||
922 | OMAP4430_CM_GFX_GFX_CLKCTRL, | ||
923 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | ||
924 | gpu_fck_parents, dmic_fck_ops); | ||
925 | |||
926 | DEFINE_CLK_GATE(hdq1w_fck, "func_12m_fclk", &func_12m_fclk, 0x0, | ||
927 | OMAP4430_CM_L4PER_HDQ1W_CLKCTRL, | ||
928 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
929 | 879 | ||
930 | DEFINE_CLK_DIVIDER(hsi_fck, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck, 0x0, | 880 | DEFINE_CLK_DIVIDER(hsi_fck, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck, 0x0, |
931 | OMAP4430_CM_L3INIT_HSI_CLKCTRL, OMAP4430_CLKSEL_24_25_SHIFT, | 881 | OMAP4430_CM_L3INIT_HSI_CLKCTRL, OMAP4430_CLKSEL_24_25_SHIFT, |
932 | OMAP4430_CLKSEL_24_25_WIDTH, CLK_DIVIDER_POWER_OF_TWO, | 882 | OMAP4430_CLKSEL_24_25_WIDTH, CLK_DIVIDER_POWER_OF_TWO, |
933 | NULL); | 883 | NULL); |
934 | 884 | ||
935 | DEFINE_CLK_GATE(i2c1_fck, "func_96m_fclk", &func_96m_fclk, 0x0, | ||
936 | OMAP4430_CM_L4PER_I2C1_CLKCTRL, | ||
937 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
938 | |||
939 | DEFINE_CLK_GATE(i2c2_fck, "func_96m_fclk", &func_96m_fclk, 0x0, | ||
940 | OMAP4430_CM_L4PER_I2C2_CLKCTRL, | ||
941 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
942 | |||
943 | DEFINE_CLK_GATE(i2c3_fck, "func_96m_fclk", &func_96m_fclk, 0x0, | ||
944 | OMAP4430_CM_L4PER_I2C3_CLKCTRL, | ||
945 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
946 | |||
947 | DEFINE_CLK_GATE(i2c4_fck, "func_96m_fclk", &func_96m_fclk, 0x0, | ||
948 | OMAP4430_CM_L4PER_I2C4_CLKCTRL, | ||
949 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
950 | |||
951 | DEFINE_CLK_GATE(ipu_fck, "ducati_clk_mux_ck", &ducati_clk_mux_ck, 0x0, | ||
952 | OMAP4430_CM_DUCATI_DUCATI_CLKCTRL, | ||
953 | OMAP4430_MODULEMODE_HWCTRL_SHIFT, 0x0, NULL); | ||
954 | |||
955 | DEFINE_CLK_GATE(iss_ctrlclk, "func_96m_fclk", &func_96m_fclk, 0x0, | 885 | DEFINE_CLK_GATE(iss_ctrlclk, "func_96m_fclk", &func_96m_fclk, 0x0, |
956 | OMAP4430_CM_CAM_ISS_CLKCTRL, OMAP4430_OPTFCLKEN_CTRLCLK_SHIFT, | 886 | OMAP4430_CM_CAM_ISS_CLKCTRL, OMAP4430_OPTFCLKEN_CTRLCLK_SHIFT, |
957 | 0x0, NULL); | 887 | 0x0, NULL); |
958 | 888 | ||
959 | DEFINE_CLK_GATE(iss_fck, "ducati_clk_mux_ck", &ducati_clk_mux_ck, 0x0, | ||
960 | OMAP4430_CM_CAM_ISS_CLKCTRL, OMAP4430_MODULEMODE_SWCTRL_SHIFT, | ||
961 | 0x0, NULL); | ||
962 | |||
963 | DEFINE_CLK_GATE(iva_fck, "dpll_iva_m5x2_ck", &dpll_iva_m5x2_ck, 0x0, | ||
964 | OMAP4430_CM_IVAHD_IVAHD_CLKCTRL, | ||
965 | OMAP4430_MODULEMODE_HWCTRL_SHIFT, 0x0, NULL); | ||
966 | |||
967 | DEFINE_CLK_GATE(kbd_fck, "sys_32k_ck", &sys_32k_ck, 0x0, | ||
968 | OMAP4430_CM_WKUP_KEYBOARD_CLKCTRL, | ||
969 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
970 | |||
971 | static struct clk l3_instr_ick; | ||
972 | |||
973 | static const char *l3_instr_ick_parent_names[] = { | ||
974 | "l3_div_ck", | ||
975 | }; | ||
976 | |||
977 | static const struct clk_ops l3_instr_ick_ops = { | ||
978 | .enable = &omap2_dflt_clk_enable, | ||
979 | .disable = &omap2_dflt_clk_disable, | ||
980 | .is_enabled = &omap2_dflt_clk_is_enabled, | ||
981 | .init = &omap2_init_clk_clkdm, | ||
982 | }; | ||
983 | |||
984 | static struct clk_hw_omap l3_instr_ick_hw = { | ||
985 | .hw = { | ||
986 | .clk = &l3_instr_ick, | ||
987 | }, | ||
988 | .enable_reg = OMAP4430_CM_L3INSTR_L3_INSTR_CLKCTRL, | ||
989 | .enable_bit = OMAP4430_MODULEMODE_HWCTRL_SHIFT, | ||
990 | .clkdm_name = "l3_instr_clkdm", | ||
991 | }; | ||
992 | |||
993 | DEFINE_STRUCT_CLK(l3_instr_ick, l3_instr_ick_parent_names, l3_instr_ick_ops); | ||
994 | |||
995 | static struct clk l3_main_3_ick; | ||
996 | static struct clk_hw_omap l3_main_3_ick_hw = { | ||
997 | .hw = { | ||
998 | .clk = &l3_main_3_ick, | ||
999 | }, | ||
1000 | .enable_reg = OMAP4430_CM_L3INSTR_L3_3_CLKCTRL, | ||
1001 | .enable_bit = OMAP4430_MODULEMODE_HWCTRL_SHIFT, | ||
1002 | .clkdm_name = "l3_instr_clkdm", | ||
1003 | }; | ||
1004 | |||
1005 | DEFINE_STRUCT_CLK(l3_main_3_ick, l3_instr_ick_parent_names, l3_instr_ick_ops); | ||
1006 | |||
1007 | DEFINE_CLK_MUX(mcasp_sync_mux_ck, dmic_sync_mux_ck_parents, NULL, 0x0, | 889 | DEFINE_CLK_MUX(mcasp_sync_mux_ck, dmic_sync_mux_ck_parents, NULL, 0x0, |
1008 | OMAP4430_CM1_ABE_MCASP_CLKCTRL, | 890 | OMAP4430_CM1_ABE_MCASP_CLKCTRL, |
1009 | OMAP4430_CLKSEL_INTERNAL_SOURCE_SHIFT, | 891 | OMAP4430_CLKSEL_INTERNAL_SOURCE_SHIFT, |
@@ -1016,17 +898,13 @@ static const struct clksel func_mcasp_abe_gfclk_sel[] = { | |||
1016 | { .parent = NULL }, | 898 | { .parent = NULL }, |
1017 | }; | 899 | }; |
1018 | 900 | ||
1019 | static const char *mcasp_fck_parents[] = { | 901 | static const char *func_mcasp_abe_gfclk_parents[] = { |
1020 | "mcasp_sync_mux_ck", "pad_clks_ck", "slimbus_clk", | 902 | "mcasp_sync_mux_ck", "pad_clks_ck", "slimbus_clk", |
1021 | }; | 903 | }; |
1022 | 904 | ||
1023 | /* Merged func_mcasp_abe_gfclk into mcasp */ | 905 | DEFINE_CLK_OMAP_MUX(func_mcasp_abe_gfclk, "abe_clkdm", func_mcasp_abe_gfclk_sel, |
1024 | DEFINE_CLK_OMAP_MUX_GATE(mcasp_fck, "abe_clkdm", func_mcasp_abe_gfclk_sel, | 906 | OMAP4430_CM1_ABE_MCASP_CLKCTRL, OMAP4430_CLKSEL_SOURCE_MASK, |
1025 | OMAP4430_CM1_ABE_MCASP_CLKCTRL, | 907 | func_mcasp_abe_gfclk_parents, func_dmic_abe_gfclk_ops); |
1026 | OMAP4430_CLKSEL_SOURCE_MASK, | ||
1027 | OMAP4430_CM1_ABE_MCASP_CLKCTRL, | ||
1028 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | ||
1029 | mcasp_fck_parents, dmic_fck_ops); | ||
1030 | 908 | ||
1031 | DEFINE_CLK_MUX(mcbsp1_sync_mux_ck, dmic_sync_mux_ck_parents, NULL, 0x0, | 909 | DEFINE_CLK_MUX(mcbsp1_sync_mux_ck, dmic_sync_mux_ck_parents, NULL, 0x0, |
1032 | OMAP4430_CM1_ABE_MCBSP1_CLKCTRL, | 910 | OMAP4430_CM1_ABE_MCBSP1_CLKCTRL, |
@@ -1040,17 +918,14 @@ static const struct clksel func_mcbsp1_gfclk_sel[] = { | |||
1040 | { .parent = NULL }, | 918 | { .parent = NULL }, |
1041 | }; | 919 | }; |
1042 | 920 | ||
1043 | static const char *mcbsp1_fck_parents[] = { | 921 | static const char *func_mcbsp1_gfclk_parents[] = { |
1044 | "mcbsp1_sync_mux_ck", "pad_clks_ck", "slimbus_clk", | 922 | "mcbsp1_sync_mux_ck", "pad_clks_ck", "slimbus_clk", |
1045 | }; | 923 | }; |
1046 | 924 | ||
1047 | /* Merged func_mcbsp1_gfclk into mcbsp1 */ | 925 | DEFINE_CLK_OMAP_MUX(func_mcbsp1_gfclk, "abe_clkdm", func_mcbsp1_gfclk_sel, |
1048 | DEFINE_CLK_OMAP_MUX_GATE(mcbsp1_fck, "abe_clkdm", func_mcbsp1_gfclk_sel, | 926 | OMAP4430_CM1_ABE_MCBSP1_CLKCTRL, |
1049 | OMAP4430_CM1_ABE_MCBSP1_CLKCTRL, | 927 | OMAP4430_CLKSEL_SOURCE_MASK, func_mcbsp1_gfclk_parents, |
1050 | OMAP4430_CLKSEL_SOURCE_MASK, | 928 | func_dmic_abe_gfclk_ops); |
1051 | OMAP4430_CM1_ABE_MCBSP1_CLKCTRL, | ||
1052 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | ||
1053 | mcbsp1_fck_parents, dmic_fck_ops); | ||
1054 | 929 | ||
1055 | DEFINE_CLK_MUX(mcbsp2_sync_mux_ck, dmic_sync_mux_ck_parents, NULL, 0x0, | 930 | DEFINE_CLK_MUX(mcbsp2_sync_mux_ck, dmic_sync_mux_ck_parents, NULL, 0x0, |
1056 | OMAP4430_CM1_ABE_MCBSP2_CLKCTRL, | 931 | OMAP4430_CM1_ABE_MCBSP2_CLKCTRL, |
@@ -1064,17 +939,14 @@ static const struct clksel func_mcbsp2_gfclk_sel[] = { | |||
1064 | { .parent = NULL }, | 939 | { .parent = NULL }, |
1065 | }; | 940 | }; |
1066 | 941 | ||
1067 | static const char *mcbsp2_fck_parents[] = { | 942 | static const char *func_mcbsp2_gfclk_parents[] = { |
1068 | "mcbsp2_sync_mux_ck", "pad_clks_ck", "slimbus_clk", | 943 | "mcbsp2_sync_mux_ck", "pad_clks_ck", "slimbus_clk", |
1069 | }; | 944 | }; |
1070 | 945 | ||
1071 | /* Merged func_mcbsp2_gfclk into mcbsp2 */ | 946 | DEFINE_CLK_OMAP_MUX(func_mcbsp2_gfclk, "abe_clkdm", func_mcbsp2_gfclk_sel, |
1072 | DEFINE_CLK_OMAP_MUX_GATE(mcbsp2_fck, "abe_clkdm", func_mcbsp2_gfclk_sel, | 947 | OMAP4430_CM1_ABE_MCBSP2_CLKCTRL, |
1073 | OMAP4430_CM1_ABE_MCBSP2_CLKCTRL, | 948 | OMAP4430_CLKSEL_SOURCE_MASK, func_mcbsp2_gfclk_parents, |
1074 | OMAP4430_CLKSEL_SOURCE_MASK, | 949 | func_dmic_abe_gfclk_ops); |
1075 | OMAP4430_CM1_ABE_MCBSP2_CLKCTRL, | ||
1076 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | ||
1077 | mcbsp2_fck_parents, dmic_fck_ops); | ||
1078 | 950 | ||
1079 | DEFINE_CLK_MUX(mcbsp3_sync_mux_ck, dmic_sync_mux_ck_parents, NULL, 0x0, | 951 | DEFINE_CLK_MUX(mcbsp3_sync_mux_ck, dmic_sync_mux_ck_parents, NULL, 0x0, |
1080 | OMAP4430_CM1_ABE_MCBSP3_CLKCTRL, | 952 | OMAP4430_CM1_ABE_MCBSP3_CLKCTRL, |
@@ -1088,17 +960,14 @@ static const struct clksel func_mcbsp3_gfclk_sel[] = { | |||
1088 | { .parent = NULL }, | 960 | { .parent = NULL }, |
1089 | }; | 961 | }; |
1090 | 962 | ||
1091 | static const char *mcbsp3_fck_parents[] = { | 963 | static const char *func_mcbsp3_gfclk_parents[] = { |
1092 | "mcbsp3_sync_mux_ck", "pad_clks_ck", "slimbus_clk", | 964 | "mcbsp3_sync_mux_ck", "pad_clks_ck", "slimbus_clk", |
1093 | }; | 965 | }; |
1094 | 966 | ||
1095 | /* Merged func_mcbsp3_gfclk into mcbsp3 */ | 967 | DEFINE_CLK_OMAP_MUX(func_mcbsp3_gfclk, "abe_clkdm", func_mcbsp3_gfclk_sel, |
1096 | DEFINE_CLK_OMAP_MUX_GATE(mcbsp3_fck, "abe_clkdm", func_mcbsp3_gfclk_sel, | 968 | OMAP4430_CM1_ABE_MCBSP3_CLKCTRL, |
1097 | OMAP4430_CM1_ABE_MCBSP3_CLKCTRL, | 969 | OMAP4430_CLKSEL_SOURCE_MASK, func_mcbsp3_gfclk_parents, |
1098 | OMAP4430_CLKSEL_SOURCE_MASK, | 970 | func_dmic_abe_gfclk_ops); |
1099 | OMAP4430_CM1_ABE_MCBSP3_CLKCTRL, | ||
1100 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | ||
1101 | mcbsp3_fck_parents, dmic_fck_ops); | ||
1102 | 971 | ||
1103 | static const char *mcbsp4_sync_mux_ck_parents[] = { | 972 | static const char *mcbsp4_sync_mux_ck_parents[] = { |
1104 | "func_96m_fclk", "per_abe_nc_fclk", | 973 | "func_96m_fclk", "per_abe_nc_fclk", |
@@ -1115,37 +984,14 @@ static const struct clksel per_mcbsp4_gfclk_sel[] = { | |||
1115 | { .parent = NULL }, | 984 | { .parent = NULL }, |
1116 | }; | 985 | }; |
1117 | 986 | ||
1118 | static const char *mcbsp4_fck_parents[] = { | 987 | static const char *per_mcbsp4_gfclk_parents[] = { |
1119 | "mcbsp4_sync_mux_ck", "pad_clks_ck", | 988 | "mcbsp4_sync_mux_ck", "pad_clks_ck", |
1120 | }; | 989 | }; |
1121 | 990 | ||
1122 | /* Merged per_mcbsp4_gfclk into mcbsp4 */ | 991 | DEFINE_CLK_OMAP_MUX(per_mcbsp4_gfclk, "l4_per_clkdm", per_mcbsp4_gfclk_sel, |
1123 | DEFINE_CLK_OMAP_MUX_GATE(mcbsp4_fck, "l4_per_clkdm", per_mcbsp4_gfclk_sel, | 992 | OMAP4430_CM_L4PER_MCBSP4_CLKCTRL, |
1124 | OMAP4430_CM_L4PER_MCBSP4_CLKCTRL, | 993 | OMAP4430_CLKSEL_SOURCE_24_24_MASK, per_mcbsp4_gfclk_parents, |
1125 | OMAP4430_CLKSEL_SOURCE_24_24_MASK, | 994 | func_dmic_abe_gfclk_ops); |
1126 | OMAP4430_CM_L4PER_MCBSP4_CLKCTRL, | ||
1127 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | ||
1128 | mcbsp4_fck_parents, dmic_fck_ops); | ||
1129 | |||
1130 | DEFINE_CLK_GATE(mcpdm_fck, "pad_clks_ck", &pad_clks_ck, 0x0, | ||
1131 | OMAP4430_CM1_ABE_PDM_CLKCTRL, OMAP4430_MODULEMODE_SWCTRL_SHIFT, | ||
1132 | 0x0, NULL); | ||
1133 | |||
1134 | DEFINE_CLK_GATE(mcspi1_fck, "func_48m_fclk", &func_48m_fclk, 0x0, | ||
1135 | OMAP4430_CM_L4PER_MCSPI1_CLKCTRL, | ||
1136 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
1137 | |||
1138 | DEFINE_CLK_GATE(mcspi2_fck, "func_48m_fclk", &func_48m_fclk, 0x0, | ||
1139 | OMAP4430_CM_L4PER_MCSPI2_CLKCTRL, | ||
1140 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
1141 | |||
1142 | DEFINE_CLK_GATE(mcspi3_fck, "func_48m_fclk", &func_48m_fclk, 0x0, | ||
1143 | OMAP4430_CM_L4PER_MCSPI3_CLKCTRL, | ||
1144 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
1145 | |||
1146 | DEFINE_CLK_GATE(mcspi4_fck, "func_48m_fclk", &func_48m_fclk, 0x0, | ||
1147 | OMAP4430_CM_L4PER_MCSPI4_CLKCTRL, | ||
1148 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
1149 | 995 | ||
1150 | static const struct clksel hsmmc1_fclk_sel[] = { | 996 | static const struct clksel hsmmc1_fclk_sel[] = { |
1151 | { .parent = &func_64m_fclk, .rates = div_1_0_rates }, | 997 | { .parent = &func_64m_fclk, .rates = div_1_0_rates }, |
@@ -1153,69 +999,22 @@ static const struct clksel hsmmc1_fclk_sel[] = { | |||
1153 | { .parent = NULL }, | 999 | { .parent = NULL }, |
1154 | }; | 1000 | }; |
1155 | 1001 | ||
1156 | static const char *mmc1_fck_parents[] = { | 1002 | static const char *hsmmc1_fclk_parents[] = { |
1157 | "func_64m_fclk", "func_96m_fclk", | 1003 | "func_64m_fclk", "func_96m_fclk", |
1158 | }; | 1004 | }; |
1159 | 1005 | ||
1160 | /* Merged hsmmc1_fclk into mmc1 */ | 1006 | DEFINE_CLK_OMAP_MUX(hsmmc1_fclk, "l3_init_clkdm", hsmmc1_fclk_sel, |
1161 | DEFINE_CLK_OMAP_MUX_GATE(mmc1_fck, "l3_init_clkdm", hsmmc1_fclk_sel, | 1007 | OMAP4430_CM_L3INIT_MMC1_CLKCTRL, OMAP4430_CLKSEL_MASK, |
1162 | OMAP4430_CM_L3INIT_MMC1_CLKCTRL, OMAP4430_CLKSEL_MASK, | 1008 | hsmmc1_fclk_parents, func_dmic_abe_gfclk_ops); |
1163 | OMAP4430_CM_L3INIT_MMC1_CLKCTRL, | ||
1164 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | ||
1165 | mmc1_fck_parents, dmic_fck_ops); | ||
1166 | |||
1167 | /* Merged hsmmc2_fclk into mmc2 */ | ||
1168 | DEFINE_CLK_OMAP_MUX_GATE(mmc2_fck, "l3_init_clkdm", hsmmc1_fclk_sel, | ||
1169 | OMAP4430_CM_L3INIT_MMC2_CLKCTRL, OMAP4430_CLKSEL_MASK, | ||
1170 | OMAP4430_CM_L3INIT_MMC2_CLKCTRL, | ||
1171 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | ||
1172 | mmc1_fck_parents, dmic_fck_ops); | ||
1173 | |||
1174 | DEFINE_CLK_GATE(mmc3_fck, "func_48m_fclk", &func_48m_fclk, 0x0, | ||
1175 | OMAP4430_CM_L4PER_MMCSD3_CLKCTRL, | ||
1176 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
1177 | |||
1178 | DEFINE_CLK_GATE(mmc4_fck, "func_48m_fclk", &func_48m_fclk, 0x0, | ||
1179 | OMAP4430_CM_L4PER_MMCSD4_CLKCTRL, | ||
1180 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
1181 | |||
1182 | DEFINE_CLK_GATE(mmc5_fck, "func_48m_fclk", &func_48m_fclk, 0x0, | ||
1183 | OMAP4430_CM_L4PER_MMCSD5_CLKCTRL, | ||
1184 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
1185 | |||
1186 | DEFINE_CLK_GATE(ocp2scp_usb_phy_phy_48m, "func_48m_fclk", &func_48m_fclk, 0x0, | ||
1187 | OMAP4430_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL, | ||
1188 | OMAP4430_OPTFCLKEN_PHY_48M_SHIFT, 0x0, NULL); | ||
1189 | |||
1190 | DEFINE_CLK_GATE(ocp2scp_usb_phy_ick, "l4_div_ck", &l4_div_ck, 0x0, | ||
1191 | OMAP4430_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL, | ||
1192 | OMAP4430_MODULEMODE_HWCTRL_SHIFT, 0x0, NULL); | ||
1193 | 1009 | ||
1194 | static struct clk ocp_wp_noc_ick; | 1010 | DEFINE_CLK_OMAP_MUX(hsmmc2_fclk, "l3_init_clkdm", hsmmc1_fclk_sel, |
1195 | 1011 | OMAP4430_CM_L3INIT_MMC2_CLKCTRL, OMAP4430_CLKSEL_MASK, | |
1196 | static struct clk_hw_omap ocp_wp_noc_ick_hw = { | 1012 | hsmmc1_fclk_parents, func_dmic_abe_gfclk_ops); |
1197 | .hw = { | ||
1198 | .clk = &ocp_wp_noc_ick, | ||
1199 | }, | ||
1200 | .enable_reg = OMAP4430_CM_L3INSTR_OCP_WP1_CLKCTRL, | ||
1201 | .enable_bit = OMAP4430_MODULEMODE_HWCTRL_SHIFT, | ||
1202 | .clkdm_name = "l3_instr_clkdm", | ||
1203 | }; | ||
1204 | |||
1205 | DEFINE_STRUCT_CLK(ocp_wp_noc_ick, l3_instr_ick_parent_names, l3_instr_ick_ops); | ||
1206 | |||
1207 | DEFINE_CLK_GATE(rng_ick, "l4_div_ck", &l4_div_ck, 0x0, | ||
1208 | OMAP4430_CM_L4SEC_RNG_CLKCTRL, OMAP4430_MODULEMODE_HWCTRL_SHIFT, | ||
1209 | 0x0, NULL); | ||
1210 | 1013 | ||
1211 | DEFINE_CLK_GATE(sha2md5_fck, "l3_div_ck", &l3_div_ck, 0x0, | 1014 | DEFINE_CLK_GATE(sha2md5_fck, "l3_div_ck", &l3_div_ck, 0x0, |
1212 | OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL, | 1015 | OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL, |
1213 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | 1016 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); |
1214 | 1017 | ||
1215 | DEFINE_CLK_GATE(sl2if_ick, "dpll_iva_m5x2_ck", &dpll_iva_m5x2_ck, 0x0, | ||
1216 | OMAP4430_CM_IVAHD_SL2_CLKCTRL, OMAP4430_MODULEMODE_HWCTRL_SHIFT, | ||
1217 | 0x0, NULL); | ||
1218 | |||
1219 | DEFINE_CLK_GATE(slimbus1_fclk_1, "func_24m_clk", &func_24m_clk, 0x0, | 1018 | DEFINE_CLK_GATE(slimbus1_fclk_1, "func_24m_clk", &func_24m_clk, 0x0, |
1220 | OMAP4430_CM1_ABE_SLIMBUS_CLKCTRL, | 1019 | OMAP4430_CM1_ABE_SLIMBUS_CLKCTRL, |
1221 | OMAP4430_OPTFCLKEN_FCLK1_SHIFT, 0x0, NULL); | 1020 | OMAP4430_OPTFCLKEN_FCLK1_SHIFT, 0x0, NULL); |
@@ -1232,10 +1031,6 @@ DEFINE_CLK_GATE(slimbus1_slimbus_clk, "slimbus_clk", &slimbus_clk, 0x0, | |||
1232 | OMAP4430_CM1_ABE_SLIMBUS_CLKCTRL, | 1031 | OMAP4430_CM1_ABE_SLIMBUS_CLKCTRL, |
1233 | OMAP4430_OPTFCLKEN_SLIMBUS_CLK_11_11_SHIFT, 0x0, NULL); | 1032 | OMAP4430_OPTFCLKEN_SLIMBUS_CLK_11_11_SHIFT, 0x0, NULL); |
1234 | 1033 | ||
1235 | DEFINE_CLK_GATE(slimbus1_fck, "ocp_abe_iclk", &ocp_abe_iclk, 0x0, | ||
1236 | OMAP4430_CM1_ABE_SLIMBUS_CLKCTRL, | ||
1237 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
1238 | |||
1239 | DEFINE_CLK_GATE(slimbus2_fclk_1, "per_abe_24m_fclk", &per_abe_24m_fclk, 0x0, | 1034 | DEFINE_CLK_GATE(slimbus2_fclk_1, "per_abe_24m_fclk", &per_abe_24m_fclk, 0x0, |
1240 | OMAP4430_CM_L4PER_SLIMBUS2_CLKCTRL, | 1035 | OMAP4430_CM_L4PER_SLIMBUS2_CLKCTRL, |
1241 | OMAP4430_OPTFCLKEN_PERABE24M_GFCLK_SHIFT, 0x0, NULL); | 1036 | OMAP4430_OPTFCLKEN_PERABE24M_GFCLK_SHIFT, 0x0, NULL); |
@@ -1249,10 +1044,6 @@ DEFINE_CLK_GATE(slimbus2_slimbus_clk, "pad_slimbus_core_clks_ck", | |||
1249 | OMAP4430_CM_L4PER_SLIMBUS2_CLKCTRL, | 1044 | OMAP4430_CM_L4PER_SLIMBUS2_CLKCTRL, |
1250 | OMAP4430_OPTFCLKEN_SLIMBUS_CLK_SHIFT, 0x0, NULL); | 1045 | OMAP4430_OPTFCLKEN_SLIMBUS_CLK_SHIFT, 0x0, NULL); |
1251 | 1046 | ||
1252 | DEFINE_CLK_GATE(slimbus2_fck, "l4_div_ck", &l4_div_ck, 0x0, | ||
1253 | OMAP4430_CM_L4PER_SLIMBUS2_CLKCTRL, | ||
1254 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
1255 | |||
1256 | DEFINE_CLK_GATE(smartreflex_core_fck, "l4_wkup_clk_mux_ck", &l4_wkup_clk_mux_ck, | 1047 | DEFINE_CLK_GATE(smartreflex_core_fck, "l4_wkup_clk_mux_ck", &l4_wkup_clk_mux_ck, |
1257 | 0x0, OMAP4430_CM_ALWON_SR_CORE_CLKCTRL, | 1048 | 0x0, OMAP4430_CM_ALWON_SR_CORE_CLKCTRL, |
1258 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | 1049 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); |
@@ -1271,52 +1062,35 @@ static const struct clksel dmt1_clk_mux_sel[] = { | |||
1271 | { .parent = NULL }, | 1062 | { .parent = NULL }, |
1272 | }; | 1063 | }; |
1273 | 1064 | ||
1274 | /* Merged dmt1_clk_mux into timer1 */ | 1065 | DEFINE_CLK_OMAP_MUX(dmt1_clk_mux, "l4_wkup_clkdm", dmt1_clk_mux_sel, |
1275 | DEFINE_CLK_OMAP_MUX_GATE(timer1_fck, "l4_wkup_clkdm", dmt1_clk_mux_sel, | 1066 | OMAP4430_CM_WKUP_TIMER1_CLKCTRL, OMAP4430_CLKSEL_MASK, |
1276 | OMAP4430_CM_WKUP_TIMER1_CLKCTRL, OMAP4430_CLKSEL_MASK, | 1067 | abe_dpll_bypass_clk_mux_ck_parents, |
1277 | OMAP4430_CM_WKUP_TIMER1_CLKCTRL, | 1068 | func_dmic_abe_gfclk_ops); |
1278 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | 1069 | |
1279 | abe_dpll_bypass_clk_mux_ck_parents, dmic_fck_ops); | 1070 | DEFINE_CLK_OMAP_MUX(cm2_dm10_mux, "l4_per_clkdm", dmt1_clk_mux_sel, |
1280 | 1071 | OMAP4430_CM_L4PER_DMTIMER10_CLKCTRL, OMAP4430_CLKSEL_MASK, | |
1281 | /* Merged cm2_dm10_mux into timer10 */ | 1072 | abe_dpll_bypass_clk_mux_ck_parents, |
1282 | DEFINE_CLK_OMAP_MUX_GATE(timer10_fck, "l4_per_clkdm", dmt1_clk_mux_sel, | 1073 | func_dmic_abe_gfclk_ops); |
1283 | OMAP4430_CM_L4PER_DMTIMER10_CLKCTRL, | 1074 | |
1284 | OMAP4430_CLKSEL_MASK, | 1075 | DEFINE_CLK_OMAP_MUX(cm2_dm11_mux, "l4_per_clkdm", dmt1_clk_mux_sel, |
1285 | OMAP4430_CM_L4PER_DMTIMER10_CLKCTRL, | 1076 | OMAP4430_CM_L4PER_DMTIMER11_CLKCTRL, OMAP4430_CLKSEL_MASK, |
1286 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | 1077 | abe_dpll_bypass_clk_mux_ck_parents, |
1287 | abe_dpll_bypass_clk_mux_ck_parents, dmic_fck_ops); | 1078 | func_dmic_abe_gfclk_ops); |
1288 | 1079 | ||
1289 | /* Merged cm2_dm11_mux into timer11 */ | 1080 | DEFINE_CLK_OMAP_MUX(cm2_dm2_mux, "l4_per_clkdm", dmt1_clk_mux_sel, |
1290 | DEFINE_CLK_OMAP_MUX_GATE(timer11_fck, "l4_per_clkdm", dmt1_clk_mux_sel, | 1081 | OMAP4430_CM_L4PER_DMTIMER2_CLKCTRL, OMAP4430_CLKSEL_MASK, |
1291 | OMAP4430_CM_L4PER_DMTIMER11_CLKCTRL, | 1082 | abe_dpll_bypass_clk_mux_ck_parents, |
1292 | OMAP4430_CLKSEL_MASK, | 1083 | func_dmic_abe_gfclk_ops); |
1293 | OMAP4430_CM_L4PER_DMTIMER11_CLKCTRL, | 1084 | |
1294 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | 1085 | DEFINE_CLK_OMAP_MUX(cm2_dm3_mux, "l4_per_clkdm", dmt1_clk_mux_sel, |
1295 | abe_dpll_bypass_clk_mux_ck_parents, dmic_fck_ops); | 1086 | OMAP4430_CM_L4PER_DMTIMER3_CLKCTRL, OMAP4430_CLKSEL_MASK, |
1296 | 1087 | abe_dpll_bypass_clk_mux_ck_parents, | |
1297 | /* Merged cm2_dm2_mux into timer2 */ | 1088 | func_dmic_abe_gfclk_ops); |
1298 | DEFINE_CLK_OMAP_MUX_GATE(timer2_fck, "l4_per_clkdm", dmt1_clk_mux_sel, | 1089 | |
1299 | OMAP4430_CM_L4PER_DMTIMER2_CLKCTRL, | 1090 | DEFINE_CLK_OMAP_MUX(cm2_dm4_mux, "l4_per_clkdm", dmt1_clk_mux_sel, |
1300 | OMAP4430_CLKSEL_MASK, | 1091 | OMAP4430_CM_L4PER_DMTIMER4_CLKCTRL, OMAP4430_CLKSEL_MASK, |
1301 | OMAP4430_CM_L4PER_DMTIMER2_CLKCTRL, | 1092 | abe_dpll_bypass_clk_mux_ck_parents, |
1302 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | 1093 | func_dmic_abe_gfclk_ops); |
1303 | abe_dpll_bypass_clk_mux_ck_parents, dmic_fck_ops); | ||
1304 | |||
1305 | /* Merged cm2_dm3_mux into timer3 */ | ||
1306 | DEFINE_CLK_OMAP_MUX_GATE(timer3_fck, "l4_per_clkdm", dmt1_clk_mux_sel, | ||
1307 | OMAP4430_CM_L4PER_DMTIMER3_CLKCTRL, | ||
1308 | OMAP4430_CLKSEL_MASK, | ||
1309 | OMAP4430_CM_L4PER_DMTIMER3_CLKCTRL, | ||
1310 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | ||
1311 | abe_dpll_bypass_clk_mux_ck_parents, dmic_fck_ops); | ||
1312 | |||
1313 | /* Merged cm2_dm4_mux into timer4 */ | ||
1314 | DEFINE_CLK_OMAP_MUX_GATE(timer4_fck, "l4_per_clkdm", dmt1_clk_mux_sel, | ||
1315 | OMAP4430_CM_L4PER_DMTIMER4_CLKCTRL, | ||
1316 | OMAP4430_CLKSEL_MASK, | ||
1317 | OMAP4430_CM_L4PER_DMTIMER4_CLKCTRL, | ||
1318 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | ||
1319 | abe_dpll_bypass_clk_mux_ck_parents, dmic_fck_ops); | ||
1320 | 1094 | ||
1321 | static const struct clksel timer5_sync_mux_sel[] = { | 1095 | static const struct clksel timer5_sync_mux_sel[] = { |
1322 | { .parent = &syc_clk_div_ck, .rates = div_1_0_rates }, | 1096 | { .parent = &syc_clk_div_ck, .rates = div_1_0_rates }, |
@@ -1324,61 +1098,30 @@ static const struct clksel timer5_sync_mux_sel[] = { | |||
1324 | { .parent = NULL }, | 1098 | { .parent = NULL }, |
1325 | }; | 1099 | }; |
1326 | 1100 | ||
1327 | static const char *timer5_fck_parents[] = { | 1101 | static const char *timer5_sync_mux_parents[] = { |
1328 | "syc_clk_div_ck", "sys_32k_ck", | 1102 | "syc_clk_div_ck", "sys_32k_ck", |
1329 | }; | 1103 | }; |
1330 | 1104 | ||
1331 | /* Merged timer5_sync_mux into timer5 */ | 1105 | DEFINE_CLK_OMAP_MUX(timer5_sync_mux, "abe_clkdm", timer5_sync_mux_sel, |
1332 | DEFINE_CLK_OMAP_MUX_GATE(timer5_fck, "abe_clkdm", timer5_sync_mux_sel, | 1106 | OMAP4430_CM1_ABE_TIMER5_CLKCTRL, OMAP4430_CLKSEL_MASK, |
1333 | OMAP4430_CM1_ABE_TIMER5_CLKCTRL, OMAP4430_CLKSEL_MASK, | 1107 | timer5_sync_mux_parents, func_dmic_abe_gfclk_ops); |
1334 | OMAP4430_CM1_ABE_TIMER5_CLKCTRL, | ||
1335 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | ||
1336 | timer5_fck_parents, dmic_fck_ops); | ||
1337 | |||
1338 | /* Merged timer6_sync_mux into timer6 */ | ||
1339 | DEFINE_CLK_OMAP_MUX_GATE(timer6_fck, "abe_clkdm", timer5_sync_mux_sel, | ||
1340 | OMAP4430_CM1_ABE_TIMER6_CLKCTRL, OMAP4430_CLKSEL_MASK, | ||
1341 | OMAP4430_CM1_ABE_TIMER6_CLKCTRL, | ||
1342 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | ||
1343 | timer5_fck_parents, dmic_fck_ops); | ||
1344 | |||
1345 | /* Merged timer7_sync_mux into timer7 */ | ||
1346 | DEFINE_CLK_OMAP_MUX_GATE(timer7_fck, "abe_clkdm", timer5_sync_mux_sel, | ||
1347 | OMAP4430_CM1_ABE_TIMER7_CLKCTRL, OMAP4430_CLKSEL_MASK, | ||
1348 | OMAP4430_CM1_ABE_TIMER7_CLKCTRL, | ||
1349 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | ||
1350 | timer5_fck_parents, dmic_fck_ops); | ||
1351 | |||
1352 | /* Merged timer8_sync_mux into timer8 */ | ||
1353 | DEFINE_CLK_OMAP_MUX_GATE(timer8_fck, "abe_clkdm", timer5_sync_mux_sel, | ||
1354 | OMAP4430_CM1_ABE_TIMER8_CLKCTRL, OMAP4430_CLKSEL_MASK, | ||
1355 | OMAP4430_CM1_ABE_TIMER8_CLKCTRL, | ||
1356 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | ||
1357 | timer5_fck_parents, dmic_fck_ops); | ||
1358 | |||
1359 | /* Merged cm2_dm9_mux into timer9 */ | ||
1360 | DEFINE_CLK_OMAP_MUX_GATE(timer9_fck, "l4_per_clkdm", dmt1_clk_mux_sel, | ||
1361 | OMAP4430_CM_L4PER_DMTIMER9_CLKCTRL, | ||
1362 | OMAP4430_CLKSEL_MASK, | ||
1363 | OMAP4430_CM_L4PER_DMTIMER9_CLKCTRL, | ||
1364 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, NULL, | ||
1365 | abe_dpll_bypass_clk_mux_ck_parents, dmic_fck_ops); | ||
1366 | |||
1367 | DEFINE_CLK_GATE(uart1_fck, "func_48m_fclk", &func_48m_fclk, 0x0, | ||
1368 | OMAP4430_CM_L4PER_UART1_CLKCTRL, | ||
1369 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | ||
1370 | 1108 | ||
1371 | DEFINE_CLK_GATE(uart2_fck, "func_48m_fclk", &func_48m_fclk, 0x0, | 1109 | DEFINE_CLK_OMAP_MUX(timer6_sync_mux, "abe_clkdm", timer5_sync_mux_sel, |
1372 | OMAP4430_CM_L4PER_UART2_CLKCTRL, | 1110 | OMAP4430_CM1_ABE_TIMER6_CLKCTRL, OMAP4430_CLKSEL_MASK, |
1373 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | 1111 | timer5_sync_mux_parents, func_dmic_abe_gfclk_ops); |
1374 | 1112 | ||
1375 | DEFINE_CLK_GATE(uart3_fck, "func_48m_fclk", &func_48m_fclk, 0x0, | 1113 | DEFINE_CLK_OMAP_MUX(timer7_sync_mux, "abe_clkdm", timer5_sync_mux_sel, |
1376 | OMAP4430_CM_L4PER_UART3_CLKCTRL, | 1114 | OMAP4430_CM1_ABE_TIMER7_CLKCTRL, OMAP4430_CLKSEL_MASK, |
1377 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | 1115 | timer5_sync_mux_parents, func_dmic_abe_gfclk_ops); |
1378 | 1116 | ||
1379 | DEFINE_CLK_GATE(uart4_fck, "func_48m_fclk", &func_48m_fclk, 0x0, | 1117 | DEFINE_CLK_OMAP_MUX(timer8_sync_mux, "abe_clkdm", timer5_sync_mux_sel, |
1380 | OMAP4430_CM_L4PER_UART4_CLKCTRL, | 1118 | OMAP4430_CM1_ABE_TIMER8_CLKCTRL, OMAP4430_CLKSEL_MASK, |
1381 | OMAP4430_MODULEMODE_SWCTRL_SHIFT, 0x0, NULL); | 1119 | timer5_sync_mux_parents, func_dmic_abe_gfclk_ops); |
1120 | |||
1121 | DEFINE_CLK_OMAP_MUX(cm2_dm9_mux, "l4_per_clkdm", dmt1_clk_mux_sel, | ||
1122 | OMAP4430_CM_L4PER_DMTIMER9_CLKCTRL, OMAP4430_CLKSEL_MASK, | ||
1123 | abe_dpll_bypass_clk_mux_ck_parents, | ||
1124 | func_dmic_abe_gfclk_ops); | ||
1382 | 1125 | ||
1383 | static struct clk usb_host_fs_fck; | 1126 | static struct clk usb_host_fs_fck; |
1384 | 1127 | ||
@@ -1512,18 +1255,6 @@ DEFINE_CLK_GATE(usim_fclk, "usim_ck", &usim_ck, 0x0, | |||
1512 | OMAP4430_CM_WKUP_USIM_CLKCTRL, OMAP4430_OPTFCLKEN_FCLK_SHIFT, | 1255 | OMAP4430_CM_WKUP_USIM_CLKCTRL, OMAP4430_OPTFCLKEN_FCLK_SHIFT, |
1513 | 0x0, NULL); | 1256 | 0x0, NULL); |
1514 | 1257 | ||
1515 | DEFINE_CLK_GATE(usim_fck, "sys_32k_ck", &sys_32k_ck, 0x0, | ||
1516 | OMAP4430_CM_WKUP_USIM_CLKCTRL, OMAP4430_MODULEMODE_HWCTRL_SHIFT, | ||
1517 | 0x0, NULL); | ||
1518 | |||
1519 | DEFINE_CLK_GATE(wd_timer2_fck, "sys_32k_ck", &sys_32k_ck, 0x0, | ||
1520 | OMAP4430_CM_WKUP_WDT2_CLKCTRL, OMAP4430_MODULEMODE_SWCTRL_SHIFT, | ||
1521 | 0x0, NULL); | ||
1522 | |||
1523 | DEFINE_CLK_GATE(wd_timer3_fck, "sys_32k_ck", &sys_32k_ck, 0x0, | ||
1524 | OMAP4430_CM1_ABE_WDT3_CLKCTRL, OMAP4430_MODULEMODE_SWCTRL_SHIFT, | ||
1525 | 0x0, NULL); | ||
1526 | |||
1527 | /* Remaining optional clocks */ | 1258 | /* Remaining optional clocks */ |
1528 | static const char *pmd_stm_clock_mux_ck_parents[] = { | 1259 | static const char *pmd_stm_clock_mux_ck_parents[] = { |
1529 | "sys_clkin_ck", "dpll_core_m6x2_ck", "tie_low_clock_ck", | 1260 | "sys_clkin_ck", "dpll_core_m6x2_ck", "tie_low_clock_ck", |
@@ -1774,106 +1505,61 @@ static struct omap_clk omap44xx_clks[] = { | |||
1774 | CLK(NULL, "syc_clk_div_ck", &syc_clk_div_ck, CK_443X), | 1505 | CLK(NULL, "syc_clk_div_ck", &syc_clk_div_ck, CK_443X), |
1775 | CLK(NULL, "aes1_fck", &aes1_fck, CK_443X), | 1506 | CLK(NULL, "aes1_fck", &aes1_fck, CK_443X), |
1776 | CLK(NULL, "aes2_fck", &aes2_fck, CK_443X), | 1507 | CLK(NULL, "aes2_fck", &aes2_fck, CK_443X), |
1777 | CLK(NULL, "aess_fck", &aess_fck, CK_443X), | ||
1778 | CLK(NULL, "bandgap_fclk", &bandgap_fclk, CK_443X), | 1508 | CLK(NULL, "bandgap_fclk", &bandgap_fclk, CK_443X), |
1779 | CLK(NULL, "div_ts_ck", &div_ts_ck, CK_446X), | 1509 | CLK(NULL, "div_ts_ck", &div_ts_ck, CK_446X), |
1780 | CLK(NULL, "bandgap_ts_fclk", &bandgap_ts_fclk, CK_446X), | 1510 | CLK(NULL, "bandgap_ts_fclk", &bandgap_ts_fclk, CK_446X), |
1781 | CLK(NULL, "des3des_fck", &des3des_fck, CK_443X), | ||
1782 | CLK(NULL, "dmic_sync_mux_ck", &dmic_sync_mux_ck, CK_443X), | 1511 | CLK(NULL, "dmic_sync_mux_ck", &dmic_sync_mux_ck, CK_443X), |
1783 | CLK(NULL, "dmic_fck", &dmic_fck, CK_443X), | 1512 | CLK(NULL, "func_dmic_abe_gfclk", &func_dmic_abe_gfclk, CK_443X), |
1784 | CLK(NULL, "dsp_fck", &dsp_fck, CK_443X), | ||
1785 | CLK(NULL, "dss_sys_clk", &dss_sys_clk, CK_443X), | 1513 | CLK(NULL, "dss_sys_clk", &dss_sys_clk, CK_443X), |
1786 | CLK(NULL, "dss_tv_clk", &dss_tv_clk, CK_443X), | 1514 | CLK(NULL, "dss_tv_clk", &dss_tv_clk, CK_443X), |
1787 | CLK(NULL, "dss_dss_clk", &dss_dss_clk, CK_443X), | 1515 | CLK(NULL, "dss_dss_clk", &dss_dss_clk, CK_443X), |
1788 | CLK(NULL, "dss_48mhz_clk", &dss_48mhz_clk, CK_443X), | 1516 | CLK(NULL, "dss_48mhz_clk", &dss_48mhz_clk, CK_443X), |
1789 | CLK(NULL, "dss_fck", &dss_fck, CK_443X), | 1517 | CLK(NULL, "dss_fck", &dss_fck, CK_443X), |
1790 | CLK("omapdss_dss", "ick", &dss_fck, CK_443X), | 1518 | CLK("omapdss_dss", "ick", &dss_fck, CK_443X), |
1791 | CLK(NULL, "efuse_ctrl_cust_fck", &efuse_ctrl_cust_fck, CK_443X), | ||
1792 | CLK(NULL, "emif1_fck", &emif1_fck, CK_443X), | ||
1793 | CLK(NULL, "emif2_fck", &emif2_fck, CK_443X), | ||
1794 | CLK(NULL, "fdif_fck", &fdif_fck, CK_443X), | 1519 | CLK(NULL, "fdif_fck", &fdif_fck, CK_443X), |
1795 | CLK(NULL, "fpka_fck", &fpka_fck, CK_443X), | ||
1796 | CLK(NULL, "gpio1_dbclk", &gpio1_dbclk, CK_443X), | 1520 | CLK(NULL, "gpio1_dbclk", &gpio1_dbclk, CK_443X), |
1797 | CLK(NULL, "gpio1_ick", &gpio1_ick, CK_443X), | ||
1798 | CLK(NULL, "gpio2_dbclk", &gpio2_dbclk, CK_443X), | 1521 | CLK(NULL, "gpio2_dbclk", &gpio2_dbclk, CK_443X), |
1799 | CLK(NULL, "gpio2_ick", &gpio2_ick, CK_443X), | ||
1800 | CLK(NULL, "gpio3_dbclk", &gpio3_dbclk, CK_443X), | 1522 | CLK(NULL, "gpio3_dbclk", &gpio3_dbclk, CK_443X), |
1801 | CLK(NULL, "gpio3_ick", &gpio3_ick, CK_443X), | ||
1802 | CLK(NULL, "gpio4_dbclk", &gpio4_dbclk, CK_443X), | 1523 | CLK(NULL, "gpio4_dbclk", &gpio4_dbclk, CK_443X), |
1803 | CLK(NULL, "gpio4_ick", &gpio4_ick, CK_443X), | ||
1804 | CLK(NULL, "gpio5_dbclk", &gpio5_dbclk, CK_443X), | 1524 | CLK(NULL, "gpio5_dbclk", &gpio5_dbclk, CK_443X), |
1805 | CLK(NULL, "gpio5_ick", &gpio5_ick, CK_443X), | ||
1806 | CLK(NULL, "gpio6_dbclk", &gpio6_dbclk, CK_443X), | 1525 | CLK(NULL, "gpio6_dbclk", &gpio6_dbclk, CK_443X), |
1807 | CLK(NULL, "gpio6_ick", &gpio6_ick, CK_443X), | 1526 | CLK(NULL, "sgx_clk_mux", &sgx_clk_mux, CK_443X), |
1808 | CLK(NULL, "gpmc_ick", &gpmc_ick, CK_443X), | ||
1809 | CLK(NULL, "gpu_fck", &gpu_fck, CK_443X), | ||
1810 | CLK(NULL, "hdq1w_fck", &hdq1w_fck, CK_443X), | ||
1811 | CLK(NULL, "hsi_fck", &hsi_fck, CK_443X), | 1527 | CLK(NULL, "hsi_fck", &hsi_fck, CK_443X), |
1812 | CLK(NULL, "i2c1_fck", &i2c1_fck, CK_443X), | ||
1813 | CLK(NULL, "i2c2_fck", &i2c2_fck, CK_443X), | ||
1814 | CLK(NULL, "i2c3_fck", &i2c3_fck, CK_443X), | ||
1815 | CLK(NULL, "i2c4_fck", &i2c4_fck, CK_443X), | ||
1816 | CLK(NULL, "ipu_fck", &ipu_fck, CK_443X), | ||
1817 | CLK(NULL, "iss_ctrlclk", &iss_ctrlclk, CK_443X), | 1528 | CLK(NULL, "iss_ctrlclk", &iss_ctrlclk, CK_443X), |
1818 | CLK(NULL, "iss_fck", &iss_fck, CK_443X), | ||
1819 | CLK(NULL, "iva_fck", &iva_fck, CK_443X), | ||
1820 | CLK(NULL, "kbd_fck", &kbd_fck, CK_443X), | ||
1821 | CLK(NULL, "l3_instr_ick", &l3_instr_ick, CK_443X), | ||
1822 | CLK(NULL, "l3_main_3_ick", &l3_main_3_ick, CK_443X), | ||
1823 | CLK(NULL, "mcasp_sync_mux_ck", &mcasp_sync_mux_ck, CK_443X), | 1529 | CLK(NULL, "mcasp_sync_mux_ck", &mcasp_sync_mux_ck, CK_443X), |
1824 | CLK(NULL, "mcasp_fck", &mcasp_fck, CK_443X), | 1530 | CLK(NULL, "func_mcasp_abe_gfclk", &func_mcasp_abe_gfclk, CK_443X), |
1825 | CLK(NULL, "mcbsp1_sync_mux_ck", &mcbsp1_sync_mux_ck, CK_443X), | 1531 | CLK(NULL, "mcbsp1_sync_mux_ck", &mcbsp1_sync_mux_ck, CK_443X), |
1826 | CLK(NULL, "mcbsp1_fck", &mcbsp1_fck, CK_443X), | 1532 | CLK(NULL, "func_mcbsp1_gfclk", &func_mcbsp1_gfclk, CK_443X), |
1827 | CLK(NULL, "mcbsp2_sync_mux_ck", &mcbsp2_sync_mux_ck, CK_443X), | 1533 | CLK(NULL, "mcbsp2_sync_mux_ck", &mcbsp2_sync_mux_ck, CK_443X), |
1828 | CLK(NULL, "mcbsp2_fck", &mcbsp2_fck, CK_443X), | 1534 | CLK(NULL, "func_mcbsp2_gfclk", &func_mcbsp2_gfclk, CK_443X), |
1829 | CLK(NULL, "mcbsp3_sync_mux_ck", &mcbsp3_sync_mux_ck, CK_443X), | 1535 | CLK(NULL, "mcbsp3_sync_mux_ck", &mcbsp3_sync_mux_ck, CK_443X), |
1830 | CLK(NULL, "mcbsp3_fck", &mcbsp3_fck, CK_443X), | 1536 | CLK(NULL, "func_mcbsp3_gfclk", &func_mcbsp3_gfclk, CK_443X), |
1831 | CLK(NULL, "mcbsp4_sync_mux_ck", &mcbsp4_sync_mux_ck, CK_443X), | 1537 | CLK(NULL, "mcbsp4_sync_mux_ck", &mcbsp4_sync_mux_ck, CK_443X), |
1832 | CLK(NULL, "mcbsp4_fck", &mcbsp4_fck, CK_443X), | 1538 | CLK(NULL, "per_mcbsp4_gfclk", &per_mcbsp4_gfclk, CK_443X), |
1833 | CLK(NULL, "mcpdm_fck", &mcpdm_fck, CK_443X), | 1539 | CLK(NULL, "hsmmc1_fclk", &hsmmc1_fclk, CK_443X), |
1834 | CLK(NULL, "mcspi1_fck", &mcspi1_fck, CK_443X), | 1540 | CLK(NULL, "hsmmc2_fclk", &hsmmc2_fclk, CK_443X), |
1835 | CLK(NULL, "mcspi2_fck", &mcspi2_fck, CK_443X), | ||
1836 | CLK(NULL, "mcspi3_fck", &mcspi3_fck, CK_443X), | ||
1837 | CLK(NULL, "mcspi4_fck", &mcspi4_fck, CK_443X), | ||
1838 | CLK(NULL, "mmc1_fck", &mmc1_fck, CK_443X), | ||
1839 | CLK(NULL, "mmc2_fck", &mmc2_fck, CK_443X), | ||
1840 | CLK(NULL, "mmc3_fck", &mmc3_fck, CK_443X), | ||
1841 | CLK(NULL, "mmc4_fck", &mmc4_fck, CK_443X), | ||
1842 | CLK(NULL, "mmc5_fck", &mmc5_fck, CK_443X), | ||
1843 | CLK(NULL, "ocp2scp_usb_phy_phy_48m", &ocp2scp_usb_phy_phy_48m, CK_443X), | ||
1844 | CLK(NULL, "ocp2scp_usb_phy_ick", &ocp2scp_usb_phy_ick, CK_443X), | ||
1845 | CLK(NULL, "ocp_wp_noc_ick", &ocp_wp_noc_ick, CK_443X), | ||
1846 | CLK(NULL, "rng_ick", &rng_ick, CK_443X), | ||
1847 | CLK("omap_rng", "ick", &rng_ick, CK_443X), | ||
1848 | CLK(NULL, "sha2md5_fck", &sha2md5_fck, CK_443X), | 1541 | CLK(NULL, "sha2md5_fck", &sha2md5_fck, CK_443X), |
1849 | CLK(NULL, "sl2if_ick", &sl2if_ick, CK_443X), | ||
1850 | CLK(NULL, "slimbus1_fclk_1", &slimbus1_fclk_1, CK_443X), | 1542 | CLK(NULL, "slimbus1_fclk_1", &slimbus1_fclk_1, CK_443X), |
1851 | CLK(NULL, "slimbus1_fclk_0", &slimbus1_fclk_0, CK_443X), | 1543 | CLK(NULL, "slimbus1_fclk_0", &slimbus1_fclk_0, CK_443X), |
1852 | CLK(NULL, "slimbus1_fclk_2", &slimbus1_fclk_2, CK_443X), | 1544 | CLK(NULL, "slimbus1_fclk_2", &slimbus1_fclk_2, CK_443X), |
1853 | CLK(NULL, "slimbus1_slimbus_clk", &slimbus1_slimbus_clk, CK_443X), | 1545 | CLK(NULL, "slimbus1_slimbus_clk", &slimbus1_slimbus_clk, CK_443X), |
1854 | CLK(NULL, "slimbus1_fck", &slimbus1_fck, CK_443X), | ||
1855 | CLK(NULL, "slimbus2_fclk_1", &slimbus2_fclk_1, CK_443X), | 1546 | CLK(NULL, "slimbus2_fclk_1", &slimbus2_fclk_1, CK_443X), |
1856 | CLK(NULL, "slimbus2_fclk_0", &slimbus2_fclk_0, CK_443X), | 1547 | CLK(NULL, "slimbus2_fclk_0", &slimbus2_fclk_0, CK_443X), |
1857 | CLK(NULL, "slimbus2_slimbus_clk", &slimbus2_slimbus_clk, CK_443X), | 1548 | CLK(NULL, "slimbus2_slimbus_clk", &slimbus2_slimbus_clk, CK_443X), |
1858 | CLK(NULL, "slimbus2_fck", &slimbus2_fck, CK_443X), | ||
1859 | CLK(NULL, "smartreflex_core_fck", &smartreflex_core_fck, CK_443X), | 1549 | CLK(NULL, "smartreflex_core_fck", &smartreflex_core_fck, CK_443X), |
1860 | CLK(NULL, "smartreflex_iva_fck", &smartreflex_iva_fck, CK_443X), | 1550 | CLK(NULL, "smartreflex_iva_fck", &smartreflex_iva_fck, CK_443X), |
1861 | CLK(NULL, "smartreflex_mpu_fck", &smartreflex_mpu_fck, CK_443X), | 1551 | CLK(NULL, "smartreflex_mpu_fck", &smartreflex_mpu_fck, CK_443X), |
1862 | CLK(NULL, "timer1_fck", &timer1_fck, CK_443X), | 1552 | CLK(NULL, "dmt1_clk_mux", &dmt1_clk_mux, CK_443X), |
1863 | CLK(NULL, "timer10_fck", &timer10_fck, CK_443X), | 1553 | CLK(NULL, "cm2_dm10_mux", &cm2_dm10_mux, CK_443X), |
1864 | CLK(NULL, "timer11_fck", &timer11_fck, CK_443X), | 1554 | CLK(NULL, "cm2_dm11_mux", &cm2_dm11_mux, CK_443X), |
1865 | CLK(NULL, "timer2_fck", &timer2_fck, CK_443X), | 1555 | CLK(NULL, "cm2_dm2_mux", &cm2_dm2_mux, CK_443X), |
1866 | CLK(NULL, "timer3_fck", &timer3_fck, CK_443X), | 1556 | CLK(NULL, "cm2_dm3_mux", &cm2_dm3_mux, CK_443X), |
1867 | CLK(NULL, "timer4_fck", &timer4_fck, CK_443X), | 1557 | CLK(NULL, "cm2_dm4_mux", &cm2_dm4_mux, CK_443X), |
1868 | CLK(NULL, "timer5_fck", &timer5_fck, CK_443X), | 1558 | CLK(NULL, "timer5_sync_mux", &timer5_sync_mux, CK_443X), |
1869 | CLK(NULL, "timer6_fck", &timer6_fck, CK_443X), | 1559 | CLK(NULL, "timer6_sync_mux", &timer6_sync_mux, CK_443X), |
1870 | CLK(NULL, "timer7_fck", &timer7_fck, CK_443X), | 1560 | CLK(NULL, "timer7_sync_mux", &timer7_sync_mux, CK_443X), |
1871 | CLK(NULL, "timer8_fck", &timer8_fck, CK_443X), | 1561 | CLK(NULL, "timer8_sync_mux", &timer8_sync_mux, CK_443X), |
1872 | CLK(NULL, "timer9_fck", &timer9_fck, CK_443X), | 1562 | CLK(NULL, "cm2_dm9_mux", &cm2_dm9_mux, CK_443X), |
1873 | CLK(NULL, "uart1_fck", &uart1_fck, CK_443X), | ||
1874 | CLK(NULL, "uart2_fck", &uart2_fck, CK_443X), | ||
1875 | CLK(NULL, "uart3_fck", &uart3_fck, CK_443X), | ||
1876 | CLK(NULL, "uart4_fck", &uart4_fck, CK_443X), | ||
1877 | CLK(NULL, "usb_host_fs_fck", &usb_host_fs_fck, CK_443X), | 1563 | CLK(NULL, "usb_host_fs_fck", &usb_host_fs_fck, CK_443X), |
1878 | CLK("usbhs_omap", "fs_fck", &usb_host_fs_fck, CK_443X), | 1564 | CLK("usbhs_omap", "fs_fck", &usb_host_fs_fck, CK_443X), |
1879 | CLK(NULL, "utmi_p1_gfclk", &utmi_p1_gfclk, CK_443X), | 1565 | CLK(NULL, "utmi_p1_gfclk", &utmi_p1_gfclk, CK_443X), |
@@ -1901,9 +1587,6 @@ static struct omap_clk omap44xx_clks[] = { | |||
1901 | CLK("usbhs_tll", "usbtll_ick", &usb_tll_hs_ick, CK_443X), | 1587 | CLK("usbhs_tll", "usbtll_ick", &usb_tll_hs_ick, CK_443X), |
1902 | CLK(NULL, "usim_ck", &usim_ck, CK_443X), | 1588 | CLK(NULL, "usim_ck", &usim_ck, CK_443X), |
1903 | CLK(NULL, "usim_fclk", &usim_fclk, CK_443X), | 1589 | CLK(NULL, "usim_fclk", &usim_fclk, CK_443X), |
1904 | CLK(NULL, "usim_fck", &usim_fck, CK_443X), | ||
1905 | CLK(NULL, "wd_timer2_fck", &wd_timer2_fck, CK_443X), | ||
1906 | CLK(NULL, "wd_timer3_fck", &wd_timer3_fck, CK_443X), | ||
1907 | CLK(NULL, "pmd_stm_clock_mux_ck", &pmd_stm_clock_mux_ck, CK_443X), | 1590 | CLK(NULL, "pmd_stm_clock_mux_ck", &pmd_stm_clock_mux_ck, CK_443X), |
1908 | CLK(NULL, "pmd_trace_clk_mux_ck", &pmd_trace_clk_mux_ck, CK_443X), | 1591 | CLK(NULL, "pmd_trace_clk_mux_ck", &pmd_trace_clk_mux_ck, CK_443X), |
1909 | CLK(NULL, "stm_clk_div_ck", &stm_clk_div_ck, CK_443X), | 1592 | CLK(NULL, "stm_clk_div_ck", &stm_clk_div_ck, CK_443X), |
@@ -1980,15 +1663,6 @@ static struct omap_clk omap44xx_clks[] = { | |||
1980 | CLK(NULL, "cpufreq_ck", &dpll_mpu_ck, CK_443X), | 1663 | CLK(NULL, "cpufreq_ck", &dpll_mpu_ck, CK_443X), |
1981 | }; | 1664 | }; |
1982 | 1665 | ||
1983 | static const char *enable_init_clks[] = { | ||
1984 | "emif1_fck", | ||
1985 | "emif2_fck", | ||
1986 | "gpmc_ick", | ||
1987 | "l3_instr_ick", | ||
1988 | "l3_main_3_ick", | ||
1989 | "ocp_wp_noc_ick", | ||
1990 | }; | ||
1991 | |||
1992 | int __init omap4xxx_clk_init(void) | 1666 | int __init omap4xxx_clk_init(void) |
1993 | { | 1667 | { |
1994 | u32 cpu_clkflg; | 1668 | u32 cpu_clkflg; |
@@ -2019,9 +1693,6 @@ int __init omap4xxx_clk_init(void) | |||
2019 | 1693 | ||
2020 | omap2_clk_disable_autoidle_all(); | 1694 | omap2_clk_disable_autoidle_all(); |
2021 | 1695 | ||
2022 | omap2_clk_enable_init_clocks(enable_init_clks, | ||
2023 | ARRAY_SIZE(enable_init_clks)); | ||
2024 | |||
2025 | /* | 1696 | /* |
2026 | * On OMAP4460 the ABE DPLL fails to turn on if in idle low-power | 1697 | * On OMAP4460 the ABE DPLL fails to turn on if in idle low-power |
2027 | * state when turning the ABE clock domain. Workaround this by | 1698 | * state when turning the ABE clock domain. Workaround this by |
diff --git a/arch/arm/mach-omap2/clock.h b/arch/arm/mach-omap2/clock.h index b40204837bd7..60ddd8612b4d 100644 --- a/arch/arm/mach-omap2/clock.h +++ b/arch/arm/mach-omap2/clock.h | |||
@@ -65,6 +65,17 @@ struct clockdomain; | |||
65 | .ops = &_clkops_name, \ | 65 | .ops = &_clkops_name, \ |
66 | }; | 66 | }; |
67 | 67 | ||
68 | #define DEFINE_STRUCT_CLK_FLAGS(_name, _parent_array_name, \ | ||
69 | _clkops_name, _flags) \ | ||
70 | static struct clk _name = { \ | ||
71 | .name = #_name, \ | ||
72 | .hw = &_name##_hw.hw, \ | ||
73 | .parent_names = _parent_array_name, \ | ||
74 | .num_parents = ARRAY_SIZE(_parent_array_name), \ | ||
75 | .ops = &_clkops_name, \ | ||
76 | .flags = _flags, \ | ||
77 | }; | ||
78 | |||
68 | #define DEFINE_STRUCT_CLK_HW_OMAP(_name, _clkdm_name) \ | 79 | #define DEFINE_STRUCT_CLK_HW_OMAP(_name, _clkdm_name) \ |
69 | static struct clk_hw_omap _name##_hw = { \ | 80 | static struct clk_hw_omap _name##_hw = { \ |
70 | .hw = { \ | 81 | .hw = { \ |
diff --git a/arch/arm/mach-omap2/clock2xxx.c b/arch/arm/mach-omap2/clock2xxx.c index 1ff646908627..b870f6a9e283 100644 --- a/arch/arm/mach-omap2/clock2xxx.c +++ b/arch/arm/mach-omap2/clock2xxx.c | |||
@@ -52,6 +52,6 @@ static int __init omap2xxx_clk_arch_init(void) | |||
52 | return ret; | 52 | return ret; |
53 | } | 53 | } |
54 | 54 | ||
55 | arch_initcall(omap2xxx_clk_arch_init); | 55 | omap_arch_initcall(omap2xxx_clk_arch_init); |
56 | 56 | ||
57 | 57 | ||
diff --git a/arch/arm/mach-omap2/clock3xxx.c b/arch/arm/mach-omap2/clock3xxx.c index 4eacab8f1176..0b02b4161d71 100644 --- a/arch/arm/mach-omap2/clock3xxx.c +++ b/arch/arm/mach-omap2/clock3xxx.c | |||
@@ -94,6 +94,6 @@ static int __init omap3xxx_clk_arch_init(void) | |||
94 | return ret; | 94 | return ret; |
95 | } | 95 | } |
96 | 96 | ||
97 | arch_initcall(omap3xxx_clk_arch_init); | 97 | omap_arch_initcall(omap3xxx_clk_arch_init); |
98 | 98 | ||
99 | 99 | ||
diff --git a/arch/arm/mach-omap2/clockdomain.c b/arch/arm/mach-omap2/clockdomain.c index 7faf82d4e85c..2da3b5ec010c 100644 --- a/arch/arm/mach-omap2/clockdomain.c +++ b/arch/arm/mach-omap2/clockdomain.c | |||
@@ -92,8 +92,6 @@ static int _clkdm_register(struct clockdomain *clkdm) | |||
92 | 92 | ||
93 | pwrdm_add_clkdm(pwrdm, clkdm); | 93 | pwrdm_add_clkdm(pwrdm, clkdm); |
94 | 94 | ||
95 | spin_lock_init(&clkdm->lock); | ||
96 | |||
97 | pr_debug("clockdomain: registered %s\n", clkdm->name); | 95 | pr_debug("clockdomain: registered %s\n", clkdm->name); |
98 | 96 | ||
99 | return 0; | 97 | return 0; |
@@ -122,7 +120,7 @@ static struct clkdm_dep *_clkdm_deps_lookup(struct clockdomain *clkdm, | |||
122 | return cd; | 120 | return cd; |
123 | } | 121 | } |
124 | 122 | ||
125 | /* | 123 | /** |
126 | * _autodep_lookup - resolve autodep clkdm names to clkdm pointers; store | 124 | * _autodep_lookup - resolve autodep clkdm names to clkdm pointers; store |
127 | * @autodep: struct clkdm_autodep * to resolve | 125 | * @autodep: struct clkdm_autodep * to resolve |
128 | * | 126 | * |
@@ -154,88 +152,206 @@ static void _autodep_lookup(struct clkdm_autodep *autodep) | |||
154 | autodep->clkdm.ptr = clkdm; | 152 | autodep->clkdm.ptr = clkdm; |
155 | } | 153 | } |
156 | 154 | ||
157 | /* | 155 | /** |
158 | * _clkdm_add_autodeps - add auto sleepdeps/wkdeps to clkdm upon clock enable | 156 | * _resolve_clkdm_deps() - resolve clkdm_names in @clkdm_deps to clkdms |
159 | * @clkdm: struct clockdomain * | 157 | * @clkdm: clockdomain that we are resolving dependencies for |
158 | * @clkdm_deps: ptr to array of struct clkdm_deps to resolve | ||
160 | * | 159 | * |
161 | * Add the "autodep" sleep & wakeup dependencies to clockdomain 'clkdm' | 160 | * Iterates through @clkdm_deps, looking up the struct clockdomain named by |
162 | * in hardware-supervised mode. Meant to be called from clock framework | 161 | * clkdm_name and storing the clockdomain pointer in the struct clkdm_dep. |
163 | * when a clock inside clockdomain 'clkdm' is enabled. No return value. | 162 | * No return value. |
163 | */ | ||
164 | static void _resolve_clkdm_deps(struct clockdomain *clkdm, | ||
165 | struct clkdm_dep *clkdm_deps) | ||
166 | { | ||
167 | struct clkdm_dep *cd; | ||
168 | |||
169 | for (cd = clkdm_deps; cd && cd->clkdm_name; cd++) { | ||
170 | if (cd->clkdm) | ||
171 | continue; | ||
172 | cd->clkdm = _clkdm_lookup(cd->clkdm_name); | ||
173 | |||
174 | WARN(!cd->clkdm, "clockdomain: %s: could not find clkdm %s while resolving dependencies - should never happen", | ||
175 | clkdm->name, cd->clkdm_name); | ||
176 | } | ||
177 | } | ||
178 | |||
179 | /** | ||
180 | * _clkdm_add_wkdep - add a wakeup dependency from clkdm2 to clkdm1 (lockless) | ||
181 | * @clkdm1: wake this struct clockdomain * up (dependent) | ||
182 | * @clkdm2: when this struct clockdomain * wakes up (source) | ||
164 | * | 183 | * |
165 | * XXX autodeps are deprecated and should be removed at the earliest | 184 | * When the clockdomain represented by @clkdm2 wakes up, wake up |
166 | * opportunity | 185 | * @clkdm1. Implemented in hardware on the OMAP, this feature is |
186 | * designed to reduce wakeup latency of the dependent clockdomain @clkdm1. | ||
187 | * Returns -EINVAL if presented with invalid clockdomain pointers, | ||
188 | * -ENOENT if @clkdm2 cannot wake up clkdm1 in hardware, or 0 upon | ||
189 | * success. | ||
167 | */ | 190 | */ |
168 | void _clkdm_add_autodeps(struct clockdomain *clkdm) | 191 | static int _clkdm_add_wkdep(struct clockdomain *clkdm1, |
192 | struct clockdomain *clkdm2) | ||
169 | { | 193 | { |
170 | struct clkdm_autodep *autodep; | 194 | struct clkdm_dep *cd; |
195 | int ret = 0; | ||
171 | 196 | ||
172 | if (!autodeps || clkdm->flags & CLKDM_NO_AUTODEPS) | 197 | if (!clkdm1 || !clkdm2) |
173 | return; | 198 | return -EINVAL; |
174 | 199 | ||
175 | for (autodep = autodeps; autodep->clkdm.ptr; autodep++) { | 200 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); |
176 | if (IS_ERR(autodep->clkdm.ptr)) | 201 | if (IS_ERR(cd)) |
177 | continue; | 202 | ret = PTR_ERR(cd); |
178 | 203 | ||
179 | pr_debug("clockdomain: %s: adding %s sleepdep/wkdep\n", | 204 | if (!arch_clkdm || !arch_clkdm->clkdm_add_wkdep) |
180 | clkdm->name, autodep->clkdm.ptr->name); | 205 | ret = -EINVAL; |
206 | |||
207 | if (ret) { | ||
208 | pr_debug("clockdomain: hardware cannot set/clear wake up of %s when %s wakes up\n", | ||
209 | clkdm1->name, clkdm2->name); | ||
210 | return ret; | ||
211 | } | ||
212 | |||
213 | cd->wkdep_usecount++; | ||
214 | if (cd->wkdep_usecount == 1) { | ||
215 | pr_debug("clockdomain: hardware will wake up %s when %s wakes up\n", | ||
216 | clkdm1->name, clkdm2->name); | ||
181 | 217 | ||
182 | clkdm_add_sleepdep(clkdm, autodep->clkdm.ptr); | 218 | ret = arch_clkdm->clkdm_add_wkdep(clkdm1, clkdm2); |
183 | clkdm_add_wkdep(clkdm, autodep->clkdm.ptr); | ||
184 | } | 219 | } |
220 | |||
221 | return ret; | ||
185 | } | 222 | } |
186 | 223 | ||
187 | /* | 224 | /** |
188 | * _clkdm_add_autodeps - remove auto sleepdeps/wkdeps from clkdm | 225 | * _clkdm_del_wkdep - remove a wakeup dep from clkdm2 to clkdm1 (lockless) |
189 | * @clkdm: struct clockdomain * | 226 | * @clkdm1: wake this struct clockdomain * up (dependent) |
227 | * @clkdm2: when this struct clockdomain * wakes up (source) | ||
190 | * | 228 | * |
191 | * Remove the "autodep" sleep & wakeup dependencies from clockdomain 'clkdm' | 229 | * Remove a wakeup dependency causing @clkdm1 to wake up when @clkdm2 |
192 | * in hardware-supervised mode. Meant to be called from clock framework | 230 | * wakes up. Returns -EINVAL if presented with invalid clockdomain |
193 | * when a clock inside clockdomain 'clkdm' is disabled. No return value. | 231 | * pointers, -ENOENT if @clkdm2 cannot wake up clkdm1 in hardware, or |
232 | * 0 upon success. | ||
233 | */ | ||
234 | static int _clkdm_del_wkdep(struct clockdomain *clkdm1, | ||
235 | struct clockdomain *clkdm2) | ||
236 | { | ||
237 | struct clkdm_dep *cd; | ||
238 | int ret = 0; | ||
239 | |||
240 | if (!clkdm1 || !clkdm2) | ||
241 | return -EINVAL; | ||
242 | |||
243 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); | ||
244 | if (IS_ERR(cd)) | ||
245 | ret = PTR_ERR(cd); | ||
246 | |||
247 | if (!arch_clkdm || !arch_clkdm->clkdm_del_wkdep) | ||
248 | ret = -EINVAL; | ||
249 | |||
250 | if (ret) { | ||
251 | pr_debug("clockdomain: hardware cannot set/clear wake up of %s when %s wakes up\n", | ||
252 | clkdm1->name, clkdm2->name); | ||
253 | return ret; | ||
254 | } | ||
255 | |||
256 | cd->wkdep_usecount--; | ||
257 | if (cd->wkdep_usecount == 0) { | ||
258 | pr_debug("clockdomain: hardware will no longer wake up %s after %s wakes up\n", | ||
259 | clkdm1->name, clkdm2->name); | ||
260 | |||
261 | ret = arch_clkdm->clkdm_del_wkdep(clkdm1, clkdm2); | ||
262 | } | ||
263 | |||
264 | return ret; | ||
265 | } | ||
266 | |||
267 | /** | ||
268 | * _clkdm_add_sleepdep - add a sleep dependency from clkdm2 to clkdm1 (lockless) | ||
269 | * @clkdm1: prevent this struct clockdomain * from sleeping (dependent) | ||
270 | * @clkdm2: when this struct clockdomain * is active (source) | ||
194 | * | 271 | * |
195 | * XXX autodeps are deprecated and should be removed at the earliest | 272 | * Prevent @clkdm1 from automatically going inactive (and then to |
196 | * opportunity | 273 | * retention or off) if @clkdm2 is active. Returns -EINVAL if |
274 | * presented with invalid clockdomain pointers or called on a machine | ||
275 | * that does not support software-configurable hardware sleep | ||
276 | * dependencies, -ENOENT if the specified dependency cannot be set in | ||
277 | * hardware, or 0 upon success. | ||
197 | */ | 278 | */ |
198 | void _clkdm_del_autodeps(struct clockdomain *clkdm) | 279 | static int _clkdm_add_sleepdep(struct clockdomain *clkdm1, |
280 | struct clockdomain *clkdm2) | ||
199 | { | 281 | { |
200 | struct clkdm_autodep *autodep; | 282 | struct clkdm_dep *cd; |
283 | int ret = 0; | ||
201 | 284 | ||
202 | if (!autodeps || clkdm->flags & CLKDM_NO_AUTODEPS) | 285 | if (!clkdm1 || !clkdm2) |
203 | return; | 286 | return -EINVAL; |
204 | 287 | ||
205 | for (autodep = autodeps; autodep->clkdm.ptr; autodep++) { | 288 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs); |
206 | if (IS_ERR(autodep->clkdm.ptr)) | 289 | if (IS_ERR(cd)) |
207 | continue; | 290 | ret = PTR_ERR(cd); |
208 | 291 | ||
209 | pr_debug("clockdomain: %s: removing %s sleepdep/wkdep\n", | 292 | if (!arch_clkdm || !arch_clkdm->clkdm_add_sleepdep) |
210 | clkdm->name, autodep->clkdm.ptr->name); | 293 | ret = -EINVAL; |
211 | 294 | ||
212 | clkdm_del_sleepdep(clkdm, autodep->clkdm.ptr); | 295 | if (ret) { |
213 | clkdm_del_wkdep(clkdm, autodep->clkdm.ptr); | 296 | pr_debug("clockdomain: hardware cannot set/clear sleep dependency affecting %s from %s\n", |
297 | clkdm1->name, clkdm2->name); | ||
298 | return ret; | ||
299 | } | ||
300 | |||
301 | cd->sleepdep_usecount++; | ||
302 | if (cd->sleepdep_usecount == 1) { | ||
303 | pr_debug("clockdomain: will prevent %s from sleeping if %s is active\n", | ||
304 | clkdm1->name, clkdm2->name); | ||
305 | |||
306 | ret = arch_clkdm->clkdm_add_sleepdep(clkdm1, clkdm2); | ||
214 | } | 307 | } |
308 | |||
309 | return ret; | ||
215 | } | 310 | } |
216 | 311 | ||
217 | /** | 312 | /** |
218 | * _resolve_clkdm_deps() - resolve clkdm_names in @clkdm_deps to clkdms | 313 | * _clkdm_del_sleepdep - remove a sleep dep from clkdm2 to clkdm1 (lockless) |
219 | * @clkdm: clockdomain that we are resolving dependencies for | 314 | * @clkdm1: prevent this struct clockdomain * from sleeping (dependent) |
220 | * @clkdm_deps: ptr to array of struct clkdm_deps to resolve | 315 | * @clkdm2: when this struct clockdomain * is active (source) |
221 | * | 316 | * |
222 | * Iterates through @clkdm_deps, looking up the struct clockdomain named by | 317 | * Allow @clkdm1 to automatically go inactive (and then to retention or |
223 | * clkdm_name and storing the clockdomain pointer in the struct clkdm_dep. | 318 | * off), independent of the activity state of @clkdm2. Returns -EINVAL |
224 | * No return value. | 319 | * if presented with invalid clockdomain pointers or called on a machine |
320 | * that does not support software-configurable hardware sleep dependencies, | ||
321 | * -ENOENT if the specified dependency cannot be cleared in hardware, or | ||
322 | * 0 upon success. | ||
225 | */ | 323 | */ |
226 | static void _resolve_clkdm_deps(struct clockdomain *clkdm, | 324 | static int _clkdm_del_sleepdep(struct clockdomain *clkdm1, |
227 | struct clkdm_dep *clkdm_deps) | 325 | struct clockdomain *clkdm2) |
228 | { | 326 | { |
229 | struct clkdm_dep *cd; | 327 | struct clkdm_dep *cd; |
328 | int ret = 0; | ||
230 | 329 | ||
231 | for (cd = clkdm_deps; cd && cd->clkdm_name; cd++) { | 330 | if (!clkdm1 || !clkdm2) |
232 | if (cd->clkdm) | 331 | return -EINVAL; |
233 | continue; | ||
234 | cd->clkdm = _clkdm_lookup(cd->clkdm_name); | ||
235 | 332 | ||
236 | WARN(!cd->clkdm, "clockdomain: %s: could not find clkdm %s while resolving dependencies - should never happen", | 333 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs); |
237 | clkdm->name, cd->clkdm_name); | 334 | if (IS_ERR(cd)) |
335 | ret = PTR_ERR(cd); | ||
336 | |||
337 | if (!arch_clkdm || !arch_clkdm->clkdm_del_sleepdep) | ||
338 | ret = -EINVAL; | ||
339 | |||
340 | if (ret) { | ||
341 | pr_debug("clockdomain: hardware cannot set/clear sleep dependency affecting %s from %s\n", | ||
342 | clkdm1->name, clkdm2->name); | ||
343 | return ret; | ||
238 | } | 344 | } |
345 | |||
346 | cd->sleepdep_usecount--; | ||
347 | if (cd->sleepdep_usecount == 0) { | ||
348 | pr_debug("clockdomain: will no longer prevent %s from sleeping if %s is active\n", | ||
349 | clkdm1->name, clkdm2->name); | ||
350 | |||
351 | ret = arch_clkdm->clkdm_del_sleepdep(clkdm1, clkdm2); | ||
352 | } | ||
353 | |||
354 | return ret; | ||
239 | } | 355 | } |
240 | 356 | ||
241 | /* Public functions */ | 357 | /* Public functions */ |
@@ -456,30 +572,18 @@ struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm) | |||
456 | int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | 572 | int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) |
457 | { | 573 | { |
458 | struct clkdm_dep *cd; | 574 | struct clkdm_dep *cd; |
459 | int ret = 0; | 575 | int ret; |
460 | 576 | ||
461 | if (!clkdm1 || !clkdm2) | 577 | if (!clkdm1 || !clkdm2) |
462 | return -EINVAL; | 578 | return -EINVAL; |
463 | 579 | ||
464 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); | 580 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); |
465 | if (IS_ERR(cd)) | 581 | if (IS_ERR(cd)) |
466 | ret = PTR_ERR(cd); | 582 | return PTR_ERR(cd); |
467 | 583 | ||
468 | if (!arch_clkdm || !arch_clkdm->clkdm_add_wkdep) | 584 | pwrdm_lock(cd->clkdm->pwrdm.ptr); |
469 | ret = -EINVAL; | 585 | ret = _clkdm_add_wkdep(clkdm1, clkdm2); |
470 | 586 | pwrdm_unlock(cd->clkdm->pwrdm.ptr); | |
471 | if (ret) { | ||
472 | pr_debug("clockdomain: hardware cannot set/clear wake up of %s when %s wakes up\n", | ||
473 | clkdm1->name, clkdm2->name); | ||
474 | return ret; | ||
475 | } | ||
476 | |||
477 | if (atomic_inc_return(&cd->wkdep_usecount) == 1) { | ||
478 | pr_debug("clockdomain: hardware will wake up %s when %s wakes up\n", | ||
479 | clkdm1->name, clkdm2->name); | ||
480 | |||
481 | ret = arch_clkdm->clkdm_add_wkdep(clkdm1, clkdm2); | ||
482 | } | ||
483 | 587 | ||
484 | return ret; | 588 | return ret; |
485 | } | 589 | } |
@@ -497,30 +601,18 @@ int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
497 | int clkdm_del_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | 601 | int clkdm_del_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) |
498 | { | 602 | { |
499 | struct clkdm_dep *cd; | 603 | struct clkdm_dep *cd; |
500 | int ret = 0; | 604 | int ret; |
501 | 605 | ||
502 | if (!clkdm1 || !clkdm2) | 606 | if (!clkdm1 || !clkdm2) |
503 | return -EINVAL; | 607 | return -EINVAL; |
504 | 608 | ||
505 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); | 609 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); |
506 | if (IS_ERR(cd)) | 610 | if (IS_ERR(cd)) |
507 | ret = PTR_ERR(cd); | 611 | return PTR_ERR(cd); |
508 | 612 | ||
509 | if (!arch_clkdm || !arch_clkdm->clkdm_del_wkdep) | 613 | pwrdm_lock(cd->clkdm->pwrdm.ptr); |
510 | ret = -EINVAL; | 614 | ret = _clkdm_del_wkdep(clkdm1, clkdm2); |
511 | 615 | pwrdm_unlock(cd->clkdm->pwrdm.ptr); | |
512 | if (ret) { | ||
513 | pr_debug("clockdomain: hardware cannot set/clear wake up of %s when %s wakes up\n", | ||
514 | clkdm1->name, clkdm2->name); | ||
515 | return ret; | ||
516 | } | ||
517 | |||
518 | if (atomic_dec_return(&cd->wkdep_usecount) == 0) { | ||
519 | pr_debug("clockdomain: hardware will no longer wake up %s after %s wakes up\n", | ||
520 | clkdm1->name, clkdm2->name); | ||
521 | |||
522 | ret = arch_clkdm->clkdm_del_wkdep(clkdm1, clkdm2); | ||
523 | } | ||
524 | 616 | ||
525 | return ret; | 617 | return ret; |
526 | } | 618 | } |
@@ -560,7 +652,7 @@ int clkdm_read_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
560 | return ret; | 652 | return ret; |
561 | } | 653 | } |
562 | 654 | ||
563 | /* XXX It's faster to return the atomic wkdep_usecount */ | 655 | /* XXX It's faster to return the wkdep_usecount */ |
564 | return arch_clkdm->clkdm_read_wkdep(clkdm1, clkdm2); | 656 | return arch_clkdm->clkdm_read_wkdep(clkdm1, clkdm2); |
565 | } | 657 | } |
566 | 658 | ||
@@ -600,30 +692,18 @@ int clkdm_clear_all_wkdeps(struct clockdomain *clkdm) | |||
600 | int clkdm_add_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | 692 | int clkdm_add_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) |
601 | { | 693 | { |
602 | struct clkdm_dep *cd; | 694 | struct clkdm_dep *cd; |
603 | int ret = 0; | 695 | int ret; |
604 | 696 | ||
605 | if (!clkdm1 || !clkdm2) | 697 | if (!clkdm1 || !clkdm2) |
606 | return -EINVAL; | 698 | return -EINVAL; |
607 | 699 | ||
608 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs); | 700 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); |
609 | if (IS_ERR(cd)) | 701 | if (IS_ERR(cd)) |
610 | ret = PTR_ERR(cd); | 702 | return PTR_ERR(cd); |
611 | 703 | ||
612 | if (!arch_clkdm || !arch_clkdm->clkdm_add_sleepdep) | 704 | pwrdm_lock(cd->clkdm->pwrdm.ptr); |
613 | ret = -EINVAL; | 705 | ret = _clkdm_add_sleepdep(clkdm1, clkdm2); |
614 | 706 | pwrdm_unlock(cd->clkdm->pwrdm.ptr); | |
615 | if (ret) { | ||
616 | pr_debug("clockdomain: hardware cannot set/clear sleep dependency affecting %s from %s\n", | ||
617 | clkdm1->name, clkdm2->name); | ||
618 | return ret; | ||
619 | } | ||
620 | |||
621 | if (atomic_inc_return(&cd->sleepdep_usecount) == 1) { | ||
622 | pr_debug("clockdomain: will prevent %s from sleeping if %s is active\n", | ||
623 | clkdm1->name, clkdm2->name); | ||
624 | |||
625 | ret = arch_clkdm->clkdm_add_sleepdep(clkdm1, clkdm2); | ||
626 | } | ||
627 | 707 | ||
628 | return ret; | 708 | return ret; |
629 | } | 709 | } |
@@ -643,30 +723,18 @@ int clkdm_add_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
643 | int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | 723 | int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) |
644 | { | 724 | { |
645 | struct clkdm_dep *cd; | 725 | struct clkdm_dep *cd; |
646 | int ret = 0; | 726 | int ret; |
647 | 727 | ||
648 | if (!clkdm1 || !clkdm2) | 728 | if (!clkdm1 || !clkdm2) |
649 | return -EINVAL; | 729 | return -EINVAL; |
650 | 730 | ||
651 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs); | 731 | cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs); |
652 | if (IS_ERR(cd)) | 732 | if (IS_ERR(cd)) |
653 | ret = PTR_ERR(cd); | 733 | return PTR_ERR(cd); |
654 | 734 | ||
655 | if (!arch_clkdm || !arch_clkdm->clkdm_del_sleepdep) | 735 | pwrdm_lock(cd->clkdm->pwrdm.ptr); |
656 | ret = -EINVAL; | 736 | ret = _clkdm_del_sleepdep(clkdm1, clkdm2); |
657 | 737 | pwrdm_unlock(cd->clkdm->pwrdm.ptr); | |
658 | if (ret) { | ||
659 | pr_debug("clockdomain: hardware cannot set/clear sleep dependency affecting %s from %s\n", | ||
660 | clkdm1->name, clkdm2->name); | ||
661 | return ret; | ||
662 | } | ||
663 | |||
664 | if (atomic_dec_return(&cd->sleepdep_usecount) == 0) { | ||
665 | pr_debug("clockdomain: will no longer prevent %s from sleeping if %s is active\n", | ||
666 | clkdm1->name, clkdm2->name); | ||
667 | |||
668 | ret = arch_clkdm->clkdm_del_sleepdep(clkdm1, clkdm2); | ||
669 | } | ||
670 | 738 | ||
671 | return ret; | 739 | return ret; |
672 | } | 740 | } |
@@ -708,7 +776,7 @@ int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2) | |||
708 | return ret; | 776 | return ret; |
709 | } | 777 | } |
710 | 778 | ||
711 | /* XXX It's faster to return the atomic sleepdep_usecount */ | 779 | /* XXX It's faster to return the sleepdep_usecount */ |
712 | return arch_clkdm->clkdm_read_sleepdep(clkdm1, clkdm2); | 780 | return arch_clkdm->clkdm_read_sleepdep(clkdm1, clkdm2); |
713 | } | 781 | } |
714 | 782 | ||
@@ -734,18 +802,17 @@ int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm) | |||
734 | } | 802 | } |
735 | 803 | ||
736 | /** | 804 | /** |
737 | * clkdm_sleep - force clockdomain sleep transition | 805 | * clkdm_sleep_nolock - force clockdomain sleep transition (lockless) |
738 | * @clkdm: struct clockdomain * | 806 | * @clkdm: struct clockdomain * |
739 | * | 807 | * |
740 | * Instruct the CM to force a sleep transition on the specified | 808 | * Instruct the CM to force a sleep transition on the specified |
741 | * clockdomain @clkdm. Returns -EINVAL if @clkdm is NULL or if | 809 | * clockdomain @clkdm. Only for use by the powerdomain code. Returns |
742 | * clockdomain does not support software-initiated sleep; 0 upon | 810 | * -EINVAL if @clkdm is NULL or if clockdomain does not support |
743 | * success. | 811 | * software-initiated sleep; 0 upon success. |
744 | */ | 812 | */ |
745 | int clkdm_sleep(struct clockdomain *clkdm) | 813 | int clkdm_sleep_nolock(struct clockdomain *clkdm) |
746 | { | 814 | { |
747 | int ret; | 815 | int ret; |
748 | unsigned long flags; | ||
749 | 816 | ||
750 | if (!clkdm) | 817 | if (!clkdm) |
751 | return -EINVAL; | 818 | return -EINVAL; |
@@ -761,26 +828,45 @@ int clkdm_sleep(struct clockdomain *clkdm) | |||
761 | 828 | ||
762 | pr_debug("clockdomain: forcing sleep on %s\n", clkdm->name); | 829 | pr_debug("clockdomain: forcing sleep on %s\n", clkdm->name); |
763 | 830 | ||
764 | spin_lock_irqsave(&clkdm->lock, flags); | ||
765 | clkdm->_flags &= ~_CLKDM_FLAG_HWSUP_ENABLED; | 831 | clkdm->_flags &= ~_CLKDM_FLAG_HWSUP_ENABLED; |
766 | ret = arch_clkdm->clkdm_sleep(clkdm); | 832 | ret = arch_clkdm->clkdm_sleep(clkdm); |
767 | spin_unlock_irqrestore(&clkdm->lock, flags); | 833 | ret |= pwrdm_state_switch_nolock(clkdm->pwrdm.ptr); |
834 | |||
768 | return ret; | 835 | return ret; |
769 | } | 836 | } |
770 | 837 | ||
771 | /** | 838 | /** |
772 | * clkdm_wakeup - force clockdomain wakeup transition | 839 | * clkdm_sleep - force clockdomain sleep transition |
773 | * @clkdm: struct clockdomain * | 840 | * @clkdm: struct clockdomain * |
774 | * | 841 | * |
775 | * Instruct the CM to force a wakeup transition on the specified | 842 | * Instruct the CM to force a sleep transition on the specified |
776 | * clockdomain @clkdm. Returns -EINVAL if @clkdm is NULL or if the | 843 | * clockdomain @clkdm. Returns -EINVAL if @clkdm is NULL or if |
777 | * clockdomain does not support software-controlled wakeup; 0 upon | 844 | * clockdomain does not support software-initiated sleep; 0 upon |
778 | * success. | 845 | * success. |
779 | */ | 846 | */ |
780 | int clkdm_wakeup(struct clockdomain *clkdm) | 847 | int clkdm_sleep(struct clockdomain *clkdm) |
848 | { | ||
849 | int ret; | ||
850 | |||
851 | pwrdm_lock(clkdm->pwrdm.ptr); | ||
852 | ret = clkdm_sleep_nolock(clkdm); | ||
853 | pwrdm_unlock(clkdm->pwrdm.ptr); | ||
854 | |||
855 | return ret; | ||
856 | } | ||
857 | |||
858 | /** | ||
859 | * clkdm_wakeup_nolock - force clockdomain wakeup transition (lockless) | ||
860 | * @clkdm: struct clockdomain * | ||
861 | * | ||
862 | * Instruct the CM to force a wakeup transition on the specified | ||
863 | * clockdomain @clkdm. Only for use by the powerdomain code. Returns | ||
864 | * -EINVAL if @clkdm is NULL or if the clockdomain does not support | ||
865 | * software-controlled wakeup; 0 upon success. | ||
866 | */ | ||
867 | int clkdm_wakeup_nolock(struct clockdomain *clkdm) | ||
781 | { | 868 | { |
782 | int ret; | 869 | int ret; |
783 | unsigned long flags; | ||
784 | 870 | ||
785 | if (!clkdm) | 871 | if (!clkdm) |
786 | return -EINVAL; | 872 | return -EINVAL; |
@@ -796,28 +882,46 @@ int clkdm_wakeup(struct clockdomain *clkdm) | |||
796 | 882 | ||
797 | pr_debug("clockdomain: forcing wakeup on %s\n", clkdm->name); | 883 | pr_debug("clockdomain: forcing wakeup on %s\n", clkdm->name); |
798 | 884 | ||
799 | spin_lock_irqsave(&clkdm->lock, flags); | ||
800 | clkdm->_flags &= ~_CLKDM_FLAG_HWSUP_ENABLED; | 885 | clkdm->_flags &= ~_CLKDM_FLAG_HWSUP_ENABLED; |
801 | ret = arch_clkdm->clkdm_wakeup(clkdm); | 886 | ret = arch_clkdm->clkdm_wakeup(clkdm); |
802 | ret |= pwrdm_state_switch(clkdm->pwrdm.ptr); | 887 | ret |= pwrdm_state_switch_nolock(clkdm->pwrdm.ptr); |
803 | spin_unlock_irqrestore(&clkdm->lock, flags); | 888 | |
804 | return ret; | 889 | return ret; |
805 | } | 890 | } |
806 | 891 | ||
807 | /** | 892 | /** |
808 | * clkdm_allow_idle - enable hwsup idle transitions for clkdm | 893 | * clkdm_wakeup - force clockdomain wakeup transition |
809 | * @clkdm: struct clockdomain * | 894 | * @clkdm: struct clockdomain * |
810 | * | 895 | * |
811 | * Allow the hardware to automatically switch the clockdomain @clkdm into | 896 | * Instruct the CM to force a wakeup transition on the specified |
812 | * active or idle states, as needed by downstream clocks. If the | 897 | * clockdomain @clkdm. Returns -EINVAL if @clkdm is NULL or if the |
898 | * clockdomain does not support software-controlled wakeup; 0 upon | ||
899 | * success. | ||
900 | */ | ||
901 | int clkdm_wakeup(struct clockdomain *clkdm) | ||
902 | { | ||
903 | int ret; | ||
904 | |||
905 | pwrdm_lock(clkdm->pwrdm.ptr); | ||
906 | ret = clkdm_wakeup_nolock(clkdm); | ||
907 | pwrdm_unlock(clkdm->pwrdm.ptr); | ||
908 | |||
909 | return ret; | ||
910 | } | ||
911 | |||
912 | /** | ||
913 | * clkdm_allow_idle_nolock - enable hwsup idle transitions for clkdm | ||
914 | * @clkdm: struct clockdomain * | ||
915 | * | ||
916 | * Allow the hardware to automatically switch the clockdomain @clkdm | ||
917 | * into active or idle states, as needed by downstream clocks. If the | ||
813 | * clockdomain has any downstream clocks enabled in the clock | 918 | * clockdomain has any downstream clocks enabled in the clock |
814 | * framework, wkdep/sleepdep autodependencies are added; this is so | 919 | * framework, wkdep/sleepdep autodependencies are added; this is so |
815 | * device drivers can read and write to the device. No return value. | 920 | * device drivers can read and write to the device. Only for use by |
921 | * the powerdomain code. No return value. | ||
816 | */ | 922 | */ |
817 | void clkdm_allow_idle(struct clockdomain *clkdm) | 923 | void clkdm_allow_idle_nolock(struct clockdomain *clkdm) |
818 | { | 924 | { |
819 | unsigned long flags; | ||
820 | |||
821 | if (!clkdm) | 925 | if (!clkdm) |
822 | return; | 926 | return; |
823 | 927 | ||
@@ -833,11 +937,26 @@ void clkdm_allow_idle(struct clockdomain *clkdm) | |||
833 | pr_debug("clockdomain: enabling automatic idle transitions for %s\n", | 937 | pr_debug("clockdomain: enabling automatic idle transitions for %s\n", |
834 | clkdm->name); | 938 | clkdm->name); |
835 | 939 | ||
836 | spin_lock_irqsave(&clkdm->lock, flags); | ||
837 | clkdm->_flags |= _CLKDM_FLAG_HWSUP_ENABLED; | 940 | clkdm->_flags |= _CLKDM_FLAG_HWSUP_ENABLED; |
838 | arch_clkdm->clkdm_allow_idle(clkdm); | 941 | arch_clkdm->clkdm_allow_idle(clkdm); |
839 | pwrdm_state_switch(clkdm->pwrdm.ptr); | 942 | pwrdm_state_switch_nolock(clkdm->pwrdm.ptr); |
840 | spin_unlock_irqrestore(&clkdm->lock, flags); | 943 | } |
944 | |||
945 | /** | ||
946 | * clkdm_allow_idle - enable hwsup idle transitions for clkdm | ||
947 | * @clkdm: struct clockdomain * | ||
948 | * | ||
949 | * Allow the hardware to automatically switch the clockdomain @clkdm into | ||
950 | * active or idle states, as needed by downstream clocks. If the | ||
951 | * clockdomain has any downstream clocks enabled in the clock | ||
952 | * framework, wkdep/sleepdep autodependencies are added; this is so | ||
953 | * device drivers can read and write to the device. No return value. | ||
954 | */ | ||
955 | void clkdm_allow_idle(struct clockdomain *clkdm) | ||
956 | { | ||
957 | pwrdm_lock(clkdm->pwrdm.ptr); | ||
958 | clkdm_allow_idle_nolock(clkdm); | ||
959 | pwrdm_unlock(clkdm->pwrdm.ptr); | ||
841 | } | 960 | } |
842 | 961 | ||
843 | /** | 962 | /** |
@@ -847,12 +966,11 @@ void clkdm_allow_idle(struct clockdomain *clkdm) | |||
847 | * Prevent the hardware from automatically switching the clockdomain | 966 | * Prevent the hardware from automatically switching the clockdomain |
848 | * @clkdm into inactive or idle states. If the clockdomain has | 967 | * @clkdm into inactive or idle states. If the clockdomain has |
849 | * downstream clocks enabled in the clock framework, wkdep/sleepdep | 968 | * downstream clocks enabled in the clock framework, wkdep/sleepdep |
850 | * autodependencies are removed. No return value. | 969 | * autodependencies are removed. Only for use by the powerdomain |
970 | * code. No return value. | ||
851 | */ | 971 | */ |
852 | void clkdm_deny_idle(struct clockdomain *clkdm) | 972 | void clkdm_deny_idle_nolock(struct clockdomain *clkdm) |
853 | { | 973 | { |
854 | unsigned long flags; | ||
855 | |||
856 | if (!clkdm) | 974 | if (!clkdm) |
857 | return; | 975 | return; |
858 | 976 | ||
@@ -868,11 +986,25 @@ void clkdm_deny_idle(struct clockdomain *clkdm) | |||
868 | pr_debug("clockdomain: disabling automatic idle transitions for %s\n", | 986 | pr_debug("clockdomain: disabling automatic idle transitions for %s\n", |
869 | clkdm->name); | 987 | clkdm->name); |
870 | 988 | ||
871 | spin_lock_irqsave(&clkdm->lock, flags); | ||
872 | clkdm->_flags &= ~_CLKDM_FLAG_HWSUP_ENABLED; | 989 | clkdm->_flags &= ~_CLKDM_FLAG_HWSUP_ENABLED; |
873 | arch_clkdm->clkdm_deny_idle(clkdm); | 990 | arch_clkdm->clkdm_deny_idle(clkdm); |
874 | pwrdm_state_switch(clkdm->pwrdm.ptr); | 991 | pwrdm_state_switch_nolock(clkdm->pwrdm.ptr); |
875 | spin_unlock_irqrestore(&clkdm->lock, flags); | 992 | } |
993 | |||
994 | /** | ||
995 | * clkdm_deny_idle - disable hwsup idle transitions for clkdm | ||
996 | * @clkdm: struct clockdomain * | ||
997 | * | ||
998 | * Prevent the hardware from automatically switching the clockdomain | ||
999 | * @clkdm into inactive or idle states. If the clockdomain has | ||
1000 | * downstream clocks enabled in the clock framework, wkdep/sleepdep | ||
1001 | * autodependencies are removed. No return value. | ||
1002 | */ | ||
1003 | void clkdm_deny_idle(struct clockdomain *clkdm) | ||
1004 | { | ||
1005 | pwrdm_lock(clkdm->pwrdm.ptr); | ||
1006 | clkdm_deny_idle_nolock(clkdm); | ||
1007 | pwrdm_unlock(clkdm->pwrdm.ptr); | ||
876 | } | 1008 | } |
877 | 1009 | ||
878 | /** | 1010 | /** |
@@ -889,14 +1021,11 @@ void clkdm_deny_idle(struct clockdomain *clkdm) | |||
889 | bool clkdm_in_hwsup(struct clockdomain *clkdm) | 1021 | bool clkdm_in_hwsup(struct clockdomain *clkdm) |
890 | { | 1022 | { |
891 | bool ret; | 1023 | bool ret; |
892 | unsigned long flags; | ||
893 | 1024 | ||
894 | if (!clkdm) | 1025 | if (!clkdm) |
895 | return false; | 1026 | return false; |
896 | 1027 | ||
897 | spin_lock_irqsave(&clkdm->lock, flags); | ||
898 | ret = (clkdm->_flags & _CLKDM_FLAG_HWSUP_ENABLED) ? true : false; | 1028 | ret = (clkdm->_flags & _CLKDM_FLAG_HWSUP_ENABLED) ? true : false; |
899 | spin_unlock_irqrestore(&clkdm->lock, flags); | ||
900 | 1029 | ||
901 | return ret; | 1030 | return ret; |
902 | } | 1031 | } |
@@ -918,30 +1047,91 @@ bool clkdm_missing_idle_reporting(struct clockdomain *clkdm) | |||
918 | return (clkdm->flags & CLKDM_MISSING_IDLE_REPORTING) ? true : false; | 1047 | return (clkdm->flags & CLKDM_MISSING_IDLE_REPORTING) ? true : false; |
919 | } | 1048 | } |
920 | 1049 | ||
1050 | /* Public autodep handling functions (deprecated) */ | ||
1051 | |||
1052 | /** | ||
1053 | * clkdm_add_autodeps - add auto sleepdeps/wkdeps to clkdm upon clock enable | ||
1054 | * @clkdm: struct clockdomain * | ||
1055 | * | ||
1056 | * Add the "autodep" sleep & wakeup dependencies to clockdomain 'clkdm' | ||
1057 | * in hardware-supervised mode. Meant to be called from clock framework | ||
1058 | * when a clock inside clockdomain 'clkdm' is enabled. No return value. | ||
1059 | * | ||
1060 | * XXX autodeps are deprecated and should be removed at the earliest | ||
1061 | * opportunity | ||
1062 | */ | ||
1063 | void clkdm_add_autodeps(struct clockdomain *clkdm) | ||
1064 | { | ||
1065 | struct clkdm_autodep *autodep; | ||
1066 | |||
1067 | if (!autodeps || clkdm->flags & CLKDM_NO_AUTODEPS) | ||
1068 | return; | ||
1069 | |||
1070 | for (autodep = autodeps; autodep->clkdm.ptr; autodep++) { | ||
1071 | if (IS_ERR(autodep->clkdm.ptr)) | ||
1072 | continue; | ||
1073 | |||
1074 | pr_debug("clockdomain: %s: adding %s sleepdep/wkdep\n", | ||
1075 | clkdm->name, autodep->clkdm.ptr->name); | ||
1076 | |||
1077 | _clkdm_add_sleepdep(clkdm, autodep->clkdm.ptr); | ||
1078 | _clkdm_add_wkdep(clkdm, autodep->clkdm.ptr); | ||
1079 | } | ||
1080 | } | ||
1081 | |||
1082 | /** | ||
1083 | * clkdm_del_autodeps - remove auto sleepdeps/wkdeps from clkdm | ||
1084 | * @clkdm: struct clockdomain * | ||
1085 | * | ||
1086 | * Remove the "autodep" sleep & wakeup dependencies from clockdomain 'clkdm' | ||
1087 | * in hardware-supervised mode. Meant to be called from clock framework | ||
1088 | * when a clock inside clockdomain 'clkdm' is disabled. No return value. | ||
1089 | * | ||
1090 | * XXX autodeps are deprecated and should be removed at the earliest | ||
1091 | * opportunity | ||
1092 | */ | ||
1093 | void clkdm_del_autodeps(struct clockdomain *clkdm) | ||
1094 | { | ||
1095 | struct clkdm_autodep *autodep; | ||
1096 | |||
1097 | if (!autodeps || clkdm->flags & CLKDM_NO_AUTODEPS) | ||
1098 | return; | ||
1099 | |||
1100 | for (autodep = autodeps; autodep->clkdm.ptr; autodep++) { | ||
1101 | if (IS_ERR(autodep->clkdm.ptr)) | ||
1102 | continue; | ||
1103 | |||
1104 | pr_debug("clockdomain: %s: removing %s sleepdep/wkdep\n", | ||
1105 | clkdm->name, autodep->clkdm.ptr->name); | ||
1106 | |||
1107 | _clkdm_del_sleepdep(clkdm, autodep->clkdm.ptr); | ||
1108 | _clkdm_del_wkdep(clkdm, autodep->clkdm.ptr); | ||
1109 | } | ||
1110 | } | ||
1111 | |||
921 | /* Clockdomain-to-clock/hwmod framework interface code */ | 1112 | /* Clockdomain-to-clock/hwmod framework interface code */ |
922 | 1113 | ||
923 | static int _clkdm_clk_hwmod_enable(struct clockdomain *clkdm) | 1114 | static int _clkdm_clk_hwmod_enable(struct clockdomain *clkdm) |
924 | { | 1115 | { |
925 | unsigned long flags; | ||
926 | |||
927 | if (!clkdm || !arch_clkdm || !arch_clkdm->clkdm_clk_enable) | 1116 | if (!clkdm || !arch_clkdm || !arch_clkdm->clkdm_clk_enable) |
928 | return -EINVAL; | 1117 | return -EINVAL; |
929 | 1118 | ||
930 | spin_lock_irqsave(&clkdm->lock, flags); | 1119 | pwrdm_lock(clkdm->pwrdm.ptr); |
931 | 1120 | ||
932 | /* | 1121 | /* |
933 | * For arch's with no autodeps, clkcm_clk_enable | 1122 | * For arch's with no autodeps, clkcm_clk_enable |
934 | * should be called for every clock instance or hwmod that is | 1123 | * should be called for every clock instance or hwmod that is |
935 | * enabled, so the clkdm can be force woken up. | 1124 | * enabled, so the clkdm can be force woken up. |
936 | */ | 1125 | */ |
937 | if ((atomic_inc_return(&clkdm->usecount) > 1) && autodeps) { | 1126 | clkdm->usecount++; |
938 | spin_unlock_irqrestore(&clkdm->lock, flags); | 1127 | if (clkdm->usecount > 1 && autodeps) { |
1128 | pwrdm_unlock(clkdm->pwrdm.ptr); | ||
939 | return 0; | 1129 | return 0; |
940 | } | 1130 | } |
941 | 1131 | ||
942 | arch_clkdm->clkdm_clk_enable(clkdm); | 1132 | arch_clkdm->clkdm_clk_enable(clkdm); |
943 | pwrdm_state_switch(clkdm->pwrdm.ptr); | 1133 | pwrdm_state_switch_nolock(clkdm->pwrdm.ptr); |
944 | spin_unlock_irqrestore(&clkdm->lock, flags); | 1134 | pwrdm_unlock(clkdm->pwrdm.ptr); |
945 | 1135 | ||
946 | pr_debug("clockdomain: %s: enabled\n", clkdm->name); | 1136 | pr_debug("clockdomain: %s: enabled\n", clkdm->name); |
947 | 1137 | ||
@@ -990,36 +1180,34 @@ int clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk) | |||
990 | */ | 1180 | */ |
991 | int clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk) | 1181 | int clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk) |
992 | { | 1182 | { |
993 | unsigned long flags; | ||
994 | |||
995 | if (!clkdm || !clk || !arch_clkdm || !arch_clkdm->clkdm_clk_disable) | 1183 | if (!clkdm || !clk || !arch_clkdm || !arch_clkdm->clkdm_clk_disable) |
996 | return -EINVAL; | 1184 | return -EINVAL; |
997 | 1185 | ||
998 | spin_lock_irqsave(&clkdm->lock, flags); | 1186 | pwrdm_lock(clkdm->pwrdm.ptr); |
999 | 1187 | ||
1000 | /* corner case: disabling unused clocks */ | 1188 | /* corner case: disabling unused clocks */ |
1001 | if ((__clk_get_enable_count(clk) == 0) && | 1189 | if ((__clk_get_enable_count(clk) == 0) && clkdm->usecount == 0) |
1002 | (atomic_read(&clkdm->usecount) == 0)) | ||
1003 | goto ccd_exit; | 1190 | goto ccd_exit; |
1004 | 1191 | ||
1005 | if (atomic_read(&clkdm->usecount) == 0) { | 1192 | if (clkdm->usecount == 0) { |
1006 | spin_unlock_irqrestore(&clkdm->lock, flags); | 1193 | pwrdm_unlock(clkdm->pwrdm.ptr); |
1007 | WARN_ON(1); /* underflow */ | 1194 | WARN_ON(1); /* underflow */ |
1008 | return -ERANGE; | 1195 | return -ERANGE; |
1009 | } | 1196 | } |
1010 | 1197 | ||
1011 | if (atomic_dec_return(&clkdm->usecount) > 0) { | 1198 | clkdm->usecount--; |
1012 | spin_unlock_irqrestore(&clkdm->lock, flags); | 1199 | if (clkdm->usecount > 0) { |
1200 | pwrdm_unlock(clkdm->pwrdm.ptr); | ||
1013 | return 0; | 1201 | return 0; |
1014 | } | 1202 | } |
1015 | 1203 | ||
1016 | arch_clkdm->clkdm_clk_disable(clkdm); | 1204 | arch_clkdm->clkdm_clk_disable(clkdm); |
1017 | pwrdm_state_switch(clkdm->pwrdm.ptr); | 1205 | pwrdm_state_switch_nolock(clkdm->pwrdm.ptr); |
1018 | 1206 | ||
1019 | pr_debug("clockdomain: %s: disabled\n", clkdm->name); | 1207 | pr_debug("clockdomain: %s: disabled\n", clkdm->name); |
1020 | 1208 | ||
1021 | ccd_exit: | 1209 | ccd_exit: |
1022 | spin_unlock_irqrestore(&clkdm->lock, flags); | 1210 | pwrdm_unlock(clkdm->pwrdm.ptr); |
1023 | 1211 | ||
1024 | return 0; | 1212 | return 0; |
1025 | } | 1213 | } |
@@ -1072,8 +1260,6 @@ int clkdm_hwmod_enable(struct clockdomain *clkdm, struct omap_hwmod *oh) | |||
1072 | */ | 1260 | */ |
1073 | int clkdm_hwmod_disable(struct clockdomain *clkdm, struct omap_hwmod *oh) | 1261 | int clkdm_hwmod_disable(struct clockdomain *clkdm, struct omap_hwmod *oh) |
1074 | { | 1262 | { |
1075 | unsigned long flags; | ||
1076 | |||
1077 | /* The clkdm attribute does not exist yet prior OMAP4 */ | 1263 | /* The clkdm attribute does not exist yet prior OMAP4 */ |
1078 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) | 1264 | if (cpu_is_omap24xx() || cpu_is_omap34xx()) |
1079 | return 0; | 1265 | return 0; |
@@ -1086,22 +1272,23 @@ int clkdm_hwmod_disable(struct clockdomain *clkdm, struct omap_hwmod *oh) | |||
1086 | if (!clkdm || !oh || !arch_clkdm || !arch_clkdm->clkdm_clk_disable) | 1272 | if (!clkdm || !oh || !arch_clkdm || !arch_clkdm->clkdm_clk_disable) |
1087 | return -EINVAL; | 1273 | return -EINVAL; |
1088 | 1274 | ||
1089 | spin_lock_irqsave(&clkdm->lock, flags); | 1275 | pwrdm_lock(clkdm->pwrdm.ptr); |
1090 | 1276 | ||
1091 | if (atomic_read(&clkdm->usecount) == 0) { | 1277 | if (clkdm->usecount == 0) { |
1092 | spin_unlock_irqrestore(&clkdm->lock, flags); | 1278 | pwrdm_unlock(clkdm->pwrdm.ptr); |
1093 | WARN_ON(1); /* underflow */ | 1279 | WARN_ON(1); /* underflow */ |
1094 | return -ERANGE; | 1280 | return -ERANGE; |
1095 | } | 1281 | } |
1096 | 1282 | ||
1097 | if (atomic_dec_return(&clkdm->usecount) > 0) { | 1283 | clkdm->usecount--; |
1098 | spin_unlock_irqrestore(&clkdm->lock, flags); | 1284 | if (clkdm->usecount > 0) { |
1285 | pwrdm_unlock(clkdm->pwrdm.ptr); | ||
1099 | return 0; | 1286 | return 0; |
1100 | } | 1287 | } |
1101 | 1288 | ||
1102 | arch_clkdm->clkdm_clk_disable(clkdm); | 1289 | arch_clkdm->clkdm_clk_disable(clkdm); |
1103 | pwrdm_state_switch(clkdm->pwrdm.ptr); | 1290 | pwrdm_state_switch_nolock(clkdm->pwrdm.ptr); |
1104 | spin_unlock_irqrestore(&clkdm->lock, flags); | 1291 | pwrdm_unlock(clkdm->pwrdm.ptr); |
1105 | 1292 | ||
1106 | pr_debug("clockdomain: %s: disabled\n", clkdm->name); | 1293 | pr_debug("clockdomain: %s: disabled\n", clkdm->name); |
1107 | 1294 | ||
diff --git a/arch/arm/mach-omap2/clockdomain.h b/arch/arm/mach-omap2/clockdomain.h index bc42446e23ab..2da37656a693 100644 --- a/arch/arm/mach-omap2/clockdomain.h +++ b/arch/arm/mach-omap2/clockdomain.h | |||
@@ -15,7 +15,6 @@ | |||
15 | #define __ARCH_ARM_MACH_OMAP2_CLOCKDOMAIN_H | 15 | #define __ARCH_ARM_MACH_OMAP2_CLOCKDOMAIN_H |
16 | 16 | ||
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <linux/spinlock.h> | ||
19 | 18 | ||
20 | #include "powerdomain.h" | 19 | #include "powerdomain.h" |
21 | #include "clock.h" | 20 | #include "clock.h" |
@@ -92,8 +91,8 @@ struct clkdm_autodep { | |||
92 | struct clkdm_dep { | 91 | struct clkdm_dep { |
93 | const char *clkdm_name; | 92 | const char *clkdm_name; |
94 | struct clockdomain *clkdm; | 93 | struct clockdomain *clkdm; |
95 | atomic_t wkdep_usecount; | 94 | s16 wkdep_usecount; |
96 | atomic_t sleepdep_usecount; | 95 | s16 sleepdep_usecount; |
97 | }; | 96 | }; |
98 | 97 | ||
99 | /* Possible flags for struct clockdomain._flags */ | 98 | /* Possible flags for struct clockdomain._flags */ |
@@ -137,9 +136,8 @@ struct clockdomain { | |||
137 | const u16 clkdm_offs; | 136 | const u16 clkdm_offs; |
138 | struct clkdm_dep *wkdep_srcs; | 137 | struct clkdm_dep *wkdep_srcs; |
139 | struct clkdm_dep *sleepdep_srcs; | 138 | struct clkdm_dep *sleepdep_srcs; |
140 | atomic_t usecount; | 139 | int usecount; |
141 | struct list_head node; | 140 | struct list_head node; |
142 | spinlock_t lock; | ||
143 | }; | 141 | }; |
144 | 142 | ||
145 | /** | 143 | /** |
@@ -196,12 +194,16 @@ int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); | |||
196 | int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); | 194 | int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2); |
197 | int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm); | 195 | int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm); |
198 | 196 | ||
197 | void clkdm_allow_idle_nolock(struct clockdomain *clkdm); | ||
199 | void clkdm_allow_idle(struct clockdomain *clkdm); | 198 | void clkdm_allow_idle(struct clockdomain *clkdm); |
199 | void clkdm_deny_idle_nolock(struct clockdomain *clkdm); | ||
200 | void clkdm_deny_idle(struct clockdomain *clkdm); | 200 | void clkdm_deny_idle(struct clockdomain *clkdm); |
201 | bool clkdm_in_hwsup(struct clockdomain *clkdm); | 201 | bool clkdm_in_hwsup(struct clockdomain *clkdm); |
202 | bool clkdm_missing_idle_reporting(struct clockdomain *clkdm); | 202 | bool clkdm_missing_idle_reporting(struct clockdomain *clkdm); |
203 | 203 | ||
204 | int clkdm_wakeup_nolock(struct clockdomain *clkdm); | ||
204 | int clkdm_wakeup(struct clockdomain *clkdm); | 205 | int clkdm_wakeup(struct clockdomain *clkdm); |
206 | int clkdm_sleep_nolock(struct clockdomain *clkdm); | ||
205 | int clkdm_sleep(struct clockdomain *clkdm); | 207 | int clkdm_sleep(struct clockdomain *clkdm); |
206 | 208 | ||
207 | int clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk); | 209 | int clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk); |
@@ -214,8 +216,9 @@ extern void __init omap243x_clockdomains_init(void); | |||
214 | extern void __init omap3xxx_clockdomains_init(void); | 216 | extern void __init omap3xxx_clockdomains_init(void); |
215 | extern void __init am33xx_clockdomains_init(void); | 217 | extern void __init am33xx_clockdomains_init(void); |
216 | extern void __init omap44xx_clockdomains_init(void); | 218 | extern void __init omap44xx_clockdomains_init(void); |
217 | extern void _clkdm_add_autodeps(struct clockdomain *clkdm); | 219 | |
218 | extern void _clkdm_del_autodeps(struct clockdomain *clkdm); | 220 | extern void clkdm_add_autodeps(struct clockdomain *clkdm); |
221 | extern void clkdm_del_autodeps(struct clockdomain *clkdm); | ||
219 | 222 | ||
220 | extern struct clkdm_ops omap2_clkdm_operations; | 223 | extern struct clkdm_ops omap2_clkdm_operations; |
221 | extern struct clkdm_ops omap3_clkdm_operations; | 224 | extern struct clkdm_ops omap3_clkdm_operations; |
diff --git a/arch/arm/mach-omap2/cm2xxx.c b/arch/arm/mach-omap2/cm2xxx.c index db650690e9d0..6774a53a3874 100644 --- a/arch/arm/mach-omap2/cm2xxx.c +++ b/arch/arm/mach-omap2/cm2xxx.c | |||
@@ -273,9 +273,6 @@ int omap2xxx_cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, u8 idlest_shift) | |||
273 | 273 | ||
274 | static void omap2xxx_clkdm_allow_idle(struct clockdomain *clkdm) | 274 | static void omap2xxx_clkdm_allow_idle(struct clockdomain *clkdm) |
275 | { | 275 | { |
276 | if (atomic_read(&clkdm->usecount) > 0) | ||
277 | _clkdm_add_autodeps(clkdm); | ||
278 | |||
279 | omap2xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | 276 | omap2xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, |
280 | clkdm->clktrctrl_mask); | 277 | clkdm->clktrctrl_mask); |
281 | } | 278 | } |
@@ -284,9 +281,6 @@ static void omap2xxx_clkdm_deny_idle(struct clockdomain *clkdm) | |||
284 | { | 281 | { |
285 | omap2xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | 282 | omap2xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, |
286 | clkdm->clktrctrl_mask); | 283 | clkdm->clktrctrl_mask); |
287 | |||
288 | if (atomic_read(&clkdm->usecount) > 0) | ||
289 | _clkdm_del_autodeps(clkdm); | ||
290 | } | 284 | } |
291 | 285 | ||
292 | static int omap2xxx_clkdm_clk_enable(struct clockdomain *clkdm) | 286 | static int omap2xxx_clkdm_clk_enable(struct clockdomain *clkdm) |
@@ -298,18 +292,8 @@ static int omap2xxx_clkdm_clk_enable(struct clockdomain *clkdm) | |||
298 | 292 | ||
299 | hwsup = omap2xxx_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs, | 293 | hwsup = omap2xxx_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs, |
300 | clkdm->clktrctrl_mask); | 294 | clkdm->clktrctrl_mask); |
301 | 295 | if (!hwsup && clkdm->flags & CLKDM_CAN_FORCE_WAKEUP) | |
302 | if (hwsup) { | 296 | omap2xxx_clkdm_wakeup(clkdm); |
303 | /* Disable HW transitions when we are changing deps */ | ||
304 | omap2xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
305 | clkdm->clktrctrl_mask); | ||
306 | _clkdm_add_autodeps(clkdm); | ||
307 | omap2xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
308 | clkdm->clktrctrl_mask); | ||
309 | } else { | ||
310 | if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP) | ||
311 | omap2xxx_clkdm_wakeup(clkdm); | ||
312 | } | ||
313 | 297 | ||
314 | return 0; | 298 | return 0; |
315 | } | 299 | } |
@@ -324,17 +308,8 @@ static int omap2xxx_clkdm_clk_disable(struct clockdomain *clkdm) | |||
324 | hwsup = omap2xxx_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs, | 308 | hwsup = omap2xxx_cm_is_clkdm_in_hwsup(clkdm->pwrdm.ptr->prcm_offs, |
325 | clkdm->clktrctrl_mask); | 309 | clkdm->clktrctrl_mask); |
326 | 310 | ||
327 | if (hwsup) { | 311 | if (!hwsup && clkdm->flags & CLKDM_CAN_FORCE_SLEEP) |
328 | /* Disable HW transitions when we are changing deps */ | 312 | omap2xxx_clkdm_sleep(clkdm); |
329 | omap2xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
330 | clkdm->clktrctrl_mask); | ||
331 | _clkdm_del_autodeps(clkdm); | ||
332 | omap2xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | ||
333 | clkdm->clktrctrl_mask); | ||
334 | } else { | ||
335 | if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP) | ||
336 | omap2xxx_clkdm_sleep(clkdm); | ||
337 | } | ||
338 | 313 | ||
339 | return 0; | 314 | return 0; |
340 | } | 315 | } |
diff --git a/arch/arm/mach-omap2/cm33xx.c b/arch/arm/mach-omap2/cm33xx.c index 058ce3c0873e..325a51576576 100644 --- a/arch/arm/mach-omap2/cm33xx.c +++ b/arch/arm/mach-omap2/cm33xx.c | |||
@@ -241,9 +241,6 @@ int am33xx_cm_wait_module_ready(u16 inst, s16 cdoffs, u16 clkctrl_offs) | |||
241 | { | 241 | { |
242 | int i = 0; | 242 | int i = 0; |
243 | 243 | ||
244 | if (!clkctrl_offs) | ||
245 | return 0; | ||
246 | |||
247 | omap_test_timeout(_is_module_ready(inst, cdoffs, clkctrl_offs), | 244 | omap_test_timeout(_is_module_ready(inst, cdoffs, clkctrl_offs), |
248 | MAX_MODULE_READY_TIME, i); | 245 | MAX_MODULE_READY_TIME, i); |
249 | 246 | ||
diff --git a/arch/arm/mach-omap2/cm33xx.h b/arch/arm/mach-omap2/cm33xx.h index 5fa0b62e1a79..64f4bafe7bd9 100644 --- a/arch/arm/mach-omap2/cm33xx.h +++ b/arch/arm/mach-omap2/cm33xx.h | |||
@@ -17,16 +17,11 @@ | |||
17 | #ifndef __ARCH_ARM_MACH_OMAP2_CM_33XX_H | 17 | #ifndef __ARCH_ARM_MACH_OMAP2_CM_33XX_H |
18 | #define __ARCH_ARM_MACH_OMAP2_CM_33XX_H | 18 | #define __ARCH_ARM_MACH_OMAP2_CM_33XX_H |
19 | 19 | ||
20 | #include <linux/delay.h> | ||
21 | #include <linux/errno.h> | ||
22 | #include <linux/err.h> | ||
23 | #include <linux/io.h> | ||
24 | |||
25 | #include "common.h" | 20 | #include "common.h" |
26 | 21 | ||
27 | #include "cm.h" | 22 | #include "cm.h" |
28 | #include "cm-regbits-33xx.h" | 23 | #include "cm-regbits-33xx.h" |
29 | #include "cm33xx.h" | 24 | #include "iomap.h" |
30 | 25 | ||
31 | /* CM base address */ | 26 | /* CM base address */ |
32 | #define AM33XX_CM_BASE 0x44e00000 | 27 | #define AM33XX_CM_BASE 0x44e00000 |
@@ -381,6 +376,7 @@ | |||
381 | #define AM33XX_CM_CEFUSE_CEFUSE_CLKCTRL AM33XX_CM_REGADDR(AM33XX_CM_CEFUSE_MOD, 0x0020) | 376 | #define AM33XX_CM_CEFUSE_CEFUSE_CLKCTRL AM33XX_CM_REGADDR(AM33XX_CM_CEFUSE_MOD, 0x0020) |
382 | 377 | ||
383 | 378 | ||
379 | #ifndef __ASSEMBLER__ | ||
384 | extern bool am33xx_cm_is_clkdm_in_hwsup(s16 inst, u16 cdoffs); | 380 | extern bool am33xx_cm_is_clkdm_in_hwsup(s16 inst, u16 cdoffs); |
385 | extern void am33xx_cm_clkdm_enable_hwsup(s16 inst, u16 cdoffs); | 381 | extern void am33xx_cm_clkdm_enable_hwsup(s16 inst, u16 cdoffs); |
386 | extern void am33xx_cm_clkdm_disable_hwsup(s16 inst, u16 cdoffs); | 382 | extern void am33xx_cm_clkdm_disable_hwsup(s16 inst, u16 cdoffs); |
@@ -417,4 +413,5 @@ static inline int am33xx_cm_wait_module_ready(u16 inst, s16 cdoffs, | |||
417 | } | 413 | } |
418 | #endif | 414 | #endif |
419 | 415 | ||
416 | #endif /* ASSEMBLER */ | ||
420 | #endif | 417 | #endif |
diff --git a/arch/arm/mach-omap2/cm3xxx.c b/arch/arm/mach-omap2/cm3xxx.c index c2086f2e86b6..9061c307d915 100644 --- a/arch/arm/mach-omap2/cm3xxx.c +++ b/arch/arm/mach-omap2/cm3xxx.c | |||
@@ -186,7 +186,7 @@ static int omap3xxx_clkdm_clear_all_sleepdeps(struct clockdomain *clkdm) | |||
186 | continue; /* only happens if data is erroneous */ | 186 | continue; /* only happens if data is erroneous */ |
187 | 187 | ||
188 | mask |= 1 << cd->clkdm->dep_bit; | 188 | mask |= 1 << cd->clkdm->dep_bit; |
189 | atomic_set(&cd->sleepdep_usecount, 0); | 189 | cd->sleepdep_usecount = 0; |
190 | } | 190 | } |
191 | omap2_cm_clear_mod_reg_bits(mask, clkdm->pwrdm.ptr->prcm_offs, | 191 | omap2_cm_clear_mod_reg_bits(mask, clkdm->pwrdm.ptr->prcm_offs, |
192 | OMAP3430_CM_SLEEPDEP); | 192 | OMAP3430_CM_SLEEPDEP); |
@@ -209,8 +209,8 @@ static int omap3xxx_clkdm_wakeup(struct clockdomain *clkdm) | |||
209 | 209 | ||
210 | static void omap3xxx_clkdm_allow_idle(struct clockdomain *clkdm) | 210 | static void omap3xxx_clkdm_allow_idle(struct clockdomain *clkdm) |
211 | { | 211 | { |
212 | if (atomic_read(&clkdm->usecount) > 0) | 212 | if (clkdm->usecount > 0) |
213 | _clkdm_add_autodeps(clkdm); | 213 | clkdm_add_autodeps(clkdm); |
214 | 214 | ||
215 | omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | 215 | omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, |
216 | clkdm->clktrctrl_mask); | 216 | clkdm->clktrctrl_mask); |
@@ -221,8 +221,8 @@ static void omap3xxx_clkdm_deny_idle(struct clockdomain *clkdm) | |||
221 | omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | 221 | omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, |
222 | clkdm->clktrctrl_mask); | 222 | clkdm->clktrctrl_mask); |
223 | 223 | ||
224 | if (atomic_read(&clkdm->usecount) > 0) | 224 | if (clkdm->usecount > 0) |
225 | _clkdm_del_autodeps(clkdm); | 225 | clkdm_del_autodeps(clkdm); |
226 | } | 226 | } |
227 | 227 | ||
228 | static int omap3xxx_clkdm_clk_enable(struct clockdomain *clkdm) | 228 | static int omap3xxx_clkdm_clk_enable(struct clockdomain *clkdm) |
@@ -250,7 +250,7 @@ static int omap3xxx_clkdm_clk_enable(struct clockdomain *clkdm) | |||
250 | /* Disable HW transitions when we are changing deps */ | 250 | /* Disable HW transitions when we are changing deps */ |
251 | omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | 251 | omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, |
252 | clkdm->clktrctrl_mask); | 252 | clkdm->clktrctrl_mask); |
253 | _clkdm_add_autodeps(clkdm); | 253 | clkdm_add_autodeps(clkdm); |
254 | omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | 254 | omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, |
255 | clkdm->clktrctrl_mask); | 255 | clkdm->clktrctrl_mask); |
256 | } else { | 256 | } else { |
@@ -287,7 +287,7 @@ static int omap3xxx_clkdm_clk_disable(struct clockdomain *clkdm) | |||
287 | /* Disable HW transitions when we are changing deps */ | 287 | /* Disable HW transitions when we are changing deps */ |
288 | omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | 288 | omap3xxx_cm_clkdm_disable_hwsup(clkdm->pwrdm.ptr->prcm_offs, |
289 | clkdm->clktrctrl_mask); | 289 | clkdm->clktrctrl_mask); |
290 | _clkdm_del_autodeps(clkdm); | 290 | clkdm_del_autodeps(clkdm); |
291 | omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, | 291 | omap3xxx_cm_clkdm_enable_hwsup(clkdm->pwrdm.ptr->prcm_offs, |
292 | clkdm->clktrctrl_mask); | 292 | clkdm->clktrctrl_mask); |
293 | } else { | 293 | } else { |
diff --git a/arch/arm/mach-omap2/cminst44xx.c b/arch/arm/mach-omap2/cminst44xx.c index 7f9a464f01e9..f0290f5566fe 100644 --- a/arch/arm/mach-omap2/cminst44xx.c +++ b/arch/arm/mach-omap2/cminst44xx.c | |||
@@ -393,7 +393,7 @@ static int omap4_clkdm_clear_all_wkup_sleep_deps(struct clockdomain *clkdm) | |||
393 | continue; /* only happens if data is erroneous */ | 393 | continue; /* only happens if data is erroneous */ |
394 | 394 | ||
395 | mask |= 1 << cd->clkdm->dep_bit; | 395 | mask |= 1 << cd->clkdm->dep_bit; |
396 | atomic_set(&cd->wkdep_usecount, 0); | 396 | cd->wkdep_usecount = 0; |
397 | } | 397 | } |
398 | 398 | ||
399 | omap4_cminst_clear_inst_reg_bits(mask, clkdm->prcm_partition, | 399 | omap4_cminst_clear_inst_reg_bits(mask, clkdm->prcm_partition, |
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index 948bcaa82eb6..0a6b9c7a63da 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h | |||
@@ -79,13 +79,13 @@ static inline int omap_mux_late_init(void) | |||
79 | 79 | ||
80 | extern void omap2_init_common_infrastructure(void); | 80 | extern void omap2_init_common_infrastructure(void); |
81 | 81 | ||
82 | extern struct sys_timer omap2_timer; | 82 | extern void omap2_sync32k_timer_init(void); |
83 | extern struct sys_timer omap3_timer; | 83 | extern void omap3_sync32k_timer_init(void); |
84 | extern struct sys_timer omap3_secure_timer; | 84 | extern void omap3_secure_sync32k_timer_init(void); |
85 | extern struct sys_timer omap3_gp_timer; | 85 | extern void omap3_gp_gptimer_timer_init(void); |
86 | extern struct sys_timer omap3_am33xx_timer; | 86 | extern void omap3_am33xx_gptimer_timer_init(void); |
87 | extern struct sys_timer omap4_timer; | 87 | extern void omap4_local_timer_init(void); |
88 | extern struct sys_timer omap5_timer; | 88 | extern void omap5_realtime_timer_init(void); |
89 | 89 | ||
90 | void omap2420_init_early(void); | 90 | void omap2420_init_early(void); |
91 | void omap2430_init_early(void); | 91 | void omap2430_init_early(void); |
@@ -119,6 +119,14 @@ static inline void omap2xxx_restart(char mode, const char *cmd) | |||
119 | } | 119 | } |
120 | #endif | 120 | #endif |
121 | 121 | ||
122 | #ifdef CONFIG_SOC_AM33XX | ||
123 | void am33xx_restart(char mode, const char *cmd); | ||
124 | #else | ||
125 | static inline void am33xx_restart(char mode, const char *cmd) | ||
126 | { | ||
127 | } | ||
128 | #endif | ||
129 | |||
122 | #ifdef CONFIG_ARCH_OMAP3 | 130 | #ifdef CONFIG_ARCH_OMAP3 |
123 | void omap3xxx_restart(char mode, const char *cmd); | 131 | void omap3xxx_restart(char mode, const char *cmd); |
124 | #else | 132 | #else |
diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c index 22590dbe8f14..80392fca86c6 100644 --- a/arch/arm/mach-omap2/cpuidle34xx.c +++ b/arch/arm/mach-omap2/cpuidle34xx.c | |||
@@ -36,40 +36,66 @@ | |||
36 | 36 | ||
37 | /* Mach specific information to be recorded in the C-state driver_data */ | 37 | /* Mach specific information to be recorded in the C-state driver_data */ |
38 | struct omap3_idle_statedata { | 38 | struct omap3_idle_statedata { |
39 | u32 mpu_state; | 39 | u8 mpu_state; |
40 | u32 core_state; | 40 | u8 core_state; |
41 | u8 per_min_state; | ||
42 | u8 flags; | ||
41 | }; | 43 | }; |
42 | 44 | ||
43 | static struct powerdomain *mpu_pd, *core_pd, *per_pd, *cam_pd; | 45 | static struct powerdomain *mpu_pd, *core_pd, *per_pd, *cam_pd; |
44 | 46 | ||
47 | /* | ||
48 | * Possible flag bits for struct omap3_idle_statedata.flags: | ||
49 | * | ||
50 | * OMAP_CPUIDLE_CX_NO_CLKDM_IDLE: don't allow the MPU clockdomain to go | ||
51 | * inactive. This in turn prevents the MPU DPLL from entering autoidle | ||
52 | * mode, so wakeup latency is greatly reduced, at the cost of additional | ||
53 | * energy consumption. This also prevents the CORE clockdomain from | ||
54 | * entering idle. | ||
55 | */ | ||
56 | #define OMAP_CPUIDLE_CX_NO_CLKDM_IDLE BIT(0) | ||
57 | |||
58 | /* | ||
59 | * Prevent PER OFF if CORE is not in RETention or OFF as this would | ||
60 | * disable PER wakeups completely. | ||
61 | */ | ||
45 | static struct omap3_idle_statedata omap3_idle_data[] = { | 62 | static struct omap3_idle_statedata omap3_idle_data[] = { |
46 | { | 63 | { |
47 | .mpu_state = PWRDM_POWER_ON, | 64 | .mpu_state = PWRDM_POWER_ON, |
48 | .core_state = PWRDM_POWER_ON, | 65 | .core_state = PWRDM_POWER_ON, |
66 | /* In C1 do not allow PER state lower than CORE state */ | ||
67 | .per_min_state = PWRDM_POWER_ON, | ||
68 | .flags = OMAP_CPUIDLE_CX_NO_CLKDM_IDLE, | ||
49 | }, | 69 | }, |
50 | { | 70 | { |
51 | .mpu_state = PWRDM_POWER_ON, | 71 | .mpu_state = PWRDM_POWER_ON, |
52 | .core_state = PWRDM_POWER_ON, | 72 | .core_state = PWRDM_POWER_ON, |
73 | .per_min_state = PWRDM_POWER_RET, | ||
53 | }, | 74 | }, |
54 | { | 75 | { |
55 | .mpu_state = PWRDM_POWER_RET, | 76 | .mpu_state = PWRDM_POWER_RET, |
56 | .core_state = PWRDM_POWER_ON, | 77 | .core_state = PWRDM_POWER_ON, |
78 | .per_min_state = PWRDM_POWER_RET, | ||
57 | }, | 79 | }, |
58 | { | 80 | { |
59 | .mpu_state = PWRDM_POWER_OFF, | 81 | .mpu_state = PWRDM_POWER_OFF, |
60 | .core_state = PWRDM_POWER_ON, | 82 | .core_state = PWRDM_POWER_ON, |
83 | .per_min_state = PWRDM_POWER_RET, | ||
61 | }, | 84 | }, |
62 | { | 85 | { |
63 | .mpu_state = PWRDM_POWER_RET, | 86 | .mpu_state = PWRDM_POWER_RET, |
64 | .core_state = PWRDM_POWER_RET, | 87 | .core_state = PWRDM_POWER_RET, |
88 | .per_min_state = PWRDM_POWER_OFF, | ||
65 | }, | 89 | }, |
66 | { | 90 | { |
67 | .mpu_state = PWRDM_POWER_OFF, | 91 | .mpu_state = PWRDM_POWER_OFF, |
68 | .core_state = PWRDM_POWER_RET, | 92 | .core_state = PWRDM_POWER_RET, |
93 | .per_min_state = PWRDM_POWER_OFF, | ||
69 | }, | 94 | }, |
70 | { | 95 | { |
71 | .mpu_state = PWRDM_POWER_OFF, | 96 | .mpu_state = PWRDM_POWER_OFF, |
72 | .core_state = PWRDM_POWER_OFF, | 97 | .core_state = PWRDM_POWER_OFF, |
98 | .per_min_state = PWRDM_POWER_OFF, | ||
73 | }, | 99 | }, |
74 | }; | 100 | }; |
75 | 101 | ||
@@ -80,27 +106,25 @@ static int __omap3_enter_idle(struct cpuidle_device *dev, | |||
80 | int index) | 106 | int index) |
81 | { | 107 | { |
82 | struct omap3_idle_statedata *cx = &omap3_idle_data[index]; | 108 | struct omap3_idle_statedata *cx = &omap3_idle_data[index]; |
83 | u32 mpu_state = cx->mpu_state, core_state = cx->core_state; | ||
84 | 109 | ||
85 | local_fiq_disable(); | 110 | local_fiq_disable(); |
86 | 111 | ||
87 | pwrdm_set_next_pwrst(mpu_pd, mpu_state); | ||
88 | pwrdm_set_next_pwrst(core_pd, core_state); | ||
89 | |||
90 | if (omap_irq_pending() || need_resched()) | 112 | if (omap_irq_pending() || need_resched()) |
91 | goto return_sleep_time; | 113 | goto return_sleep_time; |
92 | 114 | ||
93 | /* Deny idle for C1 */ | 115 | /* Deny idle for C1 */ |
94 | if (index == 0) { | 116 | if (cx->flags & OMAP_CPUIDLE_CX_NO_CLKDM_IDLE) { |
95 | clkdm_deny_idle(mpu_pd->pwrdm_clkdms[0]); | 117 | clkdm_deny_idle(mpu_pd->pwrdm_clkdms[0]); |
96 | clkdm_deny_idle(core_pd->pwrdm_clkdms[0]); | 118 | } else { |
119 | pwrdm_set_next_pwrst(mpu_pd, cx->mpu_state); | ||
120 | pwrdm_set_next_pwrst(core_pd, cx->core_state); | ||
97 | } | 121 | } |
98 | 122 | ||
99 | /* | 123 | /* |
100 | * Call idle CPU PM enter notifier chain so that | 124 | * Call idle CPU PM enter notifier chain so that |
101 | * VFP context is saved. | 125 | * VFP context is saved. |
102 | */ | 126 | */ |
103 | if (mpu_state == PWRDM_POWER_OFF) | 127 | if (cx->mpu_state == PWRDM_POWER_OFF) |
104 | cpu_pm_enter(); | 128 | cpu_pm_enter(); |
105 | 129 | ||
106 | /* Execute ARM wfi */ | 130 | /* Execute ARM wfi */ |
@@ -110,17 +134,15 @@ static int __omap3_enter_idle(struct cpuidle_device *dev, | |||
110 | * Call idle CPU PM enter notifier chain to restore | 134 | * Call idle CPU PM enter notifier chain to restore |
111 | * VFP context. | 135 | * VFP context. |
112 | */ | 136 | */ |
113 | if (pwrdm_read_prev_pwrst(mpu_pd) == PWRDM_POWER_OFF) | 137 | if (cx->mpu_state == PWRDM_POWER_OFF && |
138 | pwrdm_read_prev_pwrst(mpu_pd) == PWRDM_POWER_OFF) | ||
114 | cpu_pm_exit(); | 139 | cpu_pm_exit(); |
115 | 140 | ||
116 | /* Re-allow idle for C1 */ | 141 | /* Re-allow idle for C1 */ |
117 | if (index == 0) { | 142 | if (cx->flags & OMAP_CPUIDLE_CX_NO_CLKDM_IDLE) |
118 | clkdm_allow_idle(mpu_pd->pwrdm_clkdms[0]); | 143 | clkdm_allow_idle(mpu_pd->pwrdm_clkdms[0]); |
119 | clkdm_allow_idle(core_pd->pwrdm_clkdms[0]); | ||
120 | } | ||
121 | 144 | ||
122 | return_sleep_time: | 145 | return_sleep_time: |
123 | |||
124 | local_fiq_enable(); | 146 | local_fiq_enable(); |
125 | 147 | ||
126 | return index; | 148 | return index; |
@@ -185,7 +207,7 @@ static int next_valid_state(struct cpuidle_device *dev, | |||
185 | * Start search from the next (lower) state. | 207 | * Start search from the next (lower) state. |
186 | */ | 208 | */ |
187 | for (idx = index - 1; idx >= 0; idx--) { | 209 | for (idx = index - 1; idx >= 0; idx--) { |
188 | cx = &omap3_idle_data[idx]; | 210 | cx = &omap3_idle_data[idx]; |
189 | if ((cx->mpu_state >= mpu_deepest_state) && | 211 | if ((cx->mpu_state >= mpu_deepest_state) && |
190 | (cx->core_state >= core_deepest_state)) { | 212 | (cx->core_state >= core_deepest_state)) { |
191 | next_index = idx; | 213 | next_index = idx; |
@@ -209,10 +231,9 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev, | |||
209 | struct cpuidle_driver *drv, | 231 | struct cpuidle_driver *drv, |
210 | int index) | 232 | int index) |
211 | { | 233 | { |
212 | int new_state_idx; | 234 | int new_state_idx, ret; |
213 | u32 core_next_state, per_next_state = 0, per_saved_state = 0; | 235 | u8 per_next_state, per_saved_state; |
214 | struct omap3_idle_statedata *cx; | 236 | struct omap3_idle_statedata *cx; |
215 | int ret; | ||
216 | 237 | ||
217 | /* | 238 | /* |
218 | * Use only C1 if CAM is active. | 239 | * Use only C1 if CAM is active. |
@@ -233,25 +254,13 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev, | |||
233 | 254 | ||
234 | /* Program PER state */ | 255 | /* Program PER state */ |
235 | cx = &omap3_idle_data[new_state_idx]; | 256 | cx = &omap3_idle_data[new_state_idx]; |
236 | core_next_state = cx->core_state; | ||
237 | per_next_state = per_saved_state = pwrdm_read_next_pwrst(per_pd); | ||
238 | if (new_state_idx == 0) { | ||
239 | /* In C1 do not allow PER state lower than CORE state */ | ||
240 | if (per_next_state < core_next_state) | ||
241 | per_next_state = core_next_state; | ||
242 | } else { | ||
243 | /* | ||
244 | * Prevent PER OFF if CORE is not in RETention or OFF as this | ||
245 | * would disable PER wakeups completely. | ||
246 | */ | ||
247 | if ((per_next_state == PWRDM_POWER_OFF) && | ||
248 | (core_next_state > PWRDM_POWER_RET)) | ||
249 | per_next_state = PWRDM_POWER_RET; | ||
250 | } | ||
251 | 257 | ||
252 | /* Are we changing PER target state? */ | 258 | per_next_state = pwrdm_read_next_pwrst(per_pd); |
253 | if (per_next_state != per_saved_state) | 259 | per_saved_state = per_next_state; |
260 | if (per_next_state < cx->per_min_state) { | ||
261 | per_next_state = cx->per_min_state; | ||
254 | pwrdm_set_next_pwrst(per_pd, per_next_state); | 262 | pwrdm_set_next_pwrst(per_pd, per_next_state); |
263 | } | ||
255 | 264 | ||
256 | ret = omap3_enter_idle(dev, drv, new_state_idx); | 265 | ret = omap3_enter_idle(dev, drv, new_state_idx); |
257 | 266 | ||
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 626f3ea3142f..1ec7f0597710 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/pinctrl/machine.h> | 20 | #include <linux/pinctrl/machine.h> |
21 | #include <linux/platform_data/omap4-keypad.h> | 21 | #include <linux/platform_data/omap4-keypad.h> |
22 | #include <linux/platform_data/omap_ocp2scp.h> | 22 | #include <linux/platform_data/omap_ocp2scp.h> |
23 | #include <linux/usb/omap_control_usb.h> | ||
23 | 24 | ||
24 | #include <asm/mach-types.h> | 25 | #include <asm/mach-types.h> |
25 | #include <asm/mach/map.h> | 26 | #include <asm/mach/map.h> |
@@ -61,14 +62,13 @@ static int __init omap3_l3_init(void) | |||
61 | if (!oh) | 62 | if (!oh) |
62 | pr_err("could not look up %s\n", oh_name); | 63 | pr_err("could not look up %s\n", oh_name); |
63 | 64 | ||
64 | pdev = omap_device_build("omap_l3_smx", 0, oh, NULL, 0, | 65 | pdev = omap_device_build("omap_l3_smx", 0, oh, NULL, 0); |
65 | NULL, 0, 0); | ||
66 | 66 | ||
67 | WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name); | 67 | WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name); |
68 | 68 | ||
69 | return IS_ERR(pdev) ? PTR_ERR(pdev) : 0; | 69 | return IS_ERR(pdev) ? PTR_ERR(pdev) : 0; |
70 | } | 70 | } |
71 | postcore_initcall(omap3_l3_init); | 71 | omap_postcore_initcall(omap3_l3_init); |
72 | 72 | ||
73 | static int __init omap4_l3_init(void) | 73 | static int __init omap4_l3_init(void) |
74 | { | 74 | { |
@@ -96,14 +96,13 @@ static int __init omap4_l3_init(void) | |||
96 | pr_err("could not look up %s\n", oh_name); | 96 | pr_err("could not look up %s\n", oh_name); |
97 | } | 97 | } |
98 | 98 | ||
99 | pdev = omap_device_build_ss("omap_l3_noc", 0, oh, 3, NULL, | 99 | pdev = omap_device_build_ss("omap_l3_noc", 0, oh, 3, NULL, 0); |
100 | 0, NULL, 0, 0); | ||
101 | 100 | ||
102 | WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name); | 101 | WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name); |
103 | 102 | ||
104 | return IS_ERR(pdev) ? PTR_ERR(pdev) : 0; | 103 | return IS_ERR(pdev) ? PTR_ERR(pdev) : 0; |
105 | } | 104 | } |
106 | postcore_initcall(omap4_l3_init); | 105 | omap_postcore_initcall(omap4_l3_init); |
107 | 106 | ||
108 | #if defined(CONFIG_VIDEO_OMAP2) || defined(CONFIG_VIDEO_OMAP2_MODULE) | 107 | #if defined(CONFIG_VIDEO_OMAP2) || defined(CONFIG_VIDEO_OMAP2_MODULE) |
109 | 108 | ||
@@ -254,6 +253,49 @@ static inline void omap_init_camera(void) | |||
254 | #endif | 253 | #endif |
255 | } | 254 | } |
256 | 255 | ||
256 | #if IS_ENABLED(CONFIG_OMAP_CONTROL_USB) | ||
257 | static struct omap_control_usb_platform_data omap4_control_usb_pdata = { | ||
258 | .type = 1, | ||
259 | }; | ||
260 | |||
261 | struct resource omap4_control_usb_res[] = { | ||
262 | { | ||
263 | .name = "control_dev_conf", | ||
264 | .start = 0x4a002300, | ||
265 | .end = 0x4a002303, | ||
266 | .flags = IORESOURCE_MEM, | ||
267 | }, | ||
268 | { | ||
269 | .name = "otghs_control", | ||
270 | .start = 0x4a00233c, | ||
271 | .end = 0x4a00233f, | ||
272 | .flags = IORESOURCE_MEM, | ||
273 | }, | ||
274 | }; | ||
275 | |||
276 | static struct platform_device omap4_control_usb = { | ||
277 | .name = "omap-control-usb", | ||
278 | .id = -1, | ||
279 | .dev = { | ||
280 | .platform_data = &omap4_control_usb_pdata, | ||
281 | }, | ||
282 | .num_resources = 2, | ||
283 | .resource = omap4_control_usb_res, | ||
284 | }; | ||
285 | |||
286 | static inline void __init omap_init_control_usb(void) | ||
287 | { | ||
288 | if (!cpu_is_omap44xx()) | ||
289 | return; | ||
290 | |||
291 | if (platform_device_register(&omap4_control_usb)) | ||
292 | pr_err("Error registering omap_control_usb device\n"); | ||
293 | } | ||
294 | |||
295 | #else | ||
296 | static inline void omap_init_control_usb(void) { } | ||
297 | #endif /* CONFIG_OMAP_CONTROL_USB */ | ||
298 | |||
257 | int __init omap4_keyboard_init(struct omap4_keypad_platform_data | 299 | int __init omap4_keyboard_init(struct omap4_keypad_platform_data |
258 | *sdp4430_keypad_data, struct omap_board_data *bdata) | 300 | *sdp4430_keypad_data, struct omap_board_data *bdata) |
259 | { | 301 | { |
@@ -273,7 +315,7 @@ int __init omap4_keyboard_init(struct omap4_keypad_platform_data | |||
273 | keypad_data = sdp4430_keypad_data; | 315 | keypad_data = sdp4430_keypad_data; |
274 | 316 | ||
275 | pdev = omap_device_build(name, id, oh, keypad_data, | 317 | pdev = omap_device_build(name, id, oh, keypad_data, |
276 | sizeof(struct omap4_keypad_platform_data), NULL, 0, 0); | 318 | sizeof(struct omap4_keypad_platform_data)); |
277 | 319 | ||
278 | if (IS_ERR(pdev)) { | 320 | if (IS_ERR(pdev)) { |
279 | WARN(1, "Can't build omap_device for %s:%s.\n", | 321 | WARN(1, "Can't build omap_device for %s:%s.\n", |
@@ -297,7 +339,7 @@ static inline void __init omap_init_mbox(void) | |||
297 | return; | 339 | return; |
298 | } | 340 | } |
299 | 341 | ||
300 | pdev = omap_device_build("omap-mailbox", -1, oh, NULL, 0, NULL, 0, 0); | 342 | pdev = omap_device_build("omap-mailbox", -1, oh, NULL, 0); |
301 | WARN(IS_ERR(pdev), "%s: could not build device, err %ld\n", | 343 | WARN(IS_ERR(pdev), "%s: could not build device, err %ld\n", |
302 | __func__, PTR_ERR(pdev)); | 344 | __func__, PTR_ERR(pdev)); |
303 | } | 345 | } |
@@ -337,7 +379,7 @@ static void __init omap_init_mcpdm(void) | |||
337 | return; | 379 | return; |
338 | } | 380 | } |
339 | 381 | ||
340 | pdev = omap_device_build("omap-mcpdm", -1, oh, NULL, 0, NULL, 0, 0); | 382 | pdev = omap_device_build("omap-mcpdm", -1, oh, NULL, 0); |
341 | WARN(IS_ERR(pdev), "Can't build omap_device for omap-mcpdm.\n"); | 383 | WARN(IS_ERR(pdev), "Can't build omap_device for omap-mcpdm.\n"); |
342 | } | 384 | } |
343 | #else | 385 | #else |
@@ -358,7 +400,7 @@ static void __init omap_init_dmic(void) | |||
358 | return; | 400 | return; |
359 | } | 401 | } |
360 | 402 | ||
361 | pdev = omap_device_build("omap-dmic", -1, oh, NULL, 0, NULL, 0, 0); | 403 | pdev = omap_device_build("omap-dmic", -1, oh, NULL, 0); |
362 | WARN(IS_ERR(pdev), "Can't build omap_device for omap-dmic.\n"); | 404 | WARN(IS_ERR(pdev), "Can't build omap_device for omap-dmic.\n"); |
363 | } | 405 | } |
364 | #else | 406 | #else |
@@ -384,8 +426,7 @@ static void __init omap_init_hdmi_audio(void) | |||
384 | return; | 426 | return; |
385 | } | 427 | } |
386 | 428 | ||
387 | pdev = omap_device_build("omap-hdmi-audio-dai", | 429 | pdev = omap_device_build("omap-hdmi-audio-dai", -1, oh, NULL, 0); |
388 | -1, oh, NULL, 0, NULL, 0, 0); | ||
389 | WARN(IS_ERR(pdev), | 430 | WARN(IS_ERR(pdev), |
390 | "Can't build omap_device for omap-hdmi-audio-dai.\n"); | 431 | "Can't build omap_device for omap-hdmi-audio-dai.\n"); |
391 | 432 | ||
@@ -429,8 +470,7 @@ static int __init omap_mcspi_init(struct omap_hwmod *oh, void *unused) | |||
429 | } | 470 | } |
430 | 471 | ||
431 | spi_num++; | 472 | spi_num++; |
432 | pdev = omap_device_build(name, spi_num, oh, pdata, | 473 | pdev = omap_device_build(name, spi_num, oh, pdata, sizeof(*pdata)); |
433 | sizeof(*pdata), NULL, 0, 0); | ||
434 | WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s\n", | 474 | WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s\n", |
435 | name, oh->name); | 475 | name, oh->name); |
436 | kfree(pdata); | 476 | kfree(pdata); |
@@ -460,7 +500,7 @@ static void omap_init_rng(void) | |||
460 | if (!oh) | 500 | if (!oh) |
461 | return; | 501 | return; |
462 | 502 | ||
463 | pdev = omap_device_build("omap_rng", -1, oh, NULL, 0, NULL, 0, 0); | 503 | pdev = omap_device_build("omap_rng", -1, oh, NULL, 0); |
464 | WARN(IS_ERR(pdev), "Can't build omap_device for omap_rng\n"); | 504 | WARN(IS_ERR(pdev), "Can't build omap_device for omap_rng\n"); |
465 | } | 505 | } |
466 | 506 | ||
@@ -689,8 +729,7 @@ static void __init omap_init_ocp2scp(void) | |||
689 | 729 | ||
690 | pdata->dev_cnt = dev_cnt; | 730 | pdata->dev_cnt = dev_cnt; |
691 | 731 | ||
692 | pdev = omap_device_build(name, bus_id, oh, pdata, sizeof(*pdata), NULL, | 732 | pdev = omap_device_build(name, bus_id, oh, pdata, sizeof(*pdata)); |
693 | 0, false); | ||
694 | if (IS_ERR(pdev)) { | 733 | if (IS_ERR(pdev)) { |
695 | pr_err("Could not build omap_device for %s %s\n", | 734 | pr_err("Could not build omap_device for %s %s\n", |
696 | name, oh_name); | 735 | name, oh_name); |
@@ -721,6 +760,7 @@ static int __init omap2_init_devices(void) | |||
721 | omap_init_mbox(); | 760 | omap_init_mbox(); |
722 | /* If dtb is there, the devices will be created dynamically */ | 761 | /* If dtb is there, the devices will be created dynamically */ |
723 | if (!of_have_populated_dt()) { | 762 | if (!of_have_populated_dt()) { |
763 | omap_init_control_usb(); | ||
724 | omap_init_dmic(); | 764 | omap_init_dmic(); |
725 | omap_init_mcpdm(); | 765 | omap_init_mcpdm(); |
726 | omap_init_mcspi(); | 766 | omap_init_mcspi(); |
@@ -734,4 +774,4 @@ static int __init omap2_init_devices(void) | |||
734 | 774 | ||
735 | return 0; | 775 | return 0; |
736 | } | 776 | } |
737 | arch_initcall(omap2_init_devices); | 777 | omap_arch_initcall(omap2_init_devices); |
diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c index cc75aaf6e764..ff37be1f6f93 100644 --- a/arch/arm/mach-omap2/display.c +++ b/arch/arm/mach-omap2/display.c | |||
@@ -226,7 +226,7 @@ static struct platform_device *create_dss_pdev(const char *pdev_name, | |||
226 | dev_set_name(&pdev->dev, "%s", pdev->name); | 226 | dev_set_name(&pdev->dev, "%s", pdev->name); |
227 | 227 | ||
228 | ohs[0] = oh; | 228 | ohs[0] = oh; |
229 | od = omap_device_alloc(pdev, ohs, 1, NULL, 0); | 229 | od = omap_device_alloc(pdev, ohs, 1); |
230 | if (IS_ERR(od)) { | 230 | if (IS_ERR(od)) { |
231 | pr_err("Could not alloc omap_device for %s\n", pdev_name); | 231 | pr_err("Could not alloc omap_device for %s\n", pdev_name); |
232 | r = -ENOMEM; | 232 | r = -ENOMEM; |
diff --git a/arch/arm/mach-omap2/dma.c b/arch/arm/mach-omap2/dma.c index 612b98249873..dab9fc014b97 100644 --- a/arch/arm/mach-omap2/dma.c +++ b/arch/arm/mach-omap2/dma.c | |||
@@ -27,7 +27,7 @@ | |||
27 | #include <linux/module.h> | 27 | #include <linux/module.h> |
28 | #include <linux/init.h> | 28 | #include <linux/init.h> |
29 | #include <linux/device.h> | 29 | #include <linux/device.h> |
30 | 30 | #include <linux/dma-mapping.h> | |
31 | #include <linux/omap-dma.h> | 31 | #include <linux/omap-dma.h> |
32 | 32 | ||
33 | #include "soc.h" | 33 | #include "soc.h" |
@@ -248,7 +248,7 @@ static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused) | |||
248 | 248 | ||
249 | p->errata = configure_dma_errata(); | 249 | p->errata = configure_dma_errata(); |
250 | 250 | ||
251 | pdev = omap_device_build(name, 0, oh, p, sizeof(*p), NULL, 0, 0); | 251 | pdev = omap_device_build(name, 0, oh, p, sizeof(*p)); |
252 | kfree(p); | 252 | kfree(p); |
253 | if (IS_ERR(pdev)) { | 253 | if (IS_ERR(pdev)) { |
254 | pr_err("%s: Can't build omap_device for %s:%s.\n", | 254 | pr_err("%s: Can't build omap_device for %s:%s.\n", |
@@ -288,9 +288,26 @@ static int __init omap2_system_dma_init_dev(struct omap_hwmod *oh, void *unused) | |||
288 | return 0; | 288 | return 0; |
289 | } | 289 | } |
290 | 290 | ||
291 | static const struct platform_device_info omap_dma_dev_info = { | ||
292 | .name = "omap-dma-engine", | ||
293 | .id = -1, | ||
294 | .dma_mask = DMA_BIT_MASK(32), | ||
295 | }; | ||
296 | |||
291 | static int __init omap2_system_dma_init(void) | 297 | static int __init omap2_system_dma_init(void) |
292 | { | 298 | { |
293 | return omap_hwmod_for_each_by_class("dma", | 299 | struct platform_device *pdev; |
300 | int res; | ||
301 | |||
302 | res = omap_hwmod_for_each_by_class("dma", | ||
294 | omap2_system_dma_init_dev, NULL); | 303 | omap2_system_dma_init_dev, NULL); |
304 | if (res) | ||
305 | return res; | ||
306 | |||
307 | pdev = platform_device_register_full(&omap_dma_dev_info); | ||
308 | if (IS_ERR(pdev)) | ||
309 | return PTR_ERR(pdev); | ||
310 | |||
311 | return res; | ||
295 | } | 312 | } |
296 | arch_initcall(omap2_system_dma_init); | 313 | omap_arch_initcall(omap2_system_dma_init); |
diff --git a/arch/arm/mach-omap2/dpll3xxx.c b/arch/arm/mach-omap2/dpll3xxx.c index 0a02aab5df67..3aed4b0b9563 100644 --- a/arch/arm/mach-omap2/dpll3xxx.c +++ b/arch/arm/mach-omap2/dpll3xxx.c | |||
@@ -500,8 +500,9 @@ int omap3_noncore_dpll_set_rate(struct clk_hw *hw, unsigned long rate, | |||
500 | if (dd->last_rounded_rate == 0) | 500 | if (dd->last_rounded_rate == 0) |
501 | return -EINVAL; | 501 | return -EINVAL; |
502 | 502 | ||
503 | /* No freqsel on OMAP4 and OMAP3630 */ | 503 | /* No freqsel on AM335x, OMAP4 and OMAP3630 */ |
504 | if (!cpu_is_omap44xx() && !cpu_is_omap3630()) { | 504 | if (!soc_is_am33xx() && !cpu_is_omap44xx() && |
505 | !cpu_is_omap3630()) { | ||
505 | freqsel = _omap3_dpll_compute_freqsel(clk, | 506 | freqsel = _omap3_dpll_compute_freqsel(clk, |
506 | dd->last_rounded_n); | 507 | dd->last_rounded_n); |
507 | WARN_ON(!freqsel); | 508 | WARN_ON(!freqsel); |
diff --git a/arch/arm/mach-omap2/drm.c b/arch/arm/mach-omap2/drm.c index 2a2cfa88ddbf..59a4af779f42 100644 --- a/arch/arm/mach-omap2/drm.c +++ b/arch/arm/mach-omap2/drm.c | |||
@@ -51,8 +51,7 @@ static int __init omap_init_drm(void) | |||
51 | oh = omap_hwmod_lookup("dmm"); | 51 | oh = omap_hwmod_lookup("dmm"); |
52 | 52 | ||
53 | if (oh) { | 53 | if (oh) { |
54 | pdev = omap_device_build(oh->name, -1, oh, NULL, 0, NULL, 0, | 54 | pdev = omap_device_build(oh->name, -1, oh, NULL, 0); |
55 | false); | ||
56 | WARN(IS_ERR(pdev), "Could not build omap_device for %s\n", | 55 | WARN(IS_ERR(pdev), "Could not build omap_device for %s\n", |
57 | oh->name); | 56 | oh->name); |
58 | } | 57 | } |
@@ -63,6 +62,6 @@ static int __init omap_init_drm(void) | |||
63 | 62 | ||
64 | } | 63 | } |
65 | 64 | ||
66 | arch_initcall(omap_init_drm); | 65 | omap_arch_initcall(omap_init_drm); |
67 | 66 | ||
68 | #endif | 67 | #endif |
diff --git a/arch/arm/mach-omap2/emu.c b/arch/arm/mach-omap2/emu.c index b3566f68a559..cbeaca2d7695 100644 --- a/arch/arm/mach-omap2/emu.c +++ b/arch/arm/mach-omap2/emu.c | |||
@@ -47,4 +47,4 @@ static int __init emu_init(void) | |||
47 | return 0; | 47 | return 0; |
48 | } | 48 | } |
49 | 49 | ||
50 | subsys_initcall(emu_init); | 50 | omap_subsys_initcall(emu_init); |
diff --git a/arch/arm/mach-omap2/fb.c b/arch/arm/mach-omap2/fb.c index d9bd965f6d07..190ae493c6ef 100644 --- a/arch/arm/mach-omap2/fb.c +++ b/arch/arm/mach-omap2/fb.c | |||
@@ -89,7 +89,7 @@ static int __init omap_init_vrfb(void) | |||
89 | return 0; | 89 | return 0; |
90 | } | 90 | } |
91 | 91 | ||
92 | arch_initcall(omap_init_vrfb); | 92 | omap_arch_initcall(omap_init_vrfb); |
93 | #endif | 93 | #endif |
94 | 94 | ||
95 | #if defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE) | 95 | #if defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE) |
@@ -113,6 +113,6 @@ static int __init omap_init_fb(void) | |||
113 | return platform_device_register(&omap_fb_device); | 113 | return platform_device_register(&omap_fb_device); |
114 | } | 114 | } |
115 | 115 | ||
116 | arch_initcall(omap_init_fb); | 116 | omap_arch_initcall(omap_init_fb); |
117 | 117 | ||
118 | #endif | 118 | #endif |
diff --git a/arch/arm/mach-omap2/gpio.c b/arch/arm/mach-omap2/gpio.c index 399acabc3d0b..7a577145b68b 100644 --- a/arch/arm/mach-omap2/gpio.c +++ b/arch/arm/mach-omap2/gpio.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/of.h> | 23 | #include <linux/of.h> |
24 | #include <linux/platform_data/gpio-omap.h> | 24 | #include <linux/platform_data/gpio-omap.h> |
25 | 25 | ||
26 | #include "soc.h" | ||
26 | #include "omap_hwmod.h" | 27 | #include "omap_hwmod.h" |
27 | #include "omap_device.h" | 28 | #include "omap_device.h" |
28 | #include "omap-pm.h" | 29 | #include "omap-pm.h" |
@@ -131,8 +132,7 @@ static int __init omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused) | |||
131 | pwrdm = omap_hwmod_get_pwrdm(oh); | 132 | pwrdm = omap_hwmod_get_pwrdm(oh); |
132 | pdata->loses_context = pwrdm_can_ever_lose_context(pwrdm); | 133 | pdata->loses_context = pwrdm_can_ever_lose_context(pwrdm); |
133 | 134 | ||
134 | pdev = omap_device_build(name, id - 1, oh, pdata, | 135 | pdev = omap_device_build(name, id - 1, oh, pdata, sizeof(*pdata)); |
135 | sizeof(*pdata), NULL, 0, false); | ||
136 | kfree(pdata); | 136 | kfree(pdata); |
137 | 137 | ||
138 | if (IS_ERR(pdev)) { | 138 | if (IS_ERR(pdev)) { |
@@ -147,7 +147,7 @@ static int __init omap2_gpio_dev_init(struct omap_hwmod *oh, void *unused) | |||
147 | /* | 147 | /* |
148 | * gpio_init needs to be done before | 148 | * gpio_init needs to be done before |
149 | * machine_init functions access gpio APIs. | 149 | * machine_init functions access gpio APIs. |
150 | * Hence gpio_init is a postcore_initcall. | 150 | * Hence gpio_init is a omap_postcore_initcall. |
151 | */ | 151 | */ |
152 | static int __init omap2_gpio_init(void) | 152 | static int __init omap2_gpio_init(void) |
153 | { | 153 | { |
@@ -157,4 +157,4 @@ static int __init omap2_gpio_init(void) | |||
157 | 157 | ||
158 | return omap_hwmod_for_each_by_class("gpio", omap2_gpio_dev_init, NULL); | 158 | return omap_hwmod_for_each_by_class("gpio", omap2_gpio_dev_init, NULL); |
159 | } | 159 | } |
160 | postcore_initcall(omap2_gpio_init); | 160 | omap_postcore_initcall(omap2_gpio_init); |
diff --git a/arch/arm/mach-omap2/gpmc-nand.c b/arch/arm/mach-omap2/gpmc-nand.c index db969a5c4998..afc1e8c32d6c 100644 --- a/arch/arm/mach-omap2/gpmc-nand.c +++ b/arch/arm/mach-omap2/gpmc-nand.c | |||
@@ -89,20 +89,21 @@ static int omap2_nand_gpmc_retime( | |||
89 | return 0; | 89 | return 0; |
90 | } | 90 | } |
91 | 91 | ||
92 | static bool __init gpmc_hwecc_bch_capable(enum omap_ecc ecc_opt) | 92 | static bool gpmc_hwecc_bch_capable(enum omap_ecc ecc_opt) |
93 | { | 93 | { |
94 | /* support only OMAP3 class */ | 94 | /* support only OMAP3 class */ |
95 | if (!cpu_is_omap34xx()) { | 95 | if (!cpu_is_omap34xx() && !soc_is_am33xx()) { |
96 | pr_err("BCH ecc is not supported on this CPU\n"); | 96 | pr_err("BCH ecc is not supported on this CPU\n"); |
97 | return 0; | 97 | return 0; |
98 | } | 98 | } |
99 | 99 | ||
100 | /* | 100 | /* |
101 | * For now, assume 4-bit mode is only supported on OMAP3630 ES1.x, x>=1. | 101 | * For now, assume 4-bit mode is only supported on OMAP3630 ES1.x, x>=1 |
102 | * Other chips may be added if confirmed to work. | 102 | * and AM33xx derivates. Other chips may be added if confirmed to work. |
103 | */ | 103 | */ |
104 | if ((ecc_opt == OMAP_ECC_BCH4_CODE_HW) && | 104 | if ((ecc_opt == OMAP_ECC_BCH4_CODE_HW) && |
105 | (!cpu_is_omap3630() || (GET_OMAP_REVISION() == 0))) { | 105 | (!cpu_is_omap3630() || (GET_OMAP_REVISION() == 0)) && |
106 | (!soc_is_am33xx())) { | ||
106 | pr_err("BCH 4-bit mode is not supported on this CPU\n"); | 107 | pr_err("BCH 4-bit mode is not supported on this CPU\n"); |
107 | return 0; | 108 | return 0; |
108 | } | 109 | } |
@@ -110,8 +111,8 @@ static bool __init gpmc_hwecc_bch_capable(enum omap_ecc ecc_opt) | |||
110 | return 1; | 111 | return 1; |
111 | } | 112 | } |
112 | 113 | ||
113 | int __init gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data, | 114 | int gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data, |
114 | struct gpmc_timings *gpmc_t) | 115 | struct gpmc_timings *gpmc_t) |
115 | { | 116 | { |
116 | int err = 0; | 117 | int err = 0; |
117 | struct device *dev = &gpmc_nand_device.dev; | 118 | struct device *dev = &gpmc_nand_device.dev; |
diff --git a/arch/arm/mach-omap2/gpmc-onenand.c b/arch/arm/mach-omap2/gpmc-onenand.c index 7f369b4f3917..0d75889c0a6f 100644 --- a/arch/arm/mach-omap2/gpmc-onenand.c +++ b/arch/arm/mach-omap2/gpmc-onenand.c | |||
@@ -356,7 +356,7 @@ static int gpmc_onenand_setup(void __iomem *onenand_base, int *freq_ptr) | |||
356 | return ret; | 356 | return ret; |
357 | } | 357 | } |
358 | 358 | ||
359 | void __init gpmc_onenand_init(struct omap_onenand_platform_data *_onenand_data) | 359 | void gpmc_onenand_init(struct omap_onenand_platform_data *_onenand_data) |
360 | { | 360 | { |
361 | int err; | 361 | int err; |
362 | 362 | ||
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index c0a2c26ed5a4..6de31739b45c 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c | |||
@@ -25,6 +25,10 @@ | |||
25 | #include <linux/module.h> | 25 | #include <linux/module.h> |
26 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
28 | #include <linux/of.h> | ||
29 | #include <linux/of_mtd.h> | ||
30 | #include <linux/of_device.h> | ||
31 | #include <linux/mtd/nand.h> | ||
28 | 32 | ||
29 | #include <linux/platform_data/mtd-nand-omap2.h> | 33 | #include <linux/platform_data/mtd-nand-omap2.h> |
30 | 34 | ||
@@ -34,6 +38,8 @@ | |||
34 | #include "common.h" | 38 | #include "common.h" |
35 | #include "omap_device.h" | 39 | #include "omap_device.h" |
36 | #include "gpmc.h" | 40 | #include "gpmc.h" |
41 | #include "gpmc-nand.h" | ||
42 | #include "gpmc-onenand.h" | ||
37 | 43 | ||
38 | #define DEVICE_NAME "omap-gpmc" | 44 | #define DEVICE_NAME "omap-gpmc" |
39 | 45 | ||
@@ -145,7 +151,8 @@ static unsigned gpmc_irq_start; | |||
145 | static struct resource gpmc_mem_root; | 151 | static struct resource gpmc_mem_root; |
146 | static struct resource gpmc_cs_mem[GPMC_CS_NUM]; | 152 | static struct resource gpmc_cs_mem[GPMC_CS_NUM]; |
147 | static DEFINE_SPINLOCK(gpmc_mem_lock); | 153 | static DEFINE_SPINLOCK(gpmc_mem_lock); |
148 | static unsigned int gpmc_cs_map; /* flag for cs which are initialized */ | 154 | /* Define chip-selects as reserved by default until probe completes */ |
155 | static unsigned int gpmc_cs_map = ((1 << GPMC_CS_NUM) - 1); | ||
149 | static struct device *gpmc_dev; | 156 | static struct device *gpmc_dev; |
150 | static int gpmc_irq; | 157 | static int gpmc_irq; |
151 | static resource_size_t phys_base, mem_size; | 158 | static resource_size_t phys_base, mem_size; |
@@ -783,9 +790,6 @@ static int gpmc_mem_init(void) | |||
783 | * even if we didn't boot from ROM. | 790 | * even if we didn't boot from ROM. |
784 | */ | 791 | */ |
785 | boot_rom_space = BOOT_ROM_SPACE; | 792 | boot_rom_space = BOOT_ROM_SPACE; |
786 | /* In apollon the CS0 is mapped as 0x0000 0000 */ | ||
787 | if (machine_is_omap_apollon()) | ||
788 | boot_rom_space = 0; | ||
789 | gpmc_mem_root.start = GPMC_MEM_START + boot_rom_space; | 793 | gpmc_mem_root.start = GPMC_MEM_START + boot_rom_space; |
790 | gpmc_mem_root.end = GPMC_MEM_END; | 794 | gpmc_mem_root.end = GPMC_MEM_END; |
791 | 795 | ||
@@ -1121,6 +1125,210 @@ int gpmc_calc_timings(struct gpmc_timings *gpmc_t, | |||
1121 | return 0; | 1125 | return 0; |
1122 | } | 1126 | } |
1123 | 1127 | ||
1128 | #ifdef CONFIG_OF | ||
1129 | static struct of_device_id gpmc_dt_ids[] = { | ||
1130 | { .compatible = "ti,omap2420-gpmc" }, | ||
1131 | { .compatible = "ti,omap2430-gpmc" }, | ||
1132 | { .compatible = "ti,omap3430-gpmc" }, /* omap3430 & omap3630 */ | ||
1133 | { .compatible = "ti,omap4430-gpmc" }, /* omap4430 & omap4460 & omap543x */ | ||
1134 | { .compatible = "ti,am3352-gpmc" }, /* am335x devices */ | ||
1135 | { } | ||
1136 | }; | ||
1137 | MODULE_DEVICE_TABLE(of, gpmc_dt_ids); | ||
1138 | |||
1139 | static void __maybe_unused gpmc_read_timings_dt(struct device_node *np, | ||
1140 | struct gpmc_timings *gpmc_t) | ||
1141 | { | ||
1142 | u32 val; | ||
1143 | |||
1144 | memset(gpmc_t, 0, sizeof(*gpmc_t)); | ||
1145 | |||
1146 | /* minimum clock period for syncronous mode */ | ||
1147 | if (!of_property_read_u32(np, "gpmc,sync-clk", &val)) | ||
1148 | gpmc_t->sync_clk = val; | ||
1149 | |||
1150 | /* chip select timtings */ | ||
1151 | if (!of_property_read_u32(np, "gpmc,cs-on", &val)) | ||
1152 | gpmc_t->cs_on = val; | ||
1153 | |||
1154 | if (!of_property_read_u32(np, "gpmc,cs-rd-off", &val)) | ||
1155 | gpmc_t->cs_rd_off = val; | ||
1156 | |||
1157 | if (!of_property_read_u32(np, "gpmc,cs-wr-off", &val)) | ||
1158 | gpmc_t->cs_wr_off = val; | ||
1159 | |||
1160 | /* ADV signal timings */ | ||
1161 | if (!of_property_read_u32(np, "gpmc,adv-on", &val)) | ||
1162 | gpmc_t->adv_on = val; | ||
1163 | |||
1164 | if (!of_property_read_u32(np, "gpmc,adv-rd-off", &val)) | ||
1165 | gpmc_t->adv_rd_off = val; | ||
1166 | |||
1167 | if (!of_property_read_u32(np, "gpmc,adv-wr-off", &val)) | ||
1168 | gpmc_t->adv_wr_off = val; | ||
1169 | |||
1170 | /* WE signal timings */ | ||
1171 | if (!of_property_read_u32(np, "gpmc,we-on", &val)) | ||
1172 | gpmc_t->we_on = val; | ||
1173 | |||
1174 | if (!of_property_read_u32(np, "gpmc,we-off", &val)) | ||
1175 | gpmc_t->we_off = val; | ||
1176 | |||
1177 | /* OE signal timings */ | ||
1178 | if (!of_property_read_u32(np, "gpmc,oe-on", &val)) | ||
1179 | gpmc_t->oe_on = val; | ||
1180 | |||
1181 | if (!of_property_read_u32(np, "gpmc,oe-off", &val)) | ||
1182 | gpmc_t->oe_off = val; | ||
1183 | |||
1184 | /* access and cycle timings */ | ||
1185 | if (!of_property_read_u32(np, "gpmc,page-burst-access", &val)) | ||
1186 | gpmc_t->page_burst_access = val; | ||
1187 | |||
1188 | if (!of_property_read_u32(np, "gpmc,access", &val)) | ||
1189 | gpmc_t->access = val; | ||
1190 | |||
1191 | if (!of_property_read_u32(np, "gpmc,rd-cycle", &val)) | ||
1192 | gpmc_t->rd_cycle = val; | ||
1193 | |||
1194 | if (!of_property_read_u32(np, "gpmc,wr-cycle", &val)) | ||
1195 | gpmc_t->wr_cycle = val; | ||
1196 | |||
1197 | /* only for OMAP3430 */ | ||
1198 | if (!of_property_read_u32(np, "gpmc,wr-access", &val)) | ||
1199 | gpmc_t->wr_access = val; | ||
1200 | |||
1201 | if (!of_property_read_u32(np, "gpmc,wr-data-mux-bus", &val)) | ||
1202 | gpmc_t->wr_data_mux_bus = val; | ||
1203 | } | ||
1204 | |||
1205 | #ifdef CONFIG_MTD_NAND | ||
1206 | |||
1207 | static const char * const nand_ecc_opts[] = { | ||
1208 | [OMAP_ECC_HAMMING_CODE_DEFAULT] = "sw", | ||
1209 | [OMAP_ECC_HAMMING_CODE_HW] = "hw", | ||
1210 | [OMAP_ECC_HAMMING_CODE_HW_ROMCODE] = "hw-romcode", | ||
1211 | [OMAP_ECC_BCH4_CODE_HW] = "bch4", | ||
1212 | [OMAP_ECC_BCH8_CODE_HW] = "bch8", | ||
1213 | }; | ||
1214 | |||
1215 | static int gpmc_probe_nand_child(struct platform_device *pdev, | ||
1216 | struct device_node *child) | ||
1217 | { | ||
1218 | u32 val; | ||
1219 | const char *s; | ||
1220 | struct gpmc_timings gpmc_t; | ||
1221 | struct omap_nand_platform_data *gpmc_nand_data; | ||
1222 | |||
1223 | if (of_property_read_u32(child, "reg", &val) < 0) { | ||
1224 | dev_err(&pdev->dev, "%s has no 'reg' property\n", | ||
1225 | child->full_name); | ||
1226 | return -ENODEV; | ||
1227 | } | ||
1228 | |||
1229 | gpmc_nand_data = devm_kzalloc(&pdev->dev, sizeof(*gpmc_nand_data), | ||
1230 | GFP_KERNEL); | ||
1231 | if (!gpmc_nand_data) | ||
1232 | return -ENOMEM; | ||
1233 | |||
1234 | gpmc_nand_data->cs = val; | ||
1235 | gpmc_nand_data->of_node = child; | ||
1236 | |||
1237 | if (!of_property_read_string(child, "ti,nand-ecc-opt", &s)) | ||
1238 | for (val = 0; val < ARRAY_SIZE(nand_ecc_opts); val++) | ||
1239 | if (!strcasecmp(s, nand_ecc_opts[val])) { | ||
1240 | gpmc_nand_data->ecc_opt = val; | ||
1241 | break; | ||
1242 | } | ||
1243 | |||
1244 | val = of_get_nand_bus_width(child); | ||
1245 | if (val == 16) | ||
1246 | gpmc_nand_data->devsize = NAND_BUSWIDTH_16; | ||
1247 | |||
1248 | gpmc_read_timings_dt(child, &gpmc_t); | ||
1249 | gpmc_nand_init(gpmc_nand_data, &gpmc_t); | ||
1250 | |||
1251 | return 0; | ||
1252 | } | ||
1253 | #else | ||
1254 | static int gpmc_probe_nand_child(struct platform_device *pdev, | ||
1255 | struct device_node *child) | ||
1256 | { | ||
1257 | return 0; | ||
1258 | } | ||
1259 | #endif | ||
1260 | |||
1261 | #ifdef CONFIG_MTD_ONENAND | ||
1262 | static int gpmc_probe_onenand_child(struct platform_device *pdev, | ||
1263 | struct device_node *child) | ||
1264 | { | ||
1265 | u32 val; | ||
1266 | struct omap_onenand_platform_data *gpmc_onenand_data; | ||
1267 | |||
1268 | if (of_property_read_u32(child, "reg", &val) < 0) { | ||
1269 | dev_err(&pdev->dev, "%s has no 'reg' property\n", | ||
1270 | child->full_name); | ||
1271 | return -ENODEV; | ||
1272 | } | ||
1273 | |||
1274 | gpmc_onenand_data = devm_kzalloc(&pdev->dev, sizeof(*gpmc_onenand_data), | ||
1275 | GFP_KERNEL); | ||
1276 | if (!gpmc_onenand_data) | ||
1277 | return -ENOMEM; | ||
1278 | |||
1279 | gpmc_onenand_data->cs = val; | ||
1280 | gpmc_onenand_data->of_node = child; | ||
1281 | gpmc_onenand_data->dma_channel = -1; | ||
1282 | |||
1283 | if (!of_property_read_u32(child, "dma-channel", &val)) | ||
1284 | gpmc_onenand_data->dma_channel = val; | ||
1285 | |||
1286 | gpmc_onenand_init(gpmc_onenand_data); | ||
1287 | |||
1288 | return 0; | ||
1289 | } | ||
1290 | #else | ||
1291 | static int gpmc_probe_onenand_child(struct platform_device *pdev, | ||
1292 | struct device_node *child) | ||
1293 | { | ||
1294 | return 0; | ||
1295 | } | ||
1296 | #endif | ||
1297 | |||
1298 | static int gpmc_probe_dt(struct platform_device *pdev) | ||
1299 | { | ||
1300 | int ret; | ||
1301 | struct device_node *child; | ||
1302 | const struct of_device_id *of_id = | ||
1303 | of_match_device(gpmc_dt_ids, &pdev->dev); | ||
1304 | |||
1305 | if (!of_id) | ||
1306 | return 0; | ||
1307 | |||
1308 | for_each_node_by_name(child, "nand") { | ||
1309 | ret = gpmc_probe_nand_child(pdev, child); | ||
1310 | if (ret < 0) { | ||
1311 | of_node_put(child); | ||
1312 | return ret; | ||
1313 | } | ||
1314 | } | ||
1315 | |||
1316 | for_each_node_by_name(child, "onenand") { | ||
1317 | ret = gpmc_probe_onenand_child(pdev, child); | ||
1318 | if (ret < 0) { | ||
1319 | of_node_put(child); | ||
1320 | return ret; | ||
1321 | } | ||
1322 | } | ||
1323 | return 0; | ||
1324 | } | ||
1325 | #else | ||
1326 | static int gpmc_probe_dt(struct platform_device *pdev) | ||
1327 | { | ||
1328 | return 0; | ||
1329 | } | ||
1330 | #endif | ||
1331 | |||
1124 | static int gpmc_probe(struct platform_device *pdev) | 1332 | static int gpmc_probe(struct platform_device *pdev) |
1125 | { | 1333 | { |
1126 | int rc; | 1334 | int rc; |
@@ -1134,11 +1342,9 @@ static int gpmc_probe(struct platform_device *pdev) | |||
1134 | phys_base = res->start; | 1342 | phys_base = res->start; |
1135 | mem_size = resource_size(res); | 1343 | mem_size = resource_size(res); |
1136 | 1344 | ||
1137 | gpmc_base = devm_request_and_ioremap(&pdev->dev, res); | 1345 | gpmc_base = devm_ioremap_resource(&pdev->dev, res); |
1138 | if (!gpmc_base) { | 1346 | if (IS_ERR(gpmc_base)) |
1139 | dev_err(&pdev->dev, "error: request memory / ioremap\n"); | 1347 | return PTR_ERR(gpmc_base); |
1140 | return -EADDRNOTAVAIL; | ||
1141 | } | ||
1142 | 1348 | ||
1143 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 1349 | res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); |
1144 | if (res == NULL) | 1350 | if (res == NULL) |
@@ -1174,6 +1380,17 @@ static int gpmc_probe(struct platform_device *pdev) | |||
1174 | if (gpmc_setup_irq() < 0) | 1380 | if (gpmc_setup_irq() < 0) |
1175 | dev_warn(gpmc_dev, "gpmc_setup_irq failed\n"); | 1381 | dev_warn(gpmc_dev, "gpmc_setup_irq failed\n"); |
1176 | 1382 | ||
1383 | /* Now the GPMC is initialised, unreserve the chip-selects */ | ||
1384 | gpmc_cs_map = 0; | ||
1385 | |||
1386 | rc = gpmc_probe_dt(pdev); | ||
1387 | if (rc < 0) { | ||
1388 | clk_disable_unprepare(gpmc_l3_clk); | ||
1389 | clk_put(gpmc_l3_clk); | ||
1390 | dev_err(gpmc_dev, "failed to probe DT parameters\n"); | ||
1391 | return rc; | ||
1392 | } | ||
1393 | |||
1177 | return 0; | 1394 | return 0; |
1178 | } | 1395 | } |
1179 | 1396 | ||
@@ -1191,6 +1408,7 @@ static struct platform_driver gpmc_driver = { | |||
1191 | .driver = { | 1408 | .driver = { |
1192 | .name = DEVICE_NAME, | 1409 | .name = DEVICE_NAME, |
1193 | .owner = THIS_MODULE, | 1410 | .owner = THIS_MODULE, |
1411 | .of_match_table = of_match_ptr(gpmc_dt_ids), | ||
1194 | }, | 1412 | }, |
1195 | }; | 1413 | }; |
1196 | 1414 | ||
@@ -1205,7 +1423,7 @@ static __exit void gpmc_exit(void) | |||
1205 | 1423 | ||
1206 | } | 1424 | } |
1207 | 1425 | ||
1208 | postcore_initcall(gpmc_init); | 1426 | omap_postcore_initcall(gpmc_init); |
1209 | module_exit(gpmc_exit); | 1427 | module_exit(gpmc_exit); |
1210 | 1428 | ||
1211 | static int __init omap_gpmc_init(void) | 1429 | static int __init omap_gpmc_init(void) |
@@ -1214,18 +1432,25 @@ static int __init omap_gpmc_init(void) | |||
1214 | struct platform_device *pdev; | 1432 | struct platform_device *pdev; |
1215 | char *oh_name = "gpmc"; | 1433 | char *oh_name = "gpmc"; |
1216 | 1434 | ||
1435 | /* | ||
1436 | * if the board boots up with a populated DT, do not | ||
1437 | * manually add the device from this initcall | ||
1438 | */ | ||
1439 | if (of_have_populated_dt()) | ||
1440 | return -ENODEV; | ||
1441 | |||
1217 | oh = omap_hwmod_lookup(oh_name); | 1442 | oh = omap_hwmod_lookup(oh_name); |
1218 | if (!oh) { | 1443 | if (!oh) { |
1219 | pr_err("Could not look up %s\n", oh_name); | 1444 | pr_err("Could not look up %s\n", oh_name); |
1220 | return -ENODEV; | 1445 | return -ENODEV; |
1221 | } | 1446 | } |
1222 | 1447 | ||
1223 | pdev = omap_device_build(DEVICE_NAME, -1, oh, NULL, 0, NULL, 0, 0); | 1448 | pdev = omap_device_build(DEVICE_NAME, -1, oh, NULL, 0); |
1224 | WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name); | 1449 | WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name); |
1225 | 1450 | ||
1226 | return IS_ERR(pdev) ? PTR_ERR(pdev) : 0; | 1451 | return IS_ERR(pdev) ? PTR_ERR(pdev) : 0; |
1227 | } | 1452 | } |
1228 | postcore_initcall(omap_gpmc_init); | 1453 | omap_postcore_initcall(omap_gpmc_init); |
1229 | 1454 | ||
1230 | static irqreturn_t gpmc_handle_irq(int irq, void *dev) | 1455 | static irqreturn_t gpmc_handle_irq(int irq, void *dev) |
1231 | { | 1456 | { |
diff --git a/arch/arm/mach-omap2/hdq1w.c b/arch/arm/mach-omap2/hdq1w.c index ab7bf181a105..cbc8e3c480e0 100644 --- a/arch/arm/mach-omap2/hdq1w.c +++ b/arch/arm/mach-omap2/hdq1w.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <linux/err.h> | 27 | #include <linux/err.h> |
28 | #include <linux/platform_device.h> | 28 | #include <linux/platform_device.h> |
29 | 29 | ||
30 | #include "soc.h" | ||
30 | #include "omap_hwmod.h" | 31 | #include "omap_hwmod.h" |
31 | #include "omap_device.h" | 32 | #include "omap_device.h" |
32 | #include "hdq1w.h" | 33 | #include "hdq1w.h" |
@@ -87,10 +88,10 @@ static int __init omap_init_hdq(void) | |||
87 | if (!oh) | 88 | if (!oh) |
88 | return 0; | 89 | return 0; |
89 | 90 | ||
90 | pdev = omap_device_build(devname, id, oh, NULL, 0, NULL, 0, 0); | 91 | pdev = omap_device_build(devname, id, oh, NULL, 0); |
91 | WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s.\n", | 92 | WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s.\n", |
92 | devname, oh->name); | 93 | devname, oh->name); |
93 | 94 | ||
94 | return 0; | 95 | return 0; |
95 | } | 96 | } |
96 | arch_initcall(omap_init_hdq); | 97 | omap_arch_initcall(omap_init_hdq); |
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c index 4a964338992a..2ef1f8714fcf 100644 --- a/arch/arm/mach-omap2/hsmmc.c +++ b/arch/arm/mach-omap2/hsmmc.c | |||
@@ -522,7 +522,7 @@ static void __init omap_hsmmc_init_one(struct omap2_hsmmc_info *hsmmcinfo, | |||
522 | } | 522 | } |
523 | dev_set_name(&pdev->dev, "%s.%d", pdev->name, pdev->id); | 523 | dev_set_name(&pdev->dev, "%s.%d", pdev->name, pdev->id); |
524 | 524 | ||
525 | od = omap_device_alloc(pdev, ohs, 1, NULL, 0); | 525 | od = omap_device_alloc(pdev, ohs, 1); |
526 | if (IS_ERR(od)) { | 526 | if (IS_ERR(od)) { |
527 | pr_err("Could not allocate od for %s\n", name); | 527 | pr_err("Could not allocate od for %s\n", name); |
528 | goto put_pdev; | 528 | goto put_pdev; |
diff --git a/arch/arm/mach-omap2/hwspinlock.c b/arch/arm/mach-omap2/hwspinlock.c index 1df9b5feda16..ef175acaeaa2 100644 --- a/arch/arm/mach-omap2/hwspinlock.c +++ b/arch/arm/mach-omap2/hwspinlock.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/err.h> | 21 | #include <linux/err.h> |
22 | #include <linux/hwspinlock.h> | 22 | #include <linux/hwspinlock.h> |
23 | 23 | ||
24 | #include "soc.h" | ||
24 | #include "omap_hwmod.h" | 25 | #include "omap_hwmod.h" |
25 | #include "omap_device.h" | 26 | #include "omap_device.h" |
26 | 27 | ||
@@ -46,8 +47,7 @@ static int __init hwspinlocks_init(void) | |||
46 | return -EINVAL; | 47 | return -EINVAL; |
47 | 48 | ||
48 | pdev = omap_device_build(dev_name, 0, oh, &omap_hwspinlock_pdata, | 49 | pdev = omap_device_build(dev_name, 0, oh, &omap_hwspinlock_pdata, |
49 | sizeof(struct hwspinlock_pdata), | 50 | sizeof(struct hwspinlock_pdata)); |
50 | NULL, 0, false); | ||
51 | if (IS_ERR(pdev)) { | 51 | if (IS_ERR(pdev)) { |
52 | pr_err("Can't build omap_device for %s:%s\n", dev_name, | 52 | pr_err("Can't build omap_device for %s:%s\n", dev_name, |
53 | oh_name); | 53 | oh_name); |
@@ -57,4 +57,4 @@ static int __init hwspinlocks_init(void) | |||
57 | return retval; | 57 | return retval; |
58 | } | 58 | } |
59 | /* early board code might need to reserve specific hwspinlock instances */ | 59 | /* early board code might need to reserve specific hwspinlock instances */ |
60 | postcore_initcall(hwspinlocks_init); | 60 | omap_postcore_initcall(hwspinlocks_init); |
diff --git a/arch/arm/mach-omap2/i2c.c b/arch/arm/mach-omap2/i2c.c index b9074dde3b9c..d940e53dd9f2 100644 --- a/arch/arm/mach-omap2/i2c.c +++ b/arch/arm/mach-omap2/i2c.c | |||
@@ -178,10 +178,14 @@ int __init omap_i2c_add_bus(struct omap_i2c_bus_platform_data *i2c_pdata, | |||
178 | if (cpu_is_omap34xx()) | 178 | if (cpu_is_omap34xx()) |
179 | pdata->set_mpu_wkup_lat = omap_pm_set_max_mpu_wakeup_lat_compat; | 179 | pdata->set_mpu_wkup_lat = omap_pm_set_max_mpu_wakeup_lat_compat; |
180 | pdev = omap_device_build(name, bus_id, oh, pdata, | 180 | pdev = omap_device_build(name, bus_id, oh, pdata, |
181 | sizeof(struct omap_i2c_bus_platform_data), | 181 | sizeof(struct omap_i2c_bus_platform_data)); |
182 | NULL, 0, 0); | ||
183 | WARN(IS_ERR(pdev), "Could not build omap_device for %s\n", name); | 182 | WARN(IS_ERR(pdev), "Could not build omap_device for %s\n", name); |
184 | 183 | ||
185 | return PTR_RET(pdev); | 184 | return PTR_RET(pdev); |
186 | } | 185 | } |
187 | 186 | ||
187 | static int __init omap_i2c_cmdline(void) | ||
188 | { | ||
189 | return omap_register_i2c_bus_cmdline(); | ||
190 | } | ||
191 | omap_subsys_initcall(omap_i2c_cmdline); | ||
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c index 45cc7ed4dd58..8a68f1ec66b9 100644 --- a/arch/arm/mach-omap2/id.c +++ b/arch/arm/mach-omap2/id.c | |||
@@ -399,8 +399,18 @@ void __init omap3xxx_check_revision(void) | |||
399 | } | 399 | } |
400 | break; | 400 | break; |
401 | case 0xb944: | 401 | case 0xb944: |
402 | omap_revision = AM335X_REV_ES1_0; | 402 | switch (rev) { |
403 | cpu_rev = "1.0"; | 403 | case 0: |
404 | omap_revision = AM335X_REV_ES1_0; | ||
405 | cpu_rev = "1.0"; | ||
406 | break; | ||
407 | case 1: | ||
408 | /* FALLTHROUGH */ | ||
409 | default: | ||
410 | omap_revision = AM335X_REV_ES2_0; | ||
411 | cpu_rev = "2.0"; | ||
412 | break; | ||
413 | } | ||
404 | break; | 414 | break; |
405 | case 0xb8f2: | 415 | case 0xb8f2: |
406 | switch (rev) { | 416 | switch (rev) { |
diff --git a/arch/arm/mach-omap2/include/mach/debug-macro.S b/arch/arm/mach-omap2/include/mach/debug-macro.S deleted file mode 100644 index cfaed13d0040..000000000000 --- a/arch/arm/mach-omap2/include/mach/debug-macro.S +++ /dev/null | |||
@@ -1,165 +0,0 @@ | |||
1 | /* arch/arm/mach-omap2/include/mach/debug-macro.S | ||
2 | * | ||
3 | * Debugging macro include header | ||
4 | * | ||
5 | * Copyright (C) 1994-1999 Russell King | ||
6 | * Moved from linux/arch/arm/kernel/debug.S by Ben Dooks | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | * | ||
12 | */ | ||
13 | |||
14 | #include <linux/serial_reg.h> | ||
15 | |||
16 | #include <mach/serial.h> | ||
17 | |||
18 | #define UART_OFFSET(addr) ((addr) & 0x00ffffff) | ||
19 | |||
20 | .pushsection .data | ||
21 | omap_uart_phys: .word 0 | ||
22 | omap_uart_virt: .word 0 | ||
23 | omap_uart_lsr: .word 0 | ||
24 | .popsection | ||
25 | |||
26 | /* | ||
27 | * Note that this code won't work if the bootloader passes | ||
28 | * a wrong machine ID number in r1. To debug, just hardcode | ||
29 | * the desired UART phys and virt addresses temporarily into | ||
30 | * the omap_uart_phys and omap_uart_virt above. | ||
31 | */ | ||
32 | .macro addruart, rp, rv, tmp | ||
33 | |||
34 | /* Use omap_uart_phys/virt if already configured */ | ||
35 | 10: adr \rp, 99f @ get effective addr of 99f | ||
36 | ldr \rv, [\rp] @ get absolute addr of 99f | ||
37 | sub \rv, \rv, \rp @ offset between the two | ||
38 | ldr \rp, [\rp, #4] @ abs addr of omap_uart_phys | ||
39 | sub \tmp, \rp, \rv @ make it effective | ||
40 | ldr \rp, [\tmp, #0] @ omap_uart_phys | ||
41 | ldr \rv, [\tmp, #4] @ omap_uart_virt | ||
42 | cmp \rp, #0 @ is port configured? | ||
43 | cmpne \rv, #0 | ||
44 | bne 100f @ already configured | ||
45 | |||
46 | /* Check the debug UART configuration set in uncompress.h */ | ||
47 | mov \rp, pc | ||
48 | ldr \rv, =OMAP_UART_INFO_OFS | ||
49 | and \rp, \rp, #0xff000000 | ||
50 | ldr \rp, [\rp, \rv] | ||
51 | |||
52 | /* Select the UART to use based on the UART1 scratchpad value */ | ||
53 | cmp \rp, #0 @ no port configured? | ||
54 | beq 21f @ if none, try to use UART1 | ||
55 | cmp \rp, #OMAP2UART1 @ OMAP2/3/4UART1 | ||
56 | beq 21f @ configure OMAP2/3/4UART1 | ||
57 | cmp \rp, #OMAP2UART2 @ OMAP2/3/4UART2 | ||
58 | beq 22f @ configure OMAP2/3/4UART2 | ||
59 | cmp \rp, #OMAP2UART3 @ only on 24xx | ||
60 | beq 23f @ configure OMAP2UART3 | ||
61 | cmp \rp, #OMAP3UART3 @ only on 34xx | ||
62 | beq 33f @ configure OMAP3UART3 | ||
63 | cmp \rp, #OMAP4UART3 @ only on 44xx/54xx | ||
64 | beq 43f @ configure OMAP4/5UART3 | ||
65 | cmp \rp, #OMAP3UART4 @ only on 36xx | ||
66 | beq 34f @ configure OMAP3UART4 | ||
67 | cmp \rp, #OMAP4UART4 @ only on 44xx/54xx | ||
68 | beq 44f @ configure OMAP4/5UART4 | ||
69 | cmp \rp, #TI81XXUART1 @ ti81Xx UART offsets different | ||
70 | beq 81f @ configure UART1 | ||
71 | cmp \rp, #TI81XXUART2 @ ti81Xx UART offsets different | ||
72 | beq 82f @ configure UART2 | ||
73 | cmp \rp, #TI81XXUART3 @ ti81Xx UART offsets different | ||
74 | beq 83f @ configure UART3 | ||
75 | cmp \rp, #AM33XXUART1 @ AM33XX UART offsets different | ||
76 | beq 84f @ configure UART1 | ||
77 | cmp \rp, #ZOOM_UART @ only on zoom2/3 | ||
78 | beq 95f @ configure ZOOM_UART | ||
79 | |||
80 | /* Configure the UART offset from the phys/virt base */ | ||
81 | 21: mov \rp, #UART_OFFSET(OMAP2_UART1_BASE) @ omap2/3/4 | ||
82 | b 98f | ||
83 | 22: mov \rp, #UART_OFFSET(OMAP2_UART2_BASE) @ omap2/3/4 | ||
84 | b 98f | ||
85 | 23: mov \rp, #UART_OFFSET(OMAP2_UART3_BASE) | ||
86 | b 98f | ||
87 | 33: mov \rp, #UART_OFFSET(OMAP3_UART1_BASE) | ||
88 | add \rp, \rp, #0x00fb0000 | ||
89 | add \rp, \rp, #0x00006000 @ OMAP3_UART3_BASE | ||
90 | b 98f | ||
91 | 34: mov \rp, #UART_OFFSET(OMAP3_UART1_BASE) | ||
92 | add \rp, \rp, #0x00fb0000 | ||
93 | add \rp, \rp, #0x00028000 @ OMAP3_UART4_BASE | ||
94 | b 98f | ||
95 | 43: mov \rp, #UART_OFFSET(OMAP4_UART3_BASE) | ||
96 | b 98f | ||
97 | 44: mov \rp, #UART_OFFSET(OMAP4_UART4_BASE) | ||
98 | b 98f | ||
99 | 81: mov \rp, #UART_OFFSET(TI81XX_UART1_BASE) | ||
100 | b 98f | ||
101 | 82: mov \rp, #UART_OFFSET(TI81XX_UART2_BASE) | ||
102 | b 98f | ||
103 | 83: mov \rp, #UART_OFFSET(TI81XX_UART3_BASE) | ||
104 | b 98f | ||
105 | 84: ldr \rp, =AM33XX_UART1_BASE | ||
106 | and \rp, \rp, #0x00ffffff | ||
107 | b 97f | ||
108 | 95: ldr \rp, =ZOOM_UART_BASE | ||
109 | str \rp, [\tmp, #0] @ omap_uart_phys | ||
110 | ldr \rp, =ZOOM_UART_VIRT | ||
111 | str \rp, [\tmp, #4] @ omap_uart_virt | ||
112 | mov \rp, #(UART_LSR << ZOOM_PORT_SHIFT) | ||
113 | str \rp, [\tmp, #8] @ omap_uart_lsr | ||
114 | b 10b | ||
115 | |||
116 | /* AM33XX: Store both phys and virt address for the uart */ | ||
117 | 97: add \rp, \rp, #0x44000000 @ phys base | ||
118 | str \rp, [\tmp, #0] @ omap_uart_phys | ||
119 | sub \rp, \rp, #0x44000000 @ phys base | ||
120 | add \rp, \rp, #0xf9000000 @ virt base | ||
121 | str \rp, [\tmp, #4] @ omap_uart_virt | ||
122 | mov \rp, #(UART_LSR << OMAP_PORT_SHIFT) | ||
123 | str \rp, [\tmp, #8] @ omap_uart_lsr | ||
124 | |||
125 | b 10b | ||
126 | |||
127 | /* Store both phys and virt address for the uart */ | ||
128 | 98: add \rp, \rp, #0x48000000 @ phys base | ||
129 | str \rp, [\tmp, #0] @ omap_uart_phys | ||
130 | sub \rp, \rp, #0x48000000 @ phys base | ||
131 | add \rp, \rp, #0xfa000000 @ virt base | ||
132 | str \rp, [\tmp, #4] @ omap_uart_virt | ||
133 | mov \rp, #(UART_LSR << OMAP_PORT_SHIFT) | ||
134 | str \rp, [\tmp, #8] @ omap_uart_lsr | ||
135 | |||
136 | b 10b | ||
137 | |||
138 | .align | ||
139 | 99: .word . | ||
140 | .word omap_uart_phys | ||
141 | .ltorg | ||
142 | |||
143 | 100: /* Pass the UART_LSR reg address */ | ||
144 | ldr \tmp, [\tmp, #8] @ omap_uart_lsr | ||
145 | add \rp, \rp, \tmp | ||
146 | add \rv, \rv, \tmp | ||
147 | .endm | ||
148 | |||
149 | .macro senduart,rd,rx | ||
150 | orr \rd, \rd, \rx, lsl #24 @ preserve LSR reg offset | ||
151 | bic \rx, \rx, #0xff @ get base (THR) reg address | ||
152 | strb \rd, [\rx] @ send lower byte of rd | ||
153 | orr \rx, \rx, \rd, lsr #24 @ restore original rx (LSR) | ||
154 | bic \rd, \rd, #(0xff << 24) @ restore original rd | ||
155 | .endm | ||
156 | |||
157 | .macro busyuart,rd,rx | ||
158 | 1001: ldrb \rd, [\rx] @ rx contains UART_LSR address | ||
159 | and \rd, \rd, #(UART_LSR_TEMT | UART_LSR_THRE) | ||
160 | teq \rd, #(UART_LSR_TEMT | UART_LSR_THRE) | ||
161 | bne 1001b | ||
162 | .endm | ||
163 | |||
164 | .macro waituart,rd,rx | ||
165 | .endm | ||
diff --git a/arch/arm/mach-omap2/include/mach/serial.h b/arch/arm/mach-omap2/include/mach/serial.h index 70eda00db7a4..7ca1fcff453b 100644 --- a/arch/arm/mach-omap2/include/mach/serial.h +++ b/arch/arm/mach-omap2/include/mach/serial.h | |||
@@ -8,20 +8,6 @@ | |||
8 | * GNU General Public License for more details. | 8 | * GNU General Public License for more details. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | /* | ||
12 | * Memory entry used for the DEBUG_LL UART configuration, relative to | ||
13 | * start of RAM. See also uncompress.h and debug-macro.S. | ||
14 | * | ||
15 | * Note that using a memory location for storing the UART configuration | ||
16 | * has at least two limitations: | ||
17 | * | ||
18 | * 1. Kernel uncompress code cannot overlap OMAP_UART_INFO as the | ||
19 | * uncompress code could then partially overwrite itself | ||
20 | * 2. We assume printascii is called at least once before paging_init, | ||
21 | * and addruart has a chance to read OMAP_UART_INFO | ||
22 | */ | ||
23 | #define OMAP_UART_INFO_OFS 0x3ffc | ||
24 | |||
25 | /* OMAP2 serial ports */ | 11 | /* OMAP2 serial ports */ |
26 | #define OMAP2_UART1_BASE 0x4806a000 | 12 | #define OMAP2_UART1_BASE 0x4806a000 |
27 | #define OMAP2_UART2_BASE 0x4806c000 | 13 | #define OMAP2_UART2_BASE 0x4806c000 |
@@ -68,29 +54,6 @@ | |||
68 | 54 | ||
69 | #define OMAP24XX_BASE_BAUD (48000000/16) | 55 | #define OMAP24XX_BASE_BAUD (48000000/16) |
70 | 56 | ||
71 | /* | ||
72 | * DEBUG_LL port encoding stored into the UART1 scratchpad register by | ||
73 | * decomp_setup in uncompress.h | ||
74 | */ | ||
75 | #define OMAP2UART1 21 | ||
76 | #define OMAP2UART2 22 | ||
77 | #define OMAP2UART3 23 | ||
78 | #define OMAP3UART1 OMAP2UART1 | ||
79 | #define OMAP3UART2 OMAP2UART2 | ||
80 | #define OMAP3UART3 33 | ||
81 | #define OMAP3UART4 34 /* Only on 36xx */ | ||
82 | #define OMAP4UART1 OMAP2UART1 | ||
83 | #define OMAP4UART2 OMAP2UART2 | ||
84 | #define OMAP4UART3 43 | ||
85 | #define OMAP4UART4 44 | ||
86 | #define TI81XXUART1 81 | ||
87 | #define TI81XXUART2 82 | ||
88 | #define TI81XXUART3 83 | ||
89 | #define AM33XXUART1 84 | ||
90 | #define OMAP5UART3 OMAP4UART3 | ||
91 | #define OMAP5UART4 OMAP4UART4 | ||
92 | #define ZOOM_UART 95 /* Only on zoom2/3 */ | ||
93 | |||
94 | #ifndef __ASSEMBLER__ | 57 | #ifndef __ASSEMBLER__ |
95 | 58 | ||
96 | struct omap_board_data; | 59 | struct omap_board_data; |
diff --git a/arch/arm/mach-omap2/include/mach/uncompress.h b/arch/arm/mach-omap2/include/mach/uncompress.h deleted file mode 100644 index 8e3546d3e041..000000000000 --- a/arch/arm/mach-omap2/include/mach/uncompress.h +++ /dev/null | |||
@@ -1,176 +0,0 @@ | |||
1 | /* | ||
2 | * arch/arm/plat-omap/include/mach/uncompress.h | ||
3 | * | ||
4 | * Serial port stubs for kernel decompress status messages | ||
5 | * | ||
6 | * Initially based on: | ||
7 | * linux-2.4.15-rmk1-dsplinux1.6/arch/arm/plat-omap/include/mach1510/uncompress.h | ||
8 | * Copyright (C) 2000 RidgeRun, Inc. | ||
9 | * Author: Greg Lonnon <glonnon@ridgerun.com> | ||
10 | * | ||
11 | * Rewritten by: | ||
12 | * Author: <source@mvista.com> | ||
13 | * 2004 (c) MontaVista Software, Inc. | ||
14 | * | ||
15 | * This file is licensed under the terms of the GNU General Public License | ||
16 | * version 2. This program is licensed "as is" without any warranty of any | ||
17 | * kind, whether express or implied. | ||
18 | */ | ||
19 | |||
20 | #include <linux/types.h> | ||
21 | #include <linux/serial_reg.h> | ||
22 | |||
23 | #include <asm/memory.h> | ||
24 | #include <asm/mach-types.h> | ||
25 | |||
26 | #include <mach/serial.h> | ||
27 | |||
28 | #define MDR1_MODE_MASK 0x07 | ||
29 | |||
30 | volatile u8 *uart_base; | ||
31 | int uart_shift; | ||
32 | |||
33 | /* | ||
34 | * Store the DEBUG_LL uart number into memory. | ||
35 | * See also debug-macro.S, and serial.c for related code. | ||
36 | */ | ||
37 | static void set_omap_uart_info(unsigned char port) | ||
38 | { | ||
39 | /* | ||
40 | * Get address of some.bss variable and round it down | ||
41 | * a la CONFIG_AUTO_ZRELADDR. | ||
42 | */ | ||
43 | u32 ram_start = (u32)&uart_shift & 0xf8000000; | ||
44 | u32 *uart_info = (u32 *)(ram_start + OMAP_UART_INFO_OFS); | ||
45 | *uart_info = port; | ||
46 | } | ||
47 | |||
48 | static void putc(int c) | ||
49 | { | ||
50 | if (!uart_base) | ||
51 | return; | ||
52 | |||
53 | /* Check for UART 16x mode */ | ||
54 | if ((uart_base[UART_OMAP_MDR1 << uart_shift] & MDR1_MODE_MASK) != 0) | ||
55 | return; | ||
56 | |||
57 | while (!(uart_base[UART_LSR << uart_shift] & UART_LSR_THRE)) | ||
58 | barrier(); | ||
59 | uart_base[UART_TX << uart_shift] = c; | ||
60 | } | ||
61 | |||
62 | static inline void flush(void) | ||
63 | { | ||
64 | } | ||
65 | |||
66 | /* | ||
67 | * Macros to configure UART1 and debug UART | ||
68 | */ | ||
69 | #define _DEBUG_LL_ENTRY(mach, dbg_uart, dbg_shft, dbg_id) \ | ||
70 | if (machine_is_##mach()) { \ | ||
71 | uart_base = (volatile u8 *)(dbg_uart); \ | ||
72 | uart_shift = (dbg_shft); \ | ||
73 | port = (dbg_id); \ | ||
74 | set_omap_uart_info(port); \ | ||
75 | break; \ | ||
76 | } | ||
77 | |||
78 | #define DEBUG_LL_OMAP2(p, mach) \ | ||
79 | _DEBUG_LL_ENTRY(mach, OMAP2_UART##p##_BASE, OMAP_PORT_SHIFT, \ | ||
80 | OMAP2UART##p) | ||
81 | |||
82 | #define DEBUG_LL_OMAP3(p, mach) \ | ||
83 | _DEBUG_LL_ENTRY(mach, OMAP3_UART##p##_BASE, OMAP_PORT_SHIFT, \ | ||
84 | OMAP3UART##p) | ||
85 | |||
86 | #define DEBUG_LL_OMAP4(p, mach) \ | ||
87 | _DEBUG_LL_ENTRY(mach, OMAP4_UART##p##_BASE, OMAP_PORT_SHIFT, \ | ||
88 | OMAP4UART##p) | ||
89 | |||
90 | #define DEBUG_LL_OMAP5(p, mach) \ | ||
91 | _DEBUG_LL_ENTRY(mach, OMAP5_UART##p##_BASE, OMAP_PORT_SHIFT, \ | ||
92 | OMAP5UART##p) | ||
93 | /* Zoom2/3 shift is different for UART1 and external port */ | ||
94 | #define DEBUG_LL_ZOOM(mach) \ | ||
95 | _DEBUG_LL_ENTRY(mach, ZOOM_UART_BASE, ZOOM_PORT_SHIFT, ZOOM_UART) | ||
96 | |||
97 | #define DEBUG_LL_TI81XX(p, mach) \ | ||
98 | _DEBUG_LL_ENTRY(mach, TI81XX_UART##p##_BASE, OMAP_PORT_SHIFT, \ | ||
99 | TI81XXUART##p) | ||
100 | |||
101 | #define DEBUG_LL_AM33XX(p, mach) \ | ||
102 | _DEBUG_LL_ENTRY(mach, AM33XX_UART##p##_BASE, OMAP_PORT_SHIFT, \ | ||
103 | AM33XXUART##p) | ||
104 | |||
105 | static inline void arch_decomp_setup(void) | ||
106 | { | ||
107 | int port = 0; | ||
108 | |||
109 | /* | ||
110 | * Initialize the port based on the machine ID from the bootloader. | ||
111 | * Note that we're using macros here instead of switch statement | ||
112 | * as machine_is functions are optimized out for the boards that | ||
113 | * are not selected. | ||
114 | */ | ||
115 | do { | ||
116 | /* omap2 based boards using UART1 */ | ||
117 | DEBUG_LL_OMAP2(1, omap_2430sdp); | ||
118 | DEBUG_LL_OMAP2(1, omap_apollon); | ||
119 | DEBUG_LL_OMAP2(1, omap_h4); | ||
120 | |||
121 | /* omap2 based boards using UART3 */ | ||
122 | DEBUG_LL_OMAP2(3, nokia_n800); | ||
123 | DEBUG_LL_OMAP2(3, nokia_n810); | ||
124 | DEBUG_LL_OMAP2(3, nokia_n810_wimax); | ||
125 | |||
126 | /* omap3 based boards using UART1 */ | ||
127 | DEBUG_LL_OMAP2(1, omap3evm); | ||
128 | DEBUG_LL_OMAP3(1, omap_3430sdp); | ||
129 | DEBUG_LL_OMAP3(1, omap_3630sdp); | ||
130 | DEBUG_LL_OMAP3(1, omap3530_lv_som); | ||
131 | DEBUG_LL_OMAP3(1, omap3_torpedo); | ||
132 | |||
133 | /* omap3 based boards using UART3 */ | ||
134 | DEBUG_LL_OMAP3(3, cm_t35); | ||
135 | DEBUG_LL_OMAP3(3, cm_t3517); | ||
136 | DEBUG_LL_OMAP3(3, cm_t3730); | ||
137 | DEBUG_LL_OMAP3(3, craneboard); | ||
138 | DEBUG_LL_OMAP3(3, devkit8000); | ||
139 | DEBUG_LL_OMAP3(3, igep0020); | ||
140 | DEBUG_LL_OMAP3(3, igep0030); | ||
141 | DEBUG_LL_OMAP3(3, nokia_rm680); | ||
142 | DEBUG_LL_OMAP3(3, nokia_rm696); | ||
143 | DEBUG_LL_OMAP3(3, nokia_rx51); | ||
144 | DEBUG_LL_OMAP3(3, omap3517evm); | ||
145 | DEBUG_LL_OMAP3(3, omap3_beagle); | ||
146 | DEBUG_LL_OMAP3(3, omap3_pandora); | ||
147 | DEBUG_LL_OMAP3(3, omap_ldp); | ||
148 | DEBUG_LL_OMAP3(3, overo); | ||
149 | DEBUG_LL_OMAP3(3, touchbook); | ||
150 | |||
151 | /* omap4 based boards using UART3 */ | ||
152 | DEBUG_LL_OMAP4(3, omap_4430sdp); | ||
153 | DEBUG_LL_OMAP4(3, omap4_panda); | ||
154 | |||
155 | /* omap5 based boards using UART3 */ | ||
156 | DEBUG_LL_OMAP5(3, omap5_sevm); | ||
157 | |||
158 | /* zoom2/3 external uart */ | ||
159 | DEBUG_LL_ZOOM(omap_zoom2); | ||
160 | DEBUG_LL_ZOOM(omap_zoom3); | ||
161 | |||
162 | /* TI8168 base boards using UART3 */ | ||
163 | DEBUG_LL_TI81XX(3, ti8168evm); | ||
164 | |||
165 | /* TI8148 base boards using UART1 */ | ||
166 | DEBUG_LL_TI81XX(1, ti8148evm); | ||
167 | |||
168 | /* AM33XX base boards using UART1 */ | ||
169 | DEBUG_LL_AM33XX(1, am335xevm); | ||
170 | } while (0); | ||
171 | } | ||
172 | |||
173 | /* | ||
174 | * nothing to do | ||
175 | */ | ||
176 | #define arch_decomp_wdog() | ||
diff --git a/arch/arm/mach-omap2/mcbsp.c b/arch/arm/mach-omap2/mcbsp.c index df49f2a49461..5d8768075dd9 100644 --- a/arch/arm/mach-omap2/mcbsp.c +++ b/arch/arm/mach-omap2/mcbsp.c | |||
@@ -23,6 +23,7 @@ | |||
23 | 23 | ||
24 | #include <linux/omap-dma.h> | 24 | #include <linux/omap-dma.h> |
25 | 25 | ||
26 | #include "soc.h" | ||
26 | #include "omap_device.h" | 27 | #include "omap_device.h" |
27 | 28 | ||
28 | /* | 29 | /* |
@@ -101,7 +102,7 @@ static int __init omap_init_mcbsp(struct omap_hwmod *oh, void *unused) | |||
101 | count++; | 102 | count++; |
102 | } | 103 | } |
103 | pdev = omap_device_build_ss(name, id, oh_device, count, pdata, | 104 | pdev = omap_device_build_ss(name, id, oh_device, count, pdata, |
104 | sizeof(*pdata), NULL, 0, false); | 105 | sizeof(*pdata)); |
105 | kfree(pdata); | 106 | kfree(pdata); |
106 | if (IS_ERR(pdev)) { | 107 | if (IS_ERR(pdev)) { |
107 | pr_err("%s: Can't build omap_device for %s:%s.\n", __func__, | 108 | pr_err("%s: Can't build omap_device for %s:%s.\n", __func__, |
@@ -118,4 +119,4 @@ static int __init omap2_mcbsp_init(void) | |||
118 | 119 | ||
119 | return 0; | 120 | return 0; |
120 | } | 121 | } |
121 | arch_initcall(omap2_mcbsp_init); | 122 | omap_arch_initcall(omap2_mcbsp_init); |
diff --git a/arch/arm/mach-omap2/msdi.c b/arch/arm/mach-omap2/msdi.c index aafdd4ca9f4f..c52d8b4a3e91 100644 --- a/arch/arm/mach-omap2/msdi.c +++ b/arch/arm/mach-omap2/msdi.c | |||
@@ -150,7 +150,7 @@ void __init omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data) | |||
150 | return; | 150 | return; |
151 | } | 151 | } |
152 | pdev = omap_device_build(dev_name, id, oh, mmc_data[0], | 152 | pdev = omap_device_build(dev_name, id, oh, mmc_data[0], |
153 | sizeof(struct omap_mmc_platform_data), NULL, 0, 0); | 153 | sizeof(struct omap_mmc_platform_data)); |
154 | if (IS_ERR(pdev)) | 154 | if (IS_ERR(pdev)) |
155 | WARN(1, "Can'd build omap_device for %s:%s.\n", | 155 | WARN(1, "Can'd build omap_device for %s:%s.\n", |
156 | dev_name, oh->name); | 156 | dev_name, oh->name); |
diff --git a/arch/arm/mach-omap2/omap-iommu.c b/arch/arm/mach-omap2/omap-iommu.c index 6da4f7ae9d7f..f6daae821ebb 100644 --- a/arch/arm/mach-omap2/omap-iommu.c +++ b/arch/arm/mach-omap2/omap-iommu.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
17 | 17 | ||
18 | #include <linux/platform_data/iommu-omap.h> | 18 | #include <linux/platform_data/iommu-omap.h> |
19 | #include "soc.h" | ||
19 | #include "omap_hwmod.h" | 20 | #include "omap_hwmod.h" |
20 | #include "omap_device.h" | 21 | #include "omap_device.h" |
21 | 22 | ||
@@ -41,8 +42,7 @@ static int __init omap_iommu_dev_init(struct omap_hwmod *oh, void *unused) | |||
41 | pdata->deassert_reset = omap_device_deassert_hardreset; | 42 | pdata->deassert_reset = omap_device_deassert_hardreset; |
42 | } | 43 | } |
43 | 44 | ||
44 | pdev = omap_device_build("omap-iommu", i, oh, pdata, sizeof(*pdata), | 45 | pdev = omap_device_build("omap-iommu", i, oh, pdata, sizeof(*pdata)); |
45 | NULL, 0, 0); | ||
46 | 46 | ||
47 | kfree(pdata); | 47 | kfree(pdata); |
48 | 48 | ||
@@ -61,7 +61,7 @@ static int __init omap_iommu_init(void) | |||
61 | return omap_hwmod_for_each_by_class("mmu", omap_iommu_dev_init, NULL); | 61 | return omap_hwmod_for_each_by_class("mmu", omap_iommu_dev_init, NULL); |
62 | } | 62 | } |
63 | /* must be ready before omap3isp is probed */ | 63 | /* must be ready before omap3isp is probed */ |
64 | subsys_initcall(omap_iommu_init); | 64 | omap_subsys_initcall(omap_iommu_init); |
65 | 65 | ||
66 | static void __exit omap_iommu_exit(void) | 66 | static void __exit omap_iommu_exit(void) |
67 | { | 67 | { |
diff --git a/arch/arm/mach-omap2/omap-mpuss-lowpower.c b/arch/arm/mach-omap2/omap-mpuss-lowpower.c index aac46bfdbeb2..8bcb64bcdcdb 100644 --- a/arch/arm/mach-omap2/omap-mpuss-lowpower.c +++ b/arch/arm/mach-omap2/omap-mpuss-lowpower.c | |||
@@ -87,37 +87,6 @@ static inline void set_cpu_wakeup_addr(unsigned int cpu_id, u32 addr) | |||
87 | } | 87 | } |
88 | 88 | ||
89 | /* | 89 | /* |
90 | * Set the CPUx powerdomain's previous power state | ||
91 | */ | ||
92 | static inline void set_cpu_next_pwrst(unsigned int cpu_id, | ||
93 | unsigned int power_state) | ||
94 | { | ||
95 | struct omap4_cpu_pm_info *pm_info = &per_cpu(omap4_pm_info, cpu_id); | ||
96 | |||
97 | pwrdm_set_next_pwrst(pm_info->pwrdm, power_state); | ||
98 | } | ||
99 | |||
100 | /* | ||
101 | * Read CPU's previous power state | ||
102 | */ | ||
103 | static inline unsigned int read_cpu_prev_pwrst(unsigned int cpu_id) | ||
104 | { | ||
105 | struct omap4_cpu_pm_info *pm_info = &per_cpu(omap4_pm_info, cpu_id); | ||
106 | |||
107 | return pwrdm_read_prev_pwrst(pm_info->pwrdm); | ||
108 | } | ||
109 | |||
110 | /* | ||
111 | * Clear the CPUx powerdomain's previous power state | ||
112 | */ | ||
113 | static inline void clear_cpu_prev_pwrst(unsigned int cpu_id) | ||
114 | { | ||
115 | struct omap4_cpu_pm_info *pm_info = &per_cpu(omap4_pm_info, cpu_id); | ||
116 | |||
117 | pwrdm_clear_all_prev_pwrst(pm_info->pwrdm); | ||
118 | } | ||
119 | |||
120 | /* | ||
121 | * Store the SCU power status value to scratchpad memory | 90 | * Store the SCU power status value to scratchpad memory |
122 | */ | 91 | */ |
123 | static void scu_pwrst_prepare(unsigned int cpu_id, unsigned int cpu_state) | 92 | static void scu_pwrst_prepare(unsigned int cpu_id, unsigned int cpu_state) |
@@ -230,6 +199,7 @@ static void save_l2x0_context(void) | |||
230 | */ | 199 | */ |
231 | int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state) | 200 | int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state) |
232 | { | 201 | { |
202 | struct omap4_cpu_pm_info *pm_info = &per_cpu(omap4_pm_info, cpu); | ||
233 | unsigned int save_state = 0; | 203 | unsigned int save_state = 0; |
234 | unsigned int wakeup_cpu; | 204 | unsigned int wakeup_cpu; |
235 | 205 | ||
@@ -268,7 +238,7 @@ int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state) | |||
268 | save_state = 2; | 238 | save_state = 2; |
269 | 239 | ||
270 | cpu_clear_prev_logic_pwrst(cpu); | 240 | cpu_clear_prev_logic_pwrst(cpu); |
271 | set_cpu_next_pwrst(cpu, power_state); | 241 | pwrdm_set_next_pwrst(pm_info->pwrdm, power_state); |
272 | set_cpu_wakeup_addr(cpu, virt_to_phys(omap4_cpu_resume)); | 242 | set_cpu_wakeup_addr(cpu, virt_to_phys(omap4_cpu_resume)); |
273 | scu_pwrst_prepare(cpu, power_state); | 243 | scu_pwrst_prepare(cpu, power_state); |
274 | l2x0_pwrst_prepare(cpu, save_state); | 244 | l2x0_pwrst_prepare(cpu, save_state); |
@@ -286,7 +256,7 @@ int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state) | |||
286 | * domain transition | 256 | * domain transition |
287 | */ | 257 | */ |
288 | wakeup_cpu = smp_processor_id(); | 258 | wakeup_cpu = smp_processor_id(); |
289 | set_cpu_next_pwrst(wakeup_cpu, PWRDM_POWER_ON); | 259 | pwrdm_set_next_pwrst(pm_info->pwrdm, PWRDM_POWER_ON); |
290 | 260 | ||
291 | pwrdm_post_transition(NULL); | 261 | pwrdm_post_transition(NULL); |
292 | 262 | ||
@@ -300,8 +270,8 @@ int omap4_enter_lowpower(unsigned int cpu, unsigned int power_state) | |||
300 | */ | 270 | */ |
301 | int __cpuinit omap4_hotplug_cpu(unsigned int cpu, unsigned int power_state) | 271 | int __cpuinit omap4_hotplug_cpu(unsigned int cpu, unsigned int power_state) |
302 | { | 272 | { |
303 | unsigned int cpu_state = 0; | ||
304 | struct omap4_cpu_pm_info *pm_info = &per_cpu(omap4_pm_info, cpu); | 273 | struct omap4_cpu_pm_info *pm_info = &per_cpu(omap4_pm_info, cpu); |
274 | unsigned int cpu_state = 0; | ||
305 | 275 | ||
306 | if (omap_rev() == OMAP4430_REV_ES1_0) | 276 | if (omap_rev() == OMAP4430_REV_ES1_0) |
307 | return -ENXIO; | 277 | return -ENXIO; |
@@ -309,8 +279,8 @@ int __cpuinit omap4_hotplug_cpu(unsigned int cpu, unsigned int power_state) | |||
309 | if (power_state == PWRDM_POWER_OFF) | 279 | if (power_state == PWRDM_POWER_OFF) |
310 | cpu_state = 1; | 280 | cpu_state = 1; |
311 | 281 | ||
312 | clear_cpu_prev_pwrst(cpu); | 282 | pwrdm_clear_all_prev_pwrst(pm_info->pwrdm); |
313 | set_cpu_next_pwrst(cpu, power_state); | 283 | pwrdm_set_next_pwrst(pm_info->pwrdm, power_state); |
314 | set_cpu_wakeup_addr(cpu, virt_to_phys(pm_info->secondary_startup)); | 284 | set_cpu_wakeup_addr(cpu, virt_to_phys(pm_info->secondary_startup)); |
315 | scu_pwrst_prepare(cpu, power_state); | 285 | scu_pwrst_prepare(cpu, power_state); |
316 | 286 | ||
@@ -321,7 +291,7 @@ int __cpuinit omap4_hotplug_cpu(unsigned int cpu, unsigned int power_state) | |||
321 | */ | 291 | */ |
322 | omap4_finish_suspend(cpu_state); | 292 | omap4_finish_suspend(cpu_state); |
323 | 293 | ||
324 | set_cpu_next_pwrst(cpu, PWRDM_POWER_ON); | 294 | pwrdm_set_next_pwrst(pm_info->pwrdm, PWRDM_POWER_ON); |
325 | return 0; | 295 | return 0; |
326 | } | 296 | } |
327 | 297 | ||
diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c index cd42d921940d..d9727218dd0a 100644 --- a/arch/arm/mach-omap2/omap-smp.c +++ b/arch/arm/mach-omap2/omap-smp.c | |||
@@ -19,9 +19,9 @@ | |||
19 | #include <linux/device.h> | 19 | #include <linux/device.h> |
20 | #include <linux/smp.h> | 20 | #include <linux/smp.h> |
21 | #include <linux/io.h> | 21 | #include <linux/io.h> |
22 | #include <linux/irqchip/arm-gic.h> | ||
22 | 23 | ||
23 | #include <asm/cacheflush.h> | 24 | #include <asm/cacheflush.h> |
24 | #include <asm/hardware/gic.h> | ||
25 | #include <asm/smp_scu.h> | 25 | #include <asm/smp_scu.h> |
26 | 26 | ||
27 | #include "omap-secure.h" | 27 | #include "omap-secure.h" |
@@ -157,7 +157,7 @@ static int __cpuinit omap4_boot_secondary(unsigned int cpu, struct task_struct * | |||
157 | booted = true; | 157 | booted = true; |
158 | } | 158 | } |
159 | 159 | ||
160 | gic_raise_softirq(cpumask_of(cpu), 0); | 160 | arch_send_wakeup_ipi_mask(cpumask_of(cpu)); |
161 | 161 | ||
162 | /* | 162 | /* |
163 | * Now the secondary core is starting up let it run its | 163 | * Now the secondary core is starting up let it run its |
@@ -215,7 +215,7 @@ static void __init omap4_smp_init_cpus(void) | |||
215 | * Currently we can't call ioremap here because | 215 | * Currently we can't call ioremap here because |
216 | * SoC detection won't work until after init_early. | 216 | * SoC detection won't work until after init_early. |
217 | */ | 217 | */ |
218 | scu_base = OMAP2_L4_IO_ADDRESS(OMAP44XX_SCU_BASE); | 218 | scu_base = OMAP2_L4_IO_ADDRESS(scu_a9_get_base()); |
219 | BUG_ON(!scu_base); | 219 | BUG_ON(!scu_base); |
220 | ncores = scu_get_core_count(scu_base); | 220 | ncores = scu_get_core_count(scu_base); |
221 | } else if (cpu_id == CPU_CORTEX_A15) { | 221 | } else if (cpu_id == CPU_CORTEX_A15) { |
@@ -231,8 +231,6 @@ static void __init omap4_smp_init_cpus(void) | |||
231 | 231 | ||
232 | for (i = 0; i < ncores; i++) | 232 | for (i = 0; i < ncores; i++) |
233 | set_cpu_possible(i, true); | 233 | set_cpu_possible(i, true); |
234 | |||
235 | set_smp_cross_call(gic_raise_softirq); | ||
236 | } | 234 | } |
237 | 235 | ||
238 | static void __init omap4_smp_prepare_cpus(unsigned int max_cpus) | 236 | static void __init omap4_smp_prepare_cpus(unsigned int max_cpus) |
diff --git a/arch/arm/mach-omap2/omap-wakeupgen.c b/arch/arm/mach-omap2/omap-wakeupgen.c index 5d3b4f4f81ae..f8bb3b9b6a76 100644 --- a/arch/arm/mach-omap2/omap-wakeupgen.c +++ b/arch/arm/mach-omap2/omap-wakeupgen.c | |||
@@ -24,8 +24,7 @@ | |||
24 | #include <linux/cpu.h> | 24 | #include <linux/cpu.h> |
25 | #include <linux/notifier.h> | 25 | #include <linux/notifier.h> |
26 | #include <linux/cpu_pm.h> | 26 | #include <linux/cpu_pm.h> |
27 | 27 | #include <linux/irqchip/arm-gic.h> | |
28 | #include <asm/hardware/gic.h> | ||
29 | 28 | ||
30 | #include "omap-wakeupgen.h" | 29 | #include "omap-wakeupgen.h" |
31 | #include "omap-secure.h" | 30 | #include "omap-secure.h" |
@@ -46,7 +45,7 @@ | |||
46 | 45 | ||
47 | static void __iomem *wakeupgen_base; | 46 | static void __iomem *wakeupgen_base; |
48 | static void __iomem *sar_base; | 47 | static void __iomem *sar_base; |
49 | static DEFINE_SPINLOCK(wakeupgen_lock); | 48 | static DEFINE_RAW_SPINLOCK(wakeupgen_lock); |
50 | static unsigned int irq_target_cpu[MAX_IRQS]; | 49 | static unsigned int irq_target_cpu[MAX_IRQS]; |
51 | static unsigned int irq_banks = MAX_NR_REG_BANKS; | 50 | static unsigned int irq_banks = MAX_NR_REG_BANKS; |
52 | static unsigned int max_irqs = MAX_IRQS; | 51 | static unsigned int max_irqs = MAX_IRQS; |
@@ -134,9 +133,9 @@ static void wakeupgen_mask(struct irq_data *d) | |||
134 | { | 133 | { |
135 | unsigned long flags; | 134 | unsigned long flags; |
136 | 135 | ||
137 | spin_lock_irqsave(&wakeupgen_lock, flags); | 136 | raw_spin_lock_irqsave(&wakeupgen_lock, flags); |
138 | _wakeupgen_clear(d->irq, irq_target_cpu[d->irq]); | 137 | _wakeupgen_clear(d->irq, irq_target_cpu[d->irq]); |
139 | spin_unlock_irqrestore(&wakeupgen_lock, flags); | 138 | raw_spin_unlock_irqrestore(&wakeupgen_lock, flags); |
140 | } | 139 | } |
141 | 140 | ||
142 | /* | 141 | /* |
@@ -146,9 +145,9 @@ static void wakeupgen_unmask(struct irq_data *d) | |||
146 | { | 145 | { |
147 | unsigned long flags; | 146 | unsigned long flags; |
148 | 147 | ||
149 | spin_lock_irqsave(&wakeupgen_lock, flags); | 148 | raw_spin_lock_irqsave(&wakeupgen_lock, flags); |
150 | _wakeupgen_set(d->irq, irq_target_cpu[d->irq]); | 149 | _wakeupgen_set(d->irq, irq_target_cpu[d->irq]); |
151 | spin_unlock_irqrestore(&wakeupgen_lock, flags); | 150 | raw_spin_unlock_irqrestore(&wakeupgen_lock, flags); |
152 | } | 151 | } |
153 | 152 | ||
154 | #ifdef CONFIG_HOTPLUG_CPU | 153 | #ifdef CONFIG_HOTPLUG_CPU |
@@ -189,7 +188,7 @@ static void wakeupgen_irqmask_all(unsigned int cpu, unsigned int set) | |||
189 | { | 188 | { |
190 | unsigned long flags; | 189 | unsigned long flags; |
191 | 190 | ||
192 | spin_lock_irqsave(&wakeupgen_lock, flags); | 191 | raw_spin_lock_irqsave(&wakeupgen_lock, flags); |
193 | if (set) { | 192 | if (set) { |
194 | _wakeupgen_save_masks(cpu); | 193 | _wakeupgen_save_masks(cpu); |
195 | _wakeupgen_set_all(cpu, WKG_MASK_ALL); | 194 | _wakeupgen_set_all(cpu, WKG_MASK_ALL); |
@@ -197,7 +196,7 @@ static void wakeupgen_irqmask_all(unsigned int cpu, unsigned int set) | |||
197 | _wakeupgen_set_all(cpu, WKG_UNMASK_ALL); | 196 | _wakeupgen_set_all(cpu, WKG_UNMASK_ALL); |
198 | _wakeupgen_restore_masks(cpu); | 197 | _wakeupgen_restore_masks(cpu); |
199 | } | 198 | } |
200 | spin_unlock_irqrestore(&wakeupgen_lock, flags); | 199 | raw_spin_unlock_irqrestore(&wakeupgen_lock, flags); |
201 | } | 200 | } |
202 | #endif | 201 | #endif |
203 | 202 | ||
diff --git a/arch/arm/mach-omap2/omap2-restart.c b/arch/arm/mach-omap2/omap2-restart.c index be6bc89ab1e8..719b716a4494 100644 --- a/arch/arm/mach-omap2/omap2-restart.c +++ b/arch/arm/mach-omap2/omap2-restart.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/clk.h> | 13 | #include <linux/clk.h> |
14 | #include <linux/io.h> | 14 | #include <linux/io.h> |
15 | 15 | ||
16 | #include "soc.h" | ||
16 | #include "common.h" | 17 | #include "common.h" |
17 | #include "prm2xxx.h" | 18 | #include "prm2xxx.h" |
18 | 19 | ||
@@ -62,4 +63,4 @@ static int __init omap2xxx_common_look_up_clks_for_reset(void) | |||
62 | 63 | ||
63 | return 0; | 64 | return 0; |
64 | } | 65 | } |
65 | core_initcall(omap2xxx_common_look_up_clks_for_reset); | 66 | omap_core_initcall(omap2xxx_common_look_up_clks_for_reset); |
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c index 6897ae21bb82..708bb115a27f 100644 --- a/arch/arm/mach-omap2/omap4-common.c +++ b/arch/arm/mach-omap2/omap4-common.c | |||
@@ -15,13 +15,14 @@ | |||
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/io.h> | 16 | #include <linux/io.h> |
17 | #include <linux/irq.h> | 17 | #include <linux/irq.h> |
18 | #include <linux/irqchip.h> | ||
18 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
19 | #include <linux/memblock.h> | 20 | #include <linux/memblock.h> |
20 | #include <linux/of_irq.h> | 21 | #include <linux/of_irq.h> |
21 | #include <linux/of_platform.h> | 22 | #include <linux/of_platform.h> |
22 | #include <linux/export.h> | 23 | #include <linux/export.h> |
24 | #include <linux/irqchip/arm-gic.h> | ||
23 | 25 | ||
24 | #include <asm/hardware/gic.h> | ||
25 | #include <asm/hardware/cache-l2x0.h> | 26 | #include <asm/hardware/cache-l2x0.h> |
26 | #include <asm/mach/map.h> | 27 | #include <asm/mach/map.h> |
27 | #include <asm/memblock.h> | 28 | #include <asm/memblock.h> |
@@ -225,7 +226,7 @@ static int __init omap_l2_cache_init(void) | |||
225 | 226 | ||
226 | return 0; | 227 | return 0; |
227 | } | 228 | } |
228 | early_initcall(omap_l2_cache_init); | 229 | omap_early_initcall(omap_l2_cache_init); |
229 | #endif | 230 | #endif |
230 | 231 | ||
231 | void __iomem *omap4_get_sar_ram_base(void) | 232 | void __iomem *omap4_get_sar_ram_base(void) |
@@ -253,18 +254,12 @@ static int __init omap4_sar_ram_init(void) | |||
253 | 254 | ||
254 | return 0; | 255 | return 0; |
255 | } | 256 | } |
256 | early_initcall(omap4_sar_ram_init); | 257 | omap_early_initcall(omap4_sar_ram_init); |
257 | |||
258 | static struct of_device_id irq_match[] __initdata = { | ||
259 | { .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, | ||
260 | { .compatible = "arm,cortex-a15-gic", .data = gic_of_init, }, | ||
261 | { } | ||
262 | }; | ||
263 | 258 | ||
264 | void __init omap_gic_of_init(void) | 259 | void __init omap_gic_of_init(void) |
265 | { | 260 | { |
266 | omap_wakeupgen_init(); | 261 | omap_wakeupgen_init(); |
267 | of_irq_init(irq_match); | 262 | irqchip_init(); |
268 | } | 263 | } |
269 | 264 | ||
270 | #if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) | 265 | #if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE) |
diff --git a/arch/arm/mach-omap2/omap44xx.h b/arch/arm/mach-omap2/omap44xx.h index 43b927b2e2e8..8a515bb74639 100644 --- a/arch/arm/mach-omap2/omap44xx.h +++ b/arch/arm/mach-omap2/omap44xx.h | |||
@@ -40,7 +40,6 @@ | |||
40 | #define OMAP44XX_GIC_DIST_BASE 0x48241000 | 40 | #define OMAP44XX_GIC_DIST_BASE 0x48241000 |
41 | #define OMAP44XX_GIC_CPU_BASE 0x48240100 | 41 | #define OMAP44XX_GIC_CPU_BASE 0x48240100 |
42 | #define OMAP44XX_IRQ_GIC_START 32 | 42 | #define OMAP44XX_IRQ_GIC_START 32 |
43 | #define OMAP44XX_SCU_BASE 0x48240000 | ||
44 | #define OMAP44XX_LOCAL_TWD_BASE 0x48240600 | 43 | #define OMAP44XX_LOCAL_TWD_BASE 0x48240600 |
45 | #define OMAP44XX_L2CACHE_BASE 0x48242000 | 44 | #define OMAP44XX_L2CACHE_BASE 0x48242000 |
46 | #define OMAP44XX_WKUPGEN_BASE 0x48281000 | 45 | #define OMAP44XX_WKUPGEN_BASE 0x48281000 |
diff --git a/arch/arm/mach-omap2/omap_device.c b/arch/arm/mach-omap2/omap_device.c index b21ad59604d1..2448c7a273d2 100644 --- a/arch/arm/mach-omap2/omap_device.c +++ b/arch/arm/mach-omap2/omap_device.c | |||
@@ -17,68 +17,15 @@ | |||
17 | * to control power management and interconnect properties of their | 17 | * to control power management and interconnect properties of their |
18 | * devices. | 18 | * devices. |
19 | * | 19 | * |
20 | * In the medium- to long-term, this code should either be | 20 | * In the medium- to long-term, this code should be implemented as a |
21 | * a) implemented via arch-specific pointers in platform_data | 21 | * proper omap_bus/omap_device in Linux, no more platform_data func |
22 | * or | 22 | * pointers |
23 | * b) implemented as a proper omap_bus/omap_device in Linux, no more | ||
24 | * platform_data func pointers | ||
25 | * | 23 | * |
26 | * | 24 | * |
27 | * Guidelines for usage by driver authors: | ||
28 | * | ||
29 | * 1. These functions are intended to be used by device drivers via | ||
30 | * function pointers in struct platform_data. As an example, | ||
31 | * omap_device_enable() should be passed to the driver as | ||
32 | * | ||
33 | * struct foo_driver_platform_data { | ||
34 | * ... | ||
35 | * int (*device_enable)(struct platform_device *pdev); | ||
36 | * ... | ||
37 | * } | ||
38 | * | ||
39 | * Note that the generic "device_enable" name is used, rather than | ||
40 | * "omap_device_enable". This is so other architectures can pass in their | ||
41 | * own enable/disable functions here. | ||
42 | * | ||
43 | * This should be populated during device setup: | ||
44 | * | ||
45 | * ... | ||
46 | * pdata->device_enable = omap_device_enable; | ||
47 | * ... | ||
48 | * | ||
49 | * 2. Drivers should first check to ensure the function pointer is not null | ||
50 | * before calling it, as in: | ||
51 | * | ||
52 | * if (pdata->device_enable) | ||
53 | * pdata->device_enable(pdev); | ||
54 | * | ||
55 | * This allows other architectures that don't use similar device_enable()/ | ||
56 | * device_shutdown() functions to execute normally. | ||
57 | * | ||
58 | * ... | ||
59 | * | ||
60 | * Suggested usage by device drivers: | ||
61 | * | ||
62 | * During device initialization: | ||
63 | * device_enable() | ||
64 | * | ||
65 | * During device idle: | ||
66 | * (save remaining device context if necessary) | ||
67 | * device_idle(); | ||
68 | * | ||
69 | * During device resume: | ||
70 | * device_enable(); | ||
71 | * (restore context if necessary) | ||
72 | * | ||
73 | * During device shutdown: | ||
74 | * device_shutdown() | ||
75 | * (device must be reinitialized at this point to use it again) | ||
76 | * | ||
77 | */ | 25 | */ |
78 | #undef DEBUG | 26 | #undef DEBUG |
79 | 27 | ||
80 | #include <linux/kernel.h> | 28 | #include <linux/kernel.h> |
81 | #include <linux/export.h> | ||
82 | #include <linux/platform_device.h> | 29 | #include <linux/platform_device.h> |
83 | #include <linux/slab.h> | 30 | #include <linux/slab.h> |
84 | #include <linux/err.h> | 31 | #include <linux/err.h> |
@@ -89,158 +36,12 @@ | |||
89 | #include <linux/of.h> | 36 | #include <linux/of.h> |
90 | #include <linux/notifier.h> | 37 | #include <linux/notifier.h> |
91 | 38 | ||
39 | #include "soc.h" | ||
92 | #include "omap_device.h" | 40 | #include "omap_device.h" |
93 | #include "omap_hwmod.h" | 41 | #include "omap_hwmod.h" |
94 | 42 | ||
95 | /* These parameters are passed to _omap_device_{de,}activate() */ | ||
96 | #define USE_WAKEUP_LAT 0 | ||
97 | #define IGNORE_WAKEUP_LAT 1 | ||
98 | |||
99 | static int omap_early_device_register(struct platform_device *pdev); | ||
100 | |||
101 | static struct omap_device_pm_latency omap_default_latency[] = { | ||
102 | { | ||
103 | .deactivate_func = omap_device_idle_hwmods, | ||
104 | .activate_func = omap_device_enable_hwmods, | ||
105 | .flags = OMAP_DEVICE_LATENCY_AUTO_ADJUST, | ||
106 | } | ||
107 | }; | ||
108 | |||
109 | /* Private functions */ | 43 | /* Private functions */ |
110 | 44 | ||
111 | /** | ||
112 | * _omap_device_activate - increase device readiness | ||
113 | * @od: struct omap_device * | ||
114 | * @ignore_lat: increase to latency target (0) or full readiness (1)? | ||
115 | * | ||
116 | * Increase readiness of omap_device @od (thus decreasing device | ||
117 | * wakeup latency, but consuming more power). If @ignore_lat is | ||
118 | * IGNORE_WAKEUP_LAT, make the omap_device fully active. Otherwise, | ||
119 | * if @ignore_lat is USE_WAKEUP_LAT, and the device's maximum wakeup | ||
120 | * latency is greater than the requested maximum wakeup latency, step | ||
121 | * backwards in the omap_device_pm_latency table to ensure the | ||
122 | * device's maximum wakeup latency is less than or equal to the | ||
123 | * requested maximum wakeup latency. Returns 0. | ||
124 | */ | ||
125 | static int _omap_device_activate(struct omap_device *od, u8 ignore_lat) | ||
126 | { | ||
127 | struct timespec a, b, c; | ||
128 | |||
129 | dev_dbg(&od->pdev->dev, "omap_device: activating\n"); | ||
130 | |||
131 | while (od->pm_lat_level > 0) { | ||
132 | struct omap_device_pm_latency *odpl; | ||
133 | unsigned long long act_lat = 0; | ||
134 | |||
135 | od->pm_lat_level--; | ||
136 | |||
137 | odpl = od->pm_lats + od->pm_lat_level; | ||
138 | |||
139 | if (!ignore_lat && | ||
140 | (od->dev_wakeup_lat <= od->_dev_wakeup_lat_limit)) | ||
141 | break; | ||
142 | |||
143 | read_persistent_clock(&a); | ||
144 | |||
145 | /* XXX check return code */ | ||
146 | odpl->activate_func(od); | ||
147 | |||
148 | read_persistent_clock(&b); | ||
149 | |||
150 | c = timespec_sub(b, a); | ||
151 | act_lat = timespec_to_ns(&c); | ||
152 | |||
153 | dev_dbg(&od->pdev->dev, | ||
154 | "omap_device: pm_lat %d: activate: elapsed time %llu nsec\n", | ||
155 | od->pm_lat_level, act_lat); | ||
156 | |||
157 | if (act_lat > odpl->activate_lat) { | ||
158 | odpl->activate_lat_worst = act_lat; | ||
159 | if (odpl->flags & OMAP_DEVICE_LATENCY_AUTO_ADJUST) { | ||
160 | odpl->activate_lat = act_lat; | ||
161 | dev_dbg(&od->pdev->dev, | ||
162 | "new worst case activate latency %d: %llu\n", | ||
163 | od->pm_lat_level, act_lat); | ||
164 | } else | ||
165 | dev_warn(&od->pdev->dev, | ||
166 | "activate latency %d higher than expected. (%llu > %d)\n", | ||
167 | od->pm_lat_level, act_lat, | ||
168 | odpl->activate_lat); | ||
169 | } | ||
170 | |||
171 | od->dev_wakeup_lat -= odpl->activate_lat; | ||
172 | } | ||
173 | |||
174 | return 0; | ||
175 | } | ||
176 | |||
177 | /** | ||
178 | * _omap_device_deactivate - decrease device readiness | ||
179 | * @od: struct omap_device * | ||
180 | * @ignore_lat: decrease to latency target (0) or full inactivity (1)? | ||
181 | * | ||
182 | * Decrease readiness of omap_device @od (thus increasing device | ||
183 | * wakeup latency, but conserving power). If @ignore_lat is | ||
184 | * IGNORE_WAKEUP_LAT, make the omap_device fully inactive. Otherwise, | ||
185 | * if @ignore_lat is USE_WAKEUP_LAT, and the device's maximum wakeup | ||
186 | * latency is less than the requested maximum wakeup latency, step | ||
187 | * forwards in the omap_device_pm_latency table to ensure the device's | ||
188 | * maximum wakeup latency is less than or equal to the requested | ||
189 | * maximum wakeup latency. Returns 0. | ||
190 | */ | ||
191 | static int _omap_device_deactivate(struct omap_device *od, u8 ignore_lat) | ||
192 | { | ||
193 | struct timespec a, b, c; | ||
194 | |||
195 | dev_dbg(&od->pdev->dev, "omap_device: deactivating\n"); | ||
196 | |||
197 | while (od->pm_lat_level < od->pm_lats_cnt) { | ||
198 | struct omap_device_pm_latency *odpl; | ||
199 | unsigned long long deact_lat = 0; | ||
200 | |||
201 | odpl = od->pm_lats + od->pm_lat_level; | ||
202 | |||
203 | if (!ignore_lat && | ||
204 | ((od->dev_wakeup_lat + odpl->activate_lat) > | ||
205 | od->_dev_wakeup_lat_limit)) | ||
206 | break; | ||
207 | |||
208 | read_persistent_clock(&a); | ||
209 | |||
210 | /* XXX check return code */ | ||
211 | odpl->deactivate_func(od); | ||
212 | |||
213 | read_persistent_clock(&b); | ||
214 | |||
215 | c = timespec_sub(b, a); | ||
216 | deact_lat = timespec_to_ns(&c); | ||
217 | |||
218 | dev_dbg(&od->pdev->dev, | ||
219 | "omap_device: pm_lat %d: deactivate: elapsed time %llu nsec\n", | ||
220 | od->pm_lat_level, deact_lat); | ||
221 | |||
222 | if (deact_lat > odpl->deactivate_lat) { | ||
223 | odpl->deactivate_lat_worst = deact_lat; | ||
224 | if (odpl->flags & OMAP_DEVICE_LATENCY_AUTO_ADJUST) { | ||
225 | odpl->deactivate_lat = deact_lat; | ||
226 | dev_dbg(&od->pdev->dev, | ||
227 | "new worst case deactivate latency %d: %llu\n", | ||
228 | od->pm_lat_level, deact_lat); | ||
229 | } else | ||
230 | dev_warn(&od->pdev->dev, | ||
231 | "deactivate latency %d higher than expected. (%llu > %d)\n", | ||
232 | od->pm_lat_level, deact_lat, | ||
233 | odpl->deactivate_lat); | ||
234 | } | ||
235 | |||
236 | od->dev_wakeup_lat += odpl->activate_lat; | ||
237 | |||
238 | od->pm_lat_level++; | ||
239 | } | ||
240 | |||
241 | return 0; | ||
242 | } | ||
243 | |||
244 | static void _add_clkdev(struct omap_device *od, const char *clk_alias, | 45 | static void _add_clkdev(struct omap_device *od, const char *clk_alias, |
245 | const char *clk_name) | 46 | const char *clk_name) |
246 | { | 47 | { |
@@ -315,9 +116,6 @@ static void _add_hwmod_clocks_clkdev(struct omap_device *od, | |||
315 | * @oh: ptr to the single omap_hwmod that backs this omap_device | 116 | * @oh: ptr to the single omap_hwmod that backs this omap_device |
316 | * @pdata: platform_data ptr to associate with the platform_device | 117 | * @pdata: platform_data ptr to associate with the platform_device |
317 | * @pdata_len: amount of memory pointed to by @pdata | 118 | * @pdata_len: amount of memory pointed to by @pdata |
318 | * @pm_lats: pointer to a omap_device_pm_latency array for this device | ||
319 | * @pm_lats_cnt: ARRAY_SIZE() of @pm_lats | ||
320 | * @is_early_device: should the device be registered as an early device or not | ||
321 | * | 119 | * |
322 | * Function for building an omap_device already registered from device-tree | 120 | * Function for building an omap_device already registered from device-tree |
323 | * | 121 | * |
@@ -356,7 +154,7 @@ static int omap_device_build_from_dt(struct platform_device *pdev) | |||
356 | hwmods[i] = oh; | 154 | hwmods[i] = oh; |
357 | } | 155 | } |
358 | 156 | ||
359 | od = omap_device_alloc(pdev, hwmods, oh_cnt, NULL, 0); | 157 | od = omap_device_alloc(pdev, hwmods, oh_cnt); |
360 | if (!od) { | 158 | if (!od) { |
361 | dev_err(&pdev->dev, "Cannot allocate omap_device for :%s\n", | 159 | dev_err(&pdev->dev, "Cannot allocate omap_device for :%s\n", |
362 | oh_name); | 160 | oh_name); |
@@ -407,6 +205,39 @@ static int _omap_device_notifier_call(struct notifier_block *nb, | |||
407 | return NOTIFY_DONE; | 205 | return NOTIFY_DONE; |
408 | } | 206 | } |
409 | 207 | ||
208 | /** | ||
209 | * _omap_device_enable_hwmods - call omap_hwmod_enable() on all hwmods | ||
210 | * @od: struct omap_device *od | ||
211 | * | ||
212 | * Enable all underlying hwmods. Returns 0. | ||
213 | */ | ||
214 | static int _omap_device_enable_hwmods(struct omap_device *od) | ||
215 | { | ||
216 | int i; | ||
217 | |||
218 | for (i = 0; i < od->hwmods_cnt; i++) | ||
219 | omap_hwmod_enable(od->hwmods[i]); | ||
220 | |||
221 | /* XXX pass along return value here? */ | ||
222 | return 0; | ||
223 | } | ||
224 | |||
225 | /** | ||
226 | * _omap_device_idle_hwmods - call omap_hwmod_idle() on all hwmods | ||
227 | * @od: struct omap_device *od | ||
228 | * | ||
229 | * Idle all underlying hwmods. Returns 0. | ||
230 | */ | ||
231 | static int _omap_device_idle_hwmods(struct omap_device *od) | ||
232 | { | ||
233 | int i; | ||
234 | |||
235 | for (i = 0; i < od->hwmods_cnt; i++) | ||
236 | omap_hwmod_idle(od->hwmods[i]); | ||
237 | |||
238 | /* XXX pass along return value here? */ | ||
239 | return 0; | ||
240 | } | ||
410 | 241 | ||
411 | /* Public functions for use by core code */ | 242 | /* Public functions for use by core code */ |
412 | 243 | ||
@@ -526,18 +357,14 @@ static int _od_fill_dma_resources(struct omap_device *od, | |||
526 | * @oh: ptr to the single omap_hwmod that backs this omap_device | 357 | * @oh: ptr to the single omap_hwmod that backs this omap_device |
527 | * @pdata: platform_data ptr to associate with the platform_device | 358 | * @pdata: platform_data ptr to associate with the platform_device |
528 | * @pdata_len: amount of memory pointed to by @pdata | 359 | * @pdata_len: amount of memory pointed to by @pdata |
529 | * @pm_lats: pointer to a omap_device_pm_latency array for this device | ||
530 | * @pm_lats_cnt: ARRAY_SIZE() of @pm_lats | ||
531 | * | 360 | * |
532 | * Convenience function for allocating an omap_device structure and filling | 361 | * Convenience function for allocating an omap_device structure and filling |
533 | * hwmods, resources and pm_latency attributes. | 362 | * hwmods, and resources. |
534 | * | 363 | * |
535 | * Returns an struct omap_device pointer or ERR_PTR() on error; | 364 | * Returns an struct omap_device pointer or ERR_PTR() on error; |
536 | */ | 365 | */ |
537 | struct omap_device *omap_device_alloc(struct platform_device *pdev, | 366 | struct omap_device *omap_device_alloc(struct platform_device *pdev, |
538 | struct omap_hwmod **ohs, int oh_cnt, | 367 | struct omap_hwmod **ohs, int oh_cnt) |
539 | struct omap_device_pm_latency *pm_lats, | ||
540 | int pm_lats_cnt) | ||
541 | { | 368 | { |
542 | int ret = -ENOMEM; | 369 | int ret = -ENOMEM; |
543 | struct omap_device *od; | 370 | struct omap_device *od; |
@@ -626,18 +453,6 @@ struct omap_device *omap_device_alloc(struct platform_device *pdev, | |||
626 | goto oda_exit3; | 453 | goto oda_exit3; |
627 | 454 | ||
628 | have_everything: | 455 | have_everything: |
629 | if (!pm_lats) { | ||
630 | pm_lats = omap_default_latency; | ||
631 | pm_lats_cnt = ARRAY_SIZE(omap_default_latency); | ||
632 | } | ||
633 | |||
634 | od->pm_lats_cnt = pm_lats_cnt; | ||
635 | od->pm_lats = kmemdup(pm_lats, | ||
636 | sizeof(struct omap_device_pm_latency) * pm_lats_cnt, | ||
637 | GFP_KERNEL); | ||
638 | if (!od->pm_lats) | ||
639 | goto oda_exit3; | ||
640 | |||
641 | pdev->archdata.od = od; | 456 | pdev->archdata.od = od; |
642 | 457 | ||
643 | for (i = 0; i < oh_cnt; i++) { | 458 | for (i = 0; i < oh_cnt; i++) { |
@@ -663,7 +478,6 @@ void omap_device_delete(struct omap_device *od) | |||
663 | return; | 478 | return; |
664 | 479 | ||
665 | od->pdev->archdata.od = NULL; | 480 | od->pdev->archdata.od = NULL; |
666 | kfree(od->pm_lats); | ||
667 | kfree(od->hwmods); | 481 | kfree(od->hwmods); |
668 | kfree(od); | 482 | kfree(od); |
669 | } | 483 | } |
@@ -675,9 +489,6 @@ void omap_device_delete(struct omap_device *od) | |||
675 | * @oh: ptr to the single omap_hwmod that backs this omap_device | 489 | * @oh: ptr to the single omap_hwmod that backs this omap_device |
676 | * @pdata: platform_data ptr to associate with the platform_device | 490 | * @pdata: platform_data ptr to associate with the platform_device |
677 | * @pdata_len: amount of memory pointed to by @pdata | 491 | * @pdata_len: amount of memory pointed to by @pdata |
678 | * @pm_lats: pointer to a omap_device_pm_latency array for this device | ||
679 | * @pm_lats_cnt: ARRAY_SIZE() of @pm_lats | ||
680 | * @is_early_device: should the device be registered as an early device or not | ||
681 | * | 492 | * |
682 | * Convenience function for building and registering a single | 493 | * Convenience function for building and registering a single |
683 | * omap_device record, which in turn builds and registers a | 494 | * omap_device record, which in turn builds and registers a |
@@ -685,11 +496,10 @@ void omap_device_delete(struct omap_device *od) | |||
685 | * information. Returns ERR_PTR(-EINVAL) if @oh is NULL; otherwise, | 496 | * information. Returns ERR_PTR(-EINVAL) if @oh is NULL; otherwise, |
686 | * passes along the return value of omap_device_build_ss(). | 497 | * passes along the return value of omap_device_build_ss(). |
687 | */ | 498 | */ |
688 | struct platform_device __init *omap_device_build(const char *pdev_name, int pdev_id, | 499 | struct platform_device __init *omap_device_build(const char *pdev_name, |
689 | struct omap_hwmod *oh, void *pdata, | 500 | int pdev_id, |
690 | int pdata_len, | 501 | struct omap_hwmod *oh, |
691 | struct omap_device_pm_latency *pm_lats, | 502 | void *pdata, int pdata_len) |
692 | int pm_lats_cnt, int is_early_device) | ||
693 | { | 503 | { |
694 | struct omap_hwmod *ohs[] = { oh }; | 504 | struct omap_hwmod *ohs[] = { oh }; |
695 | 505 | ||
@@ -697,8 +507,7 @@ struct platform_device __init *omap_device_build(const char *pdev_name, int pdev | |||
697 | return ERR_PTR(-EINVAL); | 507 | return ERR_PTR(-EINVAL); |
698 | 508 | ||
699 | return omap_device_build_ss(pdev_name, pdev_id, ohs, 1, pdata, | 509 | return omap_device_build_ss(pdev_name, pdev_id, ohs, 1, pdata, |
700 | pdata_len, pm_lats, pm_lats_cnt, | 510 | pdata_len); |
701 | is_early_device); | ||
702 | } | 511 | } |
703 | 512 | ||
704 | /** | 513 | /** |
@@ -708,9 +517,6 @@ struct platform_device __init *omap_device_build(const char *pdev_name, int pdev | |||
708 | * @oh: ptr to the single omap_hwmod that backs this omap_device | 517 | * @oh: ptr to the single omap_hwmod that backs this omap_device |
709 | * @pdata: platform_data ptr to associate with the platform_device | 518 | * @pdata: platform_data ptr to associate with the platform_device |
710 | * @pdata_len: amount of memory pointed to by @pdata | 519 | * @pdata_len: amount of memory pointed to by @pdata |
711 | * @pm_lats: pointer to a omap_device_pm_latency array for this device | ||
712 | * @pm_lats_cnt: ARRAY_SIZE() of @pm_lats | ||
713 | * @is_early_device: should the device be registered as an early device or not | ||
714 | * | 520 | * |
715 | * Convenience function for building and registering an omap_device | 521 | * Convenience function for building and registering an omap_device |
716 | * subsystem record. Subsystem records consist of multiple | 522 | * subsystem record. Subsystem records consist of multiple |
@@ -718,11 +524,11 @@ struct platform_device __init *omap_device_build(const char *pdev_name, int pdev | |||
718 | * platform_device record. Returns an ERR_PTR() on error, or passes | 524 | * platform_device record. Returns an ERR_PTR() on error, or passes |
719 | * along the return value of omap_device_register(). | 525 | * along the return value of omap_device_register(). |
720 | */ | 526 | */ |
721 | struct platform_device __init *omap_device_build_ss(const char *pdev_name, int pdev_id, | 527 | struct platform_device __init *omap_device_build_ss(const char *pdev_name, |
722 | struct omap_hwmod **ohs, int oh_cnt, | 528 | int pdev_id, |
723 | void *pdata, int pdata_len, | 529 | struct omap_hwmod **ohs, |
724 | struct omap_device_pm_latency *pm_lats, | 530 | int oh_cnt, void *pdata, |
725 | int pm_lats_cnt, int is_early_device) | 531 | int pdata_len) |
726 | { | 532 | { |
727 | int ret = -ENOMEM; | 533 | int ret = -ENOMEM; |
728 | struct platform_device *pdev; | 534 | struct platform_device *pdev; |
@@ -746,7 +552,7 @@ struct platform_device __init *omap_device_build_ss(const char *pdev_name, int p | |||
746 | else | 552 | else |
747 | dev_set_name(&pdev->dev, "%s", pdev->name); | 553 | dev_set_name(&pdev->dev, "%s", pdev->name); |
748 | 554 | ||
749 | od = omap_device_alloc(pdev, ohs, oh_cnt, pm_lats, pm_lats_cnt); | 555 | od = omap_device_alloc(pdev, ohs, oh_cnt); |
750 | if (IS_ERR(od)) | 556 | if (IS_ERR(od)) |
751 | goto odbs_exit1; | 557 | goto odbs_exit1; |
752 | 558 | ||
@@ -754,10 +560,7 @@ struct platform_device __init *omap_device_build_ss(const char *pdev_name, int p | |||
754 | if (ret) | 560 | if (ret) |
755 | goto odbs_exit2; | 561 | goto odbs_exit2; |
756 | 562 | ||
757 | if (is_early_device) | 563 | ret = omap_device_register(pdev); |
758 | ret = omap_early_device_register(pdev); | ||
759 | else | ||
760 | ret = omap_device_register(pdev); | ||
761 | if (ret) | 564 | if (ret) |
762 | goto odbs_exit2; | 565 | goto odbs_exit2; |
763 | 566 | ||
@@ -774,24 +577,6 @@ odbs_exit: | |||
774 | return ERR_PTR(ret); | 577 | return ERR_PTR(ret); |
775 | } | 578 | } |
776 | 579 | ||
777 | /** | ||
778 | * omap_early_device_register - register an omap_device as an early platform | ||
779 | * device. | ||
780 | * @od: struct omap_device * to register | ||
781 | * | ||
782 | * Register the omap_device structure. This currently just calls | ||
783 | * platform_early_add_device() on the underlying platform_device. | ||
784 | * Returns 0 by default. | ||
785 | */ | ||
786 | static int __init omap_early_device_register(struct platform_device *pdev) | ||
787 | { | ||
788 | struct platform_device *devices[1]; | ||
789 | |||
790 | devices[0] = pdev; | ||
791 | early_platform_add_devices(devices, 1); | ||
792 | return 0; | ||
793 | } | ||
794 | |||
795 | #ifdef CONFIG_PM_RUNTIME | 580 | #ifdef CONFIG_PM_RUNTIME |
796 | static int _od_runtime_suspend(struct device *dev) | 581 | static int _od_runtime_suspend(struct device *dev) |
797 | { | 582 | { |
@@ -902,10 +687,9 @@ int omap_device_register(struct platform_device *pdev) | |||
902 | * to be accessible and ready to operate. This generally involves | 687 | * to be accessible and ready to operate. This generally involves |
903 | * enabling clocks, setting SYSCONFIG registers; and in the future may | 688 | * enabling clocks, setting SYSCONFIG registers; and in the future may |
904 | * involve remuxing pins. Device drivers should call this function | 689 | * involve remuxing pins. Device drivers should call this function |
905 | * (through platform_data function pointers) where they would normally | 690 | * indirectly via pm_runtime_get*(). Returns -EINVAL if called when |
906 | * enable clocks, etc. Returns -EINVAL if called when the omap_device | 691 | * the omap_device is already enabled, or passes along the return |
907 | * is already enabled, or passes along the return value of | 692 | * value of _omap_device_enable_hwmods(). |
908 | * _omap_device_activate(). | ||
909 | */ | 693 | */ |
910 | int omap_device_enable(struct platform_device *pdev) | 694 | int omap_device_enable(struct platform_device *pdev) |
911 | { | 695 | { |
@@ -921,14 +705,8 @@ int omap_device_enable(struct platform_device *pdev) | |||
921 | return -EINVAL; | 705 | return -EINVAL; |
922 | } | 706 | } |
923 | 707 | ||
924 | /* Enable everything if we're enabling this device from scratch */ | 708 | ret = _omap_device_enable_hwmods(od); |
925 | if (od->_state == OMAP_DEVICE_STATE_UNKNOWN) | ||
926 | od->pm_lat_level = od->pm_lats_cnt; | ||
927 | |||
928 | ret = _omap_device_activate(od, IGNORE_WAKEUP_LAT); | ||
929 | 709 | ||
930 | od->dev_wakeup_lat = 0; | ||
931 | od->_dev_wakeup_lat_limit = UINT_MAX; | ||
932 | od->_state = OMAP_DEVICE_STATE_ENABLED; | 710 | od->_state = OMAP_DEVICE_STATE_ENABLED; |
933 | 711 | ||
934 | return ret; | 712 | return ret; |
@@ -938,14 +716,10 @@ int omap_device_enable(struct platform_device *pdev) | |||
938 | * omap_device_idle - idle an omap_device | 716 | * omap_device_idle - idle an omap_device |
939 | * @od: struct omap_device * to idle | 717 | * @od: struct omap_device * to idle |
940 | * | 718 | * |
941 | * Idle omap_device @od by calling as many .deactivate_func() entries | 719 | * Idle omap_device @od. Device drivers call this function indirectly |
942 | * in the omap_device's pm_lats table as is possible without exceeding | 720 | * via pm_runtime_put*(). Returns -EINVAL if the omap_device is not |
943 | * the device's maximum wakeup latency limit, pm_lat_limit. Device | ||
944 | * drivers should call this function (through platform_data function | ||
945 | * pointers) where they would normally disable clocks after operations | ||
946 | * complete, etc.. Returns -EINVAL if the omap_device is not | ||
947 | * currently enabled, or passes along the return value of | 721 | * currently enabled, or passes along the return value of |
948 | * _omap_device_deactivate(). | 722 | * _omap_device_idle_hwmods(). |
949 | */ | 723 | */ |
950 | int omap_device_idle(struct platform_device *pdev) | 724 | int omap_device_idle(struct platform_device *pdev) |
951 | { | 725 | { |
@@ -961,7 +735,7 @@ int omap_device_idle(struct platform_device *pdev) | |||
961 | return -EINVAL; | 735 | return -EINVAL; |
962 | } | 736 | } |
963 | 737 | ||
964 | ret = _omap_device_deactivate(od, USE_WAKEUP_LAT); | 738 | ret = _omap_device_idle_hwmods(od); |
965 | 739 | ||
966 | od->_state = OMAP_DEVICE_STATE_IDLE; | 740 | od->_state = OMAP_DEVICE_STATE_IDLE; |
967 | 741 | ||
@@ -969,42 +743,6 @@ int omap_device_idle(struct platform_device *pdev) | |||
969 | } | 743 | } |
970 | 744 | ||
971 | /** | 745 | /** |
972 | * omap_device_shutdown - shut down an omap_device | ||
973 | * @od: struct omap_device * to shut down | ||
974 | * | ||
975 | * Shut down omap_device @od by calling all .deactivate_func() entries | ||
976 | * in the omap_device's pm_lats table and then shutting down all of | ||
977 | * the underlying omap_hwmods. Used when a device is being "removed" | ||
978 | * or a device driver is being unloaded. Returns -EINVAL if the | ||
979 | * omap_device is not currently enabled or idle, or passes along the | ||
980 | * return value of _omap_device_deactivate(). | ||
981 | */ | ||
982 | int omap_device_shutdown(struct platform_device *pdev) | ||
983 | { | ||
984 | int ret, i; | ||
985 | struct omap_device *od; | ||
986 | |||
987 | od = to_omap_device(pdev); | ||
988 | |||
989 | if (od->_state != OMAP_DEVICE_STATE_ENABLED && | ||
990 | od->_state != OMAP_DEVICE_STATE_IDLE) { | ||
991 | dev_warn(&pdev->dev, | ||
992 | "omap_device: %s() called from invalid state %d\n", | ||
993 | __func__, od->_state); | ||
994 | return -EINVAL; | ||
995 | } | ||
996 | |||
997 | ret = _omap_device_deactivate(od, IGNORE_WAKEUP_LAT); | ||
998 | |||
999 | for (i = 0; i < od->hwmods_cnt; i++) | ||
1000 | omap_hwmod_shutdown(od->hwmods[i]); | ||
1001 | |||
1002 | od->_state = OMAP_DEVICE_STATE_SHUTDOWN; | ||
1003 | |||
1004 | return ret; | ||
1005 | } | ||
1006 | |||
1007 | /** | ||
1008 | * omap_device_assert_hardreset - set a device's hardreset line | 746 | * omap_device_assert_hardreset - set a device's hardreset line |
1009 | * @pdev: struct platform_device * to reset | 747 | * @pdev: struct platform_device * to reset |
1010 | * @name: const char * name of the reset line | 748 | * @name: const char * name of the reset line |
@@ -1060,86 +798,6 @@ int omap_device_deassert_hardreset(struct platform_device *pdev, | |||
1060 | } | 798 | } |
1061 | 799 | ||
1062 | /** | 800 | /** |
1063 | * omap_device_align_pm_lat - activate/deactivate device to match wakeup lat lim | ||
1064 | * @od: struct omap_device * | ||
1065 | * | ||
1066 | * When a device's maximum wakeup latency limit changes, call some of | ||
1067 | * the .activate_func or .deactivate_func function pointers in the | ||
1068 | * omap_device's pm_lats array to ensure that the device's maximum | ||
1069 | * wakeup latency is less than or equal to the new latency limit. | ||
1070 | * Intended to be called by OMAP PM code whenever a device's maximum | ||
1071 | * wakeup latency limit changes (e.g., via | ||
1072 | * omap_pm_set_dev_wakeup_lat()). Returns 0 if nothing needs to be | ||
1073 | * done (e.g., if the omap_device is not currently idle, or if the | ||
1074 | * wakeup latency is already current with the new limit) or passes | ||
1075 | * along the return value of _omap_device_deactivate() or | ||
1076 | * _omap_device_activate(). | ||
1077 | */ | ||
1078 | int omap_device_align_pm_lat(struct platform_device *pdev, | ||
1079 | u32 new_wakeup_lat_limit) | ||
1080 | { | ||
1081 | int ret = -EINVAL; | ||
1082 | struct omap_device *od; | ||
1083 | |||
1084 | od = to_omap_device(pdev); | ||
1085 | |||
1086 | if (new_wakeup_lat_limit == od->dev_wakeup_lat) | ||
1087 | return 0; | ||
1088 | |||
1089 | od->_dev_wakeup_lat_limit = new_wakeup_lat_limit; | ||
1090 | |||
1091 | if (od->_state != OMAP_DEVICE_STATE_IDLE) | ||
1092 | return 0; | ||
1093 | else if (new_wakeup_lat_limit > od->dev_wakeup_lat) | ||
1094 | ret = _omap_device_deactivate(od, USE_WAKEUP_LAT); | ||
1095 | else if (new_wakeup_lat_limit < od->dev_wakeup_lat) | ||
1096 | ret = _omap_device_activate(od, USE_WAKEUP_LAT); | ||
1097 | |||
1098 | return ret; | ||
1099 | } | ||
1100 | |||
1101 | /** | ||
1102 | * omap_device_get_pwrdm - return the powerdomain * associated with @od | ||
1103 | * @od: struct omap_device * | ||
1104 | * | ||
1105 | * Return the powerdomain associated with the first underlying | ||
1106 | * omap_hwmod for this omap_device. Intended for use by core OMAP PM | ||
1107 | * code. Returns NULL on error or a struct powerdomain * upon | ||
1108 | * success. | ||
1109 | */ | ||
1110 | struct powerdomain *omap_device_get_pwrdm(struct omap_device *od) | ||
1111 | { | ||
1112 | /* | ||
1113 | * XXX Assumes that all omap_hwmod powerdomains are identical. | ||
1114 | * This may not necessarily be true. There should be a sanity | ||
1115 | * check in here to WARN() if any difference appears. | ||
1116 | */ | ||
1117 | if (!od->hwmods_cnt) | ||
1118 | return NULL; | ||
1119 | |||
1120 | return omap_hwmod_get_pwrdm(od->hwmods[0]); | ||
1121 | } | ||
1122 | |||
1123 | /** | ||
1124 | * omap_device_get_mpu_rt_va - return the MPU's virtual addr for the hwmod base | ||
1125 | * @od: struct omap_device * | ||
1126 | * | ||
1127 | * Return the MPU's virtual address for the base of the hwmod, from | ||
1128 | * the ioremap() that the hwmod code does. Only valid if there is one | ||
1129 | * hwmod associated with this device. Returns NULL if there are zero | ||
1130 | * or more than one hwmods associated with this omap_device; | ||
1131 | * otherwise, passes along the return value from | ||
1132 | * omap_hwmod_get_mpu_rt_va(). | ||
1133 | */ | ||
1134 | void __iomem *omap_device_get_rt_va(struct omap_device *od) | ||
1135 | { | ||
1136 | if (od->hwmods_cnt != 1) | ||
1137 | return NULL; | ||
1138 | |||
1139 | return omap_hwmod_get_mpu_rt_va(od->hwmods[0]); | ||
1140 | } | ||
1141 | |||
1142 | /** | ||
1143 | * omap_device_get_by_hwmod_name() - convert a hwmod name to | 801 | * omap_device_get_by_hwmod_name() - convert a hwmod name to |
1144 | * device pointer. | 802 | * device pointer. |
1145 | * @oh_name: name of the hwmod device | 803 | * @oh_name: name of the hwmod device |
@@ -1170,82 +828,6 @@ struct device *omap_device_get_by_hwmod_name(const char *oh_name) | |||
1170 | 828 | ||
1171 | return &oh->od->pdev->dev; | 829 | return &oh->od->pdev->dev; |
1172 | } | 830 | } |
1173 | EXPORT_SYMBOL(omap_device_get_by_hwmod_name); | ||
1174 | |||
1175 | /* | ||
1176 | * Public functions intended for use in omap_device_pm_latency | ||
1177 | * .activate_func and .deactivate_func function pointers | ||
1178 | */ | ||
1179 | |||
1180 | /** | ||
1181 | * omap_device_enable_hwmods - call omap_hwmod_enable() on all hwmods | ||
1182 | * @od: struct omap_device *od | ||
1183 | * | ||
1184 | * Enable all underlying hwmods. Returns 0. | ||
1185 | */ | ||
1186 | int omap_device_enable_hwmods(struct omap_device *od) | ||
1187 | { | ||
1188 | int i; | ||
1189 | |||
1190 | for (i = 0; i < od->hwmods_cnt; i++) | ||
1191 | omap_hwmod_enable(od->hwmods[i]); | ||
1192 | |||
1193 | /* XXX pass along return value here? */ | ||
1194 | return 0; | ||
1195 | } | ||
1196 | |||
1197 | /** | ||
1198 | * omap_device_idle_hwmods - call omap_hwmod_idle() on all hwmods | ||
1199 | * @od: struct omap_device *od | ||
1200 | * | ||
1201 | * Idle all underlying hwmods. Returns 0. | ||
1202 | */ | ||
1203 | int omap_device_idle_hwmods(struct omap_device *od) | ||
1204 | { | ||
1205 | int i; | ||
1206 | |||
1207 | for (i = 0; i < od->hwmods_cnt; i++) | ||
1208 | omap_hwmod_idle(od->hwmods[i]); | ||
1209 | |||
1210 | /* XXX pass along return value here? */ | ||
1211 | return 0; | ||
1212 | } | ||
1213 | |||
1214 | /** | ||
1215 | * omap_device_disable_clocks - disable all main and interface clocks | ||
1216 | * @od: struct omap_device *od | ||
1217 | * | ||
1218 | * Disable the main functional clock and interface clock for all of the | ||
1219 | * omap_hwmods associated with the omap_device. Returns 0. | ||
1220 | */ | ||
1221 | int omap_device_disable_clocks(struct omap_device *od) | ||
1222 | { | ||
1223 | int i; | ||
1224 | |||
1225 | for (i = 0; i < od->hwmods_cnt; i++) | ||
1226 | omap_hwmod_disable_clocks(od->hwmods[i]); | ||
1227 | |||
1228 | /* XXX pass along return value here? */ | ||
1229 | return 0; | ||
1230 | } | ||
1231 | |||
1232 | /** | ||
1233 | * omap_device_enable_clocks - enable all main and interface clocks | ||
1234 | * @od: struct omap_device *od | ||
1235 | * | ||
1236 | * Enable the main functional clock and interface clock for all of the | ||
1237 | * omap_hwmods associated with the omap_device. Returns 0. | ||
1238 | */ | ||
1239 | int omap_device_enable_clocks(struct omap_device *od) | ||
1240 | { | ||
1241 | int i; | ||
1242 | |||
1243 | for (i = 0; i < od->hwmods_cnt; i++) | ||
1244 | omap_hwmod_enable_clocks(od->hwmods[i]); | ||
1245 | |||
1246 | /* XXX pass along return value here? */ | ||
1247 | return 0; | ||
1248 | } | ||
1249 | 831 | ||
1250 | static struct notifier_block platform_nb = { | 832 | static struct notifier_block platform_nb = { |
1251 | .notifier_call = _omap_device_notifier_call, | 833 | .notifier_call = _omap_device_notifier_call, |
@@ -1256,7 +838,7 @@ static int __init omap_device_init(void) | |||
1256 | bus_register_notifier(&platform_bus_type, &platform_nb); | 838 | bus_register_notifier(&platform_bus_type, &platform_nb); |
1257 | return 0; | 839 | return 0; |
1258 | } | 840 | } |
1259 | core_initcall(omap_device_init); | 841 | omap_core_initcall(omap_device_init); |
1260 | 842 | ||
1261 | /** | 843 | /** |
1262 | * omap_device_late_idle - idle devices without drivers | 844 | * omap_device_late_idle - idle devices without drivers |
@@ -1294,4 +876,4 @@ static int __init omap_device_late_init(void) | |||
1294 | bus_for_each_dev(&platform_bus_type, NULL, NULL, omap_device_late_idle); | 876 | bus_for_each_dev(&platform_bus_type, NULL, NULL, omap_device_late_idle); |
1295 | return 0; | 877 | return 0; |
1296 | } | 878 | } |
1297 | late_initcall(omap_device_late_init); | 879 | omap_late_initcall(omap_device_late_init); |
diff --git a/arch/arm/mach-omap2/omap_device.h b/arch/arm/mach-omap2/omap_device.h index 0933c599bf89..044c31d50e5b 100644 --- a/arch/arm/mach-omap2/omap_device.h +++ b/arch/arm/mach-omap2/omap_device.h | |||
@@ -13,20 +13,12 @@ | |||
13 | * it under the terms of the GNU General Public License version 2 as | 13 | * it under the terms of the GNU General Public License version 2 as |
14 | * published by the Free Software Foundation. | 14 | * published by the Free Software Foundation. |
15 | * | 15 | * |
16 | * Eventually this type of functionality should either be | 16 | * This type of functionality should be implemented as a proper |
17 | * a) implemented via arch-specific pointers in platform_device | 17 | * omap_bus/omap_device in Linux. |
18 | * or | ||
19 | * b) implemented as a proper omap_bus/omap_device in Linux, no more | ||
20 | * platform_device | ||
21 | * | 18 | * |
22 | * omap_device differs from omap_hwmod in that it includes external | 19 | * omap_device differs from omap_hwmod in that it includes external |
23 | * (e.g., board- and system-level) integration details. omap_hwmod | 20 | * (e.g., board- and system-level) integration details. omap_hwmod |
24 | * stores hardware data that is invariant for a given OMAP chip. | 21 | * stores hardware data that is invariant for a given OMAP chip. |
25 | * | ||
26 | * To do: | ||
27 | * - GPIO integration | ||
28 | * - regulator integration | ||
29 | * | ||
30 | */ | 22 | */ |
31 | #ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_DEVICE_H | 23 | #ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_DEVICE_H |
32 | #define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_DEVICE_H | 24 | #define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_DEVICE_H |
@@ -45,19 +37,14 @@ extern struct dev_pm_domain omap_device_pm_domain; | |||
45 | #define OMAP_DEVICE_STATE_SHUTDOWN 3 | 37 | #define OMAP_DEVICE_STATE_SHUTDOWN 3 |
46 | 38 | ||
47 | /* omap_device.flags values */ | 39 | /* omap_device.flags values */ |
48 | #define OMAP_DEVICE_SUSPENDED BIT(0) | 40 | #define OMAP_DEVICE_SUSPENDED BIT(0) |
49 | #define OMAP_DEVICE_NO_IDLE_ON_SUSPEND BIT(1) | 41 | #define OMAP_DEVICE_NO_IDLE_ON_SUSPEND BIT(1) |
50 | 42 | ||
51 | /** | 43 | /** |
52 | * struct omap_device - omap_device wrapper for platform_devices | 44 | * struct omap_device - omap_device wrapper for platform_devices |
53 | * @pdev: platform_device | 45 | * @pdev: platform_device |
54 | * @hwmods: (one .. many per omap_device) | 46 | * @hwmods: (one .. many per omap_device) |
55 | * @hwmods_cnt: ARRAY_SIZE() of @hwmods | 47 | * @hwmods_cnt: ARRAY_SIZE() of @hwmods |
56 | * @pm_lats: ptr to an omap_device_pm_latency table | ||
57 | * @pm_lats_cnt: ARRAY_SIZE() of what is passed to @pm_lats | ||
58 | * @pm_lat_level: array index of the last odpl entry executed - -1 if never | ||
59 | * @dev_wakeup_lat: dev wakeup latency in nanoseconds | ||
60 | * @_dev_wakeup_lat_limit: dev wakeup latency limit in nsec - set by OMAP PM | ||
61 | * @_state: one of OMAP_DEVICE_STATE_* (see above) | 48 | * @_state: one of OMAP_DEVICE_STATE_* (see above) |
62 | * @flags: device flags | 49 | * @flags: device flags |
63 | * @_driver_status: one of BUS_NOTIFY_*_DRIVER from <linux/device.h> | 50 | * @_driver_status: one of BUS_NOTIFY_*_DRIVER from <linux/device.h> |
@@ -71,12 +58,7 @@ extern struct dev_pm_domain omap_device_pm_domain; | |||
71 | struct omap_device { | 58 | struct omap_device { |
72 | struct platform_device *pdev; | 59 | struct platform_device *pdev; |
73 | struct omap_hwmod **hwmods; | 60 | struct omap_hwmod **hwmods; |
74 | struct omap_device_pm_latency *pm_lats; | ||
75 | u32 dev_wakeup_lat; | ||
76 | u32 _dev_wakeup_lat_limit; | ||
77 | unsigned long _driver_status; | 61 | unsigned long _driver_status; |
78 | u8 pm_lats_cnt; | ||
79 | s8 pm_lat_level; | ||
80 | u8 hwmods_cnt; | 62 | u8 hwmods_cnt; |
81 | u8 _state; | 63 | u8 _state; |
82 | u8 flags; | 64 | u8 flags; |
@@ -86,36 +68,25 @@ struct omap_device { | |||
86 | 68 | ||
87 | int omap_device_enable(struct platform_device *pdev); | 69 | int omap_device_enable(struct platform_device *pdev); |
88 | int omap_device_idle(struct platform_device *pdev); | 70 | int omap_device_idle(struct platform_device *pdev); |
89 | int omap_device_shutdown(struct platform_device *pdev); | ||
90 | 71 | ||
91 | /* Core code interface */ | 72 | /* Core code interface */ |
92 | 73 | ||
93 | struct platform_device *omap_device_build(const char *pdev_name, int pdev_id, | 74 | struct platform_device *omap_device_build(const char *pdev_name, int pdev_id, |
94 | struct omap_hwmod *oh, void *pdata, | 75 | struct omap_hwmod *oh, void *pdata, |
95 | int pdata_len, | 76 | int pdata_len); |
96 | struct omap_device_pm_latency *pm_lats, | ||
97 | int pm_lats_cnt, int is_early_device); | ||
98 | 77 | ||
99 | struct platform_device *omap_device_build_ss(const char *pdev_name, int pdev_id, | 78 | struct platform_device *omap_device_build_ss(const char *pdev_name, int pdev_id, |
100 | struct omap_hwmod **oh, int oh_cnt, | 79 | struct omap_hwmod **oh, int oh_cnt, |
101 | void *pdata, int pdata_len, | 80 | void *pdata, int pdata_len); |
102 | struct omap_device_pm_latency *pm_lats, | ||
103 | int pm_lats_cnt, int is_early_device); | ||
104 | 81 | ||
105 | struct omap_device *omap_device_alloc(struct platform_device *pdev, | 82 | struct omap_device *omap_device_alloc(struct platform_device *pdev, |
106 | struct omap_hwmod **ohs, int oh_cnt, | 83 | struct omap_hwmod **ohs, int oh_cnt); |
107 | struct omap_device_pm_latency *pm_lats, | ||
108 | int pm_lats_cnt); | ||
109 | void omap_device_delete(struct omap_device *od); | 84 | void omap_device_delete(struct omap_device *od); |
110 | int omap_device_register(struct platform_device *pdev); | 85 | int omap_device_register(struct platform_device *pdev); |
111 | 86 | ||
112 | void __iomem *omap_device_get_rt_va(struct omap_device *od); | ||
113 | struct device *omap_device_get_by_hwmod_name(const char *oh_name); | 87 | struct device *omap_device_get_by_hwmod_name(const char *oh_name); |
114 | 88 | ||
115 | /* OMAP PM interface */ | 89 | /* OMAP PM interface */ |
116 | int omap_device_align_pm_lat(struct platform_device *pdev, | ||
117 | u32 new_wakeup_lat_limit); | ||
118 | struct powerdomain *omap_device_get_pwrdm(struct omap_device *od); | ||
119 | int omap_device_get_context_loss_count(struct platform_device *pdev); | 90 | int omap_device_get_context_loss_count(struct platform_device *pdev); |
120 | 91 | ||
121 | /* Other */ | 92 | /* Other */ |
@@ -124,40 +95,6 @@ int omap_device_assert_hardreset(struct platform_device *pdev, | |||
124 | const char *name); | 95 | const char *name); |
125 | int omap_device_deassert_hardreset(struct platform_device *pdev, | 96 | int omap_device_deassert_hardreset(struct platform_device *pdev, |
126 | const char *name); | 97 | const char *name); |
127 | int omap_device_idle_hwmods(struct omap_device *od); | ||
128 | int omap_device_enable_hwmods(struct omap_device *od); | ||
129 | |||
130 | int omap_device_disable_clocks(struct omap_device *od); | ||
131 | int omap_device_enable_clocks(struct omap_device *od); | ||
132 | |||
133 | /* | ||
134 | * Entries should be kept in latency order ascending | ||
135 | * | ||
136 | * deact_lat is the maximum number of microseconds required to complete | ||
137 | * deactivate_func() at the device's slowest OPP. | ||
138 | * | ||
139 | * act_lat is the maximum number of microseconds required to complete | ||
140 | * activate_func() at the device's slowest OPP. | ||
141 | * | ||
142 | * This will result in some suboptimal power management decisions at fast | ||
143 | * OPPs, but avoids having to recompute all device power management decisions | ||
144 | * if the system shifts from a fast OPP to a slow OPP (in order to meet | ||
145 | * latency requirements). | ||
146 | * | ||
147 | * XXX should deactivate_func/activate_func() take platform_device pointers | ||
148 | * rather than omap_device pointers? | ||
149 | */ | ||
150 | struct omap_device_pm_latency { | ||
151 | u32 deactivate_lat; | ||
152 | u32 deactivate_lat_worst; | ||
153 | int (*deactivate_func)(struct omap_device *od); | ||
154 | u32 activate_lat; | ||
155 | u32 activate_lat_worst; | ||
156 | int (*activate_func)(struct omap_device *od); | ||
157 | u32 flags; | ||
158 | }; | ||
159 | |||
160 | #define OMAP_DEVICE_LATENCY_AUTO_ADJUST BIT(1) | ||
161 | 98 | ||
162 | /* Get omap_device pointer from platform_device pointer */ | 99 | /* Get omap_device pointer from platform_device pointer */ |
163 | static inline struct omap_device *to_omap_device(struct platform_device *pdev) | 100 | static inline struct omap_device *to_omap_device(struct platform_device *pdev) |
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index b7c0a2d3f2c7..a62213e2d526 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c | |||
@@ -139,6 +139,8 @@ | |||
139 | #include <linux/slab.h> | 139 | #include <linux/slab.h> |
140 | #include <linux/bootmem.h> | 140 | #include <linux/bootmem.h> |
141 | 141 | ||
142 | #include <asm/system_misc.h> | ||
143 | |||
142 | #include "clock.h" | 144 | #include "clock.h" |
143 | #include "omap_hwmod.h" | 145 | #include "omap_hwmod.h" |
144 | 146 | ||
@@ -2053,6 +2055,23 @@ static int _omap4_get_context_lost(struct omap_hwmod *oh) | |||
2053 | } | 2055 | } |
2054 | 2056 | ||
2055 | /** | 2057 | /** |
2058 | * _enable_preprogram - Pre-program an IP block during the _enable() process | ||
2059 | * @oh: struct omap_hwmod * | ||
2060 | * | ||
2061 | * Some IP blocks (such as AESS) require some additional programming | ||
2062 | * after enable before they can enter idle. If a function pointer to | ||
2063 | * do so is present in the hwmod data, then call it and pass along the | ||
2064 | * return value; otherwise, return 0. | ||
2065 | */ | ||
2066 | static int __init _enable_preprogram(struct omap_hwmod *oh) | ||
2067 | { | ||
2068 | if (!oh->class->enable_preprogram) | ||
2069 | return 0; | ||
2070 | |||
2071 | return oh->class->enable_preprogram(oh); | ||
2072 | } | ||
2073 | |||
2074 | /** | ||
2056 | * _enable - enable an omap_hwmod | 2075 | * _enable - enable an omap_hwmod |
2057 | * @oh: struct omap_hwmod * | 2076 | * @oh: struct omap_hwmod * |
2058 | * | 2077 | * |
@@ -2134,6 +2153,8 @@ static int _enable(struct omap_hwmod *oh) | |||
2134 | _enable_clocks(oh); | 2153 | _enable_clocks(oh); |
2135 | if (soc_ops.enable_module) | 2154 | if (soc_ops.enable_module) |
2136 | soc_ops.enable_module(oh); | 2155 | soc_ops.enable_module(oh); |
2156 | if (oh->flags & HWMOD_BLOCK_WFI) | ||
2157 | disable_hlt(); | ||
2137 | 2158 | ||
2138 | if (soc_ops.update_context_lost) | 2159 | if (soc_ops.update_context_lost) |
2139 | soc_ops.update_context_lost(oh); | 2160 | soc_ops.update_context_lost(oh); |
@@ -2156,6 +2177,7 @@ static int _enable(struct omap_hwmod *oh) | |||
2156 | _update_sysc_cache(oh); | 2177 | _update_sysc_cache(oh); |
2157 | _enable_sysc(oh); | 2178 | _enable_sysc(oh); |
2158 | } | 2179 | } |
2180 | r = _enable_preprogram(oh); | ||
2159 | } else { | 2181 | } else { |
2160 | if (soc_ops.disable_module) | 2182 | if (soc_ops.disable_module) |
2161 | soc_ops.disable_module(oh); | 2183 | soc_ops.disable_module(oh); |
@@ -2195,6 +2217,8 @@ static int _idle(struct omap_hwmod *oh) | |||
2195 | _idle_sysc(oh); | 2217 | _idle_sysc(oh); |
2196 | _del_initiator_dep(oh, mpu_oh); | 2218 | _del_initiator_dep(oh, mpu_oh); |
2197 | 2219 | ||
2220 | if (oh->flags & HWMOD_BLOCK_WFI) | ||
2221 | enable_hlt(); | ||
2198 | if (soc_ops.disable_module) | 2222 | if (soc_ops.disable_module) |
2199 | soc_ops.disable_module(oh); | 2223 | soc_ops.disable_module(oh); |
2200 | 2224 | ||
@@ -2303,6 +2327,8 @@ static int _shutdown(struct omap_hwmod *oh) | |||
2303 | if (oh->_state == _HWMOD_STATE_ENABLED) { | 2327 | if (oh->_state == _HWMOD_STATE_ENABLED) { |
2304 | _del_initiator_dep(oh, mpu_oh); | 2328 | _del_initiator_dep(oh, mpu_oh); |
2305 | /* XXX what about the other system initiators here? dma, dsp */ | 2329 | /* XXX what about the other system initiators here? dma, dsp */ |
2330 | if (oh->flags & HWMOD_BLOCK_WFI) | ||
2331 | enable_hlt(); | ||
2306 | if (soc_ops.disable_module) | 2332 | if (soc_ops.disable_module) |
2307 | soc_ops.disable_module(oh); | 2333 | soc_ops.disable_module(oh); |
2308 | _disable_clocks(oh); | 2334 | _disable_clocks(oh); |
@@ -3041,11 +3067,8 @@ static int _am33xx_assert_hardreset(struct omap_hwmod *oh, | |||
3041 | static int _am33xx_deassert_hardreset(struct omap_hwmod *oh, | 3067 | static int _am33xx_deassert_hardreset(struct omap_hwmod *oh, |
3042 | struct omap_hwmod_rst_info *ohri) | 3068 | struct omap_hwmod_rst_info *ohri) |
3043 | { | 3069 | { |
3044 | if (ohri->st_shift) | ||
3045 | pr_err("omap_hwmod: %s: %s: hwmod data error: OMAP4 does not support st_shift\n", | ||
3046 | oh->name, ohri->name); | ||
3047 | |||
3048 | return am33xx_prm_deassert_hardreset(ohri->rst_shift, | 3070 | return am33xx_prm_deassert_hardreset(ohri->rst_shift, |
3071 | ohri->st_shift, | ||
3049 | oh->clkdm->pwrdm.ptr->prcm_offs, | 3072 | oh->clkdm->pwrdm.ptr->prcm_offs, |
3050 | oh->prcm.omap4.rstctrl_offs, | 3073 | oh->prcm.omap4.rstctrl_offs, |
3051 | oh->prcm.omap4.rstst_offs); | 3074 | oh->prcm.omap4.rstst_offs); |
@@ -3303,7 +3326,7 @@ static int __init omap_hwmod_setup_all(void) | |||
3303 | 3326 | ||
3304 | return 0; | 3327 | return 0; |
3305 | } | 3328 | } |
3306 | core_initcall(omap_hwmod_setup_all); | 3329 | omap_core_initcall(omap_hwmod_setup_all); |
3307 | 3330 | ||
3308 | /** | 3331 | /** |
3309 | * omap_hwmod_enable - enable an omap_hwmod | 3332 | * omap_hwmod_enable - enable an omap_hwmod |
diff --git a/arch/arm/mach-omap2/omap_hwmod.h b/arch/arm/mach-omap2/omap_hwmod.h index 3ae852a522f9..d43d9b608eda 100644 --- a/arch/arm/mach-omap2/omap_hwmod.h +++ b/arch/arm/mach-omap2/omap_hwmod.h | |||
@@ -451,6 +451,14 @@ struct omap_hwmod_omap4_prcm { | |||
451 | * enabled. This prevents the hwmod code from being able to | 451 | * enabled. This prevents the hwmod code from being able to |
452 | * enable and reset the IP block early. XXX Eventually it should | 452 | * enable and reset the IP block early. XXX Eventually it should |
453 | * be possible to query the clock framework for this information. | 453 | * be possible to query the clock framework for this information. |
454 | * HWMOD_BLOCK_WFI: Some OMAP peripherals apparently don't work | ||
455 | * correctly if the MPU is allowed to go idle while the | ||
456 | * peripherals are active. This is apparently true for the I2C on | ||
457 | * OMAP2420, and also the EMAC on AM3517/3505. It's unlikely that | ||
458 | * this is really true -- we're probably not configuring something | ||
459 | * correctly, or this is being abused to deal with some PM latency | ||
460 | * issues -- but we're currently suffering from a shortage of | ||
461 | * folks who are able to track these issues down properly. | ||
454 | */ | 462 | */ |
455 | #define HWMOD_SWSUP_SIDLE (1 << 0) | 463 | #define HWMOD_SWSUP_SIDLE (1 << 0) |
456 | #define HWMOD_SWSUP_MSTANDBY (1 << 1) | 464 | #define HWMOD_SWSUP_MSTANDBY (1 << 1) |
@@ -462,6 +470,7 @@ struct omap_hwmod_omap4_prcm { | |||
462 | #define HWMOD_CONTROL_OPT_CLKS_IN_RESET (1 << 7) | 470 | #define HWMOD_CONTROL_OPT_CLKS_IN_RESET (1 << 7) |
463 | #define HWMOD_16BIT_REG (1 << 8) | 471 | #define HWMOD_16BIT_REG (1 << 8) |
464 | #define HWMOD_EXT_OPT_MAIN_CLK (1 << 9) | 472 | #define HWMOD_EXT_OPT_MAIN_CLK (1 << 9) |
473 | #define HWMOD_BLOCK_WFI (1 << 10) | ||
465 | 474 | ||
466 | /* | 475 | /* |
467 | * omap_hwmod._int_flags definitions | 476 | * omap_hwmod._int_flags definitions |
@@ -501,6 +510,7 @@ struct omap_hwmod_omap4_prcm { | |||
501 | * @rev: revision of the IP class | 510 | * @rev: revision of the IP class |
502 | * @pre_shutdown: ptr to fn to be executed immediately prior to device shutdown | 511 | * @pre_shutdown: ptr to fn to be executed immediately prior to device shutdown |
503 | * @reset: ptr to fn to be executed in place of the standard hwmod reset fn | 512 | * @reset: ptr to fn to be executed in place of the standard hwmod reset fn |
513 | * @enable_preprogram: ptr to fn to be executed during device enable | ||
504 | * | 514 | * |
505 | * Represent the class of a OMAP hardware "modules" (e.g. timer, | 515 | * Represent the class of a OMAP hardware "modules" (e.g. timer, |
506 | * smartreflex, gpio, uart...) | 516 | * smartreflex, gpio, uart...) |
@@ -524,6 +534,7 @@ struct omap_hwmod_class { | |||
524 | u32 rev; | 534 | u32 rev; |
525 | int (*pre_shutdown)(struct omap_hwmod *oh); | 535 | int (*pre_shutdown)(struct omap_hwmod *oh); |
526 | int (*reset)(struct omap_hwmod *oh); | 536 | int (*reset)(struct omap_hwmod *oh); |
537 | int (*enable_preprogram)(struct omap_hwmod *oh); | ||
527 | }; | 538 | }; |
528 | 539 | ||
529 | /** | 540 | /** |
@@ -671,6 +682,12 @@ extern void __init omap_hwmod_init(void); | |||
671 | const char *omap_hwmod_get_main_clk(struct omap_hwmod *oh); | 682 | const char *omap_hwmod_get_main_clk(struct omap_hwmod *oh); |
672 | 683 | ||
673 | /* | 684 | /* |
685 | * | ||
686 | */ | ||
687 | |||
688 | extern int omap_hwmod_aess_preprogram(struct omap_hwmod *oh); | ||
689 | |||
690 | /* | ||
674 | * Chip variant-specific hwmod init routines - XXX should be converted | 691 | * Chip variant-specific hwmod init routines - XXX should be converted |
675 | * to use initcalls once the initial boot ordering is straightened out | 692 | * to use initcalls once the initial boot ordering is straightened out |
676 | */ | 693 | */ |
diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c index b5efe58c0be0..6a764af6c6d3 100644 --- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c | |||
@@ -121,7 +121,12 @@ static struct omap_hwmod omap2420_i2c1_hwmod = { | |||
121 | }, | 121 | }, |
122 | .class = &i2c_class, | 122 | .class = &i2c_class, |
123 | .dev_attr = &i2c_dev_attr, | 123 | .dev_attr = &i2c_dev_attr, |
124 | .flags = HWMOD_16BIT_REG, | 124 | /* |
125 | * From mach-omap2/pm24xx.c: "Putting MPU into the WFI state | ||
126 | * while a transfer is active seems to cause the I2C block to | ||
127 | * timeout. Why? Good question." | ||
128 | */ | ||
129 | .flags = (HWMOD_16BIT_REG | HWMOD_BLOCK_WFI), | ||
125 | }; | 130 | }; |
126 | 131 | ||
127 | /* I2C2 */ | 132 | /* I2C2 */ |
diff --git a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c index 646c14d9fdb9..26eee4a556ad 100644 --- a/arch/arm/mach-omap2/omap_hwmod_33xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_33xx_data.c | |||
@@ -262,13 +262,15 @@ static struct omap_hwmod am33xx_wkup_m3_hwmod = { | |||
262 | .name = "wkup_m3", | 262 | .name = "wkup_m3", |
263 | .class = &am33xx_wkup_m3_hwmod_class, | 263 | .class = &am33xx_wkup_m3_hwmod_class, |
264 | .clkdm_name = "l4_wkup_aon_clkdm", | 264 | .clkdm_name = "l4_wkup_aon_clkdm", |
265 | .flags = HWMOD_INIT_NO_RESET, /* Keep hardreset asserted */ | 265 | /* Keep hardreset asserted */ |
266 | .flags = HWMOD_INIT_NO_RESET | HWMOD_NO_IDLEST, | ||
266 | .mpu_irqs = am33xx_wkup_m3_irqs, | 267 | .mpu_irqs = am33xx_wkup_m3_irqs, |
267 | .main_clk = "dpll_core_m4_div2_ck", | 268 | .main_clk = "dpll_core_m4_div2_ck", |
268 | .prcm = { | 269 | .prcm = { |
269 | .omap4 = { | 270 | .omap4 = { |
270 | .clkctrl_offs = AM33XX_CM_WKUP_WKUP_M3_CLKCTRL_OFFSET, | 271 | .clkctrl_offs = AM33XX_CM_WKUP_WKUP_M3_CLKCTRL_OFFSET, |
271 | .rstctrl_offs = AM33XX_RM_WKUP_RSTCTRL_OFFSET, | 272 | .rstctrl_offs = AM33XX_RM_WKUP_RSTCTRL_OFFSET, |
273 | .rstst_offs = AM33XX_RM_WKUP_RSTST_OFFSET, | ||
272 | .modulemode = MODULEMODE_SWCTRL, | 274 | .modulemode = MODULEMODE_SWCTRL, |
273 | }, | 275 | }, |
274 | }, | 276 | }, |
@@ -414,7 +416,6 @@ static struct omap_hwmod am33xx_adc_tsc_hwmod = { | |||
414 | * - cEFUSE (doesn't fall under any ocp_if) | 416 | * - cEFUSE (doesn't fall under any ocp_if) |
415 | * - clkdiv32k | 417 | * - clkdiv32k |
416 | * - debugss | 418 | * - debugss |
417 | * - ocmc ram | ||
418 | * - ocp watch point | 419 | * - ocp watch point |
419 | * - aes0 | 420 | * - aes0 |
420 | * - sha0 | 421 | * - sha0 |
@@ -481,25 +482,6 @@ static struct omap_hwmod am33xx_debugss_hwmod = { | |||
481 | }, | 482 | }, |
482 | }; | 483 | }; |
483 | 484 | ||
484 | /* ocmcram */ | ||
485 | static struct omap_hwmod_class am33xx_ocmcram_hwmod_class = { | ||
486 | .name = "ocmcram", | ||
487 | }; | ||
488 | |||
489 | static struct omap_hwmod am33xx_ocmcram_hwmod = { | ||
490 | .name = "ocmcram", | ||
491 | .class = &am33xx_ocmcram_hwmod_class, | ||
492 | .clkdm_name = "l3_clkdm", | ||
493 | .flags = (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET), | ||
494 | .main_clk = "l3_gclk", | ||
495 | .prcm = { | ||
496 | .omap4 = { | ||
497 | .clkctrl_offs = AM33XX_CM_PER_OCMCRAM_CLKCTRL_OFFSET, | ||
498 | .modulemode = MODULEMODE_SWCTRL, | ||
499 | }, | ||
500 | }, | ||
501 | }; | ||
502 | |||
503 | /* ocpwp */ | 485 | /* ocpwp */ |
504 | static struct omap_hwmod_class am33xx_ocpwp_hwmod_class = { | 486 | static struct omap_hwmod_class am33xx_ocpwp_hwmod_class = { |
505 | .name = "ocpwp", | 487 | .name = "ocpwp", |
@@ -570,6 +552,25 @@ static struct omap_hwmod am33xx_sha0_hwmod = { | |||
570 | 552 | ||
571 | #endif | 553 | #endif |
572 | 554 | ||
555 | /* ocmcram */ | ||
556 | static struct omap_hwmod_class am33xx_ocmcram_hwmod_class = { | ||
557 | .name = "ocmcram", | ||
558 | }; | ||
559 | |||
560 | static struct omap_hwmod am33xx_ocmcram_hwmod = { | ||
561 | .name = "ocmcram", | ||
562 | .class = &am33xx_ocmcram_hwmod_class, | ||
563 | .clkdm_name = "l3_clkdm", | ||
564 | .flags = (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET), | ||
565 | .main_clk = "l3_gclk", | ||
566 | .prcm = { | ||
567 | .omap4 = { | ||
568 | .clkctrl_offs = AM33XX_CM_PER_OCMCRAM_CLKCTRL_OFFSET, | ||
569 | .modulemode = MODULEMODE_SWCTRL, | ||
570 | }, | ||
571 | }, | ||
572 | }; | ||
573 | |||
573 | /* 'smartreflex' class */ | 574 | /* 'smartreflex' class */ |
574 | static struct omap_hwmod_class am33xx_smartreflex_hwmod_class = { | 575 | static struct omap_hwmod_class am33xx_smartreflex_hwmod_class = { |
575 | .name = "smartreflex", | 576 | .name = "smartreflex", |
@@ -783,9 +784,7 @@ static struct omap_hwmod am33xx_elm_hwmod = { | |||
783 | }, | 784 | }, |
784 | }; | 785 | }; |
785 | 786 | ||
786 | /* | 787 | /* pwmss */ |
787 | * 'epwmss' class: ecap0,1,2, ehrpwm0,1,2 | ||
788 | */ | ||
789 | static struct omap_hwmod_class_sysconfig am33xx_epwmss_sysc = { | 788 | static struct omap_hwmod_class_sysconfig am33xx_epwmss_sysc = { |
790 | .rev_offs = 0x0, | 789 | .rev_offs = 0x0, |
791 | .sysc_offs = 0x4, | 790 | .sysc_offs = 0x4, |
@@ -801,18 +800,23 @@ static struct omap_hwmod_class am33xx_epwmss_hwmod_class = { | |||
801 | .sysc = &am33xx_epwmss_sysc, | 800 | .sysc = &am33xx_epwmss_sysc, |
802 | }; | 801 | }; |
803 | 802 | ||
804 | /* ehrpwm0 */ | 803 | static struct omap_hwmod_class am33xx_ecap_hwmod_class = { |
805 | static struct omap_hwmod_irq_info am33xx_ehrpwm0_irqs[] = { | 804 | .name = "ecap", |
806 | { .name = "int", .irq = 86 + OMAP_INTC_START, }, | ||
807 | { .name = "tzint", .irq = 58 + OMAP_INTC_START, }, | ||
808 | { .irq = -1 }, | ||
809 | }; | 805 | }; |
810 | 806 | ||
811 | static struct omap_hwmod am33xx_ehrpwm0_hwmod = { | 807 | static struct omap_hwmod_class am33xx_eqep_hwmod_class = { |
812 | .name = "ehrpwm0", | 808 | .name = "eqep", |
809 | }; | ||
810 | |||
811 | static struct omap_hwmod_class am33xx_ehrpwm_hwmod_class = { | ||
812 | .name = "ehrpwm", | ||
813 | }; | ||
814 | |||
815 | /* epwmss0 */ | ||
816 | static struct omap_hwmod am33xx_epwmss0_hwmod = { | ||
817 | .name = "epwmss0", | ||
813 | .class = &am33xx_epwmss_hwmod_class, | 818 | .class = &am33xx_epwmss_hwmod_class, |
814 | .clkdm_name = "l4ls_clkdm", | 819 | .clkdm_name = "l4ls_clkdm", |
815 | .mpu_irqs = am33xx_ehrpwm0_irqs, | ||
816 | .main_clk = "l4ls_gclk", | 820 | .main_clk = "l4ls_gclk", |
817 | .prcm = { | 821 | .prcm = { |
818 | .omap4 = { | 822 | .omap4 = { |
@@ -822,63 +826,58 @@ static struct omap_hwmod am33xx_ehrpwm0_hwmod = { | |||
822 | }, | 826 | }, |
823 | }; | 827 | }; |
824 | 828 | ||
825 | /* ehrpwm1 */ | 829 | /* ecap0 */ |
826 | static struct omap_hwmod_irq_info am33xx_ehrpwm1_irqs[] = { | 830 | static struct omap_hwmod_irq_info am33xx_ecap0_irqs[] = { |
827 | { .name = "int", .irq = 87 + OMAP_INTC_START, }, | 831 | { .irq = 31 + OMAP_INTC_START, }, |
828 | { .name = "tzint", .irq = 59 + OMAP_INTC_START, }, | ||
829 | { .irq = -1 }, | 832 | { .irq = -1 }, |
830 | }; | 833 | }; |
831 | 834 | ||
832 | static struct omap_hwmod am33xx_ehrpwm1_hwmod = { | 835 | static struct omap_hwmod am33xx_ecap0_hwmod = { |
833 | .name = "ehrpwm1", | 836 | .name = "ecap0", |
834 | .class = &am33xx_epwmss_hwmod_class, | 837 | .class = &am33xx_ecap_hwmod_class, |
835 | .clkdm_name = "l4ls_clkdm", | 838 | .clkdm_name = "l4ls_clkdm", |
836 | .mpu_irqs = am33xx_ehrpwm1_irqs, | 839 | .mpu_irqs = am33xx_ecap0_irqs, |
837 | .main_clk = "l4ls_gclk", | 840 | .main_clk = "l4ls_gclk", |
838 | .prcm = { | ||
839 | .omap4 = { | ||
840 | .clkctrl_offs = AM33XX_CM_PER_EPWMSS1_CLKCTRL_OFFSET, | ||
841 | .modulemode = MODULEMODE_SWCTRL, | ||
842 | }, | ||
843 | }, | ||
844 | }; | 841 | }; |
845 | 842 | ||
846 | /* ehrpwm2 */ | 843 | /* eqep0 */ |
847 | static struct omap_hwmod_irq_info am33xx_ehrpwm2_irqs[] = { | 844 | static struct omap_hwmod_irq_info am33xx_eqep0_irqs[] = { |
848 | { .name = "int", .irq = 39 + OMAP_INTC_START, }, | 845 | { .irq = 79 + OMAP_INTC_START, }, |
849 | { .name = "tzint", .irq = 60 + OMAP_INTC_START, }, | ||
850 | { .irq = -1 }, | 846 | { .irq = -1 }, |
851 | }; | 847 | }; |
852 | 848 | ||
853 | static struct omap_hwmod am33xx_ehrpwm2_hwmod = { | 849 | static struct omap_hwmod am33xx_eqep0_hwmod = { |
854 | .name = "ehrpwm2", | 850 | .name = "eqep0", |
855 | .class = &am33xx_epwmss_hwmod_class, | 851 | .class = &am33xx_eqep_hwmod_class, |
856 | .clkdm_name = "l4ls_clkdm", | 852 | .clkdm_name = "l4ls_clkdm", |
857 | .mpu_irqs = am33xx_ehrpwm2_irqs, | 853 | .mpu_irqs = am33xx_eqep0_irqs, |
858 | .main_clk = "l4ls_gclk", | 854 | .main_clk = "l4ls_gclk", |
859 | .prcm = { | ||
860 | .omap4 = { | ||
861 | .clkctrl_offs = AM33XX_CM_PER_EPWMSS2_CLKCTRL_OFFSET, | ||
862 | .modulemode = MODULEMODE_SWCTRL, | ||
863 | }, | ||
864 | }, | ||
865 | }; | 855 | }; |
866 | 856 | ||
867 | /* ecap0 */ | 857 | /* ehrpwm0 */ |
868 | static struct omap_hwmod_irq_info am33xx_ecap0_irqs[] = { | 858 | static struct omap_hwmod_irq_info am33xx_ehrpwm0_irqs[] = { |
869 | { .irq = 31 + OMAP_INTC_START, }, | 859 | { .name = "int", .irq = 86 + OMAP_INTC_START, }, |
860 | { .name = "tzint", .irq = 58 + OMAP_INTC_START, }, | ||
870 | { .irq = -1 }, | 861 | { .irq = -1 }, |
871 | }; | 862 | }; |
872 | 863 | ||
873 | static struct omap_hwmod am33xx_ecap0_hwmod = { | 864 | static struct omap_hwmod am33xx_ehrpwm0_hwmod = { |
874 | .name = "ecap0", | 865 | .name = "ehrpwm0", |
866 | .class = &am33xx_ehrpwm_hwmod_class, | ||
867 | .clkdm_name = "l4ls_clkdm", | ||
868 | .mpu_irqs = am33xx_ehrpwm0_irqs, | ||
869 | .main_clk = "l4ls_gclk", | ||
870 | }; | ||
871 | |||
872 | /* epwmss1 */ | ||
873 | static struct omap_hwmod am33xx_epwmss1_hwmod = { | ||
874 | .name = "epwmss1", | ||
875 | .class = &am33xx_epwmss_hwmod_class, | 875 | .class = &am33xx_epwmss_hwmod_class, |
876 | .clkdm_name = "l4ls_clkdm", | 876 | .clkdm_name = "l4ls_clkdm", |
877 | .mpu_irqs = am33xx_ecap0_irqs, | ||
878 | .main_clk = "l4ls_gclk", | 877 | .main_clk = "l4ls_gclk", |
879 | .prcm = { | 878 | .prcm = { |
880 | .omap4 = { | 879 | .omap4 = { |
881 | .clkctrl_offs = AM33XX_CM_PER_EPWMSS0_CLKCTRL_OFFSET, | 880 | .clkctrl_offs = AM33XX_CM_PER_EPWMSS1_CLKCTRL_OFFSET, |
882 | .modulemode = MODULEMODE_SWCTRL, | 881 | .modulemode = MODULEMODE_SWCTRL, |
883 | }, | 882 | }, |
884 | }, | 883 | }, |
@@ -892,13 +891,50 @@ static struct omap_hwmod_irq_info am33xx_ecap1_irqs[] = { | |||
892 | 891 | ||
893 | static struct omap_hwmod am33xx_ecap1_hwmod = { | 892 | static struct omap_hwmod am33xx_ecap1_hwmod = { |
894 | .name = "ecap1", | 893 | .name = "ecap1", |
895 | .class = &am33xx_epwmss_hwmod_class, | 894 | .class = &am33xx_ecap_hwmod_class, |
896 | .clkdm_name = "l4ls_clkdm", | 895 | .clkdm_name = "l4ls_clkdm", |
897 | .mpu_irqs = am33xx_ecap1_irqs, | 896 | .mpu_irqs = am33xx_ecap1_irqs, |
898 | .main_clk = "l4ls_gclk", | 897 | .main_clk = "l4ls_gclk", |
898 | }; | ||
899 | |||
900 | /* eqep1 */ | ||
901 | static struct omap_hwmod_irq_info am33xx_eqep1_irqs[] = { | ||
902 | { .irq = 88 + OMAP_INTC_START, }, | ||
903 | { .irq = -1 }, | ||
904 | }; | ||
905 | |||
906 | static struct omap_hwmod am33xx_eqep1_hwmod = { | ||
907 | .name = "eqep1", | ||
908 | .class = &am33xx_eqep_hwmod_class, | ||
909 | .clkdm_name = "l4ls_clkdm", | ||
910 | .mpu_irqs = am33xx_eqep1_irqs, | ||
911 | .main_clk = "l4ls_gclk", | ||
912 | }; | ||
913 | |||
914 | /* ehrpwm1 */ | ||
915 | static struct omap_hwmod_irq_info am33xx_ehrpwm1_irqs[] = { | ||
916 | { .name = "int", .irq = 87 + OMAP_INTC_START, }, | ||
917 | { .name = "tzint", .irq = 59 + OMAP_INTC_START, }, | ||
918 | { .irq = -1 }, | ||
919 | }; | ||
920 | |||
921 | static struct omap_hwmod am33xx_ehrpwm1_hwmod = { | ||
922 | .name = "ehrpwm1", | ||
923 | .class = &am33xx_ehrpwm_hwmod_class, | ||
924 | .clkdm_name = "l4ls_clkdm", | ||
925 | .mpu_irqs = am33xx_ehrpwm1_irqs, | ||
926 | .main_clk = "l4ls_gclk", | ||
927 | }; | ||
928 | |||
929 | /* epwmss2 */ | ||
930 | static struct omap_hwmod am33xx_epwmss2_hwmod = { | ||
931 | .name = "epwmss2", | ||
932 | .class = &am33xx_epwmss_hwmod_class, | ||
933 | .clkdm_name = "l4ls_clkdm", | ||
934 | .main_clk = "l4ls_gclk", | ||
899 | .prcm = { | 935 | .prcm = { |
900 | .omap4 = { | 936 | .omap4 = { |
901 | .clkctrl_offs = AM33XX_CM_PER_EPWMSS1_CLKCTRL_OFFSET, | 937 | .clkctrl_offs = AM33XX_CM_PER_EPWMSS2_CLKCTRL_OFFSET, |
902 | .modulemode = MODULEMODE_SWCTRL, | 938 | .modulemode = MODULEMODE_SWCTRL, |
903 | }, | 939 | }, |
904 | }, | 940 | }, |
@@ -912,16 +948,39 @@ static struct omap_hwmod_irq_info am33xx_ecap2_irqs[] = { | |||
912 | 948 | ||
913 | static struct omap_hwmod am33xx_ecap2_hwmod = { | 949 | static struct omap_hwmod am33xx_ecap2_hwmod = { |
914 | .name = "ecap2", | 950 | .name = "ecap2", |
951 | .class = &am33xx_ecap_hwmod_class, | ||
952 | .clkdm_name = "l4ls_clkdm", | ||
915 | .mpu_irqs = am33xx_ecap2_irqs, | 953 | .mpu_irqs = am33xx_ecap2_irqs, |
916 | .class = &am33xx_epwmss_hwmod_class, | 954 | .main_clk = "l4ls_gclk", |
955 | }; | ||
956 | |||
957 | /* eqep2 */ | ||
958 | static struct omap_hwmod_irq_info am33xx_eqep2_irqs[] = { | ||
959 | { .irq = 89 + OMAP_INTC_START, }, | ||
960 | { .irq = -1 }, | ||
961 | }; | ||
962 | |||
963 | static struct omap_hwmod am33xx_eqep2_hwmod = { | ||
964 | .name = "eqep2", | ||
965 | .class = &am33xx_eqep_hwmod_class, | ||
917 | .clkdm_name = "l4ls_clkdm", | 966 | .clkdm_name = "l4ls_clkdm", |
967 | .mpu_irqs = am33xx_eqep2_irqs, | ||
968 | .main_clk = "l4ls_gclk", | ||
969 | }; | ||
970 | |||
971 | /* ehrpwm2 */ | ||
972 | static struct omap_hwmod_irq_info am33xx_ehrpwm2_irqs[] = { | ||
973 | { .name = "int", .irq = 39 + OMAP_INTC_START, }, | ||
974 | { .name = "tzint", .irq = 60 + OMAP_INTC_START, }, | ||
975 | { .irq = -1 }, | ||
976 | }; | ||
977 | |||
978 | static struct omap_hwmod am33xx_ehrpwm2_hwmod = { | ||
979 | .name = "ehrpwm2", | ||
980 | .class = &am33xx_ehrpwm_hwmod_class, | ||
981 | .clkdm_name = "l4ls_clkdm", | ||
982 | .mpu_irqs = am33xx_ehrpwm2_irqs, | ||
918 | .main_clk = "l4ls_gclk", | 983 | .main_clk = "l4ls_gclk", |
919 | .prcm = { | ||
920 | .omap4 = { | ||
921 | .clkctrl_offs = AM33XX_CM_PER_EPWMSS2_CLKCTRL_OFFSET, | ||
922 | .modulemode = MODULEMODE_SWCTRL, | ||
923 | }, | ||
924 | }, | ||
925 | }; | 984 | }; |
926 | 985 | ||
927 | /* | 986 | /* |
@@ -1824,6 +1883,7 @@ static struct omap_hwmod am33xx_tptc0_hwmod = { | |||
1824 | .class = &am33xx_tptc_hwmod_class, | 1883 | .class = &am33xx_tptc_hwmod_class, |
1825 | .clkdm_name = "l3_clkdm", | 1884 | .clkdm_name = "l3_clkdm", |
1826 | .mpu_irqs = am33xx_tptc0_irqs, | 1885 | .mpu_irqs = am33xx_tptc0_irqs, |
1886 | .flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY, | ||
1827 | .main_clk = "l3_gclk", | 1887 | .main_clk = "l3_gclk", |
1828 | .prcm = { | 1888 | .prcm = { |
1829 | .omap4 = { | 1889 | .omap4 = { |
@@ -2496,7 +2556,6 @@ static struct omap_hwmod_addr_space am33xx_cpgmac0_addr_space[] = { | |||
2496 | { | 2556 | { |
2497 | .pa_start = 0x4a100000, | 2557 | .pa_start = 0x4a100000, |
2498 | .pa_end = 0x4a100000 + SZ_2K - 1, | 2558 | .pa_end = 0x4a100000 + SZ_2K - 1, |
2499 | .flags = ADDR_TYPE_RT, | ||
2500 | }, | 2559 | }, |
2501 | /* cpsw wr */ | 2560 | /* cpsw wr */ |
2502 | { | 2561 | { |
@@ -2547,162 +2606,202 @@ static struct omap_hwmod_ocp_if am33xx_l4_ls__elm = { | |||
2547 | .user = OCP_USER_MPU, | 2606 | .user = OCP_USER_MPU, |
2548 | }; | 2607 | }; |
2549 | 2608 | ||
2550 | /* | 2609 | static struct omap_hwmod_addr_space am33xx_epwmss0_addr_space[] = { |
2551 | * Splitting the resources to handle access of PWMSS config space | ||
2552 | * and module specific part independently | ||
2553 | */ | ||
2554 | static struct omap_hwmod_addr_space am33xx_ehrpwm0_addr_space[] = { | ||
2555 | { | 2610 | { |
2556 | .pa_start = 0x48300000, | 2611 | .pa_start = 0x48300000, |
2557 | .pa_end = 0x48300000 + SZ_16 - 1, | 2612 | .pa_end = 0x48300000 + SZ_16 - 1, |
2558 | .flags = ADDR_TYPE_RT | 2613 | .flags = ADDR_TYPE_RT |
2559 | }, | 2614 | }, |
2560 | { | ||
2561 | .pa_start = 0x48300200, | ||
2562 | .pa_end = 0x48300200 + SZ_256 - 1, | ||
2563 | .flags = ADDR_TYPE_RT | ||
2564 | }, | ||
2565 | { } | 2615 | { } |
2566 | }; | 2616 | }; |
2567 | 2617 | ||
2568 | static struct omap_hwmod_ocp_if am33xx_l4_ls__ehrpwm0 = { | 2618 | static struct omap_hwmod_ocp_if am33xx_l4_ls__epwmss0 = { |
2569 | .master = &am33xx_l4_ls_hwmod, | 2619 | .master = &am33xx_l4_ls_hwmod, |
2570 | .slave = &am33xx_ehrpwm0_hwmod, | 2620 | .slave = &am33xx_epwmss0_hwmod, |
2571 | .clk = "l4ls_gclk", | 2621 | .clk = "l4ls_gclk", |
2572 | .addr = am33xx_ehrpwm0_addr_space, | 2622 | .addr = am33xx_epwmss0_addr_space, |
2573 | .user = OCP_USER_MPU, | 2623 | .user = OCP_USER_MPU, |
2574 | }; | 2624 | }; |
2575 | 2625 | ||
2576 | /* | 2626 | static struct omap_hwmod_addr_space am33xx_ecap0_addr_space[] = { |
2577 | * Splitting the resources to handle access of PWMSS config space | ||
2578 | * and module specific part independently | ||
2579 | */ | ||
2580 | static struct omap_hwmod_addr_space am33xx_ehrpwm1_addr_space[] = { | ||
2581 | { | ||
2582 | .pa_start = 0x48302000, | ||
2583 | .pa_end = 0x48302000 + SZ_16 - 1, | ||
2584 | .flags = ADDR_TYPE_RT | ||
2585 | }, | ||
2586 | { | 2627 | { |
2587 | .pa_start = 0x48302200, | 2628 | .pa_start = 0x48300100, |
2588 | .pa_end = 0x48302200 + SZ_256 - 1, | 2629 | .pa_end = 0x48300100 + SZ_128 - 1, |
2589 | .flags = ADDR_TYPE_RT | ||
2590 | }, | 2630 | }, |
2591 | { } | 2631 | { } |
2592 | }; | 2632 | }; |
2593 | 2633 | ||
2594 | static struct omap_hwmod_ocp_if am33xx_l4_ls__ehrpwm1 = { | 2634 | static struct omap_hwmod_ocp_if am33xx_epwmss0__ecap0 = { |
2595 | .master = &am33xx_l4_ls_hwmod, | 2635 | .master = &am33xx_epwmss0_hwmod, |
2596 | .slave = &am33xx_ehrpwm1_hwmod, | 2636 | .slave = &am33xx_ecap0_hwmod, |
2597 | .clk = "l4ls_gclk", | 2637 | .clk = "l4ls_gclk", |
2598 | .addr = am33xx_ehrpwm1_addr_space, | 2638 | .addr = am33xx_ecap0_addr_space, |
2599 | .user = OCP_USER_MPU, | 2639 | .user = OCP_USER_MPU, |
2600 | }; | 2640 | }; |
2601 | 2641 | ||
2602 | /* | 2642 | static struct omap_hwmod_addr_space am33xx_eqep0_addr_space[] = { |
2603 | * Splitting the resources to handle access of PWMSS config space | ||
2604 | * and module specific part independently | ||
2605 | */ | ||
2606 | static struct omap_hwmod_addr_space am33xx_ehrpwm2_addr_space[] = { | ||
2607 | { | 2643 | { |
2608 | .pa_start = 0x48304000, | 2644 | .pa_start = 0x48300180, |
2609 | .pa_end = 0x48304000 + SZ_16 - 1, | 2645 | .pa_end = 0x48300180 + SZ_128 - 1, |
2610 | .flags = ADDR_TYPE_RT | ||
2611 | }, | ||
2612 | { | ||
2613 | .pa_start = 0x48304200, | ||
2614 | .pa_end = 0x48304200 + SZ_256 - 1, | ||
2615 | .flags = ADDR_TYPE_RT | ||
2616 | }, | 2646 | }, |
2617 | { } | 2647 | { } |
2618 | }; | 2648 | }; |
2619 | 2649 | ||
2620 | static struct omap_hwmod_ocp_if am33xx_l4_ls__ehrpwm2 = { | 2650 | static struct omap_hwmod_ocp_if am33xx_epwmss0__eqep0 = { |
2621 | .master = &am33xx_l4_ls_hwmod, | 2651 | .master = &am33xx_epwmss0_hwmod, |
2622 | .slave = &am33xx_ehrpwm2_hwmod, | 2652 | .slave = &am33xx_eqep0_hwmod, |
2623 | .clk = "l4ls_gclk", | 2653 | .clk = "l4ls_gclk", |
2624 | .addr = am33xx_ehrpwm2_addr_space, | 2654 | .addr = am33xx_eqep0_addr_space, |
2625 | .user = OCP_USER_MPU, | 2655 | .user = OCP_USER_MPU, |
2626 | }; | 2656 | }; |
2627 | 2657 | ||
2628 | /* | 2658 | static struct omap_hwmod_addr_space am33xx_ehrpwm0_addr_space[] = { |
2629 | * Splitting the resources to handle access of PWMSS config space | ||
2630 | * and module specific part independently | ||
2631 | */ | ||
2632 | static struct omap_hwmod_addr_space am33xx_ecap0_addr_space[] = { | ||
2633 | { | ||
2634 | .pa_start = 0x48300000, | ||
2635 | .pa_end = 0x48300000 + SZ_16 - 1, | ||
2636 | .flags = ADDR_TYPE_RT | ||
2637 | }, | ||
2638 | { | 2659 | { |
2639 | .pa_start = 0x48300100, | 2660 | .pa_start = 0x48300200, |
2640 | .pa_end = 0x48300100 + SZ_256 - 1, | 2661 | .pa_end = 0x48300200 + SZ_128 - 1, |
2641 | .flags = ADDR_TYPE_RT | ||
2642 | }, | 2662 | }, |
2643 | { } | 2663 | { } |
2644 | }; | 2664 | }; |
2645 | 2665 | ||
2646 | static struct omap_hwmod_ocp_if am33xx_l4_ls__ecap0 = { | 2666 | static struct omap_hwmod_ocp_if am33xx_epwmss0__ehrpwm0 = { |
2647 | .master = &am33xx_l4_ls_hwmod, | 2667 | .master = &am33xx_epwmss0_hwmod, |
2648 | .slave = &am33xx_ecap0_hwmod, | 2668 | .slave = &am33xx_ehrpwm0_hwmod, |
2649 | .clk = "l4ls_gclk", | 2669 | .clk = "l4ls_gclk", |
2650 | .addr = am33xx_ecap0_addr_space, | 2670 | .addr = am33xx_ehrpwm0_addr_space, |
2651 | .user = OCP_USER_MPU, | 2671 | .user = OCP_USER_MPU, |
2652 | }; | 2672 | }; |
2653 | 2673 | ||
2654 | /* | 2674 | |
2655 | * Splitting the resources to handle access of PWMSS config space | 2675 | static struct omap_hwmod_addr_space am33xx_epwmss1_addr_space[] = { |
2656 | * and module specific part independently | ||
2657 | */ | ||
2658 | static struct omap_hwmod_addr_space am33xx_ecap1_addr_space[] = { | ||
2659 | { | 2676 | { |
2660 | .pa_start = 0x48302000, | 2677 | .pa_start = 0x48302000, |
2661 | .pa_end = 0x48302000 + SZ_16 - 1, | 2678 | .pa_end = 0x48302000 + SZ_16 - 1, |
2662 | .flags = ADDR_TYPE_RT | 2679 | .flags = ADDR_TYPE_RT |
2663 | }, | 2680 | }, |
2681 | { } | ||
2682 | }; | ||
2683 | |||
2684 | static struct omap_hwmod_ocp_if am33xx_l4_ls__epwmss1 = { | ||
2685 | .master = &am33xx_l4_ls_hwmod, | ||
2686 | .slave = &am33xx_epwmss1_hwmod, | ||
2687 | .clk = "l4ls_gclk", | ||
2688 | .addr = am33xx_epwmss1_addr_space, | ||
2689 | .user = OCP_USER_MPU, | ||
2690 | }; | ||
2691 | |||
2692 | static struct omap_hwmod_addr_space am33xx_ecap1_addr_space[] = { | ||
2664 | { | 2693 | { |
2665 | .pa_start = 0x48302100, | 2694 | .pa_start = 0x48302100, |
2666 | .pa_end = 0x48302100 + SZ_256 - 1, | 2695 | .pa_end = 0x48302100 + SZ_128 - 1, |
2667 | .flags = ADDR_TYPE_RT | ||
2668 | }, | 2696 | }, |
2669 | { } | 2697 | { } |
2670 | }; | 2698 | }; |
2671 | 2699 | ||
2672 | static struct omap_hwmod_ocp_if am33xx_l4_ls__ecap1 = { | 2700 | static struct omap_hwmod_ocp_if am33xx_epwmss1__ecap1 = { |
2673 | .master = &am33xx_l4_ls_hwmod, | 2701 | .master = &am33xx_epwmss1_hwmod, |
2674 | .slave = &am33xx_ecap1_hwmod, | 2702 | .slave = &am33xx_ecap1_hwmod, |
2675 | .clk = "l4ls_gclk", | 2703 | .clk = "l4ls_gclk", |
2676 | .addr = am33xx_ecap1_addr_space, | 2704 | .addr = am33xx_ecap1_addr_space, |
2677 | .user = OCP_USER_MPU, | 2705 | .user = OCP_USER_MPU, |
2678 | }; | 2706 | }; |
2679 | 2707 | ||
2680 | /* | 2708 | static struct omap_hwmod_addr_space am33xx_eqep1_addr_space[] = { |
2681 | * Splitting the resources to handle access of PWMSS config space | 2709 | { |
2682 | * and module specific part independently | 2710 | .pa_start = 0x48302180, |
2683 | */ | 2711 | .pa_end = 0x48302180 + SZ_128 - 1, |
2684 | static struct omap_hwmod_addr_space am33xx_ecap2_addr_space[] = { | 2712 | }, |
2713 | { } | ||
2714 | }; | ||
2715 | |||
2716 | static struct omap_hwmod_ocp_if am33xx_epwmss1__eqep1 = { | ||
2717 | .master = &am33xx_epwmss1_hwmod, | ||
2718 | .slave = &am33xx_eqep1_hwmod, | ||
2719 | .clk = "l4ls_gclk", | ||
2720 | .addr = am33xx_eqep1_addr_space, | ||
2721 | .user = OCP_USER_MPU, | ||
2722 | }; | ||
2723 | |||
2724 | static struct omap_hwmod_addr_space am33xx_ehrpwm1_addr_space[] = { | ||
2725 | { | ||
2726 | .pa_start = 0x48302200, | ||
2727 | .pa_end = 0x48302200 + SZ_128 - 1, | ||
2728 | }, | ||
2729 | { } | ||
2730 | }; | ||
2731 | |||
2732 | static struct omap_hwmod_ocp_if am33xx_epwmss1__ehrpwm1 = { | ||
2733 | .master = &am33xx_epwmss1_hwmod, | ||
2734 | .slave = &am33xx_ehrpwm1_hwmod, | ||
2735 | .clk = "l4ls_gclk", | ||
2736 | .addr = am33xx_ehrpwm1_addr_space, | ||
2737 | .user = OCP_USER_MPU, | ||
2738 | }; | ||
2739 | |||
2740 | static struct omap_hwmod_addr_space am33xx_epwmss2_addr_space[] = { | ||
2685 | { | 2741 | { |
2686 | .pa_start = 0x48304000, | 2742 | .pa_start = 0x48304000, |
2687 | .pa_end = 0x48304000 + SZ_16 - 1, | 2743 | .pa_end = 0x48304000 + SZ_16 - 1, |
2688 | .flags = ADDR_TYPE_RT | 2744 | .flags = ADDR_TYPE_RT |
2689 | }, | 2745 | }, |
2746 | { } | ||
2747 | }; | ||
2748 | |||
2749 | static struct omap_hwmod_ocp_if am33xx_l4_ls__epwmss2 = { | ||
2750 | .master = &am33xx_l4_ls_hwmod, | ||
2751 | .slave = &am33xx_epwmss2_hwmod, | ||
2752 | .clk = "l4ls_gclk", | ||
2753 | .addr = am33xx_epwmss2_addr_space, | ||
2754 | .user = OCP_USER_MPU, | ||
2755 | }; | ||
2756 | |||
2757 | static struct omap_hwmod_addr_space am33xx_ecap2_addr_space[] = { | ||
2690 | { | 2758 | { |
2691 | .pa_start = 0x48304100, | 2759 | .pa_start = 0x48304100, |
2692 | .pa_end = 0x48304100 + SZ_256 - 1, | 2760 | .pa_end = 0x48304100 + SZ_128 - 1, |
2693 | .flags = ADDR_TYPE_RT | ||
2694 | }, | 2761 | }, |
2695 | { } | 2762 | { } |
2696 | }; | 2763 | }; |
2697 | 2764 | ||
2698 | static struct omap_hwmod_ocp_if am33xx_l4_ls__ecap2 = { | 2765 | static struct omap_hwmod_ocp_if am33xx_epwmss2__ecap2 = { |
2699 | .master = &am33xx_l4_ls_hwmod, | 2766 | .master = &am33xx_epwmss2_hwmod, |
2700 | .slave = &am33xx_ecap2_hwmod, | 2767 | .slave = &am33xx_ecap2_hwmod, |
2701 | .clk = "l4ls_gclk", | 2768 | .clk = "l4ls_gclk", |
2702 | .addr = am33xx_ecap2_addr_space, | 2769 | .addr = am33xx_ecap2_addr_space, |
2703 | .user = OCP_USER_MPU, | 2770 | .user = OCP_USER_MPU, |
2704 | }; | 2771 | }; |
2705 | 2772 | ||
2773 | static struct omap_hwmod_addr_space am33xx_eqep2_addr_space[] = { | ||
2774 | { | ||
2775 | .pa_start = 0x48304180, | ||
2776 | .pa_end = 0x48304180 + SZ_128 - 1, | ||
2777 | }, | ||
2778 | { } | ||
2779 | }; | ||
2780 | |||
2781 | static struct omap_hwmod_ocp_if am33xx_epwmss2__eqep2 = { | ||
2782 | .master = &am33xx_epwmss2_hwmod, | ||
2783 | .slave = &am33xx_eqep2_hwmod, | ||
2784 | .clk = "l4ls_gclk", | ||
2785 | .addr = am33xx_eqep2_addr_space, | ||
2786 | .user = OCP_USER_MPU, | ||
2787 | }; | ||
2788 | |||
2789 | static struct omap_hwmod_addr_space am33xx_ehrpwm2_addr_space[] = { | ||
2790 | { | ||
2791 | .pa_start = 0x48304200, | ||
2792 | .pa_end = 0x48304200 + SZ_128 - 1, | ||
2793 | }, | ||
2794 | { } | ||
2795 | }; | ||
2796 | |||
2797 | static struct omap_hwmod_ocp_if am33xx_epwmss2__ehrpwm2 = { | ||
2798 | .master = &am33xx_epwmss2_hwmod, | ||
2799 | .slave = &am33xx_ehrpwm2_hwmod, | ||
2800 | .clk = "l4ls_gclk", | ||
2801 | .addr = am33xx_ehrpwm2_addr_space, | ||
2802 | .user = OCP_USER_MPU, | ||
2803 | }; | ||
2804 | |||
2706 | /* l3s cfg -> gpmc */ | 2805 | /* l3s cfg -> gpmc */ |
2707 | static struct omap_hwmod_addr_space am33xx_gpmc_addr_space[] = { | 2806 | static struct omap_hwmod_addr_space am33xx_gpmc_addr_space[] = { |
2708 | { | 2807 | { |
@@ -3328,6 +3427,13 @@ static struct omap_hwmod_ocp_if am33xx_l3_s__usbss = { | |||
3328 | .flags = OCPIF_SWSUP_IDLE, | 3427 | .flags = OCPIF_SWSUP_IDLE, |
3329 | }; | 3428 | }; |
3330 | 3429 | ||
3430 | /* l3 main -> ocmc */ | ||
3431 | static struct omap_hwmod_ocp_if am33xx_l3_main__ocmc = { | ||
3432 | .master = &am33xx_l3_main_hwmod, | ||
3433 | .slave = &am33xx_ocmcram_hwmod, | ||
3434 | .user = OCP_USER_MPU | OCP_USER_SDMA, | ||
3435 | }; | ||
3436 | |||
3331 | static struct omap_hwmod_ocp_if *am33xx_hwmod_ocp_ifs[] __initdata = { | 3437 | static struct omap_hwmod_ocp_if *am33xx_hwmod_ocp_ifs[] __initdata = { |
3332 | &am33xx_l4_fw__emif_fw, | 3438 | &am33xx_l4_fw__emif_fw, |
3333 | &am33xx_l3_main__emif, | 3439 | &am33xx_l3_main__emif, |
@@ -3385,12 +3491,18 @@ static struct omap_hwmod_ocp_if *am33xx_hwmod_ocp_ifs[] __initdata = { | |||
3385 | &am33xx_l4_ls__uart6, | 3491 | &am33xx_l4_ls__uart6, |
3386 | &am33xx_l4_ls__spinlock, | 3492 | &am33xx_l4_ls__spinlock, |
3387 | &am33xx_l4_ls__elm, | 3493 | &am33xx_l4_ls__elm, |
3388 | &am33xx_l4_ls__ehrpwm0, | 3494 | &am33xx_l4_ls__epwmss0, |
3389 | &am33xx_l4_ls__ehrpwm1, | 3495 | &am33xx_epwmss0__ecap0, |
3390 | &am33xx_l4_ls__ehrpwm2, | 3496 | &am33xx_epwmss0__eqep0, |
3391 | &am33xx_l4_ls__ecap0, | 3497 | &am33xx_epwmss0__ehrpwm0, |
3392 | &am33xx_l4_ls__ecap1, | 3498 | &am33xx_l4_ls__epwmss1, |
3393 | &am33xx_l4_ls__ecap2, | 3499 | &am33xx_epwmss1__ecap1, |
3500 | &am33xx_epwmss1__eqep1, | ||
3501 | &am33xx_epwmss1__ehrpwm1, | ||
3502 | &am33xx_l4_ls__epwmss2, | ||
3503 | &am33xx_epwmss2__ecap2, | ||
3504 | &am33xx_epwmss2__eqep2, | ||
3505 | &am33xx_epwmss2__ehrpwm2, | ||
3394 | &am33xx_l3_s__gpmc, | 3506 | &am33xx_l3_s__gpmc, |
3395 | &am33xx_l3_main__lcdc, | 3507 | &am33xx_l3_main__lcdc, |
3396 | &am33xx_l4_ls__mcspi0, | 3508 | &am33xx_l4_ls__mcspi0, |
@@ -3398,6 +3510,7 @@ static struct omap_hwmod_ocp_if *am33xx_hwmod_ocp_ifs[] __initdata = { | |||
3398 | &am33xx_l3_main__tptc0, | 3510 | &am33xx_l3_main__tptc0, |
3399 | &am33xx_l3_main__tptc1, | 3511 | &am33xx_l3_main__tptc1, |
3400 | &am33xx_l3_main__tptc2, | 3512 | &am33xx_l3_main__tptc2, |
3513 | &am33xx_l3_main__ocmc, | ||
3401 | &am33xx_l3_s__usbss, | 3514 | &am33xx_l3_s__usbss, |
3402 | &am33xx_l4_hs__cpgmac0, | 3515 | &am33xx_l4_hs__cpgmac0, |
3403 | &am33xx_cpgmac0__mdio, | 3516 | &am33xx_cpgmac0__mdio, |
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c index 8bb2628df34e..ac7e03ec952f 100644 --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | |||
@@ -3493,7 +3493,12 @@ static struct omap_hwmod am35xx_emac_hwmod = { | |||
3493 | .name = "davinci_emac", | 3493 | .name = "davinci_emac", |
3494 | .mpu_irqs = am35xx_emac_mpu_irqs, | 3494 | .mpu_irqs = am35xx_emac_mpu_irqs, |
3495 | .class = &am35xx_emac_class, | 3495 | .class = &am35xx_emac_class, |
3496 | .flags = HWMOD_NO_IDLEST, | 3496 | /* |
3497 | * According to Mark Greer, the MPU will not return from WFI | ||
3498 | * when the EMAC signals an interrupt. | ||
3499 | * http://www.spinics.net/lists/arm-kernel/msg174734.html | ||
3500 | */ | ||
3501 | .flags = (HWMOD_NO_IDLEST | HWMOD_BLOCK_WFI), | ||
3497 | }; | 3502 | }; |
3498 | 3503 | ||
3499 | /* l3_core -> davinci emac interface */ | 3504 | /* l3_core -> davinci emac interface */ |
diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c index 793f54ac7d14..0e47d2e1687c 100644 --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c | |||
@@ -322,6 +322,7 @@ static struct omap_hwmod_class_sysconfig omap44xx_aess_sysc = { | |||
322 | static struct omap_hwmod_class omap44xx_aess_hwmod_class = { | 322 | static struct omap_hwmod_class omap44xx_aess_hwmod_class = { |
323 | .name = "aess", | 323 | .name = "aess", |
324 | .sysc = &omap44xx_aess_sysc, | 324 | .sysc = &omap44xx_aess_sysc, |
325 | .enable_preprogram = omap_hwmod_aess_preprogram, | ||
325 | }; | 326 | }; |
326 | 327 | ||
327 | /* aess */ | 328 | /* aess */ |
@@ -348,7 +349,7 @@ static struct omap_hwmod omap44xx_aess_hwmod = { | |||
348 | .clkdm_name = "abe_clkdm", | 349 | .clkdm_name = "abe_clkdm", |
349 | .mpu_irqs = omap44xx_aess_irqs, | 350 | .mpu_irqs = omap44xx_aess_irqs, |
350 | .sdma_reqs = omap44xx_aess_sdma_reqs, | 351 | .sdma_reqs = omap44xx_aess_sdma_reqs, |
351 | .main_clk = "aess_fck", | 352 | .main_clk = "aess_fclk", |
352 | .prcm = { | 353 | .prcm = { |
353 | .omap4 = { | 354 | .omap4 = { |
354 | .clkctrl_offs = OMAP4_CM1_ABE_AESS_CLKCTRL_OFFSET, | 355 | .clkctrl_offs = OMAP4_CM1_ABE_AESS_CLKCTRL_OFFSET, |
@@ -616,7 +617,7 @@ static struct omap_hwmod omap44xx_dmic_hwmod = { | |||
616 | .clkdm_name = "abe_clkdm", | 617 | .clkdm_name = "abe_clkdm", |
617 | .mpu_irqs = omap44xx_dmic_irqs, | 618 | .mpu_irqs = omap44xx_dmic_irqs, |
618 | .sdma_reqs = omap44xx_dmic_sdma_reqs, | 619 | .sdma_reqs = omap44xx_dmic_sdma_reqs, |
619 | .main_clk = "dmic_fck", | 620 | .main_clk = "func_dmic_abe_gfclk", |
620 | .prcm = { | 621 | .prcm = { |
621 | .omap4 = { | 622 | .omap4 = { |
622 | .clkctrl_offs = OMAP4_CM1_ABE_DMIC_CLKCTRL_OFFSET, | 623 | .clkctrl_offs = OMAP4_CM1_ABE_DMIC_CLKCTRL_OFFSET, |
@@ -1161,7 +1162,7 @@ static struct omap_hwmod omap44xx_gpio1_hwmod = { | |||
1161 | .class = &omap44xx_gpio_hwmod_class, | 1162 | .class = &omap44xx_gpio_hwmod_class, |
1162 | .clkdm_name = "l4_wkup_clkdm", | 1163 | .clkdm_name = "l4_wkup_clkdm", |
1163 | .mpu_irqs = omap44xx_gpio1_irqs, | 1164 | .mpu_irqs = omap44xx_gpio1_irqs, |
1164 | .main_clk = "gpio1_ick", | 1165 | .main_clk = "l4_wkup_clk_mux_ck", |
1165 | .prcm = { | 1166 | .prcm = { |
1166 | .omap4 = { | 1167 | .omap4 = { |
1167 | .clkctrl_offs = OMAP4_CM_WKUP_GPIO1_CLKCTRL_OFFSET, | 1168 | .clkctrl_offs = OMAP4_CM_WKUP_GPIO1_CLKCTRL_OFFSET, |
@@ -1190,7 +1191,7 @@ static struct omap_hwmod omap44xx_gpio2_hwmod = { | |||
1190 | .clkdm_name = "l4_per_clkdm", | 1191 | .clkdm_name = "l4_per_clkdm", |
1191 | .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, | 1192 | .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, |
1192 | .mpu_irqs = omap44xx_gpio2_irqs, | 1193 | .mpu_irqs = omap44xx_gpio2_irqs, |
1193 | .main_clk = "gpio2_ick", | 1194 | .main_clk = "l4_div_ck", |
1194 | .prcm = { | 1195 | .prcm = { |
1195 | .omap4 = { | 1196 | .omap4 = { |
1196 | .clkctrl_offs = OMAP4_CM_L4PER_GPIO2_CLKCTRL_OFFSET, | 1197 | .clkctrl_offs = OMAP4_CM_L4PER_GPIO2_CLKCTRL_OFFSET, |
@@ -1219,7 +1220,7 @@ static struct omap_hwmod omap44xx_gpio3_hwmod = { | |||
1219 | .clkdm_name = "l4_per_clkdm", | 1220 | .clkdm_name = "l4_per_clkdm", |
1220 | .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, | 1221 | .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, |
1221 | .mpu_irqs = omap44xx_gpio3_irqs, | 1222 | .mpu_irqs = omap44xx_gpio3_irqs, |
1222 | .main_clk = "gpio3_ick", | 1223 | .main_clk = "l4_div_ck", |
1223 | .prcm = { | 1224 | .prcm = { |
1224 | .omap4 = { | 1225 | .omap4 = { |
1225 | .clkctrl_offs = OMAP4_CM_L4PER_GPIO3_CLKCTRL_OFFSET, | 1226 | .clkctrl_offs = OMAP4_CM_L4PER_GPIO3_CLKCTRL_OFFSET, |
@@ -1248,7 +1249,7 @@ static struct omap_hwmod omap44xx_gpio4_hwmod = { | |||
1248 | .clkdm_name = "l4_per_clkdm", | 1249 | .clkdm_name = "l4_per_clkdm", |
1249 | .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, | 1250 | .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, |
1250 | .mpu_irqs = omap44xx_gpio4_irqs, | 1251 | .mpu_irqs = omap44xx_gpio4_irqs, |
1251 | .main_clk = "gpio4_ick", | 1252 | .main_clk = "l4_div_ck", |
1252 | .prcm = { | 1253 | .prcm = { |
1253 | .omap4 = { | 1254 | .omap4 = { |
1254 | .clkctrl_offs = OMAP4_CM_L4PER_GPIO4_CLKCTRL_OFFSET, | 1255 | .clkctrl_offs = OMAP4_CM_L4PER_GPIO4_CLKCTRL_OFFSET, |
@@ -1277,7 +1278,7 @@ static struct omap_hwmod omap44xx_gpio5_hwmod = { | |||
1277 | .clkdm_name = "l4_per_clkdm", | 1278 | .clkdm_name = "l4_per_clkdm", |
1278 | .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, | 1279 | .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, |
1279 | .mpu_irqs = omap44xx_gpio5_irqs, | 1280 | .mpu_irqs = omap44xx_gpio5_irqs, |
1280 | .main_clk = "gpio5_ick", | 1281 | .main_clk = "l4_div_ck", |
1281 | .prcm = { | 1282 | .prcm = { |
1282 | .omap4 = { | 1283 | .omap4 = { |
1283 | .clkctrl_offs = OMAP4_CM_L4PER_GPIO5_CLKCTRL_OFFSET, | 1284 | .clkctrl_offs = OMAP4_CM_L4PER_GPIO5_CLKCTRL_OFFSET, |
@@ -1306,7 +1307,7 @@ static struct omap_hwmod omap44xx_gpio6_hwmod = { | |||
1306 | .clkdm_name = "l4_per_clkdm", | 1307 | .clkdm_name = "l4_per_clkdm", |
1307 | .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, | 1308 | .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET, |
1308 | .mpu_irqs = omap44xx_gpio6_irqs, | 1309 | .mpu_irqs = omap44xx_gpio6_irqs, |
1309 | .main_clk = "gpio6_ick", | 1310 | .main_clk = "l4_div_ck", |
1310 | .prcm = { | 1311 | .prcm = { |
1311 | .omap4 = { | 1312 | .omap4 = { |
1312 | .clkctrl_offs = OMAP4_CM_L4PER_GPIO6_CLKCTRL_OFFSET, | 1313 | .clkctrl_offs = OMAP4_CM_L4PER_GPIO6_CLKCTRL_OFFSET, |
@@ -1405,7 +1406,7 @@ static struct omap_hwmod omap44xx_gpu_hwmod = { | |||
1405 | .class = &omap44xx_gpu_hwmod_class, | 1406 | .class = &omap44xx_gpu_hwmod_class, |
1406 | .clkdm_name = "l3_gfx_clkdm", | 1407 | .clkdm_name = "l3_gfx_clkdm", |
1407 | .mpu_irqs = omap44xx_gpu_irqs, | 1408 | .mpu_irqs = omap44xx_gpu_irqs, |
1408 | .main_clk = "gpu_fck", | 1409 | .main_clk = "sgx_clk_mux", |
1409 | .prcm = { | 1410 | .prcm = { |
1410 | .omap4 = { | 1411 | .omap4 = { |
1411 | .clkctrl_offs = OMAP4_CM_GFX_GFX_CLKCTRL_OFFSET, | 1412 | .clkctrl_offs = OMAP4_CM_GFX_GFX_CLKCTRL_OFFSET, |
@@ -1446,7 +1447,7 @@ static struct omap_hwmod omap44xx_hdq1w_hwmod = { | |||
1446 | .clkdm_name = "l4_per_clkdm", | 1447 | .clkdm_name = "l4_per_clkdm", |
1447 | .flags = HWMOD_INIT_NO_RESET, /* XXX temporary */ | 1448 | .flags = HWMOD_INIT_NO_RESET, /* XXX temporary */ |
1448 | .mpu_irqs = omap44xx_hdq1w_irqs, | 1449 | .mpu_irqs = omap44xx_hdq1w_irqs, |
1449 | .main_clk = "hdq1w_fck", | 1450 | .main_clk = "func_12m_fclk", |
1450 | .prcm = { | 1451 | .prcm = { |
1451 | .omap4 = { | 1452 | .omap4 = { |
1452 | .clkctrl_offs = OMAP4_CM_L4PER_HDQ1W_CLKCTRL_OFFSET, | 1453 | .clkctrl_offs = OMAP4_CM_L4PER_HDQ1W_CLKCTRL_OFFSET, |
@@ -1550,7 +1551,7 @@ static struct omap_hwmod omap44xx_i2c1_hwmod = { | |||
1550 | .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT, | 1551 | .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT, |
1551 | .mpu_irqs = omap44xx_i2c1_irqs, | 1552 | .mpu_irqs = omap44xx_i2c1_irqs, |
1552 | .sdma_reqs = omap44xx_i2c1_sdma_reqs, | 1553 | .sdma_reqs = omap44xx_i2c1_sdma_reqs, |
1553 | .main_clk = "i2c1_fck", | 1554 | .main_clk = "func_96m_fclk", |
1554 | .prcm = { | 1555 | .prcm = { |
1555 | .omap4 = { | 1556 | .omap4 = { |
1556 | .clkctrl_offs = OMAP4_CM_L4PER_I2C1_CLKCTRL_OFFSET, | 1557 | .clkctrl_offs = OMAP4_CM_L4PER_I2C1_CLKCTRL_OFFSET, |
@@ -1580,7 +1581,7 @@ static struct omap_hwmod omap44xx_i2c2_hwmod = { | |||
1580 | .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT, | 1581 | .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT, |
1581 | .mpu_irqs = omap44xx_i2c2_irqs, | 1582 | .mpu_irqs = omap44xx_i2c2_irqs, |
1582 | .sdma_reqs = omap44xx_i2c2_sdma_reqs, | 1583 | .sdma_reqs = omap44xx_i2c2_sdma_reqs, |
1583 | .main_clk = "i2c2_fck", | 1584 | .main_clk = "func_96m_fclk", |
1584 | .prcm = { | 1585 | .prcm = { |
1585 | .omap4 = { | 1586 | .omap4 = { |
1586 | .clkctrl_offs = OMAP4_CM_L4PER_I2C2_CLKCTRL_OFFSET, | 1587 | .clkctrl_offs = OMAP4_CM_L4PER_I2C2_CLKCTRL_OFFSET, |
@@ -1610,7 +1611,7 @@ static struct omap_hwmod omap44xx_i2c3_hwmod = { | |||
1610 | .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT, | 1611 | .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT, |
1611 | .mpu_irqs = omap44xx_i2c3_irqs, | 1612 | .mpu_irqs = omap44xx_i2c3_irqs, |
1612 | .sdma_reqs = omap44xx_i2c3_sdma_reqs, | 1613 | .sdma_reqs = omap44xx_i2c3_sdma_reqs, |
1613 | .main_clk = "i2c3_fck", | 1614 | .main_clk = "func_96m_fclk", |
1614 | .prcm = { | 1615 | .prcm = { |
1615 | .omap4 = { | 1616 | .omap4 = { |
1616 | .clkctrl_offs = OMAP4_CM_L4PER_I2C3_CLKCTRL_OFFSET, | 1617 | .clkctrl_offs = OMAP4_CM_L4PER_I2C3_CLKCTRL_OFFSET, |
@@ -1640,7 +1641,7 @@ static struct omap_hwmod omap44xx_i2c4_hwmod = { | |||
1640 | .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT, | 1641 | .flags = HWMOD_16BIT_REG | HWMOD_SET_DEFAULT_CLOCKACT, |
1641 | .mpu_irqs = omap44xx_i2c4_irqs, | 1642 | .mpu_irqs = omap44xx_i2c4_irqs, |
1642 | .sdma_reqs = omap44xx_i2c4_sdma_reqs, | 1643 | .sdma_reqs = omap44xx_i2c4_sdma_reqs, |
1643 | .main_clk = "i2c4_fck", | 1644 | .main_clk = "func_96m_fclk", |
1644 | .prcm = { | 1645 | .prcm = { |
1645 | .omap4 = { | 1646 | .omap4 = { |
1646 | .clkctrl_offs = OMAP4_CM_L4PER_I2C4_CLKCTRL_OFFSET, | 1647 | .clkctrl_offs = OMAP4_CM_L4PER_I2C4_CLKCTRL_OFFSET, |
@@ -1743,7 +1744,7 @@ static struct omap_hwmod omap44xx_iss_hwmod = { | |||
1743 | .clkdm_name = "iss_clkdm", | 1744 | .clkdm_name = "iss_clkdm", |
1744 | .mpu_irqs = omap44xx_iss_irqs, | 1745 | .mpu_irqs = omap44xx_iss_irqs, |
1745 | .sdma_reqs = omap44xx_iss_sdma_reqs, | 1746 | .sdma_reqs = omap44xx_iss_sdma_reqs, |
1746 | .main_clk = "iss_fck", | 1747 | .main_clk = "ducati_clk_mux_ck", |
1747 | .prcm = { | 1748 | .prcm = { |
1748 | .omap4 = { | 1749 | .omap4 = { |
1749 | .clkctrl_offs = OMAP4_CM_CAM_ISS_CLKCTRL_OFFSET, | 1750 | .clkctrl_offs = OMAP4_CM_CAM_ISS_CLKCTRL_OFFSET, |
@@ -1785,7 +1786,7 @@ static struct omap_hwmod omap44xx_iva_hwmod = { | |||
1785 | .mpu_irqs = omap44xx_iva_irqs, | 1786 | .mpu_irqs = omap44xx_iva_irqs, |
1786 | .rst_lines = omap44xx_iva_resets, | 1787 | .rst_lines = omap44xx_iva_resets, |
1787 | .rst_lines_cnt = ARRAY_SIZE(omap44xx_iva_resets), | 1788 | .rst_lines_cnt = ARRAY_SIZE(omap44xx_iva_resets), |
1788 | .main_clk = "iva_fck", | 1789 | .main_clk = "dpll_iva_m5x2_ck", |
1789 | .prcm = { | 1790 | .prcm = { |
1790 | .omap4 = { | 1791 | .omap4 = { |
1791 | .clkctrl_offs = OMAP4_CM_IVAHD_IVAHD_CLKCTRL_OFFSET, | 1792 | .clkctrl_offs = OMAP4_CM_IVAHD_IVAHD_CLKCTRL_OFFSET, |
@@ -1829,7 +1830,7 @@ static struct omap_hwmod omap44xx_kbd_hwmod = { | |||
1829 | .class = &omap44xx_kbd_hwmod_class, | 1830 | .class = &omap44xx_kbd_hwmod_class, |
1830 | .clkdm_name = "l4_wkup_clkdm", | 1831 | .clkdm_name = "l4_wkup_clkdm", |
1831 | .mpu_irqs = omap44xx_kbd_irqs, | 1832 | .mpu_irqs = omap44xx_kbd_irqs, |
1832 | .main_clk = "kbd_fck", | 1833 | .main_clk = "sys_32k_ck", |
1833 | .prcm = { | 1834 | .prcm = { |
1834 | .omap4 = { | 1835 | .omap4 = { |
1835 | .clkctrl_offs = OMAP4_CM_WKUP_KEYBOARD_CLKCTRL_OFFSET, | 1836 | .clkctrl_offs = OMAP4_CM_WKUP_KEYBOARD_CLKCTRL_OFFSET, |
@@ -1920,7 +1921,7 @@ static struct omap_hwmod omap44xx_mcasp_hwmod = { | |||
1920 | .clkdm_name = "abe_clkdm", | 1921 | .clkdm_name = "abe_clkdm", |
1921 | .mpu_irqs = omap44xx_mcasp_irqs, | 1922 | .mpu_irqs = omap44xx_mcasp_irqs, |
1922 | .sdma_reqs = omap44xx_mcasp_sdma_reqs, | 1923 | .sdma_reqs = omap44xx_mcasp_sdma_reqs, |
1923 | .main_clk = "mcasp_fck", | 1924 | .main_clk = "func_mcasp_abe_gfclk", |
1924 | .prcm = { | 1925 | .prcm = { |
1925 | .omap4 = { | 1926 | .omap4 = { |
1926 | .clkctrl_offs = OMAP4_CM1_ABE_MCASP_CLKCTRL_OFFSET, | 1927 | .clkctrl_offs = OMAP4_CM1_ABE_MCASP_CLKCTRL_OFFSET, |
@@ -1972,7 +1973,7 @@ static struct omap_hwmod omap44xx_mcbsp1_hwmod = { | |||
1972 | .clkdm_name = "abe_clkdm", | 1973 | .clkdm_name = "abe_clkdm", |
1973 | .mpu_irqs = omap44xx_mcbsp1_irqs, | 1974 | .mpu_irqs = omap44xx_mcbsp1_irqs, |
1974 | .sdma_reqs = omap44xx_mcbsp1_sdma_reqs, | 1975 | .sdma_reqs = omap44xx_mcbsp1_sdma_reqs, |
1975 | .main_clk = "mcbsp1_fck", | 1976 | .main_clk = "func_mcbsp1_gfclk", |
1976 | .prcm = { | 1977 | .prcm = { |
1977 | .omap4 = { | 1978 | .omap4 = { |
1978 | .clkctrl_offs = OMAP4_CM1_ABE_MCBSP1_CLKCTRL_OFFSET, | 1979 | .clkctrl_offs = OMAP4_CM1_ABE_MCBSP1_CLKCTRL_OFFSET, |
@@ -2007,7 +2008,7 @@ static struct omap_hwmod omap44xx_mcbsp2_hwmod = { | |||
2007 | .clkdm_name = "abe_clkdm", | 2008 | .clkdm_name = "abe_clkdm", |
2008 | .mpu_irqs = omap44xx_mcbsp2_irqs, | 2009 | .mpu_irqs = omap44xx_mcbsp2_irqs, |
2009 | .sdma_reqs = omap44xx_mcbsp2_sdma_reqs, | 2010 | .sdma_reqs = omap44xx_mcbsp2_sdma_reqs, |
2010 | .main_clk = "mcbsp2_fck", | 2011 | .main_clk = "func_mcbsp2_gfclk", |
2011 | .prcm = { | 2012 | .prcm = { |
2012 | .omap4 = { | 2013 | .omap4 = { |
2013 | .clkctrl_offs = OMAP4_CM1_ABE_MCBSP2_CLKCTRL_OFFSET, | 2014 | .clkctrl_offs = OMAP4_CM1_ABE_MCBSP2_CLKCTRL_OFFSET, |
@@ -2042,7 +2043,7 @@ static struct omap_hwmod omap44xx_mcbsp3_hwmod = { | |||
2042 | .clkdm_name = "abe_clkdm", | 2043 | .clkdm_name = "abe_clkdm", |
2043 | .mpu_irqs = omap44xx_mcbsp3_irqs, | 2044 | .mpu_irqs = omap44xx_mcbsp3_irqs, |
2044 | .sdma_reqs = omap44xx_mcbsp3_sdma_reqs, | 2045 | .sdma_reqs = omap44xx_mcbsp3_sdma_reqs, |
2045 | .main_clk = "mcbsp3_fck", | 2046 | .main_clk = "func_mcbsp3_gfclk", |
2046 | .prcm = { | 2047 | .prcm = { |
2047 | .omap4 = { | 2048 | .omap4 = { |
2048 | .clkctrl_offs = OMAP4_CM1_ABE_MCBSP3_CLKCTRL_OFFSET, | 2049 | .clkctrl_offs = OMAP4_CM1_ABE_MCBSP3_CLKCTRL_OFFSET, |
@@ -2077,7 +2078,7 @@ static struct omap_hwmod omap44xx_mcbsp4_hwmod = { | |||
2077 | .clkdm_name = "l4_per_clkdm", | 2078 | .clkdm_name = "l4_per_clkdm", |
2078 | .mpu_irqs = omap44xx_mcbsp4_irqs, | 2079 | .mpu_irqs = omap44xx_mcbsp4_irqs, |
2079 | .sdma_reqs = omap44xx_mcbsp4_sdma_reqs, | 2080 | .sdma_reqs = omap44xx_mcbsp4_sdma_reqs, |
2080 | .main_clk = "mcbsp4_fck", | 2081 | .main_clk = "per_mcbsp4_gfclk", |
2081 | .prcm = { | 2082 | .prcm = { |
2082 | .omap4 = { | 2083 | .omap4 = { |
2083 | .clkctrl_offs = OMAP4_CM_L4PER_MCBSP4_CLKCTRL_OFFSET, | 2084 | .clkctrl_offs = OMAP4_CM_L4PER_MCBSP4_CLKCTRL_OFFSET, |
@@ -2140,7 +2141,7 @@ static struct omap_hwmod omap44xx_mcpdm_hwmod = { | |||
2140 | .flags = HWMOD_EXT_OPT_MAIN_CLK | HWMOD_SWSUP_SIDLE, | 2141 | .flags = HWMOD_EXT_OPT_MAIN_CLK | HWMOD_SWSUP_SIDLE, |
2141 | .mpu_irqs = omap44xx_mcpdm_irqs, | 2142 | .mpu_irqs = omap44xx_mcpdm_irqs, |
2142 | .sdma_reqs = omap44xx_mcpdm_sdma_reqs, | 2143 | .sdma_reqs = omap44xx_mcpdm_sdma_reqs, |
2143 | .main_clk = "mcpdm_fck", | 2144 | .main_clk = "pad_clks_ck", |
2144 | .prcm = { | 2145 | .prcm = { |
2145 | .omap4 = { | 2146 | .omap4 = { |
2146 | .clkctrl_offs = OMAP4_CM1_ABE_PDM_CLKCTRL_OFFSET, | 2147 | .clkctrl_offs = OMAP4_CM1_ABE_PDM_CLKCTRL_OFFSET, |
@@ -2201,7 +2202,7 @@ static struct omap_hwmod omap44xx_mcspi1_hwmod = { | |||
2201 | .clkdm_name = "l4_per_clkdm", | 2202 | .clkdm_name = "l4_per_clkdm", |
2202 | .mpu_irqs = omap44xx_mcspi1_irqs, | 2203 | .mpu_irqs = omap44xx_mcspi1_irqs, |
2203 | .sdma_reqs = omap44xx_mcspi1_sdma_reqs, | 2204 | .sdma_reqs = omap44xx_mcspi1_sdma_reqs, |
2204 | .main_clk = "mcspi1_fck", | 2205 | .main_clk = "func_48m_fclk", |
2205 | .prcm = { | 2206 | .prcm = { |
2206 | .omap4 = { | 2207 | .omap4 = { |
2207 | .clkctrl_offs = OMAP4_CM_L4PER_MCSPI1_CLKCTRL_OFFSET, | 2208 | .clkctrl_offs = OMAP4_CM_L4PER_MCSPI1_CLKCTRL_OFFSET, |
@@ -2237,7 +2238,7 @@ static struct omap_hwmod omap44xx_mcspi2_hwmod = { | |||
2237 | .clkdm_name = "l4_per_clkdm", | 2238 | .clkdm_name = "l4_per_clkdm", |
2238 | .mpu_irqs = omap44xx_mcspi2_irqs, | 2239 | .mpu_irqs = omap44xx_mcspi2_irqs, |
2239 | .sdma_reqs = omap44xx_mcspi2_sdma_reqs, | 2240 | .sdma_reqs = omap44xx_mcspi2_sdma_reqs, |
2240 | .main_clk = "mcspi2_fck", | 2241 | .main_clk = "func_48m_fclk", |
2241 | .prcm = { | 2242 | .prcm = { |
2242 | .omap4 = { | 2243 | .omap4 = { |
2243 | .clkctrl_offs = OMAP4_CM_L4PER_MCSPI2_CLKCTRL_OFFSET, | 2244 | .clkctrl_offs = OMAP4_CM_L4PER_MCSPI2_CLKCTRL_OFFSET, |
@@ -2273,7 +2274,7 @@ static struct omap_hwmod omap44xx_mcspi3_hwmod = { | |||
2273 | .clkdm_name = "l4_per_clkdm", | 2274 | .clkdm_name = "l4_per_clkdm", |
2274 | .mpu_irqs = omap44xx_mcspi3_irqs, | 2275 | .mpu_irqs = omap44xx_mcspi3_irqs, |
2275 | .sdma_reqs = omap44xx_mcspi3_sdma_reqs, | 2276 | .sdma_reqs = omap44xx_mcspi3_sdma_reqs, |
2276 | .main_clk = "mcspi3_fck", | 2277 | .main_clk = "func_48m_fclk", |
2277 | .prcm = { | 2278 | .prcm = { |
2278 | .omap4 = { | 2279 | .omap4 = { |
2279 | .clkctrl_offs = OMAP4_CM_L4PER_MCSPI3_CLKCTRL_OFFSET, | 2280 | .clkctrl_offs = OMAP4_CM_L4PER_MCSPI3_CLKCTRL_OFFSET, |
@@ -2307,7 +2308,7 @@ static struct omap_hwmod omap44xx_mcspi4_hwmod = { | |||
2307 | .clkdm_name = "l4_per_clkdm", | 2308 | .clkdm_name = "l4_per_clkdm", |
2308 | .mpu_irqs = omap44xx_mcspi4_irqs, | 2309 | .mpu_irqs = omap44xx_mcspi4_irqs, |
2309 | .sdma_reqs = omap44xx_mcspi4_sdma_reqs, | 2310 | .sdma_reqs = omap44xx_mcspi4_sdma_reqs, |
2310 | .main_clk = "mcspi4_fck", | 2311 | .main_clk = "func_48m_fclk", |
2311 | .prcm = { | 2312 | .prcm = { |
2312 | .omap4 = { | 2313 | .omap4 = { |
2313 | .clkctrl_offs = OMAP4_CM_L4PER_MCSPI4_CLKCTRL_OFFSET, | 2314 | .clkctrl_offs = OMAP4_CM_L4PER_MCSPI4_CLKCTRL_OFFSET, |
@@ -2363,7 +2364,7 @@ static struct omap_hwmod omap44xx_mmc1_hwmod = { | |||
2363 | .clkdm_name = "l3_init_clkdm", | 2364 | .clkdm_name = "l3_init_clkdm", |
2364 | .mpu_irqs = omap44xx_mmc1_irqs, | 2365 | .mpu_irqs = omap44xx_mmc1_irqs, |
2365 | .sdma_reqs = omap44xx_mmc1_sdma_reqs, | 2366 | .sdma_reqs = omap44xx_mmc1_sdma_reqs, |
2366 | .main_clk = "mmc1_fck", | 2367 | .main_clk = "hsmmc1_fclk", |
2367 | .prcm = { | 2368 | .prcm = { |
2368 | .omap4 = { | 2369 | .omap4 = { |
2369 | .clkctrl_offs = OMAP4_CM_L3INIT_MMC1_CLKCTRL_OFFSET, | 2370 | .clkctrl_offs = OMAP4_CM_L3INIT_MMC1_CLKCTRL_OFFSET, |
@@ -2392,7 +2393,7 @@ static struct omap_hwmod omap44xx_mmc2_hwmod = { | |||
2392 | .clkdm_name = "l3_init_clkdm", | 2393 | .clkdm_name = "l3_init_clkdm", |
2393 | .mpu_irqs = omap44xx_mmc2_irqs, | 2394 | .mpu_irqs = omap44xx_mmc2_irqs, |
2394 | .sdma_reqs = omap44xx_mmc2_sdma_reqs, | 2395 | .sdma_reqs = omap44xx_mmc2_sdma_reqs, |
2395 | .main_clk = "mmc2_fck", | 2396 | .main_clk = "hsmmc2_fclk", |
2396 | .prcm = { | 2397 | .prcm = { |
2397 | .omap4 = { | 2398 | .omap4 = { |
2398 | .clkctrl_offs = OMAP4_CM_L3INIT_MMC2_CLKCTRL_OFFSET, | 2399 | .clkctrl_offs = OMAP4_CM_L3INIT_MMC2_CLKCTRL_OFFSET, |
@@ -2420,7 +2421,7 @@ static struct omap_hwmod omap44xx_mmc3_hwmod = { | |||
2420 | .clkdm_name = "l4_per_clkdm", | 2421 | .clkdm_name = "l4_per_clkdm", |
2421 | .mpu_irqs = omap44xx_mmc3_irqs, | 2422 | .mpu_irqs = omap44xx_mmc3_irqs, |
2422 | .sdma_reqs = omap44xx_mmc3_sdma_reqs, | 2423 | .sdma_reqs = omap44xx_mmc3_sdma_reqs, |
2423 | .main_clk = "mmc3_fck", | 2424 | .main_clk = "func_48m_fclk", |
2424 | .prcm = { | 2425 | .prcm = { |
2425 | .omap4 = { | 2426 | .omap4 = { |
2426 | .clkctrl_offs = OMAP4_CM_L4PER_MMCSD3_CLKCTRL_OFFSET, | 2427 | .clkctrl_offs = OMAP4_CM_L4PER_MMCSD3_CLKCTRL_OFFSET, |
@@ -2448,7 +2449,7 @@ static struct omap_hwmod omap44xx_mmc4_hwmod = { | |||
2448 | .clkdm_name = "l4_per_clkdm", | 2449 | .clkdm_name = "l4_per_clkdm", |
2449 | .mpu_irqs = omap44xx_mmc4_irqs, | 2450 | .mpu_irqs = omap44xx_mmc4_irqs, |
2450 | .sdma_reqs = omap44xx_mmc4_sdma_reqs, | 2451 | .sdma_reqs = omap44xx_mmc4_sdma_reqs, |
2451 | .main_clk = "mmc4_fck", | 2452 | .main_clk = "func_48m_fclk", |
2452 | .prcm = { | 2453 | .prcm = { |
2453 | .omap4 = { | 2454 | .omap4 = { |
2454 | .clkctrl_offs = OMAP4_CM_L4PER_MMCSD4_CLKCTRL_OFFSET, | 2455 | .clkctrl_offs = OMAP4_CM_L4PER_MMCSD4_CLKCTRL_OFFSET, |
@@ -2476,7 +2477,7 @@ static struct omap_hwmod omap44xx_mmc5_hwmod = { | |||
2476 | .clkdm_name = "l4_per_clkdm", | 2477 | .clkdm_name = "l4_per_clkdm", |
2477 | .mpu_irqs = omap44xx_mmc5_irqs, | 2478 | .mpu_irqs = omap44xx_mmc5_irqs, |
2478 | .sdma_reqs = omap44xx_mmc5_sdma_reqs, | 2479 | .sdma_reqs = omap44xx_mmc5_sdma_reqs, |
2479 | .main_clk = "mmc5_fck", | 2480 | .main_clk = "func_48m_fclk", |
2480 | .prcm = { | 2481 | .prcm = { |
2481 | .omap4 = { | 2482 | .omap4 = { |
2482 | .clkctrl_offs = OMAP4_CM_L4PER_MMCSD5_CLKCTRL_OFFSET, | 2483 | .clkctrl_offs = OMAP4_CM_L4PER_MMCSD5_CLKCTRL_OFFSET, |
@@ -2702,13 +2703,6 @@ static struct resource omap44xx_usb_phy_and_pll_addrs[] = { | |||
2702 | .end = 0x4a0ae000, | 2703 | .end = 0x4a0ae000, |
2703 | .flags = IORESOURCE_MEM, | 2704 | .flags = IORESOURCE_MEM, |
2704 | }, | 2705 | }, |
2705 | { | ||
2706 | /* XXX: Remove this once control module driver is in place */ | ||
2707 | .name = "ctrl_dev", | ||
2708 | .start = 0x4a002300, | ||
2709 | .end = 0x4a002303, | ||
2710 | .flags = IORESOURCE_MEM, | ||
2711 | }, | ||
2712 | { } | 2706 | { } |
2713 | }; | 2707 | }; |
2714 | 2708 | ||
@@ -2725,7 +2719,7 @@ static struct omap_hwmod omap44xx_ocp2scp_usb_phy_hwmod = { | |||
2725 | .name = "ocp2scp_usb_phy", | 2719 | .name = "ocp2scp_usb_phy", |
2726 | .class = &omap44xx_ocp2scp_hwmod_class, | 2720 | .class = &omap44xx_ocp2scp_hwmod_class, |
2727 | .clkdm_name = "l3_init_clkdm", | 2721 | .clkdm_name = "l3_init_clkdm", |
2728 | .main_clk = "ocp2scp_usb_phy_phy_48m", | 2722 | .main_clk = "func_48m_fclk", |
2729 | .prcm = { | 2723 | .prcm = { |
2730 | .omap4 = { | 2724 | .omap4 = { |
2731 | .clkctrl_offs = OMAP4_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL_OFFSET, | 2725 | .clkctrl_offs = OMAP4_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL_OFFSET, |
@@ -3162,7 +3156,7 @@ static struct omap_hwmod omap44xx_timer1_hwmod = { | |||
3162 | .clkdm_name = "l4_wkup_clkdm", | 3156 | .clkdm_name = "l4_wkup_clkdm", |
3163 | .flags = HWMOD_SET_DEFAULT_CLOCKACT, | 3157 | .flags = HWMOD_SET_DEFAULT_CLOCKACT, |
3164 | .mpu_irqs = omap44xx_timer1_irqs, | 3158 | .mpu_irqs = omap44xx_timer1_irqs, |
3165 | .main_clk = "timer1_fck", | 3159 | .main_clk = "dmt1_clk_mux", |
3166 | .prcm = { | 3160 | .prcm = { |
3167 | .omap4 = { | 3161 | .omap4 = { |
3168 | .clkctrl_offs = OMAP4_CM_WKUP_TIMER1_CLKCTRL_OFFSET, | 3162 | .clkctrl_offs = OMAP4_CM_WKUP_TIMER1_CLKCTRL_OFFSET, |
@@ -3185,7 +3179,7 @@ static struct omap_hwmod omap44xx_timer2_hwmod = { | |||
3185 | .clkdm_name = "l4_per_clkdm", | 3179 | .clkdm_name = "l4_per_clkdm", |
3186 | .flags = HWMOD_SET_DEFAULT_CLOCKACT, | 3180 | .flags = HWMOD_SET_DEFAULT_CLOCKACT, |
3187 | .mpu_irqs = omap44xx_timer2_irqs, | 3181 | .mpu_irqs = omap44xx_timer2_irqs, |
3188 | .main_clk = "timer2_fck", | 3182 | .main_clk = "cm2_dm2_mux", |
3189 | .prcm = { | 3183 | .prcm = { |
3190 | .omap4 = { | 3184 | .omap4 = { |
3191 | .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER2_CLKCTRL_OFFSET, | 3185 | .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER2_CLKCTRL_OFFSET, |
@@ -3206,7 +3200,7 @@ static struct omap_hwmod omap44xx_timer3_hwmod = { | |||
3206 | .class = &omap44xx_timer_hwmod_class, | 3200 | .class = &omap44xx_timer_hwmod_class, |
3207 | .clkdm_name = "l4_per_clkdm", | 3201 | .clkdm_name = "l4_per_clkdm", |
3208 | .mpu_irqs = omap44xx_timer3_irqs, | 3202 | .mpu_irqs = omap44xx_timer3_irqs, |
3209 | .main_clk = "timer3_fck", | 3203 | .main_clk = "cm2_dm3_mux", |
3210 | .prcm = { | 3204 | .prcm = { |
3211 | .omap4 = { | 3205 | .omap4 = { |
3212 | .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER3_CLKCTRL_OFFSET, | 3206 | .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER3_CLKCTRL_OFFSET, |
@@ -3227,7 +3221,7 @@ static struct omap_hwmod omap44xx_timer4_hwmod = { | |||
3227 | .class = &omap44xx_timer_hwmod_class, | 3221 | .class = &omap44xx_timer_hwmod_class, |
3228 | .clkdm_name = "l4_per_clkdm", | 3222 | .clkdm_name = "l4_per_clkdm", |
3229 | .mpu_irqs = omap44xx_timer4_irqs, | 3223 | .mpu_irqs = omap44xx_timer4_irqs, |
3230 | .main_clk = "timer4_fck", | 3224 | .main_clk = "cm2_dm4_mux", |
3231 | .prcm = { | 3225 | .prcm = { |
3232 | .omap4 = { | 3226 | .omap4 = { |
3233 | .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER4_CLKCTRL_OFFSET, | 3227 | .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER4_CLKCTRL_OFFSET, |
@@ -3248,7 +3242,7 @@ static struct omap_hwmod omap44xx_timer5_hwmod = { | |||
3248 | .class = &omap44xx_timer_hwmod_class, | 3242 | .class = &omap44xx_timer_hwmod_class, |
3249 | .clkdm_name = "abe_clkdm", | 3243 | .clkdm_name = "abe_clkdm", |
3250 | .mpu_irqs = omap44xx_timer5_irqs, | 3244 | .mpu_irqs = omap44xx_timer5_irqs, |
3251 | .main_clk = "timer5_fck", | 3245 | .main_clk = "timer5_sync_mux", |
3252 | .prcm = { | 3246 | .prcm = { |
3253 | .omap4 = { | 3247 | .omap4 = { |
3254 | .clkctrl_offs = OMAP4_CM1_ABE_TIMER5_CLKCTRL_OFFSET, | 3248 | .clkctrl_offs = OMAP4_CM1_ABE_TIMER5_CLKCTRL_OFFSET, |
@@ -3270,8 +3264,7 @@ static struct omap_hwmod omap44xx_timer6_hwmod = { | |||
3270 | .class = &omap44xx_timer_hwmod_class, | 3264 | .class = &omap44xx_timer_hwmod_class, |
3271 | .clkdm_name = "abe_clkdm", | 3265 | .clkdm_name = "abe_clkdm", |
3272 | .mpu_irqs = omap44xx_timer6_irqs, | 3266 | .mpu_irqs = omap44xx_timer6_irqs, |
3273 | 3267 | .main_clk = "timer6_sync_mux", | |
3274 | .main_clk = "timer6_fck", | ||
3275 | .prcm = { | 3268 | .prcm = { |
3276 | .omap4 = { | 3269 | .omap4 = { |
3277 | .clkctrl_offs = OMAP4_CM1_ABE_TIMER6_CLKCTRL_OFFSET, | 3270 | .clkctrl_offs = OMAP4_CM1_ABE_TIMER6_CLKCTRL_OFFSET, |
@@ -3293,7 +3286,7 @@ static struct omap_hwmod omap44xx_timer7_hwmod = { | |||
3293 | .class = &omap44xx_timer_hwmod_class, | 3286 | .class = &omap44xx_timer_hwmod_class, |
3294 | .clkdm_name = "abe_clkdm", | 3287 | .clkdm_name = "abe_clkdm", |
3295 | .mpu_irqs = omap44xx_timer7_irqs, | 3288 | .mpu_irqs = omap44xx_timer7_irqs, |
3296 | .main_clk = "timer7_fck", | 3289 | .main_clk = "timer7_sync_mux", |
3297 | .prcm = { | 3290 | .prcm = { |
3298 | .omap4 = { | 3291 | .omap4 = { |
3299 | .clkctrl_offs = OMAP4_CM1_ABE_TIMER7_CLKCTRL_OFFSET, | 3292 | .clkctrl_offs = OMAP4_CM1_ABE_TIMER7_CLKCTRL_OFFSET, |
@@ -3315,7 +3308,7 @@ static struct omap_hwmod omap44xx_timer8_hwmod = { | |||
3315 | .class = &omap44xx_timer_hwmod_class, | 3308 | .class = &omap44xx_timer_hwmod_class, |
3316 | .clkdm_name = "abe_clkdm", | 3309 | .clkdm_name = "abe_clkdm", |
3317 | .mpu_irqs = omap44xx_timer8_irqs, | 3310 | .mpu_irqs = omap44xx_timer8_irqs, |
3318 | .main_clk = "timer8_fck", | 3311 | .main_clk = "timer8_sync_mux", |
3319 | .prcm = { | 3312 | .prcm = { |
3320 | .omap4 = { | 3313 | .omap4 = { |
3321 | .clkctrl_offs = OMAP4_CM1_ABE_TIMER8_CLKCTRL_OFFSET, | 3314 | .clkctrl_offs = OMAP4_CM1_ABE_TIMER8_CLKCTRL_OFFSET, |
@@ -3337,7 +3330,7 @@ static struct omap_hwmod omap44xx_timer9_hwmod = { | |||
3337 | .class = &omap44xx_timer_hwmod_class, | 3330 | .class = &omap44xx_timer_hwmod_class, |
3338 | .clkdm_name = "l4_per_clkdm", | 3331 | .clkdm_name = "l4_per_clkdm", |
3339 | .mpu_irqs = omap44xx_timer9_irqs, | 3332 | .mpu_irqs = omap44xx_timer9_irqs, |
3340 | .main_clk = "timer9_fck", | 3333 | .main_clk = "cm2_dm9_mux", |
3341 | .prcm = { | 3334 | .prcm = { |
3342 | .omap4 = { | 3335 | .omap4 = { |
3343 | .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER9_CLKCTRL_OFFSET, | 3336 | .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER9_CLKCTRL_OFFSET, |
@@ -3360,7 +3353,7 @@ static struct omap_hwmod omap44xx_timer10_hwmod = { | |||
3360 | .clkdm_name = "l4_per_clkdm", | 3353 | .clkdm_name = "l4_per_clkdm", |
3361 | .flags = HWMOD_SET_DEFAULT_CLOCKACT, | 3354 | .flags = HWMOD_SET_DEFAULT_CLOCKACT, |
3362 | .mpu_irqs = omap44xx_timer10_irqs, | 3355 | .mpu_irqs = omap44xx_timer10_irqs, |
3363 | .main_clk = "timer10_fck", | 3356 | .main_clk = "cm2_dm10_mux", |
3364 | .prcm = { | 3357 | .prcm = { |
3365 | .omap4 = { | 3358 | .omap4 = { |
3366 | .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER10_CLKCTRL_OFFSET, | 3359 | .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER10_CLKCTRL_OFFSET, |
@@ -3382,7 +3375,7 @@ static struct omap_hwmod omap44xx_timer11_hwmod = { | |||
3382 | .class = &omap44xx_timer_hwmod_class, | 3375 | .class = &omap44xx_timer_hwmod_class, |
3383 | .clkdm_name = "l4_per_clkdm", | 3376 | .clkdm_name = "l4_per_clkdm", |
3384 | .mpu_irqs = omap44xx_timer11_irqs, | 3377 | .mpu_irqs = omap44xx_timer11_irqs, |
3385 | .main_clk = "timer11_fck", | 3378 | .main_clk = "cm2_dm11_mux", |
3386 | .prcm = { | 3379 | .prcm = { |
3387 | .omap4 = { | 3380 | .omap4 = { |
3388 | .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER11_CLKCTRL_OFFSET, | 3381 | .clkctrl_offs = OMAP4_CM_L4PER_DMTIMER11_CLKCTRL_OFFSET, |
@@ -3433,7 +3426,7 @@ static struct omap_hwmod omap44xx_uart1_hwmod = { | |||
3433 | .clkdm_name = "l4_per_clkdm", | 3426 | .clkdm_name = "l4_per_clkdm", |
3434 | .mpu_irqs = omap44xx_uart1_irqs, | 3427 | .mpu_irqs = omap44xx_uart1_irqs, |
3435 | .sdma_reqs = omap44xx_uart1_sdma_reqs, | 3428 | .sdma_reqs = omap44xx_uart1_sdma_reqs, |
3436 | .main_clk = "uart1_fck", | 3429 | .main_clk = "func_48m_fclk", |
3437 | .prcm = { | 3430 | .prcm = { |
3438 | .omap4 = { | 3431 | .omap4 = { |
3439 | .clkctrl_offs = OMAP4_CM_L4PER_UART1_CLKCTRL_OFFSET, | 3432 | .clkctrl_offs = OMAP4_CM_L4PER_UART1_CLKCTRL_OFFSET, |
@@ -3461,7 +3454,7 @@ static struct omap_hwmod omap44xx_uart2_hwmod = { | |||
3461 | .clkdm_name = "l4_per_clkdm", | 3454 | .clkdm_name = "l4_per_clkdm", |
3462 | .mpu_irqs = omap44xx_uart2_irqs, | 3455 | .mpu_irqs = omap44xx_uart2_irqs, |
3463 | .sdma_reqs = omap44xx_uart2_sdma_reqs, | 3456 | .sdma_reqs = omap44xx_uart2_sdma_reqs, |
3464 | .main_clk = "uart2_fck", | 3457 | .main_clk = "func_48m_fclk", |
3465 | .prcm = { | 3458 | .prcm = { |
3466 | .omap4 = { | 3459 | .omap4 = { |
3467 | .clkctrl_offs = OMAP4_CM_L4PER_UART2_CLKCTRL_OFFSET, | 3460 | .clkctrl_offs = OMAP4_CM_L4PER_UART2_CLKCTRL_OFFSET, |
@@ -3490,7 +3483,7 @@ static struct omap_hwmod omap44xx_uart3_hwmod = { | |||
3490 | .flags = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET, | 3483 | .flags = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET, |
3491 | .mpu_irqs = omap44xx_uart3_irqs, | 3484 | .mpu_irqs = omap44xx_uart3_irqs, |
3492 | .sdma_reqs = omap44xx_uart3_sdma_reqs, | 3485 | .sdma_reqs = omap44xx_uart3_sdma_reqs, |
3493 | .main_clk = "uart3_fck", | 3486 | .main_clk = "func_48m_fclk", |
3494 | .prcm = { | 3487 | .prcm = { |
3495 | .omap4 = { | 3488 | .omap4 = { |
3496 | .clkctrl_offs = OMAP4_CM_L4PER_UART3_CLKCTRL_OFFSET, | 3489 | .clkctrl_offs = OMAP4_CM_L4PER_UART3_CLKCTRL_OFFSET, |
@@ -3518,7 +3511,7 @@ static struct omap_hwmod omap44xx_uart4_hwmod = { | |||
3518 | .clkdm_name = "l4_per_clkdm", | 3511 | .clkdm_name = "l4_per_clkdm", |
3519 | .mpu_irqs = omap44xx_uart4_irqs, | 3512 | .mpu_irqs = omap44xx_uart4_irqs, |
3520 | .sdma_reqs = omap44xx_uart4_sdma_reqs, | 3513 | .sdma_reqs = omap44xx_uart4_sdma_reqs, |
3521 | .main_clk = "uart4_fck", | 3514 | .main_clk = "func_48m_fclk", |
3522 | .prcm = { | 3515 | .prcm = { |
3523 | .omap4 = { | 3516 | .omap4 = { |
3524 | .clkctrl_offs = OMAP4_CM_L4PER_UART4_CLKCTRL_OFFSET, | 3517 | .clkctrl_offs = OMAP4_CM_L4PER_UART4_CLKCTRL_OFFSET, |
@@ -3797,7 +3790,7 @@ static struct omap_hwmod omap44xx_wd_timer2_hwmod = { | |||
3797 | .class = &omap44xx_wd_timer_hwmod_class, | 3790 | .class = &omap44xx_wd_timer_hwmod_class, |
3798 | .clkdm_name = "l4_wkup_clkdm", | 3791 | .clkdm_name = "l4_wkup_clkdm", |
3799 | .mpu_irqs = omap44xx_wd_timer2_irqs, | 3792 | .mpu_irqs = omap44xx_wd_timer2_irqs, |
3800 | .main_clk = "wd_timer2_fck", | 3793 | .main_clk = "sys_32k_ck", |
3801 | .prcm = { | 3794 | .prcm = { |
3802 | .omap4 = { | 3795 | .omap4 = { |
3803 | .clkctrl_offs = OMAP4_CM_WKUP_WDT2_CLKCTRL_OFFSET, | 3796 | .clkctrl_offs = OMAP4_CM_WKUP_WDT2_CLKCTRL_OFFSET, |
@@ -3818,7 +3811,7 @@ static struct omap_hwmod omap44xx_wd_timer3_hwmod = { | |||
3818 | .class = &omap44xx_wd_timer_hwmod_class, | 3811 | .class = &omap44xx_wd_timer_hwmod_class, |
3819 | .clkdm_name = "abe_clkdm", | 3812 | .clkdm_name = "abe_clkdm", |
3820 | .mpu_irqs = omap44xx_wd_timer3_irqs, | 3813 | .mpu_irqs = omap44xx_wd_timer3_irqs, |
3821 | .main_clk = "wd_timer3_fck", | 3814 | .main_clk = "sys_32k_ck", |
3822 | .prcm = { | 3815 | .prcm = { |
3823 | .omap4 = { | 3816 | .omap4 = { |
3824 | .clkctrl_offs = OMAP4_CM1_ABE_WDT3_CLKCTRL_OFFSET, | 3817 | .clkctrl_offs = OMAP4_CM1_ABE_WDT3_CLKCTRL_OFFSET, |
@@ -4249,6 +4242,27 @@ static struct omap_hwmod_ocp_if omap44xx_l4_cfg__ocp_wp_noc = { | |||
4249 | 4242 | ||
4250 | static struct omap_hwmod_addr_space omap44xx_aess_addrs[] = { | 4243 | static struct omap_hwmod_addr_space omap44xx_aess_addrs[] = { |
4251 | { | 4244 | { |
4245 | .name = "dmem", | ||
4246 | .pa_start = 0x40180000, | ||
4247 | .pa_end = 0x4018ffff | ||
4248 | }, | ||
4249 | { | ||
4250 | .name = "cmem", | ||
4251 | .pa_start = 0x401a0000, | ||
4252 | .pa_end = 0x401a1fff | ||
4253 | }, | ||
4254 | { | ||
4255 | .name = "smem", | ||
4256 | .pa_start = 0x401c0000, | ||
4257 | .pa_end = 0x401c5fff | ||
4258 | }, | ||
4259 | { | ||
4260 | .name = "pmem", | ||
4261 | .pa_start = 0x401e0000, | ||
4262 | .pa_end = 0x401e1fff | ||
4263 | }, | ||
4264 | { | ||
4265 | .name = "mpu", | ||
4252 | .pa_start = 0x401f1000, | 4266 | .pa_start = 0x401f1000, |
4253 | .pa_end = 0x401f13ff, | 4267 | .pa_end = 0x401f13ff, |
4254 | .flags = ADDR_TYPE_RT | 4268 | .flags = ADDR_TYPE_RT |
@@ -4267,6 +4281,27 @@ static struct omap_hwmod_ocp_if __maybe_unused omap44xx_l4_abe__aess = { | |||
4267 | 4281 | ||
4268 | static struct omap_hwmod_addr_space omap44xx_aess_dma_addrs[] = { | 4282 | static struct omap_hwmod_addr_space omap44xx_aess_dma_addrs[] = { |
4269 | { | 4283 | { |
4284 | .name = "dmem_dma", | ||
4285 | .pa_start = 0x49080000, | ||
4286 | .pa_end = 0x4908ffff | ||
4287 | }, | ||
4288 | { | ||
4289 | .name = "cmem_dma", | ||
4290 | .pa_start = 0x490a0000, | ||
4291 | .pa_end = 0x490a1fff | ||
4292 | }, | ||
4293 | { | ||
4294 | .name = "smem_dma", | ||
4295 | .pa_start = 0x490c0000, | ||
4296 | .pa_end = 0x490c5fff | ||
4297 | }, | ||
4298 | { | ||
4299 | .name = "pmem_dma", | ||
4300 | .pa_start = 0x490e0000, | ||
4301 | .pa_end = 0x490e1fff | ||
4302 | }, | ||
4303 | { | ||
4304 | .name = "dma", | ||
4270 | .pa_start = 0x490f1000, | 4305 | .pa_start = 0x490f1000, |
4271 | .pa_end = 0x490f13ff, | 4306 | .pa_end = 0x490f13ff, |
4272 | .flags = ADDR_TYPE_RT | 4307 | .flags = ADDR_TYPE_RT |
@@ -6156,12 +6191,6 @@ static struct omap_hwmod_addr_space omap44xx_usb_otg_hs_addrs[] = { | |||
6156 | .pa_end = 0x4a0ab7ff, | 6191 | .pa_end = 0x4a0ab7ff, |
6157 | .flags = ADDR_TYPE_RT | 6192 | .flags = ADDR_TYPE_RT |
6158 | }, | 6193 | }, |
6159 | { | ||
6160 | /* XXX: Remove this once control module driver is in place */ | ||
6161 | .pa_start = 0x4a00233c, | ||
6162 | .pa_end = 0x4a00233f, | ||
6163 | .flags = ADDR_TYPE_RT | ||
6164 | }, | ||
6165 | { } | 6194 | { } |
6166 | }; | 6195 | }; |
6167 | 6196 | ||
@@ -6282,7 +6311,7 @@ static struct omap_hwmod_ocp_if *omap44xx_hwmod_ocp_ifs[] __initdata = { | |||
6282 | &omap44xx_l3_main_1__l3_main_3, | 6311 | &omap44xx_l3_main_1__l3_main_3, |
6283 | &omap44xx_l3_main_2__l3_main_3, | 6312 | &omap44xx_l3_main_2__l3_main_3, |
6284 | &omap44xx_l4_cfg__l3_main_3, | 6313 | &omap44xx_l4_cfg__l3_main_3, |
6285 | /* &omap44xx_aess__l4_abe, */ | 6314 | &omap44xx_aess__l4_abe, |
6286 | &omap44xx_dsp__l4_abe, | 6315 | &omap44xx_dsp__l4_abe, |
6287 | &omap44xx_l3_main_1__l4_abe, | 6316 | &omap44xx_l3_main_1__l4_abe, |
6288 | &omap44xx_mpu__l4_abe, | 6317 | &omap44xx_mpu__l4_abe, |
@@ -6291,8 +6320,8 @@ static struct omap_hwmod_ocp_if *omap44xx_hwmod_ocp_ifs[] __initdata = { | |||
6291 | &omap44xx_l4_cfg__l4_wkup, | 6320 | &omap44xx_l4_cfg__l4_wkup, |
6292 | &omap44xx_mpu__mpu_private, | 6321 | &omap44xx_mpu__mpu_private, |
6293 | &omap44xx_l4_cfg__ocp_wp_noc, | 6322 | &omap44xx_l4_cfg__ocp_wp_noc, |
6294 | /* &omap44xx_l4_abe__aess, */ | 6323 | &omap44xx_l4_abe__aess, |
6295 | /* &omap44xx_l4_abe__aess_dma, */ | 6324 | &omap44xx_l4_abe__aess_dma, |
6296 | &omap44xx_l3_main_2__c2c, | 6325 | &omap44xx_l3_main_2__c2c, |
6297 | &omap44xx_l4_wkup__counter_32k, | 6326 | &omap44xx_l4_wkup__counter_32k, |
6298 | &omap44xx_l4_cfg__ctrl_module_core, | 6327 | &omap44xx_l4_cfg__ctrl_module_core, |
diff --git a/arch/arm/mach-omap2/omap_hwmod_reset.c b/arch/arm/mach-omap2/omap_hwmod_reset.c new file mode 100644 index 000000000000..65e186c9df55 --- /dev/null +++ b/arch/arm/mach-omap2/omap_hwmod_reset.c | |||
@@ -0,0 +1,53 @@ | |||
1 | /* | ||
2 | * OMAP IP block custom reset and preprogramming stubs | ||
3 | * | ||
4 | * Copyright (C) 2012 Texas Instruments, Inc. | ||
5 | * Paul Walmsley | ||
6 | * | ||
7 | * A small number of IP blocks need custom reset and preprogramming | ||
8 | * functions. The stubs in this file provide a standard way for the | ||
9 | * hwmod code to call these functions, which are to be located under | ||
10 | * drivers/. | ||
11 | * | ||
12 | * This program is free software; you can redistribute it and/or | ||
13 | * modify it under the terms of the GNU General Public License as | ||
14 | * published by the Free Software Foundation version 2. | ||
15 | * | ||
16 | * This program is distributed "as is" WITHOUT ANY WARRANTY of any | ||
17 | * kind, whether express or implied; without even the implied warranty | ||
18 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
19 | * GNU General Public License for more details. | ||
20 | * | ||
21 | * You should have received a copy of the GNU General Public License | ||
22 | * along with this program; if not, write to the Free Software | ||
23 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
24 | * 02110-1301 USA | ||
25 | */ | ||
26 | #include <linux/kernel.h> | ||
27 | #include <linux/errno.h> | ||
28 | |||
29 | #include <sound/aess.h> | ||
30 | |||
31 | #include "omap_hwmod.h" | ||
32 | |||
33 | /** | ||
34 | * omap_hwmod_aess_preprogram - enable AESS internal autogating | ||
35 | * @oh: struct omap_hwmod * | ||
36 | * | ||
37 | * The AESS will not IdleAck to the PRCM until its internal autogating | ||
38 | * is enabled. Since internal autogating is disabled by default after | ||
39 | * AESS reset, we must enable autogating after the hwmod code resets | ||
40 | * the AESS. Returns 0. | ||
41 | */ | ||
42 | int omap_hwmod_aess_preprogram(struct omap_hwmod *oh) | ||
43 | { | ||
44 | void __iomem *va; | ||
45 | |||
46 | va = omap_hwmod_get_mpu_rt_va(oh); | ||
47 | if (!va) | ||
48 | return -EINVAL; | ||
49 | |||
50 | aess_enable_autogating(va); | ||
51 | |||
52 | return 0; | ||
53 | } | ||
diff --git a/arch/arm/mach-omap2/omap_phy_internal.c b/arch/arm/mach-omap2/omap_phy_internal.c index e237602e10ea..eb8a25de67ed 100644 --- a/arch/arm/mach-omap2/omap_phy_internal.c +++ b/arch/arm/mach-omap2/omap_phy_internal.c | |||
@@ -63,7 +63,7 @@ static int __init omap4430_phy_power_down(void) | |||
63 | 63 | ||
64 | return 0; | 64 | return 0; |
65 | } | 65 | } |
66 | early_initcall(omap4430_phy_power_down); | 66 | omap_early_initcall(omap4430_phy_power_down); |
67 | 67 | ||
68 | void am35x_musb_reset(void) | 68 | void am35x_musb_reset(void) |
69 | { | 69 | { |
diff --git a/arch/arm/mach-omap2/opp3xxx_data.c b/arch/arm/mach-omap2/opp3xxx_data.c index 62772e0e0d69..fc67add76444 100644 --- a/arch/arm/mach-omap2/opp3xxx_data.c +++ b/arch/arm/mach-omap2/opp3xxx_data.c | |||
@@ -168,4 +168,4 @@ int __init omap3_opp_init(void) | |||
168 | 168 | ||
169 | return r; | 169 | return r; |
170 | } | 170 | } |
171 | device_initcall(omap3_opp_init); | 171 | omap_device_initcall(omap3_opp_init); |
diff --git a/arch/arm/mach-omap2/opp4xxx_data.c b/arch/arm/mach-omap2/opp4xxx_data.c index d470b728e720..1ef7a3e5ce4a 100644 --- a/arch/arm/mach-omap2/opp4xxx_data.c +++ b/arch/arm/mach-omap2/opp4xxx_data.c | |||
@@ -177,4 +177,4 @@ int __init omap4_opp_init(void) | |||
177 | ARRAY_SIZE(omap446x_opp_def_list)); | 177 | ARRAY_SIZE(omap446x_opp_def_list)); |
178 | return r; | 178 | return r; |
179 | } | 179 | } |
180 | device_initcall(omap4_opp_init); | 180 | omap_device_initcall(omap4_opp_init); |
diff --git a/arch/arm/mach-omap2/pm-debug.c b/arch/arm/mach-omap2/pm-debug.c index 548547e14796..0b339861d751 100644 --- a/arch/arm/mach-omap2/pm-debug.c +++ b/arch/arm/mach-omap2/pm-debug.c | |||
@@ -83,10 +83,8 @@ static int clkdm_dbg_show_counter(struct clockdomain *clkdm, void *user) | |||
83 | strncmp(clkdm->name, "dpll", 4) == 0) | 83 | strncmp(clkdm->name, "dpll", 4) == 0) |
84 | return 0; | 84 | return 0; |
85 | 85 | ||
86 | seq_printf(s, "%s->%s (%d)", clkdm->name, | 86 | seq_printf(s, "%s->%s (%d)\n", clkdm->name, clkdm->pwrdm.ptr->name, |
87 | clkdm->pwrdm.ptr->name, | 87 | clkdm->usecount); |
88 | atomic_read(&clkdm->usecount)); | ||
89 | seq_printf(s, "\n"); | ||
90 | 88 | ||
91 | return 0; | 89 | return 0; |
92 | } | 90 | } |
@@ -279,6 +277,6 @@ static int __init pm_dbg_init(void) | |||
279 | 277 | ||
280 | return 0; | 278 | return 0; |
281 | } | 279 | } |
282 | arch_initcall(pm_dbg_init); | 280 | omap_arch_initcall(pm_dbg_init); |
283 | 281 | ||
284 | #endif | 282 | #endif |
diff --git a/arch/arm/mach-omap2/pm.c b/arch/arm/mach-omap2/pm.c index f4b3143a8b1d..673a4c1d1d76 100644 --- a/arch/arm/mach-omap2/pm.c +++ b/arch/arm/mach-omap2/pm.c | |||
@@ -32,8 +32,6 @@ | |||
32 | #include "pm.h" | 32 | #include "pm.h" |
33 | #include "twl-common.h" | 33 | #include "twl-common.h" |
34 | 34 | ||
35 | static struct omap_device_pm_latency *pm_lats; | ||
36 | |||
37 | /* | 35 | /* |
38 | * omap_pm_suspend: points to a function that does the SoC-specific | 36 | * omap_pm_suspend: points to a function that does the SoC-specific |
39 | * suspend work | 37 | * suspend work |
@@ -82,7 +80,7 @@ static int __init _init_omap_device(char *name) | |||
82 | __func__, name)) | 80 | __func__, name)) |
83 | return -ENODEV; | 81 | return -ENODEV; |
84 | 82 | ||
85 | pdev = omap_device_build(oh->name, 0, oh, NULL, 0, pm_lats, 0, false); | 83 | pdev = omap_device_build(oh->name, 0, oh, NULL, 0); |
86 | if (WARN(IS_ERR(pdev), "%s: could not build omap_device for %s\n", | 84 | if (WARN(IS_ERR(pdev), "%s: could not build omap_device for %s\n", |
87 | __func__, name)) | 85 | __func__, name)) |
88 | return -ENODEV; | 86 | return -ENODEV; |
@@ -108,80 +106,19 @@ static void __init omap2_init_processor_devices(void) | |||
108 | } | 106 | } |
109 | } | 107 | } |
110 | 108 | ||
111 | /* Types of sleep_switch used in omap_set_pwrdm_state */ | ||
112 | #define FORCEWAKEUP_SWITCH 0 | ||
113 | #define LOWPOWERSTATE_SWITCH 1 | ||
114 | |||
115 | int __init omap_pm_clkdms_setup(struct clockdomain *clkdm, void *unused) | 109 | int __init omap_pm_clkdms_setup(struct clockdomain *clkdm, void *unused) |
116 | { | 110 | { |
111 | /* XXX The usecount test is racy */ | ||
117 | if ((clkdm->flags & CLKDM_CAN_ENABLE_AUTO) && | 112 | if ((clkdm->flags & CLKDM_CAN_ENABLE_AUTO) && |
118 | !(clkdm->flags & CLKDM_MISSING_IDLE_REPORTING)) | 113 | !(clkdm->flags & CLKDM_MISSING_IDLE_REPORTING)) |
119 | clkdm_allow_idle(clkdm); | 114 | clkdm_allow_idle(clkdm); |
120 | else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP && | 115 | else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP && |
121 | atomic_read(&clkdm->usecount) == 0) | 116 | clkdm->usecount == 0) |
122 | clkdm_sleep(clkdm); | 117 | clkdm_sleep(clkdm); |
123 | return 0; | 118 | return 0; |
124 | } | 119 | } |
125 | 120 | ||
126 | /* | 121 | /* |
127 | * This sets pwrdm state (other than mpu & core. Currently only ON & | ||
128 | * RET are supported. | ||
129 | */ | ||
130 | int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 pwrst) | ||
131 | { | ||
132 | u8 curr_pwrst, next_pwrst; | ||
133 | int sleep_switch = -1, ret = 0, hwsup = 0; | ||
134 | |||
135 | if (!pwrdm || IS_ERR(pwrdm)) | ||
136 | return -EINVAL; | ||
137 | |||
138 | while (!(pwrdm->pwrsts & (1 << pwrst))) { | ||
139 | if (pwrst == PWRDM_POWER_OFF) | ||
140 | return ret; | ||
141 | pwrst--; | ||
142 | } | ||
143 | |||
144 | next_pwrst = pwrdm_read_next_pwrst(pwrdm); | ||
145 | if (next_pwrst == pwrst) | ||
146 | return ret; | ||
147 | |||
148 | curr_pwrst = pwrdm_read_pwrst(pwrdm); | ||
149 | if (curr_pwrst < PWRDM_POWER_ON) { | ||
150 | if ((curr_pwrst > pwrst) && | ||
151 | (pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE)) { | ||
152 | sleep_switch = LOWPOWERSTATE_SWITCH; | ||
153 | } else { | ||
154 | hwsup = clkdm_in_hwsup(pwrdm->pwrdm_clkdms[0]); | ||
155 | clkdm_wakeup(pwrdm->pwrdm_clkdms[0]); | ||
156 | sleep_switch = FORCEWAKEUP_SWITCH; | ||
157 | } | ||
158 | } | ||
159 | |||
160 | ret = pwrdm_set_next_pwrst(pwrdm, pwrst); | ||
161 | if (ret) | ||
162 | pr_err("%s: unable to set power state of powerdomain: %s\n", | ||
163 | __func__, pwrdm->name); | ||
164 | |||
165 | switch (sleep_switch) { | ||
166 | case FORCEWAKEUP_SWITCH: | ||
167 | if (hwsup) | ||
168 | clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]); | ||
169 | else | ||
170 | clkdm_sleep(pwrdm->pwrdm_clkdms[0]); | ||
171 | break; | ||
172 | case LOWPOWERSTATE_SWITCH: | ||
173 | pwrdm_set_lowpwrstchange(pwrdm); | ||
174 | pwrdm_wait_transition(pwrdm); | ||
175 | pwrdm_state_switch(pwrdm); | ||
176 | break; | ||
177 | } | ||
178 | |||
179 | return ret; | ||
180 | } | ||
181 | |||
182 | |||
183 | |||
184 | /* | ||
185 | * This API is to be called during init to set the various voltage | 122 | * This API is to be called during init to set the various voltage |
186 | * domains to the voltage as per the opp table. Typically we boot up | 123 | * domains to the voltage as per the opp table. Typically we boot up |
187 | * at the nominal voltage. So this function finds out the rate of | 124 | * at the nominal voltage. So this function finds out the rate of |
@@ -336,7 +273,7 @@ static int __init omap2_common_pm_init(void) | |||
336 | 273 | ||
337 | return 0; | 274 | return 0; |
338 | } | 275 | } |
339 | postcore_initcall(omap2_common_pm_init); | 276 | omap_postcore_initcall(omap2_common_pm_init); |
340 | 277 | ||
341 | int __init omap2_common_pm_late_init(void) | 278 | int __init omap2_common_pm_late_init(void) |
342 | { | 279 | { |
@@ -345,19 +282,19 @@ int __init omap2_common_pm_late_init(void) | |||
345 | * a completely different mechanism. | 282 | * a completely different mechanism. |
346 | * Disable this part if a DT blob is available. | 283 | * Disable this part if a DT blob is available. |
347 | */ | 284 | */ |
348 | if (of_have_populated_dt()) | 285 | if (!of_have_populated_dt()) { |
349 | return 0; | ||
350 | 286 | ||
351 | /* Init the voltage layer */ | 287 | /* Init the voltage layer */ |
352 | omap_pmic_late_init(); | 288 | omap_pmic_late_init(); |
353 | omap_voltage_late_init(); | 289 | omap_voltage_late_init(); |
354 | 290 | ||
355 | /* Initialize the voltages */ | 291 | /* Initialize the voltages */ |
356 | omap3_init_voltages(); | 292 | omap3_init_voltages(); |
357 | omap4_init_voltages(); | 293 | omap4_init_voltages(); |
358 | 294 | ||
359 | /* Smartreflex device init */ | 295 | /* Smartreflex device init */ |
360 | omap_devinit_smartreflex(); | 296 | omap_devinit_smartreflex(); |
297 | } | ||
361 | 298 | ||
362 | #ifdef CONFIG_SUSPEND | 299 | #ifdef CONFIG_SUSPEND |
363 | suspend_set_ops(&omap_pm_ops); | 300 | suspend_set_ops(&omap_pm_ops); |
diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h index c22503b17abd..7bdd22afce69 100644 --- a/arch/arm/mach-omap2/pm.h +++ b/arch/arm/mach-omap2/pm.h | |||
@@ -33,7 +33,6 @@ static inline int omap4_idle_init(void) | |||
33 | extern void *omap3_secure_ram_storage; | 33 | extern void *omap3_secure_ram_storage; |
34 | extern void omap3_pm_off_mode_enable(int); | 34 | extern void omap3_pm_off_mode_enable(int); |
35 | extern void omap_sram_idle(void); | 35 | extern void omap_sram_idle(void); |
36 | extern int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state); | ||
37 | extern int omap_pm_clkdms_setup(struct clockdomain *clkdm, void *unused); | 36 | extern int omap_pm_clkdms_setup(struct clockdomain *clkdm, void *unused); |
38 | extern int (*omap_pm_suspend)(void); | 37 | extern int (*omap_pm_suspend)(void); |
39 | 38 | ||
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index c333fa6dffa8..b59d93908341 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c | |||
@@ -54,7 +54,6 @@ | |||
54 | #include "powerdomain.h" | 54 | #include "powerdomain.h" |
55 | #include "clockdomain.h" | 55 | #include "clockdomain.h" |
56 | 56 | ||
57 | static void (*omap2_sram_idle)(void); | ||
58 | static void (*omap2_sram_suspend)(u32 dllctrl, void __iomem *sdrc_dlla_ctrl, | 57 | static void (*omap2_sram_suspend)(u32 dllctrl, void __iomem *sdrc_dlla_ctrl, |
59 | void __iomem *sdrc_power); | 58 | void __iomem *sdrc_power); |
60 | 59 | ||
@@ -90,11 +89,7 @@ static int omap2_enter_full_retention(void) | |||
90 | omap2_prm_write_mod_reg(0xffffffff, CORE_MOD, OMAP24XX_PM_WKST2); | 89 | omap2_prm_write_mod_reg(0xffffffff, CORE_MOD, OMAP24XX_PM_WKST2); |
91 | omap2_prm_write_mod_reg(0xffffffff, WKUP_MOD, PM_WKST); | 90 | omap2_prm_write_mod_reg(0xffffffff, WKUP_MOD, PM_WKST); |
92 | 91 | ||
93 | /* | 92 | pwrdm_set_next_pwrst(core_pwrdm, PWRDM_POWER_RET); |
94 | * Set MPU powerdomain's next power state to RETENTION; | ||
95 | * preserve logic state during retention | ||
96 | */ | ||
97 | pwrdm_set_logic_retst(mpu_pwrdm, PWRDM_POWER_RET); | ||
98 | pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_RET); | 93 | pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_RET); |
99 | 94 | ||
100 | /* Workaround to kill USB */ | 95 | /* Workaround to kill USB */ |
@@ -137,15 +132,10 @@ no_sleep: | |||
137 | /* Mask future PRCM-to-MPU interrupts */ | 132 | /* Mask future PRCM-to-MPU interrupts */ |
138 | omap2_prm_write_mod_reg(0x0, OCP_MOD, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET); | 133 | omap2_prm_write_mod_reg(0x0, OCP_MOD, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET); |
139 | 134 | ||
140 | return 0; | 135 | pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON); |
141 | } | 136 | pwrdm_set_next_pwrst(core_pwrdm, PWRDM_POWER_ON); |
142 | |||
143 | static int omap2_i2c_active(void) | ||
144 | { | ||
145 | u32 l; | ||
146 | 137 | ||
147 | l = omap2_cm_read_mod_reg(CORE_MOD, CM_FCLKEN1); | 138 | return 0; |
148 | return l & (OMAP2420_EN_I2C2_MASK | OMAP2420_EN_I2C1_MASK); | ||
149 | } | 139 | } |
150 | 140 | ||
151 | static int sti_console_enabled; | 141 | static int sti_console_enabled; |
@@ -172,10 +162,7 @@ static int omap2_allow_mpu_retention(void) | |||
172 | 162 | ||
173 | static void omap2_enter_mpu_retention(void) | 163 | static void omap2_enter_mpu_retention(void) |
174 | { | 164 | { |
175 | /* Putting MPU into the WFI state while a transfer is active | 165 | const int zero = 0; |
176 | * seems to cause the I2C block to timeout. Why? Good question. */ | ||
177 | if (omap2_i2c_active()) | ||
178 | return; | ||
179 | 166 | ||
180 | /* The peripherals seem not to be able to wake up the MPU when | 167 | /* The peripherals seem not to be able to wake up the MPU when |
181 | * it is in retention mode. */ | 168 | * it is in retention mode. */ |
@@ -186,17 +173,17 @@ static void omap2_enter_mpu_retention(void) | |||
186 | omap2_prm_write_mod_reg(0xffffffff, WKUP_MOD, PM_WKST); | 173 | omap2_prm_write_mod_reg(0xffffffff, WKUP_MOD, PM_WKST); |
187 | 174 | ||
188 | /* Try to enter MPU retention */ | 175 | /* Try to enter MPU retention */ |
189 | omap2_prm_write_mod_reg((0x01 << OMAP_POWERSTATE_SHIFT) | | 176 | pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_RET); |
190 | OMAP_LOGICRETSTATE_MASK, | 177 | |
191 | MPU_MOD, OMAP2_PM_PWSTCTRL); | ||
192 | } else { | 178 | } else { |
193 | /* Block MPU retention */ | 179 | /* Block MPU retention */ |
194 | 180 | pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON); | |
195 | omap2_prm_write_mod_reg(OMAP_LOGICRETSTATE_MASK, MPU_MOD, | ||
196 | OMAP2_PM_PWSTCTRL); | ||
197 | } | 181 | } |
198 | 182 | ||
199 | omap2_sram_idle(); | 183 | /* WFI */ |
184 | asm("mcr p15, 0, %0, c7, c0, 4" : : "r" (zero) : "memory", "cc"); | ||
185 | |||
186 | pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON); | ||
200 | } | 187 | } |
201 | 188 | ||
202 | static int omap2_can_sleep(void) | 189 | static int omap2_can_sleep(void) |
@@ -251,25 +238,17 @@ static void __init prcm_setup_regs(void) | |||
251 | for (i = 0; i < num_mem_banks; i++) | 238 | for (i = 0; i < num_mem_banks; i++) |
252 | pwrdm_set_mem_retst(core_pwrdm, i, PWRDM_POWER_RET); | 239 | pwrdm_set_mem_retst(core_pwrdm, i, PWRDM_POWER_RET); |
253 | 240 | ||
254 | /* Set CORE powerdomain's next power state to RETENTION */ | 241 | pwrdm_set_logic_retst(core_pwrdm, PWRDM_POWER_RET); |
255 | pwrdm_set_next_pwrst(core_pwrdm, PWRDM_POWER_RET); | ||
256 | 242 | ||
257 | /* | ||
258 | * Set MPU powerdomain's next power state to RETENTION; | ||
259 | * preserve logic state during retention | ||
260 | */ | ||
261 | pwrdm_set_logic_retst(mpu_pwrdm, PWRDM_POWER_RET); | 243 | pwrdm_set_logic_retst(mpu_pwrdm, PWRDM_POWER_RET); |
262 | pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_RET); | ||
263 | 244 | ||
264 | /* Force-power down DSP, GFX powerdomains */ | 245 | /* Force-power down DSP, GFX powerdomains */ |
265 | 246 | ||
266 | pwrdm = clkdm_get_pwrdm(dsp_clkdm); | 247 | pwrdm = clkdm_get_pwrdm(dsp_clkdm); |
267 | pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF); | 248 | pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF); |
268 | clkdm_sleep(dsp_clkdm); | ||
269 | 249 | ||
270 | pwrdm = clkdm_get_pwrdm(gfx_clkdm); | 250 | pwrdm = clkdm_get_pwrdm(gfx_clkdm); |
271 | pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF); | 251 | pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF); |
272 | clkdm_sleep(gfx_clkdm); | ||
273 | 252 | ||
274 | /* Enable hardware-supervised idle for all clkdms */ | 253 | /* Enable hardware-supervised idle for all clkdms */ |
275 | clkdm_for_each(omap_pm_clkdms_setup, NULL); | 254 | clkdm_for_each(omap_pm_clkdms_setup, NULL); |
@@ -356,11 +335,9 @@ int __init omap2_pm_init(void) | |||
356 | /* | 335 | /* |
357 | * We copy the assembler sleep/wakeup routines to SRAM. | 336 | * We copy the assembler sleep/wakeup routines to SRAM. |
358 | * These routines need to be in SRAM as that's the only | 337 | * These routines need to be in SRAM as that's the only |
359 | * memory the MPU can see when it wakes up. | 338 | * memory the MPU can see when it wakes up after the entire |
339 | * chip enters idle. | ||
360 | */ | 340 | */ |
361 | omap2_sram_idle = omap_sram_push(omap24xx_idle_loop_suspend, | ||
362 | omap24xx_idle_loop_suspend_sz); | ||
363 | |||
364 | omap2_sram_suspend = omap_sram_push(omap24xx_cpu_suspend, | 341 | omap2_sram_suspend = omap_sram_push(omap24xx_cpu_suspend, |
365 | omap24xx_cpu_suspend_sz); | 342 | omap24xx_cpu_suspend_sz); |
366 | 343 | ||
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index 7be3622cfc85..2d93d8b23835 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c | |||
@@ -351,12 +351,10 @@ static void omap3_pm_idle(void) | |||
351 | if (omap_irq_pending()) | 351 | if (omap_irq_pending()) |
352 | goto out; | 352 | goto out; |
353 | 353 | ||
354 | trace_power_start(POWER_CSTATE, 1, smp_processor_id()); | ||
355 | trace_cpu_idle(1, smp_processor_id()); | 354 | trace_cpu_idle(1, smp_processor_id()); |
356 | 355 | ||
357 | omap_sram_idle(); | 356 | omap_sram_idle(); |
358 | 357 | ||
359 | trace_power_end(smp_processor_id()); | ||
360 | trace_cpu_idle(PWR_EVENT_EXIT, smp_processor_id()); | 358 | trace_cpu_idle(PWR_EVENT_EXIT, smp_processor_id()); |
361 | 359 | ||
362 | out: | 360 | out: |
diff --git a/arch/arm/mach-omap2/pm44xx.c b/arch/arm/mach-omap2/pm44xx.c index aa6fd98f606e..ea62e75ef21d 100644 --- a/arch/arm/mach-omap2/pm44xx.c +++ b/arch/arm/mach-omap2/pm44xx.c | |||
@@ -77,10 +77,20 @@ static int omap4_pm_suspend(void) | |||
77 | omap_set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state); | 77 | omap_set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state); |
78 | pwrdm_set_logic_retst(pwrst->pwrdm, pwrst->saved_logic_state); | 78 | pwrdm_set_logic_retst(pwrst->pwrdm, pwrst->saved_logic_state); |
79 | } | 79 | } |
80 | if (ret) | 80 | if (ret) { |
81 | pr_crit("Could not enter target state in pm_suspend\n"); | 81 | pr_crit("Could not enter target state in pm_suspend\n"); |
82 | else | 82 | /* |
83 | * OMAP4 chip PM currently works only with certain (newer) | ||
84 | * versions of bootloaders. This is due to missing code in the | ||
85 | * kernel to properly reset and initialize some devices. | ||
86 | * Warn the user about the bootloader version being one of the | ||
87 | * possible causes. | ||
88 | * http://www.spinics.net/lists/arm-kernel/msg218641.html | ||
89 | */ | ||
90 | pr_warn("A possible cause could be an old bootloader - try u-boot >= v2012.07\n"); | ||
91 | } else { | ||
83 | pr_info("Successfully put all powerdomains to target state\n"); | 92 | pr_info("Successfully put all powerdomains to target state\n"); |
93 | } | ||
84 | 94 | ||
85 | return 0; | 95 | return 0; |
86 | } | 96 | } |
@@ -146,6 +156,13 @@ int __init omap4_pm_init(void) | |||
146 | } | 156 | } |
147 | 157 | ||
148 | pr_err("Power Management for TI OMAP4.\n"); | 158 | pr_err("Power Management for TI OMAP4.\n"); |
159 | /* | ||
160 | * OMAP4 chip PM currently works only with certain (newer) | ||
161 | * versions of bootloaders. This is due to missing code in the | ||
162 | * kernel to properly reset and initialize some devices. | ||
163 | * http://www.spinics.net/lists/arm-kernel/msg218641.html | ||
164 | */ | ||
165 | pr_warn("OMAP4 PM: u-boot >= v2012.07 is required for full PM support\n"); | ||
149 | 166 | ||
150 | ret = pwrdm_for_each(pwrdms_setup, NULL); | 167 | ret = pwrdm_for_each(pwrdms_setup, NULL); |
151 | if (ret) { | 168 | if (ret) { |
diff --git a/arch/arm/mach-omap2/pmu.c b/arch/arm/mach-omap2/pmu.c index eb78ae7a3464..9debf822687c 100644 --- a/arch/arm/mach-omap2/pmu.c +++ b/arch/arm/mach-omap2/pmu.c | |||
@@ -48,8 +48,7 @@ static int __init omap2_init_pmu(unsigned oh_num, char *oh_names[]) | |||
48 | } | 48 | } |
49 | } | 49 | } |
50 | 50 | ||
51 | omap_pmu_dev = omap_device_build_ss(dev_name, -1, oh, oh_num, NULL, 0, | 51 | omap_pmu_dev = omap_device_build_ss(dev_name, -1, oh, oh_num, NULL, 0); |
52 | NULL, 0, 0); | ||
53 | WARN(IS_ERR(omap_pmu_dev), "Can't build omap_device for %s.\n", | 52 | WARN(IS_ERR(omap_pmu_dev), "Can't build omap_device for %s.\n", |
54 | dev_name); | 53 | dev_name); |
55 | 54 | ||
@@ -89,4 +88,4 @@ static int __init omap_init_pmu(void) | |||
89 | 88 | ||
90 | return omap2_init_pmu(oh_num, oh_names); | 89 | return omap2_init_pmu(oh_num, oh_names); |
91 | } | 90 | } |
92 | subsys_initcall(omap_init_pmu); | 91 | omap_subsys_initcall(omap_init_pmu); |
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c index 36a69189b083..43ac20c15f4f 100644 --- a/arch/arm/mach-omap2/powerdomain.c +++ b/arch/arm/mach-omap2/powerdomain.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/list.h> | 19 | #include <linux/list.h> |
20 | #include <linux/errno.h> | 20 | #include <linux/errno.h> |
21 | #include <linux/string.h> | 21 | #include <linux/string.h> |
22 | #include <linux/spinlock.h> | ||
22 | #include <trace/events/power.h> | 23 | #include <trace/events/power.h> |
23 | 24 | ||
24 | #include "cm2xxx_3xxx.h" | 25 | #include "cm2xxx_3xxx.h" |
@@ -42,6 +43,16 @@ enum { | |||
42 | PWRDM_STATE_PREV, | 43 | PWRDM_STATE_PREV, |
43 | }; | 44 | }; |
44 | 45 | ||
46 | /* | ||
47 | * Types of sleep_switch used internally in omap_set_pwrdm_state() | ||
48 | * and its associated static functions | ||
49 | * | ||
50 | * XXX Better documentation is needed here | ||
51 | */ | ||
52 | #define ALREADYACTIVE_SWITCH 0 | ||
53 | #define FORCEWAKEUP_SWITCH 1 | ||
54 | #define LOWPOWERSTATE_SWITCH 2 | ||
55 | #define ERROR_SWITCH 3 | ||
45 | 56 | ||
46 | /* pwrdm_list contains all registered struct powerdomains */ | 57 | /* pwrdm_list contains all registered struct powerdomains */ |
47 | static LIST_HEAD(pwrdm_list); | 58 | static LIST_HEAD(pwrdm_list); |
@@ -101,6 +112,7 @@ static int _pwrdm_register(struct powerdomain *pwrdm) | |||
101 | pwrdm->voltdm.ptr = voltdm; | 112 | pwrdm->voltdm.ptr = voltdm; |
102 | INIT_LIST_HEAD(&pwrdm->voltdm_node); | 113 | INIT_LIST_HEAD(&pwrdm->voltdm_node); |
103 | voltdm_add_pwrdm(voltdm, pwrdm); | 114 | voltdm_add_pwrdm(voltdm, pwrdm); |
115 | spin_lock_init(&pwrdm->_lock); | ||
104 | 116 | ||
105 | list_add(&pwrdm->node, &pwrdm_list); | 117 | list_add(&pwrdm->node, &pwrdm_list); |
106 | 118 | ||
@@ -112,7 +124,7 @@ static int _pwrdm_register(struct powerdomain *pwrdm) | |||
112 | for (i = 0; i < pwrdm->banks; i++) | 124 | for (i = 0; i < pwrdm->banks; i++) |
113 | pwrdm->ret_mem_off_counter[i] = 0; | 125 | pwrdm->ret_mem_off_counter[i] = 0; |
114 | 126 | ||
115 | pwrdm_wait_transition(pwrdm); | 127 | arch_pwrdm->pwrdm_wait_transition(pwrdm); |
116 | pwrdm->state = pwrdm_read_pwrst(pwrdm); | 128 | pwrdm->state = pwrdm_read_pwrst(pwrdm); |
117 | pwrdm->state_counter[pwrdm->state] = 1; | 129 | pwrdm->state_counter[pwrdm->state] = 1; |
118 | 130 | ||
@@ -143,7 +155,7 @@ static void _update_logic_membank_counters(struct powerdomain *pwrdm) | |||
143 | static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag) | 155 | static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag) |
144 | { | 156 | { |
145 | 157 | ||
146 | int prev, state, trace_state = 0; | 158 | int prev, next, state, trace_state = 0; |
147 | 159 | ||
148 | if (pwrdm == NULL) | 160 | if (pwrdm == NULL) |
149 | return -EINVAL; | 161 | return -EINVAL; |
@@ -164,9 +176,10 @@ static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag) | |||
164 | * If the power domain did not hit the desired state, | 176 | * If the power domain did not hit the desired state, |
165 | * generate a trace event with both the desired and hit states | 177 | * generate a trace event with both the desired and hit states |
166 | */ | 178 | */ |
167 | if (state != prev) { | 179 | next = pwrdm_read_next_pwrst(pwrdm); |
180 | if (next != prev) { | ||
168 | trace_state = (PWRDM_TRACE_STATES_FLAG | | 181 | trace_state = (PWRDM_TRACE_STATES_FLAG | |
169 | ((state & OMAP_POWERSTATE_MASK) << 8) | | 182 | ((next & OMAP_POWERSTATE_MASK) << 8) | |
170 | ((prev & OMAP_POWERSTATE_MASK) << 0)); | 183 | ((prev & OMAP_POWERSTATE_MASK) << 0)); |
171 | trace_power_domain_target(pwrdm->name, trace_state, | 184 | trace_power_domain_target(pwrdm->name, trace_state, |
172 | smp_processor_id()); | 185 | smp_processor_id()); |
@@ -199,6 +212,80 @@ static int _pwrdm_post_transition_cb(struct powerdomain *pwrdm, void *unused) | |||
199 | return 0; | 212 | return 0; |
200 | } | 213 | } |
201 | 214 | ||
215 | /** | ||
216 | * _pwrdm_save_clkdm_state_and_activate - prepare for power state change | ||
217 | * @pwrdm: struct powerdomain * to operate on | ||
218 | * @curr_pwrst: current power state of @pwrdm | ||
219 | * @pwrst: power state to switch to | ||
220 | * @hwsup: ptr to a bool to return whether the clkdm is hardware-supervised | ||
221 | * | ||
222 | * Determine whether the powerdomain needs to be turned on before | ||
223 | * attempting to switch power states. Called by | ||
224 | * omap_set_pwrdm_state(). NOTE that if the powerdomain contains | ||
225 | * multiple clockdomains, this code assumes that the first clockdomain | ||
226 | * supports software-supervised wakeup mode - potentially a problem. | ||
227 | * Returns the power state switch mode currently in use (see the | ||
228 | * "Types of sleep_switch" comment above). | ||
229 | */ | ||
230 | static u8 _pwrdm_save_clkdm_state_and_activate(struct powerdomain *pwrdm, | ||
231 | u8 curr_pwrst, u8 pwrst, | ||
232 | bool *hwsup) | ||
233 | { | ||
234 | u8 sleep_switch; | ||
235 | |||
236 | if (curr_pwrst < 0) { | ||
237 | WARN_ON(1); | ||
238 | sleep_switch = ERROR_SWITCH; | ||
239 | } else if (curr_pwrst < PWRDM_POWER_ON) { | ||
240 | if (curr_pwrst > pwrst && | ||
241 | pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE && | ||
242 | arch_pwrdm->pwrdm_set_lowpwrstchange) { | ||
243 | sleep_switch = LOWPOWERSTATE_SWITCH; | ||
244 | } else { | ||
245 | *hwsup = clkdm_in_hwsup(pwrdm->pwrdm_clkdms[0]); | ||
246 | clkdm_wakeup_nolock(pwrdm->pwrdm_clkdms[0]); | ||
247 | sleep_switch = FORCEWAKEUP_SWITCH; | ||
248 | } | ||
249 | } else { | ||
250 | sleep_switch = ALREADYACTIVE_SWITCH; | ||
251 | } | ||
252 | |||
253 | return sleep_switch; | ||
254 | } | ||
255 | |||
256 | /** | ||
257 | * _pwrdm_restore_clkdm_state - restore the clkdm hwsup state after pwrst change | ||
258 | * @pwrdm: struct powerdomain * to operate on | ||
259 | * @sleep_switch: return value from _pwrdm_save_clkdm_state_and_activate() | ||
260 | * @hwsup: should @pwrdm's first clockdomain be set to hardware-supervised mode? | ||
261 | * | ||
262 | * Restore the clockdomain state perturbed by | ||
263 | * _pwrdm_save_clkdm_state_and_activate(), and call the power state | ||
264 | * bookkeeping code. Called by omap_set_pwrdm_state(). NOTE that if | ||
265 | * the powerdomain contains multiple clockdomains, this assumes that | ||
266 | * the first associated clockdomain supports either | ||
267 | * hardware-supervised idle control in the register, or | ||
268 | * software-supervised sleep. No return value. | ||
269 | */ | ||
270 | static void _pwrdm_restore_clkdm_state(struct powerdomain *pwrdm, | ||
271 | u8 sleep_switch, bool hwsup) | ||
272 | { | ||
273 | switch (sleep_switch) { | ||
274 | case FORCEWAKEUP_SWITCH: | ||
275 | if (hwsup) | ||
276 | clkdm_allow_idle_nolock(pwrdm->pwrdm_clkdms[0]); | ||
277 | else | ||
278 | clkdm_sleep_nolock(pwrdm->pwrdm_clkdms[0]); | ||
279 | break; | ||
280 | case LOWPOWERSTATE_SWITCH: | ||
281 | if (pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE && | ||
282 | arch_pwrdm->pwrdm_set_lowpwrstchange) | ||
283 | arch_pwrdm->pwrdm_set_lowpwrstchange(pwrdm); | ||
284 | pwrdm_state_switch_nolock(pwrdm); | ||
285 | break; | ||
286 | } | ||
287 | } | ||
288 | |||
202 | /* Public functions */ | 289 | /* Public functions */ |
203 | 290 | ||
204 | /** | 291 | /** |
@@ -275,6 +362,30 @@ int pwrdm_complete_init(void) | |||
275 | } | 362 | } |
276 | 363 | ||
277 | /** | 364 | /** |
365 | * pwrdm_lock - acquire a Linux spinlock on a powerdomain | ||
366 | * @pwrdm: struct powerdomain * to lock | ||
367 | * | ||
368 | * Acquire the powerdomain spinlock on @pwrdm. No return value. | ||
369 | */ | ||
370 | void pwrdm_lock(struct powerdomain *pwrdm) | ||
371 | __acquires(&pwrdm->_lock) | ||
372 | { | ||
373 | spin_lock_irqsave(&pwrdm->_lock, pwrdm->_lock_flags); | ||
374 | } | ||
375 | |||
376 | /** | ||
377 | * pwrdm_unlock - release a Linux spinlock on a powerdomain | ||
378 | * @pwrdm: struct powerdomain * to unlock | ||
379 | * | ||
380 | * Release the powerdomain spinlock on @pwrdm. No return value. | ||
381 | */ | ||
382 | void pwrdm_unlock(struct powerdomain *pwrdm) | ||
383 | __releases(&pwrdm->_lock) | ||
384 | { | ||
385 | spin_unlock_irqrestore(&pwrdm->_lock, pwrdm->_lock_flags); | ||
386 | } | ||
387 | |||
388 | /** | ||
278 | * pwrdm_lookup - look up a powerdomain by name, return a pointer | 389 | * pwrdm_lookup - look up a powerdomain by name, return a pointer |
279 | * @name: name of powerdomain | 390 | * @name: name of powerdomain |
280 | * | 391 | * |
@@ -920,65 +1031,27 @@ bool pwrdm_has_hdwr_sar(struct powerdomain *pwrdm) | |||
920 | return (pwrdm && pwrdm->flags & PWRDM_HAS_HDWR_SAR) ? 1 : 0; | 1031 | return (pwrdm && pwrdm->flags & PWRDM_HAS_HDWR_SAR) ? 1 : 0; |
921 | } | 1032 | } |
922 | 1033 | ||
923 | /** | 1034 | int pwrdm_state_switch_nolock(struct powerdomain *pwrdm) |
924 | * pwrdm_set_lowpwrstchange - Request a low power state change | ||
925 | * @pwrdm: struct powerdomain * | ||
926 | * | ||
927 | * Allows a powerdomain to transtion to a lower power sleep state | ||
928 | * from an existing sleep state without waking up the powerdomain. | ||
929 | * Returns -EINVAL if the powerdomain pointer is null or if the | ||
930 | * powerdomain does not support LOWPOWERSTATECHANGE, or returns 0 | ||
931 | * upon success. | ||
932 | */ | ||
933 | int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm) | ||
934 | { | ||
935 | int ret = -EINVAL; | ||
936 | |||
937 | if (!pwrdm) | ||
938 | return -EINVAL; | ||
939 | |||
940 | if (!(pwrdm->flags & PWRDM_HAS_LOWPOWERSTATECHANGE)) | ||
941 | return -EINVAL; | ||
942 | |||
943 | pr_debug("powerdomain: %s: setting LOWPOWERSTATECHANGE bit\n", | ||
944 | pwrdm->name); | ||
945 | |||
946 | if (arch_pwrdm && arch_pwrdm->pwrdm_set_lowpwrstchange) | ||
947 | ret = arch_pwrdm->pwrdm_set_lowpwrstchange(pwrdm); | ||
948 | |||
949 | return ret; | ||
950 | } | ||
951 | |||
952 | /** | ||
953 | * pwrdm_wait_transition - wait for powerdomain power transition to finish | ||
954 | * @pwrdm: struct powerdomain * to wait for | ||
955 | * | ||
956 | * If the powerdomain @pwrdm is in the process of a state transition, | ||
957 | * spin until it completes the power transition, or until an iteration | ||
958 | * bailout value is reached. Returns -EINVAL if the powerdomain | ||
959 | * pointer is null, -EAGAIN if the bailout value was reached, or | ||
960 | * returns 0 upon success. | ||
961 | */ | ||
962 | int pwrdm_wait_transition(struct powerdomain *pwrdm) | ||
963 | { | 1035 | { |
964 | int ret = -EINVAL; | 1036 | int ret; |
965 | 1037 | ||
966 | if (!pwrdm) | 1038 | if (!pwrdm || !arch_pwrdm) |
967 | return -EINVAL; | 1039 | return -EINVAL; |
968 | 1040 | ||
969 | if (arch_pwrdm && arch_pwrdm->pwrdm_wait_transition) | 1041 | ret = arch_pwrdm->pwrdm_wait_transition(pwrdm); |
970 | ret = arch_pwrdm->pwrdm_wait_transition(pwrdm); | 1042 | if (!ret) |
1043 | ret = _pwrdm_state_switch(pwrdm, PWRDM_STATE_NOW); | ||
971 | 1044 | ||
972 | return ret; | 1045 | return ret; |
973 | } | 1046 | } |
974 | 1047 | ||
975 | int pwrdm_state_switch(struct powerdomain *pwrdm) | 1048 | int __deprecated pwrdm_state_switch(struct powerdomain *pwrdm) |
976 | { | 1049 | { |
977 | int ret; | 1050 | int ret; |
978 | 1051 | ||
979 | ret = pwrdm_wait_transition(pwrdm); | 1052 | pwrdm_lock(pwrdm); |
980 | if (!ret) | 1053 | ret = pwrdm_state_switch_nolock(pwrdm); |
981 | ret = _pwrdm_state_switch(pwrdm, PWRDM_STATE_NOW); | 1054 | pwrdm_unlock(pwrdm); |
982 | 1055 | ||
983 | return ret; | 1056 | return ret; |
984 | } | 1057 | } |
@@ -1004,6 +1077,61 @@ int pwrdm_post_transition(struct powerdomain *pwrdm) | |||
1004 | } | 1077 | } |
1005 | 1078 | ||
1006 | /** | 1079 | /** |
1080 | * omap_set_pwrdm_state - change a powerdomain's current power state | ||
1081 | * @pwrdm: struct powerdomain * to change the power state of | ||
1082 | * @pwrst: power state to change to | ||
1083 | * | ||
1084 | * Change the current hardware power state of the powerdomain | ||
1085 | * represented by @pwrdm to the power state represented by @pwrst. | ||
1086 | * Returns -EINVAL if @pwrdm is null or invalid or if the | ||
1087 | * powerdomain's current power state could not be read, or returns 0 | ||
1088 | * upon success or if @pwrdm does not support @pwrst or any | ||
1089 | * lower-power state. XXX Should not return 0 if the @pwrdm does not | ||
1090 | * support @pwrst or any lower-power state: this should be an error. | ||
1091 | */ | ||
1092 | int omap_set_pwrdm_state(struct powerdomain *pwrdm, u8 pwrst) | ||
1093 | { | ||
1094 | u8 curr_pwrst, next_pwrst, sleep_switch; | ||
1095 | int ret = 0; | ||
1096 | bool hwsup = false; | ||
1097 | |||
1098 | if (!pwrdm || IS_ERR(pwrdm)) | ||
1099 | return -EINVAL; | ||
1100 | |||
1101 | while (!(pwrdm->pwrsts & (1 << pwrst))) { | ||
1102 | if (pwrst == PWRDM_POWER_OFF) | ||
1103 | return ret; | ||
1104 | pwrst--; | ||
1105 | } | ||
1106 | |||
1107 | pwrdm_lock(pwrdm); | ||
1108 | |||
1109 | curr_pwrst = pwrdm_read_pwrst(pwrdm); | ||
1110 | next_pwrst = pwrdm_read_next_pwrst(pwrdm); | ||
1111 | if (curr_pwrst == pwrst && next_pwrst == pwrst) | ||
1112 | goto osps_out; | ||
1113 | |||
1114 | sleep_switch = _pwrdm_save_clkdm_state_and_activate(pwrdm, curr_pwrst, | ||
1115 | pwrst, &hwsup); | ||
1116 | if (sleep_switch == ERROR_SWITCH) { | ||
1117 | ret = -EINVAL; | ||
1118 | goto osps_out; | ||
1119 | } | ||
1120 | |||
1121 | ret = pwrdm_set_next_pwrst(pwrdm, pwrst); | ||
1122 | if (ret) | ||
1123 | pr_err("%s: unable to set power state of powerdomain: %s\n", | ||
1124 | __func__, pwrdm->name); | ||
1125 | |||
1126 | _pwrdm_restore_clkdm_state(pwrdm, sleep_switch, hwsup); | ||
1127 | |||
1128 | osps_out: | ||
1129 | pwrdm_unlock(pwrdm); | ||
1130 | |||
1131 | return ret; | ||
1132 | } | ||
1133 | |||
1134 | /** | ||
1007 | * pwrdm_get_context_loss_count - get powerdomain's context loss count | 1135 | * pwrdm_get_context_loss_count - get powerdomain's context loss count |
1008 | * @pwrdm: struct powerdomain * to wait for | 1136 | * @pwrdm: struct powerdomain * to wait for |
1009 | * | 1137 | * |
diff --git a/arch/arm/mach-omap2/powerdomain.h b/arch/arm/mach-omap2/powerdomain.h index 5277d56eb37f..140c36074fed 100644 --- a/arch/arm/mach-omap2/powerdomain.h +++ b/arch/arm/mach-omap2/powerdomain.h | |||
@@ -19,8 +19,7 @@ | |||
19 | 19 | ||
20 | #include <linux/types.h> | 20 | #include <linux/types.h> |
21 | #include <linux/list.h> | 21 | #include <linux/list.h> |
22 | 22 | #include <linux/spinlock.h> | |
23 | #include <linux/atomic.h> | ||
24 | 23 | ||
25 | #include "voltage.h" | 24 | #include "voltage.h" |
26 | 25 | ||
@@ -44,18 +43,20 @@ | |||
44 | #define PWRSTS_OFF_RET_ON (PWRSTS_OFF_RET | PWRSTS_ON) | 43 | #define PWRSTS_OFF_RET_ON (PWRSTS_OFF_RET | PWRSTS_ON) |
45 | 44 | ||
46 | 45 | ||
47 | /* Powerdomain flags */ | 46 | /* |
48 | #define PWRDM_HAS_HDWR_SAR (1 << 0) /* hardware save-and-restore support */ | 47 | * Powerdomain flags (struct powerdomain.flags) |
49 | #define PWRDM_HAS_MPU_QUIRK (1 << 1) /* MPU pwr domain has MEM bank 0 bits | 48 | * |
50 | * in MEM bank 1 position. This is | 49 | * PWRDM_HAS_HDWR_SAR - powerdomain has hardware save-and-restore support |
51 | * true for OMAP3430 | 50 | * |
52 | */ | 51 | * PWRDM_HAS_MPU_QUIRK - MPU pwr domain has MEM bank 0 bits in MEM |
53 | #define PWRDM_HAS_LOWPOWERSTATECHANGE (1 << 2) /* | 52 | * bank 1 position. This is true for OMAP3430 |
54 | * support to transition from a | 53 | * |
55 | * sleep state to a lower sleep | 54 | * PWRDM_HAS_LOWPOWERSTATECHANGE - can transition from a sleep state |
56 | * state without waking up the | 55 | * to a lower sleep state without waking up the powerdomain |
57 | * powerdomain | 56 | */ |
58 | */ | 57 | #define PWRDM_HAS_HDWR_SAR BIT(0) |
58 | #define PWRDM_HAS_MPU_QUIRK BIT(1) | ||
59 | #define PWRDM_HAS_LOWPOWERSTATECHANGE BIT(2) | ||
59 | 60 | ||
60 | /* | 61 | /* |
61 | * Number of memory banks that are power-controllable. On OMAP4430, the | 62 | * Number of memory banks that are power-controllable. On OMAP4430, the |
@@ -103,6 +104,8 @@ struct powerdomain; | |||
103 | * @state_counter: | 104 | * @state_counter: |
104 | * @timer: | 105 | * @timer: |
105 | * @state_timer: | 106 | * @state_timer: |
107 | * @_lock: spinlock used to serialize powerdomain and some clockdomain ops | ||
108 | * @_lock_flags: stored flags when @_lock is taken | ||
106 | * | 109 | * |
107 | * @prcm_partition possible values are defined in mach-omap2/prcm44xx.h. | 110 | * @prcm_partition possible values are defined in mach-omap2/prcm44xx.h. |
108 | */ | 111 | */ |
@@ -127,7 +130,8 @@ struct powerdomain { | |||
127 | unsigned state_counter[PWRDM_MAX_PWRSTS]; | 130 | unsigned state_counter[PWRDM_MAX_PWRSTS]; |
128 | unsigned ret_logic_off_counter; | 131 | unsigned ret_logic_off_counter; |
129 | unsigned ret_mem_off_counter[PWRDM_MAX_MEM_BANKS]; | 132 | unsigned ret_mem_off_counter[PWRDM_MAX_MEM_BANKS]; |
130 | 133 | spinlock_t _lock; | |
134 | unsigned long _lock_flags; | ||
131 | const u8 pwrstctrl_offs; | 135 | const u8 pwrstctrl_offs; |
132 | const u8 pwrstst_offs; | 136 | const u8 pwrstst_offs; |
133 | const u32 logicretstate_mask; | 137 | const u32 logicretstate_mask; |
@@ -162,6 +166,16 @@ struct powerdomain { | |||
162 | * @pwrdm_disable_hdwr_sar: Disable Hardware Save-Restore feature for a pd | 166 | * @pwrdm_disable_hdwr_sar: Disable Hardware Save-Restore feature for a pd |
163 | * @pwrdm_set_lowpwrstchange: Enable pd transitions from a shallow to deep sleep | 167 | * @pwrdm_set_lowpwrstchange: Enable pd transitions from a shallow to deep sleep |
164 | * @pwrdm_wait_transition: Wait for a pd state transition to complete | 168 | * @pwrdm_wait_transition: Wait for a pd state transition to complete |
169 | * | ||
170 | * Regarding @pwrdm_set_lowpwrstchange: On the OMAP2 and 3-family | ||
171 | * chips, a powerdomain's power state is not allowed to directly | ||
172 | * transition from one low-power state (e.g., CSWR) to another | ||
173 | * low-power state (e.g., OFF) without first waking up the | ||
174 | * powerdomain. This wastes energy. So OMAP4 chips support the | ||
175 | * ability to transition a powerdomain power state directly from one | ||
176 | * low-power state to another. The function pointed to by | ||
177 | * @pwrdm_set_lowpwrstchange is intended to configure the OMAP4 | ||
178 | * hardware powerdomain state machine to enable this feature. | ||
165 | */ | 179 | */ |
166 | struct pwrdm_ops { | 180 | struct pwrdm_ops { |
167 | int (*pwrdm_set_next_pwrst)(struct powerdomain *pwrdm, u8 pwrst); | 181 | int (*pwrdm_set_next_pwrst)(struct powerdomain *pwrdm, u8 pwrst); |
@@ -225,15 +239,15 @@ int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm); | |||
225 | int pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm); | 239 | int pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm); |
226 | bool pwrdm_has_hdwr_sar(struct powerdomain *pwrdm); | 240 | bool pwrdm_has_hdwr_sar(struct powerdomain *pwrdm); |
227 | 241 | ||
228 | int pwrdm_wait_transition(struct powerdomain *pwrdm); | 242 | int pwrdm_state_switch_nolock(struct powerdomain *pwrdm); |
229 | |||
230 | int pwrdm_state_switch(struct powerdomain *pwrdm); | 243 | int pwrdm_state_switch(struct powerdomain *pwrdm); |
231 | int pwrdm_pre_transition(struct powerdomain *pwrdm); | 244 | int pwrdm_pre_transition(struct powerdomain *pwrdm); |
232 | int pwrdm_post_transition(struct powerdomain *pwrdm); | 245 | int pwrdm_post_transition(struct powerdomain *pwrdm); |
233 | int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm); | ||
234 | int pwrdm_get_context_loss_count(struct powerdomain *pwrdm); | 246 | int pwrdm_get_context_loss_count(struct powerdomain *pwrdm); |
235 | bool pwrdm_can_ever_lose_context(struct powerdomain *pwrdm); | 247 | bool pwrdm_can_ever_lose_context(struct powerdomain *pwrdm); |
236 | 248 | ||
249 | extern int omap_set_pwrdm_state(struct powerdomain *pwrdm, u8 state); | ||
250 | |||
237 | extern void omap242x_powerdomains_init(void); | 251 | extern void omap242x_powerdomains_init(void); |
238 | extern void omap243x_powerdomains_init(void); | 252 | extern void omap243x_powerdomains_init(void); |
239 | extern void omap3xxx_powerdomains_init(void); | 253 | extern void omap3xxx_powerdomains_init(void); |
@@ -253,5 +267,7 @@ extern u32 omap2_pwrdm_get_mem_bank_stst_mask(u8 bank); | |||
253 | extern struct powerdomain wkup_omap2_pwrdm; | 267 | extern struct powerdomain wkup_omap2_pwrdm; |
254 | extern struct powerdomain gfx_omap2_pwrdm; | 268 | extern struct powerdomain gfx_omap2_pwrdm; |
255 | 269 | ||
270 | extern void pwrdm_lock(struct powerdomain *pwrdm); | ||
271 | extern void pwrdm_unlock(struct powerdomain *pwrdm); | ||
256 | 272 | ||
257 | #endif | 273 | #endif |
diff --git a/arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c b/arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c index d3a5399091ad..7b946f1005b1 100644 --- a/arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c +++ b/arch/arm/mach-omap2/powerdomains2xxx_3xxx_data.c | |||
@@ -54,12 +54,12 @@ struct powerdomain gfx_omap2_pwrdm = { | |||
54 | .pwrsts_mem_on = { | 54 | .pwrsts_mem_on = { |
55 | [0] = PWRSTS_ON, /* MEMONSTATE */ | 55 | [0] = PWRSTS_ON, /* MEMONSTATE */ |
56 | }, | 56 | }, |
57 | .voltdm = { .name = "core" }, | 57 | .voltdm = { .name = "core" }, |
58 | }; | 58 | }; |
59 | 59 | ||
60 | struct powerdomain wkup_omap2_pwrdm = { | 60 | struct powerdomain wkup_omap2_pwrdm = { |
61 | .name = "wkup_pwrdm", | 61 | .name = "wkup_pwrdm", |
62 | .prcm_offs = WKUP_MOD, | 62 | .prcm_offs = WKUP_MOD, |
63 | .pwrsts = PWRSTS_ON, | 63 | .pwrsts = PWRSTS_ON, |
64 | .voltdm = { .name = "wakeup" }, | 64 | .voltdm = { .name = "wakeup" }, |
65 | }; | 65 | }; |
diff --git a/arch/arm/mach-omap2/powerdomains2xxx_data.c b/arch/arm/mach-omap2/powerdomains2xxx_data.c index ba520d4f7c7b..578eef86fcf2 100644 --- a/arch/arm/mach-omap2/powerdomains2xxx_data.c +++ b/arch/arm/mach-omap2/powerdomains2xxx_data.c | |||
@@ -38,7 +38,7 @@ static struct powerdomain dsp_pwrdm = { | |||
38 | .pwrsts_mem_on = { | 38 | .pwrsts_mem_on = { |
39 | [0] = PWRSTS_ON, | 39 | [0] = PWRSTS_ON, |
40 | }, | 40 | }, |
41 | .voltdm = { .name = "core" }, | 41 | .voltdm = { .name = "core" }, |
42 | }; | 42 | }; |
43 | 43 | ||
44 | static struct powerdomain mpu_24xx_pwrdm = { | 44 | static struct powerdomain mpu_24xx_pwrdm = { |
@@ -53,13 +53,14 @@ static struct powerdomain mpu_24xx_pwrdm = { | |||
53 | .pwrsts_mem_on = { | 53 | .pwrsts_mem_on = { |
54 | [0] = PWRSTS_ON, | 54 | [0] = PWRSTS_ON, |
55 | }, | 55 | }, |
56 | .voltdm = { .name = "core" }, | 56 | .voltdm = { .name = "core" }, |
57 | }; | 57 | }; |
58 | 58 | ||
59 | static struct powerdomain core_24xx_pwrdm = { | 59 | static struct powerdomain core_24xx_pwrdm = { |
60 | .name = "core_pwrdm", | 60 | .name = "core_pwrdm", |
61 | .prcm_offs = CORE_MOD, | 61 | .prcm_offs = CORE_MOD, |
62 | .pwrsts = PWRSTS_OFF_RET_ON, | 62 | .pwrsts = PWRSTS_OFF_RET_ON, |
63 | .pwrsts_logic_ret = PWRSTS_RET, | ||
63 | .banks = 3, | 64 | .banks = 3, |
64 | .pwrsts_mem_ret = { | 65 | .pwrsts_mem_ret = { |
65 | [0] = PWRSTS_OFF_RET, /* MEM1RETSTATE */ | 66 | [0] = PWRSTS_OFF_RET, /* MEM1RETSTATE */ |
@@ -71,7 +72,7 @@ static struct powerdomain core_24xx_pwrdm = { | |||
71 | [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */ | 72 | [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */ |
72 | [2] = PWRSTS_OFF_RET_ON, /* MEM3ONSTATE */ | 73 | [2] = PWRSTS_OFF_RET_ON, /* MEM3ONSTATE */ |
73 | }, | 74 | }, |
74 | .voltdm = { .name = "core" }, | 75 | .voltdm = { .name = "core" }, |
75 | }; | 76 | }; |
76 | 77 | ||
77 | 78 | ||
@@ -93,7 +94,7 @@ static struct powerdomain mdm_pwrdm = { | |||
93 | .pwrsts_mem_on = { | 94 | .pwrsts_mem_on = { |
94 | [0] = PWRSTS_ON, /* MEMONSTATE */ | 95 | [0] = PWRSTS_ON, /* MEMONSTATE */ |
95 | }, | 96 | }, |
96 | .voltdm = { .name = "core" }, | 97 | .voltdm = { .name = "core" }, |
97 | }; | 98 | }; |
98 | 99 | ||
99 | /* | 100 | /* |
diff --git a/arch/arm/mach-omap2/powerdomains3xxx_data.c b/arch/arm/mach-omap2/powerdomains3xxx_data.c index 8b23d234fb55..f0e14e9efe5a 100644 --- a/arch/arm/mach-omap2/powerdomains3xxx_data.c +++ b/arch/arm/mach-omap2/powerdomains3xxx_data.c | |||
@@ -50,7 +50,7 @@ static struct powerdomain iva2_pwrdm = { | |||
50 | [2] = PWRSTS_OFF_ON, | 50 | [2] = PWRSTS_OFF_ON, |
51 | [3] = PWRSTS_ON, | 51 | [3] = PWRSTS_ON, |
52 | }, | 52 | }, |
53 | .voltdm = { .name = "mpu_iva" }, | 53 | .voltdm = { .name = "mpu_iva" }, |
54 | }; | 54 | }; |
55 | 55 | ||
56 | static struct powerdomain mpu_3xxx_pwrdm = { | 56 | static struct powerdomain mpu_3xxx_pwrdm = { |
@@ -66,7 +66,7 @@ static struct powerdomain mpu_3xxx_pwrdm = { | |||
66 | .pwrsts_mem_on = { | 66 | .pwrsts_mem_on = { |
67 | [0] = PWRSTS_OFF_ON, | 67 | [0] = PWRSTS_OFF_ON, |
68 | }, | 68 | }, |
69 | .voltdm = { .name = "mpu_iva" }, | 69 | .voltdm = { .name = "mpu_iva" }, |
70 | }; | 70 | }; |
71 | 71 | ||
72 | static struct powerdomain mpu_am35x_pwrdm = { | 72 | static struct powerdomain mpu_am35x_pwrdm = { |
@@ -82,7 +82,7 @@ static struct powerdomain mpu_am35x_pwrdm = { | |||
82 | .pwrsts_mem_on = { | 82 | .pwrsts_mem_on = { |
83 | [0] = PWRSTS_ON, | 83 | [0] = PWRSTS_ON, |
84 | }, | 84 | }, |
85 | .voltdm = { .name = "mpu_iva" }, | 85 | .voltdm = { .name = "mpu_iva" }, |
86 | }; | 86 | }; |
87 | 87 | ||
88 | /* | 88 | /* |
@@ -109,7 +109,7 @@ static struct powerdomain core_3xxx_pre_es3_1_pwrdm = { | |||
109 | [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */ | 109 | [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */ |
110 | [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */ | 110 | [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */ |
111 | }, | 111 | }, |
112 | .voltdm = { .name = "core" }, | 112 | .voltdm = { .name = "core" }, |
113 | }; | 113 | }; |
114 | 114 | ||
115 | static struct powerdomain core_3xxx_es3_1_pwrdm = { | 115 | static struct powerdomain core_3xxx_es3_1_pwrdm = { |
@@ -131,7 +131,7 @@ static struct powerdomain core_3xxx_es3_1_pwrdm = { | |||
131 | [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */ | 131 | [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */ |
132 | [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */ | 132 | [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */ |
133 | }, | 133 | }, |
134 | .voltdm = { .name = "core" }, | 134 | .voltdm = { .name = "core" }, |
135 | }; | 135 | }; |
136 | 136 | ||
137 | static struct powerdomain core_am35x_pwrdm = { | 137 | static struct powerdomain core_am35x_pwrdm = { |
@@ -148,7 +148,7 @@ static struct powerdomain core_am35x_pwrdm = { | |||
148 | [0] = PWRSTS_ON, /* MEM1ONSTATE */ | 148 | [0] = PWRSTS_ON, /* MEM1ONSTATE */ |
149 | [1] = PWRSTS_ON, /* MEM2ONSTATE */ | 149 | [1] = PWRSTS_ON, /* MEM2ONSTATE */ |
150 | }, | 150 | }, |
151 | .voltdm = { .name = "core" }, | 151 | .voltdm = { .name = "core" }, |
152 | }; | 152 | }; |
153 | 153 | ||
154 | static struct powerdomain dss_pwrdm = { | 154 | static struct powerdomain dss_pwrdm = { |
@@ -163,7 +163,7 @@ static struct powerdomain dss_pwrdm = { | |||
163 | .pwrsts_mem_on = { | 163 | .pwrsts_mem_on = { |
164 | [0] = PWRSTS_ON, /* MEMONSTATE */ | 164 | [0] = PWRSTS_ON, /* MEMONSTATE */ |
165 | }, | 165 | }, |
166 | .voltdm = { .name = "core" }, | 166 | .voltdm = { .name = "core" }, |
167 | }; | 167 | }; |
168 | 168 | ||
169 | static struct powerdomain dss_am35x_pwrdm = { | 169 | static struct powerdomain dss_am35x_pwrdm = { |
@@ -178,7 +178,7 @@ static struct powerdomain dss_am35x_pwrdm = { | |||
178 | .pwrsts_mem_on = { | 178 | .pwrsts_mem_on = { |
179 | [0] = PWRSTS_ON, /* MEMONSTATE */ | 179 | [0] = PWRSTS_ON, /* MEMONSTATE */ |
180 | }, | 180 | }, |
181 | .voltdm = { .name = "core" }, | 181 | .voltdm = { .name = "core" }, |
182 | }; | 182 | }; |
183 | 183 | ||
184 | /* | 184 | /* |
@@ -199,7 +199,7 @@ static struct powerdomain sgx_pwrdm = { | |||
199 | .pwrsts_mem_on = { | 199 | .pwrsts_mem_on = { |
200 | [0] = PWRSTS_ON, /* MEMONSTATE */ | 200 | [0] = PWRSTS_ON, /* MEMONSTATE */ |
201 | }, | 201 | }, |
202 | .voltdm = { .name = "core" }, | 202 | .voltdm = { .name = "core" }, |
203 | }; | 203 | }; |
204 | 204 | ||
205 | static struct powerdomain sgx_am35x_pwrdm = { | 205 | static struct powerdomain sgx_am35x_pwrdm = { |
@@ -214,7 +214,7 @@ static struct powerdomain sgx_am35x_pwrdm = { | |||
214 | .pwrsts_mem_on = { | 214 | .pwrsts_mem_on = { |
215 | [0] = PWRSTS_ON, /* MEMONSTATE */ | 215 | [0] = PWRSTS_ON, /* MEMONSTATE */ |
216 | }, | 216 | }, |
217 | .voltdm = { .name = "core" }, | 217 | .voltdm = { .name = "core" }, |
218 | }; | 218 | }; |
219 | 219 | ||
220 | static struct powerdomain cam_pwrdm = { | 220 | static struct powerdomain cam_pwrdm = { |
@@ -229,7 +229,7 @@ static struct powerdomain cam_pwrdm = { | |||
229 | .pwrsts_mem_on = { | 229 | .pwrsts_mem_on = { |
230 | [0] = PWRSTS_ON, /* MEMONSTATE */ | 230 | [0] = PWRSTS_ON, /* MEMONSTATE */ |
231 | }, | 231 | }, |
232 | .voltdm = { .name = "core" }, | 232 | .voltdm = { .name = "core" }, |
233 | }; | 233 | }; |
234 | 234 | ||
235 | static struct powerdomain per_pwrdm = { | 235 | static struct powerdomain per_pwrdm = { |
@@ -244,7 +244,7 @@ static struct powerdomain per_pwrdm = { | |||
244 | .pwrsts_mem_on = { | 244 | .pwrsts_mem_on = { |
245 | [0] = PWRSTS_ON, /* MEMONSTATE */ | 245 | [0] = PWRSTS_ON, /* MEMONSTATE */ |
246 | }, | 246 | }, |
247 | .voltdm = { .name = "core" }, | 247 | .voltdm = { .name = "core" }, |
248 | }; | 248 | }; |
249 | 249 | ||
250 | static struct powerdomain per_am35x_pwrdm = { | 250 | static struct powerdomain per_am35x_pwrdm = { |
@@ -259,13 +259,13 @@ static struct powerdomain per_am35x_pwrdm = { | |||
259 | .pwrsts_mem_on = { | 259 | .pwrsts_mem_on = { |
260 | [0] = PWRSTS_ON, /* MEMONSTATE */ | 260 | [0] = PWRSTS_ON, /* MEMONSTATE */ |
261 | }, | 261 | }, |
262 | .voltdm = { .name = "core" }, | 262 | .voltdm = { .name = "core" }, |
263 | }; | 263 | }; |
264 | 264 | ||
265 | static struct powerdomain emu_pwrdm = { | 265 | static struct powerdomain emu_pwrdm = { |
266 | .name = "emu_pwrdm", | 266 | .name = "emu_pwrdm", |
267 | .prcm_offs = OMAP3430_EMU_MOD, | 267 | .prcm_offs = OMAP3430_EMU_MOD, |
268 | .voltdm = { .name = "core" }, | 268 | .voltdm = { .name = "core" }, |
269 | }; | 269 | }; |
270 | 270 | ||
271 | static struct powerdomain neon_pwrdm = { | 271 | static struct powerdomain neon_pwrdm = { |
@@ -273,7 +273,7 @@ static struct powerdomain neon_pwrdm = { | |||
273 | .prcm_offs = OMAP3430_NEON_MOD, | 273 | .prcm_offs = OMAP3430_NEON_MOD, |
274 | .pwrsts = PWRSTS_OFF_RET_ON, | 274 | .pwrsts = PWRSTS_OFF_RET_ON, |
275 | .pwrsts_logic_ret = PWRSTS_RET, | 275 | .pwrsts_logic_ret = PWRSTS_RET, |
276 | .voltdm = { .name = "mpu_iva" }, | 276 | .voltdm = { .name = "mpu_iva" }, |
277 | }; | 277 | }; |
278 | 278 | ||
279 | static struct powerdomain neon_am35x_pwrdm = { | 279 | static struct powerdomain neon_am35x_pwrdm = { |
@@ -281,7 +281,7 @@ static struct powerdomain neon_am35x_pwrdm = { | |||
281 | .prcm_offs = OMAP3430_NEON_MOD, | 281 | .prcm_offs = OMAP3430_NEON_MOD, |
282 | .pwrsts = PWRSTS_ON, | 282 | .pwrsts = PWRSTS_ON, |
283 | .pwrsts_logic_ret = PWRSTS_ON, | 283 | .pwrsts_logic_ret = PWRSTS_ON, |
284 | .voltdm = { .name = "mpu_iva" }, | 284 | .voltdm = { .name = "mpu_iva" }, |
285 | }; | 285 | }; |
286 | 286 | ||
287 | static struct powerdomain usbhost_pwrdm = { | 287 | static struct powerdomain usbhost_pwrdm = { |
@@ -303,37 +303,37 @@ static struct powerdomain usbhost_pwrdm = { | |||
303 | .pwrsts_mem_on = { | 303 | .pwrsts_mem_on = { |
304 | [0] = PWRSTS_ON, /* MEMONSTATE */ | 304 | [0] = PWRSTS_ON, /* MEMONSTATE */ |
305 | }, | 305 | }, |
306 | .voltdm = { .name = "core" }, | 306 | .voltdm = { .name = "core" }, |
307 | }; | 307 | }; |
308 | 308 | ||
309 | static struct powerdomain dpll1_pwrdm = { | 309 | static struct powerdomain dpll1_pwrdm = { |
310 | .name = "dpll1_pwrdm", | 310 | .name = "dpll1_pwrdm", |
311 | .prcm_offs = MPU_MOD, | 311 | .prcm_offs = MPU_MOD, |
312 | .voltdm = { .name = "mpu_iva" }, | 312 | .voltdm = { .name = "mpu_iva" }, |
313 | }; | 313 | }; |
314 | 314 | ||
315 | static struct powerdomain dpll2_pwrdm = { | 315 | static struct powerdomain dpll2_pwrdm = { |
316 | .name = "dpll2_pwrdm", | 316 | .name = "dpll2_pwrdm", |
317 | .prcm_offs = OMAP3430_IVA2_MOD, | 317 | .prcm_offs = OMAP3430_IVA2_MOD, |
318 | .voltdm = { .name = "mpu_iva" }, | 318 | .voltdm = { .name = "mpu_iva" }, |
319 | }; | 319 | }; |
320 | 320 | ||
321 | static struct powerdomain dpll3_pwrdm = { | 321 | static struct powerdomain dpll3_pwrdm = { |
322 | .name = "dpll3_pwrdm", | 322 | .name = "dpll3_pwrdm", |
323 | .prcm_offs = PLL_MOD, | 323 | .prcm_offs = PLL_MOD, |
324 | .voltdm = { .name = "core" }, | 324 | .voltdm = { .name = "core" }, |
325 | }; | 325 | }; |
326 | 326 | ||
327 | static struct powerdomain dpll4_pwrdm = { | 327 | static struct powerdomain dpll4_pwrdm = { |
328 | .name = "dpll4_pwrdm", | 328 | .name = "dpll4_pwrdm", |
329 | .prcm_offs = PLL_MOD, | 329 | .prcm_offs = PLL_MOD, |
330 | .voltdm = { .name = "core" }, | 330 | .voltdm = { .name = "core" }, |
331 | }; | 331 | }; |
332 | 332 | ||
333 | static struct powerdomain dpll5_pwrdm = { | 333 | static struct powerdomain dpll5_pwrdm = { |
334 | .name = "dpll5_pwrdm", | 334 | .name = "dpll5_pwrdm", |
335 | .prcm_offs = PLL_MOD, | 335 | .prcm_offs = PLL_MOD, |
336 | .voltdm = { .name = "core" }, | 336 | .voltdm = { .name = "core" }, |
337 | }; | 337 | }; |
338 | 338 | ||
339 | /* As powerdomains are added or removed above, this list must also be changed */ | 339 | /* As powerdomains are added or removed above, this list must also be changed */ |
diff --git a/arch/arm/mach-omap2/prm2xxx_3xxx.c b/arch/arm/mach-omap2/prm2xxx_3xxx.c index a3e121f94a86..947f6adfed0c 100644 --- a/arch/arm/mach-omap2/prm2xxx_3xxx.c +++ b/arch/arm/mach-omap2/prm2xxx_3xxx.c | |||
@@ -210,6 +210,7 @@ int omap2_clkdm_read_wkdep(struct clockdomain *clkdm1, | |||
210 | PM_WKDEP, (1 << clkdm2->dep_bit)); | 210 | PM_WKDEP, (1 << clkdm2->dep_bit)); |
211 | } | 211 | } |
212 | 212 | ||
213 | /* XXX Caller must hold the clkdm's powerdomain lock */ | ||
213 | int omap2_clkdm_clear_all_wkdeps(struct clockdomain *clkdm) | 214 | int omap2_clkdm_clear_all_wkdeps(struct clockdomain *clkdm) |
214 | { | 215 | { |
215 | struct clkdm_dep *cd; | 216 | struct clkdm_dep *cd; |
@@ -221,7 +222,7 @@ int omap2_clkdm_clear_all_wkdeps(struct clockdomain *clkdm) | |||
221 | 222 | ||
222 | /* PRM accesses are slow, so minimize them */ | 223 | /* PRM accesses are slow, so minimize them */ |
223 | mask |= 1 << cd->clkdm->dep_bit; | 224 | mask |= 1 << cd->clkdm->dep_bit; |
224 | atomic_set(&cd->wkdep_usecount, 0); | 225 | cd->wkdep_usecount = 0; |
225 | } | 226 | } |
226 | 227 | ||
227 | omap2_prm_clear_mod_reg_bits(mask, clkdm->pwrdm.ptr->prcm_offs, | 228 | omap2_prm_clear_mod_reg_bits(mask, clkdm->pwrdm.ptr->prcm_offs, |
diff --git a/arch/arm/mach-omap2/prm33xx.c b/arch/arm/mach-omap2/prm33xx.c index 1ac73883f891..44c0d7216aa7 100644 --- a/arch/arm/mach-omap2/prm33xx.c +++ b/arch/arm/mach-omap2/prm33xx.c | |||
@@ -110,11 +110,11 @@ int am33xx_prm_assert_hardreset(u8 shift, s16 inst, u16 rstctrl_offs) | |||
110 | * -EINVAL upon an argument error, -EEXIST if the submodule was already out | 110 | * -EINVAL upon an argument error, -EEXIST if the submodule was already out |
111 | * of reset, or -EBUSY if the submodule did not exit reset promptly. | 111 | * of reset, or -EBUSY if the submodule did not exit reset promptly. |
112 | */ | 112 | */ |
113 | int am33xx_prm_deassert_hardreset(u8 shift, s16 inst, | 113 | int am33xx_prm_deassert_hardreset(u8 shift, u8 st_shift, s16 inst, |
114 | u16 rstctrl_offs, u16 rstst_offs) | 114 | u16 rstctrl_offs, u16 rstst_offs) |
115 | { | 115 | { |
116 | int c; | 116 | int c; |
117 | u32 mask = 1 << shift; | 117 | u32 mask = 1 << st_shift; |
118 | 118 | ||
119 | /* Check the current status to avoid de-asserting the line twice */ | 119 | /* Check the current status to avoid de-asserting the line twice */ |
120 | if (am33xx_prm_is_hardreset_asserted(shift, inst, rstctrl_offs) == 0) | 120 | if (am33xx_prm_is_hardreset_asserted(shift, inst, rstctrl_offs) == 0) |
@@ -122,11 +122,14 @@ int am33xx_prm_deassert_hardreset(u8 shift, s16 inst, | |||
122 | 122 | ||
123 | /* Clear the reset status by writing 1 to the status bit */ | 123 | /* Clear the reset status by writing 1 to the status bit */ |
124 | am33xx_prm_rmw_reg_bits(0xffffffff, mask, inst, rstst_offs); | 124 | am33xx_prm_rmw_reg_bits(0xffffffff, mask, inst, rstst_offs); |
125 | |||
125 | /* de-assert the reset control line */ | 126 | /* de-assert the reset control line */ |
127 | mask = 1 << shift; | ||
128 | |||
126 | am33xx_prm_rmw_reg_bits(mask, 0, inst, rstctrl_offs); | 129 | am33xx_prm_rmw_reg_bits(mask, 0, inst, rstctrl_offs); |
127 | /* wait the status to be set */ | ||
128 | 130 | ||
129 | omap_test_timeout(am33xx_prm_is_hardreset_asserted(shift, inst, | 131 | /* wait the status to be set */ |
132 | omap_test_timeout(am33xx_prm_is_hardreset_asserted(st_shift, inst, | ||
130 | rstst_offs), | 133 | rstst_offs), |
131 | MAX_MODULE_HARDRESET_WAIT, c); | 134 | MAX_MODULE_HARDRESET_WAIT, c); |
132 | 135 | ||
diff --git a/arch/arm/mach-omap2/prm33xx.h b/arch/arm/mach-omap2/prm33xx.h index 3f25c563a821..9b9918dfb119 100644 --- a/arch/arm/mach-omap2/prm33xx.h +++ b/arch/arm/mach-omap2/prm33xx.h | |||
@@ -117,6 +117,7 @@ | |||
117 | #define AM33XX_PM_CEFUSE_PWRSTST_OFFSET 0x0004 | 117 | #define AM33XX_PM_CEFUSE_PWRSTST_OFFSET 0x0004 |
118 | #define AM33XX_PM_CEFUSE_PWRSTST AM33XX_PRM_REGADDR(AM33XX_PRM_CEFUSE_MOD, 0x0004) | 118 | #define AM33XX_PM_CEFUSE_PWRSTST AM33XX_PRM_REGADDR(AM33XX_PRM_CEFUSE_MOD, 0x0004) |
119 | 119 | ||
120 | #ifndef __ASSEMBLER__ | ||
120 | extern u32 am33xx_prm_read_reg(s16 inst, u16 idx); | 121 | extern u32 am33xx_prm_read_reg(s16 inst, u16 idx); |
121 | extern void am33xx_prm_write_reg(u32 val, s16 inst, u16 idx); | 122 | extern void am33xx_prm_write_reg(u32 val, s16 inst, u16 idx); |
122 | extern u32 am33xx_prm_rmw_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx); | 123 | extern u32 am33xx_prm_rmw_reg_bits(u32 mask, u32 bits, s16 inst, s16 idx); |
@@ -124,6 +125,7 @@ extern void am33xx_prm_global_warm_sw_reset(void); | |||
124 | extern int am33xx_prm_is_hardreset_asserted(u8 shift, s16 inst, | 125 | extern int am33xx_prm_is_hardreset_asserted(u8 shift, s16 inst, |
125 | u16 rstctrl_offs); | 126 | u16 rstctrl_offs); |
126 | extern int am33xx_prm_assert_hardreset(u8 shift, s16 inst, u16 rstctrl_offs); | 127 | extern int am33xx_prm_assert_hardreset(u8 shift, s16 inst, u16 rstctrl_offs); |
127 | extern int am33xx_prm_deassert_hardreset(u8 shift, s16 inst, | 128 | extern int am33xx_prm_deassert_hardreset(u8 shift, u8 st_shift, s16 inst, |
128 | u16 rstctrl_offs, u16 rstst_offs); | 129 | u16 rstctrl_offs, u16 rstst_offs); |
130 | #endif /* ASSEMBLER */ | ||
129 | #endif | 131 | #endif |
diff --git a/arch/arm/mach-omap2/prm3xxx.c b/arch/arm/mach-omap2/prm3xxx.c index e648bd55b072..7721990d2006 100644 --- a/arch/arm/mach-omap2/prm3xxx.c +++ b/arch/arm/mach-omap2/prm3xxx.c | |||
@@ -427,7 +427,7 @@ static int __init omap3xxx_prm_late_init(void) | |||
427 | 427 | ||
428 | return ret; | 428 | return ret; |
429 | } | 429 | } |
430 | subsys_initcall(omap3xxx_prm_late_init); | 430 | omap_subsys_initcall(omap3xxx_prm_late_init); |
431 | 431 | ||
432 | static void __exit omap3xxx_prm_exit(void) | 432 | static void __exit omap3xxx_prm_exit(void) |
433 | { | 433 | { |
diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c index c05a343d465d..d35f98aabf7a 100644 --- a/arch/arm/mach-omap2/prm44xx.c +++ b/arch/arm/mach-omap2/prm44xx.c | |||
@@ -665,7 +665,7 @@ static int __init omap44xx_prm_late_init(void) | |||
665 | 665 | ||
666 | return omap_prcm_register_chain_handler(&omap4_prcm_irq_setup); | 666 | return omap_prcm_register_chain_handler(&omap4_prcm_irq_setup); |
667 | } | 667 | } |
668 | subsys_initcall(omap44xx_prm_late_init); | 668 | omap_subsys_initcall(omap44xx_prm_late_init); |
669 | 669 | ||
670 | static void __exit omap44xx_prm_exit(void) | 670 | static void __exit omap44xx_prm_exit(void) |
671 | { | 671 | { |
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index 04fdbc4c499b..8396b5b7e912 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c | |||
@@ -254,7 +254,7 @@ static int __init omap_serial_early_init(void) | |||
254 | 254 | ||
255 | return 0; | 255 | return 0; |
256 | } | 256 | } |
257 | core_initcall(omap_serial_early_init); | 257 | omap_core_initcall(omap_serial_early_init); |
258 | 258 | ||
259 | /** | 259 | /** |
260 | * omap_serial_init_port() - initialize single serial port | 260 | * omap_serial_init_port() - initialize single serial port |
@@ -316,8 +316,7 @@ void __init omap_serial_init_port(struct omap_board_data *bdata, | |||
316 | if (WARN_ON(!oh)) | 316 | if (WARN_ON(!oh)) |
317 | return; | 317 | return; |
318 | 318 | ||
319 | pdev = omap_device_build(name, uart->num, oh, pdata, pdata_size, | 319 | pdev = omap_device_build(name, uart->num, oh, pdata, pdata_size); |
320 | NULL, 0, false); | ||
321 | if (IS_ERR(pdev)) { | 320 | if (IS_ERR(pdev)) { |
322 | WARN(1, "Could not build omap_device for %s: %s.\n", name, | 321 | WARN(1, "Could not build omap_device for %s: %s.\n", name, |
323 | oh->name); | 322 | oh->name); |
diff --git a/arch/arm/mach-omap2/sleep24xx.S b/arch/arm/mach-omap2/sleep24xx.S index ce0ccd26efbd..1d3cb25c9629 100644 --- a/arch/arm/mach-omap2/sleep24xx.S +++ b/arch/arm/mach-omap2/sleep24xx.S | |||
@@ -37,25 +37,6 @@ | |||
37 | .text | 37 | .text |
38 | 38 | ||
39 | /* | 39 | /* |
40 | * Forces OMAP into idle state | ||
41 | * | ||
42 | * omap24xx_idle_loop_suspend() - This bit of code just executes the WFI | ||
43 | * for normal idles. | ||
44 | * | ||
45 | * Note: This code get's copied to internal SRAM at boot. When the OMAP | ||
46 | * wakes up it continues execution at the point it went to sleep. | ||
47 | */ | ||
48 | .align 3 | ||
49 | ENTRY(omap24xx_idle_loop_suspend) | ||
50 | stmfd sp!, {r0, lr} @ save registers on stack | ||
51 | mov r0, #0 @ clear for mcr setup | ||
52 | mcr p15, 0, r0, c7, c0, 4 @ wait for interrupt | ||
53 | ldmfd sp!, {r0, pc} @ restore regs and return | ||
54 | |||
55 | ENTRY(omap24xx_idle_loop_suspend_sz) | ||
56 | .word . - omap24xx_idle_loop_suspend | ||
57 | |||
58 | /* | ||
59 | * omap24xx_cpu_suspend() - Forces OMAP into deep sleep state by completing | 40 | * omap24xx_cpu_suspend() - Forces OMAP into deep sleep state by completing |
60 | * SDRC shutdown then ARM shutdown. Upon wake MPU is back on so just restore | 41 | * SDRC shutdown then ARM shutdown. Upon wake MPU is back on so just restore |
61 | * SDRC. | 42 | * SDRC. |
diff --git a/arch/arm/mach-omap2/smartreflex-class3.c b/arch/arm/mach-omap2/smartreflex-class3.c index 1da8f03c479e..aee3c8940a30 100644 --- a/arch/arm/mach-omap2/smartreflex-class3.c +++ b/arch/arm/mach-omap2/smartreflex-class3.c | |||
@@ -12,6 +12,7 @@ | |||
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <linux/power/smartreflex.h> | 14 | #include <linux/power/smartreflex.h> |
15 | #include "soc.h" | ||
15 | #include "voltage.h" | 16 | #include "voltage.h" |
16 | 17 | ||
17 | static int sr_class3_enable(struct omap_sr *sr) | 18 | static int sr_class3_enable(struct omap_sr *sr) |
@@ -58,4 +59,4 @@ static int __init sr_class3_init(void) | |||
58 | pr_info("SmartReflex Class3 initialized\n"); | 59 | pr_info("SmartReflex Class3 initialized\n"); |
59 | return sr_register_class(&class3_data); | 60 | return sr_register_class(&class3_data); |
60 | } | 61 | } |
61 | late_initcall(sr_class3_init); | 62 | omap_late_initcall(sr_class3_init); |
diff --git a/arch/arm/mach-omap2/soc.h b/arch/arm/mach-omap2/soc.h index f31d90774de0..c62116bbc760 100644 --- a/arch/arm/mach-omap2/soc.h +++ b/arch/arm/mach-omap2/soc.h | |||
@@ -42,6 +42,9 @@ | |||
42 | #undef MULTI_OMAP2 | 42 | #undef MULTI_OMAP2 |
43 | #undef OMAP_NAME | 43 | #undef OMAP_NAME |
44 | 44 | ||
45 | #ifdef CONFIG_ARCH_MULTIPLATFORM | ||
46 | #define MULTI_OMAP2 | ||
47 | #endif | ||
45 | #ifdef CONFIG_SOC_OMAP2420 | 48 | #ifdef CONFIG_SOC_OMAP2420 |
46 | # ifdef OMAP_NAME | 49 | # ifdef OMAP_NAME |
47 | # undef MULTI_OMAP2 | 50 | # undef MULTI_OMAP2 |
@@ -112,6 +115,11 @@ int omap_type(void); | |||
112 | */ | 115 | */ |
113 | unsigned int omap_rev(void); | 116 | unsigned int omap_rev(void); |
114 | 117 | ||
118 | static inline int soc_is_omap(void) | ||
119 | { | ||
120 | return omap_rev() != 0; | ||
121 | } | ||
122 | |||
115 | /* | 123 | /* |
116 | * Get the CPU revision for OMAP devices | 124 | * Get the CPU revision for OMAP devices |
117 | */ | 125 | */ |
@@ -387,6 +395,7 @@ IS_OMAP_TYPE(3430, 0x3430) | |||
387 | 395 | ||
388 | #define AM335X_CLASS 0x33500033 | 396 | #define AM335X_CLASS 0x33500033 |
389 | #define AM335X_REV_ES1_0 AM335X_CLASS | 397 | #define AM335X_REV_ES1_0 AM335X_CLASS |
398 | #define AM335X_REV_ES2_0 (AM335X_CLASS | (0x1 << 8)) | ||
390 | 399 | ||
391 | #define OMAP443X_CLASS 0x44300044 | 400 | #define OMAP443X_CLASS 0x44300044 |
392 | #define OMAP4430_REV_ES1_0 (OMAP443X_CLASS | (0x10 << 8)) | 401 | #define OMAP4430_REV_ES1_0 (OMAP443X_CLASS | (0x10 << 8)) |
@@ -465,5 +474,26 @@ static inline unsigned int omap4_has_ ##feat(void) \ | |||
465 | 474 | ||
466 | OMAP4_HAS_FEATURE(perf_silicon, PERF_SILICON) | 475 | OMAP4_HAS_FEATURE(perf_silicon, PERF_SILICON) |
467 | 476 | ||
477 | /* | ||
478 | * We need to make sure omap initcalls don't run when | ||
479 | * multiplatform kernels are booted on other SoCs. | ||
480 | */ | ||
481 | #define omap_initcall(level, fn) \ | ||
482 | static int __init __used __##fn(void) \ | ||
483 | { \ | ||
484 | if (!soc_is_omap()) \ | ||
485 | return 0; \ | ||
486 | return fn(); \ | ||
487 | } \ | ||
488 | level(__##fn); | ||
489 | |||
490 | #define omap_early_initcall(fn) omap_initcall(early_initcall, fn) | ||
491 | #define omap_core_initcall(fn) omap_initcall(core_initcall, fn) | ||
492 | #define omap_postcore_initcall(fn) omap_initcall(postcore_initcall, fn) | ||
493 | #define omap_arch_initcall(fn) omap_initcall(arch_initcall, fn) | ||
494 | #define omap_subsys_initcall(fn) omap_initcall(subsys_initcall, fn) | ||
495 | #define omap_device_initcall(fn) omap_initcall(device_initcall, fn) | ||
496 | #define omap_late_initcall(fn) omap_initcall(late_initcall, fn) | ||
497 | |||
468 | #endif /* __ASSEMBLY__ */ | 498 | #endif /* __ASSEMBLY__ */ |
469 | 499 | ||
diff --git a/arch/arm/mach-omap2/sr_device.c b/arch/arm/mach-omap2/sr_device.c index b9753fe27232..d7bc33f15344 100644 --- a/arch/arm/mach-omap2/sr_device.c +++ b/arch/arm/mach-omap2/sr_device.c | |||
@@ -152,8 +152,7 @@ static int __init sr_dev_init(struct omap_hwmod *oh, void *user) | |||
152 | 152 | ||
153 | sr_data->enable_on_init = sr_enable_on_init; | 153 | sr_data->enable_on_init = sr_enable_on_init; |
154 | 154 | ||
155 | pdev = omap_device_build(name, i, oh, sr_data, sizeof(*sr_data), | 155 | pdev = omap_device_build(name, i, oh, sr_data, sizeof(*sr_data)); |
156 | NULL, 0, 0); | ||
157 | if (IS_ERR(pdev)) | 156 | if (IS_ERR(pdev)) |
158 | pr_warning("%s: Could not build omap_device for %s: %s.\n\n", | 157 | pr_warning("%s: Could not build omap_device for %s: %s.\n\n", |
159 | __func__, name, oh->name); | 158 | __func__, name, oh->name); |
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 390c1b6e15bc..5bde35bb8312 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c | |||
@@ -131,7 +131,6 @@ static void omap2_gp_timer_set_mode(enum clock_event_mode mode, | |||
131 | static struct clock_event_device clockevent_gpt = { | 131 | static struct clock_event_device clockevent_gpt = { |
132 | .name = "gp_timer", | 132 | .name = "gp_timer", |
133 | .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, | 133 | .features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT, |
134 | .shift = 32, | ||
135 | .rating = 300, | 134 | .rating = 300, |
136 | .set_next_event = omap2_gp_timer_set_next_event, | 135 | .set_next_event = omap2_gp_timer_set_next_event, |
137 | .set_mode = omap2_gp_timer_set_mode, | 136 | .set_mode = omap2_gp_timer_set_mode, |
@@ -228,7 +227,7 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer, | |||
228 | int r = 0; | 227 | int r = 0; |
229 | 228 | ||
230 | if (of_have_populated_dt()) { | 229 | if (of_have_populated_dt()) { |
231 | np = omap_get_timer_dt(omap_timer_match, NULL); | 230 | np = omap_get_timer_dt(omap_timer_match, property); |
232 | if (!np) | 231 | if (!np) |
233 | return -ENODEV; | 232 | return -ENODEV; |
234 | 233 | ||
@@ -336,17 +335,11 @@ static void __init omap2_gp_clockevent_init(int gptimer_id, | |||
336 | 335 | ||
337 | __omap_dm_timer_int_enable(&clkev, OMAP_TIMER_INT_OVERFLOW); | 336 | __omap_dm_timer_int_enable(&clkev, OMAP_TIMER_INT_OVERFLOW); |
338 | 337 | ||
339 | clockevent_gpt.mult = div_sc(clkev.rate, NSEC_PER_SEC, | ||
340 | clockevent_gpt.shift); | ||
341 | clockevent_gpt.max_delta_ns = | ||
342 | clockevent_delta2ns(0xffffffff, &clockevent_gpt); | ||
343 | clockevent_gpt.min_delta_ns = | ||
344 | clockevent_delta2ns(3, &clockevent_gpt); | ||
345 | /* Timer internal resynch latency. */ | ||
346 | |||
347 | clockevent_gpt.cpumask = cpu_possible_mask; | 338 | clockevent_gpt.cpumask = cpu_possible_mask; |
348 | clockevent_gpt.irq = omap_dm_timer_get_irq(&clkev); | 339 | clockevent_gpt.irq = omap_dm_timer_get_irq(&clkev); |
349 | clockevents_register_device(&clockevent_gpt); | 340 | clockevents_config_and_register(&clockevent_gpt, clkev.rate, |
341 | 3, /* Timer internal resynch latency */ | ||
342 | 0xffffffff); | ||
350 | 343 | ||
351 | pr_info("OMAP clockevent source: GPTIMER%d at %lu Hz\n", | 344 | pr_info("OMAP clockevent source: GPTIMER%d at %lu Hz\n", |
352 | gptimer_id, clkev.rate); | 345 | gptimer_id, clkev.rate); |
@@ -552,7 +545,7 @@ static inline void __init realtime_counter_init(void) | |||
552 | 545 | ||
553 | #define OMAP_SYS_GP_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop, \ | 546 | #define OMAP_SYS_GP_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop, \ |
554 | clksrc_nr, clksrc_src) \ | 547 | clksrc_nr, clksrc_src) \ |
555 | static void __init omap##name##_gptimer_timer_init(void) \ | 548 | void __init omap##name##_gptimer_timer_init(void) \ |
556 | { \ | 549 | { \ |
557 | omap_dmtimer_init(); \ | 550 | omap_dmtimer_init(); \ |
558 | omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ | 551 | omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ |
@@ -561,7 +554,7 @@ static void __init omap##name##_gptimer_timer_init(void) \ | |||
561 | 554 | ||
562 | #define OMAP_SYS_32K_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop, \ | 555 | #define OMAP_SYS_32K_TIMER_INIT(name, clkev_nr, clkev_src, clkev_prop, \ |
563 | clksrc_nr, clksrc_src) \ | 556 | clksrc_nr, clksrc_src) \ |
564 | static void __init omap##name##_sync32k_timer_init(void) \ | 557 | void __init omap##name##_sync32k_timer_init(void) \ |
565 | { \ | 558 | { \ |
566 | omap_dmtimer_init(); \ | 559 | omap_dmtimer_init(); \ |
567 | omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ | 560 | omap2_gp_clockevent_init((clkev_nr), clkev_src, clkev_prop); \ |
@@ -572,33 +565,23 @@ static void __init omap##name##_sync32k_timer_init(void) \ | |||
572 | omap2_sync32k_clocksource_init(); \ | 565 | omap2_sync32k_clocksource_init(); \ |
573 | } | 566 | } |
574 | 567 | ||
575 | #define OMAP_SYS_TIMER(name, clksrc) \ | ||
576 | struct sys_timer omap##name##_timer = { \ | ||
577 | .init = omap##name##_##clksrc##_timer_init, \ | ||
578 | }; | ||
579 | |||
580 | #ifdef CONFIG_ARCH_OMAP2 | 568 | #ifdef CONFIG_ARCH_OMAP2 |
581 | OMAP_SYS_32K_TIMER_INIT(2, 1, OMAP2_32K_SOURCE, "ti,timer-alwon", | 569 | OMAP_SYS_32K_TIMER_INIT(2, 1, OMAP2_32K_SOURCE, "ti,timer-alwon", |
582 | 2, OMAP2_MPU_SOURCE); | 570 | 2, OMAP2_MPU_SOURCE); |
583 | OMAP_SYS_TIMER(2, sync32k); | ||
584 | #endif /* CONFIG_ARCH_OMAP2 */ | 571 | #endif /* CONFIG_ARCH_OMAP2 */ |
585 | 572 | ||
586 | #ifdef CONFIG_ARCH_OMAP3 | 573 | #ifdef CONFIG_ARCH_OMAP3 |
587 | OMAP_SYS_32K_TIMER_INIT(3, 1, OMAP3_32K_SOURCE, "ti,timer-alwon", | 574 | OMAP_SYS_32K_TIMER_INIT(3, 1, OMAP3_32K_SOURCE, "ti,timer-alwon", |
588 | 2, OMAP3_MPU_SOURCE); | 575 | 2, OMAP3_MPU_SOURCE); |
589 | OMAP_SYS_TIMER(3, sync32k); | ||
590 | OMAP_SYS_32K_TIMER_INIT(3_secure, 12, OMAP3_32K_SOURCE, "ti,timer-secure", | 576 | OMAP_SYS_32K_TIMER_INIT(3_secure, 12, OMAP3_32K_SOURCE, "ti,timer-secure", |
591 | 2, OMAP3_MPU_SOURCE); | 577 | 2, OMAP3_MPU_SOURCE); |
592 | OMAP_SYS_TIMER(3_secure, sync32k); | ||
593 | OMAP_SYS_GP_TIMER_INIT(3_gp, 1, OMAP3_MPU_SOURCE, "ti,timer-alwon", | 578 | OMAP_SYS_GP_TIMER_INIT(3_gp, 1, OMAP3_MPU_SOURCE, "ti,timer-alwon", |
594 | 2, OMAP3_MPU_SOURCE); | 579 | 2, OMAP3_MPU_SOURCE); |
595 | OMAP_SYS_TIMER(3_gp, gptimer); | ||
596 | #endif /* CONFIG_ARCH_OMAP3 */ | 580 | #endif /* CONFIG_ARCH_OMAP3 */ |
597 | 581 | ||
598 | #ifdef CONFIG_SOC_AM33XX | 582 | #ifdef CONFIG_SOC_AM33XX |
599 | OMAP_SYS_GP_TIMER_INIT(3_am33xx, 1, OMAP4_MPU_SOURCE, "ti,timer-alwon", | 583 | OMAP_SYS_GP_TIMER_INIT(3_am33xx, 1, OMAP4_MPU_SOURCE, "ti,timer-alwon", |
600 | 2, OMAP4_MPU_SOURCE); | 584 | 2, OMAP4_MPU_SOURCE); |
601 | OMAP_SYS_TIMER(3_am33xx, gptimer); | ||
602 | #endif /* CONFIG_SOC_AM33XX */ | 585 | #endif /* CONFIG_SOC_AM33XX */ |
603 | 586 | ||
604 | #ifdef CONFIG_ARCH_OMAP4 | 587 | #ifdef CONFIG_ARCH_OMAP4 |
@@ -606,7 +589,7 @@ OMAP_SYS_32K_TIMER_INIT(4, 1, OMAP4_32K_SOURCE, "ti,timer-alwon", | |||
606 | 2, OMAP4_MPU_SOURCE); | 589 | 2, OMAP4_MPU_SOURCE); |
607 | #ifdef CONFIG_LOCAL_TIMERS | 590 | #ifdef CONFIG_LOCAL_TIMERS |
608 | static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, OMAP44XX_LOCAL_TWD_BASE, 29); | 591 | static DEFINE_TWD_LOCAL_TIMER(twd_local_timer, OMAP44XX_LOCAL_TWD_BASE, 29); |
609 | static void __init omap4_local_timer_init(void) | 592 | void __init omap4_local_timer_init(void) |
610 | { | 593 | { |
611 | omap4_sync32k_timer_init(); | 594 | omap4_sync32k_timer_init(); |
612 | /* Local timers are not supprted on OMAP4430 ES1.0 */ | 595 | /* Local timers are not supprted on OMAP4430 ES1.0 */ |
@@ -624,18 +607,17 @@ static void __init omap4_local_timer_init(void) | |||
624 | } | 607 | } |
625 | } | 608 | } |
626 | #else /* CONFIG_LOCAL_TIMERS */ | 609 | #else /* CONFIG_LOCAL_TIMERS */ |
627 | static void __init omap4_local_timer_init(void) | 610 | void __init omap4_local_timer_init(void) |
628 | { | 611 | { |
629 | omap4_sync32k_timer_init(); | 612 | omap4_sync32k_timer_init(); |
630 | } | 613 | } |
631 | #endif /* CONFIG_LOCAL_TIMERS */ | 614 | #endif /* CONFIG_LOCAL_TIMERS */ |
632 | OMAP_SYS_TIMER(4, local); | ||
633 | #endif /* CONFIG_ARCH_OMAP4 */ | 615 | #endif /* CONFIG_ARCH_OMAP4 */ |
634 | 616 | ||
635 | #ifdef CONFIG_SOC_OMAP5 | 617 | #ifdef CONFIG_SOC_OMAP5 |
636 | OMAP_SYS_32K_TIMER_INIT(5, 1, OMAP4_32K_SOURCE, "ti,timer-alwon", | 618 | OMAP_SYS_32K_TIMER_INIT(5, 1, OMAP4_32K_SOURCE, "ti,timer-alwon", |
637 | 2, OMAP4_MPU_SOURCE); | 619 | 2, OMAP4_MPU_SOURCE); |
638 | static void __init omap5_realtime_timer_init(void) | 620 | void __init omap5_realtime_timer_init(void) |
639 | { | 621 | { |
640 | int err; | 622 | int err; |
641 | 623 | ||
@@ -646,7 +628,6 @@ static void __init omap5_realtime_timer_init(void) | |||
646 | if (err) | 628 | if (err) |
647 | pr_err("%s: arch_timer_register failed %d\n", __func__, err); | 629 | pr_err("%s: arch_timer_register failed %d\n", __func__, err); |
648 | } | 630 | } |
649 | OMAP_SYS_TIMER(5, realtime); | ||
650 | #endif /* CONFIG_SOC_OMAP5 */ | 631 | #endif /* CONFIG_SOC_OMAP5 */ |
651 | 632 | ||
652 | /** | 633 | /** |
@@ -702,8 +683,7 @@ static int __init omap_timer_init(struct omap_hwmod *oh, void *unused) | |||
702 | pdata->timer_errata = omap_dm_timer_get_errata(); | 683 | pdata->timer_errata = omap_dm_timer_get_errata(); |
703 | pdata->get_context_loss_count = omap_pm_get_dev_context_loss_count; | 684 | pdata->get_context_loss_count = omap_pm_get_dev_context_loss_count; |
704 | 685 | ||
705 | pdev = omap_device_build(name, id, oh, pdata, sizeof(*pdata), | 686 | pdev = omap_device_build(name, id, oh, pdata, sizeof(*pdata)); |
706 | NULL, 0, 0); | ||
707 | 687 | ||
708 | if (IS_ERR(pdev)) { | 688 | if (IS_ERR(pdev)) { |
709 | pr_err("%s: Can't build omap_device for %s: %s.\n", | 689 | pr_err("%s: Can't build omap_device for %s: %s.\n", |
@@ -738,7 +718,7 @@ static int __init omap2_dm_timer_init(void) | |||
738 | 718 | ||
739 | return 0; | 719 | return 0; |
740 | } | 720 | } |
741 | arch_initcall(omap2_dm_timer_init); | 721 | omap_arch_initcall(omap2_dm_timer_init); |
742 | 722 | ||
743 | /** | 723 | /** |
744 | * omap2_override_clocksource - clocksource override with user configuration | 724 | * omap2_override_clocksource - clocksource override with user configuration |
diff --git a/arch/arm/mach-omap2/twl-common.c b/arch/arm/mach-omap2/twl-common.c index e49b40b4c90a..51e138cc5398 100644 --- a/arch/arm/mach-omap2/twl-common.c +++ b/arch/arm/mach-omap2/twl-common.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/i2c.h> | 23 | #include <linux/i2c.h> |
24 | #include <linux/i2c/twl.h> | 24 | #include <linux/i2c/twl.h> |
25 | #include <linux/gpio.h> | 25 | #include <linux/gpio.h> |
26 | #include <linux/string.h> | ||
26 | #include <linux/regulator/machine.h> | 27 | #include <linux/regulator/machine.h> |
27 | #include <linux/regulator/fixed.h> | 28 | #include <linux/regulator/fixed.h> |
28 | 29 | ||
@@ -56,7 +57,7 @@ void __init omap_pmic_init(int bus, u32 clkrate, | |||
56 | struct twl4030_platform_data *pmic_data) | 57 | struct twl4030_platform_data *pmic_data) |
57 | { | 58 | { |
58 | omap_mux_init_signal("sys_nirq", OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE); | 59 | omap_mux_init_signal("sys_nirq", OMAP_PIN_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE); |
59 | strncpy(pmic_i2c_board_info.type, pmic_type, | 60 | strlcpy(pmic_i2c_board_info.type, pmic_type, |
60 | sizeof(pmic_i2c_board_info.type)); | 61 | sizeof(pmic_i2c_board_info.type)); |
61 | pmic_i2c_board_info.irq = pmic_irq; | 62 | pmic_i2c_board_info.irq = pmic_irq; |
62 | pmic_i2c_board_info.platform_data = pmic_data; | 63 | pmic_i2c_board_info.platform_data = pmic_data; |
@@ -528,24 +529,29 @@ void __init omap4_pmic_get_config(struct twl4030_platform_data *pmic_data, | |||
528 | defined(CONFIG_SND_OMAP_SOC_OMAP_TWL4030_MODULE) | 529 | defined(CONFIG_SND_OMAP_SOC_OMAP_TWL4030_MODULE) |
529 | #include <linux/platform_data/omap-twl4030.h> | 530 | #include <linux/platform_data/omap-twl4030.h> |
530 | 531 | ||
532 | /* Commonly used configuration */ | ||
531 | static struct omap_tw4030_pdata omap_twl4030_audio_data; | 533 | static struct omap_tw4030_pdata omap_twl4030_audio_data; |
532 | 534 | ||
533 | static struct platform_device audio_device = { | 535 | static struct platform_device audio_device = { |
534 | .name = "omap-twl4030", | 536 | .name = "omap-twl4030", |
535 | .id = -1, | 537 | .id = -1, |
536 | .dev = { | ||
537 | .platform_data = &omap_twl4030_audio_data, | ||
538 | }, | ||
539 | }; | 538 | }; |
540 | 539 | ||
541 | void __init omap_twl4030_audio_init(char *card_name) | 540 | void omap_twl4030_audio_init(char *card_name, |
541 | struct omap_tw4030_pdata *pdata) | ||
542 | { | 542 | { |
543 | omap_twl4030_audio_data.card_name = card_name; | 543 | if (!pdata) |
544 | pdata = &omap_twl4030_audio_data; | ||
545 | |||
546 | pdata->card_name = card_name; | ||
547 | |||
548 | audio_device.dev.platform_data = pdata; | ||
544 | platform_device_register(&audio_device); | 549 | platform_device_register(&audio_device); |
545 | } | 550 | } |
546 | 551 | ||
547 | #else /* SOC_OMAP_TWL4030 */ | 552 | #else /* SOC_OMAP_TWL4030 */ |
548 | void __init omap_twl4030_audio_init(char *card_name) | 553 | void omap_twl4030_audio_init(char *card_name, |
554 | struct omap_tw4030_pdata *pdata) | ||
549 | { | 555 | { |
550 | return; | 556 | return; |
551 | } | 557 | } |
diff --git a/arch/arm/mach-omap2/twl-common.h b/arch/arm/mach-omap2/twl-common.h index dcfbad5ac471..24b65d081b69 100644 --- a/arch/arm/mach-omap2/twl-common.h +++ b/arch/arm/mach-omap2/twl-common.h | |||
@@ -32,6 +32,7 @@ | |||
32 | 32 | ||
33 | struct twl4030_platform_data; | 33 | struct twl4030_platform_data; |
34 | struct twl6040_platform_data; | 34 | struct twl6040_platform_data; |
35 | struct omap_tw4030_pdata; | ||
35 | struct i2c_board_info; | 36 | struct i2c_board_info; |
36 | 37 | ||
37 | void omap_pmic_init(int bus, u32 clkrate, const char *pmic_type, int pmic_irq, | 38 | void omap_pmic_init(int bus, u32 clkrate, const char *pmic_type, int pmic_irq, |
@@ -60,6 +61,6 @@ void omap3_pmic_get_config(struct twl4030_platform_data *pmic_data, | |||
60 | void omap4_pmic_get_config(struct twl4030_platform_data *pmic_data, | 61 | void omap4_pmic_get_config(struct twl4030_platform_data *pmic_data, |
61 | u32 pdata_flags, u32 regulators_flags); | 62 | u32 pdata_flags, u32 regulators_flags); |
62 | 63 | ||
63 | void omap_twl4030_audio_init(char *card_name); | 64 | void omap_twl4030_audio_init(char *card_name, struct omap_tw4030_pdata *pdata); |
64 | 65 | ||
65 | #endif /* __OMAP_PMIC_COMMON__ */ | 66 | #endif /* __OMAP_PMIC_COMMON__ */ |
diff --git a/arch/arm/mach-omap2/usb-host.c b/arch/arm/mach-omap2/usb-host.c index 2e44e8a22884..5706bdccf45e 100644 --- a/arch/arm/mach-omap2/usb-host.c +++ b/arch/arm/mach-omap2/usb-host.c | |||
@@ -37,19 +37,6 @@ | |||
37 | #define USBHS_UHH_HWMODNAME "usb_host_hs" | 37 | #define USBHS_UHH_HWMODNAME "usb_host_hs" |
38 | #define USBHS_TLL_HWMODNAME "usb_tll_hs" | 38 | #define USBHS_TLL_HWMODNAME "usb_tll_hs" |
39 | 39 | ||
40 | static struct usbhs_omap_platform_data usbhs_data; | ||
41 | static struct usbtll_omap_platform_data usbtll_data; | ||
42 | static struct ehci_hcd_omap_platform_data ehci_data; | ||
43 | static struct ohci_hcd_omap_platform_data ohci_data; | ||
44 | |||
45 | static struct omap_device_pm_latency omap_uhhtll_latency[] = { | ||
46 | { | ||
47 | .deactivate_func = omap_device_idle_hwmods, | ||
48 | .activate_func = omap_device_enable_hwmods, | ||
49 | .flags = OMAP_DEVICE_LATENCY_AUTO_ADJUST, | ||
50 | }, | ||
51 | }; | ||
52 | |||
53 | /* MUX settings for EHCI pins */ | 40 | /* MUX settings for EHCI pins */ |
54 | /* | 41 | /* |
55 | * setup_ehci_io_mux - initialize IO pad mux for USBHOST | 42 | * setup_ehci_io_mux - initialize IO pad mux for USBHOST |
@@ -485,32 +472,18 @@ void __init setup_4430ohci_io_mux(const enum usbhs_omap_port_mode *port_mode) | |||
485 | } | 472 | } |
486 | } | 473 | } |
487 | 474 | ||
488 | void __init usbhs_init(const struct usbhs_omap_board_data *pdata) | 475 | void __init usbhs_init(struct usbhs_omap_platform_data *pdata) |
489 | { | 476 | { |
490 | struct omap_hwmod *uhh_hwm, *tll_hwm; | 477 | struct omap_hwmod *uhh_hwm, *tll_hwm; |
491 | struct platform_device *pdev; | 478 | struct platform_device *pdev; |
492 | int bus_id = -1; | 479 | int bus_id = -1; |
493 | int i; | ||
494 | |||
495 | for (i = 0; i < OMAP3_HS_USB_PORTS; i++) { | ||
496 | usbhs_data.port_mode[i] = pdata->port_mode[i]; | ||
497 | usbtll_data.port_mode[i] = pdata->port_mode[i]; | ||
498 | ohci_data.port_mode[i] = pdata->port_mode[i]; | ||
499 | ehci_data.port_mode[i] = pdata->port_mode[i]; | ||
500 | ehci_data.reset_gpio_port[i] = pdata->reset_gpio_port[i]; | ||
501 | ehci_data.regulator[i] = pdata->regulator[i]; | ||
502 | } | ||
503 | ehci_data.phy_reset = pdata->phy_reset; | ||
504 | ohci_data.es2_compatibility = pdata->es2_compatibility; | ||
505 | usbhs_data.ehci_data = &ehci_data; | ||
506 | usbhs_data.ohci_data = &ohci_data; | ||
507 | 480 | ||
508 | if (cpu_is_omap34xx()) { | 481 | if (cpu_is_omap34xx()) { |
509 | setup_ehci_io_mux(pdata->port_mode); | 482 | setup_ehci_io_mux(pdata->port_mode); |
510 | setup_ohci_io_mux(pdata->port_mode); | 483 | setup_ohci_io_mux(pdata->port_mode); |
511 | 484 | ||
512 | if (omap_rev() <= OMAP3430_REV_ES2_1) | 485 | if (omap_rev() <= OMAP3430_REV_ES2_1) |
513 | usbhs_data.single_ulpi_bypass = true; | 486 | pdata->single_ulpi_bypass = true; |
514 | 487 | ||
515 | } else if (cpu_is_omap44xx()) { | 488 | } else if (cpu_is_omap44xx()) { |
516 | setup_4430ehci_io_mux(pdata->port_mode); | 489 | setup_4430ehci_io_mux(pdata->port_mode); |
@@ -530,9 +503,7 @@ void __init usbhs_init(const struct usbhs_omap_board_data *pdata) | |||
530 | } | 503 | } |
531 | 504 | ||
532 | pdev = omap_device_build(OMAP_USBTLL_DEVICE, bus_id, tll_hwm, | 505 | pdev = omap_device_build(OMAP_USBTLL_DEVICE, bus_id, tll_hwm, |
533 | &usbtll_data, sizeof(usbtll_data), | 506 | pdata, sizeof(*pdata)); |
534 | omap_uhhtll_latency, | ||
535 | ARRAY_SIZE(omap_uhhtll_latency), false); | ||
536 | if (IS_ERR(pdev)) { | 507 | if (IS_ERR(pdev)) { |
537 | pr_err("Could not build hwmod device %s\n", | 508 | pr_err("Could not build hwmod device %s\n", |
538 | USBHS_TLL_HWMODNAME); | 509 | USBHS_TLL_HWMODNAME); |
@@ -540,9 +511,7 @@ void __init usbhs_init(const struct usbhs_omap_board_data *pdata) | |||
540 | } | 511 | } |
541 | 512 | ||
542 | pdev = omap_device_build(OMAP_USBHS_DEVICE, bus_id, uhh_hwm, | 513 | pdev = omap_device_build(OMAP_USBHS_DEVICE, bus_id, uhh_hwm, |
543 | &usbhs_data, sizeof(usbhs_data), | 514 | pdata, sizeof(*pdata)); |
544 | omap_uhhtll_latency, | ||
545 | ARRAY_SIZE(omap_uhhtll_latency), false); | ||
546 | if (IS_ERR(pdev)) { | 515 | if (IS_ERR(pdev)) { |
547 | pr_err("Could not build hwmod devices %s\n", | 516 | pr_err("Could not build hwmod devices %s\n", |
548 | USBHS_UHH_HWMODNAME); | 517 | USBHS_UHH_HWMODNAME); |
@@ -552,7 +521,7 @@ void __init usbhs_init(const struct usbhs_omap_board_data *pdata) | |||
552 | 521 | ||
553 | #else | 522 | #else |
554 | 523 | ||
555 | void __init usbhs_init(const struct usbhs_omap_board_data *pdata) | 524 | void __init usbhs_init(struct usbhs_omap_platform_data *pdata) |
556 | { | 525 | { |
557 | } | 526 | } |
558 | 527 | ||
diff --git a/arch/arm/mach-omap2/usb-musb.c b/arch/arm/mach-omap2/usb-musb.c index 7b33b375fe77..3242a554ad6b 100644 --- a/arch/arm/mach-omap2/usb-musb.c +++ b/arch/arm/mach-omap2/usb-musb.c | |||
@@ -85,6 +85,9 @@ void __init usb_musb_init(struct omap_musb_board_data *musb_board_data) | |||
85 | musb_plat.mode = board_data->mode; | 85 | musb_plat.mode = board_data->mode; |
86 | musb_plat.extvbus = board_data->extvbus; | 86 | musb_plat.extvbus = board_data->extvbus; |
87 | 87 | ||
88 | if (cpu_is_omap44xx()) | ||
89 | musb_plat.has_mailbox = true; | ||
90 | |||
88 | if (soc_is_am35xx()) { | 91 | if (soc_is_am35xx()) { |
89 | oh_name = "am35x_otg_hs"; | 92 | oh_name = "am35x_otg_hs"; |
90 | name = "musb-am35x"; | 93 | name = "musb-am35x"; |
@@ -102,7 +105,7 @@ void __init usb_musb_init(struct omap_musb_board_data *musb_board_data) | |||
102 | return; | 105 | return; |
103 | 106 | ||
104 | pdev = omap_device_build(name, bus_id, oh, &musb_plat, | 107 | pdev = omap_device_build(name, bus_id, oh, &musb_plat, |
105 | sizeof(musb_plat), NULL, 0, false); | 108 | sizeof(musb_plat)); |
106 | if (IS_ERR(pdev)) { | 109 | if (IS_ERR(pdev)) { |
107 | pr_err("Could not build omap_device for %s %s\n", | 110 | pr_err("Could not build omap_device for %s %s\n", |
108 | name, oh_name); | 111 | name, oh_name); |
diff --git a/arch/arm/mach-omap2/usb.h b/arch/arm/mach-omap2/usb.h index 9b986ead7c45..3319f5cf47a3 100644 --- a/arch/arm/mach-omap2/usb.h +++ b/arch/arm/mach-omap2/usb.h | |||
@@ -53,26 +53,8 @@ | |||
53 | #define USBPHY_OTGSESSEND_EN (1 << 20) | 53 | #define USBPHY_OTGSESSEND_EN (1 << 20) |
54 | #define USBPHY_DATA_POLARITY (1 << 23) | 54 | #define USBPHY_DATA_POLARITY (1 << 23) |
55 | 55 | ||
56 | struct usbhs_omap_board_data { | ||
57 | enum usbhs_omap_port_mode port_mode[OMAP3_HS_USB_PORTS]; | ||
58 | |||
59 | /* have to be valid if phy_reset is true and portx is in phy mode */ | ||
60 | int reset_gpio_port[OMAP3_HS_USB_PORTS]; | ||
61 | |||
62 | /* Set this to true for ES2.x silicon */ | ||
63 | unsigned es2_compatibility:1; | ||
64 | |||
65 | unsigned phy_reset:1; | ||
66 | |||
67 | /* | ||
68 | * Regulators for USB PHYs. | ||
69 | * Each PHY can have a separate regulator. | ||
70 | */ | ||
71 | struct regulator *regulator[OMAP3_HS_USB_PORTS]; | ||
72 | }; | ||
73 | |||
74 | extern void usb_musb_init(struct omap_musb_board_data *board_data); | 56 | extern void usb_musb_init(struct omap_musb_board_data *board_data); |
75 | extern void usbhs_init(const struct usbhs_omap_board_data *pdata); | 57 | extern void usbhs_init(struct usbhs_omap_platform_data *pdata); |
76 | 58 | ||
77 | extern void am35x_musb_reset(void); | 59 | extern void am35x_musb_reset(void); |
78 | extern void am35x_musb_phy_power(u8 on); | 60 | extern void am35x_musb_phy_power(u8 on); |
diff --git a/arch/arm/mach-omap2/wd_timer.c b/arch/arm/mach-omap2/wd_timer.c index 7c2b4ed38f02..d15c7bbab8e2 100644 --- a/arch/arm/mach-omap2/wd_timer.c +++ b/arch/arm/mach-omap2/wd_timer.c | |||
@@ -124,10 +124,9 @@ static int __init omap_init_wdt(void) | |||
124 | pdata.read_reset_sources = prm_read_reset_sources; | 124 | pdata.read_reset_sources = prm_read_reset_sources; |
125 | 125 | ||
126 | pdev = omap_device_build(dev_name, id, oh, &pdata, | 126 | pdev = omap_device_build(dev_name, id, oh, &pdata, |
127 | sizeof(struct omap_wd_timer_platform_data), | 127 | sizeof(struct omap_wd_timer_platform_data)); |
128 | NULL, 0, 0); | ||
129 | WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s.\n", | 128 | WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s.\n", |
130 | dev_name, oh->name); | 129 | dev_name, oh->name); |
131 | return 0; | 130 | return 0; |
132 | } | 131 | } |
133 | subsys_initcall(omap_init_wdt); | 132 | omap_subsys_initcall(omap_init_wdt); |