aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-omap2
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-omap2')
-rw-r--r--arch/arm/mach-omap2/Kconfig117
-rw-r--r--arch/arm/mach-omap2/Makefile107
-rw-r--r--arch/arm/mach-omap2/board-2430sdp.c39
-rw-r--r--arch/arm/mach-omap2/board-3430sdp.c368
-rw-r--r--arch/arm/mach-omap2/board-3630sdp.c114
-rw-r--r--arch/arm/mach-omap2/board-4430sdp.c71
-rw-r--r--arch/arm/mach-omap2/board-am3517evm.c332
-rw-r--r--arch/arm/mach-omap2/board-apollon.c28
-rw-r--r--arch/arm/mach-omap2/board-cm-t35.c842
-rw-r--r--arch/arm/mach-omap2/board-devkit8000.c676
-rw-r--r--arch/arm/mach-omap2/board-generic.c12
-rw-r--r--arch/arm/mach-omap2/board-h4.c29
-rw-r--r--arch/arm/mach-omap2/board-igep0020.c549
-rw-r--r--arch/arm/mach-omap2/board-ldp.c42
-rw-r--r--arch/arm/mach-omap2/board-n8x0.c561
-rw-r--r--arch/arm/mach-omap2/board-omap3beagle.c76
-rw-r--r--arch/arm/mach-omap2/board-omap3evm.c501
-rw-r--r--arch/arm/mach-omap2/board-omap3pandora.c280
-rw-r--r--arch/arm/mach-omap2/board-omap3touchbook.c578
-rw-r--r--arch/arm/mach-omap2/board-overo.c77
-rw-r--r--arch/arm/mach-omap2/board-rx51-peripherals.c369
-rw-r--r--arch/arm/mach-omap2/board-rx51-sdram.c221
-rw-r--r--arch/arm/mach-omap2/board-rx51.c91
-rw-r--r--arch/arm/mach-omap2/board-sdp-flash.c272
-rw-r--r--arch/arm/mach-omap2/board-zoom-debugboard.c74
-rw-r--r--arch/arm/mach-omap2/board-zoom-peripherals.c285
-rw-r--r--arch/arm/mach-omap2/board-zoom2.c250
-rw-r--r--arch/arm/mach-omap2/board-zoom3.c83
-rw-r--r--arch/arm/mach-omap2/clkt2xxx_apll.c122
-rw-r--r--arch/arm/mach-omap2/clkt2xxx_dpllcore.c173
-rw-r--r--arch/arm/mach-omap2/clkt2xxx_osc.c62
-rw-r--r--arch/arm/mach-omap2/clkt2xxx_sys.c50
-rw-r--r--arch/arm/mach-omap2/clkt2xxx_virt_prcm_set.c255
-rw-r--r--arch/arm/mach-omap2/clkt34xx_dpll3m2.c121
-rw-r--r--arch/arm/mach-omap2/clkt_clksel.c409
-rw-r--r--arch/arm/mach-omap2/clkt_dpll.c386
-rw-r--r--arch/arm/mach-omap2/clock.c992
-rw-r--r--arch/arm/mach-omap2/clock.h102
-rw-r--r--arch/arm/mach-omap2/clock2420_data.c1911
-rw-r--r--arch/arm/mach-omap2/clock2430.c59
-rw-r--r--arch/arm/mach-omap2/clock2430_data.c (renamed from arch/arm/mach-omap2/clock24xx.h)1183
-rw-r--r--arch/arm/mach-omap2/clock24xx.c805
-rw-r--r--arch/arm/mach-omap2/clock2xxx.c73
-rw-r--r--arch/arm/mach-omap2/clock2xxx.h44
-rw-r--r--arch/arm/mach-omap2/clock34xx.c1145
-rw-r--r--arch/arm/mach-omap2/clock34xx.h2990
-rw-r--r--arch/arm/mach-omap2/clock3517.c124
-rw-r--r--arch/arm/mach-omap2/clock3517.h14
-rw-r--r--arch/arm/mach-omap2/clock36xx.c72
-rw-r--r--arch/arm/mach-omap2/clock36xx.h13
-rw-r--r--arch/arm/mach-omap2/clock3xxx.c104
-rw-r--r--arch/arm/mach-omap2/clock3xxx.h21
-rw-r--r--arch/arm/mach-omap2/clock3xxx_data.c3601
-rw-r--r--arch/arm/mach-omap2/clock44xx.h20
-rw-r--r--arch/arm/mach-omap2/clock44xx_data.c2718
-rw-r--r--arch/arm/mach-omap2/clock_common_data.c39
-rw-r--r--arch/arm/mach-omap2/clockdomain.c792
-rw-r--r--arch/arm/mach-omap2/clockdomains.h674
-rw-r--r--arch/arm/mach-omap2/clockdomains44xx.h250
-rw-r--r--arch/arm/mach-omap2/cm-regbits-34xx.h28
-rw-r--r--arch/arm/mach-omap2/cm-regbits-44xx.h1474
-rw-r--r--arch/arm/mach-omap2/cm.c7
-rw-r--r--arch/arm/mach-omap2/cm.h29
-rw-r--r--arch/arm/mach-omap2/cm44xx.h358
-rw-r--r--arch/arm/mach-omap2/control.c391
-rw-r--r--arch/arm/mach-omap2/cpuidle34xx.c472
-rw-r--r--arch/arm/mach-omap2/devices.c133
-rw-r--r--arch/arm/mach-omap2/dpll3xxx.c599
-rw-r--r--arch/arm/mach-omap2/emu.c69
-rw-r--r--arch/arm/mach-omap2/gpmc-nand.c142
-rw-r--r--arch/arm/mach-omap2/gpmc-onenand.c6
-rw-r--r--arch/arm/mach-omap2/gpmc-smc91x.c14
-rw-r--r--arch/arm/mach-omap2/gpmc.c113
-rw-r--r--arch/arm/mach-omap2/hsmmc.c266
-rw-r--r--arch/arm/mach-omap2/hsmmc.h (renamed from arch/arm/mach-omap2/mmc-twl4030.h)14
-rw-r--r--arch/arm/mach-omap2/i2c.c52
-rw-r--r--arch/arm/mach-omap2/id.c227
-rw-r--r--arch/arm/mach-omap2/include/mach/am35xx.h26
-rw-r--r--arch/arm/mach-omap2/include/mach/board-sdp.h21
-rw-r--r--arch/arm/mach-omap2/include/mach/board-zoom.h5
-rw-r--r--arch/arm/mach-omap2/include/mach/clkdev.h5
-rw-r--r--arch/arm/mach-omap2/include/mach/debug-macro.S131
-rw-r--r--arch/arm/mach-omap2/include/mach/entry-macro.S212
-rw-r--r--arch/arm/mach-omap2/include/mach/gpio.h5
-rw-r--r--arch/arm/mach-omap2/include/mach/hardware.h5
-rw-r--r--arch/arm/mach-omap2/include/mach/io.h5
-rw-r--r--arch/arm/mach-omap2/include/mach/irqs.h5
-rw-r--r--arch/arm/mach-omap2/include/mach/memory.h5
-rw-r--r--arch/arm/mach-omap2/include/mach/smp.h5
-rw-r--r--arch/arm/mach-omap2/include/mach/system.h5
-rw-r--r--arch/arm/mach-omap2/include/mach/timex.h5
-rw-r--r--arch/arm/mach-omap2/include/mach/uncompress.h5
-rw-r--r--arch/arm/mach-omap2/include/mach/vmalloc.h20
-rw-r--r--arch/arm/mach-omap2/io.c174
-rw-r--r--arch/arm/mach-omap2/iommu2.c3
-rw-r--r--arch/arm/mach-omap2/irq.c98
-rw-r--r--arch/arm/mach-omap2/mailbox.c197
-rw-r--r--arch/arm/mach-omap2/mcbsp.c33
-rw-r--r--arch/arm/mach-omap2/mmc-twl4030.c524
-rw-r--r--arch/arm/mach-omap2/mux.c1086
-rw-r--r--arch/arm/mach-omap2/mux.h187
-rw-r--r--arch/arm/mach-omap2/mux34xx.c2146
-rw-r--r--arch/arm/mach-omap2/mux34xx.h398
-rw-r--r--arch/arm/mach-omap2/omap-headsmp.S35
-rw-r--r--arch/arm/mach-omap2/omap-smp.c38
-rw-r--r--arch/arm/mach-omap2/omap3-iommu.c64
-rw-r--r--arch/arm/mach-omap2/omap44xx-smc.S32
-rw-r--r--arch/arm/mach-omap2/omap_hwmod.c493
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_2420_data.c (renamed from arch/arm/mach-omap2/omap_hwmod_2420.h)44
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_2430_data.c (renamed from arch/arm/mach-omap2/omap_hwmod_2430.h)44
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_34xx.h168
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_3xxx_data.c181
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_common_data.c68
-rw-r--r--arch/arm/mach-omap2/omap_hwmod_common_data.h24
-rw-r--r--arch/arm/mach-omap2/opp2420_data.c128
-rw-r--r--arch/arm/mach-omap2/opp2430_data.c133
-rw-r--r--arch/arm/mach-omap2/opp2xxx.h429
-rw-r--r--arch/arm/mach-omap2/pm-debug.c82
-rw-r--r--arch/arm/mach-omap2/pm.h44
-rw-r--r--arch/arm/mach-omap2/pm24xx.c70
-rw-r--r--arch/arm/mach-omap2/pm34xx.c506
-rw-r--r--arch/arm/mach-omap2/powerdomain.c792
-rw-r--r--arch/arm/mach-omap2/powerdomains.h136
-rw-r--r--arch/arm/mach-omap2/powerdomains24xx.h93
-rw-r--r--arch/arm/mach-omap2/powerdomains34xx.h170
-rw-r--r--arch/arm/mach-omap2/powerdomains44xx.h310
-rw-r--r--arch/arm/mach-omap2/prcm-common.h82
-rw-r--r--arch/arm/mach-omap2/prcm.c481
-rw-r--r--arch/arm/mach-omap2/prm-regbits-34xx.h2
-rw-r--r--arch/arm/mach-omap2/prm-regbits-44xx.h2205
-rw-r--r--arch/arm/mach-omap2/prm.h33
-rw-r--r--arch/arm/mach-omap2/prm44xx.h411
-rw-r--r--arch/arm/mach-omap2/sdram-hynix-h8mbx00u0mer-0em.h51
-rw-r--r--arch/arm/mach-omap2/sdram-micron-mt46h32m32lf-6.h2
-rw-r--r--arch/arm/mach-omap2/sdram-numonyx-m65kxxxxam.h51
-rw-r--r--arch/arm/mach-omap2/sdram-qimonda-hyb18m512160af-6.h2
-rw-r--r--arch/arm/mach-omap2/sdrc.c62
-rw-r--r--arch/arm/mach-omap2/sdrc.h30
-rw-r--r--arch/arm/mach-omap2/sdrc2xxx.c8
-rw-r--r--arch/arm/mach-omap2/serial.c218
-rw-r--r--arch/arm/mach-omap2/sleep24xx.S2
-rw-r--r--arch/arm/mach-omap2/sleep34xx.S280
-rw-r--r--arch/arm/mach-omap2/sram242x.S4
-rw-r--r--arch/arm/mach-omap2/sram243x.S4
-rw-r--r--arch/arm/mach-omap2/sram34xx.S19
-rw-r--r--arch/arm/mach-omap2/timer-gp.c12
-rw-r--r--arch/arm/mach-omap2/timer-mpu.c2
-rw-r--r--arch/arm/mach-omap2/usb-ehci.c238
-rw-r--r--arch/arm/mach-omap2/usb-musb.c86
-rw-r--r--arch/arm/mach-omap2/usb-tusb6010.c4
150 files changed, 34239 insertions, 10207 deletions
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
index aad194f61a33..2455dcc744a0 100644
--- a/arch/arm/mach-omap2/Kconfig
+++ b/arch/arm/mach-omap2/Kconfig
@@ -1,35 +1,39 @@
1comment "OMAP Core Type" 1comment "OMAP Core Type"
2 depends on ARCH_OMAP2 2 depends on ARCH_OMAP2
3 3
4config ARCH_OMAP24XX
5 bool "OMAP24xx Based System"
6 depends on ARCH_OMAP2
7
8config ARCH_OMAP2420 4config ARCH_OMAP2420
9 bool "OMAP2420 support" 5 bool "OMAP2420 support"
10 depends on ARCH_OMAP24XX 6 depends on ARCH_OMAP2
11 select OMAP_DM_TIMER 7 select OMAP_DM_TIMER
12 select ARCH_OMAP_OTG 8 select ARCH_OMAP_OTG
13 9
14config ARCH_OMAP2430 10config ARCH_OMAP2430
15 bool "OMAP2430 support" 11 bool "OMAP2430 support"
16 depends on ARCH_OMAP24XX 12 depends on ARCH_OMAP2
17
18config ARCH_OMAP34XX
19 bool "OMAP34xx Based System"
20 depends on ARCH_OMAP3
21 13
22config ARCH_OMAP3430 14config ARCH_OMAP3430
23 bool "OMAP3430 support" 15 bool "OMAP3430 support"
24 depends on ARCH_OMAP3 && ARCH_OMAP34XX 16 depends on ARCH_OMAP3
25 select ARCH_OMAP_OTG 17 select ARCH_OMAP_OTG
26 18
19config OMAP_PACKAGE_CBC
20 bool
21
22config OMAP_PACKAGE_CBB
23 bool
24
25config OMAP_PACKAGE_CUS
26 bool
27
28config OMAP_PACKAGE_CBP
29 bool
30
27comment "OMAP Board Type" 31comment "OMAP Board Type"
28 depends on ARCH_OMAP2 || ARCH_OMAP3 || ARCH_OMAP4 32 depends on ARCH_OMAP2PLUS
29 33
30config MACH_OMAP_GENERIC 34config MACH_OMAP_GENERIC
31 bool "Generic OMAP board" 35 bool "Generic OMAP board"
32 depends on ARCH_OMAP2 && ARCH_OMAP24XX 36 depends on ARCH_OMAP2
33 37
34config MACH_OMAP2_TUSB6010 38config MACH_OMAP2_TUSB6010
35 bool 39 bool
@@ -38,40 +42,62 @@ config MACH_OMAP2_TUSB6010
38 42
39config MACH_OMAP_H4 43config MACH_OMAP_H4
40 bool "OMAP 2420 H4 board" 44 bool "OMAP 2420 H4 board"
41 depends on ARCH_OMAP2 && ARCH_OMAP24XX 45 depends on ARCH_OMAP2
42 select OMAP_DEBUG_DEVICES 46 select OMAP_DEBUG_DEVICES
43 47
44config MACH_OMAP_APOLLON 48config MACH_OMAP_APOLLON
45 bool "OMAP 2420 Apollon board" 49 bool "OMAP 2420 Apollon board"
46 depends on ARCH_OMAP2 && ARCH_OMAP24XX 50 depends on ARCH_OMAP2
47 51
48config MACH_OMAP_2430SDP 52config MACH_OMAP_2430SDP
49 bool "OMAP 2430 SDP board" 53 bool "OMAP 2430 SDP board"
50 depends on ARCH_OMAP2 && ARCH_OMAP24XX 54 depends on ARCH_OMAP2
51 55
52config MACH_OMAP3_BEAGLE 56config MACH_OMAP3_BEAGLE
53 bool "OMAP3 BEAGLE board" 57 bool "OMAP3 BEAGLE board"
54 depends on ARCH_OMAP3 && ARCH_OMAP34XX 58 depends on ARCH_OMAP3
59 select OMAP_PACKAGE_CBB
60
61config MACH_DEVKIT8000
62 bool "DEVKIT8000 board"
63 depends on ARCH_OMAP3
64 select OMAP_PACKAGE_CUS
65 select OMAP_MUX
55 66
56config MACH_OMAP_LDP 67config MACH_OMAP_LDP
57 bool "OMAP3 LDP board" 68 bool "OMAP3 LDP board"
58 depends on ARCH_OMAP3 && ARCH_OMAP34XX 69 depends on ARCH_OMAP3
70 select OMAP_PACKAGE_CBB
59 71
60config MACH_OVERO 72config MACH_OVERO
61 bool "Gumstix Overo board" 73 bool "Gumstix Overo board"
62 depends on ARCH_OMAP3 && ARCH_OMAP34XX 74 depends on ARCH_OMAP3
75 select OMAP_PACKAGE_CBB
63 76
64config MACH_OMAP3EVM 77config MACH_OMAP3EVM
65 bool "OMAP 3530 EVM board" 78 bool "OMAP 3530 EVM board"
66 depends on ARCH_OMAP3 && ARCH_OMAP34XX 79 depends on ARCH_OMAP3
80 select OMAP_PACKAGE_CBB
81
82config MACH_OMAP3517EVM
83 bool "OMAP3517/ AM3517 EVM board"
84 depends on ARCH_OMAP3
85 select OMAP_PACKAGE_CBB
67 86
68config MACH_OMAP3_PANDORA 87config MACH_OMAP3_PANDORA
69 bool "OMAP3 Pandora" 88 bool "OMAP3 Pandora"
70 depends on ARCH_OMAP3 && ARCH_OMAP34XX 89 depends on ARCH_OMAP3
90 select OMAP_PACKAGE_CBB
91
92config MACH_OMAP3_TOUCHBOOK
93 bool "OMAP3 Touch Book"
94 depends on ARCH_OMAP3
95 select BACKLIGHT_CLASS_DEVICE
71 96
72config MACH_OMAP_3430SDP 97config MACH_OMAP_3430SDP
73 bool "OMAP 3430 SDP board" 98 bool "OMAP 3430 SDP board"
74 depends on ARCH_OMAP3 && ARCH_OMAP34XX 99 depends on ARCH_OMAP3
100 select OMAP_PACKAGE_CBB
75 101
76config MACH_NOKIA_N800 102config MACH_NOKIA_N800
77 bool 103 bool
@@ -91,12 +117,55 @@ config MACH_NOKIA_N8X0
91 117
92config MACH_NOKIA_RX51 118config MACH_NOKIA_RX51
93 bool "Nokia RX-51 board" 119 bool "Nokia RX-51 board"
94 depends on ARCH_OMAP3 && ARCH_OMAP34XX 120 depends on ARCH_OMAP3
121 select OMAP_PACKAGE_CBB
95 122
96config MACH_OMAP_ZOOM2 123config MACH_OMAP_ZOOM2
97 bool "OMAP3 Zoom2 board" 124 bool "OMAP3 Zoom2 board"
98 depends on ARCH_OMAP3 && ARCH_OMAP34XX 125 depends on ARCH_OMAP3
126 select OMAP_PACKAGE_CBB
127
128config MACH_OMAP_ZOOM3
129 bool "OMAP3630 Zoom3 board"
130 depends on ARCH_OMAP3
131 select OMAP_PACKAGE_CBP
132
133config MACH_CM_T35
134 bool "CompuLab CM-T35 module"
135 depends on ARCH_OMAP3
136 select OMAP_PACKAGE_CUS
137 select OMAP_MUX
138
139config MACH_IGEP0020
140 bool "IGEP v2 board"
141 depends on ARCH_OMAP3
142 select OMAP_PACKAGE_CBB
143
144config MACH_OMAP_3630SDP
145 bool "OMAP3630 SDP board"
146 depends on ARCH_OMAP3
147 select OMAP_PACKAGE_CBP
99 148
100config MACH_OMAP_4430SDP 149config MACH_OMAP_4430SDP
101 bool "OMAP 4430 SDP board" 150 bool "OMAP 4430 SDP board"
102 depends on ARCH_OMAP4 151 depends on ARCH_OMAP4
152
153config OMAP3_EMU
154 bool "OMAP3 debugging peripherals"
155 depends on ARCH_OMAP3
156 select OC_ETM
157 help
158 Say Y here to enable debugging hardware of omap3
159
160config OMAP3_SDRC_AC_TIMING
161 bool "Enable SDRC AC timing register changes"
162 depends on ARCH_OMAP3
163 default n
164 help
165 If you know that none of your system initiators will attempt to
166 access SDRAM during CORE DVFS, select Y here. This should boost
167 SDRAM performance at lower CORE OPPs. There are relatively few
168 users who will wish to say yes at this point - almost everyone will
169 wish to say no. Selecting yes without understanding what is
170 going on could result in system crashes;
171
diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index 8cb16777661a..4b9fc57770db 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -5,24 +5,39 @@
5# Common support 5# Common support
6obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer-gp.o 6obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer-gp.o
7 7
8omap-2-3-common = irq.o sdrc.o omap_hwmod.o 8omap-2-3-common = irq.o sdrc.o
9hwmod-common = omap_hwmod.o \
10 omap_hwmod_common_data.o
9prcm-common = prcm.o powerdomain.o 11prcm-common = prcm.o powerdomain.o
10clock-common = clock.o clockdomain.o 12clock-common = clock.o clock_common_data.o \
13 clockdomain.o clkt_dpll.o \
14 clkt_clksel.o
11 15
12obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(prcm-common) $(clock-common) 16obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(prcm-common) $(hwmod-common)
13obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(prcm-common) $(clock-common) 17obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(prcm-common) $(hwmod-common)
18obj-$(CONFIG_ARCH_OMAP4) += $(prcm-common)
14 19
15obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o 20obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o
16 21
17# SMP support ONLY available for OMAP4 22# SMP support ONLY available for OMAP4
18obj-$(CONFIG_SMP) += omap-smp.o omap-headsmp.o 23obj-$(CONFIG_SMP) += omap-smp.o omap-headsmp.o
19obj-$(CONFIG_LOCAL_TIMERS) += timer-mpu.o 24obj-$(CONFIG_LOCAL_TIMERS) += timer-mpu.o
25obj-$(CONFIG_ARCH_OMAP4) += omap44xx-smc.o
26
27AFLAGS_omap44xx-smc.o :=-Wa,-march=armv7-a
20 28
21# Functions loaded to SRAM 29# Functions loaded to SRAM
22obj-$(CONFIG_ARCH_OMAP2420) += sram242x.o 30obj-$(CONFIG_ARCH_OMAP2420) += sram242x.o
23obj-$(CONFIG_ARCH_OMAP2430) += sram243x.o 31obj-$(CONFIG_ARCH_OMAP2430) += sram243x.o
24obj-$(CONFIG_ARCH_OMAP3) += sram34xx.o 32obj-$(CONFIG_ARCH_OMAP3) += sram34xx.o
25 33
34AFLAGS_sram242x.o :=-Wa,-march=armv6
35AFLAGS_sram243x.o :=-Wa,-march=armv6
36AFLAGS_sram34xx.o :=-Wa,-march=armv7-a
37
38# Pin multiplexing
39obj-$(CONFIG_ARCH_OMAP3) += mux34xx.o
40
26# SMS/SDRC 41# SMS/SDRC
27obj-$(CONFIG_ARCH_OMAP2) += sdrc2xxx.o 42obj-$(CONFIG_ARCH_OMAP2) += sdrc2xxx.o
28# obj-$(CONFIG_ARCH_OMAP3) += sdrc3xxx.o 43# obj-$(CONFIG_ARCH_OMAP3) += sdrc3xxx.o
@@ -30,9 +45,13 @@ obj-$(CONFIG_ARCH_OMAP2) += sdrc2xxx.o
30# Power Management 45# Power Management
31ifeq ($(CONFIG_PM),y) 46ifeq ($(CONFIG_PM),y)
32obj-$(CONFIG_ARCH_OMAP2) += pm24xx.o 47obj-$(CONFIG_ARCH_OMAP2) += pm24xx.o
33obj-$(CONFIG_ARCH_OMAP24XX) += sleep24xx.o 48obj-$(CONFIG_ARCH_OMAP2) += sleep24xx.o
34obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o 49obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o cpuidle34xx.o
35obj-$(CONFIG_PM_DEBUG) += pm-debug.o 50obj-$(CONFIG_PM_DEBUG) += pm-debug.o
51
52AFLAGS_sleep24xx.o :=-Wa,-march=armv6
53AFLAGS_sleep34xx.o :=-Wa,-march=armv7-a
54
36endif 55endif
37 56
38# PRCM 57# PRCM
@@ -41,48 +60,100 @@ obj-$(CONFIG_ARCH_OMAP3) += cm.o
41obj-$(CONFIG_ARCH_OMAP4) += cm4xxx.o 60obj-$(CONFIG_ARCH_OMAP4) += cm4xxx.o
42 61
43# Clock framework 62# Clock framework
44obj-$(CONFIG_ARCH_OMAP2) += clock24xx.o 63obj-$(CONFIG_ARCH_OMAP2) += $(clock-common) clock2xxx.o \
45obj-$(CONFIG_ARCH_OMAP3) += clock34xx.o 64 clkt2xxx_sys.o \
65 clkt2xxx_dpllcore.o \
66 clkt2xxx_virt_prcm_set.o \
67 clkt2xxx_apll.o clkt2xxx_osc.o
68obj-$(CONFIG_ARCH_OMAP2420) += clock2420_data.o
69obj-$(CONFIG_ARCH_OMAP2430) += clock2430.o clock2430_data.o
70obj-$(CONFIG_ARCH_OMAP3) += $(clock-common) clock3xxx.o \
71 clock34xx.o clkt34xx_dpll3m2.o \
72 clock3517.o clock36xx.o \
73 dpll3xxx.o clock3xxx_data.o
74obj-$(CONFIG_ARCH_OMAP4) += $(clock-common) clock44xx_data.o \
75 dpll3xxx.o
76
77# OMAP2 clock rate set data (old "OPP" data)
78obj-$(CONFIG_ARCH_OMAP2420) += opp2420_data.o
79obj-$(CONFIG_ARCH_OMAP2430) += opp2430_data.o
80
81# hwmod data
82obj-$(CONFIG_ARCH_OMAP2420) += omap_hwmod_2420_data.o
83obj-$(CONFIG_ARCH_OMAP2430) += omap_hwmod_2430_data.o
84obj-$(CONFIG_ARCH_OMAP3) += omap_hwmod_3xxx_data.o
85
86# EMU peripherals
87obj-$(CONFIG_OMAP3_EMU) += emu.o
88
89obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox_mach.o
90mailbox_mach-objs := mailbox.o
46 91
47iommu-y += iommu2.o 92iommu-y += iommu2.o
48iommu-$(CONFIG_ARCH_OMAP3) += omap3-iommu.o 93iommu-$(CONFIG_ARCH_OMAP3) += omap3-iommu.o
49 94
50obj-$(CONFIG_OMAP_IOMMU) += $(iommu-y) 95obj-$(CONFIG_OMAP_IOMMU) += $(iommu-y)
51 96
97i2c-omap-$(CONFIG_I2C_OMAP) := i2c.o
98obj-y += $(i2c-omap-m) $(i2c-omap-y)
99
52# Specific board support 100# Specific board support
53obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o 101obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o
54obj-$(CONFIG_MACH_OMAP_H4) += board-h4.o 102obj-$(CONFIG_MACH_OMAP_H4) += board-h4.o
55obj-$(CONFIG_MACH_OMAP_2430SDP) += board-2430sdp.o \ 103obj-$(CONFIG_MACH_OMAP_2430SDP) += board-2430sdp.o \
56 mmc-twl4030.o 104 hsmmc.o
57obj-$(CONFIG_MACH_OMAP_APOLLON) += board-apollon.o 105obj-$(CONFIG_MACH_OMAP_APOLLON) += board-apollon.o
58obj-$(CONFIG_MACH_OMAP3_BEAGLE) += board-omap3beagle.o \ 106obj-$(CONFIG_MACH_OMAP3_BEAGLE) += board-omap3beagle.o \
59 mmc-twl4030.o 107 hsmmc.o
108obj-$(CONFIG_MACH_DEVKIT8000) += board-devkit8000.o \
109 hsmmc.o
60obj-$(CONFIG_MACH_OMAP_LDP) += board-ldp.o \ 110obj-$(CONFIG_MACH_OMAP_LDP) += board-ldp.o \
61 mmc-twl4030.o 111 hsmmc.o
62obj-$(CONFIG_MACH_OVERO) += board-overo.o \ 112obj-$(CONFIG_MACH_OVERO) += board-overo.o \
63 mmc-twl4030.o 113 hsmmc.o
64obj-$(CONFIG_MACH_OMAP3EVM) += board-omap3evm.o \ 114obj-$(CONFIG_MACH_OMAP3EVM) += board-omap3evm.o \
65 mmc-twl4030.o 115 hsmmc.o
66obj-$(CONFIG_MACH_OMAP3_PANDORA) += board-omap3pandora.o \ 116obj-$(CONFIG_MACH_OMAP3_PANDORA) += board-omap3pandora.o \
67 mmc-twl4030.o 117 hsmmc.o
68obj-$(CONFIG_MACH_OMAP_3430SDP) += board-3430sdp.o \ 118obj-$(CONFIG_MACH_OMAP_3430SDP) += board-3430sdp.o \
69 mmc-twl4030.o 119 hsmmc.o \
120 board-sdp-flash.o
70obj-$(CONFIG_MACH_NOKIA_N8X0) += board-n8x0.o 121obj-$(CONFIG_MACH_NOKIA_N8X0) += board-n8x0.o
71obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51.o \ 122obj-$(CONFIG_MACH_NOKIA_RX51) += board-rx51.o \
123 board-rx51-sdram.o \
72 board-rx51-peripherals.o \ 124 board-rx51-peripherals.o \
73 mmc-twl4030.o 125 hsmmc.o
74obj-$(CONFIG_MACH_OMAP_ZOOM2) += board-zoom2.o \ 126obj-$(CONFIG_MACH_OMAP_ZOOM2) += board-zoom2.o \
75 mmc-twl4030.o \ 127 board-zoom-peripherals.o \
128 hsmmc.o \
76 board-zoom-debugboard.o 129 board-zoom-debugboard.o
77 130obj-$(CONFIG_MACH_OMAP_ZOOM3) += board-zoom3.o \
131 board-zoom-peripherals.o \
132 hsmmc.o \
133 board-zoom-debugboard.o
134obj-$(CONFIG_MACH_OMAP_3630SDP) += board-3630sdp.o \
135 board-zoom-peripherals.o \
136 hsmmc.o
137obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o \
138 hsmmc.o
139obj-$(CONFIG_MACH_IGEP0020) += board-igep0020.o \
140 hsmmc.o
141obj-$(CONFIG_MACH_OMAP3_TOUCHBOOK) += board-omap3touchbook.o \
142 hsmmc.o
78obj-$(CONFIG_MACH_OMAP_4430SDP) += board-4430sdp.o 143obj-$(CONFIG_MACH_OMAP_4430SDP) += board-4430sdp.o
79 144
145obj-$(CONFIG_MACH_OMAP3517EVM) += board-am3517evm.o
146
80# Platform specific device init code 147# Platform specific device init code
81obj-y += usb-musb.o 148obj-y += usb-musb.o
82obj-$(CONFIG_MACH_OMAP2_TUSB6010) += usb-tusb6010.o 149obj-$(CONFIG_MACH_OMAP2_TUSB6010) += usb-tusb6010.o
150obj-y += usb-ehci.o
83 151
84onenand-$(CONFIG_MTD_ONENAND_OMAP2) := gpmc-onenand.o 152onenand-$(CONFIG_MTD_ONENAND_OMAP2) := gpmc-onenand.o
85obj-y += $(onenand-m) $(onenand-y) 153obj-y += $(onenand-m) $(onenand-y)
86 154
155nand-$(CONFIG_MTD_NAND_OMAP2) := gpmc-nand.o
156obj-y += $(nand-m) $(nand-y)
157
87smc91x-$(CONFIG_SMC91X) := gpmc-smc91x.o 158smc91x-$(CONFIG_SMC91X) := gpmc-smc91x.o
88obj-y += $(smc91x-m) $(smc91x-y) 159obj-y += $(smc91x-m) $(smc91x-y)
diff --git a/arch/arm/mach-omap2/board-2430sdp.c b/arch/arm/mach-omap2/board-2430sdp.c
index 42217b32f835..01d113ff9fcf 100644
--- a/arch/arm/mach-omap2/board-2430sdp.c
+++ b/arch/arm/mach-omap2/board-2430sdp.c
@@ -18,8 +18,9 @@
18#include <linux/platform_device.h> 18#include <linux/platform_device.h>
19#include <linux/mtd/mtd.h> 19#include <linux/mtd/mtd.h>
20#include <linux/mtd/partitions.h> 20#include <linux/mtd/partitions.h>
21#include <linux/mtd/physmap.h>
21#include <linux/delay.h> 22#include <linux/delay.h>
22#include <linux/i2c/twl4030.h> 23#include <linux/i2c/twl.h>
23#include <linux/err.h> 24#include <linux/err.h>
24#include <linux/clk.h> 25#include <linux/clk.h>
25#include <linux/io.h> 26#include <linux/io.h>
@@ -28,17 +29,16 @@
28#include <asm/mach-types.h> 29#include <asm/mach-types.h>
29#include <asm/mach/arch.h> 30#include <asm/mach/arch.h>
30#include <asm/mach/map.h> 31#include <asm/mach/map.h>
31#include <asm/mach/flash.h>
32 32
33#include <mach/gpio.h> 33#include <mach/gpio.h>
34#include <mach/mux.h> 34#include <plat/mux.h>
35#include <mach/board.h> 35#include <plat/board.h>
36#include <mach/common.h> 36#include <plat/common.h>
37#include <mach/gpmc.h> 37#include <plat/gpmc.h>
38#include <mach/usb.h> 38#include <plat/usb.h>
39#include <mach/gpmc-smc91x.h> 39#include <plat/gpmc-smc91x.h>
40 40
41#include "mmc-twl4030.h" 41#include "hsmmc.h"
42 42
43#define SDP2430_CS0_BASE 0x04000000 43#define SDP2430_CS0_BASE 0x04000000
44#define SECONDARY_LCD_GPIO 147 44#define SECONDARY_LCD_GPIO 147
@@ -74,8 +74,7 @@ static struct mtd_partition sdp2430_partitions[] = {
74 } 74 }
75}; 75};
76 76
77static struct flash_platform_data sdp2430_flash_data = { 77static struct physmap_flash_data sdp2430_flash_data = {
78 .map_name = "cfi_probe",
79 .width = 2, 78 .width = 2,
80 .parts = sdp2430_partitions, 79 .parts = sdp2430_partitions,
81 .nr_parts = ARRAY_SIZE(sdp2430_partitions), 80 .nr_parts = ARRAY_SIZE(sdp2430_partitions),
@@ -88,7 +87,7 @@ static struct resource sdp2430_flash_resource = {
88}; 87};
89 88
90static struct platform_device sdp2430_flash_device = { 89static struct platform_device sdp2430_flash_device = {
91 .name = "omapflash", 90 .name = "physmap-flash",
92 .id = 0, 91 .id = 0,
93 .dev = { 92 .dev = {
94 .platform_data = &sdp2430_flash_data, 93 .platform_data = &sdp2430_flash_data,
@@ -183,7 +182,7 @@ static int __init omap2430_i2c_init(void)
183 return 0; 182 return 0;
184} 183}
185 184
186static struct twl4030_hsmmc_info mmc[] __initdata = { 185static struct omap2_hsmmc_info mmc[] __initdata = {
187 { 186 {
188 .mmc = 1, 187 .mmc = 1,
189 .wires = 4, 188 .wires = 4,
@@ -194,6 +193,12 @@ static struct twl4030_hsmmc_info mmc[] __initdata = {
194 {} /* Terminator */ 193 {} /* Terminator */
195}; 194};
196 195
196static struct omap_musb_board_data musb_board_data = {
197 .interface_type = MUSB_INTERFACE_ULPI,
198 .mode = MUSB_OTG,
199 .power = 100,
200};
201
197static void __init omap_2430sdp_init(void) 202static void __init omap_2430sdp_init(void)
198{ 203{
199 int ret; 204 int ret;
@@ -202,8 +207,8 @@ static void __init omap_2430sdp_init(void)
202 207
203 platform_add_devices(sdp2430_devices, ARRAY_SIZE(sdp2430_devices)); 208 platform_add_devices(sdp2430_devices, ARRAY_SIZE(sdp2430_devices));
204 omap_serial_init(); 209 omap_serial_init();
205 twl4030_mmc_init(mmc); 210 omap2_hsmmc_init(mmc);
206 usb_musb_init(); 211 usb_musb_init(&musb_board_data);
207 board_smc91x_init(); 212 board_smc91x_init();
208 213
209 /* Turn off secondary LCD backlight */ 214 /* Turn off secondary LCD backlight */
@@ -215,13 +220,13 @@ static void __init omap_2430sdp_init(void)
215static void __init omap_2430sdp_map_io(void) 220static void __init omap_2430sdp_map_io(void)
216{ 221{
217 omap2_set_globals_243x(); 222 omap2_set_globals_243x();
218 omap2_map_common_io(); 223 omap243x_map_common_io();
219} 224}
220 225
221MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board") 226MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board")
222 /* Maintainer: Syed Khasim - Texas Instruments Inc */ 227 /* Maintainer: Syed Khasim - Texas Instruments Inc */
223 .phys_io = 0x48000000, 228 .phys_io = 0x48000000,
224 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, 229 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
225 .boot_params = 0x80000100, 230 .boot_params = 0x80000100,
226 .map_io = omap_2430sdp_map_io, 231 .map_io = omap_2430sdp_map_io,
227 .init_irq = omap_2430sdp_init_irq, 232 .init_irq = omap_2430sdp_init_irq,
diff --git a/arch/arm/mach-omap2/board-3430sdp.c b/arch/arm/mach-omap2/board-3430sdp.c
index 0acb5560229c..5822bcf7b15f 100644
--- a/arch/arm/mach-omap2/board-3430sdp.c
+++ b/arch/arm/mach-omap2/board-3430sdp.c
@@ -20,7 +20,7 @@
20#include <linux/input/matrix_keypad.h> 20#include <linux/input/matrix_keypad.h>
21#include <linux/spi/spi.h> 21#include <linux/spi/spi.h>
22#include <linux/spi/ads7846.h> 22#include <linux/spi/ads7846.h>
23#include <linux/i2c/twl4030.h> 23#include <linux/i2c/twl.h>
24#include <linux/regulator/machine.h> 24#include <linux/regulator/machine.h>
25#include <linux/io.h> 25#include <linux/io.h>
26#include <linux/gpio.h> 26#include <linux/gpio.h>
@@ -30,19 +30,23 @@
30#include <asm/mach/arch.h> 30#include <asm/mach/arch.h>
31#include <asm/mach/map.h> 31#include <asm/mach/map.h>
32 32
33#include <mach/mcspi.h> 33#include <plat/mcspi.h>
34#include <mach/mux.h> 34#include <plat/board.h>
35#include <mach/board.h> 35#include <plat/usb.h>
36#include <mach/usb.h> 36#include <plat/common.h>
37#include <mach/common.h> 37#include <plat/dma.h>
38#include <mach/dma.h> 38#include <plat/gpmc.h>
39#include <mach/gpmc.h> 39#include <plat/display.h>
40 40
41#include <mach/control.h> 41#include <plat/control.h>
42#include <mach/gpmc-smc91x.h> 42#include <plat/gpmc-smc91x.h>
43 43
44#include <mach/board-sdp.h>
45
46#include "mux.h"
44#include "sdram-qimonda-hyb18m512160af-6.h" 47#include "sdram-qimonda-hyb18m512160af-6.h"
45#include "mmc-twl4030.h" 48#include "hsmmc.h"
49#include "pm.h"
46 50
47#define CONFIG_DISABLE_HFCLK 1 51#define CONFIG_DISABLE_HFCLK 1
48 52
@@ -54,6 +58,24 @@
54 58
55#define TWL4030_MSECURE_GPIO 22 59#define TWL4030_MSECURE_GPIO 22
56 60
61/* FIXME: These values need to be updated based on more profiling on 3430sdp*/
62static struct cpuidle_params omap3_cpuidle_params_table[] = {
63 /* C1 */
64 {1, 2, 2, 5},
65 /* C2 */
66 {1, 10, 10, 30},
67 /* C3 */
68 {1, 50, 50, 300},
69 /* C4 */
70 {1, 1500, 1800, 4000},
71 /* C5 */
72 {1, 2500, 7500, 12000},
73 /* C6 */
74 {1, 3000, 8500, 15000},
75 /* C7 */
76 {1, 10000, 30000, 300000},
77};
78
57static int board_keymap[] = { 79static int board_keymap[] = {
58 KEY(0, 0, KEY_LEFT), 80 KEY(0, 0, KEY_LEFT),
59 KEY(0, 1, KEY_RIGHT), 81 KEY(0, 1, KEY_RIGHT),
@@ -152,37 +174,159 @@ static struct spi_board_info sdp3430_spi_board_info[] __initdata = {
152 }, 174 },
153}; 175};
154 176
155static struct platform_device sdp3430_lcd_device = { 177
156 .name = "sdp2430_lcd", 178#define SDP3430_LCD_PANEL_BACKLIGHT_GPIO 8
157 .id = -1, 179#define SDP3430_LCD_PANEL_ENABLE_GPIO 5
180
181static unsigned backlight_gpio;
182static unsigned enable_gpio;
183static int lcd_enabled;
184static int dvi_enabled;
185
186static void __init sdp3430_display_init(void)
187{
188 int r;
189
190 enable_gpio = SDP3430_LCD_PANEL_ENABLE_GPIO;
191 backlight_gpio = SDP3430_LCD_PANEL_BACKLIGHT_GPIO;
192
193 r = gpio_request(enable_gpio, "LCD reset");
194 if (r) {
195 printk(KERN_ERR "failed to get LCD reset GPIO\n");
196 goto err0;
197 }
198
199 r = gpio_request(backlight_gpio, "LCD Backlight");
200 if (r) {
201 printk(KERN_ERR "failed to get LCD backlight GPIO\n");
202 goto err1;
203 }
204
205 gpio_direction_output(enable_gpio, 0);
206 gpio_direction_output(backlight_gpio, 0);
207
208 return;
209err1:
210 gpio_free(enable_gpio);
211err0:
212 return;
213}
214
215static int sdp3430_panel_enable_lcd(struct omap_dss_device *dssdev)
216{
217 if (dvi_enabled) {
218 printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
219 return -EINVAL;
220 }
221
222 gpio_direction_output(enable_gpio, 1);
223 gpio_direction_output(backlight_gpio, 1);
224
225 lcd_enabled = 1;
226
227 return 0;
228}
229
230static void sdp3430_panel_disable_lcd(struct omap_dss_device *dssdev)
231{
232 lcd_enabled = 0;
233
234 gpio_direction_output(enable_gpio, 0);
235 gpio_direction_output(backlight_gpio, 0);
236}
237
238static int sdp3430_panel_enable_dvi(struct omap_dss_device *dssdev)
239{
240 if (lcd_enabled) {
241 printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
242 return -EINVAL;
243 }
244
245 dvi_enabled = 1;
246
247 return 0;
248}
249
250static void sdp3430_panel_disable_dvi(struct omap_dss_device *dssdev)
251{
252 dvi_enabled = 0;
253}
254
255static int sdp3430_panel_enable_tv(struct omap_dss_device *dssdev)
256{
257 return 0;
258}
259
260static void sdp3430_panel_disable_tv(struct omap_dss_device *dssdev)
261{
262}
263
264
265static struct omap_dss_device sdp3430_lcd_device = {
266 .name = "lcd",
267 .driver_name = "sharp_ls_panel",
268 .type = OMAP_DISPLAY_TYPE_DPI,
269 .phy.dpi.data_lines = 16,
270 .platform_enable = sdp3430_panel_enable_lcd,
271 .platform_disable = sdp3430_panel_disable_lcd,
158}; 272};
159 273
160static struct regulator_consumer_supply sdp3430_vdac_supply = { 274static struct omap_dss_device sdp3430_dvi_device = {
161 .supply = "vdac", 275 .name = "dvi",
162 .dev = &sdp3430_lcd_device.dev, 276 .driver_name = "generic_panel",
277 .type = OMAP_DISPLAY_TYPE_DPI,
278 .phy.dpi.data_lines = 24,
279 .platform_enable = sdp3430_panel_enable_dvi,
280 .platform_disable = sdp3430_panel_disable_dvi,
163}; 281};
164 282
165static struct regulator_consumer_supply sdp3430_vdvi_supply = { 283static struct omap_dss_device sdp3430_tv_device = {
166 .supply = "vdvi", 284 .name = "tv",
167 .dev = &sdp3430_lcd_device.dev, 285 .driver_name = "venc",
286 .type = OMAP_DISPLAY_TYPE_VENC,
287 .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
288 .platform_enable = sdp3430_panel_enable_tv,
289 .platform_disable = sdp3430_panel_disable_tv,
168}; 290};
169 291
170static struct platform_device *sdp3430_devices[] __initdata = { 292
293static struct omap_dss_device *sdp3430_dss_devices[] = {
171 &sdp3430_lcd_device, 294 &sdp3430_lcd_device,
295 &sdp3430_dvi_device,
296 &sdp3430_tv_device,
297};
298
299static struct omap_dss_board_info sdp3430_dss_data = {
300 .num_devices = ARRAY_SIZE(sdp3430_dss_devices),
301 .devices = sdp3430_dss_devices,
302 .default_device = &sdp3430_lcd_device,
172}; 303};
173 304
174static struct omap_lcd_config sdp3430_lcd_config __initdata = { 305static struct platform_device sdp3430_dss_device = {
175 .ctrl_name = "internal", 306 .name = "omapdss",
307 .id = -1,
308 .dev = {
309 .platform_data = &sdp3430_dss_data,
310 },
311};
312
313static struct regulator_consumer_supply sdp3430_vdda_dac_supply = {
314 .supply = "vdda_dac",
315 .dev = &sdp3430_dss_device.dev,
316};
317
318static struct platform_device *sdp3430_devices[] __initdata = {
319 &sdp3430_dss_device,
176}; 320};
177 321
178static struct omap_board_config_kernel sdp3430_config[] __initdata = { 322static struct omap_board_config_kernel sdp3430_config[] __initdata = {
179 { OMAP_TAG_LCD, &sdp3430_lcd_config },
180}; 323};
181 324
182static void __init omap_3430sdp_init_irq(void) 325static void __init omap_3430sdp_init_irq(void)
183{ 326{
184 omap_board_config = sdp3430_config; 327 omap_board_config = sdp3430_config;
185 omap_board_config_size = ARRAY_SIZE(sdp3430_config); 328 omap_board_config_size = ARRAY_SIZE(sdp3430_config);
329 omap3_pm_init_cpuidle(omap3_cpuidle_params_table);
186 omap2_init_common_hw(hyb18m512160af6_sdrc_params, NULL); 330 omap2_init_common_hw(hyb18m512160af6_sdrc_params, NULL);
187 omap_init_irq(); 331 omap_init_irq();
188 omap_gpio_init(); 332 omap_gpio_init();
@@ -204,7 +348,7 @@ static struct twl4030_bci_platform_data sdp3430_bci_data = {
204 .tblsize = ARRAY_SIZE(sdp3430_batt_table), 348 .tblsize = ARRAY_SIZE(sdp3430_batt_table),
205}; 349};
206 350
207static struct twl4030_hsmmc_info mmc[] = { 351static struct omap2_hsmmc_info mmc[] = {
208 { 352 {
209 .mmc = 1, 353 .mmc = 1,
210 /* 8 bits (default) requires S6.3 == ON, 354 /* 8 bits (default) requires S6.3 == ON,
@@ -241,7 +385,7 @@ static int sdp3430_twl_gpio_setup(struct device *dev,
241 */ 385 */
242 mmc[0].gpio_cd = gpio + 0; 386 mmc[0].gpio_cd = gpio + 0;
243 mmc[1].gpio_cd = gpio + 1; 387 mmc[1].gpio_cd = gpio + 1;
244 twl4030_mmc_init(mmc); 388 omap2_hsmmc_init(mmc);
245 389
246 /* link regulators to MMC adapters ... we "know" the 390 /* link regulators to MMC adapters ... we "know" the
247 * regulators will be set up only *after* we return. 391 * regulators will be set up only *after* we return.
@@ -392,22 +536,39 @@ static struct regulator_init_data sdp3430_vdac = {
392 | REGULATOR_CHANGE_STATUS, 536 | REGULATOR_CHANGE_STATUS,
393 }, 537 },
394 .num_consumer_supplies = 1, 538 .num_consumer_supplies = 1,
395 .consumer_supplies = &sdp3430_vdac_supply, 539 .consumer_supplies = &sdp3430_vdda_dac_supply,
396}; 540};
397 541
398/* VPLL2 for digital video outputs */ 542/* VPLL2 for digital video outputs */
543static struct regulator_consumer_supply sdp3430_vpll2_supplies[] = {
544 {
545 .supply = "vdds_dsi",
546 .dev = &sdp3430_dss_device.dev,
547 }
548};
549
399static struct regulator_init_data sdp3430_vpll2 = { 550static struct regulator_init_data sdp3430_vpll2 = {
400 .constraints = { 551 .constraints = {
401 .name = "VDVI", 552 .name = "VDVI",
402 .min_uV = 1800000, 553 .min_uV = 1800000,
403 .max_uV = 1800000, 554 .max_uV = 1800000,
555 .apply_uV = true,
404 .valid_modes_mask = REGULATOR_MODE_NORMAL 556 .valid_modes_mask = REGULATOR_MODE_NORMAL
405 | REGULATOR_MODE_STANDBY, 557 | REGULATOR_MODE_STANDBY,
406 .valid_ops_mask = REGULATOR_CHANGE_MODE 558 .valid_ops_mask = REGULATOR_CHANGE_MODE
407 | REGULATOR_CHANGE_STATUS, 559 | REGULATOR_CHANGE_STATUS,
408 }, 560 },
409 .num_consumer_supplies = 1, 561 .num_consumer_supplies = ARRAY_SIZE(sdp3430_vpll2_supplies),
410 .consumer_supplies = &sdp3430_vdvi_supply, 562 .consumer_supplies = sdp3430_vpll2_supplies,
563};
564
565static struct twl4030_codec_audio_data sdp3430_audio = {
566 .audio_mclk = 26000000,
567};
568
569static struct twl4030_codec_data sdp3430_codec = {
570 .audio_mclk = 26000000,
571 .audio = &sdp3430_audio,
411}; 572};
412 573
413static struct twl4030_platform_data sdp3430_twldata = { 574static struct twl4030_platform_data sdp3430_twldata = {
@@ -420,6 +581,7 @@ static struct twl4030_platform_data sdp3430_twldata = {
420 .madc = &sdp3430_madc_data, 581 .madc = &sdp3430_madc_data,
421 .keypad = &sdp3430_kp_data, 582 .keypad = &sdp3430_kp_data,
422 .usb = &sdp3430_usb_data, 583 .usb = &sdp3430_usb_data,
584 .codec = &sdp3430_codec,
423 585
424 .vaux1 = &sdp3430_vaux1, 586 .vaux1 = &sdp3430_vaux1,
425 .vaux2 = &sdp3430_vaux2, 587 .vaux2 = &sdp3430_vaux2,
@@ -481,11 +643,148 @@ static inline void board_smc91x_init(void)
481 643
482static void enable_board_wakeup_source(void) 644static void enable_board_wakeup_source(void)
483{ 645{
484 omap_cfg_reg(AF26_34XX_SYS_NIRQ); /* T2 interrupt line (keypad) */ 646 /* T2 interrupt line (keypad) */
647 omap_mux_init_signal("sys_nirq",
648 OMAP_WAKEUP_EN | OMAP_PIN_INPUT_PULLUP);
485} 649}
486 650
651static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
652
653 .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
654 .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
655 .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
656
657 .phy_reset = true,
658 .reset_gpio_port[0] = 57,
659 .reset_gpio_port[1] = 61,
660 .reset_gpio_port[2] = -EINVAL
661};
662
663#ifdef CONFIG_OMAP_MUX
664static struct omap_board_mux board_mux[] __initdata = {
665 { .reg_offset = OMAP_MUX_TERMINATOR },
666};
667#else
668#define board_mux NULL
669#endif
670
671static struct mtd_partition sdp_nor_partitions[] = {
672 /* bootloader (U-Boot, etc) in first sector */
673 {
674 .name = "Bootloader-NOR",
675 .offset = 0,
676 .size = SZ_256K,
677 .mask_flags = MTD_WRITEABLE, /* force read-only */
678 },
679 /* bootloader params in the next sector */
680 {
681 .name = "Params-NOR",
682 .offset = MTDPART_OFS_APPEND,
683 .size = SZ_256K,
684 .mask_flags = 0,
685 },
686 /* kernel */
687 {
688 .name = "Kernel-NOR",
689 .offset = MTDPART_OFS_APPEND,
690 .size = SZ_2M,
691 .mask_flags = 0
692 },
693 /* file system */
694 {
695 .name = "Filesystem-NOR",
696 .offset = MTDPART_OFS_APPEND,
697 .size = MTDPART_SIZ_FULL,
698 .mask_flags = 0
699 }
700};
701
702static struct mtd_partition sdp_onenand_partitions[] = {
703 {
704 .name = "X-Loader-OneNAND",
705 .offset = 0,
706 .size = 4 * (64 * 2048),
707 .mask_flags = MTD_WRITEABLE /* force read-only */
708 },
709 {
710 .name = "U-Boot-OneNAND",
711 .offset = MTDPART_OFS_APPEND,
712 .size = 2 * (64 * 2048),
713 .mask_flags = MTD_WRITEABLE /* force read-only */
714 },
715 {
716 .name = "U-Boot Environment-OneNAND",
717 .offset = MTDPART_OFS_APPEND,
718 .size = 1 * (64 * 2048),
719 },
720 {
721 .name = "Kernel-OneNAND",
722 .offset = MTDPART_OFS_APPEND,
723 .size = 16 * (64 * 2048),
724 },
725 {
726 .name = "File System-OneNAND",
727 .offset = MTDPART_OFS_APPEND,
728 .size = MTDPART_SIZ_FULL,
729 },
730};
731
732static struct mtd_partition sdp_nand_partitions[] = {
733 /* All the partition sizes are listed in terms of NAND block size */
734 {
735 .name = "X-Loader-NAND",
736 .offset = 0,
737 .size = 4 * (64 * 2048),
738 .mask_flags = MTD_WRITEABLE, /* force read-only */
739 },
740 {
741 .name = "U-Boot-NAND",
742 .offset = MTDPART_OFS_APPEND, /* Offset = 0x80000 */
743 .size = 10 * (64 * 2048),
744 .mask_flags = MTD_WRITEABLE, /* force read-only */
745 },
746 {
747 .name = "Boot Env-NAND",
748
749 .offset = MTDPART_OFS_APPEND, /* Offset = 0x1c0000 */
750 .size = 6 * (64 * 2048),
751 },
752 {
753 .name = "Kernel-NAND",
754 .offset = MTDPART_OFS_APPEND, /* Offset = 0x280000 */
755 .size = 40 * (64 * 2048),
756 },
757 {
758 .name = "File System - NAND",
759 .size = MTDPART_SIZ_FULL,
760 .offset = MTDPART_OFS_APPEND, /* Offset = 0x780000 */
761 },
762};
763
764static struct flash_partitions sdp_flash_partitions[] = {
765 {
766 .parts = sdp_nor_partitions,
767 .nr_parts = ARRAY_SIZE(sdp_nor_partitions),
768 },
769 {
770 .parts = sdp_onenand_partitions,
771 .nr_parts = ARRAY_SIZE(sdp_onenand_partitions),
772 },
773 {
774 .parts = sdp_nand_partitions,
775 .nr_parts = ARRAY_SIZE(sdp_nand_partitions),
776 },
777};
778
779static struct omap_musb_board_data musb_board_data = {
780 .interface_type = MUSB_INTERFACE_ULPI,
781 .mode = MUSB_OTG,
782 .power = 100,
783};
784
487static void __init omap_3430sdp_init(void) 785static void __init omap_3430sdp_init(void)
488{ 786{
787 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
489 omap3430_i2c_init(); 788 omap3430_i2c_init();
490 platform_add_devices(sdp3430_devices, ARRAY_SIZE(sdp3430_devices)); 789 platform_add_devices(sdp3430_devices, ARRAY_SIZE(sdp3430_devices));
491 if (omap_rev() > OMAP3430_REV_ES1_0) 790 if (omap_rev() > OMAP3430_REV_ES1_0)
@@ -497,21 +796,24 @@ static void __init omap_3430sdp_init(void)
497 ARRAY_SIZE(sdp3430_spi_board_info)); 796 ARRAY_SIZE(sdp3430_spi_board_info));
498 ads7846_dev_init(); 797 ads7846_dev_init();
499 omap_serial_init(); 798 omap_serial_init();
500 usb_musb_init(); 799 usb_musb_init(&musb_board_data);
501 board_smc91x_init(); 800 board_smc91x_init();
801 sdp_flash_init(sdp_flash_partitions);
802 sdp3430_display_init();
502 enable_board_wakeup_source(); 803 enable_board_wakeup_source();
804 usb_ehci_init(&ehci_pdata);
503} 805}
504 806
505static void __init omap_3430sdp_map_io(void) 807static void __init omap_3430sdp_map_io(void)
506{ 808{
507 omap2_set_globals_343x(); 809 omap2_set_globals_343x();
508 omap2_map_common_io(); 810 omap34xx_map_common_io();
509} 811}
510 812
511MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board") 813MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board")
512 /* Maintainer: Syed Khasim - Texas Instruments Inc */ 814 /* Maintainer: Syed Khasim - Texas Instruments Inc */
513 .phys_io = 0x48000000, 815 .phys_io = 0x48000000,
514 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, 816 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
515 .boot_params = 0x80000100, 817 .boot_params = 0x80000100,
516 .map_io = omap_3430sdp_map_io, 818 .map_io = omap_3430sdp_map_io,
517 .init_irq = omap_3430sdp_init_irq, 819 .init_irq = omap_3430sdp_init_irq,
diff --git a/arch/arm/mach-omap2/board-3630sdp.c b/arch/arm/mach-omap2/board-3630sdp.c
new file mode 100644
index 000000000000..504d2bd222fe
--- /dev/null
+++ b/arch/arm/mach-omap2/board-3630sdp.c
@@ -0,0 +1,114 @@
1/*
2 * Copyright (C) 2009 Texas Instruments Inc.
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
9#include <linux/kernel.h>
10#include <linux/init.h>
11#include <linux/platform_device.h>
12#include <linux/input.h>
13#include <linux/gpio.h>
14
15#include <asm/mach-types.h>
16#include <asm/mach/arch.h>
17
18#include <plat/common.h>
19#include <plat/board.h>
20#include <plat/gpmc-smc91x.h>
21#include <plat/mux.h>
22#include <plat/usb.h>
23
24#include <mach/board-zoom.h>
25
26#include "mux.h"
27#include "sdram-hynix-h8mbx00u0mer-0em.h"
28
29#if defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)
30
31static struct omap_smc91x_platform_data board_smc91x_data = {
32 .cs = 3,
33 .flags = GPMC_MUX_ADD_DATA | IORESOURCE_IRQ_LOWLEVEL,
34};
35
36static void __init board_smc91x_init(void)
37{
38 board_smc91x_data.gpio_irq = 158;
39 gpmc_smc91x_init(&board_smc91x_data);
40}
41
42#else
43
44static inline void board_smc91x_init(void)
45{
46}
47
48#endif /* defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE) */
49
50static void enable_board_wakeup_source(void)
51{
52 /* T2 interrupt line (keypad) */
53 omap_mux_init_signal("sys_nirq",
54 OMAP_WAKEUP_EN | OMAP_PIN_INPUT_PULLUP);
55}
56
57static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
58
59 .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
60 .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
61 .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
62
63 .phy_reset = true,
64 .reset_gpio_port[0] = 126,
65 .reset_gpio_port[1] = 61,
66 .reset_gpio_port[2] = -EINVAL
67};
68
69static void __init omap_sdp_map_io(void)
70{
71 omap2_set_globals_36xx();
72 omap34xx_map_common_io();
73}
74
75static struct omap_board_config_kernel sdp_config[] __initdata = {
76};
77
78static void __init omap_sdp_init_irq(void)
79{
80 omap_board_config = sdp_config;
81 omap_board_config_size = ARRAY_SIZE(sdp_config);
82 omap2_init_common_hw(h8mbx00u0mer0em_sdrc_params,
83 h8mbx00u0mer0em_sdrc_params);
84 omap_init_irq();
85 omap_gpio_init();
86}
87
88#ifdef CONFIG_OMAP_MUX
89static struct omap_board_mux board_mux[] __initdata = {
90 { .reg_offset = OMAP_MUX_TERMINATOR },
91};
92#else
93#define board_mux NULL
94#endif
95
96static void __init omap_sdp_init(void)
97{
98 omap3_mux_init(board_mux, OMAP_PACKAGE_CBP);
99 omap_serial_init();
100 zoom_peripherals_init();
101 board_smc91x_init();
102 enable_board_wakeup_source();
103 usb_ehci_init(&ehci_pdata);
104}
105
106MACHINE_START(OMAP_3630SDP, "OMAP 3630SDP board")
107 .phys_io = 0x48000000,
108 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
109 .boot_params = 0x80000100,
110 .map_io = omap_sdp_map_io,
111 .init_irq = omap_sdp_init_irq,
112 .init_machine = omap_sdp_init,
113 .timer = &omap_timer,
114MACHINE_END
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c
index 609a5a4a7e29..b88f28c5814b 100644
--- a/arch/arm/mach-omap2/board-4430sdp.c
+++ b/arch/arm/mach-omap2/board-4430sdp.c
@@ -17,17 +17,20 @@
17#include <linux/platform_device.h> 17#include <linux/platform_device.h>
18#include <linux/io.h> 18#include <linux/io.h>
19#include <linux/gpio.h> 19#include <linux/gpio.h>
20#include <linux/usb/otg.h>
20 21
21#include <mach/hardware.h> 22#include <mach/hardware.h>
22#include <asm/mach-types.h> 23#include <asm/mach-types.h>
23#include <asm/mach/arch.h> 24#include <asm/mach/arch.h>
24#include <asm/mach/map.h> 25#include <asm/mach/map.h>
25 26
26#include <mach/board.h> 27#include <plat/board.h>
27#include <mach/common.h> 28#include <plat/common.h>
28#include <mach/control.h> 29#include <plat/control.h>
29#include <mach/timer-gp.h> 30#include <plat/timer-gp.h>
31#include <plat/usb.h>
30#include <asm/hardware/gic.h> 32#include <asm/hardware/gic.h>
33#include <asm/hardware/cache-l2x0.h>
31 34
32static struct platform_device sdp4430_lcd_device = { 35static struct platform_device sdp4430_lcd_device = {
33 .name = "sdp4430_lcd", 36 .name = "sdp4430_lcd",
@@ -38,10 +41,6 @@ static struct platform_device *sdp4430_devices[] __initdata = {
38 &sdp4430_lcd_device, 41 &sdp4430_lcd_device,
39}; 42};
40 43
41static struct omap_uart_config sdp4430_uart_config __initdata = {
42 .enabled_uarts = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3),
43};
44
45static struct omap_lcd_config sdp4430_lcd_config __initdata = { 44static struct omap_lcd_config sdp4430_lcd_config __initdata = {
46 .ctrl_name = "internal", 45 .ctrl_name = "internal",
47}; 46};
@@ -50,10 +49,48 @@ static struct omap_board_config_kernel sdp4430_config[] __initdata = {
50 { OMAP_TAG_LCD, &sdp4430_lcd_config }, 49 { OMAP_TAG_LCD, &sdp4430_lcd_config },
51}; 50};
52 51
52#ifdef CONFIG_CACHE_L2X0
53static int __init omap_l2_cache_init(void)
54{
55 extern void omap_smc1(u32 fn, u32 arg);
56 void __iomem *l2cache_base;
57
58 /* To avoid code running on other OMAPs in
59 * multi-omap builds
60 */
61 if (!cpu_is_omap44xx())
62 return -ENODEV;
63
64 /* Static mapping, never released */
65 l2cache_base = ioremap(OMAP44XX_L2CACHE_BASE, SZ_4K);
66 BUG_ON(!l2cache_base);
67
68 /* Enable PL310 L2 Cache controller */
69 omap_smc1(0x102, 0x1);
70
71 /* 32KB way size, 16-way associativity,
72 * parity disabled
73 */
74 l2x0_init(l2cache_base, 0x0e050000, 0xc0000fff);
75
76 return 0;
77}
78early_initcall(omap_l2_cache_init);
79#endif
80
53static void __init gic_init_irq(void) 81static void __init gic_init_irq(void)
54{ 82{
55 gic_dist_init(0, OMAP2_IO_ADDRESS(OMAP44XX_GIC_DIST_BASE), 29); 83 void __iomem *base;
56 gic_cpu_init(0, OMAP2_IO_ADDRESS(OMAP44XX_GIC_CPU_BASE)); 84
85 /* Static mapping, never released */
86 base = ioremap(OMAP44XX_GIC_DIST_BASE, SZ_4K);
87 BUG_ON(!base);
88 gic_dist_init(0, base, 29);
89
90 /* Static mapping, never released */
91 gic_cpu_base_addr = ioremap(OMAP44XX_GIC_CPU_BASE, SZ_512);
92 BUG_ON(!gic_cpu_base_addr);
93 gic_cpu_init(0, gic_cpu_base_addr);
57} 94}
58 95
59static void __init omap_4430sdp_init_irq(void) 96static void __init omap_4430sdp_init_irq(void)
@@ -68,23 +105,33 @@ static void __init omap_4430sdp_init_irq(void)
68 omap_gpio_init(); 105 omap_gpio_init();
69} 106}
70 107
108static struct omap_musb_board_data musb_board_data = {
109 .interface_type = MUSB_INTERFACE_UTMI,
110 .mode = MUSB_PERIPHERAL,
111 .power = 100,
112};
71 113
72static void __init omap_4430sdp_init(void) 114static void __init omap_4430sdp_init(void)
73{ 115{
74 platform_add_devices(sdp4430_devices, ARRAY_SIZE(sdp4430_devices)); 116 platform_add_devices(sdp4430_devices, ARRAY_SIZE(sdp4430_devices));
75 omap_serial_init(); 117 omap_serial_init();
118 /* OMAP4 SDP uses internal transceiver so register nop transceiver */
119 usb_nop_xceiv_register();
120 /* FIXME: allow multi-omap to boot until musb is updated for omap4 */
121 if (!cpu_is_omap44xx())
122 usb_musb_init(&musb_board_data);
76} 123}
77 124
78static void __init omap_4430sdp_map_io(void) 125static void __init omap_4430sdp_map_io(void)
79{ 126{
80 omap2_set_globals_443x(); 127 omap2_set_globals_443x();
81 omap2_map_common_io(); 128 omap44xx_map_common_io();
82} 129}
83 130
84MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board") 131MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board")
85 /* Maintainer: Santosh Shilimkar - Texas Instruments Inc */ 132 /* Maintainer: Santosh Shilimkar - Texas Instruments Inc */
86 .phys_io = 0x48000000, 133 .phys_io = 0x48000000,
87 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, 134 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
88 .boot_params = 0x80000100, 135 .boot_params = 0x80000100,
89 .map_io = omap_4430sdp_map_io, 136 .map_io = omap_4430sdp_map_io,
90 .init_irq = omap_4430sdp_init_irq, 137 .init_irq = omap_4430sdp_init_irq,
diff --git a/arch/arm/mach-omap2/board-am3517evm.c b/arch/arm/mach-omap2/board-am3517evm.c
new file mode 100644
index 000000000000..c1c4389fbd8f
--- /dev/null
+++ b/arch/arm/mach-omap2/board-am3517evm.c
@@ -0,0 +1,332 @@
1/*
2 * linux/arch/arm/mach-omap2/board-am3517evm.c
3 *
4 * Copyright (C) 2009 Texas Instruments Incorporated
5 * Author: Ranjith Lohithakshan <ranjithl@ti.com>
6 *
7 * Based on mach-omap2/board-omap3evm.c
8 *
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by the
11 * Free Software Foundation version 2.
12 *
13 * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
14 * whether express or implied; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 */
18
19#include <linux/kernel.h>
20#include <linux/init.h>
21#include <linux/platform_device.h>
22#include <linux/gpio.h>
23#include <linux/i2c/pca953x.h>
24
25#include <mach/hardware.h>
26#include <mach/am35xx.h>
27#include <asm/mach-types.h>
28#include <asm/mach/arch.h>
29#include <asm/mach/map.h>
30
31#include <plat/board.h>
32#include <plat/common.h>
33#include <plat/usb.h>
34#include <plat/display.h>
35
36#include "mux.h"
37
38#define LCD_PANEL_PWR 176
39#define LCD_PANEL_BKLIGHT_PWR 182
40#define LCD_PANEL_PWM 181
41
42static struct i2c_board_info __initdata am3517evm_i2c_boardinfo[] = {
43 {
44 I2C_BOARD_INFO("s35390a", 0x30),
45 .type = "s35390a",
46 },
47};
48
49/*
50 * RTC - S35390A
51 */
52#define GPIO_RTCS35390A_IRQ 55
53
54static void __init am3517_evm_rtc_init(void)
55{
56 int r;
57
58 omap_mux_init_gpio(GPIO_RTCS35390A_IRQ, OMAP_PIN_INPUT_PULLUP);
59 r = gpio_request(GPIO_RTCS35390A_IRQ, "rtcs35390a-irq");
60 if (r < 0) {
61 printk(KERN_WARNING "failed to request GPIO#%d\n",
62 GPIO_RTCS35390A_IRQ);
63 return;
64 }
65 r = gpio_direction_input(GPIO_RTCS35390A_IRQ);
66 if (r < 0) {
67 printk(KERN_WARNING "GPIO#%d cannot be configured as input\n",
68 GPIO_RTCS35390A_IRQ);
69 gpio_free(GPIO_RTCS35390A_IRQ);
70 return;
71 }
72 am3517evm_i2c_boardinfo[0].irq = gpio_to_irq(GPIO_RTCS35390A_IRQ);
73}
74
75/*
76 * I2C GPIO Expander - TCA6416
77 */
78
79/* Mounted on Base-Board */
80static struct pca953x_platform_data am3517evm_gpio_expander_info_0 = {
81 .gpio_base = OMAP_MAX_GPIO_LINES,
82};
83static struct i2c_board_info __initdata am3517evm_tca6416_info_0[] = {
84 {
85 I2C_BOARD_INFO("tca6416", 0x21),
86 .platform_data = &am3517evm_gpio_expander_info_0,
87 },
88};
89
90/* Mounted on UI Card */
91static struct pca953x_platform_data am3517evm_ui_gpio_expander_info_1 = {
92 .gpio_base = OMAP_MAX_GPIO_LINES + 16,
93};
94static struct pca953x_platform_data am3517evm_ui_gpio_expander_info_2 = {
95 .gpio_base = OMAP_MAX_GPIO_LINES + 32,
96};
97static struct i2c_board_info __initdata am3517evm_ui_tca6416_info[] = {
98 {
99 I2C_BOARD_INFO("tca6416", 0x20),
100 .platform_data = &am3517evm_ui_gpio_expander_info_1,
101 },
102 {
103 I2C_BOARD_INFO("tca6416", 0x21),
104 .platform_data = &am3517evm_ui_gpio_expander_info_2,
105 },
106};
107
108static int __init am3517_evm_i2c_init(void)
109{
110 omap_register_i2c_bus(1, 400, NULL, 0);
111 omap_register_i2c_bus(2, 400, am3517evm_tca6416_info_0,
112 ARRAY_SIZE(am3517evm_tca6416_info_0));
113 omap_register_i2c_bus(3, 400, am3517evm_ui_tca6416_info,
114 ARRAY_SIZE(am3517evm_ui_tca6416_info));
115
116 return 0;
117}
118
119static int lcd_enabled;
120static int dvi_enabled;
121
122static void __init am3517_evm_display_init(void)
123{
124 int r;
125
126 omap_mux_init_gpio(LCD_PANEL_PWR, OMAP_PIN_INPUT_PULLUP);
127 omap_mux_init_gpio(LCD_PANEL_BKLIGHT_PWR, OMAP_PIN_INPUT_PULLDOWN);
128 omap_mux_init_gpio(LCD_PANEL_PWM, OMAP_PIN_INPUT_PULLDOWN);
129 /*
130 * Enable GPIO 182 = LCD Backlight Power
131 */
132 r = gpio_request(LCD_PANEL_BKLIGHT_PWR, "lcd_backlight_pwr");
133 if (r) {
134 printk(KERN_ERR "failed to get lcd_backlight_pwr\n");
135 return;
136 }
137 gpio_direction_output(LCD_PANEL_BKLIGHT_PWR, 1);
138 /*
139 * Enable GPIO 181 = LCD Panel PWM
140 */
141 r = gpio_request(LCD_PANEL_PWM, "lcd_pwm");
142 if (r) {
143 printk(KERN_ERR "failed to get lcd_pwm\n");
144 goto err_1;
145 }
146 gpio_direction_output(LCD_PANEL_PWM, 1);
147 /*
148 * Enable GPIO 176 = LCD Panel Power enable pin
149 */
150 r = gpio_request(LCD_PANEL_PWR, "lcd_panel_pwr");
151 if (r) {
152 printk(KERN_ERR "failed to get lcd_panel_pwr\n");
153 goto err_2;
154 }
155 gpio_direction_output(LCD_PANEL_PWR, 1);
156
157 printk(KERN_INFO "Display initialized successfully\n");
158 return;
159
160err_2:
161 gpio_free(LCD_PANEL_PWM);
162err_1:
163 gpio_free(LCD_PANEL_BKLIGHT_PWR);
164}
165
166static int am3517_evm_panel_enable_lcd(struct omap_dss_device *dssdev)
167{
168 if (dvi_enabled) {
169 printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
170 return -EINVAL;
171 }
172 gpio_set_value(LCD_PANEL_PWR, 1);
173 lcd_enabled = 1;
174
175 return 0;
176}
177
178static void am3517_evm_panel_disable_lcd(struct omap_dss_device *dssdev)
179{
180 gpio_set_value(LCD_PANEL_PWR, 0);
181 lcd_enabled = 0;
182}
183
184static struct omap_dss_device am3517_evm_lcd_device = {
185 .type = OMAP_DISPLAY_TYPE_DPI,
186 .name = "lcd",
187 .driver_name = "sharp_lq_panel",
188 .phy.dpi.data_lines = 16,
189 .platform_enable = am3517_evm_panel_enable_lcd,
190 .platform_disable = am3517_evm_panel_disable_lcd,
191};
192
193static int am3517_evm_panel_enable_tv(struct omap_dss_device *dssdev)
194{
195 return 0;
196}
197
198static void am3517_evm_panel_disable_tv(struct omap_dss_device *dssdev)
199{
200}
201
202static struct omap_dss_device am3517_evm_tv_device = {
203 .type = OMAP_DISPLAY_TYPE_VENC,
204 .name = "tv",
205 .driver_name = "venc",
206 .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
207 .platform_enable = am3517_evm_panel_enable_tv,
208 .platform_disable = am3517_evm_panel_disable_tv,
209};
210
211static int am3517_evm_panel_enable_dvi(struct omap_dss_device *dssdev)
212{
213 if (lcd_enabled) {
214 printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
215 return -EINVAL;
216 }
217 dvi_enabled = 1;
218
219 return 0;
220}
221
222static void am3517_evm_panel_disable_dvi(struct omap_dss_device *dssdev)
223{
224 dvi_enabled = 0;
225}
226
227static struct omap_dss_device am3517_evm_dvi_device = {
228 .type = OMAP_DISPLAY_TYPE_DPI,
229 .name = "dvi",
230 .driver_name = "generic_panel",
231 .phy.dpi.data_lines = 24,
232 .platform_enable = am3517_evm_panel_enable_dvi,
233 .platform_disable = am3517_evm_panel_disable_dvi,
234};
235
236static struct omap_dss_device *am3517_evm_dss_devices[] = {
237 &am3517_evm_lcd_device,
238 &am3517_evm_tv_device,
239 &am3517_evm_dvi_device,
240};
241
242static struct omap_dss_board_info am3517_evm_dss_data = {
243 .num_devices = ARRAY_SIZE(am3517_evm_dss_devices),
244 .devices = am3517_evm_dss_devices,
245 .default_device = &am3517_evm_lcd_device,
246};
247
248struct platform_device am3517_evm_dss_device = {
249 .name = "omapdss",
250 .id = -1,
251 .dev = {
252 .platform_data = &am3517_evm_dss_data,
253 },
254};
255
256/*
257 * Board initialization
258 */
259static struct omap_board_config_kernel am3517_evm_config[] __initdata = {
260};
261
262static struct platform_device *am3517_evm_devices[] __initdata = {
263 &am3517_evm_dss_device,
264};
265
266static void __init am3517_evm_init_irq(void)
267{
268 omap_board_config = am3517_evm_config;
269 omap_board_config_size = ARRAY_SIZE(am3517_evm_config);
270
271 omap2_init_common_hw(NULL, NULL);
272 omap_init_irq();
273 omap_gpio_init();
274}
275
276static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
277 .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
278 .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
279 .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
280
281 .phy_reset = true,
282 .reset_gpio_port[0] = 57,
283 .reset_gpio_port[1] = -EINVAL,
284 .reset_gpio_port[2] = -EINVAL
285};
286
287#ifdef CONFIG_OMAP_MUX
288static struct omap_board_mux board_mux[] __initdata = {
289 { .reg_offset = OMAP_MUX_TERMINATOR },
290};
291#else
292#define board_mux NULL
293#endif
294
295static void __init am3517_evm_init(void)
296{
297 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
298
299 am3517_evm_i2c_init();
300 platform_add_devices(am3517_evm_devices,
301 ARRAY_SIZE(am3517_evm_devices));
302
303 omap_serial_init();
304
305 /* Configure GPIO for EHCI port */
306 omap_mux_init_gpio(57, OMAP_PIN_OUTPUT);
307 usb_ehci_init(&ehci_pdata);
308 /* DSS */
309 am3517_evm_display_init();
310
311 /* RTC - S35390A */
312 am3517_evm_rtc_init();
313
314 i2c_register_board_info(1, am3517evm_i2c_boardinfo,
315 ARRAY_SIZE(am3517evm_i2c_boardinfo));
316}
317
318static void __init am3517_evm_map_io(void)
319{
320 omap2_set_globals_343x();
321 omap34xx_map_common_io();
322}
323
324MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM")
325 .phys_io = 0x48000000,
326 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
327 .boot_params = 0x80000100,
328 .map_io = am3517_evm_map_io,
329 .init_irq = am3517_evm_init_irq,
330 .init_machine = am3517_evm_init,
331 .timer = &omap_timer,
332MACHINE_END
diff --git a/arch/arm/mach-omap2/board-apollon.c b/arch/arm/mach-omap2/board-apollon.c
index a1132288c701..aa69fb999748 100644
--- a/arch/arm/mach-omap2/board-apollon.c
+++ b/arch/arm/mach-omap2/board-apollon.c
@@ -26,6 +26,7 @@
26#include <linux/leds.h> 26#include <linux/leds.h>
27#include <linux/err.h> 27#include <linux/err.h>
28#include <linux/clk.h> 28#include <linux/clk.h>
29#include <linux/smc91x.h>
29 30
30#include <mach/hardware.h> 31#include <mach/hardware.h>
31#include <asm/mach-types.h> 32#include <asm/mach-types.h>
@@ -33,13 +34,13 @@
33#include <asm/mach/flash.h> 34#include <asm/mach/flash.h>
34 35
35#include <mach/gpio.h> 36#include <mach/gpio.h>
36#include <mach/led.h> 37#include <plat/led.h>
37#include <mach/mux.h> 38#include <plat/mux.h>
38#include <mach/usb.h> 39#include <plat/usb.h>
39#include <mach/board.h> 40#include <plat/board.h>
40#include <mach/common.h> 41#include <plat/common.h>
41#include <mach/gpmc.h> 42#include <plat/gpmc.h>
42#include <mach/control.h> 43#include <plat/control.h>
43 44
44/* LED & Switch macros */ 45/* LED & Switch macros */
45#define LED0_GPIO13 13 46#define LED0_GPIO13 13
@@ -120,6 +121,12 @@ static void __init apollon_flash_init(void)
120 apollon_flash_resource[0].end = base + SZ_128K - 1; 121 apollon_flash_resource[0].end = base + SZ_128K - 1;
121} 122}
122 123
124static struct smc91x_platdata appolon_smc91x_info = {
125 .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
126 .leda = RPC_LED_100_10,
127 .ledb = RPC_LED_TX_RX,
128};
129
123static struct resource apollon_smc91x_resources[] = { 130static struct resource apollon_smc91x_resources[] = {
124 [0] = { 131 [0] = {
125 .flags = IORESOURCE_MEM, 132 .flags = IORESOURCE_MEM,
@@ -134,6 +141,9 @@ static struct resource apollon_smc91x_resources[] = {
134static struct platform_device apollon_smc91x_device = { 141static struct platform_device apollon_smc91x_device = {
135 .name = "smc91x", 142 .name = "smc91x",
136 .id = -1, 143 .id = -1,
144 .dev = {
145 .platform_data = &appolon_smc91x_info,
146 },
137 .num_resources = ARRAY_SIZE(apollon_smc91x_resources), 147 .num_resources = ARRAY_SIZE(apollon_smc91x_resources),
138 .resource = apollon_smc91x_resources, 148 .resource = apollon_smc91x_resources,
139}; 149};
@@ -327,13 +337,13 @@ static void __init omap_apollon_init(void)
327static void __init omap_apollon_map_io(void) 337static void __init omap_apollon_map_io(void)
328{ 338{
329 omap2_set_globals_242x(); 339 omap2_set_globals_242x();
330 omap2_map_common_io(); 340 omap242x_map_common_io();
331} 341}
332 342
333MACHINE_START(OMAP_APOLLON, "OMAP24xx Apollon") 343MACHINE_START(OMAP_APOLLON, "OMAP24xx Apollon")
334 /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */ 344 /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */
335 .phys_io = 0x48000000, 345 .phys_io = 0x48000000,
336 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, 346 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
337 .boot_params = 0x80000100, 347 .boot_params = 0x80000100,
338 .map_io = omap_apollon_map_io, 348 .map_io = omap_apollon_map_io,
339 .init_irq = omap_apollon_init_irq, 349 .init_irq = omap_apollon_init_irq,
diff --git a/arch/arm/mach-omap2/board-cm-t35.c b/arch/arm/mach-omap2/board-cm-t35.c
new file mode 100644
index 000000000000..2de4f79f03a0
--- /dev/null
+++ b/arch/arm/mach-omap2/board-cm-t35.c
@@ -0,0 +1,842 @@
1/*
2 * board-cm-t35.c (CompuLab CM-T35 module)
3 *
4 * Copyright (C) 2009 CompuLab, Ltd.
5 * Author: Mike Rapoport <mike@compulab.co.il>
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * version 2 as published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
19 * 02110-1301 USA
20 *
21 */
22
23#include <linux/kernel.h>
24#include <linux/init.h>
25#include <linux/platform_device.h>
26#include <linux/input.h>
27#include <linux/input/matrix_keypad.h>
28#include <linux/delay.h>
29#include <linux/gpio.h>
30
31#include <linux/i2c/at24.h>
32#include <linux/i2c/twl.h>
33#include <linux/regulator/machine.h>
34
35#include <linux/spi/spi.h>
36#include <linux/spi/tdo24m.h>
37
38#include <asm/mach-types.h>
39#include <asm/mach/arch.h>
40#include <asm/mach/map.h>
41
42#include <plat/board.h>
43#include <plat/common.h>
44#include <plat/nand.h>
45#include <plat/gpmc.h>
46#include <plat/usb.h>
47#include <plat/display.h>
48
49#include <mach/hardware.h>
50
51#include "mux.h"
52#include "sdram-micron-mt46h32m32lf-6.h"
53#include "hsmmc.h"
54
55#define CM_T35_GPIO_PENDOWN 57
56
57#define CM_T35_SMSC911X_CS 5
58#define CM_T35_SMSC911X_GPIO 163
59#define SB_T35_SMSC911X_CS 4
60#define SB_T35_SMSC911X_GPIO 65
61
62#define NAND_BLOCK_SIZE SZ_128K
63#define GPMC_CS0_BASE 0x60
64#define GPMC_CS0_BASE_ADDR (OMAP34XX_GPMC_VIRT + GPMC_CS0_BASE)
65
66#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
67#include <linux/smsc911x.h>
68
69static struct smsc911x_platform_config cm_t35_smsc911x_config = {
70 .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
71 .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN,
72 .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS,
73 .phy_interface = PHY_INTERFACE_MODE_MII,
74};
75
76static struct resource cm_t35_smsc911x_resources[] = {
77 {
78 .flags = IORESOURCE_MEM,
79 },
80 {
81 .start = OMAP_GPIO_IRQ(CM_T35_SMSC911X_GPIO),
82 .end = OMAP_GPIO_IRQ(CM_T35_SMSC911X_GPIO),
83 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
84 },
85};
86
87static struct platform_device cm_t35_smsc911x_device = {
88 .name = "smsc911x",
89 .id = 0,
90 .num_resources = ARRAY_SIZE(cm_t35_smsc911x_resources),
91 .resource = cm_t35_smsc911x_resources,
92 .dev = {
93 .platform_data = &cm_t35_smsc911x_config,
94 },
95};
96
97static struct resource sb_t35_smsc911x_resources[] = {
98 {
99 .flags = IORESOURCE_MEM,
100 },
101 {
102 .start = OMAP_GPIO_IRQ(SB_T35_SMSC911X_GPIO),
103 .end = OMAP_GPIO_IRQ(SB_T35_SMSC911X_GPIO),
104 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
105 },
106};
107
108static struct platform_device sb_t35_smsc911x_device = {
109 .name = "smsc911x",
110 .id = 1,
111 .num_resources = ARRAY_SIZE(sb_t35_smsc911x_resources),
112 .resource = sb_t35_smsc911x_resources,
113 .dev = {
114 .platform_data = &cm_t35_smsc911x_config,
115 },
116};
117
118static void __init cm_t35_init_smsc911x(struct platform_device *dev,
119 int cs, int irq_gpio)
120{
121 unsigned long cs_mem_base;
122
123 if (gpmc_cs_request(cs, SZ_16M, &cs_mem_base) < 0) {
124 pr_err("CM-T35: Failed request for GPMC mem for smsc911x\n");
125 return;
126 }
127
128 dev->resource[0].start = cs_mem_base + 0x0;
129 dev->resource[0].end = cs_mem_base + 0xff;
130
131 if ((gpio_request(irq_gpio, "ETH IRQ") == 0) &&
132 (gpio_direction_input(irq_gpio) == 0)) {
133 gpio_export(irq_gpio, 0);
134 } else {
135 pr_err("CM-T35: could not obtain gpio for SMSC911X IRQ\n");
136 return;
137 }
138
139 platform_device_register(dev);
140}
141
142static void __init cm_t35_init_ethernet(void)
143{
144 cm_t35_init_smsc911x(&cm_t35_smsc911x_device,
145 CM_T35_SMSC911X_CS, CM_T35_SMSC911X_GPIO);
146 cm_t35_init_smsc911x(&sb_t35_smsc911x_device,
147 SB_T35_SMSC911X_CS, SB_T35_SMSC911X_GPIO);
148}
149#else
150static inline void __init cm_t35_init_ethernet(void) { return; }
151#endif
152
153#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
154#include <linux/leds.h>
155
156static struct gpio_led cm_t35_leds[] = {
157 [0] = {
158 .gpio = 186,
159 .name = "cm-t35:green",
160 .default_trigger = "heartbeat",
161 .active_low = 0,
162 },
163};
164
165static struct gpio_led_platform_data cm_t35_led_pdata = {
166 .num_leds = ARRAY_SIZE(cm_t35_leds),
167 .leds = cm_t35_leds,
168};
169
170static struct platform_device cm_t35_led_device = {
171 .name = "leds-gpio",
172 .id = -1,
173 .dev = {
174 .platform_data = &cm_t35_led_pdata,
175 },
176};
177
178static void __init cm_t35_init_led(void)
179{
180 platform_device_register(&cm_t35_led_device);
181}
182#else
183static inline void cm_t35_init_led(void) {}
184#endif
185
186#if defined(CONFIG_MTD_NAND_OMAP2) || defined(CONFIG_MTD_NAND_OMAP2_MODULE)
187#include <linux/mtd/mtd.h>
188#include <linux/mtd/nand.h>
189#include <linux/mtd/partitions.h>
190
191static struct mtd_partition cm_t35_nand_partitions[] = {
192 {
193 .name = "xloader",
194 .offset = 0, /* Offset = 0x00000 */
195 .size = 4 * NAND_BLOCK_SIZE,
196 .mask_flags = MTD_WRITEABLE
197 },
198 {
199 .name = "uboot",
200 .offset = MTDPART_OFS_APPEND, /* Offset = 0x80000 */
201 .size = 15 * NAND_BLOCK_SIZE,
202 },
203 {
204 .name = "uboot environment",
205 .offset = MTDPART_OFS_APPEND, /* Offset = 0x260000 */
206 .size = 2 * NAND_BLOCK_SIZE,
207 },
208 {
209 .name = "linux",
210 .offset = MTDPART_OFS_APPEND, /* Offset = 0x280000 */
211 .size = 32 * NAND_BLOCK_SIZE,
212 },
213 {
214 .name = "rootfs",
215 .offset = MTDPART_OFS_APPEND, /* Offset = 0x680000 */
216 .size = MTDPART_SIZ_FULL,
217 },
218};
219
220static struct omap_nand_platform_data cm_t35_nand_data = {
221 .parts = cm_t35_nand_partitions,
222 .nr_parts = ARRAY_SIZE(cm_t35_nand_partitions),
223 .dma_channel = -1, /* disable DMA in OMAP NAND driver */
224 .cs = 0,
225 .gpmc_cs_baseaddr = (void __iomem *)GPMC_CS0_BASE_ADDR,
226 .gpmc_baseaddr = (void __iomem *)OMAP34XX_GPMC_VIRT,
227
228};
229
230static struct resource cm_t35_nand_resource = {
231 .flags = IORESOURCE_MEM,
232};
233
234static struct platform_device cm_t35_nand_device = {
235 .name = "omap2-nand",
236 .id = -1,
237 .num_resources = 1,
238 .resource = &cm_t35_nand_resource,
239 .dev = {
240 .platform_data = &cm_t35_nand_data,
241 },
242};
243
244static void __init cm_t35_init_nand(void)
245{
246 if (platform_device_register(&cm_t35_nand_device) < 0)
247 pr_err("CM-T35: Unable to register NAND device\n");
248}
249#else
250static inline void cm_t35_init_nand(void) {}
251#endif
252
253#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
254 defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
255#include <linux/spi/ads7846.h>
256
257#include <plat/mcspi.h>
258
259static struct omap2_mcspi_device_config ads7846_mcspi_config = {
260 .turbo_mode = 0,
261 .single_channel = 1, /* 0: slave, 1: master */
262};
263
264static int ads7846_get_pendown_state(void)
265{
266 return !gpio_get_value(CM_T35_GPIO_PENDOWN);
267}
268
269static struct ads7846_platform_data ads7846_config = {
270 .x_max = 0x0fff,
271 .y_max = 0x0fff,
272 .x_plate_ohms = 180,
273 .pressure_max = 255,
274 .debounce_max = 10,
275 .debounce_tol = 3,
276 .debounce_rep = 1,
277 .get_pendown_state = ads7846_get_pendown_state,
278 .keep_vref_on = 1,
279};
280
281static struct spi_board_info cm_t35_spi_board_info[] __initdata = {
282 {
283 .modalias = "ads7846",
284 .bus_num = 1,
285 .chip_select = 0,
286 .max_speed_hz = 1500000,
287 .controller_data = &ads7846_mcspi_config,
288 .irq = OMAP_GPIO_IRQ(CM_T35_GPIO_PENDOWN),
289 .platform_data = &ads7846_config,
290 },
291};
292
293static void __init cm_t35_init_ads7846(void)
294{
295 if ((gpio_request(CM_T35_GPIO_PENDOWN, "ADS7846_PENDOWN") == 0) &&
296 (gpio_direction_input(CM_T35_GPIO_PENDOWN) == 0)) {
297 gpio_export(CM_T35_GPIO_PENDOWN, 0);
298 } else {
299 pr_err("CM-T35: could not obtain gpio for ADS7846_PENDOWN\n");
300 return;
301 }
302
303 spi_register_board_info(cm_t35_spi_board_info,
304 ARRAY_SIZE(cm_t35_spi_board_info));
305}
306#else
307static inline void cm_t35_init_ads7846(void) {}
308#endif
309
310#define CM_T35_LCD_EN_GPIO 157
311#define CM_T35_LCD_BL_GPIO 58
312#define CM_T35_DVI_EN_GPIO 54
313
314static int lcd_bl_gpio;
315static int lcd_en_gpio;
316static int dvi_en_gpio;
317
318static int lcd_enabled;
319static int dvi_enabled;
320
321static int cm_t35_panel_enable_lcd(struct omap_dss_device *dssdev)
322{
323 if (dvi_enabled) {
324 printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
325 return -EINVAL;
326 }
327
328 gpio_set_value(lcd_en_gpio, 1);
329 gpio_set_value(lcd_bl_gpio, 1);
330
331 lcd_enabled = 1;
332
333 return 0;
334}
335
336static void cm_t35_panel_disable_lcd(struct omap_dss_device *dssdev)
337{
338 lcd_enabled = 0;
339
340 gpio_set_value(lcd_bl_gpio, 0);
341 gpio_set_value(lcd_en_gpio, 0);
342}
343
344static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev)
345{
346 if (lcd_enabled) {
347 printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
348 return -EINVAL;
349 }
350
351 gpio_set_value(dvi_en_gpio, 0);
352 dvi_enabled = 1;
353
354 return 0;
355}
356
357static void cm_t35_panel_disable_dvi(struct omap_dss_device *dssdev)
358{
359 gpio_set_value(dvi_en_gpio, 1);
360 dvi_enabled = 0;
361}
362
363static int cm_t35_panel_enable_tv(struct omap_dss_device *dssdev)
364{
365 return 0;
366}
367
368static void cm_t35_panel_disable_tv(struct omap_dss_device *dssdev)
369{
370}
371
372static struct omap_dss_device cm_t35_lcd_device = {
373 .name = "lcd",
374 .driver_name = "toppoly_tdo35s_panel",
375 .type = OMAP_DISPLAY_TYPE_DPI,
376 .phy.dpi.data_lines = 18,
377 .platform_enable = cm_t35_panel_enable_lcd,
378 .platform_disable = cm_t35_panel_disable_lcd,
379};
380
381static struct omap_dss_device cm_t35_dvi_device = {
382 .name = "dvi",
383 .driver_name = "generic_panel",
384 .type = OMAP_DISPLAY_TYPE_DPI,
385 .phy.dpi.data_lines = 24,
386 .platform_enable = cm_t35_panel_enable_dvi,
387 .platform_disable = cm_t35_panel_disable_dvi,
388};
389
390static struct omap_dss_device cm_t35_tv_device = {
391 .name = "tv",
392 .driver_name = "venc",
393 .type = OMAP_DISPLAY_TYPE_VENC,
394 .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
395 .platform_enable = cm_t35_panel_enable_tv,
396 .platform_disable = cm_t35_panel_disable_tv,
397};
398
399static struct omap_dss_device *cm_t35_dss_devices[] = {
400 &cm_t35_lcd_device,
401 &cm_t35_dvi_device,
402 &cm_t35_tv_device,
403};
404
405static struct omap_dss_board_info cm_t35_dss_data = {
406 .num_devices = ARRAY_SIZE(cm_t35_dss_devices),
407 .devices = cm_t35_dss_devices,
408 .default_device = &cm_t35_dvi_device,
409};
410
411static struct platform_device cm_t35_dss_device = {
412 .name = "omapdss",
413 .id = -1,
414 .dev = {
415 .platform_data = &cm_t35_dss_data,
416 },
417};
418
419static struct omap2_mcspi_device_config tdo24m_mcspi_config = {
420 .turbo_mode = 0,
421 .single_channel = 1, /* 0: slave, 1: master */
422};
423
424static struct tdo24m_platform_data tdo24m_config = {
425 .model = TDO35S,
426};
427
428static struct spi_board_info cm_t35_lcd_spi_board_info[] __initdata = {
429 {
430 .modalias = "tdo24m",
431 .bus_num = 4,
432 .chip_select = 0,
433 .max_speed_hz = 1000000,
434 .controller_data = &tdo24m_mcspi_config,
435 .platform_data = &tdo24m_config,
436 },
437};
438
439static void __init cm_t35_init_display(void)
440{
441 int err;
442
443 lcd_en_gpio = CM_T35_LCD_EN_GPIO;
444 lcd_bl_gpio = CM_T35_LCD_BL_GPIO;
445 dvi_en_gpio = CM_T35_DVI_EN_GPIO;
446
447 spi_register_board_info(cm_t35_lcd_spi_board_info,
448 ARRAY_SIZE(cm_t35_lcd_spi_board_info));
449
450 err = gpio_request(lcd_en_gpio, "LCD RST");
451 if (err) {
452 pr_err("CM-T35: failed to get LCD reset GPIO\n");
453 goto out;
454 }
455
456 err = gpio_request(lcd_bl_gpio, "LCD BL");
457 if (err) {
458 pr_err("CM-T35: failed to get LCD backlight control GPIO\n");
459 goto err_lcd_bl;
460 }
461
462 err = gpio_request(dvi_en_gpio, "DVI EN");
463 if (err) {
464 pr_err("CM-T35: failed to get DVI reset GPIO\n");
465 goto err_dvi_en;
466 }
467
468 gpio_export(lcd_en_gpio, 0);
469 gpio_export(lcd_bl_gpio, 0);
470 gpio_export(dvi_en_gpio, 0);
471 gpio_direction_output(lcd_en_gpio, 0);
472 gpio_direction_output(lcd_bl_gpio, 0);
473 gpio_direction_output(dvi_en_gpio, 1);
474
475 msleep(50);
476 gpio_set_value(lcd_en_gpio, 1);
477
478 err = platform_device_register(&cm_t35_dss_device);
479 if (err) {
480 pr_err("CM-T35: failed to register DSS device\n");
481 goto err_dev_reg;
482 }
483
484 return;
485
486err_dev_reg:
487 gpio_free(dvi_en_gpio);
488err_dvi_en:
489 gpio_free(lcd_bl_gpio);
490err_lcd_bl:
491 gpio_free(lcd_en_gpio);
492out:
493
494 return;
495}
496
497static struct regulator_consumer_supply cm_t35_vmmc1_supply = {
498 .supply = "vmmc",
499};
500
501static struct regulator_consumer_supply cm_t35_vsim_supply = {
502 .supply = "vmmc_aux",
503};
504
505static struct regulator_consumer_supply cm_t35_vdac_supply = {
506 .supply = "vdda_dac",
507 .dev = &cm_t35_dss_device.dev,
508};
509
510static struct regulator_consumer_supply cm_t35_vdvi_supply = {
511 .supply = "vdvi",
512 .dev = &cm_t35_dss_device.dev,
513};
514
515/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
516static struct regulator_init_data cm_t35_vmmc1 = {
517 .constraints = {
518 .min_uV = 1850000,
519 .max_uV = 3150000,
520 .valid_modes_mask = REGULATOR_MODE_NORMAL
521 | REGULATOR_MODE_STANDBY,
522 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
523 | REGULATOR_CHANGE_MODE
524 | REGULATOR_CHANGE_STATUS,
525 },
526 .num_consumer_supplies = 1,
527 .consumer_supplies = &cm_t35_vmmc1_supply,
528};
529
530/* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
531static struct regulator_init_data cm_t35_vsim = {
532 .constraints = {
533 .min_uV = 1800000,
534 .max_uV = 3000000,
535 .valid_modes_mask = REGULATOR_MODE_NORMAL
536 | REGULATOR_MODE_STANDBY,
537 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
538 | REGULATOR_CHANGE_MODE
539 | REGULATOR_CHANGE_STATUS,
540 },
541 .num_consumer_supplies = 1,
542 .consumer_supplies = &cm_t35_vsim_supply,
543};
544
545/* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */
546static struct regulator_init_data cm_t35_vdac = {
547 .constraints = {
548 .min_uV = 1800000,
549 .max_uV = 1800000,
550 .valid_modes_mask = REGULATOR_MODE_NORMAL
551 | REGULATOR_MODE_STANDBY,
552 .valid_ops_mask = REGULATOR_CHANGE_MODE
553 | REGULATOR_CHANGE_STATUS,
554 },
555 .num_consumer_supplies = 1,
556 .consumer_supplies = &cm_t35_vdac_supply,
557};
558
559/* VPLL2 for digital video outputs */
560static struct regulator_init_data cm_t35_vpll2 = {
561 .constraints = {
562 .name = "VDVI",
563 .min_uV = 1800000,
564 .max_uV = 1800000,
565 .valid_modes_mask = REGULATOR_MODE_NORMAL
566 | REGULATOR_MODE_STANDBY,
567 .valid_ops_mask = REGULATOR_CHANGE_MODE
568 | REGULATOR_CHANGE_STATUS,
569 },
570 .num_consumer_supplies = 1,
571 .consumer_supplies = &cm_t35_vdvi_supply,
572};
573
574static struct twl4030_usb_data cm_t35_usb_data = {
575 .usb_mode = T2_USB_MODE_ULPI,
576};
577
578static int cm_t35_keymap[] = {
579 KEY(0, 0, KEY_A), KEY(0, 1, KEY_B), KEY(0, 2, KEY_LEFT),
580 KEY(1, 0, KEY_UP), KEY(1, 1, KEY_ENTER), KEY(1, 2, KEY_DOWN),
581 KEY(2, 0, KEY_RIGHT), KEY(2, 1, KEY_C), KEY(2, 2, KEY_D),
582};
583
584static struct matrix_keymap_data cm_t35_keymap_data = {
585 .keymap = cm_t35_keymap,
586 .keymap_size = ARRAY_SIZE(cm_t35_keymap),
587};
588
589static struct twl4030_keypad_data cm_t35_kp_data = {
590 .keymap_data = &cm_t35_keymap_data,
591 .rows = 3,
592 .cols = 3,
593 .rep = 1,
594};
595
596static struct omap2_hsmmc_info mmc[] = {
597 {
598 .mmc = 1,
599 .wires = 4,
600 .gpio_cd = -EINVAL,
601 .gpio_wp = -EINVAL,
602
603 },
604 {
605 .mmc = 2,
606 .wires = 4,
607 .transceiver = 1,
608 .gpio_cd = -EINVAL,
609 .gpio_wp = -EINVAL,
610 .ocr_mask = 0x00100000, /* 3.3V */
611 },
612 {} /* Terminator */
613};
614
615static struct ehci_hcd_omap_platform_data ehci_pdata __initdata = {
616 .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
617 .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
618 .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
619
620 .phy_reset = true,
621 .reset_gpio_port[0] = -EINVAL,
622 .reset_gpio_port[1] = -EINVAL,
623 .reset_gpio_port[2] = -EINVAL
624};
625
626static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio,
627 unsigned ngpio)
628{
629 int wlan_rst = gpio + 2;
630
631 if ((gpio_request(wlan_rst, "WLAN RST") == 0) &&
632 (gpio_direction_output(wlan_rst, 1) == 0)) {
633 gpio_export(wlan_rst, 0);
634
635 udelay(10);
636 gpio_set_value(wlan_rst, 0);
637 udelay(10);
638 gpio_set_value(wlan_rst, 1);
639 } else {
640 pr_err("CM-T35: could not obtain gpio for WiFi reset\n");
641 }
642
643 /* gpio + 0 is "mmc0_cd" (input/IRQ) */
644 mmc[0].gpio_cd = gpio + 0;
645 omap2_hsmmc_init(mmc);
646
647 /* link regulators to MMC adapters */
648 cm_t35_vmmc1_supply.dev = mmc[0].dev;
649 cm_t35_vsim_supply.dev = mmc[0].dev;
650
651 /* setup USB with proper PHY reset GPIOs */
652 ehci_pdata.reset_gpio_port[0] = gpio + 6;
653 ehci_pdata.reset_gpio_port[1] = gpio + 7;
654
655 usb_ehci_init(&ehci_pdata);
656
657 return 0;
658}
659
660static struct twl4030_gpio_platform_data cm_t35_gpio_data = {
661 .gpio_base = OMAP_MAX_GPIO_LINES,
662 .irq_base = TWL4030_GPIO_IRQ_BASE,
663 .irq_end = TWL4030_GPIO_IRQ_END,
664 .setup = cm_t35_twl_gpio_setup,
665};
666
667static struct twl4030_platform_data cm_t35_twldata = {
668 .irq_base = TWL4030_IRQ_BASE,
669 .irq_end = TWL4030_IRQ_END,
670
671 /* platform_data for children goes here */
672 .keypad = &cm_t35_kp_data,
673 .usb = &cm_t35_usb_data,
674 .gpio = &cm_t35_gpio_data,
675 .vmmc1 = &cm_t35_vmmc1,
676 .vsim = &cm_t35_vsim,
677 .vdac = &cm_t35_vdac,
678 .vpll2 = &cm_t35_vpll2,
679};
680
681static struct i2c_board_info __initdata cm_t35_i2c_boardinfo[] = {
682 {
683 I2C_BOARD_INFO("tps65930", 0x48),
684 .flags = I2C_CLIENT_WAKE,
685 .irq = INT_34XX_SYS_NIRQ,
686 .platform_data = &cm_t35_twldata,
687 },
688};
689
690static void __init cm_t35_init_i2c(void)
691{
692 omap_register_i2c_bus(1, 2600, cm_t35_i2c_boardinfo,
693 ARRAY_SIZE(cm_t35_i2c_boardinfo));
694}
695
696static struct omap_board_config_kernel cm_t35_config[] __initdata = {
697};
698
699static void __init cm_t35_init_irq(void)
700{
701 omap_board_config = cm_t35_config;
702 omap_board_config_size = ARRAY_SIZE(cm_t35_config);
703
704 omap2_init_common_hw(mt46h32m32lf6_sdrc_params,
705 mt46h32m32lf6_sdrc_params);
706 omap_init_irq();
707 omap_gpio_init();
708}
709
710static void __init cm_t35_map_io(void)
711{
712 omap2_set_globals_343x();
713 omap34xx_map_common_io();
714}
715
716static struct omap_board_mux board_mux[] __initdata = {
717 /* nCS and IRQ for CM-T35 ethernet */
718 OMAP3_MUX(GPMC_NCS5, OMAP_MUX_MODE0),
719 OMAP3_MUX(UART3_CTS_RCTX, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP),
720
721 /* nCS and IRQ for SB-T35 ethernet */
722 OMAP3_MUX(GPMC_NCS4, OMAP_MUX_MODE0),
723 OMAP3_MUX(GPMC_WAIT3, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP),
724
725 /* PENDOWN GPIO */
726 OMAP3_MUX(GPMC_NCS6, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
727
728 /* mUSB */
729 OMAP3_MUX(HSUSB0_CLK, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
730 OMAP3_MUX(HSUSB0_STP, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
731 OMAP3_MUX(HSUSB0_DIR, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
732 OMAP3_MUX(HSUSB0_NXT, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
733 OMAP3_MUX(HSUSB0_DATA0, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
734 OMAP3_MUX(HSUSB0_DATA1, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
735 OMAP3_MUX(HSUSB0_DATA2, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
736 OMAP3_MUX(HSUSB0_DATA3, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
737 OMAP3_MUX(HSUSB0_DATA4, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
738 OMAP3_MUX(HSUSB0_DATA5, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
739 OMAP3_MUX(HSUSB0_DATA6, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
740 OMAP3_MUX(HSUSB0_DATA7, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
741
742 /* MMC 2 */
743 OMAP3_MUX(SDMMC2_DAT4, OMAP_MUX_MODE1 | OMAP_PIN_OUTPUT),
744 OMAP3_MUX(SDMMC2_DAT5, OMAP_MUX_MODE1 | OMAP_PIN_OUTPUT),
745 OMAP3_MUX(SDMMC2_DAT6, OMAP_MUX_MODE1 | OMAP_PIN_OUTPUT),
746 OMAP3_MUX(SDMMC2_DAT7, OMAP_MUX_MODE1 | OMAP_PIN_INPUT),
747
748 /* McSPI 1 */
749 OMAP3_MUX(MCSPI1_CLK, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
750 OMAP3_MUX(MCSPI1_SIMO, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
751 OMAP3_MUX(MCSPI1_SOMI, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
752 OMAP3_MUX(MCSPI1_CS0, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLDOWN),
753
754 /* McSPI 4 */
755 OMAP3_MUX(MCBSP1_CLKR, OMAP_MUX_MODE1 | OMAP_PIN_INPUT),
756 OMAP3_MUX(MCBSP1_DX, OMAP_MUX_MODE1 | OMAP_PIN_INPUT),
757 OMAP3_MUX(MCBSP1_DR, OMAP_MUX_MODE1 | OMAP_PIN_INPUT),
758 OMAP3_MUX(MCBSP1_FSX, OMAP_MUX_MODE1 | OMAP_PIN_INPUT_PULLUP),
759
760 /* McBSP 2 */
761 OMAP3_MUX(MCBSP2_FSX, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
762 OMAP3_MUX(MCBSP2_CLKX, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
763 OMAP3_MUX(MCBSP2_DR, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
764 OMAP3_MUX(MCBSP2_DX, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
765
766 /* serial ports */
767 OMAP3_MUX(MCBSP3_CLKX, OMAP_MUX_MODE1 | OMAP_PIN_OUTPUT),
768 OMAP3_MUX(MCBSP3_FSX, OMAP_MUX_MODE1 | OMAP_PIN_INPUT),
769 OMAP3_MUX(UART1_TX, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
770 OMAP3_MUX(UART1_RX, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
771
772 /* DSS */
773 OMAP3_MUX(DSS_PCLK, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
774 OMAP3_MUX(DSS_HSYNC, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
775 OMAP3_MUX(DSS_VSYNC, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
776 OMAP3_MUX(DSS_ACBIAS, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
777 OMAP3_MUX(DSS_DATA0, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
778 OMAP3_MUX(DSS_DATA1, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
779 OMAP3_MUX(DSS_DATA2, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
780 OMAP3_MUX(DSS_DATA3, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
781 OMAP3_MUX(DSS_DATA4, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
782 OMAP3_MUX(DSS_DATA5, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
783 OMAP3_MUX(DSS_DATA6, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
784 OMAP3_MUX(DSS_DATA7, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
785 OMAP3_MUX(DSS_DATA8, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
786 OMAP3_MUX(DSS_DATA9, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
787 OMAP3_MUX(DSS_DATA10, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
788 OMAP3_MUX(DSS_DATA11, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
789 OMAP3_MUX(DSS_DATA12, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
790 OMAP3_MUX(DSS_DATA13, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
791 OMAP3_MUX(DSS_DATA14, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
792 OMAP3_MUX(DSS_DATA15, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
793 OMAP3_MUX(DSS_DATA16, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
794 OMAP3_MUX(DSS_DATA17, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
795 OMAP3_MUX(DSS_DATA18, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
796 OMAP3_MUX(DSS_DATA19, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
797 OMAP3_MUX(DSS_DATA20, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
798 OMAP3_MUX(DSS_DATA21, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
799 OMAP3_MUX(DSS_DATA22, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
800 OMAP3_MUX(DSS_DATA23, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
801
802 /* display controls */
803 OMAP3_MUX(MCBSP1_FSR, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
804 OMAP3_MUX(GPMC_NCS7, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
805 OMAP3_MUX(GPMC_NCS3, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
806
807 /* TPS IRQ */
808 OMAP3_MUX(SYS_NIRQ, OMAP_MUX_MODE0 | OMAP_WAKEUP_EN | \
809 OMAP_PIN_INPUT_PULLUP),
810
811 { .reg_offset = OMAP_MUX_TERMINATOR },
812};
813
814static struct omap_musb_board_data musb_board_data = {
815 .interface_type = MUSB_INTERFACE_ULPI,
816 .mode = MUSB_OTG,
817 .power = 100,
818};
819
820static void __init cm_t35_init(void)
821{
822 omap3_mux_init(board_mux, OMAP_PACKAGE_CUS);
823 omap_serial_init();
824 cm_t35_init_i2c();
825 cm_t35_init_nand();
826 cm_t35_init_ads7846();
827 cm_t35_init_ethernet();
828 cm_t35_init_led();
829 cm_t35_init_display();
830
831 usb_musb_init(&musb_board_data);
832}
833
834MACHINE_START(CM_T35, "Compulab CM-T35")
835 .phys_io = 0x48000000,
836 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
837 .boot_params = 0x80000100,
838 .map_io = cm_t35_map_io,
839 .init_irq = cm_t35_init_irq,
840 .init_machine = cm_t35_init,
841 .timer = &omap_timer,
842MACHINE_END
diff --git a/arch/arm/mach-omap2/board-devkit8000.c b/arch/arm/mach-omap2/board-devkit8000.c
new file mode 100644
index 000000000000..47e3af2166d4
--- /dev/null
+++ b/arch/arm/mach-omap2/board-devkit8000.c
@@ -0,0 +1,676 @@
1/*
2 * board-devkit8000.c - TimLL Devkit8000
3 *
4 * Copyright (C) 2009 Kim Botherway
5 * Copyright (C) 2010 Thomas Weber
6 *
7 * Modified from mach-omap2/board-omap3beagle.c
8 *
9 * Initial code: Syed Mohammed Khasim
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
14 */
15
16#include <linux/kernel.h>
17#include <linux/init.h>
18#include <linux/platform_device.h>
19#include <linux/delay.h>
20#include <linux/err.h>
21#include <linux/clk.h>
22#include <linux/io.h>
23#include <linux/leds.h>
24#include <linux/gpio.h>
25#include <linux/input.h>
26#include <linux/gpio_keys.h>
27
28#include <linux/mtd/mtd.h>
29#include <linux/mtd/partitions.h>
30#include <linux/mtd/nand.h>
31
32#include <linux/regulator/machine.h>
33#include <linux/i2c/twl.h>
34
35#include <mach/hardware.h>
36#include <asm/mach-types.h>
37#include <asm/mach/arch.h>
38#include <asm/mach/map.h>
39#include <asm/mach/flash.h>
40
41#include <plat/board.h>
42#include <plat/common.h>
43#include <plat/gpmc.h>
44#include <plat/nand.h>
45#include <plat/usb.h>
46#include <plat/timer-gp.h>
47#include <plat/display.h>
48
49#include <plat/mcspi.h>
50#include <linux/input/matrix_keypad.h>
51#include <linux/spi/spi.h>
52#include <linux/spi/ads7846.h>
53#include <linux/dm9000.h>
54#include <linux/interrupt.h>
55
56#include "sdram-micron-mt46h32m32lf-6.h"
57
58#include "mux.h"
59#include "hsmmc.h"
60
61#define GPMC_CS0_BASE 0x60
62#define GPMC_CS_SIZE 0x30
63
64#define NAND_BLOCK_SIZE SZ_128K
65
66#define OMAP_DM9000_GPIO_IRQ 25
67#define OMAP3_DEVKIT_TS_GPIO 27
68
69static struct mtd_partition devkit8000_nand_partitions[] = {
70 /* All the partition sizes are listed in terms of NAND block size */
71 {
72 .name = "X-Loader",
73 .offset = 0,
74 .size = 4 * NAND_BLOCK_SIZE,
75 .mask_flags = MTD_WRITEABLE, /* force read-only */
76 },
77 {
78 .name = "U-Boot",
79 .offset = MTDPART_OFS_APPEND, /* Offset = 0x80000 */
80 .size = 15 * NAND_BLOCK_SIZE,
81 .mask_flags = MTD_WRITEABLE, /* force read-only */
82 },
83 {
84 .name = "U-Boot Env",
85 .offset = MTDPART_OFS_APPEND, /* Offset = 0x260000 */
86 .size = 1 * NAND_BLOCK_SIZE,
87 },
88 {
89 .name = "Kernel",
90 .offset = MTDPART_OFS_APPEND, /* Offset = 0x280000 */
91 .size = 32 * NAND_BLOCK_SIZE,
92 },
93 {
94 .name = "File System",
95 .offset = MTDPART_OFS_APPEND, /* Offset = 0x680000 */
96 .size = MTDPART_SIZ_FULL,
97 },
98};
99
100static struct omap_nand_platform_data devkit8000_nand_data = {
101 .options = NAND_BUSWIDTH_16,
102 .parts = devkit8000_nand_partitions,
103 .nr_parts = ARRAY_SIZE(devkit8000_nand_partitions),
104 .dma_channel = -1, /* disable DMA in OMAP NAND driver */
105};
106
107static struct resource devkit8000_nand_resource = {
108 .flags = IORESOURCE_MEM,
109};
110
111static struct platform_device devkit8000_nand_device = {
112 .name = "omap2-nand",
113 .id = -1,
114 .dev = {
115 .platform_data = &devkit8000_nand_data,
116 },
117 .num_resources = 1,
118 .resource = &devkit8000_nand_resource,
119};
120
121static struct omap2_hsmmc_info mmc[] = {
122 {
123 .mmc = 1,
124 .wires = 8,
125 .gpio_wp = 29,
126 },
127 {} /* Terminator */
128};
129static struct omap_board_config_kernel devkit8000_config[] __initdata = {
130};
131
132static int devkit8000_panel_enable_lcd(struct omap_dss_device *dssdev)
133{
134 twl_i2c_write_u8(TWL4030_MODULE_GPIO, 0x80, REG_GPIODATADIR1);
135 twl_i2c_write_u8(TWL4030_MODULE_LED, 0x0, 0x0);
136
137 return 0;
138}
139
140static void devkit8000_panel_disable_lcd(struct omap_dss_device *dssdev)
141{
142}
143static int devkit8000_panel_enable_dvi(struct omap_dss_device *dssdev)
144{
145 return 0;
146}
147
148static void devkit8000_panel_disable_dvi(struct omap_dss_device *dssdev)
149{
150}
151
152static int devkit8000_panel_enable_tv(struct omap_dss_device *dssdev)
153{
154
155 return 0;
156}
157
158static void devkit8000_panel_disable_tv(struct omap_dss_device *dssdev)
159{
160}
161
162
163static struct regulator_consumer_supply devkit8000_vmmc1_supply = {
164 .supply = "vmmc",
165};
166
167static struct regulator_consumer_supply devkit8000_vsim_supply = {
168 .supply = "vmmc_aux",
169};
170
171
172static struct omap_dss_device devkit8000_lcd_device = {
173 .name = "lcd",
174 .driver_name = "innolux_at_panel",
175 .type = OMAP_DISPLAY_TYPE_DPI,
176 .phy.dpi.data_lines = 24,
177 .platform_enable = devkit8000_panel_enable_lcd,
178 .platform_disable = devkit8000_panel_disable_lcd,
179};
180static struct omap_dss_device devkit8000_dvi_device = {
181 .name = "dvi",
182 .driver_name = "generic_panel",
183 .type = OMAP_DISPLAY_TYPE_DPI,
184 .phy.dpi.data_lines = 24,
185 .platform_enable = devkit8000_panel_enable_dvi,
186 .platform_disable = devkit8000_panel_disable_dvi,
187};
188
189static struct omap_dss_device devkit8000_tv_device = {
190 .name = "tv",
191 .driver_name = "venc",
192 .type = OMAP_DISPLAY_TYPE_VENC,
193 .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
194 .platform_enable = devkit8000_panel_enable_tv,
195 .platform_disable = devkit8000_panel_disable_tv,
196};
197
198
199static struct omap_dss_device *devkit8000_dss_devices[] = {
200 &devkit8000_lcd_device,
201 &devkit8000_dvi_device,
202 &devkit8000_tv_device,
203};
204
205static struct omap_dss_board_info devkit8000_dss_data = {
206 .num_devices = ARRAY_SIZE(devkit8000_dss_devices),
207 .devices = devkit8000_dss_devices,
208 .default_device = &devkit8000_lcd_device,
209};
210
211static struct platform_device devkit8000_dss_device = {
212 .name = "omapdss",
213 .id = -1,
214 .dev = {
215 .platform_data = &devkit8000_dss_data,
216 },
217};
218
219static struct regulator_consumer_supply devkit8000_vdda_dac_supply = {
220 .supply = "vdda_dac",
221 .dev = &devkit8000_dss_device.dev,
222};
223
224static int board_keymap[] = {
225 KEY(0, 0, KEY_1),
226 KEY(1, 0, KEY_2),
227 KEY(2, 0, KEY_3),
228 KEY(0, 1, KEY_4),
229 KEY(1, 1, KEY_5),
230 KEY(2, 1, KEY_6),
231 KEY(3, 1, KEY_F5),
232 KEY(0, 2, KEY_7),
233 KEY(1, 2, KEY_8),
234 KEY(2, 2, KEY_9),
235 KEY(3, 2, KEY_F6),
236 KEY(0, 3, KEY_F7),
237 KEY(1, 3, KEY_0),
238 KEY(2, 3, KEY_F8),
239 PERSISTENT_KEY(4, 5),
240 KEY(4, 4, KEY_VOLUMEUP),
241 KEY(5, 5, KEY_VOLUMEDOWN),
242 0
243};
244
245static struct matrix_keymap_data board_map_data = {
246 .keymap = board_keymap,
247 .keymap_size = ARRAY_SIZE(board_keymap),
248};
249
250static struct twl4030_keypad_data devkit8000_kp_data = {
251 .keymap_data = &board_map_data,
252 .rows = 6,
253 .cols = 6,
254 .rep = 1,
255};
256
257static struct gpio_led gpio_leds[];
258
259static int devkit8000_twl_gpio_setup(struct device *dev,
260 unsigned gpio, unsigned ngpio)
261{
262 omap_mux_init_gpio(29, OMAP_PIN_INPUT);
263 /* gpio + 0 is "mmc0_cd" (input/IRQ) */
264 mmc[0].gpio_cd = gpio + 0;
265 omap2_hsmmc_init(mmc);
266
267 /* link regulators to MMC adapters */
268 devkit8000_vmmc1_supply.dev = mmc[0].dev;
269 devkit8000_vsim_supply.dev = mmc[0].dev;
270
271 return 0;
272}
273
274static struct twl4030_gpio_platform_data devkit8000_gpio_data = {
275 .gpio_base = OMAP_MAX_GPIO_LINES,
276 .irq_base = TWL4030_GPIO_IRQ_BASE,
277 .irq_end = TWL4030_GPIO_IRQ_END,
278 .use_leds = true,
279 .pullups = BIT(1),
280 .pulldowns = BIT(2) | BIT(6) | BIT(7) | BIT(8) | BIT(13)
281 | BIT(15) | BIT(16) | BIT(17),
282 .setup = devkit8000_twl_gpio_setup,
283};
284
285static struct regulator_consumer_supply devkit8000_vpll2_supplies[] = {
286 {
287 .supply = "vdvi",
288 .dev = &devkit8000_lcd_device.dev,
289 },
290 {
291 .supply = "vdds_dsi",
292 .dev = &devkit8000_dss_device.dev,
293 }
294};
295
296/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
297static struct regulator_init_data devkit8000_vmmc1 = {
298 .constraints = {
299 .min_uV = 1850000,
300 .max_uV = 3150000,
301 .valid_modes_mask = REGULATOR_MODE_NORMAL
302 | REGULATOR_MODE_STANDBY,
303 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
304 | REGULATOR_CHANGE_MODE
305 | REGULATOR_CHANGE_STATUS,
306 },
307 .num_consumer_supplies = 1,
308 .consumer_supplies = &devkit8000_vmmc1_supply,
309};
310
311/* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
312static struct regulator_init_data devkit8000_vsim = {
313 .constraints = {
314 .min_uV = 1800000,
315 .max_uV = 3000000,
316 .valid_modes_mask = REGULATOR_MODE_NORMAL
317 | REGULATOR_MODE_STANDBY,
318 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
319 | REGULATOR_CHANGE_MODE
320 | REGULATOR_CHANGE_STATUS,
321 },
322 .num_consumer_supplies = 1,
323 .consumer_supplies = &devkit8000_vsim_supply,
324};
325
326/* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */
327static struct regulator_init_data devkit8000_vdac = {
328 .constraints = {
329 .min_uV = 1800000,
330 .max_uV = 1800000,
331 .valid_modes_mask = REGULATOR_MODE_NORMAL
332 | REGULATOR_MODE_STANDBY,
333 .valid_ops_mask = REGULATOR_CHANGE_MODE
334 | REGULATOR_CHANGE_STATUS,
335 },
336 .num_consumer_supplies = 1,
337 .consumer_supplies = &devkit8000_vdda_dac_supply,
338};
339
340/* VPLL2 for digital video outputs */
341static struct regulator_init_data devkit8000_vpll2 = {
342 .constraints = {
343 .name = "VDVI",
344 .min_uV = 1800000,
345 .max_uV = 1800000,
346 .valid_modes_mask = REGULATOR_MODE_NORMAL
347 | REGULATOR_MODE_STANDBY,
348 .valid_ops_mask = REGULATOR_CHANGE_MODE
349 | REGULATOR_CHANGE_STATUS,
350 },
351 .num_consumer_supplies = ARRAY_SIZE(devkit8000_vpll2_supplies),
352 .consumer_supplies = devkit8000_vpll2_supplies,
353};
354
355static struct twl4030_usb_data devkit8000_usb_data = {
356 .usb_mode = T2_USB_MODE_ULPI,
357};
358
359static struct twl4030_codec_audio_data devkit8000_audio_data = {
360 .audio_mclk = 26000000,
361};
362
363static struct twl4030_codec_data devkit8000_codec_data = {
364 .audio_mclk = 26000000,
365 .audio = &devkit8000_audio_data,
366};
367
368static struct twl4030_platform_data devkit8000_twldata = {
369 .irq_base = TWL4030_IRQ_BASE,
370 .irq_end = TWL4030_IRQ_END,
371
372 /* platform_data for children goes here */
373 .usb = &devkit8000_usb_data,
374 .gpio = &devkit8000_gpio_data,
375 .codec = &devkit8000_codec_data,
376 .vmmc1 = &devkit8000_vmmc1,
377 .vsim = &devkit8000_vsim,
378 .vdac = &devkit8000_vdac,
379 .vpll2 = &devkit8000_vpll2,
380 .keypad = &devkit8000_kp_data,
381};
382
383static struct i2c_board_info __initdata devkit8000_i2c_boardinfo[] = {
384 {
385 I2C_BOARD_INFO("twl4030", 0x48),
386 .flags = I2C_CLIENT_WAKE,
387 .irq = INT_34XX_SYS_NIRQ,
388 .platform_data = &devkit8000_twldata,
389 },
390};
391
392static int __init devkit8000_i2c_init(void)
393{
394 omap_register_i2c_bus(1, 2600, devkit8000_i2c_boardinfo,
395 ARRAY_SIZE(devkit8000_i2c_boardinfo));
396 /* Bus 3 is attached to the DVI port where devices like the pico DLP
397 * projector don't work reliably with 400kHz */
398 omap_register_i2c_bus(3, 400, NULL, 0);
399 return 0;
400}
401
402static struct gpio_led gpio_leds[] = {
403 {
404 .name = "led1",
405 .default_trigger = "heartbeat",
406 .gpio = 186,
407 .active_low = true,
408 },
409 {
410 .name = "led2",
411 .default_trigger = "mmc0",
412 .gpio = 163,
413 .active_low = true,
414 },
415 {
416 .name = "ledB",
417 .default_trigger = "none",
418 .gpio = 153,
419 .active_low = true,
420 },
421 {
422 .name = "led3",
423 .default_trigger = "none",
424 .gpio = 164,
425 .active_low = true,
426 },
427};
428
429static struct gpio_led_platform_data gpio_led_info = {
430 .leds = gpio_leds,
431 .num_leds = ARRAY_SIZE(gpio_leds),
432};
433
434static struct platform_device leds_gpio = {
435 .name = "leds-gpio",
436 .id = -1,
437 .dev = {
438 .platform_data = &gpio_led_info,
439 },
440};
441
442static struct gpio_keys_button gpio_buttons[] = {
443 {
444 .code = BTN_EXTRA,
445 .gpio = 26,
446 .desc = "user",
447 .wakeup = 1,
448 },
449};
450
451static struct gpio_keys_platform_data gpio_key_info = {
452 .buttons = gpio_buttons,
453 .nbuttons = ARRAY_SIZE(gpio_buttons),
454};
455
456static struct platform_device keys_gpio = {
457 .name = "gpio-keys",
458 .id = -1,
459 .dev = {
460 .platform_data = &gpio_key_info,
461 },
462};
463
464
465static void __init devkit8000_init_irq(void)
466{
467 omap_board_config = devkit8000_config;
468 omap_board_config_size = ARRAY_SIZE(devkit8000_config);
469 omap2_init_common_hw(mt46h32m32lf6_sdrc_params,
470 mt46h32m32lf6_sdrc_params);
471 omap_init_irq();
472#ifdef CONFIG_OMAP_32K_TIMER
473 omap2_gp_clockevent_set_gptimer(12);
474#endif
475 omap_gpio_init();
476}
477
478static void __init devkit8000_ads7846_init(void)
479{
480 int gpio = OMAP3_DEVKIT_TS_GPIO;
481 int ret;
482
483 ret = gpio_request(gpio, "ads7846_pen_down");
484 if (ret < 0) {
485 printk(KERN_ERR "Failed to request GPIO %d for "
486 "ads7846 pen down IRQ\n", gpio);
487 return;
488 }
489
490 gpio_direction_input(gpio);
491}
492
493static int ads7846_get_pendown_state(void)
494{
495 return !gpio_get_value(OMAP3_DEVKIT_TS_GPIO);
496}
497
498static struct ads7846_platform_data ads7846_config = {
499 .x_max = 0x0fff,
500 .y_max = 0x0fff,
501 .x_plate_ohms = 180,
502 .pressure_max = 255,
503 .debounce_max = 10,
504 .debounce_tol = 5,
505 .debounce_rep = 1,
506 .get_pendown_state = ads7846_get_pendown_state,
507 .keep_vref_on = 1,
508 .settle_delay_usecs = 150,
509};
510
511static struct omap2_mcspi_device_config ads7846_mcspi_config = {
512 .turbo_mode = 0,
513 .single_channel = 1, /* 0: slave, 1: master */
514};
515
516static struct spi_board_info devkit8000_spi_board_info[] __initdata = {
517 {
518 .modalias = "ads7846",
519 .bus_num = 2,
520 .chip_select = 0,
521 .max_speed_hz = 1500000,
522 .controller_data = &ads7846_mcspi_config,
523 .irq = OMAP_GPIO_IRQ(OMAP3_DEVKIT_TS_GPIO),
524 .platform_data = &ads7846_config,
525 }
526};
527
528#define OMAP_DM9000_BASE 0x2c000000
529
530static struct resource omap_dm9000_resources[] = {
531 [0] = {
532 .start = OMAP_DM9000_BASE,
533 .end = (OMAP_DM9000_BASE + 0x4 - 1),
534 .flags = IORESOURCE_MEM,
535 },
536 [1] = {
537 .start = (OMAP_DM9000_BASE + 0x400),
538 .end = (OMAP_DM9000_BASE + 0x400 + 0x4 - 1),
539 .flags = IORESOURCE_MEM,
540 },
541 [2] = {
542 .start = OMAP_GPIO_IRQ(OMAP_DM9000_GPIO_IRQ),
543 .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW,
544 },
545};
546
547static struct dm9000_plat_data omap_dm9000_platdata = {
548 .flags = DM9000_PLATF_16BITONLY,
549};
550
551static struct platform_device omap_dm9000_dev = {
552 .name = "dm9000",
553 .id = -1,
554 .num_resources = ARRAY_SIZE(omap_dm9000_resources),
555 .resource = omap_dm9000_resources,
556 .dev = {
557 .platform_data = &omap_dm9000_platdata,
558 },
559};
560
561static void __init omap_dm9000_init(void)
562{
563 if (gpio_request(OMAP_DM9000_GPIO_IRQ, "dm9000 irq") < 0) {
564 printk(KERN_ERR "Failed to request GPIO%d for dm9000 IRQ\n",
565 OMAP_DM9000_GPIO_IRQ);
566 return;
567 }
568
569 gpio_direction_input(OMAP_DM9000_GPIO_IRQ);
570}
571
572static struct platform_device *devkit8000_devices[] __initdata = {
573 &devkit8000_dss_device,
574 &leds_gpio,
575 &keys_gpio,
576 &omap_dm9000_dev,
577};
578
579static void __init devkit8000_flash_init(void)
580{
581 u8 cs = 0;
582 u8 nandcs = GPMC_CS_NUM + 1;
583
584 u32 gpmc_base_add = OMAP34XX_GPMC_VIRT;
585
586 /* find out the chip-select on which NAND exists */
587 while (cs < GPMC_CS_NUM) {
588 u32 ret = 0;
589 ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1);
590
591 if ((ret & 0xC00) == 0x800) {
592 printk(KERN_INFO "Found NAND on CS%d\n", cs);
593 if (nandcs > GPMC_CS_NUM)
594 nandcs = cs;
595 }
596 cs++;
597 }
598
599 if (nandcs > GPMC_CS_NUM) {
600 printk(KERN_INFO "NAND: Unable to find configuration "
601 "in GPMC\n ");
602 return;
603 }
604
605 if (nandcs < GPMC_CS_NUM) {
606 devkit8000_nand_data.cs = nandcs;
607 devkit8000_nand_data.gpmc_cs_baseaddr = (void *)
608 (gpmc_base_add + GPMC_CS0_BASE + nandcs * GPMC_CS_SIZE);
609 devkit8000_nand_data.gpmc_baseaddr = (void *)
610 (gpmc_base_add);
611
612 printk(KERN_INFO "Registering NAND on CS%d\n", nandcs);
613 if (platform_device_register(&devkit8000_nand_device) < 0)
614 printk(KERN_ERR "Unable to register NAND device\n");
615 }
616}
617
618static struct omap_musb_board_data musb_board_data = {
619 .interface_type = MUSB_INTERFACE_ULPI,
620 .mode = MUSB_OTG,
621 .power = 100,
622};
623
624static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
625
626 .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
627 .port_mode[1] = EHCI_HCD_OMAP_MODE_UNKNOWN,
628 .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
629
630 .phy_reset = true,
631 .reset_gpio_port[0] = -EINVAL,
632 .reset_gpio_port[1] = -EINVAL,
633 .reset_gpio_port[2] = -EINVAL
634};
635
636static void __init devkit8000_init(void)
637{
638 omap_serial_init();
639
640 omap_dm9000_init();
641
642 devkit8000_i2c_init();
643 platform_add_devices(devkit8000_devices,
644 ARRAY_SIZE(devkit8000_devices));
645 omap_board_config = devkit8000_config;
646 omap_board_config_size = ARRAY_SIZE(devkit8000_config);
647
648 spi_register_board_info(devkit8000_spi_board_info,
649 ARRAY_SIZE(devkit8000_spi_board_info));
650
651 devkit8000_ads7846_init();
652
653 usb_musb_init(&musb_board_data);
654 usb_ehci_init(&ehci_pdata);
655 devkit8000_flash_init();
656
657 /* Ensure SDRC pins are mux'd for self-refresh */
658 omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
659 omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
660}
661
662static void __init devkit8000_map_io(void)
663{
664 omap2_set_globals_343x();
665 omap34xx_map_common_io();
666}
667
668MACHINE_START(DEVKIT8000, "OMAP3 Devkit8000")
669 .phys_io = 0x48000000,
670 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
671 .boot_params = 0x80000100,
672 .map_io = devkit8000_map_io,
673 .init_irq = devkit8000_init_irq,
674 .init_machine = devkit8000_init,
675 .timer = &omap_timer,
676MACHINE_END
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c
index 2e09a1c444cb..16cc06860670 100644
--- a/arch/arm/mach-omap2/board-generic.c
+++ b/arch/arm/mach-omap2/board-generic.c
@@ -26,10 +26,10 @@
26#include <asm/mach/map.h> 26#include <asm/mach/map.h>
27 27
28#include <mach/gpio.h> 28#include <mach/gpio.h>
29#include <mach/mux.h> 29#include <plat/mux.h>
30#include <mach/usb.h> 30#include <plat/usb.h>
31#include <mach/board.h> 31#include <plat/board.h>
32#include <mach/common.h> 32#include <plat/common.h>
33 33
34static struct omap_board_config_kernel generic_config[] = { 34static struct omap_board_config_kernel generic_config[] = {
35}; 35};
@@ -50,13 +50,13 @@ static void __init omap_generic_init(void)
50static void __init omap_generic_map_io(void) 50static void __init omap_generic_map_io(void)
51{ 51{
52 omap2_set_globals_242x(); /* should be 242x, 243x, or 343x */ 52 omap2_set_globals_242x(); /* should be 242x, 243x, or 343x */
53 omap2_map_common_io(); 53 omap242x_map_common_io();
54} 54}
55 55
56MACHINE_START(OMAP_GENERIC, "Generic OMAP24xx") 56MACHINE_START(OMAP_GENERIC, "Generic OMAP24xx")
57 /* Maintainer: Paul Mundt <paul.mundt@nokia.com> */ 57 /* Maintainer: Paul Mundt <paul.mundt@nokia.com> */
58 .phys_io = 0x48000000, 58 .phys_io = 0x48000000,
59 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, 59 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
60 .boot_params = 0x80000100, 60 .boot_params = 0x80000100,
61 .map_io = omap_generic_map_io, 61 .map_io = omap_generic_map_io,
62 .init_irq = omap_generic_init_irq, 62 .init_irq = omap_generic_init_irq,
diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c
index eaa02d012c5c..0665f2c8dc8e 100644
--- a/arch/arm/mach-omap2/board-h4.c
+++ b/arch/arm/mach-omap2/board-h4.c
@@ -16,6 +16,7 @@
16#include <linux/platform_device.h> 16#include <linux/platform_device.h>
17#include <linux/mtd/mtd.h> 17#include <linux/mtd/mtd.h>
18#include <linux/mtd/partitions.h> 18#include <linux/mtd/partitions.h>
19#include <linux/mtd/physmap.h>
19#include <linux/delay.h> 20#include <linux/delay.h>
20#include <linux/workqueue.h> 21#include <linux/workqueue.h>
21#include <linux/i2c.h> 22#include <linux/i2c.h>
@@ -29,18 +30,17 @@
29#include <asm/mach-types.h> 30#include <asm/mach-types.h>
30#include <asm/mach/arch.h> 31#include <asm/mach/arch.h>
31#include <asm/mach/map.h> 32#include <asm/mach/map.h>
32#include <asm/mach/flash.h>
33 33
34#include <mach/control.h> 34#include <plat/control.h>
35#include <mach/gpio.h> 35#include <mach/gpio.h>
36#include <mach/mux.h> 36#include <plat/mux.h>
37#include <mach/usb.h> 37#include <plat/usb.h>
38#include <mach/board.h> 38#include <plat/board.h>
39#include <mach/common.h> 39#include <plat/common.h>
40#include <mach/keypad.h> 40#include <plat/keypad.h>
41#include <mach/menelaus.h> 41#include <plat/menelaus.h>
42#include <mach/dma.h> 42#include <plat/dma.h>
43#include <mach/gpmc.h> 43#include <plat/gpmc.h>
44 44
45#define H4_FLASH_CS 0 45#define H4_FLASH_CS 0
46#define H4_SMC91X_CS 1 46#define H4_SMC91X_CS 1
@@ -115,8 +115,7 @@ static struct mtd_partition h4_partitions[] = {
115 } 115 }
116}; 116};
117 117
118static struct flash_platform_data h4_flash_data = { 118static struct physmap_flash_data h4_flash_data = {
119 .map_name = "cfi_probe",
120 .width = 2, 119 .width = 2,
121 .parts = h4_partitions, 120 .parts = h4_partitions,
122 .nr_parts = ARRAY_SIZE(h4_partitions), 121 .nr_parts = ARRAY_SIZE(h4_partitions),
@@ -127,7 +126,7 @@ static struct resource h4_flash_resource = {
127}; 126};
128 127
129static struct platform_device h4_flash_device = { 128static struct platform_device h4_flash_device = {
130 .name = "omapflash", 129 .name = "physmap-flash",
131 .id = 0, 130 .id = 0,
132 .dev = { 131 .dev = {
133 .platform_data = &h4_flash_data, 132 .platform_data = &h4_flash_data,
@@ -370,13 +369,13 @@ static void __init omap_h4_init(void)
370static void __init omap_h4_map_io(void) 369static void __init omap_h4_map_io(void)
371{ 370{
372 omap2_set_globals_242x(); 371 omap2_set_globals_242x();
373 omap2_map_common_io(); 372 omap242x_map_common_io();
374} 373}
375 374
376MACHINE_START(OMAP_H4, "OMAP2420 H4 board") 375MACHINE_START(OMAP_H4, "OMAP2420 H4 board")
377 /* Maintainer: Paul Mundt <paul.mundt@nokia.com> */ 376 /* Maintainer: Paul Mundt <paul.mundt@nokia.com> */
378 .phys_io = 0x48000000, 377 .phys_io = 0x48000000,
379 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, 378 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
380 .boot_params = 0x80000100, 379 .boot_params = 0x80000100,
381 .map_io = omap_h4_map_io, 380 .map_io = omap_h4_map_io,
382 .init_irq = omap_h4_init_irq, 381 .init_irq = omap_h4_init_irq,
diff --git a/arch/arm/mach-omap2/board-igep0020.c b/arch/arm/mach-omap2/board-igep0020.c
new file mode 100644
index 000000000000..d55c57b761a9
--- /dev/null
+++ b/arch/arm/mach-omap2/board-igep0020.c
@@ -0,0 +1,549 @@
1/*
2 * Copyright (C) 2009 Integration Software and Electronic Engineering.
3 *
4 * Modified from mach-omap2/board-generic.c
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/platform_device.h>
14#include <linux/delay.h>
15#include <linux/err.h>
16#include <linux/clk.h>
17#include <linux/io.h>
18#include <linux/gpio.h>
19#include <linux/interrupt.h>
20
21#include <linux/regulator/machine.h>
22#include <linux/i2c/twl.h>
23
24#include <asm/mach-types.h>
25#include <asm/mach/arch.h>
26
27#include <plat/board.h>
28#include <plat/common.h>
29#include <plat/gpmc.h>
30#include <plat/usb.h>
31#include <plat/display.h>
32#include <plat/onenand.h>
33
34#include "mux.h"
35#include "hsmmc.h"
36#include "sdram-numonyx-m65kxxxxam.h"
37
38#define IGEP2_SMSC911X_CS 5
39#define IGEP2_SMSC911X_GPIO 176
40#define IGEP2_GPIO_USBH_NRESET 24
41#define IGEP2_GPIO_LED0_GREEN 26
42#define IGEP2_GPIO_LED0_RED 27
43#define IGEP2_GPIO_LED1_RED 28
44#define IGEP2_GPIO_DVI_PUP 170
45#define IGEP2_GPIO_WIFI_NPD 94
46#define IGEP2_GPIO_WIFI_NRESET 95
47
48#if defined(CONFIG_MTD_ONENAND_OMAP2) || \
49 defined(CONFIG_MTD_ONENAND_OMAP2_MODULE)
50
51#define ONENAND_MAP 0x20000000
52
53/* NAND04GR4E1A ( x2 Flash built-in COMBO POP MEMORY )
54 * Since the device is equipped with two DataRAMs, and two-plane NAND
55 * Flash memory array, these two component enables simultaneous program
56 * of 4KiB. Plane1 has only even blocks such as block0, block2, block4
57 * while Plane2 has only odd blocks such as block1, block3, block5.
58 * So MTD regards it as 4KiB page size and 256KiB block size 64*(2*2048)
59 */
60
61static struct mtd_partition igep2_onenand_partitions[] = {
62 {
63 .name = "X-Loader",
64 .offset = 0,
65 .size = 2 * (64*(2*2048))
66 },
67 {
68 .name = "U-Boot",
69 .offset = MTDPART_OFS_APPEND,
70 .size = 6 * (64*(2*2048)),
71 },
72 {
73 .name = "Environment",
74 .offset = MTDPART_OFS_APPEND,
75 .size = 2 * (64*(2*2048)),
76 },
77 {
78 .name = "Kernel",
79 .offset = MTDPART_OFS_APPEND,
80 .size = 12 * (64*(2*2048)),
81 },
82 {
83 .name = "File System",
84 .offset = MTDPART_OFS_APPEND,
85 .size = MTDPART_SIZ_FULL,
86 },
87};
88
89static int igep2_onenand_setup(void __iomem *onenand_base, int freq)
90{
91 /* nothing is required to be setup for onenand as of now */
92 return 0;
93}
94
95static struct omap_onenand_platform_data igep2_onenand_data = {
96 .parts = igep2_onenand_partitions,
97 .nr_parts = ARRAY_SIZE(igep2_onenand_partitions),
98 .onenand_setup = igep2_onenand_setup,
99 .dma_channel = -1, /* disable DMA in OMAP OneNAND driver */
100};
101
102static struct platform_device igep2_onenand_device = {
103 .name = "omap2-onenand",
104 .id = -1,
105 .dev = {
106 .platform_data = &igep2_onenand_data,
107 },
108};
109
110void __init igep2_flash_init(void)
111{
112 u8 cs = 0;
113 u8 onenandcs = GPMC_CS_NUM + 1;
114
115 while (cs < GPMC_CS_NUM) {
116 u32 ret = 0;
117 ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1);
118
119 /* Check if NAND/oneNAND is configured */
120 if ((ret & 0xC00) == 0x800)
121 /* NAND found */
122 pr_err("IGEP v2: Unsupported NAND found\n");
123 else {
124 ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7);
125 if ((ret & 0x3F) == (ONENAND_MAP >> 24))
126 /* ONENAND found */
127 onenandcs = cs;
128 }
129 cs++;
130 }
131 if (onenandcs > GPMC_CS_NUM) {
132 pr_err("IGEP v2: Unable to find configuration in GPMC\n");
133 return;
134 }
135
136 if (onenandcs < GPMC_CS_NUM) {
137 igep2_onenand_data.cs = onenandcs;
138 if (platform_device_register(&igep2_onenand_device) < 0)
139 pr_err("IGEP v2: Unable to register OneNAND device\n");
140 }
141}
142
143#else
144void __init igep2_flash_init(void) {}
145#endif
146
147#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
148
149#include <linux/smsc911x.h>
150
151static struct smsc911x_platform_config igep2_smsc911x_config = {
152 .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
153 .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN,
154 .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS ,
155 .phy_interface = PHY_INTERFACE_MODE_MII,
156};
157
158static struct resource igep2_smsc911x_resources[] = {
159 {
160 .flags = IORESOURCE_MEM,
161 },
162 {
163 .start = OMAP_GPIO_IRQ(IGEP2_SMSC911X_GPIO),
164 .end = OMAP_GPIO_IRQ(IGEP2_SMSC911X_GPIO),
165 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
166 },
167};
168
169static struct platform_device igep2_smsc911x_device = {
170 .name = "smsc911x",
171 .id = 0,
172 .num_resources = ARRAY_SIZE(igep2_smsc911x_resources),
173 .resource = igep2_smsc911x_resources,
174 .dev = {
175 .platform_data = &igep2_smsc911x_config,
176 },
177};
178
179static inline void __init igep2_init_smsc911x(void)
180{
181 unsigned long cs_mem_base;
182
183 if (gpmc_cs_request(IGEP2_SMSC911X_CS, SZ_16M, &cs_mem_base) < 0) {
184 pr_err("IGEP v2: Failed request for GPMC mem for smsc911x\n");
185 gpmc_cs_free(IGEP2_SMSC911X_CS);
186 return;
187 }
188
189 igep2_smsc911x_resources[0].start = cs_mem_base + 0x0;
190 igep2_smsc911x_resources[0].end = cs_mem_base + 0xff;
191
192 if ((gpio_request(IGEP2_SMSC911X_GPIO, "SMSC911X IRQ") == 0) &&
193 (gpio_direction_input(IGEP2_SMSC911X_GPIO) == 0)) {
194 gpio_export(IGEP2_SMSC911X_GPIO, 0);
195 } else {
196 pr_err("IGEP v2: Could not obtain gpio for for SMSC911X IRQ\n");
197 return;
198 }
199
200 platform_device_register(&igep2_smsc911x_device);
201}
202
203#else
204static inline void __init igep2_init_smsc911x(void) { }
205#endif
206
207static struct omap_board_config_kernel igep2_config[] __initdata = {
208};
209
210static struct regulator_consumer_supply igep2_vmmc1_supply = {
211 .supply = "vmmc",
212};
213
214static struct regulator_consumer_supply igep2_vmmc2_supply = {
215 .supply = "vmmc",
216};
217
218/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
219static struct regulator_init_data igep2_vmmc1 = {
220 .constraints = {
221 .min_uV = 1850000,
222 .max_uV = 3150000,
223 .valid_modes_mask = REGULATOR_MODE_NORMAL
224 | REGULATOR_MODE_STANDBY,
225 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
226 | REGULATOR_CHANGE_MODE
227 | REGULATOR_CHANGE_STATUS,
228 },
229 .num_consumer_supplies = 1,
230 .consumer_supplies = &igep2_vmmc1_supply,
231};
232
233/* VMMC2 for OMAP VDD_MMC2 (i/o) and MMC2 WIFI */
234static struct regulator_init_data igep2_vmmc2 = {
235 .constraints = {
236 .min_uV = 1850000,
237 .max_uV = 3150000,
238 .valid_modes_mask = REGULATOR_MODE_NORMAL
239 | REGULATOR_MODE_STANDBY,
240 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
241 | REGULATOR_CHANGE_MODE
242 | REGULATOR_CHANGE_STATUS,
243 },
244 .num_consumer_supplies = 1,
245 .consumer_supplies = &igep2_vmmc2_supply,
246};
247
248static struct omap2_hsmmc_info mmc[] = {
249 {
250 .mmc = 1,
251 .wires = 4,
252 .gpio_cd = -EINVAL,
253 .gpio_wp = -EINVAL,
254 },
255 {
256 .mmc = 2,
257 .wires = 4,
258 .gpio_cd = -EINVAL,
259 .gpio_wp = -EINVAL,
260 },
261 {} /* Terminator */
262};
263
264static int igep2_twl_gpio_setup(struct device *dev,
265 unsigned gpio, unsigned ngpio)
266{
267 /* gpio + 0 is "mmc0_cd" (input/IRQ) */
268 mmc[0].gpio_cd = gpio + 0;
269 omap2_hsmmc_init(mmc);
270
271 /* link regulators to MMC adapters ... we "know" the
272 * regulators will be set up only *after* we return.
273 */
274 igep2_vmmc1_supply.dev = mmc[0].dev;
275 igep2_vmmc2_supply.dev = mmc[1].dev;
276
277 return 0;
278};
279
280static struct twl4030_gpio_platform_data igep2_gpio_data = {
281 .gpio_base = OMAP_MAX_GPIO_LINES,
282 .irq_base = TWL4030_GPIO_IRQ_BASE,
283 .irq_end = TWL4030_GPIO_IRQ_END,
284 .use_leds = false,
285 .setup = igep2_twl_gpio_setup,
286};
287
288static struct twl4030_usb_data igep2_usb_data = {
289 .usb_mode = T2_USB_MODE_ULPI,
290};
291
292static int igep2_enable_dvi(struct omap_dss_device *dssdev)
293{
294 gpio_direction_output(IGEP2_GPIO_DVI_PUP, 1);
295
296 return 0;
297}
298
299static void igep2_disable_dvi(struct omap_dss_device *dssdev)
300{
301 gpio_direction_output(IGEP2_GPIO_DVI_PUP, 0);
302}
303
304static struct omap_dss_device igep2_dvi_device = {
305 .type = OMAP_DISPLAY_TYPE_DPI,
306 .name = "dvi",
307 .driver_name = "generic_panel",
308 .phy.dpi.data_lines = 24,
309 .platform_enable = igep2_enable_dvi,
310 .platform_disable = igep2_disable_dvi,
311};
312
313static struct omap_dss_device *igep2_dss_devices[] = {
314 &igep2_dvi_device
315};
316
317static struct omap_dss_board_info igep2_dss_data = {
318 .num_devices = ARRAY_SIZE(igep2_dss_devices),
319 .devices = igep2_dss_devices,
320 .default_device = &igep2_dvi_device,
321};
322
323static struct platform_device igep2_dss_device = {
324 .name = "omapdss",
325 .id = -1,
326 .dev = {
327 .platform_data = &igep2_dss_data,
328 },
329};
330
331static struct regulator_consumer_supply igep2_vpll2_supply = {
332 .supply = "vdds_dsi",
333 .dev = &igep2_dss_device.dev,
334};
335
336static struct regulator_init_data igep2_vpll2 = {
337 .constraints = {
338 .name = "VDVI",
339 .min_uV = 1800000,
340 .max_uV = 1800000,
341 .apply_uV = true,
342 .valid_modes_mask = REGULATOR_MODE_NORMAL
343 | REGULATOR_MODE_STANDBY,
344 .valid_ops_mask = REGULATOR_CHANGE_MODE
345 | REGULATOR_CHANGE_STATUS,
346 },
347 .num_consumer_supplies = 1,
348 .consumer_supplies = &igep2_vpll2_supply,
349};
350
351static void __init igep2_display_init(void)
352{
353 if (gpio_request(IGEP2_GPIO_DVI_PUP, "GPIO_DVI_PUP") &&
354 gpio_direction_output(IGEP2_GPIO_DVI_PUP, 1))
355 pr_err("IGEP v2: Could not obtain gpio GPIO_DVI_PUP\n");
356}
357
358#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
359#include <linux/leds.h>
360
361static struct gpio_led igep2_gpio_leds[] = {
362 {
363 .name = "led0:red",
364 .gpio = IGEP2_GPIO_LED0_RED,
365 },
366 {
367 .name = "led0:green",
368 .default_trigger = "heartbeat",
369 .gpio = IGEP2_GPIO_LED0_GREEN,
370 },
371 {
372 .name = "led1:red",
373 .gpio = IGEP2_GPIO_LED1_RED,
374 },
375};
376
377static struct gpio_led_platform_data igep2_led_pdata = {
378 .leds = igep2_gpio_leds,
379 .num_leds = ARRAY_SIZE(igep2_gpio_leds),
380};
381
382static struct platform_device igep2_led_device = {
383 .name = "leds-gpio",
384 .id = -1,
385 .dev = {
386 .platform_data = &igep2_led_pdata,
387 },
388};
389
390static void __init igep2_init_led(void)
391{
392 platform_device_register(&igep2_led_device);
393}
394
395#else
396static inline void igep2_init_led(void) {}
397#endif
398
399static struct platform_device *igep2_devices[] __initdata = {
400 &igep2_dss_device,
401};
402
403static void __init igep2_init_irq(void)
404{
405 omap_board_config = igep2_config;
406 omap_board_config_size = ARRAY_SIZE(igep2_config);
407 omap2_init_common_hw(m65kxxxxam_sdrc_params, m65kxxxxam_sdrc_params);
408 omap_init_irq();
409 omap_gpio_init();
410}
411
412static struct twl4030_codec_audio_data igep2_audio_data = {
413 .audio_mclk = 26000000,
414};
415
416static struct twl4030_codec_data igep2_codec_data = {
417 .audio_mclk = 26000000,
418 .audio = &igep2_audio_data,
419};
420
421static struct twl4030_platform_data igep2_twldata = {
422 .irq_base = TWL4030_IRQ_BASE,
423 .irq_end = TWL4030_IRQ_END,
424
425 /* platform_data for children goes here */
426 .usb = &igep2_usb_data,
427 .codec = &igep2_codec_data,
428 .gpio = &igep2_gpio_data,
429 .vmmc1 = &igep2_vmmc1,
430 .vmmc2 = &igep2_vmmc2,
431 .vpll2 = &igep2_vpll2,
432
433};
434
435static struct i2c_board_info __initdata igep2_i2c_boardinfo[] = {
436 {
437 I2C_BOARD_INFO("twl4030", 0x48),
438 .flags = I2C_CLIENT_WAKE,
439 .irq = INT_34XX_SYS_NIRQ,
440 .platform_data = &igep2_twldata,
441 },
442};
443
444static int __init igep2_i2c_init(void)
445{
446 omap_register_i2c_bus(1, 2600, igep2_i2c_boardinfo,
447 ARRAY_SIZE(igep2_i2c_boardinfo));
448 /* Bus 3 is attached to the DVI port where devices like the pico DLP
449 * projector don't work reliably with 400kHz */
450 omap_register_i2c_bus(3, 100, NULL, 0);
451 return 0;
452}
453
454static struct omap_musb_board_data musb_board_data = {
455 .interface_type = MUSB_INTERFACE_ULPI,
456 .mode = MUSB_OTG,
457 .power = 100,
458};
459
460static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
461 .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
462 .port_mode[1] = EHCI_HCD_OMAP_MODE_UNKNOWN,
463 .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
464
465 .phy_reset = true,
466 .reset_gpio_port[0] = IGEP2_GPIO_USBH_NRESET,
467 .reset_gpio_port[1] = -EINVAL,
468 .reset_gpio_port[2] = -EINVAL,
469};
470
471#ifdef CONFIG_OMAP_MUX
472static struct omap_board_mux board_mux[] __initdata = {
473 { .reg_offset = OMAP_MUX_TERMINATOR },
474};
475#else
476#define board_mux NULL
477#endif
478
479static void __init igep2_init(void)
480{
481 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
482 igep2_i2c_init();
483 platform_add_devices(igep2_devices, ARRAY_SIZE(igep2_devices));
484 omap_serial_init();
485 usb_musb_init(&musb_board_data);
486 usb_ehci_init(&ehci_pdata);
487
488 igep2_flash_init();
489 igep2_init_led();
490 igep2_display_init();
491 igep2_init_smsc911x();
492
493 /* GPIO userspace leds */
494#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE)
495 if ((gpio_request(IGEP2_GPIO_LED0_RED, "led0:red") == 0) &&
496 (gpio_direction_output(IGEP2_GPIO_LED0_RED, 1) == 0)) {
497 gpio_export(IGEP2_GPIO_LED0_RED, 0);
498 gpio_set_value(IGEP2_GPIO_LED0_RED, 0);
499 } else
500 pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_RED\n");
501
502 if ((gpio_request(IGEP2_GPIO_LED0_GREEN, "led0:green") == 0) &&
503 (gpio_direction_output(IGEP2_GPIO_LED0_GREEN, 1) == 0)) {
504 gpio_export(IGEP2_GPIO_LED0_GREEN, 0);
505 gpio_set_value(IGEP2_GPIO_LED0_GREEN, 0);
506 } else
507 pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_GREEN\n");
508
509 if ((gpio_request(IGEP2_GPIO_LED1_RED, "led1:red") == 0) &&
510 (gpio_direction_output(IGEP2_GPIO_LED1_RED, 1) == 0)) {
511 gpio_export(IGEP2_GPIO_LED1_RED, 0);
512 gpio_set_value(IGEP2_GPIO_LED1_RED, 0);
513 } else
514 pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_RED\n");
515#endif
516
517 /* GPIO W-LAN + Bluetooth combo module */
518 if ((gpio_request(IGEP2_GPIO_WIFI_NPD, "GPIO_WIFI_NPD") == 0) &&
519 (gpio_direction_output(IGEP2_GPIO_WIFI_NPD, 1) == 0)) {
520 gpio_export(IGEP2_GPIO_WIFI_NPD, 0);
521/* gpio_set_value(IGEP2_GPIO_WIFI_NPD, 0); */
522 } else
523 pr_warning("IGEP v2: Could not obtain gpio GPIO_WIFI_NPD\n");
524
525 if ((gpio_request(IGEP2_GPIO_WIFI_NRESET, "GPIO_WIFI_NRESET") == 0) &&
526 (gpio_direction_output(IGEP2_GPIO_WIFI_NRESET, 1) == 0)) {
527 gpio_export(IGEP2_GPIO_WIFI_NRESET, 0);
528 gpio_set_value(IGEP2_GPIO_WIFI_NRESET, 0);
529 udelay(10);
530 gpio_set_value(IGEP2_GPIO_WIFI_NRESET, 1);
531 } else
532 pr_warning("IGEP v2: Could not obtain gpio GPIO_WIFI_NRESET\n");
533}
534
535static void __init igep2_map_io(void)
536{
537 omap2_set_globals_343x();
538 omap34xx_map_common_io();
539}
540
541MACHINE_START(IGEP0020, "IGEP v2 board")
542 .phys_io = 0x48000000,
543 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
544 .boot_params = 0x80000100,
545 .map_io = igep2_map_io,
546 .init_irq = igep2_init_irq,
547 .init_machine = igep2_init,
548 .timer = &omap_timer,
549MACHINE_END
diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c
index d57ec2f4d0a9..5fcb52e71298 100644
--- a/arch/arm/mach-omap2/board-ldp.c
+++ b/arch/arm/mach-omap2/board-ldp.c
@@ -24,7 +24,7 @@
24#include <linux/spi/spi.h> 24#include <linux/spi/spi.h>
25#include <linux/spi/ads7846.h> 25#include <linux/spi/ads7846.h>
26#include <linux/regulator/machine.h> 26#include <linux/regulator/machine.h>
27#include <linux/i2c/twl4030.h> 27#include <linux/i2c/twl.h>
28#include <linux/io.h> 28#include <linux/io.h>
29#include <linux/smsc911x.h> 29#include <linux/smsc911x.h>
30 30
@@ -33,17 +33,18 @@
33#include <asm/mach/arch.h> 33#include <asm/mach/arch.h>
34#include <asm/mach/map.h> 34#include <asm/mach/map.h>
35 35
36#include <mach/mcspi.h> 36#include <plat/mcspi.h>
37#include <mach/gpio.h> 37#include <mach/gpio.h>
38#include <mach/board.h> 38#include <plat/board.h>
39#include <mach/common.h> 39#include <plat/common.h>
40#include <mach/gpmc.h> 40#include <plat/gpmc.h>
41 41
42#include <asm/delay.h> 42#include <asm/delay.h>
43#include <mach/control.h> 43#include <plat/control.h>
44#include <mach/usb.h> 44#include <plat/usb.h>
45 45
46#include "mmc-twl4030.h" 46#include "mux.h"
47#include "hsmmc.h"
47 48
48#define LDP_SMSC911X_CS 1 49#define LDP_SMSC911X_CS 1
49#define LDP_SMSC911X_GPIO 152 50#define LDP_SMSC911X_GPIO 152
@@ -358,7 +359,7 @@ static int __init omap_i2c_init(void)
358 return 0; 359 return 0;
359} 360}
360 361
361static struct twl4030_hsmmc_info mmc[] __initdata = { 362static struct omap2_hsmmc_info mmc[] __initdata = {
362 { 363 {
363 .mmc = 1, 364 .mmc = 1,
364 .wires = 4, 365 .wires = 4,
@@ -374,8 +375,23 @@ static struct platform_device *ldp_devices[] __initdata = {
374 &ldp_gpio_keys_device, 375 &ldp_gpio_keys_device,
375}; 376};
376 377
378#ifdef CONFIG_OMAP_MUX
379static struct omap_board_mux board_mux[] __initdata = {
380 { .reg_offset = OMAP_MUX_TERMINATOR },
381};
382#else
383#define board_mux NULL
384#endif
385
386static struct omap_musb_board_data musb_board_data = {
387 .interface_type = MUSB_INTERFACE_ULPI,
388 .mode = MUSB_OTG,
389 .power = 100,
390};
391
377static void __init omap_ldp_init(void) 392static void __init omap_ldp_init(void)
378{ 393{
394 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
379 omap_i2c_init(); 395 omap_i2c_init();
380 platform_add_devices(ldp_devices, ARRAY_SIZE(ldp_devices)); 396 platform_add_devices(ldp_devices, ARRAY_SIZE(ldp_devices));
381 ts_gpio = 54; 397 ts_gpio = 54;
@@ -384,9 +400,9 @@ static void __init omap_ldp_init(void)
384 ARRAY_SIZE(ldp_spi_board_info)); 400 ARRAY_SIZE(ldp_spi_board_info));
385 ads7846_dev_init(); 401 ads7846_dev_init();
386 omap_serial_init(); 402 omap_serial_init();
387 usb_musb_init(); 403 usb_musb_init(&musb_board_data);
388 404
389 twl4030_mmc_init(mmc); 405 omap2_hsmmc_init(mmc);
390 /* link regulators to MMC adapters */ 406 /* link regulators to MMC adapters */
391 ldp_vmmc1_supply.dev = mmc[0].dev; 407 ldp_vmmc1_supply.dev = mmc[0].dev;
392} 408}
@@ -394,12 +410,12 @@ static void __init omap_ldp_init(void)
394static void __init omap_ldp_map_io(void) 410static void __init omap_ldp_map_io(void)
395{ 411{
396 omap2_set_globals_343x(); 412 omap2_set_globals_343x();
397 omap2_map_common_io(); 413 omap34xx_map_common_io();
398} 414}
399 415
400MACHINE_START(OMAP_LDP, "OMAP LDP board") 416MACHINE_START(OMAP_LDP, "OMAP LDP board")
401 .phys_io = 0x48000000, 417 .phys_io = 0x48000000,
402 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, 418 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
403 .boot_params = 0x80000100, 419 .boot_params = 0x80000100,
404 .map_io = omap_ldp_map_io, 420 .map_io = omap_ldp_map_io,
405 .init_irq = omap_ldp_init_irq, 421 .init_irq = omap_ldp_init_irq,
diff --git a/arch/arm/mach-omap2/board-n8x0.c b/arch/arm/mach-omap2/board-n8x0.c
index 8341632d260b..3ccc34ebdcc7 100644
--- a/arch/arm/mach-omap2/board-n8x0.c
+++ b/arch/arm/mach-omap2/board-n8x0.c
@@ -17,18 +17,122 @@
17#include <linux/init.h> 17#include <linux/init.h>
18#include <linux/io.h> 18#include <linux/io.h>
19#include <linux/stddef.h> 19#include <linux/stddef.h>
20#include <linux/i2c.h>
20#include <linux/spi/spi.h> 21#include <linux/spi/spi.h>
21#include <linux/usb/musb.h> 22#include <linux/usb/musb.h>
22 23
23#include <asm/mach/arch.h> 24#include <asm/mach/arch.h>
24#include <asm/mach-types.h> 25#include <asm/mach-types.h>
25 26
26#include <mach/board.h> 27#include <plat/board.h>
27#include <mach/common.h> 28#include <plat/common.h>
29#include <plat/menelaus.h>
28#include <mach/irqs.h> 30#include <mach/irqs.h>
29#include <mach/mcspi.h> 31#include <plat/mcspi.h>
30#include <mach/onenand.h> 32#include <plat/onenand.h>
31#include <mach/serial.h> 33#include <plat/mmc.h>
34#include <plat/serial.h>
35
36static int slot1_cover_open;
37static int slot2_cover_open;
38static struct device *mmc_device;
39
40#define TUSB6010_ASYNC_CS 1
41#define TUSB6010_SYNC_CS 4
42#define TUSB6010_GPIO_INT 58
43#define TUSB6010_GPIO_ENABLE 0
44#define TUSB6010_DMACHAN 0x3f
45
46#if defined(CONFIG_USB_TUSB6010) || \
47 defined(CONFIG_USB_TUSB6010_MODULE)
48/*
49 * Enable or disable power to TUSB6010. When enabling, turn on 3.3 V and
50 * 1.5 V voltage regulators of PM companion chip. Companion chip will then
51 * provide then PGOOD signal to TUSB6010 which will release it from reset.
52 */
53static int tusb_set_power(int state)
54{
55 int i, retval = 0;
56
57 if (state) {
58 gpio_set_value(TUSB6010_GPIO_ENABLE, 1);
59 msleep(1);
60
61 /* Wait until TUSB6010 pulls INT pin down */
62 i = 100;
63 while (i && gpio_get_value(TUSB6010_GPIO_INT)) {
64 msleep(1);
65 i--;
66 }
67
68 if (!i) {
69 printk(KERN_ERR "tusb: powerup failed\n");
70 retval = -ENODEV;
71 }
72 } else {
73 gpio_set_value(TUSB6010_GPIO_ENABLE, 0);
74 msleep(10);
75 }
76
77 return retval;
78}
79
80static struct musb_hdrc_config musb_config = {
81 .multipoint = 1,
82 .dyn_fifo = 1,
83 .num_eps = 16,
84 .ram_bits = 12,
85};
86
87static struct musb_hdrc_platform_data tusb_data = {
88#if defined(CONFIG_USB_MUSB_OTG)
89 .mode = MUSB_OTG,
90#elif defined(CONFIG_USB_MUSB_PERIPHERAL)
91 .mode = MUSB_PERIPHERAL,
92#else /* defined(CONFIG_USB_MUSB_HOST) */
93 .mode = MUSB_HOST,
94#endif
95 .set_power = tusb_set_power,
96 .min_power = 25, /* x2 = 50 mA drawn from VBUS as peripheral */
97 .power = 100, /* Max 100 mA VBUS for host mode */
98 .config = &musb_config,
99};
100
101static void __init n8x0_usb_init(void)
102{
103 int ret = 0;
104 static char announce[] __initdata = KERN_INFO "TUSB 6010\n";
105
106 /* PM companion chip power control pin */
107 ret = gpio_request(TUSB6010_GPIO_ENABLE, "TUSB6010 enable");
108 if (ret != 0) {
109 printk(KERN_ERR "Could not get TUSB power GPIO%i\n",
110 TUSB6010_GPIO_ENABLE);
111 return;
112 }
113 gpio_direction_output(TUSB6010_GPIO_ENABLE, 0);
114
115 tusb_set_power(0);
116
117 ret = tusb6010_setup_interface(&tusb_data, TUSB6010_REFCLK_19, 2,
118 TUSB6010_ASYNC_CS, TUSB6010_SYNC_CS,
119 TUSB6010_GPIO_INT, TUSB6010_DMACHAN);
120 if (ret != 0)
121 goto err;
122
123 printk(announce);
124
125 return;
126
127err:
128 gpio_free(TUSB6010_GPIO_ENABLE);
129}
130#else
131
132static void __init n8x0_usb_init(void) {}
133
134#endif /*CONFIG_USB_TUSB6010 */
135
32 136
33static struct omap2_mcspi_device_config p54spi_mcspi_config = { 137static struct omap2_mcspi_device_config p54spi_mcspi_config = {
34 .turbo_mode = 0, 138 .turbo_mode = 0,
@@ -96,10 +200,446 @@ static void __init n8x0_onenand_init(void) {}
96 200
97#endif 201#endif
98 202
203#if defined(CONFIG_MENELAUS) && \
204 (defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE))
205
206/*
207 * On both N800 and N810, only the first of the two MMC controllers is in use.
208 * The two MMC slots are multiplexed via Menelaus companion chip over I2C.
209 * On N800, both slots are powered via Menelaus. On N810, only one of the
210 * slots is powered via Menelaus. The N810 EMMC is powered via GPIO.
211 *
212 * VMMC slot 1 on both N800 and N810
213 * VDCDC3_APE and VMCS2_APE slot 2 on N800
214 * GPIO23 and GPIO9 slot 2 EMMC on N810
215 *
216 */
217#define N8X0_SLOT_SWITCH_GPIO 96
218#define N810_EMMC_VSD_GPIO 23
219#define N810_EMMC_VIO_GPIO 9
220
221static int n8x0_mmc_switch_slot(struct device *dev, int slot)
222{
223#ifdef CONFIG_MMC_DEBUG
224 dev_dbg(dev, "Choose slot %d\n", slot + 1);
225#endif
226 gpio_set_value(N8X0_SLOT_SWITCH_GPIO, slot);
227 return 0;
228}
229
230static int n8x0_mmc_set_power_menelaus(struct device *dev, int slot,
231 int power_on, int vdd)
232{
233 int mV;
234
235#ifdef CONFIG_MMC_DEBUG
236 dev_dbg(dev, "Set slot %d power: %s (vdd %d)\n", slot + 1,
237 power_on ? "on" : "off", vdd);
238#endif
239 if (slot == 0) {
240 if (!power_on)
241 return menelaus_set_vmmc(0);
242 switch (1 << vdd) {
243 case MMC_VDD_33_34:
244 case MMC_VDD_32_33:
245 case MMC_VDD_31_32:
246 mV = 3100;
247 break;
248 case MMC_VDD_30_31:
249 mV = 3000;
250 break;
251 case MMC_VDD_28_29:
252 mV = 2800;
253 break;
254 case MMC_VDD_165_195:
255 mV = 1850;
256 break;
257 default:
258 BUG();
259 }
260 return menelaus_set_vmmc(mV);
261 } else {
262 if (!power_on)
263 return menelaus_set_vdcdc(3, 0);
264 switch (1 << vdd) {
265 case MMC_VDD_33_34:
266 case MMC_VDD_32_33:
267 mV = 3300;
268 break;
269 case MMC_VDD_30_31:
270 case MMC_VDD_29_30:
271 mV = 3000;
272 break;
273 case MMC_VDD_28_29:
274 case MMC_VDD_27_28:
275 mV = 2800;
276 break;
277 case MMC_VDD_24_25:
278 case MMC_VDD_23_24:
279 mV = 2400;
280 break;
281 case MMC_VDD_22_23:
282 case MMC_VDD_21_22:
283 mV = 2200;
284 break;
285 case MMC_VDD_20_21:
286 mV = 2000;
287 break;
288 case MMC_VDD_165_195:
289 mV = 1800;
290 break;
291 default:
292 BUG();
293 }
294 return menelaus_set_vdcdc(3, mV);
295 }
296 return 0;
297}
298
299static void n810_set_power_emmc(struct device *dev,
300 int power_on)
301{
302 dev_dbg(dev, "Set EMMC power %s\n", power_on ? "on" : "off");
303
304 if (power_on) {
305 gpio_set_value(N810_EMMC_VSD_GPIO, 1);
306 msleep(1);
307 gpio_set_value(N810_EMMC_VIO_GPIO, 1);
308 msleep(1);
309 } else {
310 gpio_set_value(N810_EMMC_VIO_GPIO, 0);
311 msleep(50);
312 gpio_set_value(N810_EMMC_VSD_GPIO, 0);
313 msleep(50);
314 }
315}
316
317static int n8x0_mmc_set_power(struct device *dev, int slot, int power_on,
318 int vdd)
319{
320 if (machine_is_nokia_n800() || slot == 0)
321 return n8x0_mmc_set_power_menelaus(dev, slot, power_on, vdd);
322
323 n810_set_power_emmc(dev, power_on);
324
325 return 0;
326}
327
328static int n8x0_mmc_set_bus_mode(struct device *dev, int slot, int bus_mode)
329{
330 int r;
331
332 dev_dbg(dev, "Set slot %d bus mode %s\n", slot + 1,
333 bus_mode == MMC_BUSMODE_OPENDRAIN ? "open-drain" : "push-pull");
334 BUG_ON(slot != 0 && slot != 1);
335 slot++;
336 switch (bus_mode) {
337 case MMC_BUSMODE_OPENDRAIN:
338 r = menelaus_set_mmc_opendrain(slot, 1);
339 break;
340 case MMC_BUSMODE_PUSHPULL:
341 r = menelaus_set_mmc_opendrain(slot, 0);
342 break;
343 default:
344 BUG();
345 }
346 if (r != 0 && printk_ratelimit())
347 dev_err(dev, "MMC: unable to set bus mode for slot %d\n",
348 slot);
349 return r;
350}
351
352static int n8x0_mmc_get_cover_state(struct device *dev, int slot)
353{
354 slot++;
355 BUG_ON(slot != 1 && slot != 2);
356 if (slot == 1)
357 return slot1_cover_open;
358 else
359 return slot2_cover_open;
360}
361
362static void n8x0_mmc_callback(void *data, u8 card_mask)
363{
364 int bit, *openp, index;
365
366 if (machine_is_nokia_n800()) {
367 bit = 1 << 1;
368 openp = &slot2_cover_open;
369 index = 1;
370 } else {
371 bit = 1;
372 openp = &slot1_cover_open;
373 index = 0;
374 }
375
376 if (card_mask & bit)
377 *openp = 1;
378 else
379 *openp = 0;
380
381 omap_mmc_notify_cover_event(mmc_device, index, *openp);
382}
383
384void n8x0_mmc_slot1_cover_handler(void *arg, int closed_state)
385{
386 if (mmc_device == NULL)
387 return;
388
389 slot1_cover_open = !closed_state;
390 omap_mmc_notify_cover_event(mmc_device, 0, closed_state);
391}
392
393static int n8x0_mmc_late_init(struct device *dev)
394{
395 int r, bit, *openp;
396 int vs2sel;
397
398 mmc_device = dev;
399
400 r = menelaus_set_slot_sel(1);
401 if (r < 0)
402 return r;
403
404 if (machine_is_nokia_n800())
405 vs2sel = 0;
406 else
407 vs2sel = 2;
408
409 r = menelaus_set_mmc_slot(2, 0, vs2sel, 1);
410 if (r < 0)
411 return r;
412
413 n8x0_mmc_set_power(dev, 0, MMC_POWER_ON, 16); /* MMC_VDD_28_29 */
414 n8x0_mmc_set_power(dev, 1, MMC_POWER_ON, 16);
415
416 r = menelaus_set_mmc_slot(1, 1, 0, 1);
417 if (r < 0)
418 return r;
419 r = menelaus_set_mmc_slot(2, 1, vs2sel, 1);
420 if (r < 0)
421 return r;
422
423 r = menelaus_get_slot_pin_states();
424 if (r < 0)
425 return r;
426
427 if (machine_is_nokia_n800()) {
428 bit = 1 << 1;
429 openp = &slot2_cover_open;
430 } else {
431 bit = 1;
432 openp = &slot1_cover_open;
433 slot2_cover_open = 0;
434 }
435
436 /* All slot pin bits seem to be inversed until first switch change */
437 if (r == 0xf || r == (0xf & ~bit))
438 r = ~r;
439
440 if (r & bit)
441 *openp = 1;
442 else
443 *openp = 0;
444
445 r = menelaus_register_mmc_callback(n8x0_mmc_callback, NULL);
446
447 return r;
448}
449
450static void n8x0_mmc_shutdown(struct device *dev)
451{
452 int vs2sel;
453
454 if (machine_is_nokia_n800())
455 vs2sel = 0;
456 else
457 vs2sel = 2;
458
459 menelaus_set_mmc_slot(1, 0, 0, 0);
460 menelaus_set_mmc_slot(2, 0, vs2sel, 0);
461}
462
463static void n8x0_mmc_cleanup(struct device *dev)
464{
465 menelaus_unregister_mmc_callback();
466
467 gpio_free(N8X0_SLOT_SWITCH_GPIO);
468
469 if (machine_is_nokia_n810()) {
470 gpio_free(N810_EMMC_VSD_GPIO);
471 gpio_free(N810_EMMC_VIO_GPIO);
472 }
473}
474
475/*
476 * MMC controller1 has two slots that are multiplexed via I2C.
477 * MMC controller2 is not in use.
478 */
479static struct omap_mmc_platform_data mmc1_data = {
480 .nr_slots = 2,
481 .switch_slot = n8x0_mmc_switch_slot,
482 .init = n8x0_mmc_late_init,
483 .cleanup = n8x0_mmc_cleanup,
484 .shutdown = n8x0_mmc_shutdown,
485 .max_freq = 24000000,
486 .dma_mask = 0xffffffff,
487 .slots[0] = {
488 .wires = 4,
489 .set_power = n8x0_mmc_set_power,
490 .set_bus_mode = n8x0_mmc_set_bus_mode,
491 .get_cover_state = n8x0_mmc_get_cover_state,
492 .ocr_mask = MMC_VDD_165_195 | MMC_VDD_30_31 |
493 MMC_VDD_32_33 | MMC_VDD_33_34,
494 .name = "internal",
495 },
496 .slots[1] = {
497 .set_power = n8x0_mmc_set_power,
498 .set_bus_mode = n8x0_mmc_set_bus_mode,
499 .get_cover_state = n8x0_mmc_get_cover_state,
500 .ocr_mask = MMC_VDD_165_195 | MMC_VDD_20_21 |
501 MMC_VDD_21_22 | MMC_VDD_22_23 |
502 MMC_VDD_23_24 | MMC_VDD_24_25 |
503 MMC_VDD_27_28 | MMC_VDD_28_29 |
504 MMC_VDD_29_30 | MMC_VDD_30_31 |
505 MMC_VDD_32_33 | MMC_VDD_33_34,
506 .name = "external",
507 },
508};
509
510static struct omap_mmc_platform_data *mmc_data[OMAP24XX_NR_MMC];
511
512void __init n8x0_mmc_init(void)
513
514{
515 int err;
516
517 if (machine_is_nokia_n810()) {
518 mmc1_data.slots[0].name = "external";
519
520 /*
521 * Some Samsung Movinand chips do not like open-ended
522 * multi-block reads and fall to braind-dead state
523 * while doing so. Reducing the number of blocks in
524 * the transfer or delays in clock disable do not help
525 */
526 mmc1_data.slots[1].name = "internal";
527 mmc1_data.slots[1].ban_openended = 1;
528 }
529
530 err = gpio_request(N8X0_SLOT_SWITCH_GPIO, "MMC slot switch");
531 if (err)
532 return;
533
534 gpio_direction_output(N8X0_SLOT_SWITCH_GPIO, 0);
535
536 if (machine_is_nokia_n810()) {
537 err = gpio_request(N810_EMMC_VSD_GPIO, "MMC slot 2 Vddf");
538 if (err) {
539 gpio_free(N8X0_SLOT_SWITCH_GPIO);
540 return;
541 }
542 gpio_direction_output(N810_EMMC_VSD_GPIO, 0);
543
544 err = gpio_request(N810_EMMC_VIO_GPIO, "MMC slot 2 Vdd");
545 if (err) {
546 gpio_free(N8X0_SLOT_SWITCH_GPIO);
547 gpio_free(N810_EMMC_VSD_GPIO);
548 return;
549 }
550 gpio_direction_output(N810_EMMC_VIO_GPIO, 0);
551 }
552
553 mmc_data[0] = &mmc1_data;
554 omap2_init_mmc(mmc_data, OMAP24XX_NR_MMC);
555}
556#else
557
558void __init n8x0_mmc_init(void)
559{
560}
561
562void n8x0_mmc_slot1_cover_handler(void *arg, int state)
563{
564}
565
566#endif /* CONFIG_MMC_OMAP */
567
568#ifdef CONFIG_MENELAUS
569
570static int n8x0_auto_sleep_regulators(void)
571{
572 u32 val;
573 int ret;
574
575 val = EN_VPLL_SLEEP | EN_VMMC_SLEEP \
576 | EN_VAUX_SLEEP | EN_VIO_SLEEP \
577 | EN_VMEM_SLEEP | EN_DC3_SLEEP \
578 | EN_VC_SLEEP | EN_DC2_SLEEP;
579
580 ret = menelaus_set_regulator_sleep(1, val);
581 if (ret < 0) {
582 printk(KERN_ERR "Could not set regulators to sleep on "
583 "menelaus: %u\n", ret);
584 return ret;
585 }
586 return 0;
587}
588
589static int n8x0_auto_voltage_scale(void)
590{
591 int ret;
592
593 ret = menelaus_set_vcore_hw(1400, 1050);
594 if (ret < 0) {
595 printk(KERN_ERR "Could not set VCORE voltage on "
596 "menelaus: %u\n", ret);
597 return ret;
598 }
599 return 0;
600}
601
602static int n8x0_menelaus_late_init(struct device *dev)
603{
604 int ret;
605
606 ret = n8x0_auto_voltage_scale();
607 if (ret < 0)
608 return ret;
609 ret = n8x0_auto_sleep_regulators();
610 if (ret < 0)
611 return ret;
612 return 0;
613}
614
615static struct i2c_board_info __initdata n8x0_i2c_board_info_1[] = {
616 {
617 I2C_BOARD_INFO("menelaus", 0x72),
618 .irq = INT_24XX_SYS_NIRQ,
619 },
620};
621
622static struct menelaus_platform_data n8x0_menelaus_platform_data = {
623 .late_init = n8x0_menelaus_late_init,
624};
625
626static void __init n8x0_menelaus_init(void)
627{
628 n8x0_i2c_board_info_1[0].platform_data = &n8x0_menelaus_platform_data;
629 omap_register_i2c_bus(1, 400, n8x0_i2c_board_info_1,
630 ARRAY_SIZE(n8x0_i2c_board_info_1));
631}
632
633#else
634static inline void __init n8x0_menelaus_init(void)
635{
636}
637#endif
638
99static void __init n8x0_map_io(void) 639static void __init n8x0_map_io(void)
100{ 640{
101 omap2_set_globals_242x(); 641 omap2_set_globals_242x();
102 omap2_map_common_io(); 642 omap242x_map_common_io();
103} 643}
104 644
105static void __init n8x0_init_irq(void) 645static void __init n8x0_init_irq(void)
@@ -116,12 +656,15 @@ static void __init n8x0_init_machine(void)
116 ARRAY_SIZE(n800_spi_board_info)); 656 ARRAY_SIZE(n800_spi_board_info));
117 657
118 omap_serial_init(); 658 omap_serial_init();
659 n8x0_menelaus_init();
119 n8x0_onenand_init(); 660 n8x0_onenand_init();
661 n8x0_mmc_init();
662 n8x0_usb_init();
120} 663}
121 664
122MACHINE_START(NOKIA_N800, "Nokia N800") 665MACHINE_START(NOKIA_N800, "Nokia N800")
123 .phys_io = 0x48000000, 666 .phys_io = 0x48000000,
124 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, 667 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
125 .boot_params = 0x80000100, 668 .boot_params = 0x80000100,
126 .map_io = n8x0_map_io, 669 .map_io = n8x0_map_io,
127 .init_irq = n8x0_init_irq, 670 .init_irq = n8x0_init_irq,
@@ -131,7 +674,7 @@ MACHINE_END
131 674
132MACHINE_START(NOKIA_N810, "Nokia N810") 675MACHINE_START(NOKIA_N810, "Nokia N810")
133 .phys_io = 0x48000000, 676 .phys_io = 0x48000000,
134 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, 677 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
135 .boot_params = 0x80000100, 678 .boot_params = 0x80000100,
136 .map_io = n8x0_map_io, 679 .map_io = n8x0_map_io,
137 .init_irq = n8x0_init_irq, 680 .init_irq = n8x0_init_irq,
@@ -141,7 +684,7 @@ MACHINE_END
141 684
142MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX") 685MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX")
143 .phys_io = 0x48000000, 686 .phys_io = 0x48000000,
144 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, 687 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
145 .boot_params = 0x80000100, 688 .boot_params = 0x80000100,
146 .map_io = n8x0_map_io, 689 .map_io = n8x0_map_io,
147 .init_irq = n8x0_init_irq, 690 .init_irq = n8x0_init_irq,
diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
index 08b0816afa61..962d377970e9 100644
--- a/arch/arm/mach-omap2/board-omap3beagle.c
+++ b/arch/arm/mach-omap2/board-omap3beagle.c
@@ -29,7 +29,7 @@
29#include <linux/mtd/nand.h> 29#include <linux/mtd/nand.h>
30 30
31#include <linux/regulator/machine.h> 31#include <linux/regulator/machine.h>
32#include <linux/i2c/twl4030.h> 32#include <linux/i2c/twl.h>
33 33
34#include <mach/hardware.h> 34#include <mach/hardware.h>
35#include <asm/mach-types.h> 35#include <asm/mach-types.h>
@@ -37,15 +37,15 @@
37#include <asm/mach/map.h> 37#include <asm/mach/map.h>
38#include <asm/mach/flash.h> 38#include <asm/mach/flash.h>
39 39
40#include <mach/board.h> 40#include <plat/board.h>
41#include <mach/common.h> 41#include <plat/common.h>
42#include <mach/gpmc.h> 42#include <plat/gpmc.h>
43#include <mach/nand.h> 43#include <plat/nand.h>
44#include <mach/mux.h> 44#include <plat/usb.h>
45#include <mach/usb.h> 45#include <plat/timer-gp.h>
46#include <mach/timer-gp.h>
47 46
48#include "mmc-twl4030.h" 47#include "mux.h"
48#include "hsmmc.h"
49 49
50#define GPMC_CS0_BASE 0x60 50#define GPMC_CS0_BASE 0x60
51#define GPMC_CS_SIZE 0x30 51#define GPMC_CS_SIZE 0x30
@@ -108,7 +108,7 @@ static struct platform_device omap3beagle_nand_device = {
108 108
109#include "sdram-micron-mt46h32m32lf-6.h" 109#include "sdram-micron-mt46h32m32lf-6.h"
110 110
111static struct twl4030_hsmmc_info mmc[] = { 111static struct omap2_hsmmc_info mmc[] = {
112 { 112 {
113 .mmc = 1, 113 .mmc = 1,
114 .wires = 8, 114 .wires = 8,
@@ -140,14 +140,14 @@ static int beagle_twl_gpio_setup(struct device *dev,
140 unsigned gpio, unsigned ngpio) 140 unsigned gpio, unsigned ngpio)
141{ 141{
142 if (system_rev >= 0x20 && system_rev <= 0x34301000) { 142 if (system_rev >= 0x20 && system_rev <= 0x34301000) {
143 omap_cfg_reg(AG9_34XX_GPIO23); 143 omap_mux_init_gpio(23, OMAP_PIN_INPUT);
144 mmc[0].gpio_wp = 23; 144 mmc[0].gpio_wp = 23;
145 } else { 145 } else {
146 omap_cfg_reg(AH8_34XX_GPIO29); 146 omap_mux_init_gpio(29, OMAP_PIN_INPUT);
147 } 147 }
148 /* gpio + 0 is "mmc0_cd" (input/IRQ) */ 148 /* gpio + 0 is "mmc0_cd" (input/IRQ) */
149 mmc[0].gpio_cd = gpio + 0; 149 mmc[0].gpio_cd = gpio + 0;
150 twl4030_mmc_init(mmc); 150 omap2_hsmmc_init(mmc);
151 151
152 /* link regulators to MMC adapters */ 152 /* link regulators to MMC adapters */
153 beagle_vmmc1_supply.dev = mmc[0].dev; 153 beagle_vmmc1_supply.dev = mmc[0].dev;
@@ -254,6 +254,15 @@ static struct twl4030_usb_data beagle_usb_data = {
254 .usb_mode = T2_USB_MODE_ULPI, 254 .usb_mode = T2_USB_MODE_ULPI,
255}; 255};
256 256
257static struct twl4030_codec_audio_data beagle_audio_data = {
258 .audio_mclk = 26000000,
259};
260
261static struct twl4030_codec_data beagle_codec_data = {
262 .audio_mclk = 26000000,
263 .audio = &beagle_audio_data,
264};
265
257static struct twl4030_platform_data beagle_twldata = { 266static struct twl4030_platform_data beagle_twldata = {
258 .irq_base = TWL4030_IRQ_BASE, 267 .irq_base = TWL4030_IRQ_BASE,
259 .irq_end = TWL4030_IRQ_END, 268 .irq_end = TWL4030_IRQ_END,
@@ -261,6 +270,7 @@ static struct twl4030_platform_data beagle_twldata = {
261 /* platform_data for children goes here */ 270 /* platform_data for children goes here */
262 .usb = &beagle_usb_data, 271 .usb = &beagle_usb_data,
263 .gpio = &beagle_gpio_data, 272 .gpio = &beagle_gpio_data,
273 .codec = &beagle_codec_data,
264 .vmmc1 = &beagle_vmmc1, 274 .vmmc1 = &beagle_vmmc1,
265 .vsim = &beagle_vsim, 275 .vsim = &beagle_vsim,
266 .vdac = &beagle_vdac, 276 .vdac = &beagle_vdac,
@@ -400,36 +410,64 @@ static void __init omap3beagle_flash_init(void)
400 } 410 }
401} 411}
402 412
413static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
414
415 .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
416 .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
417 .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
418
419 .phy_reset = true,
420 .reset_gpio_port[0] = -EINVAL,
421 .reset_gpio_port[1] = 147,
422 .reset_gpio_port[2] = -EINVAL
423};
424
425#ifdef CONFIG_OMAP_MUX
426static struct omap_board_mux board_mux[] __initdata = {
427 { .reg_offset = OMAP_MUX_TERMINATOR },
428};
429#else
430#define board_mux NULL
431#endif
432
433static struct omap_musb_board_data musb_board_data = {
434 .interface_type = MUSB_INTERFACE_ULPI,
435 .mode = MUSB_OTG,
436 .power = 100,
437};
438
403static void __init omap3_beagle_init(void) 439static void __init omap3_beagle_init(void)
404{ 440{
441 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
405 omap3_beagle_i2c_init(); 442 omap3_beagle_i2c_init();
406 platform_add_devices(omap3_beagle_devices, 443 platform_add_devices(omap3_beagle_devices,
407 ARRAY_SIZE(omap3_beagle_devices)); 444 ARRAY_SIZE(omap3_beagle_devices));
408 omap_serial_init(); 445 omap_serial_init();
409 446
410 omap_cfg_reg(J25_34XX_GPIO170); 447 omap_mux_init_gpio(170, OMAP_PIN_INPUT);
411 gpio_request(170, "DVI_nPD"); 448 gpio_request(170, "DVI_nPD");
412 /* REVISIT leave DVI powered down until it's needed ... */ 449 /* REVISIT leave DVI powered down until it's needed ... */
413 gpio_direction_output(170, true); 450 gpio_direction_output(170, true);
414 451
415 usb_musb_init(); 452 usb_musb_init(&musb_board_data);
453 usb_ehci_init(&ehci_pdata);
416 omap3beagle_flash_init(); 454 omap3beagle_flash_init();
417 455
418 /* Ensure SDRC pins are mux'd for self-refresh */ 456 /* Ensure SDRC pins are mux'd for self-refresh */
419 omap_cfg_reg(H16_34XX_SDRC_CKE0); 457 omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
420 omap_cfg_reg(H17_34XX_SDRC_CKE1); 458 omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
421} 459}
422 460
423static void __init omap3_beagle_map_io(void) 461static void __init omap3_beagle_map_io(void)
424{ 462{
425 omap2_set_globals_343x(); 463 omap2_set_globals_343x();
426 omap2_map_common_io(); 464 omap34xx_map_common_io();
427} 465}
428 466
429MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board") 467MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board")
430 /* Maintainer: Syed Mohammed Khasim - http://beagleboard.org */ 468 /* Maintainer: Syed Mohammed Khasim - http://beagleboard.org */
431 .phys_io = 0x48000000, 469 .phys_io = 0x48000000,
432 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, 470 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
433 .boot_params = 0x80000100, 471 .boot_params = 0x80000100,
434 .map_io = omap3_beagle_map_io, 472 .map_io = omap3_beagle_map_io,
435 .init_irq = omap3_beagle_init_irq, 473 .init_irq = omap3_beagle_init_irq,
diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c
index 4c4d7f8dbd72..017bb2f4f7d2 100644
--- a/arch/arm/mach-omap2/board-omap3evm.c
+++ b/arch/arm/mach-omap2/board-omap3evm.c
@@ -22,34 +22,75 @@
22#include <linux/input.h> 22#include <linux/input.h>
23#include <linux/input/matrix_keypad.h> 23#include <linux/input/matrix_keypad.h>
24#include <linux/leds.h> 24#include <linux/leds.h>
25#include <linux/interrupt.h>
25 26
26#include <linux/spi/spi.h> 27#include <linux/spi/spi.h>
27#include <linux/spi/ads7846.h> 28#include <linux/spi/ads7846.h>
28#include <linux/i2c/twl4030.h> 29#include <linux/i2c/twl.h>
29#include <linux/usb/otg.h> 30#include <linux/usb/otg.h>
31#include <linux/smsc911x.h>
32
33#include <linux/regulator/machine.h>
30 34
31#include <mach/hardware.h> 35#include <mach/hardware.h>
32#include <asm/mach-types.h> 36#include <asm/mach-types.h>
33#include <asm/mach/arch.h> 37#include <asm/mach/arch.h>
34#include <asm/mach/map.h> 38#include <asm/mach/map.h>
35 39
36#include <mach/board.h> 40#include <plat/board.h>
37#include <mach/mux.h> 41#include <plat/usb.h>
38#include <mach/usb.h> 42#include <plat/common.h>
39#include <mach/common.h> 43#include <plat/mcspi.h>
40#include <mach/mcspi.h> 44#include <plat/display.h>
41 45
46#include "mux.h"
42#include "sdram-micron-mt46h32m32lf-6.h" 47#include "sdram-micron-mt46h32m32lf-6.h"
43#include "mmc-twl4030.h" 48#include "hsmmc.h"
44 49
45#define OMAP3_EVM_TS_GPIO 175 50#define OMAP3_EVM_TS_GPIO 175
51#define OMAP3_EVM_EHCI_VBUS 22
52#define OMAP3_EVM_EHCI_SELECT 61
46 53
47#define OMAP3EVM_ETHR_START 0x2c000000 54#define OMAP3EVM_ETHR_START 0x2c000000
48#define OMAP3EVM_ETHR_SIZE 1024 55#define OMAP3EVM_ETHR_SIZE 1024
56#define OMAP3EVM_ETHR_ID_REV 0x50
49#define OMAP3EVM_ETHR_GPIO_IRQ 176 57#define OMAP3EVM_ETHR_GPIO_IRQ 176
50#define OMAP3EVM_SMC911X_CS 5 58#define OMAP3EVM_SMSC911X_CS 5
59
60static u8 omap3_evm_version;
61
62u8 get_omap3_evm_rev(void)
63{
64 return omap3_evm_version;
65}
66EXPORT_SYMBOL(get_omap3_evm_rev);
67
68static void __init omap3_evm_get_revision(void)
69{
70 void __iomem *ioaddr;
71 unsigned int smsc_id;
72
73 /* Ethernet PHY ID is stored at ID_REV register */
74 ioaddr = ioremap_nocache(OMAP3EVM_ETHR_START, SZ_1K);
75 if (!ioaddr)
76 return;
77 smsc_id = readl(ioaddr + OMAP3EVM_ETHR_ID_REV) & 0xFFFF0000;
78 iounmap(ioaddr);
79
80 switch (smsc_id) {
81 /*SMSC9115 chipset*/
82 case 0x01150000:
83 omap3_evm_version = OMAP3EVM_BOARD_GEN_1;
84 break;
85 /*SMSC 9220 chipset*/
86 case 0x92200000:
87 default:
88 omap3_evm_version = OMAP3EVM_BOARD_GEN_2;
89 }
90}
51 91
52static struct resource omap3evm_smc911x_resources[] = { 92#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
93static struct resource omap3evm_smsc911x_resources[] = {
53 [0] = { 94 [0] = {
54 .start = OMAP3EVM_ETHR_START, 95 .start = OMAP3EVM_ETHR_START,
55 .end = (OMAP3EVM_ETHR_START + OMAP3EVM_ETHR_SIZE - 1), 96 .end = (OMAP3EVM_ETHR_START + OMAP3EVM_ETHR_SIZE - 1),
@@ -58,24 +99,34 @@ static struct resource omap3evm_smc911x_resources[] = {
58 [1] = { 99 [1] = {
59 .start = OMAP_GPIO_IRQ(OMAP3EVM_ETHR_GPIO_IRQ), 100 .start = OMAP_GPIO_IRQ(OMAP3EVM_ETHR_GPIO_IRQ),
60 .end = OMAP_GPIO_IRQ(OMAP3EVM_ETHR_GPIO_IRQ), 101 .end = OMAP_GPIO_IRQ(OMAP3EVM_ETHR_GPIO_IRQ),
61 .flags = IORESOURCE_IRQ, 102 .flags = (IORESOURCE_IRQ | IRQF_TRIGGER_LOW),
62 }, 103 },
63}; 104};
64 105
65static struct platform_device omap3evm_smc911x_device = { 106static struct smsc911x_platform_config smsc911x_config = {
66 .name = "smc911x", 107 .phy_interface = PHY_INTERFACE_MODE_MII,
108 .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
109 .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN,
110 .flags = (SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS),
111};
112
113static struct platform_device omap3evm_smsc911x_device = {
114 .name = "smsc911x",
67 .id = -1, 115 .id = -1,
68 .num_resources = ARRAY_SIZE(omap3evm_smc911x_resources), 116 .num_resources = ARRAY_SIZE(omap3evm_smsc911x_resources),
69 .resource = &omap3evm_smc911x_resources[0], 117 .resource = &omap3evm_smsc911x_resources[0],
118 .dev = {
119 .platform_data = &smsc911x_config,
120 },
70}; 121};
71 122
72static inline void __init omap3evm_init_smc911x(void) 123static inline void __init omap3evm_init_smsc911x(void)
73{ 124{
74 int eth_cs; 125 int eth_cs;
75 struct clk *l3ck; 126 struct clk *l3ck;
76 unsigned int rate; 127 unsigned int rate;
77 128
78 eth_cs = OMAP3EVM_SMC911X_CS; 129 eth_cs = OMAP3EVM_SMSC911X_CS;
79 130
80 l3ck = clk_get(NULL, "l3_ck"); 131 l3ck = clk_get(NULL, "l3_ck");
81 if (IS_ERR(l3ck)) 132 if (IS_ERR(l3ck))
@@ -83,16 +134,240 @@ static inline void __init omap3evm_init_smc911x(void)
83 else 134 else
84 rate = clk_get_rate(l3ck); 135 rate = clk_get_rate(l3ck);
85 136
86 if (gpio_request(OMAP3EVM_ETHR_GPIO_IRQ, "SMC911x irq") < 0) { 137 if (gpio_request(OMAP3EVM_ETHR_GPIO_IRQ, "SMSC911x irq") < 0) {
87 printk(KERN_ERR "Failed to request GPIO%d for smc911x IRQ\n", 138 printk(KERN_ERR "Failed to request GPIO%d for smsc911x IRQ\n",
88 OMAP3EVM_ETHR_GPIO_IRQ); 139 OMAP3EVM_ETHR_GPIO_IRQ);
89 return; 140 return;
90 } 141 }
91 142
92 gpio_direction_input(OMAP3EVM_ETHR_GPIO_IRQ); 143 gpio_direction_input(OMAP3EVM_ETHR_GPIO_IRQ);
144 platform_device_register(&omap3evm_smsc911x_device);
145}
146
147#else
148static inline void __init omap3evm_init_smsc911x(void) { return; }
149#endif
150
151/*
152 * OMAP3EVM LCD Panel control signals
153 */
154#define OMAP3EVM_LCD_PANEL_LR 2
155#define OMAP3EVM_LCD_PANEL_UD 3
156#define OMAP3EVM_LCD_PANEL_INI 152
157#define OMAP3EVM_LCD_PANEL_ENVDD 153
158#define OMAP3EVM_LCD_PANEL_QVGA 154
159#define OMAP3EVM_LCD_PANEL_RESB 155
160#define OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO 210
161#define OMAP3EVM_DVI_PANEL_EN_GPIO 199
162
163static int lcd_enabled;
164static int dvi_enabled;
165
166static void __init omap3_evm_display_init(void)
167{
168 int r;
169
170 r = gpio_request(OMAP3EVM_LCD_PANEL_RESB, "lcd_panel_resb");
171 if (r) {
172 printk(KERN_ERR "failed to get lcd_panel_resb\n");
173 return;
174 }
175 gpio_direction_output(OMAP3EVM_LCD_PANEL_RESB, 1);
176
177 r = gpio_request(OMAP3EVM_LCD_PANEL_INI, "lcd_panel_ini");
178 if (r) {
179 printk(KERN_ERR "failed to get lcd_panel_ini\n");
180 goto err_1;
181 }
182 gpio_direction_output(OMAP3EVM_LCD_PANEL_INI, 1);
183
184 r = gpio_request(OMAP3EVM_LCD_PANEL_QVGA, "lcd_panel_qvga");
185 if (r) {
186 printk(KERN_ERR "failed to get lcd_panel_qvga\n");
187 goto err_2;
188 }
189 gpio_direction_output(OMAP3EVM_LCD_PANEL_QVGA, 0);
190
191 r = gpio_request(OMAP3EVM_LCD_PANEL_LR, "lcd_panel_lr");
192 if (r) {
193 printk(KERN_ERR "failed to get lcd_panel_lr\n");
194 goto err_3;
195 }
196 gpio_direction_output(OMAP3EVM_LCD_PANEL_LR, 1);
197
198 r = gpio_request(OMAP3EVM_LCD_PANEL_UD, "lcd_panel_ud");
199 if (r) {
200 printk(KERN_ERR "failed to get lcd_panel_ud\n");
201 goto err_4;
202 }
203 gpio_direction_output(OMAP3EVM_LCD_PANEL_UD, 1);
204
205 r = gpio_request(OMAP3EVM_LCD_PANEL_ENVDD, "lcd_panel_envdd");
206 if (r) {
207 printk(KERN_ERR "failed to get lcd_panel_envdd\n");
208 goto err_5;
209 }
210 gpio_direction_output(OMAP3EVM_LCD_PANEL_ENVDD, 0);
211
212 return;
213
214err_5:
215 gpio_free(OMAP3EVM_LCD_PANEL_UD);
216err_4:
217 gpio_free(OMAP3EVM_LCD_PANEL_LR);
218err_3:
219 gpio_free(OMAP3EVM_LCD_PANEL_QVGA);
220err_2:
221 gpio_free(OMAP3EVM_LCD_PANEL_INI);
222err_1:
223 gpio_free(OMAP3EVM_LCD_PANEL_RESB);
224
225}
226
227static int omap3_evm_enable_lcd(struct omap_dss_device *dssdev)
228{
229 if (dvi_enabled) {
230 printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
231 return -EINVAL;
232 }
233 gpio_set_value(OMAP3EVM_LCD_PANEL_ENVDD, 0);
234
235 if (get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2)
236 gpio_set_value(OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO, 0);
237 else
238 gpio_set_value(OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO, 1);
239
240 lcd_enabled = 1;
241 return 0;
242}
243
244static void omap3_evm_disable_lcd(struct omap_dss_device *dssdev)
245{
246 gpio_set_value(OMAP3EVM_LCD_PANEL_ENVDD, 1);
247
248 if (get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2)
249 gpio_set_value(OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO, 1);
250 else
251 gpio_set_value(OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO, 0);
252
253 lcd_enabled = 0;
254}
255
256static struct omap_dss_device omap3_evm_lcd_device = {
257 .name = "lcd",
258 .driver_name = "sharp_ls_panel",
259 .type = OMAP_DISPLAY_TYPE_DPI,
260 .phy.dpi.data_lines = 18,
261 .platform_enable = omap3_evm_enable_lcd,
262 .platform_disable = omap3_evm_disable_lcd,
263};
264
265static int omap3_evm_enable_tv(struct omap_dss_device *dssdev)
266{
267 return 0;
268}
269
270static void omap3_evm_disable_tv(struct omap_dss_device *dssdev)
271{
272}
273
274static struct omap_dss_device omap3_evm_tv_device = {
275 .name = "tv",
276 .driver_name = "venc",
277 .type = OMAP_DISPLAY_TYPE_VENC,
278 .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
279 .platform_enable = omap3_evm_enable_tv,
280 .platform_disable = omap3_evm_disable_tv,
281};
282
283static int omap3_evm_enable_dvi(struct omap_dss_device *dssdev)
284{
285 if (lcd_enabled) {
286 printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
287 return -EINVAL;
288 }
289
290 gpio_set_value(OMAP3EVM_DVI_PANEL_EN_GPIO, 1);
291
292 dvi_enabled = 1;
293 return 0;
93} 294}
94 295
95static struct twl4030_hsmmc_info mmc[] = { 296static void omap3_evm_disable_dvi(struct omap_dss_device *dssdev)
297{
298 gpio_set_value(OMAP3EVM_DVI_PANEL_EN_GPIO, 0);
299
300 dvi_enabled = 0;
301}
302
303static struct omap_dss_device omap3_evm_dvi_device = {
304 .name = "dvi",
305 .driver_name = "generic_panel",
306 .type = OMAP_DISPLAY_TYPE_DPI,
307 .phy.dpi.data_lines = 24,
308 .platform_enable = omap3_evm_enable_dvi,
309 .platform_disable = omap3_evm_disable_dvi,
310};
311
312static struct omap_dss_device *omap3_evm_dss_devices[] = {
313 &omap3_evm_lcd_device,
314 &omap3_evm_tv_device,
315 &omap3_evm_dvi_device,
316};
317
318static struct omap_dss_board_info omap3_evm_dss_data = {
319 .num_devices = ARRAY_SIZE(omap3_evm_dss_devices),
320 .devices = omap3_evm_dss_devices,
321 .default_device = &omap3_evm_lcd_device,
322};
323
324static struct platform_device omap3_evm_dss_device = {
325 .name = "omapdss",
326 .id = -1,
327 .dev = {
328 .platform_data = &omap3_evm_dss_data,
329 },
330};
331
332static struct regulator_consumer_supply omap3evm_vmmc1_supply = {
333 .supply = "vmmc",
334};
335
336static struct regulator_consumer_supply omap3evm_vsim_supply = {
337 .supply = "vmmc_aux",
338};
339
340/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
341static struct regulator_init_data omap3evm_vmmc1 = {
342 .constraints = {
343 .min_uV = 1850000,
344 .max_uV = 3150000,
345 .valid_modes_mask = REGULATOR_MODE_NORMAL
346 | REGULATOR_MODE_STANDBY,
347 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
348 | REGULATOR_CHANGE_MODE
349 | REGULATOR_CHANGE_STATUS,
350 },
351 .num_consumer_supplies = 1,
352 .consumer_supplies = &omap3evm_vmmc1_supply,
353};
354
355/* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
356static struct regulator_init_data omap3evm_vsim = {
357 .constraints = {
358 .min_uV = 1800000,
359 .max_uV = 3000000,
360 .valid_modes_mask = REGULATOR_MODE_NORMAL
361 | REGULATOR_MODE_STANDBY,
362 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
363 | REGULATOR_CHANGE_MODE
364 | REGULATOR_CHANGE_STATUS,
365 },
366 .num_consumer_supplies = 1,
367 .consumer_supplies = &omap3evm_vsim_supply,
368};
369
370static struct omap2_hsmmc_info mmc[] = {
96 { 371 {
97 .mmc = 1, 372 .mmc = 1,
98 .wires = 4, 373 .wires = 4,
@@ -130,15 +405,27 @@ static int omap3evm_twl_gpio_setup(struct device *dev,
130 unsigned gpio, unsigned ngpio) 405 unsigned gpio, unsigned ngpio)
131{ 406{
132 /* gpio + 0 is "mmc0_cd" (input/IRQ) */ 407 /* gpio + 0 is "mmc0_cd" (input/IRQ) */
133 omap_cfg_reg(L8_34XX_GPIO63); 408 omap_mux_init_gpio(63, OMAP_PIN_INPUT);
134 mmc[0].gpio_cd = gpio + 0; 409 mmc[0].gpio_cd = gpio + 0;
135 twl4030_mmc_init(mmc); 410 omap2_hsmmc_init(mmc);
411
412 /* link regulators to MMC adapters */
413 omap3evm_vmmc1_supply.dev = mmc[0].dev;
414 omap3evm_vsim_supply.dev = mmc[0].dev;
136 415
137 /* 416 /*
138 * Most GPIOs are for USB OTG. Some are mostly sent to 417 * Most GPIOs are for USB OTG. Some are mostly sent to
139 * the P2 connector; notably LEDA for the LCD backlight. 418 * the P2 connector; notably LEDA for the LCD backlight.
140 */ 419 */
141 420
421 /* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */
422 gpio_request(gpio + TWL4030_GPIO_MAX, "EN_LCD_BKL");
423 gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0);
424
425 /* gpio + 7 == DVI Enable */
426 gpio_request(gpio + 7, "EN_DVI");
427 gpio_direction_output(gpio + 7, 0);
428
142 /* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */ 429 /* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
143 gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; 430 gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
144 431
@@ -161,20 +448,23 @@ static struct twl4030_usb_data omap3evm_usb_data = {
161 448
162static int board_keymap[] = { 449static int board_keymap[] = {
163 KEY(0, 0, KEY_LEFT), 450 KEY(0, 0, KEY_LEFT),
164 KEY(0, 1, KEY_RIGHT), 451 KEY(0, 1, KEY_DOWN),
165 KEY(0, 2, KEY_A), 452 KEY(0, 2, KEY_ENTER),
166 KEY(0, 3, KEY_B), 453 KEY(0, 3, KEY_M),
167 KEY(1, 0, KEY_DOWN), 454
455 KEY(1, 0, KEY_RIGHT),
168 KEY(1, 1, KEY_UP), 456 KEY(1, 1, KEY_UP),
169 KEY(1, 2, KEY_E), 457 KEY(1, 2, KEY_I),
170 KEY(1, 3, KEY_F), 458 KEY(1, 3, KEY_N),
171 KEY(2, 0, KEY_ENTER), 459
172 KEY(2, 1, KEY_I), 460 KEY(2, 0, KEY_A),
461 KEY(2, 1, KEY_E),
173 KEY(2, 2, KEY_J), 462 KEY(2, 2, KEY_J),
174 KEY(2, 3, KEY_K), 463 KEY(2, 3, KEY_O),
175 KEY(3, 0, KEY_M), 464
176 KEY(3, 1, KEY_N), 465 KEY(3, 0, KEY_B),
177 KEY(3, 2, KEY_O), 466 KEY(3, 1, KEY_F),
467 KEY(3, 2, KEY_K),
178 KEY(3, 3, KEY_P) 468 KEY(3, 3, KEY_P)
179}; 469};
180 470
@@ -194,6 +484,56 @@ static struct twl4030_madc_platform_data omap3evm_madc_data = {
194 .irq_line = 1, 484 .irq_line = 1,
195}; 485};
196 486
487static struct twl4030_codec_audio_data omap3evm_audio_data = {
488 .audio_mclk = 26000000,
489};
490
491static struct twl4030_codec_data omap3evm_codec_data = {
492 .audio_mclk = 26000000,
493 .audio = &omap3evm_audio_data,
494};
495
496static struct regulator_consumer_supply omap3_evm_vdda_dac_supply = {
497 .supply = "vdda_dac",
498 .dev = &omap3_evm_dss_device.dev,
499};
500
501/* VDAC for DSS driving S-Video */
502static struct regulator_init_data omap3_evm_vdac = {
503 .constraints = {
504 .min_uV = 1800000,
505 .max_uV = 1800000,
506 .apply_uV = true,
507 .valid_modes_mask = REGULATOR_MODE_NORMAL
508 | REGULATOR_MODE_STANDBY,
509 .valid_ops_mask = REGULATOR_CHANGE_MODE
510 | REGULATOR_CHANGE_STATUS,
511 },
512 .num_consumer_supplies = 1,
513 .consumer_supplies = &omap3_evm_vdda_dac_supply,
514};
515
516/* VPLL2 for digital video outputs */
517static struct regulator_consumer_supply omap3_evm_vpll2_supply = {
518 .supply = "vdvi",
519 .dev = &omap3_evm_lcd_device.dev,
520};
521
522static struct regulator_init_data omap3_evm_vpll2 = {
523 .constraints = {
524 .name = "VDVI",
525 .min_uV = 1800000,
526 .max_uV = 1800000,
527 .apply_uV = true,
528 .valid_modes_mask = REGULATOR_MODE_NORMAL
529 | REGULATOR_MODE_STANDBY,
530 .valid_ops_mask = REGULATOR_CHANGE_MODE
531 | REGULATOR_CHANGE_STATUS,
532 },
533 .num_consumer_supplies = 1,
534 .consumer_supplies = &omap3_evm_vpll2_supply,
535};
536
197static struct twl4030_platform_data omap3evm_twldata = { 537static struct twl4030_platform_data omap3evm_twldata = {
198 .irq_base = TWL4030_IRQ_BASE, 538 .irq_base = TWL4030_IRQ_BASE,
199 .irq_end = TWL4030_IRQ_END, 539 .irq_end = TWL4030_IRQ_END,
@@ -203,6 +543,9 @@ static struct twl4030_platform_data omap3evm_twldata = {
203 .madc = &omap3evm_madc_data, 543 .madc = &omap3evm_madc_data,
204 .usb = &omap3evm_usb_data, 544 .usb = &omap3evm_usb_data,
205 .gpio = &omap3evm_gpio_data, 545 .gpio = &omap3evm_gpio_data,
546 .codec = &omap3evm_codec_data,
547 .vdac = &omap3_evm_vdac,
548 .vpll2 = &omap3_evm_vpll2,
206}; 549};
207 550
208static struct i2c_board_info __initdata omap3evm_i2c_boardinfo[] = { 551static struct i2c_board_info __initdata omap3evm_i2c_boardinfo[] = {
@@ -216,6 +559,13 @@ static struct i2c_board_info __initdata omap3evm_i2c_boardinfo[] = {
216 559
217static int __init omap3_evm_i2c_init(void) 560static int __init omap3_evm_i2c_init(void)
218{ 561{
562 /*
563 * REVISIT: These entries can be set in omap3evm_twl_data
564 * after a merge with MFD tree
565 */
566 omap3evm_twldata.vmmc1 = &omap3evm_vmmc1;
567 omap3evm_twldata.vsim = &omap3evm_vsim;
568
219 omap_register_i2c_bus(1, 2600, omap3evm_i2c_boardinfo, 569 omap_register_i2c_bus(1, 2600, omap3evm_i2c_boardinfo,
220 ARRAY_SIZE(omap3evm_i2c_boardinfo)); 570 ARRAY_SIZE(omap3evm_i2c_boardinfo));
221 omap_register_i2c_bus(2, 400, NULL, 0); 571 omap_register_i2c_bus(2, 400, NULL, 0);
@@ -223,15 +573,6 @@ static int __init omap3_evm_i2c_init(void)
223 return 0; 573 return 0;
224} 574}
225 575
226static struct platform_device omap3_evm_lcd_device = {
227 .name = "omap3evm_lcd",
228 .id = -1,
229};
230
231static struct omap_lcd_config omap3_evm_lcd_config __initdata = {
232 .ctrl_name = "internal",
233};
234
235static void ads7846_dev_init(void) 576static void ads7846_dev_init(void)
236{ 577{
237 if (gpio_request(OMAP3_EVM_TS_GPIO, "ADS7846 pendown") < 0) 578 if (gpio_request(OMAP3_EVM_TS_GPIO, "ADS7846 pendown") < 0)
@@ -279,7 +620,6 @@ struct spi_board_info omap3evm_spi_board_info[] = {
279}; 620};
280 621
281static struct omap_board_config_kernel omap3_evm_config[] __initdata = { 622static struct omap_board_config_kernel omap3_evm_config[] __initdata = {
282 { OMAP_TAG_LCD, &omap3_evm_lcd_config },
283}; 623};
284 624
285static void __init omap3_evm_init_irq(void) 625static void __init omap3_evm_init_irq(void)
@@ -289,16 +629,50 @@ static void __init omap3_evm_init_irq(void)
289 omap2_init_common_hw(mt46h32m32lf6_sdrc_params, NULL); 629 omap2_init_common_hw(mt46h32m32lf6_sdrc_params, NULL);
290 omap_init_irq(); 630 omap_init_irq();
291 omap_gpio_init(); 631 omap_gpio_init();
292 omap3evm_init_smc911x();
293} 632}
294 633
295static struct platform_device *omap3_evm_devices[] __initdata = { 634static struct platform_device *omap3_evm_devices[] __initdata = {
296 &omap3_evm_lcd_device, 635 &omap3_evm_dss_device,
297 &omap3evm_smc911x_device, 636};
637
638static struct ehci_hcd_omap_platform_data ehci_pdata __initdata = {
639
640 .port_mode[0] = EHCI_HCD_OMAP_MODE_UNKNOWN,
641 .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
642 .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
643
644 .phy_reset = true,
645 /* PHY reset GPIO will be runtime programmed based on EVM version */
646 .reset_gpio_port[0] = -EINVAL,
647 .reset_gpio_port[1] = -EINVAL,
648 .reset_gpio_port[2] = -EINVAL
649};
650
651#ifdef CONFIG_OMAP_MUX
652static struct omap_board_mux board_mux[] __initdata = {
653 OMAP3_MUX(SYS_NIRQ, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP |
654 OMAP_PIN_OFF_INPUT_PULLUP |
655 OMAP_PIN_OFF_WAKEUPENABLE),
656 OMAP3_MUX(MCSPI1_CS1, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
657 OMAP_PIN_OFF_INPUT_PULLUP |
658 OMAP_PIN_OFF_WAKEUPENABLE),
659 { .reg_offset = OMAP_MUX_TERMINATOR },
660};
661#else
662#define board_mux NULL
663#endif
664
665static struct omap_musb_board_data musb_board_data = {
666 .interface_type = MUSB_INTERFACE_ULPI,
667 .mode = MUSB_OTG,
668 .power = 100,
298}; 669};
299 670
300static void __init omap3_evm_init(void) 671static void __init omap3_evm_init(void)
301{ 672{
673 omap3_evm_get_revision();
674 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
675
302 omap3_evm_i2c_init(); 676 omap3_evm_i2c_init();
303 677
304 platform_add_devices(omap3_evm_devices, ARRAY_SIZE(omap3_evm_devices)); 678 platform_add_devices(omap3_evm_devices, ARRAY_SIZE(omap3_evm_devices));
@@ -307,24 +681,49 @@ static void __init omap3_evm_init(void)
307 ARRAY_SIZE(omap3evm_spi_board_info)); 681 ARRAY_SIZE(omap3evm_spi_board_info));
308 682
309 omap_serial_init(); 683 omap_serial_init();
310#ifdef CONFIG_NOP_USB_XCEIV 684
311 /* OMAP3EVM uses ISP1504 phy and so register nop transceiver */ 685 /* OMAP3EVM uses ISP1504 phy and so register nop transceiver */
312 usb_nop_xceiv_register(); 686 usb_nop_xceiv_register();
313#endif 687
314 usb_musb_init(); 688 if (get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) {
689 /* enable EHCI VBUS using GPIO22 */
690 omap_mux_init_gpio(22, OMAP_PIN_INPUT_PULLUP);
691 gpio_request(OMAP3_EVM_EHCI_VBUS, "enable EHCI VBUS");
692 gpio_direction_output(OMAP3_EVM_EHCI_VBUS, 0);
693 gpio_set_value(OMAP3_EVM_EHCI_VBUS, 1);
694
695 /* Select EHCI port on main board */
696 omap_mux_init_gpio(61, OMAP_PIN_INPUT_PULLUP);
697 gpio_request(OMAP3_EVM_EHCI_SELECT, "select EHCI port");
698 gpio_direction_output(OMAP3_EVM_EHCI_SELECT, 0);
699 gpio_set_value(OMAP3_EVM_EHCI_SELECT, 0);
700
701 /* setup EHCI phy reset config */
702 omap_mux_init_gpio(21, OMAP_PIN_INPUT_PULLUP);
703 ehci_pdata.reset_gpio_port[1] = 21;
704
705 } else {
706 /* setup EHCI phy reset on MDC */
707 omap_mux_init_gpio(135, OMAP_PIN_OUTPUT);
708 ehci_pdata.reset_gpio_port[1] = 135;
709 }
710 usb_musb_init(&musb_board_data);
711 usb_ehci_init(&ehci_pdata);
315 ads7846_dev_init(); 712 ads7846_dev_init();
713 omap3evm_init_smsc911x();
714 omap3_evm_display_init();
316} 715}
317 716
318static void __init omap3_evm_map_io(void) 717static void __init omap3_evm_map_io(void)
319{ 718{
320 omap2_set_globals_343x(); 719 omap2_set_globals_343x();
321 omap2_map_common_io(); 720 omap34xx_map_common_io();
322} 721}
323 722
324MACHINE_START(OMAP3EVM, "OMAP3 EVM") 723MACHINE_START(OMAP3EVM, "OMAP3 EVM")
325 /* Maintainer: Syed Mohammed Khasim - Texas Instruments */ 724 /* Maintainer: Syed Mohammed Khasim - Texas Instruments */
326 .phys_io = 0x48000000, 725 .phys_io = 0x48000000,
327 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, 726 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
328 .boot_params = 0x80000100, 727 .boot_params = 0x80000100,
329 .map_io = omap3_evm_map_io, 728 .map_io = omap3_evm_map_io,
330 .init_irq = omap3_evm_init_irq, 729 .init_irq = omap3_evm_init_irq,
diff --git a/arch/arm/mach-omap2/board-omap3pandora.c b/arch/arm/mach-omap2/board-omap3pandora.c
index 7519edb69155..395d049bf010 100644
--- a/arch/arm/mach-omap2/board-omap3pandora.c
+++ b/arch/arm/mach-omap2/board-omap3pandora.c
@@ -24,7 +24,7 @@
24#include <linux/spi/spi.h> 24#include <linux/spi/spi.h>
25#include <linux/spi/ads7846.h> 25#include <linux/spi/ads7846.h>
26#include <linux/regulator/machine.h> 26#include <linux/regulator/machine.h>
27#include <linux/i2c/twl4030.h> 27#include <linux/i2c/twl.h>
28#include <linux/leds.h> 28#include <linux/leds.h>
29#include <linux/input.h> 29#include <linux/input.h>
30#include <linux/input/matrix_keypad.h> 30#include <linux/input/matrix_keypad.h>
@@ -34,16 +34,17 @@
34#include <asm/mach/arch.h> 34#include <asm/mach/arch.h>
35#include <asm/mach/map.h> 35#include <asm/mach/map.h>
36 36
37#include <mach/board.h> 37#include <plat/board.h>
38#include <mach/common.h> 38#include <plat/common.h>
39#include <mach/gpio.h> 39#include <mach/gpio.h>
40#include <mach/hardware.h> 40#include <mach/hardware.h>
41#include <mach/mcspi.h> 41#include <plat/mcspi.h>
42#include <mach/usb.h> 42#include <plat/usb.h>
43#include <mach/mux.h> 43#include <plat/display.h>
44 44
45#include "mux.h"
45#include "sdram-micron-mt46h32m32lf-6.h" 46#include "sdram-micron-mt46h32m32lf-6.h"
46#include "mmc-twl4030.h" 47#include "hsmmc.h"
47 48
48#define OMAP3_PANDORA_TS_GPIO 94 49#define OMAP3_PANDORA_TS_GPIO 94
49 50
@@ -98,10 +99,10 @@ static struct gpio_keys_button pandora_gpio_keys[] = {
98 GPIO_BUTTON_LOW(103, KEY_DOWN, "down"), 99 GPIO_BUTTON_LOW(103, KEY_DOWN, "down"),
99 GPIO_BUTTON_LOW(96, KEY_LEFT, "left"), 100 GPIO_BUTTON_LOW(96, KEY_LEFT, "left"),
100 GPIO_BUTTON_LOW(98, KEY_RIGHT, "right"), 101 GPIO_BUTTON_LOW(98, KEY_RIGHT, "right"),
101 GPIO_BUTTON_LOW(111, BTN_A, "a"), 102 GPIO_BUTTON_LOW(109, KEY_KP1, "game 1"),
102 GPIO_BUTTON_LOW(106, BTN_B, "b"), 103 GPIO_BUTTON_LOW(111, KEY_KP2, "game 2"),
103 GPIO_BUTTON_LOW(109, BTN_X, "x"), 104 GPIO_BUTTON_LOW(106, KEY_KP3, "game 3"),
104 GPIO_BUTTON_LOW(101, BTN_Y, "y"), 105 GPIO_BUTTON_LOW(101, KEY_KP4, "game 4"),
105 GPIO_BUTTON_LOW(102, BTN_TL, "l"), 106 GPIO_BUTTON_LOW(102, BTN_TL, "l"),
106 GPIO_BUTTON_LOW(97, BTN_TL2, "l2"), 107 GPIO_BUTTON_LOW(97, BTN_TL2, "l2"),
107 GPIO_BUTTON_LOW(105, BTN_TR, "r"), 108 GPIO_BUTTON_LOW(105, BTN_TR, "r"),
@@ -192,7 +193,41 @@ static struct twl4030_keypad_data pandora_kp_data = {
192 .rep = 1, 193 .rep = 1,
193}; 194};
194 195
195static struct twl4030_hsmmc_info omap3pandora_mmc[] = { 196static struct omap_dss_device pandora_lcd_device = {
197 .name = "lcd",
198 .driver_name = "tpo_td043mtea1_panel",
199 .type = OMAP_DISPLAY_TYPE_DPI,
200 .phy.dpi.data_lines = 24,
201 .reset_gpio = 157,
202};
203
204static struct omap_dss_device pandora_tv_device = {
205 .name = "tv",
206 .driver_name = "venc",
207 .type = OMAP_DISPLAY_TYPE_VENC,
208 .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
209};
210
211static struct omap_dss_device *pandora_dss_devices[] = {
212 &pandora_lcd_device,
213 &pandora_tv_device,
214};
215
216static struct omap_dss_board_info pandora_dss_data = {
217 .num_devices = ARRAY_SIZE(pandora_dss_devices),
218 .devices = pandora_dss_devices,
219 .default_device = &pandora_lcd_device,
220};
221
222static struct platform_device pandora_dss_device = {
223 .name = "omapdss",
224 .id = -1,
225 .dev = {
226 .platform_data = &pandora_dss_data,
227 },
228};
229
230static struct omap2_hsmmc_info omap3pandora_mmc[] = {
196 { 231 {
197 .mmc = 1, 232 .mmc = 1,
198 .wires = 4, 233 .wires = 4,
@@ -217,25 +252,13 @@ static struct twl4030_hsmmc_info omap3pandora_mmc[] = {
217 {} /* Terminator */ 252 {} /* Terminator */
218}; 253};
219 254
220static struct regulator_consumer_supply pandora_vmmc1_supply = {
221 .supply = "vmmc",
222};
223
224static struct regulator_consumer_supply pandora_vmmc2_supply = {
225 .supply = "vmmc",
226};
227
228static int omap3pandora_twl_gpio_setup(struct device *dev, 255static int omap3pandora_twl_gpio_setup(struct device *dev,
229 unsigned gpio, unsigned ngpio) 256 unsigned gpio, unsigned ngpio)
230{ 257{
231 /* gpio + {0,1} is "mmc{0,1}_cd" (input/IRQ) */ 258 /* gpio + {0,1} is "mmc{0,1}_cd" (input/IRQ) */
232 omap3pandora_mmc[0].gpio_cd = gpio + 0; 259 omap3pandora_mmc[0].gpio_cd = gpio + 0;
233 omap3pandora_mmc[1].gpio_cd = gpio + 1; 260 omap3pandora_mmc[1].gpio_cd = gpio + 1;
234 twl4030_mmc_init(omap3pandora_mmc); 261 omap2_hsmmc_init(omap3pandora_mmc);
235
236 /* link regulators to MMC adapters */
237 pandora_vmmc1_supply.dev = omap3pandora_mmc[0].dev;
238 pandora_vmmc2_supply.dev = omap3pandora_mmc[1].dev;
239 262
240 return 0; 263 return 0;
241} 264}
@@ -247,6 +270,36 @@ static struct twl4030_gpio_platform_data omap3pandora_gpio_data = {
247 .setup = omap3pandora_twl_gpio_setup, 270 .setup = omap3pandora_twl_gpio_setup,
248}; 271};
249 272
273static struct regulator_consumer_supply pandora_vmmc1_supply =
274 REGULATOR_SUPPLY("vmmc", "mmci-omap-hs.0");
275
276static struct regulator_consumer_supply pandora_vmmc2_supply =
277 REGULATOR_SUPPLY("vmmc", "mmci-omap-hs.1");
278
279static struct regulator_consumer_supply pandora_vdda_dac_supply =
280 REGULATOR_SUPPLY("vdda_dac", "omapdss");
281
282static struct regulator_consumer_supply pandora_vdds_supplies[] = {
283 REGULATOR_SUPPLY("vdds_sdi", "omapdss"),
284 REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
285};
286
287static struct regulator_consumer_supply pandora_vcc_lcd_supply =
288 REGULATOR_SUPPLY("vcc", "display0");
289
290static struct regulator_consumer_supply pandora_usb_phy_supply =
291 REGULATOR_SUPPLY("hsusb0", "ehci-omap.0");
292
293/* ads7846 on SPI and 2 nub controllers on I2C */
294static struct regulator_consumer_supply pandora_vaux4_supplies[] = {
295 REGULATOR_SUPPLY("vcc", "spi1.0"),
296 REGULATOR_SUPPLY("vcc", "3-0066"),
297 REGULATOR_SUPPLY("vcc", "3-0067"),
298};
299
300static struct regulator_consumer_supply pandora_adac_supply =
301 REGULATOR_SUPPLY("vcc", "soc-audio");
302
250/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ 303/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
251static struct regulator_init_data pandora_vmmc1 = { 304static struct regulator_init_data pandora_vmmc1 = {
252 .constraints = { 305 .constraints = {
@@ -277,17 +330,123 @@ static struct regulator_init_data pandora_vmmc2 = {
277 .consumer_supplies = &pandora_vmmc2_supply, 330 .consumer_supplies = &pandora_vmmc2_supply,
278}; 331};
279 332
333/* VDAC for DSS driving S-Video */
334static struct regulator_init_data pandora_vdac = {
335 .constraints = {
336 .min_uV = 1800000,
337 .max_uV = 1800000,
338 .apply_uV = true,
339 .valid_modes_mask = REGULATOR_MODE_NORMAL
340 | REGULATOR_MODE_STANDBY,
341 .valid_ops_mask = REGULATOR_CHANGE_MODE
342 | REGULATOR_CHANGE_STATUS,
343 },
344 .num_consumer_supplies = 1,
345 .consumer_supplies = &pandora_vdda_dac_supply,
346};
347
348/* VPLL2 for digital video outputs */
349static struct regulator_init_data pandora_vpll2 = {
350 .constraints = {
351 .min_uV = 1800000,
352 .max_uV = 1800000,
353 .apply_uV = true,
354 .valid_modes_mask = REGULATOR_MODE_NORMAL
355 | REGULATOR_MODE_STANDBY,
356 .valid_ops_mask = REGULATOR_CHANGE_MODE
357 | REGULATOR_CHANGE_STATUS,
358 },
359 .num_consumer_supplies = ARRAY_SIZE(pandora_vdds_supplies),
360 .consumer_supplies = pandora_vdds_supplies,
361};
362
363/* VAUX1 for LCD */
364static struct regulator_init_data pandora_vaux1 = {
365 .constraints = {
366 .min_uV = 3000000,
367 .max_uV = 3000000,
368 .apply_uV = true,
369 .valid_modes_mask = REGULATOR_MODE_NORMAL
370 | REGULATOR_MODE_STANDBY,
371 .valid_ops_mask = REGULATOR_CHANGE_MODE
372 | REGULATOR_CHANGE_STATUS,
373 },
374 .num_consumer_supplies = 1,
375 .consumer_supplies = &pandora_vcc_lcd_supply,
376};
377
378/* VAUX2 for USB host PHY */
379static struct regulator_init_data pandora_vaux2 = {
380 .constraints = {
381 .min_uV = 1800000,
382 .max_uV = 1800000,
383 .apply_uV = true,
384 .valid_modes_mask = REGULATOR_MODE_NORMAL
385 | REGULATOR_MODE_STANDBY,
386 .valid_ops_mask = REGULATOR_CHANGE_MODE
387 | REGULATOR_CHANGE_STATUS,
388 },
389 .num_consumer_supplies = 1,
390 .consumer_supplies = &pandora_usb_phy_supply,
391};
392
393/* VAUX4 for ads7846 and nubs */
394static struct regulator_init_data pandora_vaux4 = {
395 .constraints = {
396 .min_uV = 2800000,
397 .max_uV = 2800000,
398 .apply_uV = true,
399 .valid_modes_mask = REGULATOR_MODE_NORMAL
400 | REGULATOR_MODE_STANDBY,
401 .valid_ops_mask = REGULATOR_CHANGE_MODE
402 | REGULATOR_CHANGE_STATUS,
403 },
404 .num_consumer_supplies = ARRAY_SIZE(pandora_vaux4_supplies),
405 .consumer_supplies = pandora_vaux4_supplies,
406};
407
408/* VSIM for audio DAC */
409static struct regulator_init_data pandora_vsim = {
410 .constraints = {
411 .min_uV = 2800000,
412 .max_uV = 2800000,
413 .apply_uV = true,
414 .valid_modes_mask = REGULATOR_MODE_NORMAL
415 | REGULATOR_MODE_STANDBY,
416 .valid_ops_mask = REGULATOR_CHANGE_MODE
417 | REGULATOR_CHANGE_STATUS,
418 },
419 .num_consumer_supplies = 1,
420 .consumer_supplies = &pandora_adac_supply,
421};
422
280static struct twl4030_usb_data omap3pandora_usb_data = { 423static struct twl4030_usb_data omap3pandora_usb_data = {
281 .usb_mode = T2_USB_MODE_ULPI, 424 .usb_mode = T2_USB_MODE_ULPI,
282}; 425};
283 426
427static struct twl4030_codec_audio_data omap3pandora_audio_data = {
428 .audio_mclk = 26000000,
429};
430
431static struct twl4030_codec_data omap3pandora_codec_data = {
432 .audio_mclk = 26000000,
433 .audio = &omap3pandora_audio_data,
434};
435
284static struct twl4030_platform_data omap3pandora_twldata = { 436static struct twl4030_platform_data omap3pandora_twldata = {
285 .irq_base = TWL4030_IRQ_BASE, 437 .irq_base = TWL4030_IRQ_BASE,
286 .irq_end = TWL4030_IRQ_END, 438 .irq_end = TWL4030_IRQ_END,
287 .gpio = &omap3pandora_gpio_data, 439 .gpio = &omap3pandora_gpio_data,
288 .usb = &omap3pandora_usb_data, 440 .usb = &omap3pandora_usb_data,
441 .codec = &omap3pandora_codec_data,
289 .vmmc1 = &pandora_vmmc1, 442 .vmmc1 = &pandora_vmmc1,
290 .vmmc2 = &pandora_vmmc2, 443 .vmmc2 = &pandora_vmmc2,
444 .vdac = &pandora_vdac,
445 .vpll2 = &pandora_vpll2,
446 .vaux1 = &pandora_vaux1,
447 .vaux2 = &pandora_vaux2,
448 .vaux4 = &pandora_vaux4,
449 .vsim = &pandora_vsim,
291 .keypad = &pandora_kp_data, 450 .keypad = &pandora_kp_data,
292}; 451};
293 452
@@ -300,12 +459,20 @@ static struct i2c_board_info __initdata omap3pandora_i2c_boardinfo[] = {
300 }, 459 },
301}; 460};
302 461
462static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo[] = {
463 {
464 I2C_BOARD_INFO("bq27500", 0x55),
465 .flags = I2C_CLIENT_WAKE,
466 },
467};
468
303static int __init omap3pandora_i2c_init(void) 469static int __init omap3pandora_i2c_init(void)
304{ 470{
305 omap_register_i2c_bus(1, 2600, omap3pandora_i2c_boardinfo, 471 omap_register_i2c_bus(1, 2600, omap3pandora_i2c_boardinfo,
306 ARRAY_SIZE(omap3pandora_i2c_boardinfo)); 472 ARRAY_SIZE(omap3pandora_i2c_boardinfo));
307 /* i2c2 pins are not connected */ 473 /* i2c2 pins are not connected */
308 omap_register_i2c_bus(3, 400, NULL, 0); 474 omap_register_i2c_bus(3, 100, omap3pandora_i2c3_boardinfo,
475 ARRAY_SIZE(omap3pandora_i2c3_boardinfo));
309 return 0; 476 return 0;
310} 477}
311 478
@@ -355,26 +522,17 @@ static struct spi_board_info omap3pandora_spi_board_info[] __initdata = {
355 .controller_data = &ads7846_mcspi_config, 522 .controller_data = &ads7846_mcspi_config,
356 .irq = OMAP_GPIO_IRQ(OMAP3_PANDORA_TS_GPIO), 523 .irq = OMAP_GPIO_IRQ(OMAP3_PANDORA_TS_GPIO),
357 .platform_data = &ads7846_config, 524 .platform_data = &ads7846_config,
525 }, {
526 .modalias = "tpo_td043mtea1_panel_spi",
527 .bus_num = 1,
528 .chip_select = 1,
529 .max_speed_hz = 375000,
530 .platform_data = &pandora_lcd_device,
358 } 531 }
359}; 532};
360 533
361static struct platform_device omap3pandora_lcd_device = {
362 .name = "pandora_lcd",
363 .id = -1,
364};
365
366static struct omap_lcd_config omap3pandora_lcd_config __initdata = {
367 .ctrl_name = "internal",
368};
369
370static struct omap_board_config_kernel omap3pandora_config[] __initdata = {
371 { OMAP_TAG_LCD, &omap3pandora_lcd_config },
372};
373
374static void __init omap3pandora_init_irq(void) 534static void __init omap3pandora_init_irq(void)
375{ 535{
376 omap_board_config = omap3pandora_config;
377 omap_board_config_size = ARRAY_SIZE(omap3pandora_config);
378 omap2_init_common_hw(mt46h32m32lf6_sdrc_params, 536 omap2_init_common_hw(mt46h32m32lf6_sdrc_params,
379 mt46h32m32lf6_sdrc_params); 537 mt46h32m32lf6_sdrc_params);
380 omap_init_irq(); 538 omap_init_irq();
@@ -382,13 +540,40 @@ static void __init omap3pandora_init_irq(void)
382} 540}
383 541
384static struct platform_device *omap3pandora_devices[] __initdata = { 542static struct platform_device *omap3pandora_devices[] __initdata = {
385 &omap3pandora_lcd_device,
386 &pandora_leds_gpio, 543 &pandora_leds_gpio,
387 &pandora_keys_gpio, 544 &pandora_keys_gpio,
545 &pandora_dss_device,
546};
547
548static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
549
550 .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
551 .port_mode[1] = EHCI_HCD_OMAP_MODE_UNKNOWN,
552 .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
553
554 .phy_reset = true,
555 .reset_gpio_port[0] = 16,
556 .reset_gpio_port[1] = -EINVAL,
557 .reset_gpio_port[2] = -EINVAL
558};
559
560#ifdef CONFIG_OMAP_MUX
561static struct omap_board_mux board_mux[] __initdata = {
562 { .reg_offset = OMAP_MUX_TERMINATOR },
563};
564#else
565#define board_mux NULL
566#endif
567
568static struct omap_musb_board_data musb_board_data = {
569 .interface_type = MUSB_INTERFACE_ULPI,
570 .mode = MUSB_OTG,
571 .power = 100,
388}; 572};
389 573
390static void __init omap3pandora_init(void) 574static void __init omap3pandora_init(void)
391{ 575{
576 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
392 omap3pandora_i2c_init(); 577 omap3pandora_i2c_init();
393 platform_add_devices(omap3pandora_devices, 578 platform_add_devices(omap3pandora_devices,
394 ARRAY_SIZE(omap3pandora_devices)); 579 ARRAY_SIZE(omap3pandora_devices));
@@ -396,23 +581,24 @@ static void __init omap3pandora_init(void)
396 spi_register_board_info(omap3pandora_spi_board_info, 581 spi_register_board_info(omap3pandora_spi_board_info,
397 ARRAY_SIZE(omap3pandora_spi_board_info)); 582 ARRAY_SIZE(omap3pandora_spi_board_info));
398 omap3pandora_ads7846_init(); 583 omap3pandora_ads7846_init();
584 usb_ehci_init(&ehci_pdata);
399 pandora_keys_gpio_init(); 585 pandora_keys_gpio_init();
400 usb_musb_init(); 586 usb_musb_init(&musb_board_data);
401 587
402 /* Ensure SDRC pins are mux'd for self-refresh */ 588 /* Ensure SDRC pins are mux'd for self-refresh */
403 omap_cfg_reg(H16_34XX_SDRC_CKE0); 589 omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
404 omap_cfg_reg(H17_34XX_SDRC_CKE1); 590 omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
405} 591}
406 592
407static void __init omap3pandora_map_io(void) 593static void __init omap3pandora_map_io(void)
408{ 594{
409 omap2_set_globals_343x(); 595 omap2_set_globals_343x();
410 omap2_map_common_io(); 596 omap34xx_map_common_io();
411} 597}
412 598
413MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console") 599MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console")
414 .phys_io = 0x48000000, 600 .phys_io = 0x48000000,
415 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, 601 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
416 .boot_params = 0x80000100, 602 .boot_params = 0x80000100,
417 .map_io = omap3pandora_map_io, 603 .map_io = omap3pandora_map_io,
418 .init_irq = omap3pandora_init_irq, 604 .init_irq = omap3pandora_init_irq,
diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c
new file mode 100644
index 000000000000..2504d41f923e
--- /dev/null
+++ b/arch/arm/mach-omap2/board-omap3touchbook.c
@@ -0,0 +1,578 @@
1/*
2 * linux/arch/arm/mach-omap2/board-omap3touchbook.c
3 *
4 * Copyright (C) 2009 Always Innovating
5 *
6 * Modified from mach-omap2/board-omap3beagleboard.c
7 *
8 * Initial code: Grégoire Gentil, Tim Yamin
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 */
14
15#include <linux/kernel.h>
16#include <linux/init.h>
17#include <linux/platform_device.h>
18#include <linux/delay.h>
19#include <linux/err.h>
20#include <linux/clk.h>
21#include <linux/io.h>
22#include <linux/leds.h>
23#include <linux/gpio.h>
24#include <linux/input.h>
25#include <linux/gpio_keys.h>
26
27#include <linux/mtd/mtd.h>
28#include <linux/mtd/partitions.h>
29#include <linux/mtd/nand.h>
30
31#include <plat/mcspi.h>
32#include <linux/spi/spi.h>
33
34#include <linux/spi/ads7846.h>
35
36#include <linux/regulator/machine.h>
37#include <linux/i2c/twl.h>
38
39#include <mach/hardware.h>
40#include <asm/mach-types.h>
41#include <asm/mach/arch.h>
42#include <asm/mach/map.h>
43#include <asm/mach/flash.h>
44
45#include <plat/board.h>
46#include <plat/common.h>
47#include <plat/gpmc.h>
48#include <plat/nand.h>
49#include <plat/usb.h>
50#include <plat/timer-gp.h>
51
52#include "mux.h"
53#include "hsmmc.h"
54
55#include <asm/setup.h>
56
57#define GPMC_CS0_BASE 0x60
58#define GPMC_CS_SIZE 0x30
59
60#define NAND_BLOCK_SIZE SZ_128K
61
62#define OMAP3_AC_GPIO 136
63#define OMAP3_TS_GPIO 162
64#define TB_BL_PWM_TIMER 9
65#define TB_KILL_POWER_GPIO 168
66
67unsigned long touchbook_revision;
68
69static struct mtd_partition omap3touchbook_nand_partitions[] = {
70 /* All the partition sizes are listed in terms of NAND block size */
71 {
72 .name = "X-Loader",
73 .offset = 0,
74 .size = 4 * NAND_BLOCK_SIZE,
75 .mask_flags = MTD_WRITEABLE, /* force read-only */
76 },
77 {
78 .name = "U-Boot",
79 .offset = MTDPART_OFS_APPEND, /* Offset = 0x80000 */
80 .size = 15 * NAND_BLOCK_SIZE,
81 .mask_flags = MTD_WRITEABLE, /* force read-only */
82 },
83 {
84 .name = "U-Boot Env",
85 .offset = MTDPART_OFS_APPEND, /* Offset = 0x260000 */
86 .size = 1 * NAND_BLOCK_SIZE,
87 },
88 {
89 .name = "Kernel",
90 .offset = MTDPART_OFS_APPEND, /* Offset = 0x280000 */
91 .size = 32 * NAND_BLOCK_SIZE,
92 },
93 {
94 .name = "File System",
95 .offset = MTDPART_OFS_APPEND, /* Offset = 0x680000 */
96 .size = MTDPART_SIZ_FULL,
97 },
98};
99
100static struct omap_nand_platform_data omap3touchbook_nand_data = {
101 .options = NAND_BUSWIDTH_16,
102 .parts = omap3touchbook_nand_partitions,
103 .nr_parts = ARRAY_SIZE(omap3touchbook_nand_partitions),
104 .dma_channel = -1, /* disable DMA in OMAP NAND driver */
105 .nand_setup = NULL,
106 .dev_ready = NULL,
107};
108
109static struct resource omap3touchbook_nand_resource = {
110 .flags = IORESOURCE_MEM,
111};
112
113static struct platform_device omap3touchbook_nand_device = {
114 .name = "omap2-nand",
115 .id = -1,
116 .dev = {
117 .platform_data = &omap3touchbook_nand_data,
118 },
119 .num_resources = 1,
120 .resource = &omap3touchbook_nand_resource,
121};
122
123#include "sdram-micron-mt46h32m32lf-6.h"
124
125static struct omap2_hsmmc_info mmc[] = {
126 {
127 .mmc = 1,
128 .wires = 8,
129 .gpio_wp = 29,
130 },
131 {} /* Terminator */
132};
133
134static struct platform_device omap3_touchbook_lcd_device = {
135 .name = "omap3touchbook_lcd",
136 .id = -1,
137};
138
139static struct omap_lcd_config omap3_touchbook_lcd_config __initdata = {
140 .ctrl_name = "internal",
141};
142
143static struct regulator_consumer_supply touchbook_vmmc1_supply = {
144 .supply = "vmmc",
145};
146
147static struct regulator_consumer_supply touchbook_vsim_supply = {
148 .supply = "vmmc_aux",
149};
150
151static struct gpio_led gpio_leds[];
152
153static int touchbook_twl_gpio_setup(struct device *dev,
154 unsigned gpio, unsigned ngpio)
155{
156 if (system_rev >= 0x20 && system_rev <= 0x34301000) {
157 omap_mux_init_gpio(23, OMAP_PIN_INPUT);
158 mmc[0].gpio_wp = 23;
159 } else {
160 omap_mux_init_gpio(29, OMAP_PIN_INPUT);
161 }
162 /* gpio + 0 is "mmc0_cd" (input/IRQ) */
163 mmc[0].gpio_cd = gpio + 0;
164 omap2_hsmmc_init(mmc);
165
166 /* link regulators to MMC adapters */
167 touchbook_vmmc1_supply.dev = mmc[0].dev;
168 touchbook_vsim_supply.dev = mmc[0].dev;
169
170 /* REVISIT: need ehci-omap hooks for external VBUS
171 * power switch and overcurrent detect
172 */
173
174 gpio_request(gpio + 1, "EHCI_nOC");
175 gpio_direction_input(gpio + 1);
176
177 /* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, active low) */
178 gpio_request(gpio + TWL4030_GPIO_MAX, "nEN_USB_PWR");
179 gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0);
180
181 /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
182 gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
183
184 return 0;
185}
186
187static struct twl4030_gpio_platform_data touchbook_gpio_data = {
188 .gpio_base = OMAP_MAX_GPIO_LINES,
189 .irq_base = TWL4030_GPIO_IRQ_BASE,
190 .irq_end = TWL4030_GPIO_IRQ_END,
191 .use_leds = true,
192 .pullups = BIT(1),
193 .pulldowns = BIT(2) | BIT(6) | BIT(7) | BIT(8) | BIT(13)
194 | BIT(15) | BIT(16) | BIT(17),
195 .setup = touchbook_twl_gpio_setup,
196};
197
198static struct regulator_consumer_supply touchbook_vdac_supply = {
199 .supply = "vdac",
200 .dev = &omap3_touchbook_lcd_device.dev,
201};
202
203static struct regulator_consumer_supply touchbook_vdvi_supply = {
204 .supply = "vdvi",
205 .dev = &omap3_touchbook_lcd_device.dev,
206};
207
208/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
209static struct regulator_init_data touchbook_vmmc1 = {
210 .constraints = {
211 .min_uV = 1850000,
212 .max_uV = 3150000,
213 .valid_modes_mask = REGULATOR_MODE_NORMAL
214 | REGULATOR_MODE_STANDBY,
215 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
216 | REGULATOR_CHANGE_MODE
217 | REGULATOR_CHANGE_STATUS,
218 },
219 .num_consumer_supplies = 1,
220 .consumer_supplies = &touchbook_vmmc1_supply,
221};
222
223/* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
224static struct regulator_init_data touchbook_vsim = {
225 .constraints = {
226 .min_uV = 1800000,
227 .max_uV = 3000000,
228 .valid_modes_mask = REGULATOR_MODE_NORMAL
229 | REGULATOR_MODE_STANDBY,
230 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
231 | REGULATOR_CHANGE_MODE
232 | REGULATOR_CHANGE_STATUS,
233 },
234 .num_consumer_supplies = 1,
235 .consumer_supplies = &touchbook_vsim_supply,
236};
237
238/* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */
239static struct regulator_init_data touchbook_vdac = {
240 .constraints = {
241 .min_uV = 1800000,
242 .max_uV = 1800000,
243 .valid_modes_mask = REGULATOR_MODE_NORMAL
244 | REGULATOR_MODE_STANDBY,
245 .valid_ops_mask = REGULATOR_CHANGE_MODE
246 | REGULATOR_CHANGE_STATUS,
247 },
248 .num_consumer_supplies = 1,
249 .consumer_supplies = &touchbook_vdac_supply,
250};
251
252/* VPLL2 for digital video outputs */
253static struct regulator_init_data touchbook_vpll2 = {
254 .constraints = {
255 .name = "VDVI",
256 .min_uV = 1800000,
257 .max_uV = 1800000,
258 .valid_modes_mask = REGULATOR_MODE_NORMAL
259 | REGULATOR_MODE_STANDBY,
260 .valid_ops_mask = REGULATOR_CHANGE_MODE
261 | REGULATOR_CHANGE_STATUS,
262 },
263 .num_consumer_supplies = 1,
264 .consumer_supplies = &touchbook_vdvi_supply,
265};
266
267static struct twl4030_usb_data touchbook_usb_data = {
268 .usb_mode = T2_USB_MODE_ULPI,
269};
270
271static struct twl4030_codec_audio_data touchbook_audio_data = {
272 .audio_mclk = 26000000,
273};
274
275static struct twl4030_codec_data touchbook_codec_data = {
276 .audio_mclk = 26000000,
277 .audio = &touchbook_audio_data,
278};
279
280static struct twl4030_platform_data touchbook_twldata = {
281 .irq_base = TWL4030_IRQ_BASE,
282 .irq_end = TWL4030_IRQ_END,
283
284 /* platform_data for children goes here */
285 .usb = &touchbook_usb_data,
286 .gpio = &touchbook_gpio_data,
287 .codec = &touchbook_codec_data,
288 .vmmc1 = &touchbook_vmmc1,
289 .vsim = &touchbook_vsim,
290 .vdac = &touchbook_vdac,
291 .vpll2 = &touchbook_vpll2,
292};
293
294static struct i2c_board_info __initdata touchbook_i2c_boardinfo[] = {
295 {
296 I2C_BOARD_INFO("twl4030", 0x48),
297 .flags = I2C_CLIENT_WAKE,
298 .irq = INT_34XX_SYS_NIRQ,
299 .platform_data = &touchbook_twldata,
300 },
301};
302
303static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = {
304 {
305 I2C_BOARD_INFO("bq27200", 0x55),
306 },
307};
308
309static int __init omap3_touchbook_i2c_init(void)
310{
311 /* Standard TouchBook bus */
312 omap_register_i2c_bus(1, 2600, touchbook_i2c_boardinfo,
313 ARRAY_SIZE(touchbook_i2c_boardinfo));
314
315 /* Additional TouchBook bus */
316 omap_register_i2c_bus(3, 100, touchBook_i2c_boardinfo,
317 ARRAY_SIZE(touchBook_i2c_boardinfo));
318
319 return 0;
320}
321
322static void __init omap3_ads7846_init(void)
323{
324 if (gpio_request(OMAP3_TS_GPIO, "ads7846_pen_down")) {
325 printk(KERN_ERR "Failed to request GPIO %d for "
326 "ads7846 pen down IRQ\n", OMAP3_TS_GPIO);
327 return;
328 }
329
330 gpio_direction_input(OMAP3_TS_GPIO);
331 omap_set_gpio_debounce(OMAP3_TS_GPIO, 1);
332 omap_set_gpio_debounce_time(OMAP3_TS_GPIO, 0xa);
333}
334
335static struct ads7846_platform_data ads7846_config = {
336 .x_min = 100,
337 .y_min = 265,
338 .x_max = 3950,
339 .y_max = 3750,
340 .x_plate_ohms = 40,
341 .pressure_max = 255,
342 .debounce_max = 10,
343 .debounce_tol = 5,
344 .debounce_rep = 1,
345 .gpio_pendown = OMAP3_TS_GPIO,
346 .keep_vref_on = 1,
347};
348
349static struct omap2_mcspi_device_config ads7846_mcspi_config = {
350 .turbo_mode = 0,
351 .single_channel = 1, /* 0: slave, 1: master */
352};
353
354static struct spi_board_info omap3_ads7846_spi_board_info[] __initdata = {
355 {
356 .modalias = "ads7846",
357 .bus_num = 4,
358 .chip_select = 0,
359 .max_speed_hz = 1500000,
360 .controller_data = &ads7846_mcspi_config,
361 .irq = OMAP_GPIO_IRQ(OMAP3_TS_GPIO),
362 .platform_data = &ads7846_config,
363 }
364};
365
366static struct gpio_led gpio_leds[] = {
367 {
368 .name = "touchbook::usr0",
369 .default_trigger = "heartbeat",
370 .gpio = 150,
371 },
372 {
373 .name = "touchbook::usr1",
374 .default_trigger = "mmc0",
375 .gpio = 149,
376 },
377 {
378 .name = "touchbook::pmu_stat",
379 .gpio = -EINVAL, /* gets replaced */
380 .active_low = true,
381 },
382};
383
384static struct gpio_led_platform_data gpio_led_info = {
385 .leds = gpio_leds,
386 .num_leds = ARRAY_SIZE(gpio_leds),
387};
388
389static struct platform_device leds_gpio = {
390 .name = "leds-gpio",
391 .id = -1,
392 .dev = {
393 .platform_data = &gpio_led_info,
394 },
395};
396
397static struct gpio_keys_button gpio_buttons[] = {
398 {
399 .code = BTN_EXTRA,
400 .gpio = 7,
401 .desc = "user",
402 .wakeup = 1,
403 },
404 {
405 .code = KEY_POWER,
406 .gpio = 183,
407 .desc = "power",
408 .wakeup = 1,
409 },
410};
411
412static struct gpio_keys_platform_data gpio_key_info = {
413 .buttons = gpio_buttons,
414 .nbuttons = ARRAY_SIZE(gpio_buttons),
415};
416
417static struct platform_device keys_gpio = {
418 .name = "gpio-keys",
419 .id = -1,
420 .dev = {
421 .platform_data = &gpio_key_info,
422 },
423};
424
425static struct omap_board_config_kernel omap3_touchbook_config[] __initdata = {
426 { OMAP_TAG_LCD, &omap3_touchbook_lcd_config },
427};
428
429#ifdef CONFIG_OMAP_MUX
430static struct omap_board_mux board_mux[] __initdata = {
431 { .reg_offset = OMAP_MUX_TERMINATOR },
432};
433#else
434#define board_mux NULL
435#endif
436
437static void __init omap3_touchbook_init_irq(void)
438{
439 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
440 omap_board_config = omap3_touchbook_config;
441 omap_board_config_size = ARRAY_SIZE(omap3_touchbook_config);
442 omap2_init_common_hw(mt46h32m32lf6_sdrc_params,
443 mt46h32m32lf6_sdrc_params);
444 omap_init_irq();
445#ifdef CONFIG_OMAP_32K_TIMER
446 omap2_gp_clockevent_set_gptimer(12);
447#endif
448 omap_gpio_init();
449}
450
451static struct platform_device *omap3_touchbook_devices[] __initdata = {
452 &omap3_touchbook_lcd_device,
453 &leds_gpio,
454 &keys_gpio,
455};
456
457static void __init omap3touchbook_flash_init(void)
458{
459 u8 cs = 0;
460 u8 nandcs = GPMC_CS_NUM + 1;
461
462 u32 gpmc_base_add = OMAP34XX_GPMC_VIRT;
463
464 /* find out the chip-select on which NAND exists */
465 while (cs < GPMC_CS_NUM) {
466 u32 ret = 0;
467 ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1);
468
469 if ((ret & 0xC00) == 0x800) {
470 printk(KERN_INFO "Found NAND on CS%d\n", cs);
471 if (nandcs > GPMC_CS_NUM)
472 nandcs = cs;
473 }
474 cs++;
475 }
476
477 if (nandcs > GPMC_CS_NUM) {
478 printk(KERN_INFO "NAND: Unable to find configuration "
479 "in GPMC\n ");
480 return;
481 }
482
483 if (nandcs < GPMC_CS_NUM) {
484 omap3touchbook_nand_data.cs = nandcs;
485 omap3touchbook_nand_data.gpmc_cs_baseaddr = (void *)
486 (gpmc_base_add + GPMC_CS0_BASE + nandcs * GPMC_CS_SIZE);
487 omap3touchbook_nand_data.gpmc_baseaddr =
488 (void *) (gpmc_base_add);
489
490 printk(KERN_INFO "Registering NAND on CS%d\n", nandcs);
491 if (platform_device_register(&omap3touchbook_nand_device) < 0)
492 printk(KERN_ERR "Unable to register NAND device\n");
493 }
494}
495
496static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
497
498 .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
499 .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
500 .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
501
502 .phy_reset = true,
503 .reset_gpio_port[0] = -EINVAL,
504 .reset_gpio_port[1] = 147,
505 .reset_gpio_port[2] = -EINVAL
506};
507
508static void omap3_touchbook_poweroff(void)
509{
510 int r;
511
512 r = gpio_request(TB_KILL_POWER_GPIO, "DVI reset");
513 if (r < 0) {
514 printk(KERN_ERR "Unable to get kill power GPIO\n");
515 return;
516 }
517
518 gpio_direction_output(TB_KILL_POWER_GPIO, 0);
519}
520
521static int __init early_touchbook_revision(char *p)
522{
523 if (!p)
524 return 0;
525
526 return strict_strtoul(p, 10, &touchbook_revision);
527}
528early_param("tbr", early_touchbook_revision);
529
530static struct omap_musb_board_data musb_board_data = {
531 .interface_type = MUSB_INTERFACE_ULPI,
532 .mode = MUSB_OTG,
533 .power = 100,
534};
535
536static void __init omap3_touchbook_init(void)
537{
538 pm_power_off = omap3_touchbook_poweroff;
539
540 omap3_touchbook_i2c_init();
541 platform_add_devices(omap3_touchbook_devices,
542 ARRAY_SIZE(omap3_touchbook_devices));
543 omap_serial_init();
544
545 omap_mux_init_gpio(170, OMAP_PIN_INPUT);
546 gpio_request(176, "DVI_nPD");
547 /* REVISIT leave DVI powered down until it's needed ... */
548 gpio_direction_output(176, true);
549
550 /* Touchscreen and accelerometer */
551 spi_register_board_info(omap3_ads7846_spi_board_info,
552 ARRAY_SIZE(omap3_ads7846_spi_board_info));
553 omap3_ads7846_init();
554 usb_musb_init(&musb_board_data);
555 usb_ehci_init(&ehci_pdata);
556 omap3touchbook_flash_init();
557
558 /* Ensure SDRC pins are mux'd for self-refresh */
559 omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
560 omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
561}
562
563static void __init omap3_touchbook_map_io(void)
564{
565 omap2_set_globals_343x();
566 omap34xx_map_common_io();
567}
568
569MACHINE_START(TOUCHBOOK, "OMAP3 touchbook Board")
570 /* Maintainer: Gregoire Gentil - http://www.alwaysinnovating.com */
571 .phys_io = 0x48000000,
572 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
573 .boot_params = 0x80000100,
574 .map_io = omap3_touchbook_map_io,
575 .init_irq = omap3_touchbook_init_irq,
576 .init_machine = omap3_touchbook_init,
577 .timer = &omap_timer,
578MACHINE_END
diff --git a/arch/arm/mach-omap2/board-overo.c b/arch/arm/mach-omap2/board-overo.c
index 9917d2fddc2f..8848c7c5ce48 100644
--- a/arch/arm/mach-omap2/board-overo.c
+++ b/arch/arm/mach-omap2/board-overo.c
@@ -26,7 +26,7 @@
26#include <linux/io.h> 26#include <linux/io.h>
27#include <linux/kernel.h> 27#include <linux/kernel.h>
28#include <linux/platform_device.h> 28#include <linux/platform_device.h>
29#include <linux/i2c/twl4030.h> 29#include <linux/i2c/twl.h>
30#include <linux/regulator/machine.h> 30#include <linux/regulator/machine.h>
31 31
32#include <linux/mtd/mtd.h> 32#include <linux/mtd/mtd.h>
@@ -38,17 +38,17 @@
38#include <asm/mach/flash.h> 38#include <asm/mach/flash.h>
39#include <asm/mach/map.h> 39#include <asm/mach/map.h>
40 40
41#include <mach/board.h> 41#include <plat/board.h>
42#include <mach/common.h> 42#include <plat/common.h>
43#include <mach/gpio.h> 43#include <mach/gpio.h>
44#include <mach/gpmc.h> 44#include <plat/gpmc.h>
45#include <mach/hardware.h> 45#include <mach/hardware.h>
46#include <mach/nand.h> 46#include <plat/nand.h>
47#include <mach/mux.h> 47#include <plat/usb.h>
48#include <mach/usb.h>
49 48
49#include "mux.h"
50#include "sdram-micron-mt46h32m32lf-6.h" 50#include "sdram-micron-mt46h32m32lf-6.h"
51#include "mmc-twl4030.h" 51#include "hsmmc.h"
52 52
53#define OVERO_GPIO_BT_XGATE 15 53#define OVERO_GPIO_BT_XGATE 15
54#define OVERO_GPIO_W2W_NRESET 16 54#define OVERO_GPIO_W2W_NRESET 16
@@ -67,7 +67,7 @@
67#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \ 67#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
68 defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) 68 defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
69 69
70#include <mach/mcspi.h> 70#include <plat/mcspi.h>
71#include <linux/spi/spi.h> 71#include <linux/spi/spi.h>
72#include <linux/spi/ads7846.h> 72#include <linux/spi/ads7846.h>
73 73
@@ -272,7 +272,7 @@ static void __init overo_flash_init(void)
272 } 272 }
273} 273}
274 274
275static struct twl4030_hsmmc_info mmc[] = { 275static struct omap2_hsmmc_info mmc[] = {
276 { 276 {
277 .mmc = 1, 277 .mmc = 1,
278 .wires = 4, 278 .wires = 4,
@@ -297,7 +297,7 @@ static struct regulator_consumer_supply overo_vmmc1_supply = {
297static int overo_twl_gpio_setup(struct device *dev, 297static int overo_twl_gpio_setup(struct device *dev,
298 unsigned gpio, unsigned ngpio) 298 unsigned gpio, unsigned ngpio)
299{ 299{
300 twl4030_mmc_init(mmc); 300 omap2_hsmmc_init(mmc);
301 301
302 overo_vmmc1_supply.dev = mmc[0].dev; 302 overo_vmmc1_supply.dev = mmc[0].dev;
303 303
@@ -329,6 +329,15 @@ static struct regulator_init_data overo_vmmc1 = {
329 .consumer_supplies = &overo_vmmc1_supply, 329 .consumer_supplies = &overo_vmmc1_supply,
330}; 330};
331 331
332static struct twl4030_codec_audio_data overo_audio_data = {
333 .audio_mclk = 26000000,
334};
335
336static struct twl4030_codec_data overo_codec_data = {
337 .audio_mclk = 26000000,
338 .audio = &overo_audio_data,
339};
340
332/* mmc2 (WLAN) and Bluetooth don't use twl4030 regulators */ 341/* mmc2 (WLAN) and Bluetooth don't use twl4030 regulators */
333 342
334static struct twl4030_platform_data overo_twldata = { 343static struct twl4030_platform_data overo_twldata = {
@@ -336,6 +345,7 @@ static struct twl4030_platform_data overo_twldata = {
336 .irq_end = TWL4030_IRQ_END, 345 .irq_end = TWL4030_IRQ_END,
337 .gpio = &overo_gpio_data, 346 .gpio = &overo_gpio_data,
338 .usb = &overo_usb_data, 347 .usb = &overo_usb_data,
348 .codec = &overo_codec_data,
339 .vmmc1 = &overo_vmmc1, 349 .vmmc1 = &overo_vmmc1,
340}; 350};
341 351
@@ -384,19 +394,46 @@ static struct platform_device *overo_devices[] __initdata = {
384 &overo_lcd_device, 394 &overo_lcd_device,
385}; 395};
386 396
397static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
398 .port_mode[0] = EHCI_HCD_OMAP_MODE_UNKNOWN,
399 .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
400 .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
401
402 .phy_reset = true,
403 .reset_gpio_port[0] = -EINVAL,
404 .reset_gpio_port[1] = OVERO_GPIO_USBH_NRESET,
405 .reset_gpio_port[2] = -EINVAL
406};
407
408#ifdef CONFIG_OMAP_MUX
409static struct omap_board_mux board_mux[] __initdata = {
410 { .reg_offset = OMAP_MUX_TERMINATOR },
411};
412#else
413#define board_mux NULL
414#endif
415
416static struct omap_musb_board_data musb_board_data = {
417 .interface_type = MUSB_INTERFACE_ULPI,
418 .mode = MUSB_OTG,
419 .power = 100,
420};
421
387static void __init overo_init(void) 422static void __init overo_init(void)
388{ 423{
424 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
389 overo_i2c_init(); 425 overo_i2c_init();
390 platform_add_devices(overo_devices, ARRAY_SIZE(overo_devices)); 426 platform_add_devices(overo_devices, ARRAY_SIZE(overo_devices));
391 omap_serial_init(); 427 omap_serial_init();
392 overo_flash_init(); 428 overo_flash_init();
393 usb_musb_init(); 429 usb_musb_init(&musb_board_data);
430 usb_ehci_init(&ehci_pdata);
394 overo_ads7846_init(); 431 overo_ads7846_init();
395 overo_init_smsc911x(); 432 overo_init_smsc911x();
396 433
397 /* Ensure SDRC pins are mux'd for self-refresh */ 434 /* Ensure SDRC pins are mux'd for self-refresh */
398 omap_cfg_reg(H16_34XX_SDRC_CKE0); 435 omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
399 omap_cfg_reg(H17_34XX_SDRC_CKE1); 436 omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
400 437
401 if ((gpio_request(OVERO_GPIO_W2W_NRESET, 438 if ((gpio_request(OVERO_GPIO_W2W_NRESET,
402 "OVERO_GPIO_W2W_NRESET") == 0) && 439 "OVERO_GPIO_W2W_NRESET") == 0) &&
@@ -433,25 +470,17 @@ static void __init overo_init(void)
433 else 470 else
434 printk(KERN_ERR "could not obtain gpio for " 471 printk(KERN_ERR "could not obtain gpio for "
435 "OVERO_GPIO_USBH_CPEN\n"); 472 "OVERO_GPIO_USBH_CPEN\n");
436
437 if ((gpio_request(OVERO_GPIO_USBH_NRESET,
438 "OVERO_GPIO_USBH_NRESET") == 0) &&
439 (gpio_direction_output(OVERO_GPIO_USBH_NRESET, 1) == 0))
440 gpio_export(OVERO_GPIO_USBH_NRESET, 0);
441 else
442 printk(KERN_ERR "could not obtain gpio for "
443 "OVERO_GPIO_USBH_NRESET\n");
444} 473}
445 474
446static void __init overo_map_io(void) 475static void __init overo_map_io(void)
447{ 476{
448 omap2_set_globals_343x(); 477 omap2_set_globals_343x();
449 omap2_map_common_io(); 478 omap34xx_map_common_io();
450} 479}
451 480
452MACHINE_START(OVERO, "Gumstix Overo") 481MACHINE_START(OVERO, "Gumstix Overo")
453 .phys_io = 0x48000000, 482 .phys_io = 0x48000000,
454 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, 483 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
455 .boot_params = 0x80000100, 484 .boot_params = 0x80000100,
456 .map_io = overo_map_io, 485 .map_io = overo_map_io,
457 .init_irq = overo_init_irq, 486 .init_irq = overo_init_irq,
diff --git a/arch/arm/mach-omap2/board-rx51-peripherals.c b/arch/arm/mach-omap2/board-rx51-peripherals.c
index e34d96a825e3..4377a4cf36eb 100644
--- a/arch/arm/mach-omap2/board-rx51-peripherals.c
+++ b/arch/arm/mach-omap2/board-rx51-peripherals.c
@@ -14,28 +14,138 @@
14#include <linux/input.h> 14#include <linux/input.h>
15#include <linux/input/matrix_keypad.h> 15#include <linux/input/matrix_keypad.h>
16#include <linux/spi/spi.h> 16#include <linux/spi/spi.h>
17#include <linux/spi/wl12xx.h>
17#include <linux/i2c.h> 18#include <linux/i2c.h>
18#include <linux/i2c/twl4030.h> 19#include <linux/i2c/twl.h>
19#include <linux/clk.h> 20#include <linux/clk.h>
20#include <linux/delay.h> 21#include <linux/delay.h>
21#include <linux/regulator/machine.h> 22#include <linux/regulator/machine.h>
22#include <linux/gpio.h> 23#include <linux/gpio.h>
24#include <linux/gpio_keys.h>
23#include <linux/mmc/host.h> 25#include <linux/mmc/host.h>
24 26
25#include <mach/mcspi.h> 27#include <plat/mcspi.h>
26#include <mach/mux.h> 28#include <plat/mux.h>
27#include <mach/board.h> 29#include <plat/board.h>
28#include <mach/common.h> 30#include <plat/common.h>
29#include <mach/dma.h> 31#include <plat/dma.h>
30#include <mach/gpmc.h> 32#include <plat/gpmc.h>
31#include <mach/onenand.h> 33#include <plat/onenand.h>
32#include <mach/gpmc-smc91x.h> 34#include <plat/gpmc-smc91x.h>
33 35
34#include "mmc-twl4030.h" 36#include "mux.h"
37#include "hsmmc.h"
35 38
36#define SYSTEM_REV_B_USES_VAUX3 0x1699 39#define SYSTEM_REV_B_USES_VAUX3 0x1699
37#define SYSTEM_REV_S_USES_VAUX3 0x8 40#define SYSTEM_REV_S_USES_VAUX3 0x8
38 41
42#define RX51_WL1251_POWER_GPIO 87
43#define RX51_WL1251_IRQ_GPIO 42
44
45/* list all spi devices here */
46enum {
47 RX51_SPI_WL1251,
48};
49
50static struct wl12xx_platform_data wl1251_pdata;
51
52static struct omap2_mcspi_device_config wl1251_mcspi_config = {
53 .turbo_mode = 0,
54 .single_channel = 1,
55};
56
57static struct spi_board_info rx51_peripherals_spi_board_info[] __initdata = {
58 [RX51_SPI_WL1251] = {
59 .modalias = "wl1251",
60 .bus_num = 4,
61 .chip_select = 0,
62 .max_speed_hz = 48000000,
63 .mode = SPI_MODE_3,
64 .controller_data = &wl1251_mcspi_config,
65 .platform_data = &wl1251_pdata,
66 },
67};
68
69#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
70
71#define RX51_GPIO_CAMERA_LENS_COVER 110
72#define RX51_GPIO_CAMERA_FOCUS 68
73#define RX51_GPIO_CAMERA_CAPTURE 69
74#define RX51_GPIO_KEYPAD_SLIDE 71
75#define RX51_GPIO_LOCK_BUTTON 113
76#define RX51_GPIO_PROXIMITY 89
77
78#define RX51_GPIO_DEBOUNCE_TIMEOUT 10
79
80static struct gpio_keys_button rx51_gpio_keys[] = {
81 {
82 .desc = "Camera Lens Cover",
83 .type = EV_SW,
84 .code = SW_CAMERA_LENS_COVER,
85 .gpio = RX51_GPIO_CAMERA_LENS_COVER,
86 .active_low = 1,
87 .debounce_interval = RX51_GPIO_DEBOUNCE_TIMEOUT,
88 }, {
89 .desc = "Camera Focus",
90 .type = EV_KEY,
91 .code = KEY_CAMERA_FOCUS,
92 .gpio = RX51_GPIO_CAMERA_FOCUS,
93 .active_low = 1,
94 .debounce_interval = RX51_GPIO_DEBOUNCE_TIMEOUT,
95 }, {
96 .desc = "Camera Capture",
97 .type = EV_KEY,
98 .code = KEY_CAMERA,
99 .gpio = RX51_GPIO_CAMERA_CAPTURE,
100 .active_low = 1,
101 .debounce_interval = RX51_GPIO_DEBOUNCE_TIMEOUT,
102 }, {
103 .desc = "Lock Button",
104 .type = EV_KEY,
105 .code = KEY_SCREENLOCK,
106 .gpio = RX51_GPIO_LOCK_BUTTON,
107 .active_low = 1,
108 .debounce_interval = RX51_GPIO_DEBOUNCE_TIMEOUT,
109 }, {
110 .desc = "Keypad Slide",
111 .type = EV_SW,
112 .code = SW_KEYPAD_SLIDE,
113 .gpio = RX51_GPIO_KEYPAD_SLIDE,
114 .active_low = 1,
115 .debounce_interval = RX51_GPIO_DEBOUNCE_TIMEOUT,
116 }, {
117 .desc = "Proximity Sensor",
118 .type = EV_SW,
119 .code = SW_FRONT_PROXIMITY,
120 .gpio = RX51_GPIO_PROXIMITY,
121 .active_low = 0,
122 .debounce_interval = RX51_GPIO_DEBOUNCE_TIMEOUT,
123 }
124};
125
126static struct gpio_keys_platform_data rx51_gpio_keys_data = {
127 .buttons = rx51_gpio_keys,
128 .nbuttons = ARRAY_SIZE(rx51_gpio_keys),
129};
130
131static struct platform_device rx51_gpio_keys_device = {
132 .name = "gpio-keys",
133 .id = -1,
134 .dev = {
135 .platform_data = &rx51_gpio_keys_data,
136 },
137};
138
139static void __init rx51_add_gpio_keys(void)
140{
141 platform_device_register(&rx51_gpio_keys_device);
142}
143#else
144static void __init rx51_add_gpio_keys(void)
145{
146}
147#endif /* CONFIG_KEYBOARD_GPIO || CONFIG_KEYBOARD_GPIO_MODULE */
148
39static int board_keymap[] = { 149static int board_keymap[] = {
40 KEY(0, 0, KEY_Q), 150 KEY(0, 0, KEY_Q),
41 KEY(0, 1, KEY_O), 151 KEY(0, 1, KEY_O),
@@ -99,7 +209,47 @@ static struct twl4030_madc_platform_data rx51_madc_data = {
99 .irq_line = 1, 209 .irq_line = 1,
100}; 210};
101 211
102static struct twl4030_hsmmc_info mmc[] = { 212/* Enable input logic and pull all lines up when eMMC is on. */
213static struct omap_board_mux rx51_mmc2_on_mux[] = {
214 OMAP3_MUX(SDMMC2_CMD, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
215 OMAP3_MUX(SDMMC2_DAT0, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
216 OMAP3_MUX(SDMMC2_DAT1, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
217 OMAP3_MUX(SDMMC2_DAT2, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
218 OMAP3_MUX(SDMMC2_DAT3, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
219 OMAP3_MUX(SDMMC2_DAT4, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
220 OMAP3_MUX(SDMMC2_DAT5, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
221 OMAP3_MUX(SDMMC2_DAT6, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
222 OMAP3_MUX(SDMMC2_DAT7, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
223 { .reg_offset = OMAP_MUX_TERMINATOR },
224};
225
226/* Disable input logic and pull all lines down when eMMC is off. */
227static struct omap_board_mux rx51_mmc2_off_mux[] = {
228 OMAP3_MUX(SDMMC2_CMD, OMAP_PULL_ENA | OMAP_MUX_MODE0),
229 OMAP3_MUX(SDMMC2_DAT0, OMAP_PULL_ENA | OMAP_MUX_MODE0),
230 OMAP3_MUX(SDMMC2_DAT1, OMAP_PULL_ENA | OMAP_MUX_MODE0),
231 OMAP3_MUX(SDMMC2_DAT2, OMAP_PULL_ENA | OMAP_MUX_MODE0),
232 OMAP3_MUX(SDMMC2_DAT3, OMAP_PULL_ENA | OMAP_MUX_MODE0),
233 OMAP3_MUX(SDMMC2_DAT4, OMAP_PULL_ENA | OMAP_MUX_MODE0),
234 OMAP3_MUX(SDMMC2_DAT5, OMAP_PULL_ENA | OMAP_MUX_MODE0),
235 OMAP3_MUX(SDMMC2_DAT6, OMAP_PULL_ENA | OMAP_MUX_MODE0),
236 OMAP3_MUX(SDMMC2_DAT7, OMAP_PULL_ENA | OMAP_MUX_MODE0),
237 { .reg_offset = OMAP_MUX_TERMINATOR },
238};
239
240/*
241 * Current flows to eMMC when eMMC is off and the data lines are pulled up,
242 * so pull them down. N.B. we pull 8 lines because we are using 8 lines.
243 */
244static void rx51_mmc2_remux(struct device *dev, int slot, int power_on)
245{
246 if (power_on)
247 omap_mux_write_array(rx51_mmc2_on_mux);
248 else
249 omap_mux_write_array(rx51_mmc2_off_mux);
250}
251
252static struct omap2_hsmmc_info mmc[] __initdata = {
103 { 253 {
104 .name = "external", 254 .name = "external",
105 .mmc = 1, 255 .mmc = 1,
@@ -112,25 +262,29 @@ static struct twl4030_hsmmc_info mmc[] = {
112 { 262 {
113 .name = "internal", 263 .name = "internal",
114 .mmc = 2, 264 .mmc = 2,
115 .wires = 8, 265 .wires = 8, /* See also rx51_mmc2_remux */
116 .gpio_cd = -EINVAL, 266 .gpio_cd = -EINVAL,
117 .gpio_wp = -EINVAL, 267 .gpio_wp = -EINVAL,
118 .nonremovable = true, 268 .nonremovable = true,
119 .power_saving = true, 269 .power_saving = true,
270 .remux = rx51_mmc2_remux,
120 }, 271 },
121 {} /* Terminator */ 272 {} /* Terminator */
122}; 273};
123 274
124static struct regulator_consumer_supply rx51_vmmc1_supply = { 275static struct regulator_consumer_supply rx51_vmmc1_supply = {
125 .supply = "vmmc", 276 .supply = "vmmc",
277 .dev_name = "mmci-omap-hs.0",
126}; 278};
127 279
128static struct regulator_consumer_supply rx51_vmmc2_supply = { 280static struct regulator_consumer_supply rx51_vmmc2_supply = {
129 .supply = "vmmc", 281 .supply = "vmmc",
282 .dev_name = "mmci-omap-hs.1",
130}; 283};
131 284
132static struct regulator_consumer_supply rx51_vsim_supply = { 285static struct regulator_consumer_supply rx51_vsim_supply = {
133 .supply = "vmmc_aux", 286 .supply = "vmmc_aux",
287 .dev_name = "mmci-omap-hs.1",
134}; 288};
135 289
136static struct regulator_init_data rx51_vaux1 = { 290static struct regulator_init_data rx51_vaux1 = {
@@ -265,12 +419,6 @@ static int rx51_twlgpio_setup(struct device *dev, unsigned gpio, unsigned n)
265 gpio_request(gpio + 7, "speaker_en"); 419 gpio_request(gpio + 7, "speaker_en");
266 gpio_direction_output(gpio + 7, 1); 420 gpio_direction_output(gpio + 7, 1);
267 421
268 /* set up MMC adapters, linking their regulators to them */
269 twl4030_mmc_init(mmc);
270 rx51_vmmc1_supply.dev = mmc[0].dev;
271 rx51_vmmc2_supply.dev = mmc[1].dev;
272 rx51_vsim_supply.dev = mmc[1].dev;
273
274 return 0; 422 return 0;
275} 423}
276 424
@@ -292,15 +440,9 @@ static struct twl4030_usb_data rx51_usb_data = {
292 440
293static struct twl4030_ins sleep_on_seq[] __initdata = { 441static struct twl4030_ins sleep_on_seq[] __initdata = {
294/* 442/*
295 * Turn off VDD1 and VDD2. 443 * Turn off everything
296 */ 444 */
297 {MSG_SINGULAR(DEV_GRP_P1, 0xf, RES_STATE_OFF), 4}, 445 {MSG_BROADCAST(DEV_GRP_NULL, RES_GRP_ALL, 1, 0, RES_STATE_SLEEP), 2},
298 {MSG_SINGULAR(DEV_GRP_P1, 0x10, RES_STATE_OFF), 2},
299/*
300 * And also turn off the OMAP3 PLLs and the sysclk output.
301 */
302 {MSG_SINGULAR(DEV_GRP_P1, 0x7, RES_STATE_OFF), 3},
303 {MSG_SINGULAR(DEV_GRP_P1, 0x17, RES_STATE_OFF), 3},
304}; 446};
305 447
306static struct twl4030_script sleep_on_script __initdata = { 448static struct twl4030_script sleep_on_script __initdata = {
@@ -311,14 +453,9 @@ static struct twl4030_script sleep_on_script __initdata = {
311 453
312static struct twl4030_ins wakeup_seq[] __initdata = { 454static struct twl4030_ins wakeup_seq[] __initdata = {
313/* 455/*
314 * Reenable the OMAP3 PLLs. 456 * Reenable everything
315 * Wakeup VDD1 and VDD2.
316 * Reenable sysclk output.
317 */ 457 */
318 {MSG_SINGULAR(DEV_GRP_P1, 0x7, RES_STATE_ACTIVE), 0x30}, 458 {MSG_BROADCAST(DEV_GRP_NULL, RES_GRP_ALL, 1, 0, RES_STATE_ACTIVE), 2},
319 {MSG_SINGULAR(DEV_GRP_P1, 0xf, RES_STATE_ACTIVE), 0x30},
320 {MSG_SINGULAR(DEV_GRP_P1, 0x10, RES_STATE_ACTIVE), 0x37},
321 {MSG_SINGULAR(DEV_GRP_P1, 0x19, RES_STATE_ACTIVE), 3},
322}; 459};
323 460
324static struct twl4030_script wakeup_script __initdata = { 461static struct twl4030_script wakeup_script __initdata = {
@@ -329,10 +466,9 @@ static struct twl4030_script wakeup_script __initdata = {
329 466
330static struct twl4030_ins wakeup_p3_seq[] __initdata = { 467static struct twl4030_ins wakeup_p3_seq[] __initdata = {
331/* 468/*
332 * Wakeup VDD1 (dummy to be able to insert a delay) 469 * Reenable everything
333 * Enable CLKEN
334 */ 470 */
335 {MSG_SINGULAR(DEV_GRP_P1, 0x17, RES_STATE_ACTIVE), 3}, 471 {MSG_BROADCAST(DEV_GRP_NULL, RES_GRP_ALL, 1, 0, RES_STATE_ACTIVE), 2},
336}; 472};
337 473
338static struct twl4030_script wakeup_p3_script __initdata = { 474static struct twl4030_script wakeup_p3_script __initdata = {
@@ -353,12 +489,11 @@ static struct twl4030_ins wrst_seq[] __initdata = {
353 {MSG_SINGULAR(DEV_GRP_NULL, RES_RESET, RES_STATE_OFF), 2}, 489 {MSG_SINGULAR(DEV_GRP_NULL, RES_RESET, RES_STATE_OFF), 2},
354 {MSG_BROADCAST(DEV_GRP_NULL, RES_GRP_ALL, 0, 1, RES_STATE_ACTIVE), 490 {MSG_BROADCAST(DEV_GRP_NULL, RES_GRP_ALL, 0, 1, RES_STATE_ACTIVE),
355 0x13}, 491 0x13},
356 {MSG_BROADCAST(DEV_GRP_NULL, RES_GRP_PP, 0, 2, RES_STATE_WRST), 0x13},
357 {MSG_BROADCAST(DEV_GRP_NULL, RES_GRP_PP, 0, 3, RES_STATE_OFF), 0x13}, 492 {MSG_BROADCAST(DEV_GRP_NULL, RES_GRP_PP, 0, 3, RES_STATE_OFF), 0x13},
358 {MSG_SINGULAR(DEV_GRP_NULL, RES_VDD1, RES_STATE_WRST), 0x13}, 493 {MSG_SINGULAR(DEV_GRP_NULL, RES_VDD1, RES_STATE_WRST), 0x13},
359 {MSG_SINGULAR(DEV_GRP_NULL, RES_VDD2, RES_STATE_WRST), 0x13}, 494 {MSG_SINGULAR(DEV_GRP_NULL, RES_VDD2, RES_STATE_WRST), 0x13},
360 {MSG_SINGULAR(DEV_GRP_NULL, RES_VPLL1, RES_STATE_WRST), 0x35}, 495 {MSG_SINGULAR(DEV_GRP_NULL, RES_VPLL1, RES_STATE_WRST), 0x35},
361 {MSG_SINGULAR(DEV_GRP_P1, RES_HFCLKOUT, RES_STATE_ACTIVE), 2}, 496 {MSG_SINGULAR(DEV_GRP_P3, RES_HFCLKOUT, RES_STATE_ACTIVE), 2},
362 {MSG_SINGULAR(DEV_GRP_NULL, RES_RESET, RES_STATE_ACTIVE), 2}, 497 {MSG_SINGULAR(DEV_GRP_NULL, RES_RESET, RES_STATE_ACTIVE), 2},
363}; 498};
364 499
@@ -380,22 +515,81 @@ static struct twl4030_script *twl4030_scripts[] __initdata = {
380}; 515};
381 516
382static struct twl4030_resconfig twl4030_rconfig[] __initdata = { 517static struct twl4030_resconfig twl4030_rconfig[] __initdata = {
383 { .resource = RES_VINTANA1, .devgroup = -1, .type = -1, .type2 = 1 }, 518 { .resource = RES_VDD1, .devgroup = -1,
384 { .resource = RES_VINTANA2, .devgroup = -1, .type = -1, .type2 = 1 }, 519 .type = 1, .type2 = -1, .remap_off = RES_STATE_OFF,
385 { .resource = RES_VINTDIG, .devgroup = -1, .type = -1, .type2 = 1 }, 520 .remap_sleep = RES_STATE_OFF
386 { .resource = RES_VMMC1, .devgroup = -1, .type = -1, .type2 = 3}, 521 },
387 { .resource = RES_VMMC2, .devgroup = DEV_GRP_NULL, .type = -1, 522 { .resource = RES_VDD2, .devgroup = -1,
388 .type2 = 3}, 523 .type = 1, .type2 = -1, .remap_off = RES_STATE_OFF,
389 { .resource = RES_VAUX1, .devgroup = -1, .type = -1, .type2 = 3}, 524 .remap_sleep = RES_STATE_OFF
390 { .resource = RES_VAUX2, .devgroup = -1, .type = -1, .type2 = 3}, 525 },
391 { .resource = RES_VAUX3, .devgroup = -1, .type = -1, .type2 = 3}, 526 { .resource = RES_VPLL1, .devgroup = -1,
392 { .resource = RES_VAUX4, .devgroup = -1, .type = -1, .type2 = 3}, 527 .type = 1, .type2 = -1, .remap_off = RES_STATE_OFF,
393 { .resource = RES_VPLL2, .devgroup = -1, .type = -1, .type2 = 3}, 528 .remap_sleep = RES_STATE_OFF
394 { .resource = RES_VDAC, .devgroup = -1, .type = -1, .type2 = 3}, 529 },
395 { .resource = RES_VSIM, .devgroup = DEV_GRP_NULL, .type = -1, 530 { .resource = RES_VPLL2, .devgroup = -1,
396 .type2 = 3}, 531 .type = -1, .type2 = 3, .remap_off = -1, .remap_sleep = -1
397 { .resource = RES_CLKEN, .devgroup = DEV_GRP_P3, .type = -1, 532 },
398 .type2 = 1 }, 533 { .resource = RES_VAUX1, .devgroup = -1,
534 .type = -1, .type2 = 3, .remap_off = -1, .remap_sleep = -1
535 },
536 { .resource = RES_VAUX2, .devgroup = -1,
537 .type = -1, .type2 = 3, .remap_off = -1, .remap_sleep = -1
538 },
539 { .resource = RES_VAUX3, .devgroup = -1,
540 .type = -1, .type2 = 3, .remap_off = -1, .remap_sleep = -1
541 },
542 { .resource = RES_VAUX4, .devgroup = -1,
543 .type = -1, .type2 = 3, .remap_off = -1, .remap_sleep = -1
544 },
545 { .resource = RES_VMMC1, .devgroup = -1,
546 .type = -1, .type2 = 3, .remap_off = -1, .remap_sleep = -1
547 },
548 { .resource = RES_VMMC2, .devgroup = -1,
549 .type = -1, .type2 = 3, .remap_off = -1, .remap_sleep = -1
550 },
551 { .resource = RES_VDAC, .devgroup = -1,
552 .type = -1, .type2 = 3, .remap_off = -1, .remap_sleep = -1
553 },
554 { .resource = RES_VSIM, .devgroup = -1,
555 .type = -1, .type2 = 3, .remap_off = -1, .remap_sleep = -1
556 },
557 { .resource = RES_VINTANA1, .devgroup = DEV_GRP_P1 | DEV_GRP_P3,
558 .type = -1, .type2 = -1, .remap_off = -1, .remap_sleep = -1
559 },
560 { .resource = RES_VINTANA2, .devgroup = DEV_GRP_P1 | DEV_GRP_P3,
561 .type = 1, .type2 = -1, .remap_off = -1, .remap_sleep = -1
562 },
563 { .resource = RES_VINTDIG, .devgroup = DEV_GRP_P1 | DEV_GRP_P3,
564 .type = -1, .type2 = -1, .remap_off = -1, .remap_sleep = -1
565 },
566 { .resource = RES_VIO, .devgroup = DEV_GRP_P3,
567 .type = 1, .type2 = -1, .remap_off = -1, .remap_sleep = -1
568 },
569 { .resource = RES_CLKEN, .devgroup = DEV_GRP_P1 | DEV_GRP_P3,
570 .type = 1, .type2 = -1 , .remap_off = -1, .remap_sleep = -1
571 },
572 { .resource = RES_REGEN, .devgroup = DEV_GRP_P1 | DEV_GRP_P3,
573 .type = 1, .type2 = -1, .remap_off = -1, .remap_sleep = -1
574 },
575 { .resource = RES_NRES_PWRON, .devgroup = DEV_GRP_P1 | DEV_GRP_P3,
576 .type = 1, .type2 = -1, .remap_off = -1, .remap_sleep = -1
577 },
578 { .resource = RES_SYSEN, .devgroup = DEV_GRP_P1 | DEV_GRP_P3,
579 .type = 1, .type2 = -1, .remap_off = -1, .remap_sleep = -1
580 },
581 { .resource = RES_HFCLKOUT, .devgroup = DEV_GRP_P3,
582 .type = 1, .type2 = -1, .remap_off = -1, .remap_sleep = -1
583 },
584 { .resource = RES_32KCLKOUT, .devgroup = -1,
585 .type = 1, .type2 = -1, .remap_off = -1, .remap_sleep = -1
586 },
587 { .resource = RES_RESET, .devgroup = -1,
588 .type = 1, .type2 = -1, .remap_off = -1, .remap_sleep = -1
589 },
590 { .resource = RES_Main_Ref, .devgroup = -1,
591 .type = 1, .type2 = -1, .remap_off = -1, .remap_sleep = -1
592 },
399 { 0, 0}, 593 { 0, 0},
400}; 594};
401 595
@@ -521,9 +715,9 @@ static struct omap_smc91x_platform_data board_smc91x_data = {
521 715
522static void __init board_smc91x_init(void) 716static void __init board_smc91x_init(void)
523{ 717{
524 omap_cfg_reg(U8_34XX_GPIO54_DOWN); 718 omap_mux_init_gpio(54, OMAP_PIN_INPUT_PULLDOWN);
525 omap_cfg_reg(G25_34XX_GPIO86_OUT); 719 omap_mux_init_gpio(86, OMAP_PIN_OUTPUT);
526 omap_cfg_reg(H19_34XX_GPIO164_OUT); 720 omap_mux_init_gpio(164, OMAP_PIN_OUTPUT);
527 721
528 gpmc_smc91x_init(&board_smc91x_data); 722 gpmc_smc91x_init(&board_smc91x_data);
529} 723}
@@ -536,10 +730,65 @@ static inline void board_smc91x_init(void)
536 730
537#endif 731#endif
538 732
733static void rx51_wl1251_set_power(bool enable)
734{
735 gpio_set_value(RX51_WL1251_POWER_GPIO, enable);
736}
737
738static void __init rx51_init_wl1251(void)
739{
740 int irq, ret;
741
742 ret = gpio_request(RX51_WL1251_POWER_GPIO, "wl1251 power");
743 if (ret < 0)
744 goto error;
745
746 ret = gpio_direction_output(RX51_WL1251_POWER_GPIO, 0);
747 if (ret < 0)
748 goto err_power;
749
750 ret = gpio_request(RX51_WL1251_IRQ_GPIO, "wl1251 irq");
751 if (ret < 0)
752 goto err_power;
753
754 ret = gpio_direction_input(RX51_WL1251_IRQ_GPIO);
755 if (ret < 0)
756 goto err_irq;
757
758 irq = gpio_to_irq(RX51_WL1251_IRQ_GPIO);
759 if (irq < 0)
760 goto err_irq;
761
762 wl1251_pdata.set_power = rx51_wl1251_set_power;
763 rx51_peripherals_spi_board_info[RX51_SPI_WL1251].irq = irq;
764
765 return;
766
767err_irq:
768 gpio_free(RX51_WL1251_IRQ_GPIO);
769
770err_power:
771 gpio_free(RX51_WL1251_POWER_GPIO);
772
773error:
774 printk(KERN_ERR "wl1251 board initialisation failed\n");
775 wl1251_pdata.set_power = NULL;
776
777 /*
778 * Now rx51_peripherals_spi_board_info[1].irq is zero and
779 * set_power is null, and wl1251_probe() will fail.
780 */
781}
782
539void __init rx51_peripherals_init(void) 783void __init rx51_peripherals_init(void)
540{ 784{
541 rx51_i2c_init(); 785 rx51_i2c_init();
542 board_onenand_init(); 786 board_onenand_init();
543 board_smc91x_init(); 787 board_smc91x_init();
788 rx51_add_gpio_keys();
789 rx51_init_wl1251();
790 spi_register_board_info(rx51_peripherals_spi_board_info,
791 ARRAY_SIZE(rx51_peripherals_spi_board_info));
792 omap2_hsmmc_init(mmc);
544} 793}
545 794
diff --git a/arch/arm/mach-omap2/board-rx51-sdram.c b/arch/arm/mach-omap2/board-rx51-sdram.c
new file mode 100644
index 000000000000..f392844195d2
--- /dev/null
+++ b/arch/arm/mach-omap2/board-rx51-sdram.c
@@ -0,0 +1,221 @@
1/*
2 * SDRC register values for RX51
3 *
4 * Copyright (C) 2008 Nokia Corporation
5 *
6 * Lauri Leukkunen <lauri.leukkunen@nokia.com>
7 *
8 * Original code by Juha Yrjola <juha.yrjola@solidboot.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 */
14
15#include <linux/kernel.h>
16#include <linux/clk.h>
17#include <linux/err.h>
18#include <linux/io.h>
19
20#include <plat/io.h>
21#include <plat/common.h>
22#include <plat/clock.h>
23#include <plat/sdrc.h>
24
25
26/* In picoseconds, except for tREF (ns), tXP, tCKE, tWTR (clks) */
27struct sdram_timings {
28 u32 casl;
29 u32 tDAL;
30 u32 tDPL;
31 u32 tRRD;
32 u32 tRCD;
33 u32 tRP;
34 u32 tRAS;
35 u32 tRC;
36 u32 tRFC;
37 u32 tXSR;
38
39 u32 tREF; /* in ns */
40
41 u32 tXP;
42 u32 tCKE;
43 u32 tWTR;
44};
45
46struct omap_sdrc_params rx51_sdrc_params[4];
47
48static const struct sdram_timings rx51_timings[] = {
49 {
50 .casl = 3,
51 .tDAL = 33000,
52 .tDPL = 15000,
53 .tRRD = 12000,
54 .tRCD = 22500,
55 .tRP = 18000,
56 .tRAS = 42000,
57 .tRC = 66000,
58 .tRFC = 138000,
59 .tXSR = 200000,
60
61 .tREF = 7800,
62
63 .tXP = 2,
64 .tCKE = 2,
65 .tWTR = 2
66 },
67};
68
69static unsigned long sdrc_get_fclk_period(long rate)
70{
71 /* In picoseconds */
72 return 1000000000 / rate;
73}
74
75static unsigned int sdrc_ps_to_ticks(unsigned int time_ps, long rate)
76{
77 unsigned long tick_ps;
78
79 /* Calculate in picosecs to yield more exact results */
80 tick_ps = sdrc_get_fclk_period(rate);
81
82 return (time_ps + tick_ps - 1) / tick_ps;
83}
84#undef DEBUG
85#ifdef DEBUG
86static int set_sdrc_timing_regval(u32 *regval, int st_bit, int end_bit,
87 int ticks, long rate, const char *name)
88#else
89static int set_sdrc_timing_regval(u32 *regval, int st_bit, int end_bit,
90 int ticks)
91#endif
92{
93 int mask, nr_bits;
94
95 nr_bits = end_bit - st_bit + 1;
96 if (ticks >= 1 << nr_bits)
97 return -1;
98 mask = (1 << nr_bits) - 1;
99 *regval &= ~(mask << st_bit);
100 *regval |= ticks << st_bit;
101#ifdef DEBUG
102 printk(KERN_INFO "SDRC %s: %i ticks %i ns\n", name, ticks,
103 (unsigned int)sdrc_get_fclk_period(rate) * ticks /
104 1000);
105#endif
106
107 return 0;
108}
109
110#ifdef DEBUG
111#define SDRC_SET_ONE(reg, st, end, field, rate) \
112 if (set_sdrc_timing_regval((reg), (st), (end), \
113 rx51_timings->field, (rate), #field) < 0) \
114 err = -1;
115#else
116#define SDRC_SET_ONE(reg, st, end, field, rate) \
117 if (set_sdrc_timing_regval((reg), (st), (end), \
118 rx51_timings->field) < 0) \
119 err = -1;
120#endif
121
122#ifdef DEBUG
123static int set_sdrc_timing_regval_ps(u32 *regval, int st_bit, int end_bit,
124 int time, long rate, const char *name)
125#else
126static int set_sdrc_timing_regval_ps(u32 *regval, int st_bit, int end_bit,
127 int time, long rate)
128#endif
129{
130 int ticks, ret;
131 ret = 0;
132
133 if (time == 0)
134 ticks = 0;
135 else
136 ticks = sdrc_ps_to_ticks(time, rate);
137
138#ifdef DEBUG
139 ret = set_sdrc_timing_regval(regval, st_bit, end_bit, ticks,
140 rate, name);
141#else
142 ret = set_sdrc_timing_regval(regval, st_bit, end_bit, ticks);
143#endif
144
145 return ret;
146}
147
148#ifdef DEBUG
149#define SDRC_SET_ONE_PS(reg, st, end, field, rate) \
150 if (set_sdrc_timing_regval_ps((reg), (st), (end), \
151 rx51_timings->field, \
152 (rate), #field) < 0) \
153 err = -1;
154
155#else
156#define SDRC_SET_ONE_PS(reg, st, end, field, rate) \
157 if (set_sdrc_timing_regval_ps((reg), (st), (end), \
158 rx51_timings->field, (rate)) < 0) \
159 err = -1;
160#endif
161
162static int sdrc_timings(int id, long rate)
163{
164 u32 ticks_per_ms;
165 u32 rfr, l;
166 u32 actim_ctrla = 0, actim_ctrlb = 0;
167 u32 rfr_ctrl;
168 int err = 0;
169 long l3_rate = rate / 1000;
170
171 SDRC_SET_ONE_PS(&actim_ctrla, 0, 4, tDAL, l3_rate);
172 SDRC_SET_ONE_PS(&actim_ctrla, 6, 8, tDPL, l3_rate);
173 SDRC_SET_ONE_PS(&actim_ctrla, 9, 11, tRRD, l3_rate);
174 SDRC_SET_ONE_PS(&actim_ctrla, 12, 14, tRCD, l3_rate);
175 SDRC_SET_ONE_PS(&actim_ctrla, 15, 17, tRP, l3_rate);
176 SDRC_SET_ONE_PS(&actim_ctrla, 18, 21, tRAS, l3_rate);
177 SDRC_SET_ONE_PS(&actim_ctrla, 22, 26, tRC, l3_rate);
178 SDRC_SET_ONE_PS(&actim_ctrla, 27, 31, tRFC, l3_rate);
179
180 SDRC_SET_ONE_PS(&actim_ctrlb, 0, 7, tXSR, l3_rate);
181
182 SDRC_SET_ONE(&actim_ctrlb, 8, 10, tXP, l3_rate);
183 SDRC_SET_ONE(&actim_ctrlb, 12, 14, tCKE, l3_rate);
184 SDRC_SET_ONE(&actim_ctrlb, 16, 17, tWTR, l3_rate);
185
186 ticks_per_ms = l3_rate;
187 rfr = rx51_timings[0].tREF * ticks_per_ms / 1000000;
188 if (rfr > 65535 + 50)
189 rfr = 65535;
190 else
191 rfr -= 50;
192
193#ifdef DEBUG
194 printk(KERN_INFO "SDRC tREF: %i ticks\n", rfr);
195#endif
196
197 l = rfr << 8;
198 rfr_ctrl = l | 0x1; /* autorefresh, reload counter with 1xARCV */
199
200 rx51_sdrc_params[id].rate = rate;
201 rx51_sdrc_params[id].actim_ctrla = actim_ctrla;
202 rx51_sdrc_params[id].actim_ctrlb = actim_ctrlb;
203 rx51_sdrc_params[id].rfr_ctrl = rfr_ctrl;
204 rx51_sdrc_params[id].mr = 0x32;
205
206 rx51_sdrc_params[id + 1].rate = 0;
207
208 return err;
209}
210
211struct omap_sdrc_params *rx51_get_sdram_timings(void)
212{
213 int err;
214
215 err = sdrc_timings(0, 41500000);
216 err |= sdrc_timings(1, 83000000);
217 err |= sdrc_timings(2, 166000000);
218
219 return &rx51_sdrc_params[0];
220}
221
diff --git a/arch/arm/mach-omap2/board-rx51.c b/arch/arm/mach-omap2/board-rx51.c
index 78869a9a1cc2..b155c366c650 100644
--- a/arch/arm/mach-omap2/board-rx51.c
+++ b/arch/arm/mach-omap2/board-rx51.c
@@ -16,19 +16,63 @@
16#include <linux/clk.h> 16#include <linux/clk.h>
17#include <linux/io.h> 17#include <linux/io.h>
18#include <linux/gpio.h> 18#include <linux/gpio.h>
19#include <linux/leds.h>
19 20
20#include <mach/hardware.h> 21#include <mach/hardware.h>
21#include <asm/mach-types.h> 22#include <asm/mach-types.h>
22#include <asm/mach/arch.h> 23#include <asm/mach/arch.h>
23#include <asm/mach/map.h> 24#include <asm/mach/map.h>
24 25
25#include <mach/mcspi.h> 26#include <plat/mcspi.h>
26#include <mach/mux.h> 27#include <plat/board.h>
27#include <mach/board.h> 28#include <plat/common.h>
28#include <mach/common.h> 29#include <plat/dma.h>
29#include <mach/dma.h> 30#include <plat/gpmc.h>
30#include <mach/gpmc.h> 31#include <plat/usb.h>
31#include <mach/usb.h> 32
33#include "mux.h"
34#include "pm.h"
35
36#define RX51_GPIO_SLEEP_IND 162
37
38struct omap_sdrc_params *rx51_get_sdram_timings(void);
39
40static struct gpio_led gpio_leds[] = {
41 {
42 .name = "sleep_ind",
43 .gpio = RX51_GPIO_SLEEP_IND,
44 },
45};
46
47static struct gpio_led_platform_data gpio_led_info = {
48 .leds = gpio_leds,
49 .num_leds = ARRAY_SIZE(gpio_leds),
50};
51
52static struct platform_device leds_gpio = {
53 .name = "leds-gpio",
54 .id = -1,
55 .dev = {
56 .platform_data = &gpio_led_info,
57 },
58};
59
60static struct cpuidle_params rx51_cpuidle_params[] = {
61 /* C1 */
62 {1, 110, 162, 5},
63 /* C2 */
64 {1, 106, 180, 309},
65 /* C3 */
66 {0, 107, 410, 46057},
67 /* C4 */
68 {0, 121, 3374, 46057},
69 /* C5 */
70 {1, 855, 1146, 46057},
71 /* C6 */
72 {0, 7580, 4134, 484329},
73 /* C7 */
74 {1, 7505, 15274, 484329},
75};
32 76
33static struct omap_lcd_config rx51_lcd_config = { 77static struct omap_lcd_config rx51_lcd_config = {
34 .ctrl_name = "internal", 78 .ctrl_name = "internal",
@@ -55,36 +99,57 @@ static struct omap_board_config_kernel rx51_config[] = {
55 99
56static void __init rx51_init_irq(void) 100static void __init rx51_init_irq(void)
57{ 101{
102 struct omap_sdrc_params *sdrc_params;
103
58 omap_board_config = rx51_config; 104 omap_board_config = rx51_config;
59 omap_board_config_size = ARRAY_SIZE(rx51_config); 105 omap_board_config_size = ARRAY_SIZE(rx51_config);
60 omap2_init_common_hw(NULL, NULL); 106 omap3_pm_init_cpuidle(rx51_cpuidle_params);
107 sdrc_params = rx51_get_sdram_timings();
108 omap2_init_common_hw(sdrc_params, sdrc_params);
61 omap_init_irq(); 109 omap_init_irq();
62 omap_gpio_init(); 110 omap_gpio_init();
63} 111}
64 112
65extern void __init rx51_peripherals_init(void); 113extern void __init rx51_peripherals_init(void);
66 114
115#ifdef CONFIG_OMAP_MUX
116static struct omap_board_mux board_mux[] __initdata = {
117 { .reg_offset = OMAP_MUX_TERMINATOR },
118};
119#else
120#define board_mux NULL
121#endif
122
123static struct omap_musb_board_data musb_board_data = {
124 .interface_type = MUSB_INTERFACE_ULPI,
125 .mode = MUSB_PERIPHERAL,
126 .power = 0,
127};
128
67static void __init rx51_init(void) 129static void __init rx51_init(void)
68{ 130{
131 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
69 omap_serial_init(); 132 omap_serial_init();
70 usb_musb_init(); 133 usb_musb_init(&musb_board_data);
71 rx51_peripherals_init(); 134 rx51_peripherals_init();
72 135
73 /* Ensure SDRC pins are mux'd for self-refresh */ 136 /* Ensure SDRC pins are mux'd for self-refresh */
74 omap_cfg_reg(H16_34XX_SDRC_CKE0); 137 omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
75 omap_cfg_reg(H17_34XX_SDRC_CKE1); 138 omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
139
140 platform_device_register(&leds_gpio);
76} 141}
77 142
78static void __init rx51_map_io(void) 143static void __init rx51_map_io(void)
79{ 144{
80 omap2_set_globals_343x(); 145 omap2_set_globals_343x();
81 omap2_map_common_io(); 146 omap34xx_map_common_io();
82} 147}
83 148
84MACHINE_START(NOKIA_RX51, "Nokia RX-51 board") 149MACHINE_START(NOKIA_RX51, "Nokia RX-51 board")
85 /* Maintainer: Lauri Leukkunen <lauri.leukkunen@nokia.com> */ 150 /* Maintainer: Lauri Leukkunen <lauri.leukkunen@nokia.com> */
86 .phys_io = 0x48000000, 151 .phys_io = 0x48000000,
87 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, 152 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
88 .boot_params = 0x80000100, 153 .boot_params = 0x80000100,
89 .map_io = rx51_map_io, 154 .map_io = rx51_map_io,
90 .init_irq = rx51_init_irq, 155 .init_irq = rx51_init_irq,
diff --git a/arch/arm/mach-omap2/board-sdp-flash.c b/arch/arm/mach-omap2/board-sdp-flash.c
new file mode 100644
index 000000000000..2d026328e385
--- /dev/null
+++ b/arch/arm/mach-omap2/board-sdp-flash.c
@@ -0,0 +1,272 @@
1/*
2 * board-sdp-flash.c
3 * Modified from mach-omap2/board-3430sdp-flash.c
4 *
5 * Copyright (C) 2009 Nokia Corporation
6 * Copyright (C) 2009 Texas Instruments
7 *
8 * Vimal Singh <vimalsingh@ti.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 */
14
15#include <linux/kernel.h>
16#include <linux/platform_device.h>
17#include <linux/mtd/physmap.h>
18#include <linux/io.h>
19
20#include <plat/gpmc.h>
21#include <plat/nand.h>
22#include <plat/onenand.h>
23#include <plat/tc.h>
24#include <mach/board-sdp.h>
25
26#define REG_FPGA_REV 0x10
27#define REG_FPGA_DIP_SWITCH_INPUT2 0x60
28#define MAX_SUPPORTED_GPMC_CONFIG 3
29
30#define DEBUG_BASE 0x08000000 /* debug board */
31
32#define PDC_NOR 1
33#define PDC_NAND 2
34#define PDC_ONENAND 3
35#define DBG_MPDB 4
36
37/* various memory sizes */
38#define FLASH_SIZE_SDPV1 SZ_64M /* NOR flash (64 Meg aligned) */
39#define FLASH_SIZE_SDPV2 SZ_128M /* NOR flash (256 Meg aligned) */
40
41/*
42 * SDP3430 V2 Board CS organization
43 * Different from SDP3430 V1. Now 4 switches used to specify CS
44 *
45 * See also the Switch S8 settings in the comments.
46 *
47 * REVISIT: Add support for 2430 SDP
48 */
49static const unsigned char chip_sel_sdp[][GPMC_CS_NUM] = {
50 {PDC_NOR, PDC_NAND, PDC_ONENAND, DBG_MPDB, 0, 0, 0, 0}, /* S8:1111 */
51 {PDC_ONENAND, PDC_NAND, PDC_NOR, DBG_MPDB, 0, 0, 0, 0}, /* S8:1110 */
52 {PDC_NAND, PDC_ONENAND, PDC_NOR, DBG_MPDB, 0, 0, 0, 0}, /* S8:1101 */
53};
54
55static struct physmap_flash_data sdp_nor_data = {
56 .width = 2,
57};
58
59static struct resource sdp_nor_resource = {
60 .flags = IORESOURCE_MEM,
61};
62
63static struct platform_device sdp_nor_device = {
64 .name = "physmap-flash",
65 .id = 0,
66 .dev = {
67 .platform_data = &sdp_nor_data,
68 },
69 .num_resources = 1,
70 .resource = &sdp_nor_resource,
71};
72
73static void
74__init board_nor_init(struct flash_partitions sdp_nor_parts, u8 cs)
75{
76 int err;
77
78 sdp_nor_data.parts = sdp_nor_parts.parts;
79 sdp_nor_data.nr_parts = sdp_nor_parts.nr_parts;
80
81 /* Configure start address and size of NOR device */
82 if (omap_rev() >= OMAP3430_REV_ES1_0) {
83 err = gpmc_cs_request(cs, FLASH_SIZE_SDPV2 - 1,
84 (unsigned long *)&sdp_nor_resource.start);
85 sdp_nor_resource.end = sdp_nor_resource.start
86 + FLASH_SIZE_SDPV2 - 1;
87 } else {
88 err = gpmc_cs_request(cs, FLASH_SIZE_SDPV1 - 1,
89 (unsigned long *)&sdp_nor_resource.start);
90 sdp_nor_resource.end = sdp_nor_resource.start
91 + FLASH_SIZE_SDPV1 - 1;
92 }
93 if (err < 0) {
94 printk(KERN_ERR "NOR: Can't request GPMC CS\n");
95 return;
96 }
97 if (platform_device_register(&sdp_nor_device) < 0)
98 printk(KERN_ERR "Unable to register NOR device\n");
99}
100
101#if defined(CONFIG_MTD_ONENAND_OMAP2) || \
102 defined(CONFIG_MTD_ONENAND_OMAP2_MODULE)
103static struct omap_onenand_platform_data board_onenand_data = {
104 .dma_channel = -1, /* disable DMA in OMAP OneNAND driver */
105};
106
107static void
108__init board_onenand_init(struct flash_partitions sdp_onenand_parts, u8 cs)
109{
110 board_onenand_data.cs = cs;
111 board_onenand_data.parts = sdp_onenand_parts.parts;
112 board_onenand_data.nr_parts = sdp_onenand_parts.nr_parts;
113
114 gpmc_onenand_init(&board_onenand_data);
115}
116#else
117static void
118__init board_onenand_init(struct flash_partitions sdp_onenand_parts, u8 cs)
119{
120}
121#endif /* CONFIG_MTD_ONENAND_OMAP2 || CONFIG_MTD_ONENAND_OMAP2_MODULE */
122
123#if defined(CONFIG_MTD_NAND_OMAP2) || \
124 defined(CONFIG_MTD_NAND_OMAP2_MODULE)
125
126/* Note that all values in this struct are in nanoseconds */
127static struct gpmc_timings nand_timings = {
128
129 .sync_clk = 0,
130
131 .cs_on = 0,
132 .cs_rd_off = 36,
133 .cs_wr_off = 36,
134
135 .adv_on = 6,
136 .adv_rd_off = 24,
137 .adv_wr_off = 36,
138
139 .we_off = 30,
140 .oe_off = 48,
141
142 .access = 54,
143 .rd_cycle = 72,
144 .wr_cycle = 72,
145
146 .wr_access = 30,
147 .wr_data_mux_bus = 0,
148};
149
150static struct omap_nand_platform_data sdp_nand_data = {
151 .nand_setup = NULL,
152 .gpmc_t = &nand_timings,
153 .dma_channel = -1, /* disable DMA in OMAP NAND driver */
154 .dev_ready = NULL,
155 .devsize = 0, /* '0' for 8-bit, '1' for 16-bit device */
156};
157
158static void
159__init board_nand_init(struct flash_partitions sdp_nand_parts, u8 cs)
160{
161 sdp_nand_data.cs = cs;
162 sdp_nand_data.parts = sdp_nand_parts.parts;
163 sdp_nand_data.nr_parts = sdp_nand_parts.nr_parts;
164
165 sdp_nand_data.gpmc_cs_baseaddr = (void *)(OMAP34XX_GPMC_VIRT +
166 GPMC_CS0_BASE +
167 cs * GPMC_CS_SIZE);
168 sdp_nand_data.gpmc_baseaddr = (void *) (OMAP34XX_GPMC_VIRT);
169
170 gpmc_nand_init(&sdp_nand_data);
171}
172#else
173static void
174__init board_nand_init(struct flash_partitions sdp_nand_parts, u8 cs)
175{
176}
177#endif /* CONFIG_MTD_NAND_OMAP2 || CONFIG_MTD_NAND_OMAP2_MODULE */
178
179/**
180 * get_gpmc0_type - Reads the FPGA DIP_SWITCH_INPUT_REGISTER2 to get
181 * the various cs values.
182 */
183static u8 get_gpmc0_type(void)
184{
185 u8 cs = 0;
186 void __iomem *fpga_map_addr;
187
188 fpga_map_addr = ioremap(DEBUG_BASE, 4096);
189 if (!fpga_map_addr)
190 return -ENOMEM;
191
192 if (!(__raw_readw(fpga_map_addr + REG_FPGA_REV)))
193 /* we dont have an DEBUG FPGA??? */
194 /* Depend on #defines!! default to strata boot return param */
195 goto unmap;
196
197 /* S8-DIP-OFF = 1, S8-DIP-ON = 0 */
198 cs = __raw_readw(fpga_map_addr + REG_FPGA_DIP_SWITCH_INPUT2) & 0xf;
199
200 /* ES2.0 SDP's onwards 4 dip switches are provided for CS */
201 if (omap_rev() >= OMAP3430_REV_ES1_0)
202 /* change (S8-1:4=DS-2:0) to (S8-4:1=DS-2:0) */
203 cs = ((cs & 8) >> 3) | ((cs & 4) >> 1) |
204 ((cs & 2) << 1) | ((cs & 1) << 3);
205 else
206 /* change (S8-1:3=DS-2:0) to (S8-3:1=DS-2:0) */
207 cs = ((cs & 4) >> 2) | (cs & 2) | ((cs & 1) << 2);
208unmap:
209 iounmap(fpga_map_addr);
210 return cs;
211}
212
213/**
214 * sdp3430_flash_init - Identify devices connected to GPMC and register.
215 *
216 * @return - void.
217 */
218void __init sdp_flash_init(struct flash_partitions sdp_partition_info[])
219{
220 u8 cs = 0;
221 u8 norcs = GPMC_CS_NUM + 1;
222 u8 nandcs = GPMC_CS_NUM + 1;
223 u8 onenandcs = GPMC_CS_NUM + 1;
224 u8 idx;
225 unsigned char *config_sel = NULL;
226
227 /* REVISIT: Is this return correct idx for 2430 SDP?
228 * for which cs configuration matches for 2430 SDP?
229 */
230 idx = get_gpmc0_type();
231 if (idx >= MAX_SUPPORTED_GPMC_CONFIG) {
232 printk(KERN_ERR "%s: Invalid chip select: %d\n", __func__, cs);
233 return;
234 }
235 config_sel = (unsigned char *)(chip_sel_sdp[idx]);
236
237 while (cs < GPMC_CS_NUM) {
238 switch (config_sel[cs]) {
239 case PDC_NOR:
240 if (norcs > GPMC_CS_NUM)
241 norcs = cs;
242 break;
243 case PDC_NAND:
244 if (nandcs > GPMC_CS_NUM)
245 nandcs = cs;
246 break;
247 case PDC_ONENAND:
248 if (onenandcs > GPMC_CS_NUM)
249 onenandcs = cs;
250 break;
251 };
252 cs++;
253 }
254
255 if (norcs > GPMC_CS_NUM)
256 printk(KERN_INFO "NOR: Unable to find configuration "
257 "in GPMC\n");
258 else
259 board_nor_init(sdp_partition_info[0], norcs);
260
261 if (onenandcs > GPMC_CS_NUM)
262 printk(KERN_INFO "OneNAND: Unable to find configuration "
263 "in GPMC\n");
264 else
265 board_onenand_init(sdp_partition_info[1], onenandcs);
266
267 if (nandcs > GPMC_CS_NUM)
268 printk(KERN_INFO "NAND: Unable to find configuration "
269 "in GPMC\n");
270 else
271 board_nand_init(sdp_partition_info[2], nandcs);
272}
diff --git a/arch/arm/mach-omap2/board-zoom-debugboard.c b/arch/arm/mach-omap2/board-zoom-debugboard.c
index 1f13e2a1f322..e15d2e87cfc1 100644
--- a/arch/arm/mach-omap2/board-zoom-debugboard.c
+++ b/arch/arm/mach-omap2/board-zoom-debugboard.c
@@ -14,20 +14,20 @@
14#include <linux/smsc911x.h> 14#include <linux/smsc911x.h>
15#include <linux/interrupt.h> 15#include <linux/interrupt.h>
16 16
17#include <mach/gpmc.h> 17#include <plat/gpmc.h>
18 18
19#define ZOOM2_SMSC911X_CS 7 19#define ZOOM_SMSC911X_CS 7
20#define ZOOM2_SMSC911X_GPIO 158 20#define ZOOM_SMSC911X_GPIO 158
21#define ZOOM2_QUADUART_CS 3 21#define ZOOM_QUADUART_CS 3
22#define ZOOM2_QUADUART_GPIO 102 22#define ZOOM_QUADUART_GPIO 102
23#define QUART_CLK 1843200 23#define QUART_CLK 1843200
24#define DEBUG_BASE 0x08000000 24#define DEBUG_BASE 0x08000000
25#define ZOOM2_ETHR_START DEBUG_BASE 25#define ZOOM_ETHR_START DEBUG_BASE
26 26
27static struct resource zoom2_smsc911x_resources[] = { 27static struct resource zoom_smsc911x_resources[] = {
28 [0] = { 28 [0] = {
29 .start = ZOOM2_ETHR_START, 29 .start = ZOOM_ETHR_START,
30 .end = ZOOM2_ETHR_START + SZ_4K, 30 .end = ZOOM_ETHR_START + SZ_4K,
31 .flags = IORESOURCE_MEM, 31 .flags = IORESOURCE_MEM,
32 }, 32 },
33 [1] = { 33 [1] = {
@@ -35,42 +35,42 @@ static struct resource zoom2_smsc911x_resources[] = {
35 }, 35 },
36}; 36};
37 37
38static struct smsc911x_platform_config zoom2_smsc911x_config = { 38static struct smsc911x_platform_config zoom_smsc911x_config = {
39 .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, 39 .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
40 .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, 40 .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN,
41 .flags = SMSC911X_USE_32BIT, 41 .flags = SMSC911X_USE_32BIT,
42 .phy_interface = PHY_INTERFACE_MODE_MII, 42 .phy_interface = PHY_INTERFACE_MODE_MII,
43}; 43};
44 44
45static struct platform_device zoom2_smsc911x_device = { 45static struct platform_device zoom_smsc911x_device = {
46 .name = "smsc911x", 46 .name = "smsc911x",
47 .id = -1, 47 .id = -1,
48 .num_resources = ARRAY_SIZE(zoom2_smsc911x_resources), 48 .num_resources = ARRAY_SIZE(zoom_smsc911x_resources),
49 .resource = zoom2_smsc911x_resources, 49 .resource = zoom_smsc911x_resources,
50 .dev = { 50 .dev = {
51 .platform_data = &zoom2_smsc911x_config, 51 .platform_data = &zoom_smsc911x_config,
52 }, 52 },
53}; 53};
54 54
55static inline void __init zoom2_init_smsc911x(void) 55static inline void __init zoom_init_smsc911x(void)
56{ 56{
57 int eth_cs; 57 int eth_cs;
58 unsigned long cs_mem_base; 58 unsigned long cs_mem_base;
59 int eth_gpio = 0; 59 int eth_gpio = 0;
60 60
61 eth_cs = ZOOM2_SMSC911X_CS; 61 eth_cs = ZOOM_SMSC911X_CS;
62 62
63 if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) { 63 if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) {
64 printk(KERN_ERR "Failed to request GPMC mem for smsc911x\n"); 64 printk(KERN_ERR "Failed to request GPMC mem for smsc911x\n");
65 return; 65 return;
66 } 66 }
67 67
68 zoom2_smsc911x_resources[0].start = cs_mem_base + 0x0; 68 zoom_smsc911x_resources[0].start = cs_mem_base + 0x0;
69 zoom2_smsc911x_resources[0].end = cs_mem_base + 0xff; 69 zoom_smsc911x_resources[0].end = cs_mem_base + 0xff;
70 70
71 eth_gpio = ZOOM2_SMSC911X_GPIO; 71 eth_gpio = ZOOM_SMSC911X_GPIO;
72 72
73 zoom2_smsc911x_resources[1].start = OMAP_GPIO_IRQ(eth_gpio); 73 zoom_smsc911x_resources[1].start = OMAP_GPIO_IRQ(eth_gpio);
74 74
75 if (gpio_request(eth_gpio, "smsc911x irq") < 0) { 75 if (gpio_request(eth_gpio, "smsc911x irq") < 0) {
76 printk(KERN_ERR "Failed to request GPIO%d for smsc911x IRQ\n", 76 printk(KERN_ERR "Failed to request GPIO%d for smsc911x IRQ\n",
@@ -94,21 +94,21 @@ static struct plat_serial8250_port serial_platform_data[] = {
94 } 94 }
95}; 95};
96 96
97static struct platform_device zoom2_debugboard_serial_device = { 97static struct platform_device zoom_debugboard_serial_device = {
98 .name = "serial8250", 98 .name = "serial8250",
99 .id = 3, 99 .id = PLAT8250_DEV_PLATFORM,
100 .dev = { 100 .dev = {
101 .platform_data = serial_platform_data, 101 .platform_data = serial_platform_data,
102 }, 102 },
103}; 103};
104 104
105static inline void __init zoom2_init_quaduart(void) 105static inline void __init zoom_init_quaduart(void)
106{ 106{
107 int quart_cs; 107 int quart_cs;
108 unsigned long cs_mem_base; 108 unsigned long cs_mem_base;
109 int quart_gpio = 0; 109 int quart_gpio = 0;
110 110
111 quart_cs = ZOOM2_QUADUART_CS; 111 quart_cs = ZOOM_QUADUART_CS;
112 112
113 if (gpmc_cs_request(quart_cs, SZ_1M, &cs_mem_base) < 0) { 113 if (gpmc_cs_request(quart_cs, SZ_1M, &cs_mem_base) < 0) {
114 printk(KERN_ERR "Failed to request GPMC mem" 114 printk(KERN_ERR "Failed to request GPMC mem"
@@ -116,7 +116,7 @@ static inline void __init zoom2_init_quaduart(void)
116 return; 116 return;
117 } 117 }
118 118
119 quart_gpio = ZOOM2_QUADUART_GPIO; 119 quart_gpio = ZOOM_QUADUART_GPIO;
120 120
121 if (gpio_request(quart_gpio, "TL16CP754C GPIO") < 0) { 121 if (gpio_request(quart_gpio, "TL16CP754C GPIO") < 0) {
122 printk(KERN_ERR "Failed to request GPIO%d for TL16CP754C\n", 122 printk(KERN_ERR "Failed to request GPIO%d for TL16CP754C\n",
@@ -126,15 +126,15 @@ static inline void __init zoom2_init_quaduart(void)
126 gpio_direction_input(quart_gpio); 126 gpio_direction_input(quart_gpio);
127} 127}
128 128
129static inline int omap_zoom2_debugboard_detect(void) 129static inline int omap_zoom_debugboard_detect(void)
130{ 130{
131 int debug_board_detect = 0; 131 int debug_board_detect = 0;
132 int ret = 1; 132 int ret = 1;
133 133
134 debug_board_detect = ZOOM2_SMSC911X_GPIO; 134 debug_board_detect = ZOOM_SMSC911X_GPIO;
135 135
136 if (gpio_request(debug_board_detect, "Zoom2 debug board detect") < 0) { 136 if (gpio_request(debug_board_detect, "Zoom debug board detect") < 0) {
137 printk(KERN_ERR "Failed to request GPIO%d for Zoom2 debug" 137 printk(KERN_ERR "Failed to request GPIO%d for Zoom debug"
138 "board detect\n", debug_board_detect); 138 "board detect\n", debug_board_detect);
139 return 0; 139 return 0;
140 } 140 }
@@ -147,17 +147,17 @@ static inline int omap_zoom2_debugboard_detect(void)
147 return ret; 147 return ret;
148} 148}
149 149
150static struct platform_device *zoom2_devices[] __initdata = { 150static struct platform_device *zoom_devices[] __initdata = {
151 &zoom2_smsc911x_device, 151 &zoom_smsc911x_device,
152 &zoom2_debugboard_serial_device, 152 &zoom_debugboard_serial_device,
153}; 153};
154 154
155int __init omap_zoom2_debugboard_init(void) 155int __init zoom_debugboard_init(void)
156{ 156{
157 if (!omap_zoom2_debugboard_detect()) 157 if (!omap_zoom_debugboard_detect())
158 return 0; 158 return 0;
159 159
160 zoom2_init_smsc911x(); 160 zoom_init_smsc911x();
161 zoom2_init_quaduart(); 161 zoom_init_quaduart();
162 return platform_add_devices(zoom2_devices, ARRAY_SIZE(zoom2_devices)); 162 return platform_add_devices(zoom_devices, ARRAY_SIZE(zoom_devices));
163} 163}
diff --git a/arch/arm/mach-omap2/board-zoom-peripherals.c b/arch/arm/mach-omap2/board-zoom-peripherals.c
new file mode 100644
index 000000000000..6b3984964cc5
--- /dev/null
+++ b/arch/arm/mach-omap2/board-zoom-peripherals.c
@@ -0,0 +1,285 @@
1/*
2 * Copyright (C) 2009 Texas Instruments Inc.
3 *
4 * Modified from mach-omap2/board-zoom2.c
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/platform_device.h>
14#include <linux/input.h>
15#include <linux/input/matrix_keypad.h>
16#include <linux/gpio.h>
17#include <linux/i2c/twl.h>
18#include <linux/regulator/machine.h>
19
20#include <asm/mach-types.h>
21#include <asm/mach/arch.h>
22#include <asm/mach/map.h>
23
24#include <plat/common.h>
25#include <plat/usb.h>
26
27#include "mux.h"
28#include "hsmmc.h"
29
30/* Zoom2 has Qwerty keyboard*/
31static int board_keymap[] = {
32 KEY(0, 0, KEY_E),
33 KEY(0, 1, KEY_R),
34 KEY(0, 2, KEY_T),
35 KEY(0, 3, KEY_HOME),
36 KEY(0, 6, KEY_I),
37 KEY(0, 7, KEY_LEFTSHIFT),
38 KEY(1, 0, KEY_D),
39 KEY(1, 1, KEY_F),
40 KEY(1, 2, KEY_G),
41 KEY(1, 3, KEY_SEND),
42 KEY(1, 6, KEY_K),
43 KEY(1, 7, KEY_ENTER),
44 KEY(2, 0, KEY_X),
45 KEY(2, 1, KEY_C),
46 KEY(2, 2, KEY_V),
47 KEY(2, 3, KEY_END),
48 KEY(2, 6, KEY_DOT),
49 KEY(2, 7, KEY_CAPSLOCK),
50 KEY(3, 0, KEY_Z),
51 KEY(3, 1, KEY_KPPLUS),
52 KEY(3, 2, KEY_B),
53 KEY(3, 3, KEY_F1),
54 KEY(3, 6, KEY_O),
55 KEY(3, 7, KEY_SPACE),
56 KEY(4, 0, KEY_W),
57 KEY(4, 1, KEY_Y),
58 KEY(4, 2, KEY_U),
59 KEY(4, 3, KEY_F2),
60 KEY(4, 4, KEY_VOLUMEUP),
61 KEY(4, 6, KEY_L),
62 KEY(4, 7, KEY_LEFT),
63 KEY(5, 0, KEY_S),
64 KEY(5, 1, KEY_H),
65 KEY(5, 2, KEY_J),
66 KEY(5, 3, KEY_F3),
67 KEY(5, 4, KEY_UNKNOWN),
68 KEY(5, 5, KEY_VOLUMEDOWN),
69 KEY(5, 6, KEY_M),
70 KEY(5, 7, KEY_RIGHT),
71 KEY(6, 0, KEY_Q),
72 KEY(6, 1, KEY_A),
73 KEY(6, 2, KEY_N),
74 KEY(6, 3, KEY_BACKSPACE),
75 KEY(6, 6, KEY_P),
76 KEY(6, 7, KEY_UP),
77 KEY(7, 0, KEY_PROG1), /*MACRO 1 <User defined> */
78 KEY(7, 1, KEY_PROG2), /*MACRO 2 <User defined> */
79 KEY(7, 2, KEY_PROG3), /*MACRO 3 <User defined> */
80 KEY(7, 3, KEY_PROG4), /*MACRO 4 <User defined> */
81 KEY(7, 6, KEY_SELECT),
82 KEY(7, 7, KEY_DOWN)
83};
84
85static struct matrix_keymap_data board_map_data = {
86 .keymap = board_keymap,
87 .keymap_size = ARRAY_SIZE(board_keymap),
88};
89
90static struct twl4030_keypad_data zoom_kp_twl4030_data = {
91 .keymap_data = &board_map_data,
92 .rows = 8,
93 .cols = 8,
94 .rep = 1,
95};
96
97static struct regulator_consumer_supply zoom_vmmc1_supply = {
98 .supply = "vmmc",
99};
100
101static struct regulator_consumer_supply zoom_vsim_supply = {
102 .supply = "vmmc_aux",
103};
104
105static struct regulator_consumer_supply zoom_vmmc2_supply = {
106 .supply = "vmmc",
107};
108
109/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
110static struct regulator_init_data zoom_vmmc1 = {
111 .constraints = {
112 .min_uV = 1850000,
113 .max_uV = 3150000,
114 .valid_modes_mask = REGULATOR_MODE_NORMAL
115 | REGULATOR_MODE_STANDBY,
116 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
117 | REGULATOR_CHANGE_MODE
118 | REGULATOR_CHANGE_STATUS,
119 },
120 .num_consumer_supplies = 1,
121 .consumer_supplies = &zoom_vmmc1_supply,
122};
123
124/* VMMC2 for MMC2 card */
125static struct regulator_init_data zoom_vmmc2 = {
126 .constraints = {
127 .min_uV = 1850000,
128 .max_uV = 1850000,
129 .apply_uV = true,
130 .valid_modes_mask = REGULATOR_MODE_NORMAL
131 | REGULATOR_MODE_STANDBY,
132 .valid_ops_mask = REGULATOR_CHANGE_MODE
133 | REGULATOR_CHANGE_STATUS,
134 },
135 .num_consumer_supplies = 1,
136 .consumer_supplies = &zoom_vmmc2_supply,
137};
138
139/* VSIM for OMAP VDD_MMC1A (i/o for DAT4..DAT7) */
140static struct regulator_init_data zoom_vsim = {
141 .constraints = {
142 .min_uV = 1800000,
143 .max_uV = 3000000,
144 .valid_modes_mask = REGULATOR_MODE_NORMAL
145 | REGULATOR_MODE_STANDBY,
146 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
147 | REGULATOR_CHANGE_MODE
148 | REGULATOR_CHANGE_STATUS,
149 },
150 .num_consumer_supplies = 1,
151 .consumer_supplies = &zoom_vsim_supply,
152};
153
154static struct omap2_hsmmc_info mmc[] __initdata = {
155 {
156 .name = "external",
157 .mmc = 1,
158 .wires = 4,
159 .gpio_wp = -EINVAL,
160 .power_saving = true,
161 },
162 {
163 .name = "internal",
164 .mmc = 2,
165 .wires = 8,
166 .gpio_cd = -EINVAL,
167 .gpio_wp = -EINVAL,
168 .nonremovable = true,
169 .power_saving = true,
170 },
171 {} /* Terminator */
172};
173
174static int zoom_twl_gpio_setup(struct device *dev,
175 unsigned gpio, unsigned ngpio)
176{
177 /* gpio + 0 is "mmc0_cd" (input/IRQ) */
178 mmc[0].gpio_cd = gpio + 0;
179 omap2_hsmmc_init(mmc);
180
181 /* link regulators to MMC adapters ... we "know" the
182 * regulators will be set up only *after* we return.
183 */
184 zoom_vmmc1_supply.dev = mmc[0].dev;
185 zoom_vsim_supply.dev = mmc[0].dev;
186 zoom_vmmc2_supply.dev = mmc[1].dev;
187
188 return 0;
189}
190
191
192static int zoom_batt_table[] = {
193/* 0 C*/
19430800, 29500, 28300, 27100,
19526000, 24900, 23900, 22900, 22000, 21100, 20300, 19400, 18700, 17900,
19617200, 16500, 15900, 15300, 14700, 14100, 13600, 13100, 12600, 12100,
19711600, 11200, 10800, 10400, 10000, 9630, 9280, 8950, 8620, 8310,
1988020, 7730, 7460, 7200, 6950, 6710, 6470, 6250, 6040, 5830,
1995640, 5450, 5260, 5090, 4920, 4760, 4600, 4450, 4310, 4170,
2004040, 3910, 3790, 3670, 3550
201};
202
203static struct twl4030_bci_platform_data zoom_bci_data = {
204 .battery_tmp_tbl = zoom_batt_table,
205 .tblsize = ARRAY_SIZE(zoom_batt_table),
206};
207
208static struct twl4030_usb_data zoom_usb_data = {
209 .usb_mode = T2_USB_MODE_ULPI,
210};
211
212static struct twl4030_gpio_platform_data zoom_gpio_data = {
213 .gpio_base = OMAP_MAX_GPIO_LINES,
214 .irq_base = TWL4030_GPIO_IRQ_BASE,
215 .irq_end = TWL4030_GPIO_IRQ_END,
216 .setup = zoom_twl_gpio_setup,
217};
218
219static struct twl4030_madc_platform_data zoom_madc_data = {
220 .irq_line = 1,
221};
222
223static struct twl4030_codec_audio_data zoom_audio_data = {
224 .audio_mclk = 26000000,
225};
226
227static struct twl4030_codec_data zoom_codec_data = {
228 .audio_mclk = 26000000,
229 .audio = &zoom_audio_data,
230};
231
232static struct twl4030_platform_data zoom_twldata = {
233 .irq_base = TWL4030_IRQ_BASE,
234 .irq_end = TWL4030_IRQ_END,
235
236 /* platform_data for children goes here */
237 .bci = &zoom_bci_data,
238 .madc = &zoom_madc_data,
239 .usb = &zoom_usb_data,
240 .gpio = &zoom_gpio_data,
241 .keypad = &zoom_kp_twl4030_data,
242 .codec = &zoom_codec_data,
243 .vmmc1 = &zoom_vmmc1,
244 .vmmc2 = &zoom_vmmc2,
245 .vsim = &zoom_vsim,
246
247};
248
249static struct i2c_board_info __initdata zoom_i2c_boardinfo[] = {
250 {
251 I2C_BOARD_INFO("twl5030", 0x48),
252 .flags = I2C_CLIENT_WAKE,
253 .irq = INT_34XX_SYS_NIRQ,
254 .platform_data = &zoom_twldata,
255 },
256};
257
258static int __init omap_i2c_init(void)
259{
260 omap_register_i2c_bus(1, 2400, zoom_i2c_boardinfo,
261 ARRAY_SIZE(zoom_i2c_boardinfo));
262 omap_register_i2c_bus(2, 400, NULL, 0);
263 omap_register_i2c_bus(3, 400, NULL, 0);
264 return 0;
265}
266
267static struct omap_musb_board_data musb_board_data = {
268 .interface_type = MUSB_INTERFACE_ULPI,
269 .mode = MUSB_OTG,
270 .power = 100,
271};
272
273static void enable_board_wakeup_source(void)
274{
275 /* T2 interrupt line (keypad) */
276 omap_mux_init_signal("sys_nirq",
277 OMAP_WAKEUP_EN | OMAP_PIN_INPUT_PULLUP);
278}
279
280void __init zoom_peripherals_init(void)
281{
282 omap_i2c_init();
283 usb_musb_init(&musb_board_data);
284 enable_board_wakeup_source();
285}
diff --git a/arch/arm/mach-omap2/board-zoom2.c b/arch/arm/mach-omap2/board-zoom2.c
index 51e0b3ba5f3a..9a26f84b1141 100644
--- a/arch/arm/mach-omap2/board-zoom2.c
+++ b/arch/arm/mach-omap2/board-zoom2.c
@@ -13,223 +13,43 @@
13#include <linux/init.h> 13#include <linux/init.h>
14#include <linux/platform_device.h> 14#include <linux/platform_device.h>
15#include <linux/input.h> 15#include <linux/input.h>
16#include <linux/input/matrix_keypad.h>
17#include <linux/gpio.h> 16#include <linux/gpio.h>
18#include <linux/i2c/twl4030.h>
19#include <linux/regulator/machine.h>
20 17
21#include <asm/mach-types.h> 18#include <asm/mach-types.h>
22#include <asm/mach/arch.h> 19#include <asm/mach/arch.h>
23 20
24#include <mach/common.h> 21#include <plat/common.h>
25#include <mach/usb.h> 22#include <plat/board.h>
26 23
27#include "mmc-twl4030.h" 24#include <mach/board-zoom.h>
28#include "sdram-micron-mt46h32m32lf-6.h"
29
30/* Zoom2 has Qwerty keyboard*/
31static int board_keymap[] = {
32 KEY(0, 0, KEY_E),
33 KEY(0, 1, KEY_R),
34 KEY(0, 2, KEY_T),
35 KEY(0, 3, KEY_HOME),
36 KEY(0, 6, KEY_I),
37 KEY(0, 7, KEY_LEFTSHIFT),
38 KEY(1, 0, KEY_D),
39 KEY(1, 1, KEY_F),
40 KEY(1, 2, KEY_G),
41 KEY(1, 3, KEY_SEND),
42 KEY(1, 6, KEY_K),
43 KEY(1, 7, KEY_ENTER),
44 KEY(2, 0, KEY_X),
45 KEY(2, 1, KEY_C),
46 KEY(2, 2, KEY_V),
47 KEY(2, 3, KEY_END),
48 KEY(2, 6, KEY_DOT),
49 KEY(2, 7, KEY_CAPSLOCK),
50 KEY(3, 0, KEY_Z),
51 KEY(3, 1, KEY_KPPLUS),
52 KEY(3, 2, KEY_B),
53 KEY(3, 3, KEY_F1),
54 KEY(3, 6, KEY_O),
55 KEY(3, 7, KEY_SPACE),
56 KEY(4, 0, KEY_W),
57 KEY(4, 1, KEY_Y),
58 KEY(4, 2, KEY_U),
59 KEY(4, 3, KEY_F2),
60 KEY(4, 4, KEY_VOLUMEUP),
61 KEY(4, 6, KEY_L),
62 KEY(4, 7, KEY_LEFT),
63 KEY(5, 0, KEY_S),
64 KEY(5, 1, KEY_H),
65 KEY(5, 2, KEY_J),
66 KEY(5, 3, KEY_F3),
67 KEY(5, 5, KEY_VOLUMEDOWN),
68 KEY(5, 6, KEY_M),
69 KEY(5, 7, KEY_ENTER),
70 KEY(6, 0, KEY_Q),
71 KEY(6, 1, KEY_A),
72 KEY(6, 2, KEY_N),
73 KEY(6, 3, KEY_BACKSPACE),
74 KEY(6, 6, KEY_P),
75 KEY(6, 7, KEY_SELECT),
76 KEY(7, 0, KEY_PROG1), /*MACRO 1 <User defined> */
77 KEY(7, 1, KEY_PROG2), /*MACRO 2 <User defined> */
78 KEY(7, 2, KEY_PROG3), /*MACRO 3 <User defined> */
79 KEY(7, 3, KEY_PROG4), /*MACRO 4 <User defined> */
80 KEY(7, 5, KEY_RIGHT),
81 KEY(7, 6, KEY_UP),
82 KEY(7, 7, KEY_DOWN)
83};
84
85static struct matrix_keymap_data board_map_data = {
86 .keymap = board_keymap,
87 .keymap_size = ARRAY_SIZE(board_keymap),
88};
89
90static struct twl4030_keypad_data zoom2_kp_twl4030_data = {
91 .keymap_data = &board_map_data,
92 .rows = 8,
93 .cols = 8,
94 .rep = 1,
95};
96
97static struct omap_board_config_kernel zoom2_config[] __initdata = {
98};
99
100static struct regulator_consumer_supply zoom2_vmmc1_supply = {
101 .supply = "vmmc",
102};
103
104static struct regulator_consumer_supply zoom2_vsim_supply = {
105 .supply = "vmmc_aux",
106};
107
108static struct regulator_consumer_supply zoom2_vmmc2_supply = {
109 .supply = "vmmc",
110};
111
112/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
113static struct regulator_init_data zoom2_vmmc1 = {
114 .constraints = {
115 .min_uV = 1850000,
116 .max_uV = 3150000,
117 .valid_modes_mask = REGULATOR_MODE_NORMAL
118 | REGULATOR_MODE_STANDBY,
119 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
120 | REGULATOR_CHANGE_MODE
121 | REGULATOR_CHANGE_STATUS,
122 },
123 .num_consumer_supplies = 1,
124 .consumer_supplies = &zoom2_vmmc1_supply,
125};
126
127/* VMMC2 for MMC2 card */
128static struct regulator_init_data zoom2_vmmc2 = {
129 .constraints = {
130 .min_uV = 1850000,
131 .max_uV = 1850000,
132 .apply_uV = true,
133 .valid_modes_mask = REGULATOR_MODE_NORMAL
134 | REGULATOR_MODE_STANDBY,
135 .valid_ops_mask = REGULATOR_CHANGE_MODE
136 | REGULATOR_CHANGE_STATUS,
137 },
138 .num_consumer_supplies = 1,
139 .consumer_supplies = &zoom2_vmmc2_supply,
140};
141
142/* VSIM for OMAP VDD_MMC1A (i/o for DAT4..DAT7) */
143static struct regulator_init_data zoom2_vsim = {
144 .constraints = {
145 .min_uV = 1800000,
146 .max_uV = 3000000,
147 .valid_modes_mask = REGULATOR_MODE_NORMAL
148 | REGULATOR_MODE_STANDBY,
149 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
150 | REGULATOR_CHANGE_MODE
151 | REGULATOR_CHANGE_STATUS,
152 },
153 .num_consumer_supplies = 1,
154 .consumer_supplies = &zoom2_vsim_supply,
155};
156
157static struct twl4030_hsmmc_info mmc[] __initdata = {
158 {
159 .mmc = 1,
160 .wires = 4,
161 .gpio_wp = -EINVAL,
162 },
163 {
164 .mmc = 2,
165 .wires = 4,
166 .gpio_wp = -EINVAL,
167 },
168 {} /* Terminator */
169};
170 25
171static int zoom2_twl_gpio_setup(struct device *dev, 26#include "mux.h"
172 unsigned gpio, unsigned ngpio) 27#include "sdram-micron-mt46h32m32lf-6.h"
173{
174 /* gpio + 0 is "mmc0_cd" (input/IRQ),
175 * gpio + 1 is "mmc1_cd" (input/IRQ)
176 */
177 mmc[0].gpio_cd = gpio + 0;
178 mmc[1].gpio_cd = gpio + 1;
179 twl4030_mmc_init(mmc);
180
181 /* link regulators to MMC adapters ... we "know" the
182 * regulators will be set up only *after* we return.
183 */
184 zoom2_vmmc1_supply.dev = mmc[0].dev;
185 zoom2_vsim_supply.dev = mmc[0].dev;
186 zoom2_vmmc2_supply.dev = mmc[1].dev;
187
188 return 0;
189}
190
191
192static int zoom2_batt_table[] = {
193/* 0 C*/
19430800, 29500, 28300, 27100,
19526000, 24900, 23900, 22900, 22000, 21100, 20300, 19400, 18700, 17900,
19617200, 16500, 15900, 15300, 14700, 14100, 13600, 13100, 12600, 12100,
19711600, 11200, 10800, 10400, 10000, 9630, 9280, 8950, 8620, 8310,
1988020, 7730, 7460, 7200, 6950, 6710, 6470, 6250, 6040, 5830,
1995640, 5450, 5260, 5090, 4920, 4760, 4600, 4450, 4310, 4170,
2004040, 3910, 3790, 3670, 3550
201};
202
203static struct twl4030_bci_platform_data zoom2_bci_data = {
204 .battery_tmp_tbl = zoom2_batt_table,
205 .tblsize = ARRAY_SIZE(zoom2_batt_table),
206};
207
208static struct twl4030_usb_data zoom2_usb_data = {
209 .usb_mode = T2_USB_MODE_ULPI,
210};
211 28
212static void __init omap_zoom2_init_irq(void) 29static void __init omap_zoom2_init_irq(void)
213{ 30{
214 omap_board_config = zoom2_config;
215 omap_board_config_size = ARRAY_SIZE(zoom2_config);
216 omap2_init_common_hw(mt46h32m32lf6_sdrc_params, 31 omap2_init_common_hw(mt46h32m32lf6_sdrc_params,
217 mt46h32m32lf6_sdrc_params); 32 mt46h32m32lf6_sdrc_params);
218 omap_init_irq(); 33 omap_init_irq();
219 omap_gpio_init(); 34 omap_gpio_init();
220} 35}
221 36
222static struct twl4030_gpio_platform_data zoom2_gpio_data = { 37/* REVISIT: These audio entries can be removed once MFD code is merged */
223 .gpio_base = OMAP_MAX_GPIO_LINES, 38#if 0
224 .irq_base = TWL4030_GPIO_IRQ_BASE,
225 .irq_end = TWL4030_GPIO_IRQ_END,
226 .setup = zoom2_twl_gpio_setup,
227};
228 39
229static struct twl4030_madc_platform_data zoom2_madc_data = { 40static struct twl4030_madc_platform_data zoom2_madc_data = {
230 .irq_line = 1, 41 .irq_line = 1,
231}; 42};
232 43
44static struct twl4030_codec_audio_data zoom2_audio_data = {
45 .audio_mclk = 26000000,
46};
47
48static struct twl4030_codec_data zoom2_codec_data = {
49 .audio_mclk = 26000000,
50 .audio = &zoom2_audio_data,
51};
52
233static struct twl4030_platform_data zoom2_twldata = { 53static struct twl4030_platform_data zoom2_twldata = {
234 .irq_base = TWL4030_IRQ_BASE, 54 .irq_base = TWL4030_IRQ_BASE,
235 .irq_end = TWL4030_IRQ_END, 55 .irq_end = TWL4030_IRQ_END,
@@ -240,49 +60,39 @@ static struct twl4030_platform_data zoom2_twldata = {
240 .usb = &zoom2_usb_data, 60 .usb = &zoom2_usb_data,
241 .gpio = &zoom2_gpio_data, 61 .gpio = &zoom2_gpio_data,
242 .keypad = &zoom2_kp_twl4030_data, 62 .keypad = &zoom2_kp_twl4030_data,
63 .codec = &zoom2_codec_data,
243 .vmmc1 = &zoom2_vmmc1, 64 .vmmc1 = &zoom2_vmmc1,
244 .vmmc2 = &zoom2_vmmc2, 65 .vmmc2 = &zoom2_vmmc2,
245 .vsim = &zoom2_vsim, 66 .vsim = &zoom2_vsim,
246 67
247}; 68};
248 69
249static struct i2c_board_info __initdata zoom2_i2c_boardinfo[] = { 70#endif
250 {
251 I2C_BOARD_INFO("twl4030", 0x48),
252 .flags = I2C_CLIENT_WAKE,
253 .irq = INT_34XX_SYS_NIRQ,
254 .platform_data = &zoom2_twldata,
255 },
256};
257 71
258static int __init omap_i2c_init(void) 72#ifdef CONFIG_OMAP_MUX
259{ 73static struct omap_board_mux board_mux[] __initdata = {
260 omap_register_i2c_bus(1, 2600, zoom2_i2c_boardinfo, 74 { .reg_offset = OMAP_MUX_TERMINATOR },
261 ARRAY_SIZE(zoom2_i2c_boardinfo)); 75};
262 omap_register_i2c_bus(2, 400, NULL, 0); 76#else
263 omap_register_i2c_bus(3, 400, NULL, 0); 77#define board_mux NULL
264 return 0; 78#endif
265}
266
267extern int __init omap_zoom2_debugboard_init(void);
268 79
269static void __init omap_zoom2_init(void) 80static void __init omap_zoom2_init(void)
270{ 81{
271 omap_i2c_init(); 82 omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
272 omap_serial_init(); 83 zoom_peripherals_init();
273 omap_zoom2_debugboard_init(); 84 zoom_debugboard_init();
274 usb_musb_init();
275} 85}
276 86
277static void __init omap_zoom2_map_io(void) 87static void __init omap_zoom2_map_io(void)
278{ 88{
279 omap2_set_globals_343x(); 89 omap2_set_globals_343x();
280 omap2_map_common_io(); 90 omap34xx_map_common_io();
281} 91}
282 92
283MACHINE_START(OMAP_ZOOM2, "OMAP Zoom2 board") 93MACHINE_START(OMAP_ZOOM2, "OMAP Zoom2 board")
284 .phys_io = 0x48000000, 94 .phys_io = 0x48000000,
285 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, 95 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
286 .boot_params = 0x80000100, 96 .boot_params = 0x80000100,
287 .map_io = omap_zoom2_map_io, 97 .map_io = omap_zoom2_map_io,
288 .init_irq = omap_zoom2_init_irq, 98 .init_irq = omap_zoom2_init_irq,
diff --git a/arch/arm/mach-omap2/board-zoom3.c b/arch/arm/mach-omap2/board-zoom3.c
new file mode 100644
index 000000000000..cd3e40cf3ac1
--- /dev/null
+++ b/arch/arm/mach-omap2/board-zoom3.c
@@ -0,0 +1,83 @@
1/*
2 * Copyright (C) 2009 Texas Instruments Inc.
3 *
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 */
9
10#include <linux/kernel.h>
11#include <linux/init.h>
12#include <linux/platform_device.h>
13#include <linux/input.h>
14#include <linux/gpio.h>
15
16#include <asm/mach-types.h>
17#include <asm/mach/arch.h>
18
19#include <mach/board-zoom.h>
20
21#include <plat/common.h>
22#include <plat/board.h>
23#include <plat/usb.h>
24
25#include "mux.h"
26#include "sdram-hynix-h8mbx00u0mer-0em.h"
27
28static void __init omap_zoom_map_io(void)
29{
30 omap2_set_globals_36xx();
31 omap34xx_map_common_io();
32}
33
34static struct omap_board_config_kernel zoom_config[] __initdata = {
35};
36
37static void __init omap_zoom_init_irq(void)
38{
39 omap_board_config = zoom_config;
40 omap_board_config_size = ARRAY_SIZE(zoom_config);
41 omap2_init_common_hw(h8mbx00u0mer0em_sdrc_params,
42 h8mbx00u0mer0em_sdrc_params);
43 omap_init_irq();
44 omap_gpio_init();
45}
46
47#ifdef CONFIG_OMAP_MUX
48static struct omap_board_mux board_mux[] __initdata = {
49 { .reg_offset = OMAP_MUX_TERMINATOR },
50};
51#else
52#define board_mux NULL
53#endif
54
55static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
56 .port_mode[0] = EHCI_HCD_OMAP_MODE_UNKNOWN,
57 .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
58 .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
59 .phy_reset = true,
60 .reset_gpio_port[0] = -EINVAL,
61 .reset_gpio_port[1] = 64,
62 .reset_gpio_port[2] = -EINVAL,
63};
64
65static void __init omap_zoom_init(void)
66{
67 omap3_mux_init(board_mux, OMAP_PACKAGE_CBP);
68 zoom_peripherals_init();
69 zoom_debugboard_init();
70
71 omap_mux_init_gpio(64, OMAP_PIN_OUTPUT);
72 usb_ehci_init(&ehci_pdata);
73}
74
75MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board")
76 .phys_io = 0x48000000,
77 .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
78 .boot_params = 0x80000100,
79 .map_io = omap_zoom_map_io,
80 .init_irq = omap_zoom_init_irq,
81 .init_machine = omap_zoom_init,
82 .timer = &omap_timer,
83MACHINE_END
diff --git a/arch/arm/mach-omap2/clkt2xxx_apll.c b/arch/arm/mach-omap2/clkt2xxx_apll.c
new file mode 100644
index 000000000000..43d7246ce335
--- /dev/null
+++ b/arch/arm/mach-omap2/clkt2xxx_apll.c
@@ -0,0 +1,122 @@
1/*
2 * OMAP2xxx APLL clock control functions
3 *
4 * Copyright (C) 2005-2008 Texas Instruments, Inc.
5 * Copyright (C) 2004-2010 Nokia Corporation
6 *
7 * Contacts:
8 * Richard Woodruff <r-woodruff2@ti.com>
9 * Paul Walmsley
10 *
11 * Based on earlier work by Tuukka Tikkanen, Tony Lindgren,
12 * Gordon McNutt and RidgeRun, Inc.
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#undef DEBUG
19
20#include <linux/kernel.h>
21#include <linux/clk.h>
22#include <linux/io.h>
23
24#include <plat/clock.h>
25#include <plat/prcm.h>
26
27#include "clock.h"
28#include "clock2xxx.h"
29#include "cm.h"
30#include "cm-regbits-24xx.h"
31
32/* CM_CLKEN_PLL.EN_{54,96}M_PLL options (24XX) */
33#define EN_APLL_STOPPED 0
34#define EN_APLL_LOCKED 3
35
36/* CM_CLKSEL1_PLL.APLLS_CLKIN options (24XX) */
37#define APLLS_CLKIN_19_2MHZ 0
38#define APLLS_CLKIN_13MHZ 2
39#define APLLS_CLKIN_12MHZ 3
40
41void __iomem *cm_idlest_pll;
42
43/* Private functions */
44
45/* Enable an APLL if off */
46static int omap2_clk_apll_enable(struct clk *clk, u32 status_mask)
47{
48 u32 cval, apll_mask;
49
50 apll_mask = EN_APLL_LOCKED << clk->enable_bit;
51
52 cval = cm_read_mod_reg(PLL_MOD, CM_CLKEN);
53
54 if ((cval & apll_mask) == apll_mask)
55 return 0; /* apll already enabled */
56
57 cval &= ~apll_mask;
58 cval |= apll_mask;
59 cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN);
60
61 omap2_cm_wait_idlest(cm_idlest_pll, status_mask,
62 OMAP24XX_CM_IDLEST_VAL, clk->name);
63
64 /*
65 * REVISIT: Should we return an error code if omap2_wait_clock_ready()
66 * fails?
67 */
68 return 0;
69}
70
71static int omap2_clk_apll96_enable(struct clk *clk)
72{
73 return omap2_clk_apll_enable(clk, OMAP24XX_ST_96M_APLL);
74}
75
76static int omap2_clk_apll54_enable(struct clk *clk)
77{
78 return omap2_clk_apll_enable(clk, OMAP24XX_ST_54M_APLL);
79}
80
81/* Stop APLL */
82static void omap2_clk_apll_disable(struct clk *clk)
83{
84 u32 cval;
85
86 cval = cm_read_mod_reg(PLL_MOD, CM_CLKEN);
87 cval &= ~(EN_APLL_LOCKED << clk->enable_bit);
88 cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN);
89}
90
91/* Public data */
92
93const struct clkops clkops_apll96 = {
94 .enable = omap2_clk_apll96_enable,
95 .disable = omap2_clk_apll_disable,
96};
97
98const struct clkops clkops_apll54 = {
99 .enable = omap2_clk_apll54_enable,
100 .disable = omap2_clk_apll_disable,
101};
102
103/* Public functions */
104
105u32 omap2xxx_get_apll_clkin(void)
106{
107 u32 aplls, srate = 0;
108
109 aplls = cm_read_mod_reg(PLL_MOD, CM_CLKSEL1);
110 aplls &= OMAP24XX_APLLS_CLKIN_MASK;
111 aplls >>= OMAP24XX_APLLS_CLKIN_SHIFT;
112
113 if (aplls == APLLS_CLKIN_19_2MHZ)
114 srate = 19200000;
115 else if (aplls == APLLS_CLKIN_13MHZ)
116 srate = 13000000;
117 else if (aplls == APLLS_CLKIN_12MHZ)
118 srate = 12000000;
119
120 return srate;
121}
122
diff --git a/arch/arm/mach-omap2/clkt2xxx_dpllcore.c b/arch/arm/mach-omap2/clkt2xxx_dpllcore.c
new file mode 100644
index 000000000000..019048434f13
--- /dev/null
+++ b/arch/arm/mach-omap2/clkt2xxx_dpllcore.c
@@ -0,0 +1,173 @@
1/*
2 * DPLL + CORE_CLK composite clock functions
3 *
4 * Copyright (C) 2005-2008 Texas Instruments, Inc.
5 * Copyright (C) 2004-2010 Nokia Corporation
6 *
7 * Contacts:
8 * Richard Woodruff <r-woodruff2@ti.com>
9 * Paul Walmsley
10 *
11 * Based on earlier work by Tuukka Tikkanen, Tony Lindgren,
12 * Gordon McNutt and RidgeRun, Inc.
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 * XXX The DPLL and CORE clocks should be split into two separate clock
19 * types.
20 */
21#undef DEBUG
22
23#include <linux/kernel.h>
24#include <linux/errno.h>
25#include <linux/clk.h>
26#include <linux/io.h>
27
28#include <plat/clock.h>
29#include <plat/sram.h>
30#include <plat/sdrc.h>
31
32#include "clock.h"
33#include "clock2xxx.h"
34#include "opp2xxx.h"
35#include "cm.h"
36#include "cm-regbits-24xx.h"
37
38/* #define DOWN_VARIABLE_DPLL 1 */ /* Experimental */
39
40/**
41 * omap2xxx_clk_get_core_rate - return the CORE_CLK rate
42 * @clk: pointer to the combined dpll_ck + core_ck (currently "dpll_ck")
43 *
44 * Returns the CORE_CLK rate. CORE_CLK can have one of three rate
45 * sources on OMAP2xxx: the DPLL CLKOUT rate, DPLL CLKOUTX2, or 32KHz
46 * (the latter is unusual). This currently should be called with
47 * struct clk *dpll_ck, which is a composite clock of dpll_ck and
48 * core_ck.
49 */
50unsigned long omap2xxx_clk_get_core_rate(struct clk *clk)
51{
52 long long core_clk;
53 u32 v;
54
55 core_clk = omap2_get_dpll_rate(clk);
56
57 v = cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
58 v &= OMAP24XX_CORE_CLK_SRC_MASK;
59
60 if (v == CORE_CLK_SRC_32K)
61 core_clk = 32768;
62 else
63 core_clk *= v;
64
65 return core_clk;
66}
67
68/*
69 * Uses the current prcm set to tell if a rate is valid.
70 * You can go slower, but not faster within a given rate set.
71 */
72static long omap2_dpllcore_round_rate(unsigned long target_rate)
73{
74 u32 high, low, core_clk_src;
75
76 core_clk_src = cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
77 core_clk_src &= OMAP24XX_CORE_CLK_SRC_MASK;
78
79 if (core_clk_src == CORE_CLK_SRC_DPLL) { /* DPLL clockout */
80 high = curr_prcm_set->dpll_speed * 2;
81 low = curr_prcm_set->dpll_speed;
82 } else { /* DPLL clockout x 2 */
83 high = curr_prcm_set->dpll_speed;
84 low = curr_prcm_set->dpll_speed / 2;
85 }
86
87#ifdef DOWN_VARIABLE_DPLL
88 if (target_rate > high)
89 return high;
90 else
91 return target_rate;
92#else
93 if (target_rate > low)
94 return high;
95 else
96 return low;
97#endif
98
99}
100
101unsigned long omap2_dpllcore_recalc(struct clk *clk)
102{
103 return omap2xxx_clk_get_core_rate(clk);
104}
105
106int omap2_reprogram_dpllcore(struct clk *clk, unsigned long rate)
107{
108 u32 cur_rate, low, mult, div, valid_rate, done_rate;
109 u32 bypass = 0;
110 struct prcm_config tmpset;
111 const struct dpll_data *dd;
112
113 cur_rate = omap2xxx_clk_get_core_rate(dclk);
114 mult = cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
115 mult &= OMAP24XX_CORE_CLK_SRC_MASK;
116
117 if ((rate == (cur_rate / 2)) && (mult == 2)) {
118 omap2xxx_sdrc_reprogram(CORE_CLK_SRC_DPLL, 1);
119 } else if ((rate == (cur_rate * 2)) && (mult == 1)) {
120 omap2xxx_sdrc_reprogram(CORE_CLK_SRC_DPLL_X2, 1);
121 } else if (rate != cur_rate) {
122 valid_rate = omap2_dpllcore_round_rate(rate);
123 if (valid_rate != rate)
124 return -EINVAL;
125
126 if (mult == 1)
127 low = curr_prcm_set->dpll_speed;
128 else
129 low = curr_prcm_set->dpll_speed / 2;
130
131 dd = clk->dpll_data;
132 if (!dd)
133 return -EINVAL;
134
135 tmpset.cm_clksel1_pll = __raw_readl(dd->mult_div1_reg);
136 tmpset.cm_clksel1_pll &= ~(dd->mult_mask |
137 dd->div1_mask);
138 div = ((curr_prcm_set->xtal_speed / 1000000) - 1);
139 tmpset.cm_clksel2_pll = cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
140 tmpset.cm_clksel2_pll &= ~OMAP24XX_CORE_CLK_SRC_MASK;
141 if (rate > low) {
142 tmpset.cm_clksel2_pll |= CORE_CLK_SRC_DPLL_X2;
143 mult = ((rate / 2) / 1000000);
144 done_rate = CORE_CLK_SRC_DPLL_X2;
145 } else {
146 tmpset.cm_clksel2_pll |= CORE_CLK_SRC_DPLL;
147 mult = (rate / 1000000);
148 done_rate = CORE_CLK_SRC_DPLL;
149 }
150 tmpset.cm_clksel1_pll |= (div << __ffs(dd->mult_mask));
151 tmpset.cm_clksel1_pll |= (mult << __ffs(dd->div1_mask));
152
153 /* Worst case */
154 tmpset.base_sdrc_rfr = SDRC_RFR_CTRL_BYPASS;
155
156 if (rate == curr_prcm_set->xtal_speed) /* If asking for 1-1 */
157 bypass = 1;
158
159 /* For omap2xxx_sdrc_init_params() */
160 omap2xxx_sdrc_reprogram(CORE_CLK_SRC_DPLL_X2, 1);
161
162 /* Force dll lock mode */
163 omap2_set_prcm(tmpset.cm_clksel1_pll, tmpset.base_sdrc_rfr,
164 bypass);
165
166 /* Errata: ret dll entry state */
167 omap2xxx_sdrc_init_params(omap2xxx_sdrc_dll_is_unlocked());
168 omap2xxx_sdrc_reprogram(done_rate, 0);
169 }
170
171 return 0;
172}
173
diff --git a/arch/arm/mach-omap2/clkt2xxx_osc.c b/arch/arm/mach-omap2/clkt2xxx_osc.c
new file mode 100644
index 000000000000..2167be84a5bc
--- /dev/null
+++ b/arch/arm/mach-omap2/clkt2xxx_osc.c
@@ -0,0 +1,62 @@
1/*
2 * OMAP2xxx osc_clk-specific clock code
3 *
4 * Copyright (C) 2005-2008 Texas Instruments, Inc.
5 * Copyright (C) 2004-2010 Nokia Corporation
6 *
7 * Contacts:
8 * Richard Woodruff <r-woodruff2@ti.com>
9 * Paul Walmsley
10 *
11 * Based on earlier work by Tuukka Tikkanen, Tony Lindgren,
12 * Gordon McNutt and RidgeRun, Inc.
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#undef DEBUG
19
20#include <linux/module.h>
21#include <linux/kernel.h>
22#include <linux/errno.h>
23#include <linux/clk.h>
24#include <linux/io.h>
25
26#include <plat/clock.h>
27
28#include "clock.h"
29#include "clock2xxx.h"
30#include "prm.h"
31#include "prm-regbits-24xx.h"
32
33static int omap2_enable_osc_ck(struct clk *clk)
34{
35 u32 pcc;
36
37 pcc = __raw_readl(prcm_clksrc_ctrl);
38
39 __raw_writel(pcc & ~OMAP_AUTOEXTCLKMODE_MASK, prcm_clksrc_ctrl);
40
41 return 0;
42}
43
44static void omap2_disable_osc_ck(struct clk *clk)
45{
46 u32 pcc;
47
48 pcc = __raw_readl(prcm_clksrc_ctrl);
49
50 __raw_writel(pcc | OMAP_AUTOEXTCLKMODE_MASK, prcm_clksrc_ctrl);
51}
52
53const struct clkops clkops_oscck = {
54 .enable = omap2_enable_osc_ck,
55 .disable = omap2_disable_osc_ck,
56};
57
58unsigned long omap2_osc_clk_recalc(struct clk *clk)
59{
60 return omap2xxx_get_apll_clkin() * omap2xxx_get_sysclkdiv();
61}
62
diff --git a/arch/arm/mach-omap2/clkt2xxx_sys.c b/arch/arm/mach-omap2/clkt2xxx_sys.c
new file mode 100644
index 000000000000..822b5a79f457
--- /dev/null
+++ b/arch/arm/mach-omap2/clkt2xxx_sys.c
@@ -0,0 +1,50 @@
1/*
2 * OMAP2xxx sys_clk-specific clock code
3 *
4 * Copyright (C) 2005-2008 Texas Instruments, Inc.
5 * Copyright (C) 2004-2010 Nokia Corporation
6 *
7 * Contacts:
8 * Richard Woodruff <r-woodruff2@ti.com>
9 * Paul Walmsley
10 *
11 * Based on earlier work by Tuukka Tikkanen, Tony Lindgren,
12 * Gordon McNutt and RidgeRun, Inc.
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#undef DEBUG
19
20#include <linux/kernel.h>
21#include <linux/errno.h>
22#include <linux/clk.h>
23#include <linux/io.h>
24
25#include <plat/clock.h>
26
27#include "clock.h"
28#include "clock2xxx.h"
29#include "prm.h"
30#include "prm-regbits-24xx.h"
31
32void __iomem *prcm_clksrc_ctrl;
33
34u32 omap2xxx_get_sysclkdiv(void)
35{
36 u32 div;
37
38 div = __raw_readl(prcm_clksrc_ctrl);
39 div &= OMAP_SYSCLKDIV_MASK;
40 div >>= OMAP_SYSCLKDIV_SHIFT;
41
42 return div;
43}
44
45unsigned long omap2xxx_sys_clk_recalc(struct clk *clk)
46{
47 return clk->parent->rate / omap2xxx_get_sysclkdiv();
48}
49
50
diff --git a/arch/arm/mach-omap2/clkt2xxx_virt_prcm_set.c b/arch/arm/mach-omap2/clkt2xxx_virt_prcm_set.c
new file mode 100644
index 000000000000..e60ca4e47bbd
--- /dev/null
+++ b/arch/arm/mach-omap2/clkt2xxx_virt_prcm_set.c
@@ -0,0 +1,255 @@
1/*
2 * OMAP2xxx DVFS virtual clock functions
3 *
4 * Copyright (C) 2005-2008 Texas Instruments, Inc.
5 * Copyright (C) 2004-2010 Nokia Corporation
6 *
7 * Contacts:
8 * Richard Woodruff <r-woodruff2@ti.com>
9 * Paul Walmsley
10 *
11 * Based on earlier work by Tuukka Tikkanen, Tony Lindgren,
12 * Gordon McNutt and RidgeRun, Inc.
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 * XXX Some of this code should be replaceable by the upcoming OPP layer
19 * code. However, some notion of "rate set" is probably still necessary
20 * for OMAP2xxx at least. Rate sets should be generalized so they can be
21 * used for any OMAP chip, not just OMAP2xxx. In particular, Richard Woodruff
22 * has in the past expressed a preference to use rate sets for OPP changes,
23 * rather than dynamically recalculating the clock tree, so if someone wants
24 * this badly enough to write the code to handle it, we should support it
25 * as an option.
26 */
27#undef DEBUG
28
29#include <linux/kernel.h>
30#include <linux/errno.h>
31#include <linux/clk.h>
32#include <linux/io.h>
33#include <linux/cpufreq.h>
34#include <linux/slab.h>
35
36#include <plat/clock.h>
37#include <plat/sram.h>
38#include <plat/sdrc.h>
39
40#include "clock.h"
41#include "clock2xxx.h"
42#include "opp2xxx.h"
43#include "cm.h"
44#include "cm-regbits-24xx.h"
45
46const struct prcm_config *curr_prcm_set;
47const struct prcm_config *rate_table;
48
49/**
50 * omap2_table_mpu_recalc - just return the MPU speed
51 * @clk: virt_prcm_set struct clk
52 *
53 * Set virt_prcm_set's rate to the mpu_speed field of the current PRCM set.
54 */
55unsigned long omap2_table_mpu_recalc(struct clk *clk)
56{
57 return curr_prcm_set->mpu_speed;
58}
59
60/*
61 * Look for a rate equal or less than the target rate given a configuration set.
62 *
63 * What's not entirely clear is "which" field represents the key field.
64 * Some might argue L3-DDR, others ARM, others IVA. This code is simple and
65 * just uses the ARM rates.
66 */
67long omap2_round_to_table_rate(struct clk *clk, unsigned long rate)
68{
69 const struct prcm_config *ptr;
70 long highest_rate;
71 long sys_ck_rate;
72
73 sys_ck_rate = clk_get_rate(sclk);
74
75 highest_rate = -EINVAL;
76
77 for (ptr = rate_table; ptr->mpu_speed; ptr++) {
78 if (!(ptr->flags & cpu_mask))
79 continue;
80 if (ptr->xtal_speed != sys_ck_rate)
81 continue;
82
83 highest_rate = ptr->mpu_speed;
84
85 /* Can check only after xtal frequency check */
86 if (ptr->mpu_speed <= rate)
87 break;
88 }
89 return highest_rate;
90}
91
92/* Sets basic clocks based on the specified rate */
93int omap2_select_table_rate(struct clk *clk, unsigned long rate)
94{
95 u32 cur_rate, done_rate, bypass = 0, tmp;
96 const struct prcm_config *prcm;
97 unsigned long found_speed = 0;
98 unsigned long flags;
99 long sys_ck_rate;
100
101 sys_ck_rate = clk_get_rate(sclk);
102
103 for (prcm = rate_table; prcm->mpu_speed; prcm++) {
104 if (!(prcm->flags & cpu_mask))
105 continue;
106
107 if (prcm->xtal_speed != sys_ck_rate)
108 continue;
109
110 if (prcm->mpu_speed <= rate) {
111 found_speed = prcm->mpu_speed;
112 break;
113 }
114 }
115
116 if (!found_speed) {
117 printk(KERN_INFO "Could not set MPU rate to %luMHz\n",
118 rate / 1000000);
119 return -EINVAL;
120 }
121
122 curr_prcm_set = prcm;
123 cur_rate = omap2xxx_clk_get_core_rate(dclk);
124
125 if (prcm->dpll_speed == cur_rate / 2) {
126 omap2xxx_sdrc_reprogram(CORE_CLK_SRC_DPLL, 1);
127 } else if (prcm->dpll_speed == cur_rate * 2) {
128 omap2xxx_sdrc_reprogram(CORE_CLK_SRC_DPLL_X2, 1);
129 } else if (prcm->dpll_speed != cur_rate) {
130 local_irq_save(flags);
131
132 if (prcm->dpll_speed == prcm->xtal_speed)
133 bypass = 1;
134
135 if ((prcm->cm_clksel2_pll & OMAP24XX_CORE_CLK_SRC_MASK) ==
136 CORE_CLK_SRC_DPLL_X2)
137 done_rate = CORE_CLK_SRC_DPLL_X2;
138 else
139 done_rate = CORE_CLK_SRC_DPLL;
140
141 /* MPU divider */
142 cm_write_mod_reg(prcm->cm_clksel_mpu, MPU_MOD, CM_CLKSEL);
143
144 /* dsp + iva1 div(2420), iva2.1(2430) */
145 cm_write_mod_reg(prcm->cm_clksel_dsp,
146 OMAP24XX_DSP_MOD, CM_CLKSEL);
147
148 cm_write_mod_reg(prcm->cm_clksel_gfx, GFX_MOD, CM_CLKSEL);
149
150 /* Major subsystem dividers */
151 tmp = cm_read_mod_reg(CORE_MOD, CM_CLKSEL1) & OMAP24XX_CLKSEL_DSS2_MASK;
152 cm_write_mod_reg(prcm->cm_clksel1_core | tmp, CORE_MOD,
153 CM_CLKSEL1);
154
155 if (cpu_is_omap2430())
156 cm_write_mod_reg(prcm->cm_clksel_mdm,
157 OMAP2430_MDM_MOD, CM_CLKSEL);
158
159 /* x2 to enter omap2xxx_sdrc_init_params() */
160 omap2xxx_sdrc_reprogram(CORE_CLK_SRC_DPLL_X2, 1);
161
162 omap2_set_prcm(prcm->cm_clksel1_pll, prcm->base_sdrc_rfr,
163 bypass);
164
165 omap2xxx_sdrc_init_params(omap2xxx_sdrc_dll_is_unlocked());
166 omap2xxx_sdrc_reprogram(done_rate, 0);
167
168 local_irq_restore(flags);
169 }
170
171 return 0;
172}
173
174#ifdef CONFIG_CPU_FREQ
175/*
176 * Walk PRCM rate table and fillout cpufreq freq_table
177 * XXX This should be replaced by an OPP layer in the near future
178 */
179static struct cpufreq_frequency_table *freq_table;
180
181void omap2_clk_init_cpufreq_table(struct cpufreq_frequency_table **table)
182{
183 const struct prcm_config *prcm;
184 long sys_ck_rate;
185 int i = 0;
186 int tbl_sz = 0;
187
188 if (!cpu_is_omap24xx())
189 return;
190
191 sys_ck_rate = clk_get_rate(sclk);
192
193 for (prcm = rate_table; prcm->mpu_speed; prcm++) {
194 if (!(prcm->flags & cpu_mask))
195 continue;
196 if (prcm->xtal_speed != sys_ck_rate)
197 continue;
198
199 /* don't put bypass rates in table */
200 if (prcm->dpll_speed == prcm->xtal_speed)
201 continue;
202
203 tbl_sz++;
204 }
205
206 /*
207 * XXX Ensure that we're doing what CPUFreq expects for this error
208 * case and the following one
209 */
210 if (tbl_sz == 0) {
211 pr_warning("%s: no matching entries in rate_table\n",
212 __func__);
213 return;
214 }
215
216 /* Include the CPUFREQ_TABLE_END terminator entry */
217 tbl_sz++;
218
219 freq_table = kzalloc(sizeof(struct cpufreq_frequency_table) * tbl_sz,
220 GFP_ATOMIC);
221 if (!freq_table) {
222 pr_err("%s: could not kzalloc frequency table\n", __func__);
223 return;
224 }
225
226 for (prcm = rate_table; prcm->mpu_speed; prcm++) {
227 if (!(prcm->flags & cpu_mask))
228 continue;
229 if (prcm->xtal_speed != sys_ck_rate)
230 continue;
231
232 /* don't put bypass rates in table */
233 if (prcm->dpll_speed == prcm->xtal_speed)
234 continue;
235
236 freq_table[i].index = i;
237 freq_table[i].frequency = prcm->mpu_speed / 1000;
238 i++;
239 }
240
241 freq_table[i].index = i;
242 freq_table[i].frequency = CPUFREQ_TABLE_END;
243
244 *table = &freq_table[0];
245}
246
247void omap2_clk_exit_cpufreq_table(struct cpufreq_frequency_table **table)
248{
249 if (!cpu_is_omap24xx())
250 return;
251
252 kfree(freq_table);
253}
254
255#endif
diff --git a/arch/arm/mach-omap2/clkt34xx_dpll3m2.c b/arch/arm/mach-omap2/clkt34xx_dpll3m2.c
new file mode 100644
index 000000000000..b2b1e37bb6bb
--- /dev/null
+++ b/arch/arm/mach-omap2/clkt34xx_dpll3m2.c
@@ -0,0 +1,121 @@
1/*
2 * OMAP34xx M2 divider clock code
3 *
4 * Copyright (C) 2007-2008 Texas Instruments, Inc.
5 * Copyright (C) 2007-2010 Nokia Corporation
6 *
7 * Paul Walmsley
8 * Jouni Högander
9 *
10 * Parts of this code are based on code written by
11 * Richard Woodruff, Tony Lindgren, Tuukka Tikkanen, Karthik Dasu
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License version 2 as
15 * published by the Free Software Foundation.
16 */
17#undef DEBUG
18
19#include <linux/kernel.h>
20#include <linux/errno.h>
21#include <linux/clk.h>
22#include <linux/io.h>
23
24#include <plat/clock.h>
25#include <plat/sram.h>
26#include <plat/sdrc.h>
27
28#include "clock.h"
29#include "clock3xxx.h"
30#include "clock34xx.h"
31#include "sdrc.h"
32
33#define CYCLES_PER_MHZ 1000000
34
35/*
36 * CORE DPLL (DPLL3) M2 divider rate programming functions
37 *
38 * These call into SRAM code to do the actual CM writes, since the SDRAM
39 * is clocked from DPLL3.
40 */
41
42/**
43 * omap3_core_dpll_m2_set_rate - set CORE DPLL M2 divider
44 * @clk: struct clk * of DPLL to set
45 * @rate: rounded target rate
46 *
47 * Program the DPLL M2 divider with the rounded target rate. Returns
48 * -EINVAL upon error, or 0 upon success.
49 */
50int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
51{
52 u32 new_div = 0;
53 u32 unlock_dll = 0;
54 u32 c;
55 unsigned long validrate, sdrcrate, _mpurate;
56 struct omap_sdrc_params *sdrc_cs0;
57 struct omap_sdrc_params *sdrc_cs1;
58 int ret;
59
60 if (!clk || !rate)
61 return -EINVAL;
62
63 validrate = omap2_clksel_round_rate_div(clk, rate, &new_div);
64 if (validrate != rate)
65 return -EINVAL;
66
67 sdrcrate = sdrc_ick_p->rate;
68 if (rate > clk->rate)
69 sdrcrate <<= ((rate / clk->rate) >> 1);
70 else
71 sdrcrate >>= ((clk->rate / rate) >> 1);
72
73 ret = omap2_sdrc_get_params(sdrcrate, &sdrc_cs0, &sdrc_cs1);
74 if (ret)
75 return -EINVAL;
76
77 if (sdrcrate < MIN_SDRC_DLL_LOCK_FREQ) {
78 pr_debug("clock: will unlock SDRC DLL\n");
79 unlock_dll = 1;
80 }
81
82 /*
83 * XXX This only needs to be done when the CPU frequency changes
84 */
85 _mpurate = arm_fck_p->rate / CYCLES_PER_MHZ;
86 c = (_mpurate << SDRC_MPURATE_SCALE) >> SDRC_MPURATE_BASE_SHIFT;
87 c += 1; /* for safety */
88 c *= SDRC_MPURATE_LOOPS;
89 c >>= SDRC_MPURATE_SCALE;
90 if (c == 0)
91 c = 1;
92
93 pr_debug("clock: changing CORE DPLL rate from %lu to %lu\n", clk->rate,
94 validrate);
95 pr_debug("clock: SDRC CS0 timing params used:"
96 " RFR %08x CTRLA %08x CTRLB %08x MR %08x\n",
97 sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
98 sdrc_cs0->actim_ctrlb, sdrc_cs0->mr);
99 if (sdrc_cs1)
100 pr_debug("clock: SDRC CS1 timing params used: "
101 " RFR %08x CTRLA %08x CTRLB %08x MR %08x\n",
102 sdrc_cs1->rfr_ctrl, sdrc_cs1->actim_ctrla,
103 sdrc_cs1->actim_ctrlb, sdrc_cs1->mr);
104
105 if (sdrc_cs1)
106 omap3_configure_core_dpll(
107 new_div, unlock_dll, c, rate > clk->rate,
108 sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
109 sdrc_cs0->actim_ctrlb, sdrc_cs0->mr,
110 sdrc_cs1->rfr_ctrl, sdrc_cs1->actim_ctrla,
111 sdrc_cs1->actim_ctrlb, sdrc_cs1->mr);
112 else
113 omap3_configure_core_dpll(
114 new_div, unlock_dll, c, rate > clk->rate,
115 sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
116 sdrc_cs0->actim_ctrlb, sdrc_cs0->mr,
117 0, 0, 0, 0);
118
119 return 0;
120}
121
diff --git a/arch/arm/mach-omap2/clkt_clksel.c b/arch/arm/mach-omap2/clkt_clksel.c
new file mode 100644
index 000000000000..e50812dd03fd
--- /dev/null
+++ b/arch/arm/mach-omap2/clkt_clksel.c
@@ -0,0 +1,409 @@
1/*
2 * clkt_clksel.c - OMAP2/3/4 clksel clock functions
3 *
4 * Copyright (C) 2005-2008 Texas Instruments, Inc.
5 * Copyright (C) 2004-2010 Nokia Corporation
6 *
7 * Contacts:
8 * Richard Woodruff <r-woodruff2@ti.com>
9 * Paul Walmsley
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
14 *
15 * XXX At some point these clksel clocks should be split into
16 * "divider" clocks and "mux" clocks to better match the hardware.
17 *
18 * XXX Currently these clocks are only used in the OMAP2/3/4 code, but
19 * many of the OMAP1 clocks should be convertible to use this
20 * mechanism.
21 */
22#undef DEBUG
23
24#include <linux/kernel.h>
25#include <linux/errno.h>
26#include <linux/clk.h>
27#include <linux/io.h>
28
29#include <plat/clock.h>
30
31#include "clock.h"
32#include "cm.h"
33#include "cm-regbits-24xx.h"
34#include "cm-regbits-34xx.h"
35
36/* Private functions */
37
38/**
39 * _omap2_get_clksel_by_parent - return clksel struct for a given clk & parent
40 * @clk: OMAP struct clk ptr to inspect
41 * @src_clk: OMAP struct clk ptr of the parent clk to search for
42 *
43 * Scan the struct clksel array associated with the clock to find
44 * the element associated with the supplied parent clock address.
45 * Returns a pointer to the struct clksel on success or NULL on error.
46 */
47static const struct clksel *_omap2_get_clksel_by_parent(struct clk *clk,
48 struct clk *src_clk)
49{
50 const struct clksel *clks;
51
52 if (!clk->clksel)
53 return NULL;
54
55 for (clks = clk->clksel; clks->parent; clks++) {
56 if (clks->parent == src_clk)
57 break; /* Found the requested parent */
58 }
59
60 if (!clks->parent) {
61 printk(KERN_ERR "clock: Could not find parent clock %s in "
62 "clksel array of clock %s\n", src_clk->name,
63 clk->name);
64 return NULL;
65 }
66
67 return clks;
68}
69
70/*
71 * Converts encoded control register address into a full address
72 * On error, the return value (parent_div) will be 0.
73 */
74static u32 _omap2_clksel_get_src_field(struct clk *src_clk, struct clk *clk,
75 u32 *field_val)
76{
77 const struct clksel *clks;
78 const struct clksel_rate *clkr;
79
80 clks = _omap2_get_clksel_by_parent(clk, src_clk);
81 if (!clks)
82 return 0;
83
84 for (clkr = clks->rates; clkr->div; clkr++) {
85 if (clkr->flags & cpu_mask && clkr->flags & DEFAULT_RATE)
86 break; /* Found the default rate for this platform */
87 }
88
89 if (!clkr->div) {
90 printk(KERN_ERR "clock: Could not find default rate for "
91 "clock %s parent %s\n", clk->name,
92 src_clk->parent->name);
93 return 0;
94 }
95
96 /* Should never happen. Add a clksel mask to the struct clk. */
97 WARN_ON(clk->clksel_mask == 0);
98
99 *field_val = clkr->val;
100
101 return clkr->div;
102}
103
104
105/* Public functions */
106
107/**
108 * omap2_init_clksel_parent - set a clksel clk's parent field from the hardware
109 * @clk: OMAP clock struct ptr to use
110 *
111 * Given a pointer to a source-selectable struct clk, read the hardware
112 * register and determine what its parent is currently set to. Update the
113 * clk->parent field with the appropriate clk ptr.
114 */
115void omap2_init_clksel_parent(struct clk *clk)
116{
117 const struct clksel *clks;
118 const struct clksel_rate *clkr;
119 u32 r, found = 0;
120
121 if (!clk->clksel)
122 return;
123
124 r = __raw_readl(clk->clksel_reg) & clk->clksel_mask;
125 r >>= __ffs(clk->clksel_mask);
126
127 for (clks = clk->clksel; clks->parent && !found; clks++) {
128 for (clkr = clks->rates; clkr->div && !found; clkr++) {
129 if ((clkr->flags & cpu_mask) && (clkr->val == r)) {
130 if (clk->parent != clks->parent) {
131 pr_debug("clock: inited %s parent "
132 "to %s (was %s)\n",
133 clk->name, clks->parent->name,
134 ((clk->parent) ?
135 clk->parent->name : "NULL"));
136 clk_reparent(clk, clks->parent);
137 };
138 found = 1;
139 }
140 }
141 }
142
143 if (!found)
144 printk(KERN_ERR "clock: init parent: could not find "
145 "regval %0x for clock %s\n", r, clk->name);
146
147 return;
148}
149
150/*
151 * Used for clocks that are part of CLKSEL_xyz governed clocks.
152 * REVISIT: Maybe change to use clk->enable() functions like on omap1?
153 */
154unsigned long omap2_clksel_recalc(struct clk *clk)
155{
156 unsigned long rate;
157 u32 div = 0;
158
159 pr_debug("clock: recalc'ing clksel clk %s\n", clk->name);
160
161 div = omap2_clksel_get_divisor(clk);
162 if (div == 0)
163 return clk->rate;
164
165 rate = clk->parent->rate / div;
166
167 pr_debug("clock: new clock rate is %ld (div %d)\n", rate, div);
168
169 return rate;
170}
171
172/**
173 * omap2_clksel_round_rate_div - find divisor for the given clock and rate
174 * @clk: OMAP struct clk to use
175 * @target_rate: desired clock rate
176 * @new_div: ptr to where we should store the divisor
177 *
178 * Finds 'best' divider value in an array based on the source and target
179 * rates. The divider array must be sorted with smallest divider first.
180 * Note that this will not work for clocks which are part of CONFIG_PARTICIPANT,
181 * they are only settable as part of virtual_prcm set.
182 *
183 * Returns the rounded clock rate or returns 0xffffffff on error.
184 */
185u32 omap2_clksel_round_rate_div(struct clk *clk, unsigned long target_rate,
186 u32 *new_div)
187{
188 unsigned long test_rate;
189 const struct clksel *clks;
190 const struct clksel_rate *clkr;
191 u32 last_div = 0;
192
193 pr_debug("clock: clksel_round_rate_div: %s target_rate %ld\n",
194 clk->name, target_rate);
195
196 *new_div = 1;
197
198 clks = _omap2_get_clksel_by_parent(clk, clk->parent);
199 if (!clks)
200 return ~0;
201
202 for (clkr = clks->rates; clkr->div; clkr++) {
203 if (!(clkr->flags & cpu_mask))
204 continue;
205
206 /* Sanity check */
207 if (clkr->div <= last_div)
208 pr_err("clock: clksel_rate table not sorted "
209 "for clock %s", clk->name);
210
211 last_div = clkr->div;
212
213 test_rate = clk->parent->rate / clkr->div;
214
215 if (test_rate <= target_rate)
216 break; /* found it */
217 }
218
219 if (!clkr->div) {
220 pr_err("clock: Could not find divisor for target "
221 "rate %ld for clock %s parent %s\n", target_rate,
222 clk->name, clk->parent->name);
223 return ~0;
224 }
225
226 *new_div = clkr->div;
227
228 pr_debug("clock: new_div = %d, new_rate = %ld\n", *new_div,
229 (clk->parent->rate / clkr->div));
230
231 return clk->parent->rate / clkr->div;
232}
233
234/**
235 * omap2_clksel_round_rate - find rounded rate for the given clock and rate
236 * @clk: OMAP struct clk to use
237 * @target_rate: desired clock rate
238 *
239 * Compatibility wrapper for OMAP clock framework
240 * Finds best target rate based on the source clock and possible dividers.
241 * rates. The divider array must be sorted with smallest divider first.
242 * Note that this will not work for clocks which are part of CONFIG_PARTICIPANT,
243 * they are only settable as part of virtual_prcm set.
244 *
245 * Returns the rounded clock rate or returns 0xffffffff on error.
246 */
247long omap2_clksel_round_rate(struct clk *clk, unsigned long target_rate)
248{
249 u32 new_div;
250
251 return omap2_clksel_round_rate_div(clk, target_rate, &new_div);
252}
253
254
255/* Given a clock and a rate apply a clock specific rounding function */
256long omap2_clk_round_rate(struct clk *clk, unsigned long rate)
257{
258 if (clk->round_rate)
259 return clk->round_rate(clk, rate);
260
261 return clk->rate;
262}
263
264/**
265 * omap2_clksel_to_divisor() - turn clksel field value into integer divider
266 * @clk: OMAP struct clk to use
267 * @field_val: register field value to find
268 *
269 * Given a struct clk of a rate-selectable clksel clock, and a register field
270 * value to search for, find the corresponding clock divisor. The register
271 * field value should be pre-masked and shifted down so the LSB is at bit 0
272 * before calling. Returns 0 on error
273 */
274u32 omap2_clksel_to_divisor(struct clk *clk, u32 field_val)
275{
276 const struct clksel *clks;
277 const struct clksel_rate *clkr;
278
279 clks = _omap2_get_clksel_by_parent(clk, clk->parent);
280 if (!clks)
281 return 0;
282
283 for (clkr = clks->rates; clkr->div; clkr++) {
284 if ((clkr->flags & cpu_mask) && (clkr->val == field_val))
285 break;
286 }
287
288 if (!clkr->div) {
289 printk(KERN_ERR "clock: Could not find fieldval %d for "
290 "clock %s parent %s\n", field_val, clk->name,
291 clk->parent->name);
292 return 0;
293 }
294
295 return clkr->div;
296}
297
298/**
299 * omap2_divisor_to_clksel() - turn clksel integer divisor into a field value
300 * @clk: OMAP struct clk to use
301 * @div: integer divisor to search for
302 *
303 * Given a struct clk of a rate-selectable clksel clock, and a clock divisor,
304 * find the corresponding register field value. The return register value is
305 * the value before left-shifting. Returns ~0 on error
306 */
307u32 omap2_divisor_to_clksel(struct clk *clk, u32 div)
308{
309 const struct clksel *clks;
310 const struct clksel_rate *clkr;
311
312 /* should never happen */
313 WARN_ON(div == 0);
314
315 clks = _omap2_get_clksel_by_parent(clk, clk->parent);
316 if (!clks)
317 return ~0;
318
319 for (clkr = clks->rates; clkr->div; clkr++) {
320 if ((clkr->flags & cpu_mask) && (clkr->div == div))
321 break;
322 }
323
324 if (!clkr->div) {
325 printk(KERN_ERR "clock: Could not find divisor %d for "
326 "clock %s parent %s\n", div, clk->name,
327 clk->parent->name);
328 return ~0;
329 }
330
331 return clkr->val;
332}
333
334/**
335 * omap2_clksel_get_divisor - get current divider applied to parent clock.
336 * @clk: OMAP struct clk to use.
337 *
338 * Returns the integer divisor upon success or 0 on error.
339 */
340u32 omap2_clksel_get_divisor(struct clk *clk)
341{
342 u32 v;
343
344 if (!clk->clksel_mask)
345 return 0;
346
347 v = __raw_readl(clk->clksel_reg) & clk->clksel_mask;
348 v >>= __ffs(clk->clksel_mask);
349
350 return omap2_clksel_to_divisor(clk, v);
351}
352
353int omap2_clksel_set_rate(struct clk *clk, unsigned long rate)
354{
355 u32 v, field_val, validrate, new_div = 0;
356
357 if (!clk->clksel_mask)
358 return -EINVAL;
359
360 validrate = omap2_clksel_round_rate_div(clk, rate, &new_div);
361 if (validrate != rate)
362 return -EINVAL;
363
364 field_val = omap2_divisor_to_clksel(clk, new_div);
365 if (field_val == ~0)
366 return -EINVAL;
367
368 v = __raw_readl(clk->clksel_reg);
369 v &= ~clk->clksel_mask;
370 v |= field_val << __ffs(clk->clksel_mask);
371 __raw_writel(v, clk->clksel_reg);
372 v = __raw_readl(clk->clksel_reg); /* OCP barrier */
373
374 clk->rate = clk->parent->rate / new_div;
375
376 return 0;
377}
378
379int omap2_clksel_set_parent(struct clk *clk, struct clk *new_parent)
380{
381 u32 field_val, v, parent_div;
382
383 if (!clk->clksel)
384 return -EINVAL;
385
386 parent_div = _omap2_clksel_get_src_field(new_parent, clk, &field_val);
387 if (!parent_div)
388 return -EINVAL;
389
390 /* Set new source value (previous dividers if any in effect) */
391 v = __raw_readl(clk->clksel_reg);
392 v &= ~clk->clksel_mask;
393 v |= field_val << __ffs(clk->clksel_mask);
394 __raw_writel(v, clk->clksel_reg);
395 v = __raw_readl(clk->clksel_reg); /* OCP barrier */
396
397 clk_reparent(clk, new_parent);
398
399 /* CLKSEL clocks follow their parents' rates, divided by a divisor */
400 clk->rate = new_parent->rate;
401
402 if (parent_div > 0)
403 clk->rate /= parent_div;
404
405 pr_debug("clock: set parent of %s to %s (new rate %ld)\n",
406 clk->name, clk->parent->name, clk->rate);
407
408 return 0;
409}
diff --git a/arch/arm/mach-omap2/clkt_dpll.c b/arch/arm/mach-omap2/clkt_dpll.c
new file mode 100644
index 000000000000..6ce512e902c6
--- /dev/null
+++ b/arch/arm/mach-omap2/clkt_dpll.c
@@ -0,0 +1,386 @@
1/*
2 * OMAP2/3/4 DPLL clock functions
3 *
4 * Copyright (C) 2005-2008 Texas Instruments, Inc.
5 * Copyright (C) 2004-2010 Nokia Corporation
6 *
7 * Contacts:
8 * Richard Woodruff <r-woodruff2@ti.com>
9 * Paul Walmsley
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
14 */
15#undef DEBUG
16
17#include <linux/kernel.h>
18#include <linux/errno.h>
19#include <linux/clk.h>
20#include <linux/io.h>
21
22#include <asm/div64.h>
23
24#include <plat/clock.h>
25
26#include "clock.h"
27#include "cm.h"
28#include "cm-regbits-24xx.h"
29#include "cm-regbits-34xx.h"
30
31/* DPLL rate rounding: minimum DPLL multiplier, divider values */
32#define DPLL_MIN_MULTIPLIER 2
33#define DPLL_MIN_DIVIDER 1
34
35/* Possible error results from _dpll_test_mult */
36#define DPLL_MULT_UNDERFLOW -1
37
38/*
39 * Scale factor to mitigate roundoff errors in DPLL rate rounding.
40 * The higher the scale factor, the greater the risk of arithmetic overflow,
41 * but the closer the rounded rate to the target rate. DPLL_SCALE_FACTOR
42 * must be a power of DPLL_SCALE_BASE.
43 */
44#define DPLL_SCALE_FACTOR 64
45#define DPLL_SCALE_BASE 2
46#define DPLL_ROUNDING_VAL ((DPLL_SCALE_BASE / 2) * \
47 (DPLL_SCALE_FACTOR / DPLL_SCALE_BASE))
48
49/* DPLL valid Fint frequency band limits - from 34xx TRM Section 4.7.6.2 */
50#define DPLL_FINT_BAND1_MIN 750000
51#define DPLL_FINT_BAND1_MAX 2100000
52#define DPLL_FINT_BAND2_MIN 7500000
53#define DPLL_FINT_BAND2_MAX 21000000
54
55/* _dpll_test_fint() return codes */
56#define DPLL_FINT_UNDERFLOW -1
57#define DPLL_FINT_INVALID -2
58
59/* Private functions */
60
61/*
62 * _dpll_test_fint - test whether an Fint value is valid for the DPLL
63 * @clk: DPLL struct clk to test
64 * @n: divider value (N) to test
65 *
66 * Tests whether a particular divider @n will result in a valid DPLL
67 * internal clock frequency Fint. See the 34xx TRM 4.7.6.2 "DPLL Jitter
68 * Correction". Returns 0 if OK, -1 if the enclosing loop can terminate
69 * (assuming that it is counting N upwards), or -2 if the enclosing loop
70 * should skip to the next iteration (again assuming N is increasing).
71 */
72static int _dpll_test_fint(struct clk *clk, u8 n)
73{
74 struct dpll_data *dd;
75 long fint;
76 int ret = 0;
77
78 dd = clk->dpll_data;
79
80 /* DPLL divider must result in a valid jitter correction val */
81 fint = clk->parent->rate / (n + 1);
82 if (fint < DPLL_FINT_BAND1_MIN) {
83
84 pr_debug("rejecting n=%d due to Fint failure, "
85 "lowering max_divider\n", n);
86 dd->max_divider = n;
87 ret = DPLL_FINT_UNDERFLOW;
88
89 } else if (fint > DPLL_FINT_BAND1_MAX &&
90 fint < DPLL_FINT_BAND2_MIN) {
91
92 pr_debug("rejecting n=%d due to Fint failure\n", n);
93 ret = DPLL_FINT_INVALID;
94
95 } else if (fint > DPLL_FINT_BAND2_MAX) {
96
97 pr_debug("rejecting n=%d due to Fint failure, "
98 "boosting min_divider\n", n);
99 dd->min_divider = n;
100 ret = DPLL_FINT_INVALID;
101
102 }
103
104 return ret;
105}
106
107static unsigned long _dpll_compute_new_rate(unsigned long parent_rate,
108 unsigned int m, unsigned int n)
109{
110 unsigned long long num;
111
112 num = (unsigned long long)parent_rate * m;
113 do_div(num, n);
114 return num;
115}
116
117/*
118 * _dpll_test_mult - test a DPLL multiplier value
119 * @m: pointer to the DPLL m (multiplier) value under test
120 * @n: current DPLL n (divider) value under test
121 * @new_rate: pointer to storage for the resulting rounded rate
122 * @target_rate: the desired DPLL rate
123 * @parent_rate: the DPLL's parent clock rate
124 *
125 * This code tests a DPLL multiplier value, ensuring that the
126 * resulting rate will not be higher than the target_rate, and that
127 * the multiplier value itself is valid for the DPLL. Initially, the
128 * integer pointed to by the m argument should be prescaled by
129 * multiplying by DPLL_SCALE_FACTOR. The code will replace this with
130 * a non-scaled m upon return. This non-scaled m will result in a
131 * new_rate as close as possible to target_rate (but not greater than
132 * target_rate) given the current (parent_rate, n, prescaled m)
133 * triple. Returns DPLL_MULT_UNDERFLOW in the event that the
134 * non-scaled m attempted to underflow, which can allow the calling
135 * function to bail out early; or 0 upon success.
136 */
137static int _dpll_test_mult(int *m, int n, unsigned long *new_rate,
138 unsigned long target_rate,
139 unsigned long parent_rate)
140{
141 int r = 0, carry = 0;
142
143 /* Unscale m and round if necessary */
144 if (*m % DPLL_SCALE_FACTOR >= DPLL_ROUNDING_VAL)
145 carry = 1;
146 *m = (*m / DPLL_SCALE_FACTOR) + carry;
147
148 /*
149 * The new rate must be <= the target rate to avoid programming
150 * a rate that is impossible for the hardware to handle
151 */
152 *new_rate = _dpll_compute_new_rate(parent_rate, *m, n);
153 if (*new_rate > target_rate) {
154 (*m)--;
155 *new_rate = 0;
156 }
157
158 /* Guard against m underflow */
159 if (*m < DPLL_MIN_MULTIPLIER) {
160 *m = DPLL_MIN_MULTIPLIER;
161 *new_rate = 0;
162 r = DPLL_MULT_UNDERFLOW;
163 }
164
165 if (*new_rate == 0)
166 *new_rate = _dpll_compute_new_rate(parent_rate, *m, n);
167
168 return r;
169}
170
171/* Public functions */
172
173void omap2_init_dpll_parent(struct clk *clk)
174{
175 u32 v;
176 struct dpll_data *dd;
177
178 dd = clk->dpll_data;
179 if (!dd)
180 return;
181
182 /* Return bypass rate if DPLL is bypassed */
183 v = __raw_readl(dd->control_reg);
184 v &= dd->enable_mask;
185 v >>= __ffs(dd->enable_mask);
186
187 /* Reparent in case the dpll is in bypass */
188 if (cpu_is_omap24xx()) {
189 if (v == OMAP2XXX_EN_DPLL_LPBYPASS ||
190 v == OMAP2XXX_EN_DPLL_FRBYPASS)
191 clk_reparent(clk, dd->clk_bypass);
192 } else if (cpu_is_omap34xx()) {
193 if (v == OMAP3XXX_EN_DPLL_LPBYPASS ||
194 v == OMAP3XXX_EN_DPLL_FRBYPASS)
195 clk_reparent(clk, dd->clk_bypass);
196 } else if (cpu_is_omap44xx()) {
197 if (v == OMAP4XXX_EN_DPLL_LPBYPASS ||
198 v == OMAP4XXX_EN_DPLL_FRBYPASS ||
199 v == OMAP4XXX_EN_DPLL_MNBYPASS)
200 clk_reparent(clk, dd->clk_bypass);
201 }
202 return;
203}
204
205/**
206 * omap2_get_dpll_rate - returns the current DPLL CLKOUT rate
207 * @clk: struct clk * of a DPLL
208 *
209 * DPLLs can be locked or bypassed - basically, enabled or disabled.
210 * When locked, the DPLL output depends on the M and N values. When
211 * bypassed, on OMAP2xxx, the output rate is either the 32KiHz clock
212 * or sys_clk. Bypass rates on OMAP3 depend on the DPLL: DPLLs 1 and
213 * 2 are bypassed with dpll1_fclk and dpll2_fclk respectively
214 * (generated by DPLL3), while DPLL 3, 4, and 5 bypass rates are sys_clk.
215 * Returns the current DPLL CLKOUT rate (*not* CLKOUTX2) if the DPLL is
216 * locked, or the appropriate bypass rate if the DPLL is bypassed, or 0
217 * if the clock @clk is not a DPLL.
218 */
219u32 omap2_get_dpll_rate(struct clk *clk)
220{
221 long long dpll_clk;
222 u32 dpll_mult, dpll_div, v;
223 struct dpll_data *dd;
224
225 dd = clk->dpll_data;
226 if (!dd)
227 return 0;
228
229 /* Return bypass rate if DPLL is bypassed */
230 v = __raw_readl(dd->control_reg);
231 v &= dd->enable_mask;
232 v >>= __ffs(dd->enable_mask);
233
234 if (cpu_is_omap24xx()) {
235 if (v == OMAP2XXX_EN_DPLL_LPBYPASS ||
236 v == OMAP2XXX_EN_DPLL_FRBYPASS)
237 return dd->clk_bypass->rate;
238 } else if (cpu_is_omap34xx()) {
239 if (v == OMAP3XXX_EN_DPLL_LPBYPASS ||
240 v == OMAP3XXX_EN_DPLL_FRBYPASS)
241 return dd->clk_bypass->rate;
242 } else if (cpu_is_omap44xx()) {
243 if (v == OMAP4XXX_EN_DPLL_LPBYPASS ||
244 v == OMAP4XXX_EN_DPLL_FRBYPASS ||
245 v == OMAP4XXX_EN_DPLL_MNBYPASS)
246 return dd->clk_bypass->rate;
247 }
248
249 v = __raw_readl(dd->mult_div1_reg);
250 dpll_mult = v & dd->mult_mask;
251 dpll_mult >>= __ffs(dd->mult_mask);
252 dpll_div = v & dd->div1_mask;
253 dpll_div >>= __ffs(dd->div1_mask);
254
255 dpll_clk = (long long)dd->clk_ref->rate * dpll_mult;
256 do_div(dpll_clk, dpll_div + 1);
257
258 return dpll_clk;
259}
260
261/* DPLL rate rounding code */
262
263/**
264 * omap2_dpll_set_rate_tolerance: set the error tolerance during rate rounding
265 * @clk: struct clk * of the DPLL
266 * @tolerance: maximum rate error tolerance
267 *
268 * Set the maximum DPLL rate error tolerance for the rate rounding
269 * algorithm. The rate tolerance is an attempt to balance DPLL power
270 * saving (the least divider value "n") vs. rate fidelity (the least
271 * difference between the desired DPLL target rate and the rounded
272 * rate out of the algorithm). So, increasing the tolerance is likely
273 * to decrease DPLL power consumption and increase DPLL rate error.
274 * Returns -EINVAL if provided a null clock ptr or a clk that is not a
275 * DPLL; or 0 upon success.
276 */
277int omap2_dpll_set_rate_tolerance(struct clk *clk, unsigned int tolerance)
278{
279 if (!clk || !clk->dpll_data)
280 return -EINVAL;
281
282 clk->dpll_data->rate_tolerance = tolerance;
283
284 return 0;
285}
286
287/**
288 * omap2_dpll_round_rate - round a target rate for an OMAP DPLL
289 * @clk: struct clk * for a DPLL
290 * @target_rate: desired DPLL clock rate
291 *
292 * Given a DPLL, a desired target rate, and a rate tolerance, round
293 * the target rate to a possible, programmable rate for this DPLL.
294 * Rate tolerance is assumed to be set by the caller before this
295 * function is called. Attempts to select the minimum possible n
296 * within the tolerance to reduce power consumption. Stores the
297 * computed (m, n) in the DPLL's dpll_data structure so set_rate()
298 * will not need to call this (expensive) function again. Returns ~0
299 * if the target rate cannot be rounded, either because the rate is
300 * too low or because the rate tolerance is set too tightly; or the
301 * rounded rate upon success.
302 */
303long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate)
304{
305 int m, n, r, e, scaled_max_m;
306 unsigned long scaled_rt_rp, new_rate;
307 int min_e = -1, min_e_m = -1, min_e_n = -1;
308 struct dpll_data *dd;
309
310 if (!clk || !clk->dpll_data)
311 return ~0;
312
313 dd = clk->dpll_data;
314
315 pr_debug("clock: starting DPLL round_rate for clock %s, target rate "
316 "%ld\n", clk->name, target_rate);
317
318 scaled_rt_rp = target_rate / (dd->clk_ref->rate / DPLL_SCALE_FACTOR);
319 scaled_max_m = dd->max_multiplier * DPLL_SCALE_FACTOR;
320
321 dd->last_rounded_rate = 0;
322
323 for (n = dd->min_divider; n <= dd->max_divider; n++) {
324
325 /* Is the (input clk, divider) pair valid for the DPLL? */
326 r = _dpll_test_fint(clk, n);
327 if (r == DPLL_FINT_UNDERFLOW)
328 break;
329 else if (r == DPLL_FINT_INVALID)
330 continue;
331
332 /* Compute the scaled DPLL multiplier, based on the divider */
333 m = scaled_rt_rp * n;
334
335 /*
336 * Since we're counting n up, a m overflow means we
337 * can bail out completely (since as n increases in
338 * the next iteration, there's no way that m can
339 * increase beyond the current m)
340 */
341 if (m > scaled_max_m)
342 break;
343
344 r = _dpll_test_mult(&m, n, &new_rate, target_rate,
345 dd->clk_ref->rate);
346
347 /* m can't be set low enough for this n - try with a larger n */
348 if (r == DPLL_MULT_UNDERFLOW)
349 continue;
350
351 e = target_rate - new_rate;
352 pr_debug("clock: n = %d: m = %d: rate error is %d "
353 "(new_rate = %ld)\n", n, m, e, new_rate);
354
355 if (min_e == -1 ||
356 min_e >= (int)(abs(e) - dd->rate_tolerance)) {
357 min_e = e;
358 min_e_m = m;
359 min_e_n = n;
360
361 pr_debug("clock: found new least error %d\n", min_e);
362
363 /* We found good settings -- bail out now */
364 if (min_e <= dd->rate_tolerance)
365 break;
366 }
367 }
368
369 if (min_e < 0) {
370 pr_debug("clock: error: target rate or tolerance too low\n");
371 return ~0;
372 }
373
374 dd->last_rounded_m = min_e_m;
375 dd->last_rounded_n = min_e_n;
376 dd->last_rounded_rate = _dpll_compute_new_rate(dd->clk_ref->rate,
377 min_e_m, min_e_n);
378
379 pr_debug("clock: final least error: e = %d, m = %d, n = %d\n",
380 min_e, min_e_m, min_e_n);
381 pr_debug("clock: final rate: %ld (target rate: %ld)\n",
382 dd->last_rounded_rate, target_rate);
383
384 return dd->last_rounded_rate;
385}
386
diff --git a/arch/arm/mach-omap2/clock.c b/arch/arm/mach-omap2/clock.c
index f2a92d614f0f..a6d0b34b7990 100644
--- a/arch/arm/mach-omap2/clock.c
+++ b/arch/arm/mach-omap2/clock.c
@@ -2,7 +2,7 @@
2 * linux/arch/arm/mach-omap2/clock.c 2 * linux/arch/arm/mach-omap2/clock.c
3 * 3 *
4 * Copyright (C) 2005-2008 Texas Instruments, Inc. 4 * Copyright (C) 2005-2008 Texas Instruments, Inc.
5 * Copyright (C) 2004-2008 Nokia Corporation 5 * Copyright (C) 2004-2010 Nokia Corporation
6 * 6 *
7 * Contacts: 7 * Contacts:
8 * Richard Woodruff <r-woodruff2@ti.com> 8 * Richard Woodruff <r-woodruff2@ti.com>
@@ -14,24 +14,20 @@
14 */ 14 */
15#undef DEBUG 15#undef DEBUG
16 16
17#include <linux/module.h>
18#include <linux/kernel.h> 17#include <linux/kernel.h>
19#include <linux/device.h>
20#include <linux/list.h> 18#include <linux/list.h>
21#include <linux/errno.h> 19#include <linux/errno.h>
20#include <linux/err.h>
22#include <linux/delay.h> 21#include <linux/delay.h>
23#include <linux/clk.h> 22#include <linux/clk.h>
24#include <linux/io.h> 23#include <linux/io.h>
25#include <linux/bitops.h> 24#include <linux/bitops.h>
26 25
27#include <mach/clock.h> 26#include <plat/clock.h>
28#include <mach/clockdomain.h> 27#include <plat/clockdomain.h>
29#include <mach/cpu.h> 28#include <plat/cpu.h>
30#include <mach/prcm.h> 29#include <plat/prcm.h>
31#include <asm/div64.h>
32 30
33#include <mach/sdrc.h>
34#include "sdrc.h"
35#include "clock.h" 31#include "clock.h"
36#include "prm.h" 32#include "prm.h"
37#include "prm-regbits-24xx.h" 33#include "prm-regbits-24xx.h"
@@ -39,108 +35,44 @@
39#include "cm-regbits-24xx.h" 35#include "cm-regbits-24xx.h"
40#include "cm-regbits-34xx.h" 36#include "cm-regbits-34xx.h"
41 37
42/* DPLL rate rounding: minimum DPLL multiplier, divider values */ 38u8 cpu_mask;
43#define DPLL_MIN_MULTIPLIER 1
44#define DPLL_MIN_DIVIDER 1
45
46/* Possible error results from _dpll_test_mult */
47#define DPLL_MULT_UNDERFLOW -1
48 39
49/* 40/*
50 * Scale factor to mitigate roundoff errors in DPLL rate rounding. 41 * OMAP2+ specific clock functions
51 * The higher the scale factor, the greater the risk of arithmetic overflow,
52 * but the closer the rounded rate to the target rate. DPLL_SCALE_FACTOR
53 * must be a power of DPLL_SCALE_BASE.
54 */ 42 */
55#define DPLL_SCALE_FACTOR 64
56#define DPLL_SCALE_BASE 2
57#define DPLL_ROUNDING_VAL ((DPLL_SCALE_BASE / 2) * \
58 (DPLL_SCALE_FACTOR / DPLL_SCALE_BASE))
59
60/* DPLL valid Fint frequency band limits - from 34xx TRM Section 4.7.6.2 */
61#define DPLL_FINT_BAND1_MIN 750000
62#define DPLL_FINT_BAND1_MAX 2100000
63#define DPLL_FINT_BAND2_MIN 7500000
64#define DPLL_FINT_BAND2_MAX 21000000
65
66/* _dpll_test_fint() return codes */
67#define DPLL_FINT_UNDERFLOW -1
68#define DPLL_FINT_INVALID -2
69
70u8 cpu_mask;
71 43
72/*------------------------------------------------------------------------- 44/* Private functions */
73 * OMAP2/3 specific clock functions
74 *-------------------------------------------------------------------------*/
75 45
76/** 46/**
77 * _omap2xxx_clk_commit - commit clock parent/rate changes in hardware 47 * _omap2_module_wait_ready - wait for an OMAP module to leave IDLE
78 * @clk: struct clk * 48 * @clk: struct clk * belonging to the module
79 *
80 * If @clk has the DELAYED_APP flag set, meaning that parent/rate changes
81 * don't take effect until the VALID_CONFIG bit is written, write the
82 * VALID_CONFIG bit and wait for the write to complete. No return value.
83 */
84static void _omap2xxx_clk_commit(struct clk *clk)
85{
86 if (!cpu_is_omap24xx())
87 return;
88
89 if (!(clk->flags & DELAYED_APP))
90 return;
91
92 prm_write_mod_reg(OMAP24XX_VALID_CONFIG, OMAP24XX_GR_MOD,
93 OMAP2_PRCM_CLKCFG_CTRL_OFFSET);
94 /* OCP barrier */
95 prm_read_mod_reg(OMAP24XX_GR_MOD, OMAP2_PRCM_CLKCFG_CTRL_OFFSET);
96}
97
98/*
99 * _dpll_test_fint - test whether an Fint value is valid for the DPLL
100 * @clk: DPLL struct clk to test
101 * @n: divider value (N) to test
102 * 49 *
103 * Tests whether a particular divider @n will result in a valid DPLL 50 * If the necessary clocks for the OMAP hardware IP block that
104 * internal clock frequency Fint. See the 34xx TRM 4.7.6.2 "DPLL Jitter 51 * corresponds to clock @clk are enabled, then wait for the module to
105 * Correction". Returns 0 if OK, -1 if the enclosing loop can terminate 52 * indicate readiness (i.e., to leave IDLE). This code does not
106 * (assuming that it is counting N upwards), or -2 if the enclosing loop 53 * belong in the clock code and will be moved in the medium term to
107 * should skip to the next iteration (again assuming N is increasing). 54 * module-dependent code. No return value.
108 */ 55 */
109static int _dpll_test_fint(struct clk *clk, u8 n) 56static void _omap2_module_wait_ready(struct clk *clk)
110{ 57{
111 struct dpll_data *dd; 58 void __iomem *companion_reg, *idlest_reg;
112 long fint; 59 u8 other_bit, idlest_bit, idlest_val;
113 int ret = 0;
114
115 dd = clk->dpll_data;
116
117 /* DPLL divider must result in a valid jitter correction val */
118 fint = clk->parent->rate / (n + 1);
119 if (fint < DPLL_FINT_BAND1_MIN) {
120
121 pr_debug("rejecting n=%d due to Fint failure, "
122 "lowering max_divider\n", n);
123 dd->max_divider = n;
124 ret = DPLL_FINT_UNDERFLOW;
125
126 } else if (fint > DPLL_FINT_BAND1_MAX &&
127 fint < DPLL_FINT_BAND2_MIN) {
128
129 pr_debug("rejecting n=%d due to Fint failure\n", n);
130 ret = DPLL_FINT_INVALID;
131
132 } else if (fint > DPLL_FINT_BAND2_MAX) {
133
134 pr_debug("rejecting n=%d due to Fint failure, "
135 "boosting min_divider\n", n);
136 dd->min_divider = n;
137 ret = DPLL_FINT_INVALID;
138 60
61 /* Not all modules have multiple clocks that their IDLEST depends on */
62 if (clk->ops->find_companion) {
63 clk->ops->find_companion(clk, &companion_reg, &other_bit);
64 if (!(__raw_readl(companion_reg) & (1 << other_bit)))
65 return;
139 } 66 }
140 67
141 return ret; 68 clk->ops->find_idlest(clk, &idlest_reg, &idlest_bit, &idlest_val);
69
70 omap2_cm_wait_idlest(idlest_reg, (1 << idlest_bit), idlest_val,
71 clk->name);
142} 72}
143 73
74/* Public functions */
75
144/** 76/**
145 * omap2_init_clk_clkdm - look up a clockdomain name, store pointer in clk 77 * omap2_init_clk_clkdm - look up a clockdomain name, store pointer in clk
146 * @clk: OMAP clock struct ptr to use 78 * @clk: OMAP clock struct ptr to use
@@ -168,111 +100,6 @@ void omap2_init_clk_clkdm(struct clk *clk)
168} 100}
169 101
170/** 102/**
171 * omap2_init_clksel_parent - set a clksel clk's parent field from the hardware
172 * @clk: OMAP clock struct ptr to use
173 *
174 * Given a pointer to a source-selectable struct clk, read the hardware
175 * register and determine what its parent is currently set to. Update the
176 * clk->parent field with the appropriate clk ptr.
177 */
178void omap2_init_clksel_parent(struct clk *clk)
179{
180 const struct clksel *clks;
181 const struct clksel_rate *clkr;
182 u32 r, found = 0;
183
184 if (!clk->clksel)
185 return;
186
187 r = __raw_readl(clk->clksel_reg) & clk->clksel_mask;
188 r >>= __ffs(clk->clksel_mask);
189
190 for (clks = clk->clksel; clks->parent && !found; clks++) {
191 for (clkr = clks->rates; clkr->div && !found; clkr++) {
192 if ((clkr->flags & cpu_mask) && (clkr->val == r)) {
193 if (clk->parent != clks->parent) {
194 pr_debug("clock: inited %s parent "
195 "to %s (was %s)\n",
196 clk->name, clks->parent->name,
197 ((clk->parent) ?
198 clk->parent->name : "NULL"));
199 clk_reparent(clk, clks->parent);
200 };
201 found = 1;
202 }
203 }
204 }
205
206 if (!found)
207 printk(KERN_ERR "clock: init parent: could not find "
208 "regval %0x for clock %s\n", r, clk->name);
209
210 return;
211}
212
213/**
214 * omap2_get_dpll_rate - returns the current DPLL CLKOUT rate
215 * @clk: struct clk * of a DPLL
216 *
217 * DPLLs can be locked or bypassed - basically, enabled or disabled.
218 * When locked, the DPLL output depends on the M and N values. When
219 * bypassed, on OMAP2xxx, the output rate is either the 32KiHz clock
220 * or sys_clk. Bypass rates on OMAP3 depend on the DPLL: DPLLs 1 and
221 * 2 are bypassed with dpll1_fclk and dpll2_fclk respectively
222 * (generated by DPLL3), while DPLL 3, 4, and 5 bypass rates are sys_clk.
223 * Returns the current DPLL CLKOUT rate (*not* CLKOUTX2) if the DPLL is
224 * locked, or the appropriate bypass rate if the DPLL is bypassed, or 0
225 * if the clock @clk is not a DPLL.
226 */
227u32 omap2_get_dpll_rate(struct clk *clk)
228{
229 long long dpll_clk;
230 u32 dpll_mult, dpll_div, v;
231 struct dpll_data *dd;
232
233 dd = clk->dpll_data;
234 if (!dd)
235 return 0;
236
237 /* Return bypass rate if DPLL is bypassed */
238 v = __raw_readl(dd->control_reg);
239 v &= dd->enable_mask;
240 v >>= __ffs(dd->enable_mask);
241
242 if (cpu_is_omap24xx()) {
243 if (v == OMAP2XXX_EN_DPLL_LPBYPASS ||
244 v == OMAP2XXX_EN_DPLL_FRBYPASS)
245 return dd->clk_bypass->rate;
246 } else if (cpu_is_omap34xx()) {
247 if (v == OMAP3XXX_EN_DPLL_LPBYPASS ||
248 v == OMAP3XXX_EN_DPLL_FRBYPASS)
249 return dd->clk_bypass->rate;
250 }
251
252 v = __raw_readl(dd->mult_div1_reg);
253 dpll_mult = v & dd->mult_mask;
254 dpll_mult >>= __ffs(dd->mult_mask);
255 dpll_div = v & dd->div1_mask;
256 dpll_div >>= __ffs(dd->div1_mask);
257
258 dpll_clk = (long long)dd->clk_ref->rate * dpll_mult;
259 do_div(dpll_clk, dpll_div + 1);
260
261 return dpll_clk;
262}
263
264/*
265 * Used for clocks that have the same value as the parent clock,
266 * divided by some factor
267 */
268unsigned long omap2_fixed_divisor_recalc(struct clk *clk)
269{
270 WARN_ON(!clk->fixed_div);
271
272 return clk->parent->rate / clk->fixed_div;
273}
274
275/**
276 * omap2_clk_dflt_find_companion - find companion clock to @clk 103 * omap2_clk_dflt_find_companion - find companion clock to @clk
277 * @clk: struct clk * to find the companion clock of 104 * @clk: struct clk * to find the companion clock of
278 * @other_reg: void __iomem ** to return the companion clock CM_*CLKEN va in 105 * @other_reg: void __iomem ** to return the companion clock CM_*CLKEN va in
@@ -312,7 +139,8 @@ void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg,
312 * omap2_clk_dflt_find_idlest - find CM_IDLEST reg va, bit shift for @clk 139 * omap2_clk_dflt_find_idlest - find CM_IDLEST reg va, bit shift for @clk
313 * @clk: struct clk * to find IDLEST info for 140 * @clk: struct clk * to find IDLEST info for
314 * @idlest_reg: void __iomem ** to return the CM_IDLEST va in 141 * @idlest_reg: void __iomem ** to return the CM_IDLEST va in
315 * @idlest_bit: u8 ** to return the CM_IDLEST bit shift in 142 * @idlest_bit: u8 * to return the CM_IDLEST bit shift in
143 * @idlest_val: u8 * to return the idle status indicator
316 * 144 *
317 * Return the CM_IDLEST register address and bit shift corresponding 145 * Return the CM_IDLEST register address and bit shift corresponding
318 * to the module that "owns" this clock. This default code assumes 146 * to the module that "owns" this clock. This default code assumes
@@ -322,40 +150,26 @@ void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg,
322 * CM_IDLEST2). This is not true for all modules. No return value. 150 * CM_IDLEST2). This is not true for all modules. No return value.
323 */ 151 */
324void omap2_clk_dflt_find_idlest(struct clk *clk, void __iomem **idlest_reg, 152void omap2_clk_dflt_find_idlest(struct clk *clk, void __iomem **idlest_reg,
325 u8 *idlest_bit) 153 u8 *idlest_bit, u8 *idlest_val)
326{ 154{
327 u32 r; 155 u32 r;
328 156
329 r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); 157 r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20);
330 *idlest_reg = (__force void __iomem *)r; 158 *idlest_reg = (__force void __iomem *)r;
331 *idlest_bit = clk->enable_bit; 159 *idlest_bit = clk->enable_bit;
332}
333 160
334/** 161 /*
335 * omap2_module_wait_ready - wait for an OMAP module to leave IDLE 162 * 24xx uses 0 to indicate not ready, and 1 to indicate ready.
336 * @clk: struct clk * belonging to the module 163 * 34xx reverses this, just to keep us on our toes
337 * 164 * AM35xx uses both, depending on the module.
338 * If the necessary clocks for the OMAP hardware IP block that 165 */
339 * corresponds to clock @clk are enabled, then wait for the module to 166 if (cpu_is_omap24xx())
340 * indicate readiness (i.e., to leave IDLE). This code does not 167 *idlest_val = OMAP24XX_CM_IDLEST_VAL;
341 * belong in the clock code and will be moved in the medium term to 168 else if (cpu_is_omap34xx())
342 * module-dependent code. No return value. 169 *idlest_val = OMAP34XX_CM_IDLEST_VAL;
343 */ 170 else
344static void omap2_module_wait_ready(struct clk *clk) 171 BUG();
345{
346 void __iomem *companion_reg, *idlest_reg;
347 u8 other_bit, idlest_bit;
348
349 /* Not all modules have multiple clocks that their IDLEST depends on */
350 if (clk->ops->find_companion) {
351 clk->ops->find_companion(clk, &companion_reg, &other_bit);
352 if (!(__raw_readl(companion_reg) & (1 << other_bit)))
353 return;
354 }
355
356 clk->ops->find_idlest(clk, &idlest_reg, &idlest_bit);
357 172
358 omap2_cm_wait_idlest(idlest_reg, (1 << idlest_bit), clk->name);
359} 173}
360 174
361int omap2_dflt_clk_enable(struct clk *clk) 175int omap2_dflt_clk_enable(struct clk *clk)
@@ -377,7 +191,7 @@ int omap2_dflt_clk_enable(struct clk *clk)
377 v = __raw_readl(clk->enable_reg); /* OCP barrier */ 191 v = __raw_readl(clk->enable_reg); /* OCP barrier */
378 192
379 if (clk->ops->find_idlest) 193 if (clk->ops->find_idlest)
380 omap2_module_wait_ready(clk); 194 _omap2_module_wait_ready(clk);
381 195
382 return 0; 196 return 0;
383} 197}
@@ -417,331 +231,109 @@ const struct clkops clkops_omap2_dflt = {
417 .disable = omap2_dflt_clk_disable, 231 .disable = omap2_dflt_clk_disable,
418}; 232};
419 233
420/* Enables clock without considering parent dependencies or use count 234/**
421 * REVISIT: Maybe change this to use clk->enable like on omap1? 235 * omap2_clk_disable - disable a clock, if the system is not using it
236 * @clk: struct clk * to disable
237 *
238 * Decrements the usecount on struct clk @clk. If there are no users
239 * left, call the clkops-specific clock disable function to disable it
240 * in hardware. If the clock is part of a clockdomain (which they all
241 * should be), request that the clockdomain be disabled. (It too has
242 * a usecount, and so will not be disabled in the hardware until it no
243 * longer has any users.) If the clock has a parent clock (most of
244 * them do), then call ourselves, recursing on the parent clock. This
245 * can cause an entire branch of the clock tree to be powered off by
246 * simply disabling one clock. Intended to be called with the clockfw_lock
247 * spinlock held. No return value.
422 */ 248 */
423static int _omap2_clk_enable(struct clk *clk)
424{
425 return clk->ops->enable(clk);
426}
427
428/* Disables clock without considering parent dependencies or use count */
429static void _omap2_clk_disable(struct clk *clk)
430{
431 clk->ops->disable(clk);
432}
433
434void omap2_clk_disable(struct clk *clk) 249void omap2_clk_disable(struct clk *clk)
435{ 250{
436 if (clk->usecount > 0 && !(--clk->usecount)) { 251 if (clk->usecount == 0) {
437 _omap2_clk_disable(clk); 252 WARN(1, "clock: %s: omap2_clk_disable() called, but usecount "
438 if (clk->parent) 253 "already 0?", clk->name);
439 omap2_clk_disable(clk->parent); 254 return;
440 if (clk->clkdm)
441 omap2_clkdm_clk_disable(clk->clkdm, clk);
442
443 } 255 }
444}
445 256
446int omap2_clk_enable(struct clk *clk) 257 pr_debug("clock: %s: decrementing usecount\n", clk->name);
447{
448 int ret = 0;
449 258
450 if (clk->usecount++ == 0) { 259 clk->usecount--;
451 if (clk->clkdm)
452 omap2_clkdm_clk_enable(clk->clkdm, clk);
453 260
454 if (clk->parent) { 261 if (clk->usecount > 0)
455 ret = omap2_clk_enable(clk->parent); 262 return;
456 if (ret)
457 goto err;
458 }
459 263
460 ret = _omap2_clk_enable(clk); 264 pr_debug("clock: %s: disabling in hardware\n", clk->name);
461 if (ret) {
462 if (clk->parent)
463 omap2_clk_disable(clk->parent);
464 265
465 goto err; 266 clk->ops->disable(clk);
466 }
467 }
468 return ret;
469 267
470err:
471 if (clk->clkdm) 268 if (clk->clkdm)
472 omap2_clkdm_clk_disable(clk->clkdm, clk); 269 omap2_clkdm_clk_disable(clk->clkdm, clk);
473 clk->usecount--;
474 return ret;
475}
476 270
477/* 271 if (clk->parent)
478 * Used for clocks that are part of CLKSEL_xyz governed clocks. 272 omap2_clk_disable(clk->parent);
479 * REVISIT: Maybe change to use clk->enable() functions like on omap1?
480 */
481unsigned long omap2_clksel_recalc(struct clk *clk)
482{
483 unsigned long rate;
484 u32 div = 0;
485
486 pr_debug("clock: recalc'ing clksel clk %s\n", clk->name);
487
488 div = omap2_clksel_get_divisor(clk);
489 if (div == 0)
490 return clk->rate;
491
492 rate = clk->parent->rate / div;
493
494 pr_debug("clock: new clock rate is %ld (div %d)\n", rate, div);
495
496 return rate;
497}
498
499/**
500 * omap2_get_clksel_by_parent - return clksel struct for a given clk & parent
501 * @clk: OMAP struct clk ptr to inspect
502 * @src_clk: OMAP struct clk ptr of the parent clk to search for
503 *
504 * Scan the struct clksel array associated with the clock to find
505 * the element associated with the supplied parent clock address.
506 * Returns a pointer to the struct clksel on success or NULL on error.
507 */
508static const struct clksel *omap2_get_clksel_by_parent(struct clk *clk,
509 struct clk *src_clk)
510{
511 const struct clksel *clks;
512
513 if (!clk->clksel)
514 return NULL;
515
516 for (clks = clk->clksel; clks->parent; clks++) {
517 if (clks->parent == src_clk)
518 break; /* Found the requested parent */
519 }
520
521 if (!clks->parent) {
522 printk(KERN_ERR "clock: Could not find parent clock %s in "
523 "clksel array of clock %s\n", src_clk->name,
524 clk->name);
525 return NULL;
526 }
527
528 return clks;
529} 273}
530 274
531/** 275/**
532 * omap2_clksel_round_rate_div - find divisor for the given clock and rate 276 * omap2_clk_enable - request that the system enable a clock
533 * @clk: OMAP struct clk to use 277 * @clk: struct clk * to enable
534 * @target_rate: desired clock rate
535 * @new_div: ptr to where we should store the divisor
536 *
537 * Finds 'best' divider value in an array based on the source and target
538 * rates. The divider array must be sorted with smallest divider first.
539 * Note that this will not work for clocks which are part of CONFIG_PARTICIPANT,
540 * they are only settable as part of virtual_prcm set.
541 * 278 *
542 * Returns the rounded clock rate or returns 0xffffffff on error. 279 * Increments the usecount on struct clk @clk. If there were no users
280 * previously, then recurse up the clock tree, enabling all of the
281 * clock's parents and all of the parent clockdomains, and finally,
282 * enabling @clk's clockdomain, and @clk itself. Intended to be
283 * called with the clockfw_lock spinlock held. Returns 0 upon success
284 * or a negative error code upon failure.
543 */ 285 */
544u32 omap2_clksel_round_rate_div(struct clk *clk, unsigned long target_rate, 286int omap2_clk_enable(struct clk *clk)
545 u32 *new_div)
546{
547 unsigned long test_rate;
548 const struct clksel *clks;
549 const struct clksel_rate *clkr;
550 u32 last_div = 0;
551
552 pr_debug("clock: clksel_round_rate_div: %s target_rate %ld\n",
553 clk->name, target_rate);
554
555 *new_div = 1;
556
557 clks = omap2_get_clksel_by_parent(clk, clk->parent);
558 if (!clks)
559 return ~0;
560
561 for (clkr = clks->rates; clkr->div; clkr++) {
562 if (!(clkr->flags & cpu_mask))
563 continue;
564
565 /* Sanity check */
566 if (clkr->div <= last_div)
567 pr_err("clock: clksel_rate table not sorted "
568 "for clock %s", clk->name);
569
570 last_div = clkr->div;
571
572 test_rate = clk->parent->rate / clkr->div;
573
574 if (test_rate <= target_rate)
575 break; /* found it */
576 }
577
578 if (!clkr->div) {
579 pr_err("clock: Could not find divisor for target "
580 "rate %ld for clock %s parent %s\n", target_rate,
581 clk->name, clk->parent->name);
582 return ~0;
583 }
584
585 *new_div = clkr->div;
586
587 pr_debug("clock: new_div = %d, new_rate = %ld\n", *new_div,
588 (clk->parent->rate / clkr->div));
589
590 return (clk->parent->rate / clkr->div);
591}
592
593/**
594 * omap2_clksel_round_rate - find rounded rate for the given clock and rate
595 * @clk: OMAP struct clk to use
596 * @target_rate: desired clock rate
597 *
598 * Compatibility wrapper for OMAP clock framework
599 * Finds best target rate based on the source clock and possible dividers.
600 * rates. The divider array must be sorted with smallest divider first.
601 * Note that this will not work for clocks which are part of CONFIG_PARTICIPANT,
602 * they are only settable as part of virtual_prcm set.
603 *
604 * Returns the rounded clock rate or returns 0xffffffff on error.
605 */
606long omap2_clksel_round_rate(struct clk *clk, unsigned long target_rate)
607{
608 u32 new_div;
609
610 return omap2_clksel_round_rate_div(clk, target_rate, &new_div);
611}
612
613
614/* Given a clock and a rate apply a clock specific rounding function */
615long omap2_clk_round_rate(struct clk *clk, unsigned long rate)
616{ 287{
617 if (clk->round_rate) 288 int ret;
618 return clk->round_rate(clk, rate);
619 289
620 if (clk->flags & RATE_FIXED) 290 pr_debug("clock: %s: incrementing usecount\n", clk->name);
621 printk(KERN_ERR "clock: generic omap2_clk_round_rate called "
622 "on fixed-rate clock %s\n", clk->name);
623 291
624 return clk->rate; 292 clk->usecount++;
625}
626 293
627/** 294 if (clk->usecount > 1)
628 * omap2_clksel_to_divisor() - turn clksel field value into integer divider
629 * @clk: OMAP struct clk to use
630 * @field_val: register field value to find
631 *
632 * Given a struct clk of a rate-selectable clksel clock, and a register field
633 * value to search for, find the corresponding clock divisor. The register
634 * field value should be pre-masked and shifted down so the LSB is at bit 0
635 * before calling. Returns 0 on error
636 */
637u32 omap2_clksel_to_divisor(struct clk *clk, u32 field_val)
638{
639 const struct clksel *clks;
640 const struct clksel_rate *clkr;
641
642 clks = omap2_get_clksel_by_parent(clk, clk->parent);
643 if (!clks)
644 return 0; 295 return 0;
645 296
646 for (clkr = clks->rates; clkr->div; clkr++) { 297 pr_debug("clock: %s: enabling in hardware\n", clk->name);
647 if ((clkr->flags & cpu_mask) && (clkr->val == field_val))
648 break;
649 }
650 298
651 if (!clkr->div) { 299 if (clk->parent) {
652 printk(KERN_ERR "clock: Could not find fieldval %d for " 300 ret = omap2_clk_enable(clk->parent);
653 "clock %s parent %s\n", field_val, clk->name, 301 if (ret) {
654 clk->parent->name); 302 WARN(1, "clock: %s: could not enable parent %s: %d\n",
655 return 0; 303 clk->name, clk->parent->name, ret);
304 goto oce_err1;
305 }
656 } 306 }
657 307
658 return clkr->div; 308 if (clk->clkdm) {
659} 309 ret = omap2_clkdm_clk_enable(clk->clkdm, clk);
660 310 if (ret) {
661/** 311 WARN(1, "clock: %s: could not enable clockdomain %s: "
662 * omap2_divisor_to_clksel() - turn clksel integer divisor into a field value 312 "%d\n", clk->name, clk->clkdm->name, ret);
663 * @clk: OMAP struct clk to use 313 goto oce_err2;
664 * @div: integer divisor to search for 314 }
665 *
666 * Given a struct clk of a rate-selectable clksel clock, and a clock divisor,
667 * find the corresponding register field value. The return register value is
668 * the value before left-shifting. Returns ~0 on error
669 */
670u32 omap2_divisor_to_clksel(struct clk *clk, u32 div)
671{
672 const struct clksel *clks;
673 const struct clksel_rate *clkr;
674
675 /* should never happen */
676 WARN_ON(div == 0);
677
678 clks = omap2_get_clksel_by_parent(clk, clk->parent);
679 if (!clks)
680 return ~0;
681
682 for (clkr = clks->rates; clkr->div; clkr++) {
683 if ((clkr->flags & cpu_mask) && (clkr->div == div))
684 break;
685 } 315 }
686 316
687 if (!clkr->div) { 317 ret = clk->ops->enable(clk);
688 printk(KERN_ERR "clock: Could not find divisor %d for " 318 if (ret) {
689 "clock %s parent %s\n", div, clk->name, 319 WARN(1, "clock: %s: could not enable: %d\n", clk->name, ret);
690 clk->parent->name); 320 goto oce_err3;
691 return ~0;
692 } 321 }
693 322
694 return clkr->val; 323 return 0;
695}
696
697/**
698 * omap2_clksel_get_divisor - get current divider applied to parent clock.
699 * @clk: OMAP struct clk to use.
700 *
701 * Returns the integer divisor upon success or 0 on error.
702 */
703u32 omap2_clksel_get_divisor(struct clk *clk)
704{
705 u32 v;
706
707 if (!clk->clksel_mask)
708 return 0;
709
710 v = __raw_readl(clk->clksel_reg) & clk->clksel_mask;
711 v >>= __ffs(clk->clksel_mask);
712
713 return omap2_clksel_to_divisor(clk, v);
714}
715
716int omap2_clksel_set_rate(struct clk *clk, unsigned long rate)
717{
718 u32 v, field_val, validrate, new_div = 0;
719
720 if (!clk->clksel_mask)
721 return -EINVAL;
722
723 validrate = omap2_clksel_round_rate_div(clk, rate, &new_div);
724 if (validrate != rate)
725 return -EINVAL;
726
727 field_val = omap2_divisor_to_clksel(clk, new_div);
728 if (field_val == ~0)
729 return -EINVAL;
730
731 v = __raw_readl(clk->clksel_reg);
732 v &= ~clk->clksel_mask;
733 v |= field_val << __ffs(clk->clksel_mask);
734 __raw_writel(v, clk->clksel_reg);
735 v = __raw_readl(clk->clksel_reg); /* OCP barrier */
736
737 clk->rate = clk->parent->rate / new_div;
738 324
739 _omap2xxx_clk_commit(clk); 325oce_err3:
326 if (clk->clkdm)
327 omap2_clkdm_clk_disable(clk->clkdm, clk);
328oce_err2:
329 if (clk->parent)
330 omap2_clk_disable(clk->parent);
331oce_err1:
332 clk->usecount--;
740 333
741 return 0; 334 return ret;
742} 335}
743 336
744
745/* Set the clock rate for a clock source */ 337/* Set the clock rate for a clock source */
746int omap2_clk_set_rate(struct clk *clk, unsigned long rate) 338int omap2_clk_set_rate(struct clk *clk, unsigned long rate)
747{ 339{
@@ -749,11 +341,6 @@ int omap2_clk_set_rate(struct clk *clk, unsigned long rate)
749 341
750 pr_debug("clock: set_rate for clock %s to rate %ld\n", clk->name, rate); 342 pr_debug("clock: set_rate for clock %s to rate %ld\n", clk->name, rate);
751 343
752 /* CONFIG_PARTICIPANT clocks are changed only in sets via the
753 rate table mechanism, driven by mpu_speed */
754 if (clk->flags & CONFIG_PARTICIPANT)
755 return -EINVAL;
756
757 /* dpll_ck, core_ck, virt_prcm_set; plus all clksel clocks */ 344 /* dpll_ck, core_ck, virt_prcm_set; plus all clksel clocks */
758 if (clk->set_rate) 345 if (clk->set_rate)
759 ret = clk->set_rate(clk, rate); 346 ret = clk->set_rate(clk, rate);
@@ -761,289 +348,152 @@ int omap2_clk_set_rate(struct clk *clk, unsigned long rate)
761 return ret; 348 return ret;
762} 349}
763 350
764/*
765 * Converts encoded control register address into a full address
766 * On error, the return value (parent_div) will be 0.
767 */
768static u32 _omap2_clksel_get_src_field(struct clk *src_clk, struct clk *clk,
769 u32 *field_val)
770{
771 const struct clksel *clks;
772 const struct clksel_rate *clkr;
773
774 clks = omap2_get_clksel_by_parent(clk, src_clk);
775 if (!clks)
776 return 0;
777
778 for (clkr = clks->rates; clkr->div; clkr++) {
779 if (clkr->flags & cpu_mask && clkr->flags & DEFAULT_RATE)
780 break; /* Found the default rate for this platform */
781 }
782
783 if (!clkr->div) {
784 printk(KERN_ERR "clock: Could not find default rate for "
785 "clock %s parent %s\n", clk->name,
786 src_clk->parent->name);
787 return 0;
788 }
789
790 /* Should never happen. Add a clksel mask to the struct clk. */
791 WARN_ON(clk->clksel_mask == 0);
792
793 *field_val = clkr->val;
794
795 return clkr->div;
796}
797
798int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent) 351int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent)
799{ 352{
800 u32 field_val, v, parent_div;
801
802 if (clk->flags & CONFIG_PARTICIPANT)
803 return -EINVAL;
804
805 if (!clk->clksel) 353 if (!clk->clksel)
806 return -EINVAL; 354 return -EINVAL;
807 355
808 parent_div = _omap2_clksel_get_src_field(new_parent, clk, &field_val); 356 if (clk->parent == new_parent)
809 if (!parent_div) 357 return 0;
810 return -EINVAL;
811
812 /* Set new source value (previous dividers if any in effect) */
813 v = __raw_readl(clk->clksel_reg);
814 v &= ~clk->clksel_mask;
815 v |= field_val << __ffs(clk->clksel_mask);
816 __raw_writel(v, clk->clksel_reg);
817 v = __raw_readl(clk->clksel_reg); /* OCP barrier */
818
819 _omap2xxx_clk_commit(clk);
820
821 clk_reparent(clk, new_parent);
822
823 /* CLKSEL clocks follow their parents' rates, divided by a divisor */
824 clk->rate = new_parent->rate;
825
826 if (parent_div > 0)
827 clk->rate /= parent_div;
828
829 pr_debug("clock: set parent of %s to %s (new rate %ld)\n",
830 clk->name, clk->parent->name, clk->rate);
831 358
832 return 0; 359 return omap2_clksel_set_parent(clk, new_parent);
833} 360}
834 361
835/* DPLL rate rounding code */ 362/* OMAP3/4 non-CORE DPLL clkops */
836
837/**
838 * omap2_dpll_set_rate_tolerance: set the error tolerance during rate rounding
839 * @clk: struct clk * of the DPLL
840 * @tolerance: maximum rate error tolerance
841 *
842 * Set the maximum DPLL rate error tolerance for the rate rounding
843 * algorithm. The rate tolerance is an attempt to balance DPLL power
844 * saving (the least divider value "n") vs. rate fidelity (the least
845 * difference between the desired DPLL target rate and the rounded
846 * rate out of the algorithm). So, increasing the tolerance is likely
847 * to decrease DPLL power consumption and increase DPLL rate error.
848 * Returns -EINVAL if provided a null clock ptr or a clk that is not a
849 * DPLL; or 0 upon success.
850 */
851int omap2_dpll_set_rate_tolerance(struct clk *clk, unsigned int tolerance)
852{
853 if (!clk || !clk->dpll_data)
854 return -EINVAL;
855 363
856 clk->dpll_data->rate_tolerance = tolerance; 364#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
857 365
858 return 0; 366const struct clkops clkops_omap3_noncore_dpll_ops = {
859} 367 .enable = omap3_noncore_dpll_enable,
368 .disable = omap3_noncore_dpll_disable,
369};
860 370
861static unsigned long _dpll_compute_new_rate(unsigned long parent_rate, 371#endif
862 unsigned int m, unsigned int n)
863{
864 unsigned long long num;
865 372
866 num = (unsigned long long)parent_rate * m;
867 do_div(num, n);
868 return num;
869}
870 373
871/* 374/*
872 * _dpll_test_mult - test a DPLL multiplier value 375 * OMAP2+ clock reset and init functions
873 * @m: pointer to the DPLL m (multiplier) value under test
874 * @n: current DPLL n (divider) value under test
875 * @new_rate: pointer to storage for the resulting rounded rate
876 * @target_rate: the desired DPLL rate
877 * @parent_rate: the DPLL's parent clock rate
878 *
879 * This code tests a DPLL multiplier value, ensuring that the
880 * resulting rate will not be higher than the target_rate, and that
881 * the multiplier value itself is valid for the DPLL. Initially, the
882 * integer pointed to by the m argument should be prescaled by
883 * multiplying by DPLL_SCALE_FACTOR. The code will replace this with
884 * a non-scaled m upon return. This non-scaled m will result in a
885 * new_rate as close as possible to target_rate (but not greater than
886 * target_rate) given the current (parent_rate, n, prescaled m)
887 * triple. Returns DPLL_MULT_UNDERFLOW in the event that the
888 * non-scaled m attempted to underflow, which can allow the calling
889 * function to bail out early; or 0 upon success.
890 */ 376 */
891static int _dpll_test_mult(int *m, int n, unsigned long *new_rate, 377
892 unsigned long target_rate, 378#ifdef CONFIG_OMAP_RESET_CLOCKS
893 unsigned long parent_rate) 379void omap2_clk_disable_unused(struct clk *clk)
894{ 380{
895 int r = 0, carry = 0; 381 u32 regval32, v;
896 382
897 /* Unscale m and round if necessary */ 383 v = (clk->flags & INVERT_ENABLE) ? (1 << clk->enable_bit) : 0;
898 if (*m % DPLL_SCALE_FACTOR >= DPLL_ROUNDING_VAL)
899 carry = 1;
900 *m = (*m / DPLL_SCALE_FACTOR) + carry;
901 384
902 /* 385 regval32 = __raw_readl(clk->enable_reg);
903 * The new rate must be <= the target rate to avoid programming 386 if ((regval32 & (1 << clk->enable_bit)) == v)
904 * a rate that is impossible for the hardware to handle 387 return;
905 */
906 *new_rate = _dpll_compute_new_rate(parent_rate, *m, n);
907 if (*new_rate > target_rate) {
908 (*m)--;
909 *new_rate = 0;
910 }
911 388
912 /* Guard against m underflow */ 389 printk(KERN_DEBUG "Disabling unused clock \"%s\"\n", clk->name);
913 if (*m < DPLL_MIN_MULTIPLIER) { 390 if (cpu_is_omap34xx()) {
914 *m = DPLL_MIN_MULTIPLIER; 391 omap2_clk_enable(clk);
915 *new_rate = 0; 392 omap2_clk_disable(clk);
916 r = DPLL_MULT_UNDERFLOW; 393 } else {
394 clk->ops->disable(clk);
917 } 395 }
918 396 if (clk->clkdm != NULL)
919 if (*new_rate == 0) 397 pwrdm_clkdm_state_switch(clk->clkdm);
920 *new_rate = _dpll_compute_new_rate(parent_rate, *m, n);
921
922 return r;
923} 398}
399#endif
924 400
925/** 401/**
926 * omap2_dpll_round_rate - round a target rate for an OMAP DPLL 402 * omap2_clk_switch_mpurate_at_boot - switch ARM MPU rate by boot-time argument
927 * @clk: struct clk * for a DPLL 403 * @mpurate_ck_name: clk name of the clock to change rate
928 * @target_rate: desired DPLL clock rate
929 * 404 *
930 * Given a DPLL, a desired target rate, and a rate tolerance, round 405 * Change the ARM MPU clock rate to the rate specified on the command
931 * the target rate to a possible, programmable rate for this DPLL. 406 * line, if one was specified. @mpurate_ck_name should be
932 * Rate tolerance is assumed to be set by the caller before this 407 * "virt_prcm_set" on OMAP2xxx and "dpll1_ck" on OMAP34xx/OMAP36xx.
933 * function is called. Attempts to select the minimum possible n 408 * XXX Does not handle voltage scaling - on OMAP2xxx this is currently
934 * within the tolerance to reduce power consumption. Stores the 409 * handled by the virt_prcm_set clock, but this should be handled by
935 * computed (m, n) in the DPLL's dpll_data structure so set_rate() 410 * the OPP layer. XXX This is intended to be handled by the OPP layer
936 * will not need to call this (expensive) function again. Returns ~0 411 * code in the near future and should be removed from the clock code.
937 * if the target rate cannot be rounded, either because the rate is 412 * Returns -EINVAL if 'mpurate' is zero or if clk_set_rate() rejects
938 * too low or because the rate tolerance is set too tightly; or the 413 * the rate, -ENOENT if the struct clk referred to by @mpurate_ck_name
939 * rounded rate upon success. 414 * cannot be found, or 0 upon success.
940 */ 415 */
941long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate) 416int __init omap2_clk_switch_mpurate_at_boot(const char *mpurate_ck_name)
942{ 417{
943 int m, n, r, e, scaled_max_m; 418 struct clk *mpurate_ck;
944 unsigned long scaled_rt_rp, new_rate; 419 int r;
945 int min_e = -1, min_e_m = -1, min_e_n = -1;
946 struct dpll_data *dd;
947
948 if (!clk || !clk->dpll_data)
949 return ~0;
950
951 dd = clk->dpll_data;
952 420
953 pr_debug("clock: starting DPLL round_rate for clock %s, target rate " 421 if (!mpurate)
954 "%ld\n", clk->name, target_rate); 422 return -EINVAL;
955
956 scaled_rt_rp = target_rate / (dd->clk_ref->rate / DPLL_SCALE_FACTOR);
957 scaled_max_m = dd->max_multiplier * DPLL_SCALE_FACTOR;
958
959 dd->last_rounded_rate = 0;
960
961 for (n = dd->min_divider; n <= dd->max_divider; n++) {
962
963 /* Is the (input clk, divider) pair valid for the DPLL? */
964 r = _dpll_test_fint(clk, n);
965 if (r == DPLL_FINT_UNDERFLOW)
966 break;
967 else if (r == DPLL_FINT_INVALID)
968 continue;
969
970 /* Compute the scaled DPLL multiplier, based on the divider */
971 m = scaled_rt_rp * n;
972
973 /*
974 * Since we're counting n up, a m overflow means we
975 * can bail out completely (since as n increases in
976 * the next iteration, there's no way that m can
977 * increase beyond the current m)
978 */
979 if (m > scaled_max_m)
980 break;
981
982 r = _dpll_test_mult(&m, n, &new_rate, target_rate,
983 dd->clk_ref->rate);
984
985 /* m can't be set low enough for this n - try with a larger n */
986 if (r == DPLL_MULT_UNDERFLOW)
987 continue;
988
989 e = target_rate - new_rate;
990 pr_debug("clock: n = %d: m = %d: rate error is %d "
991 "(new_rate = %ld)\n", n, m, e, new_rate);
992
993 if (min_e == -1 ||
994 min_e >= (int)(abs(e) - dd->rate_tolerance)) {
995 min_e = e;
996 min_e_m = m;
997 min_e_n = n;
998
999 pr_debug("clock: found new least error %d\n", min_e);
1000 423
1001 /* We found good settings -- bail out now */ 424 mpurate_ck = clk_get(NULL, mpurate_ck_name);
1002 if (min_e <= dd->rate_tolerance) 425 if (WARN(IS_ERR(mpurate_ck), "Failed to get %s.\n", mpurate_ck_name))
1003 break; 426 return -ENOENT;
1004 }
1005 }
1006 427
1007 if (min_e < 0) { 428 r = clk_set_rate(mpurate_ck, mpurate);
1008 pr_debug("clock: error: target rate or tolerance too low\n"); 429 if (IS_ERR_VALUE(r)) {
1009 return ~0; 430 WARN(1, "clock: %s: unable to set MPU rate to %d: %d\n",
431 mpurate_ck->name, mpurate, r);
432 return -EINVAL;
1010 } 433 }
1011 434
1012 dd->last_rounded_m = min_e_m; 435 calibrate_delay();
1013 dd->last_rounded_n = min_e_n; 436 recalculate_root_clocks();
1014 dd->last_rounded_rate = _dpll_compute_new_rate(dd->clk_ref->rate,
1015 min_e_m, min_e_n);
1016 437
1017 pr_debug("clock: final least error: e = %d, m = %d, n = %d\n", 438 clk_put(mpurate_ck);
1018 min_e, min_e_m, min_e_n);
1019 pr_debug("clock: final rate: %ld (target rate: %ld)\n",
1020 dd->last_rounded_rate, target_rate);
1021 439
1022 return dd->last_rounded_rate; 440 return 0;
1023} 441}
1024 442
1025/*------------------------------------------------------------------------- 443/**
1026 * Omap2 clock reset and init functions 444 * omap2_clk_print_new_rates - print summary of current clock tree rates
1027 *-------------------------------------------------------------------------*/ 445 * @hfclkin_ck_name: clk name for the off-chip HF oscillator
1028 446 * @core_ck_name: clk name for the on-chip CORE_CLK
1029#ifdef CONFIG_OMAP_RESET_CLOCKS 447 * @mpu_ck_name: clk name for the ARM MPU clock
1030void omap2_clk_disable_unused(struct clk *clk) 448 *
449 * Prints a short message to the console with the HFCLKIN oscillator
450 * rate, the rate of the CORE clock, and the rate of the ARM MPU clock.
451 * Called by the boot-time MPU rate switching code. XXX This is intended
452 * to be handled by the OPP layer code in the near future and should be
453 * removed from the clock code. No return value.
454 */
455void __init omap2_clk_print_new_rates(const char *hfclkin_ck_name,
456 const char *core_ck_name,
457 const char *mpu_ck_name)
1031{ 458{
1032 u32 regval32, v; 459 struct clk *hfclkin_ck, *core_ck, *mpu_ck;
460 unsigned long hfclkin_rate;
1033 461
1034 v = (clk->flags & INVERT_ENABLE) ? (1 << clk->enable_bit) : 0; 462 mpu_ck = clk_get(NULL, mpu_ck_name);
463 if (WARN(IS_ERR(mpu_ck), "clock: failed to get %s.\n", mpu_ck_name))
464 return;
1035 465
1036 regval32 = __raw_readl(clk->enable_reg); 466 core_ck = clk_get(NULL, core_ck_name);
1037 if ((regval32 & (1 << clk->enable_bit)) == v) 467 if (WARN(IS_ERR(core_ck), "clock: failed to get %s.\n", core_ck_name))
1038 return; 468 return;
1039 469
1040 printk(KERN_DEBUG "Disabling unused clock \"%s\"\n", clk->name); 470 hfclkin_ck = clk_get(NULL, hfclkin_ck_name);
1041 if (cpu_is_omap34xx()) { 471 if (WARN(IS_ERR(hfclkin_ck), "Failed to get %s.\n", hfclkin_ck_name))
1042 omap2_clk_enable(clk); 472 return;
1043 omap2_clk_disable(clk); 473
1044 } else 474 hfclkin_rate = clk_get_rate(hfclkin_ck);
1045 _omap2_clk_disable(clk); 475
1046 if (clk->clkdm != NULL) 476 pr_info("Switched to new clocking rate (Crystal/Core/MPU): "
1047 pwrdm_clkdm_state_switch(clk->clkdm); 477 "%ld.%01ld/%ld/%ld MHz\n",
1048} 478 (hfclkin_rate / 1000000),
479 ((hfclkin_rate / 100000) % 10),
480 (clk_get_rate(core_ck) / 1000000),
481 (clk_get_rate(mpu_ck) / 1000000));
482}
483
484/* Common data */
485
486struct clk_functions omap2_clk_functions = {
487 .clk_enable = omap2_clk_enable,
488 .clk_disable = omap2_clk_disable,
489 .clk_round_rate = omap2_clk_round_rate,
490 .clk_set_rate = omap2_clk_set_rate,
491 .clk_set_parent = omap2_clk_set_parent,
492 .clk_disable_unused = omap2_clk_disable_unused,
493#ifdef CONFIG_CPU_FREQ
494 /* These will be removed when the OPP code is integrated */
495 .clk_init_cpufreq_table = omap2_clk_init_cpufreq_table,
496 .clk_exit_cpufreq_table = omap2_clk_exit_cpufreq_table,
1049#endif 497#endif
498};
499
diff --git a/arch/arm/mach-omap2/clock.h b/arch/arm/mach-omap2/clock.h
index 9ae7540f8af2..ad8a1f7c1afc 100644
--- a/arch/arm/mach-omap2/clock.h
+++ b/arch/arm/mach-omap2/clock.h
@@ -1,8 +1,8 @@
1/* 1/*
2 * linux/arch/arm/mach-omap2/clock.h 2 * linux/arch/arm/mach-omap2/clock.h
3 * 3 *
4 * Copyright (C) 2005-2008 Texas Instruments, Inc. 4 * Copyright (C) 2005-2009 Texas Instruments, Inc.
5 * Copyright (C) 2004-2008 Nokia Corporation 5 * Copyright (C) 2004-2009 Nokia Corporation
6 * 6 *
7 * Contacts: 7 * Contacts:
8 * Richard Woodruff <r-woodruff2@ti.com> 8 * Richard Woodruff <r-woodruff2@ti.com>
@@ -16,7 +16,7 @@
16#ifndef __ARCH_ARM_MACH_OMAP2_CLOCK_H 16#ifndef __ARCH_ARM_MACH_OMAP2_CLOCK_H
17#define __ARCH_ARM_MACH_OMAP2_CLOCK_H 17#define __ARCH_ARM_MACH_OMAP2_CLOCK_H
18 18
19#include <mach/clock.h> 19#include <plat/clock.h>
20 20
21/* The maximum error between a target DPLL rate and the rounded rate in Hz */ 21/* The maximum error between a target DPLL rate and the rounded rate in Hz */
22#define DEFAULT_DPLL_RATE_TOLERANCE 50000 22#define DEFAULT_DPLL_RATE_TOLERANCE 50000
@@ -36,7 +36,21 @@
36#define OMAP3XXX_EN_DPLL_FRBYPASS 0x6 36#define OMAP3XXX_EN_DPLL_FRBYPASS 0x6
37#define OMAP3XXX_EN_DPLL_LOCKED 0x7 37#define OMAP3XXX_EN_DPLL_LOCKED 0x7
38 38
39int omap2_clk_init(void); 39/* OMAP4xxx CM_CLKMODE_DPLL*.EN_*_DPLL bits - for omap2_get_dpll_rate() */
40#define OMAP4XXX_EN_DPLL_MNBYPASS 0x4
41#define OMAP4XXX_EN_DPLL_LPBYPASS 0x5
42#define OMAP4XXX_EN_DPLL_FRBYPASS 0x6
43#define OMAP4XXX_EN_DPLL_LOCKED 0x7
44
45/* CM_CLKEN_PLL*.EN* bit values - not all are available for every DPLL */
46#define DPLL_LOW_POWER_STOP 0x1
47#define DPLL_LOW_POWER_BYPASS 0x5
48#define DPLL_LOCKED 0x7
49
50/* DPLL Type and DCO Selection Flags */
51#define DPLL_J_TYPE 0x1
52#define DPLL_NO_DCO_SEL 0x2
53
40int omap2_clk_enable(struct clk *clk); 54int omap2_clk_enable(struct clk *clk);
41void omap2_clk_disable(struct clk *clk); 55void omap2_clk_disable(struct clk *clk);
42long omap2_clk_round_rate(struct clk *clk, unsigned long rate); 56long omap2_clk_round_rate(struct clk *clk, unsigned long rate);
@@ -44,6 +58,14 @@ int omap2_clk_set_rate(struct clk *clk, unsigned long rate);
44int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent); 58int omap2_clk_set_parent(struct clk *clk, struct clk *new_parent);
45int omap2_dpll_set_rate_tolerance(struct clk *clk, unsigned int tolerance); 59int omap2_dpll_set_rate_tolerance(struct clk *clk, unsigned int tolerance);
46long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate); 60long omap2_dpll_round_rate(struct clk *clk, unsigned long target_rate);
61unsigned long omap3_dpll_recalc(struct clk *clk);
62unsigned long omap3_clkoutx2_recalc(struct clk *clk);
63void omap3_dpll_allow_idle(struct clk *clk);
64void omap3_dpll_deny_idle(struct clk *clk);
65u32 omap3_dpll_autoidle_read(struct clk *clk);
66int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate);
67int omap3_noncore_dpll_enable(struct clk *clk);
68void omap3_noncore_dpll_disable(struct clk *clk);
47 69
48#ifdef CONFIG_OMAP_RESET_CLOCKS 70#ifdef CONFIG_OMAP_RESET_CLOCKS
49void omap2_clk_disable_unused(struct clk *clk); 71void omap2_clk_disable_unused(struct clk *clk);
@@ -59,42 +81,70 @@ u32 omap2_clksel_round_rate_div(struct clk *clk, unsigned long target_rate,
59 u32 *new_div); 81 u32 *new_div);
60u32 omap2_clksel_to_divisor(struct clk *clk, u32 field_val); 82u32 omap2_clksel_to_divisor(struct clk *clk, u32 field_val);
61u32 omap2_divisor_to_clksel(struct clk *clk, u32 div); 83u32 omap2_divisor_to_clksel(struct clk *clk, u32 div);
62unsigned long omap2_fixed_divisor_recalc(struct clk *clk);
63long omap2_clksel_round_rate(struct clk *clk, unsigned long target_rate); 84long omap2_clksel_round_rate(struct clk *clk, unsigned long target_rate);
64int omap2_clksel_set_rate(struct clk *clk, unsigned long rate); 85int omap2_clksel_set_rate(struct clk *clk, unsigned long rate);
86int omap2_clksel_set_parent(struct clk *clk, struct clk *new_parent);
65u32 omap2_get_dpll_rate(struct clk *clk); 87u32 omap2_get_dpll_rate(struct clk *clk);
88void omap2_init_dpll_parent(struct clk *clk);
66int omap2_wait_clock_ready(void __iomem *reg, u32 cval, const char *name); 89int omap2_wait_clock_ready(void __iomem *reg, u32 cval, const char *name);
67void omap2_clk_prepare_for_reboot(void); 90
91
92#ifdef CONFIG_ARCH_OMAP2
93void omap2xxx_clk_prepare_for_reboot(void);
94#else
95static inline void omap2xxx_clk_prepare_for_reboot(void)
96{
97}
98#endif
99
100#ifdef CONFIG_ARCH_OMAP3
101void omap3_clk_prepare_for_reboot(void);
102#else
103static inline void omap3_clk_prepare_for_reboot(void)
104{
105}
106#endif
107
108#ifdef CONFIG_ARCH_OMAP4
109void omap4_clk_prepare_for_reboot(void);
110#else
111static inline void omap4_clk_prepare_for_reboot(void)
112{
113}
114#endif
115
68int omap2_dflt_clk_enable(struct clk *clk); 116int omap2_dflt_clk_enable(struct clk *clk);
69void omap2_dflt_clk_disable(struct clk *clk); 117void omap2_dflt_clk_disable(struct clk *clk);
70void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg, 118void omap2_clk_dflt_find_companion(struct clk *clk, void __iomem **other_reg,
71 u8 *other_bit); 119 u8 *other_bit);
72void omap2_clk_dflt_find_idlest(struct clk *clk, void __iomem **idlest_reg, 120void omap2_clk_dflt_find_idlest(struct clk *clk, void __iomem **idlest_reg,
73 u8 *idlest_bit); 121 u8 *idlest_bit, u8 *idlest_val);
122int omap2_clk_switch_mpurate_at_boot(const char *mpurate_ck_name);
123void omap2_clk_print_new_rates(const char *hfclkin_ck_name,
124 const char *core_ck_name,
125 const char *mpu_ck_name);
126
127extern u8 cpu_mask;
74 128
75extern const struct clkops clkops_omap2_dflt_wait; 129extern const struct clkops clkops_omap2_dflt_wait;
130extern const struct clkops clkops_dummy;
76extern const struct clkops clkops_omap2_dflt; 131extern const struct clkops clkops_omap2_dflt;
77 132
78extern u8 cpu_mask; 133extern struct clk_functions omap2_clk_functions;
134extern struct clk *vclk, *sclk;
135
136extern const struct clksel_rate gpt_32k_rates[];
137extern const struct clksel_rate gpt_sys_rates[];
138extern const struct clksel_rate gfx_l3_rates[];
79 139
80/* clksel_rate data common to 24xx/343x */ 140#if defined(CONFIG_ARCH_OMAP2) && defined(CONFIG_CPU_FREQ)
81static const struct clksel_rate gpt_32k_rates[] = { 141extern void omap2_clk_init_cpufreq_table(struct cpufreq_frequency_table **table);
82 { .div = 1, .val = 0, .flags = RATE_IN_24XX | RATE_IN_343X | DEFAULT_RATE }, 142extern void omap2_clk_exit_cpufreq_table(struct cpufreq_frequency_table **table);
83 { .div = 0 } 143#else
84}; 144#define omap2_clk_init_cpufreq_table 0
85 145#define omap2_clk_exit_cpufreq_table 0
86static const struct clksel_rate gpt_sys_rates[] = { 146#endif
87 { .div = 1, .val = 1, .flags = RATE_IN_24XX | RATE_IN_343X | DEFAULT_RATE },
88 { .div = 0 }
89};
90
91static const struct clksel_rate gfx_l3_rates[] = {
92 { .div = 1, .val = 1, .flags = RATE_IN_24XX | RATE_IN_343X },
93 { .div = 2, .val = 2, .flags = RATE_IN_24XX | RATE_IN_343X | DEFAULT_RATE },
94 { .div = 3, .val = 3, .flags = RATE_IN_243X | RATE_IN_343X },
95 { .div = 4, .val = 4, .flags = RATE_IN_243X | RATE_IN_343X },
96 { .div = 0 }
97};
98 147
148extern const struct clkops clkops_omap3_noncore_dpll_ops;
99 149
100#endif 150#endif
diff --git a/arch/arm/mach-omap2/clock2420_data.c b/arch/arm/mach-omap2/clock2420_data.c
new file mode 100644
index 000000000000..d932b142d0b6
--- /dev/null
+++ b/arch/arm/mach-omap2/clock2420_data.c
@@ -0,0 +1,1911 @@
1/*
2 * linux/arch/arm/mach-omap2/clock2420_data.c
3 *
4 * Copyright (C) 2005-2009 Texas Instruments, Inc.
5 * Copyright (C) 2004-2010 Nokia Corporation
6 *
7 * Contacts:
8 * Richard Woodruff <r-woodruff2@ti.com>
9 * Paul Walmsley
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
14 */
15
16#include <linux/kernel.h>
17#include <linux/clk.h>
18#include <linux/list.h>
19
20#include <plat/clkdev_omap.h>
21
22#include "clock.h"
23#include "clock2xxx.h"
24#include "opp2xxx.h"
25#include "prm.h"
26#include "cm.h"
27#include "prm-regbits-24xx.h"
28#include "cm-regbits-24xx.h"
29#include "sdrc.h"
30
31#define OMAP_CM_REGADDR OMAP2420_CM_REGADDR
32
33/*
34 * 2420 clock tree.
35 *
36 * NOTE:In many cases here we are assigning a 'default' parent. In many
37 * cases the parent is selectable. The get/set parent calls will also
38 * switch sources.
39 *
40 * Many some clocks say always_enabled, but they can be auto idled for
41 * power savings. They will always be available upon clock request.
42 *
43 * Several sources are given initial rates which may be wrong, this will
44 * be fixed up in the init func.
45 *
46 * Things are broadly separated below by clock domains. It is
47 * noteworthy that most periferals have dependencies on multiple clock
48 * domains. Many get their interface clocks from the L4 domain, but get
49 * functional clocks from fixed sources or other core domain derived
50 * clocks.
51 */
52
53/* Base external input clocks */
54static struct clk func_32k_ck = {
55 .name = "func_32k_ck",
56 .ops = &clkops_null,
57 .rate = 32000,
58 .clkdm_name = "wkup_clkdm",
59};
60
61static struct clk secure_32k_ck = {
62 .name = "secure_32k_ck",
63 .ops = &clkops_null,
64 .rate = 32768,
65 .clkdm_name = "wkup_clkdm",
66};
67
68/* Typical 12/13MHz in standalone mode, will be 26Mhz in chassis mode */
69static struct clk osc_ck = { /* (*12, *13, 19.2, *26, 38.4)MHz */
70 .name = "osc_ck",
71 .ops = &clkops_oscck,
72 .clkdm_name = "wkup_clkdm",
73 .recalc = &omap2_osc_clk_recalc,
74};
75
76/* Without modem likely 12MHz, with modem likely 13MHz */
77static struct clk sys_ck = { /* (*12, *13, 19.2, 26, 38.4)MHz */
78 .name = "sys_ck", /* ~ ref_clk also */
79 .ops = &clkops_null,
80 .parent = &osc_ck,
81 .clkdm_name = "wkup_clkdm",
82 .recalc = &omap2xxx_sys_clk_recalc,
83};
84
85static struct clk alt_ck = { /* Typical 54M or 48M, may not exist */
86 .name = "alt_ck",
87 .ops = &clkops_null,
88 .rate = 54000000,
89 .clkdm_name = "wkup_clkdm",
90};
91
92/*
93 * Analog domain root source clocks
94 */
95
96/* dpll_ck, is broken out in to special cases through clksel */
97/* REVISIT: Rate changes on dpll_ck trigger a full set change. ...
98 * deal with this
99 */
100
101static struct dpll_data dpll_dd = {
102 .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
103 .mult_mask = OMAP24XX_DPLL_MULT_MASK,
104 .div1_mask = OMAP24XX_DPLL_DIV_MASK,
105 .clk_bypass = &sys_ck,
106 .clk_ref = &sys_ck,
107 .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
108 .enable_mask = OMAP24XX_EN_DPLL_MASK,
109 .max_multiplier = 1023,
110 .min_divider = 1,
111 .max_divider = 16,
112 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE
113};
114
115/*
116 * XXX Cannot add round_rate here yet, as this is still a composite clock,
117 * not just a DPLL
118 */
119static struct clk dpll_ck = {
120 .name = "dpll_ck",
121 .ops = &clkops_null,
122 .parent = &sys_ck, /* Can be func_32k also */
123 .dpll_data = &dpll_dd,
124 .clkdm_name = "wkup_clkdm",
125 .recalc = &omap2_dpllcore_recalc,
126 .set_rate = &omap2_reprogram_dpllcore,
127};
128
129static struct clk apll96_ck = {
130 .name = "apll96_ck",
131 .ops = &clkops_apll96,
132 .parent = &sys_ck,
133 .rate = 96000000,
134 .flags = ENABLE_ON_INIT,
135 .clkdm_name = "wkup_clkdm",
136 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
137 .enable_bit = OMAP24XX_EN_96M_PLL_SHIFT,
138};
139
140static struct clk apll54_ck = {
141 .name = "apll54_ck",
142 .ops = &clkops_apll54,
143 .parent = &sys_ck,
144 .rate = 54000000,
145 .flags = ENABLE_ON_INIT,
146 .clkdm_name = "wkup_clkdm",
147 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
148 .enable_bit = OMAP24XX_EN_54M_PLL_SHIFT,
149};
150
151/*
152 * PRCM digital base sources
153 */
154
155/* func_54m_ck */
156
157static const struct clksel_rate func_54m_apll54_rates[] = {
158 { .div = 1, .val = 0, .flags = RATE_IN_24XX | DEFAULT_RATE },
159 { .div = 0 },
160};
161
162static const struct clksel_rate func_54m_alt_rates[] = {
163 { .div = 1, .val = 1, .flags = RATE_IN_24XX | DEFAULT_RATE },
164 { .div = 0 },
165};
166
167static const struct clksel func_54m_clksel[] = {
168 { .parent = &apll54_ck, .rates = func_54m_apll54_rates, },
169 { .parent = &alt_ck, .rates = func_54m_alt_rates, },
170 { .parent = NULL },
171};
172
173static struct clk func_54m_ck = {
174 .name = "func_54m_ck",
175 .ops = &clkops_null,
176 .parent = &apll54_ck, /* can also be alt_clk */
177 .clkdm_name = "wkup_clkdm",
178 .init = &omap2_init_clksel_parent,
179 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
180 .clksel_mask = OMAP24XX_54M_SOURCE,
181 .clksel = func_54m_clksel,
182 .recalc = &omap2_clksel_recalc,
183};
184
185static struct clk core_ck = {
186 .name = "core_ck",
187 .ops = &clkops_null,
188 .parent = &dpll_ck, /* can also be 32k */
189 .clkdm_name = "wkup_clkdm",
190 .recalc = &followparent_recalc,
191};
192
193static struct clk func_96m_ck = {
194 .name = "func_96m_ck",
195 .ops = &clkops_null,
196 .parent = &apll96_ck,
197 .clkdm_name = "wkup_clkdm",
198 .recalc = &followparent_recalc,
199};
200
201/* func_48m_ck */
202
203static const struct clksel_rate func_48m_apll96_rates[] = {
204 { .div = 2, .val = 0, .flags = RATE_IN_24XX | DEFAULT_RATE },
205 { .div = 0 },
206};
207
208static const struct clksel_rate func_48m_alt_rates[] = {
209 { .div = 1, .val = 1, .flags = RATE_IN_24XX | DEFAULT_RATE },
210 { .div = 0 },
211};
212
213static const struct clksel func_48m_clksel[] = {
214 { .parent = &apll96_ck, .rates = func_48m_apll96_rates },
215 { .parent = &alt_ck, .rates = func_48m_alt_rates },
216 { .parent = NULL }
217};
218
219static struct clk func_48m_ck = {
220 .name = "func_48m_ck",
221 .ops = &clkops_null,
222 .parent = &apll96_ck, /* 96M or Alt */
223 .clkdm_name = "wkup_clkdm",
224 .init = &omap2_init_clksel_parent,
225 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
226 .clksel_mask = OMAP24XX_48M_SOURCE,
227 .clksel = func_48m_clksel,
228 .recalc = &omap2_clksel_recalc,
229 .round_rate = &omap2_clksel_round_rate,
230 .set_rate = &omap2_clksel_set_rate
231};
232
233static struct clk func_12m_ck = {
234 .name = "func_12m_ck",
235 .ops = &clkops_null,
236 .parent = &func_48m_ck,
237 .fixed_div = 4,
238 .clkdm_name = "wkup_clkdm",
239 .recalc = &omap_fixed_divisor_recalc,
240};
241
242/* Secure timer, only available in secure mode */
243static struct clk wdt1_osc_ck = {
244 .name = "ck_wdt1_osc",
245 .ops = &clkops_null, /* RMK: missing? */
246 .parent = &osc_ck,
247 .recalc = &followparent_recalc,
248};
249
250/*
251 * The common_clkout* clksel_rate structs are common to
252 * sys_clkout, sys_clkout_src, sys_clkout2, and sys_clkout2_src.
253 * sys_clkout2_* are 2420-only, so the
254 * clksel_rate flags fields are inaccurate for those clocks. This is
255 * harmless since access to those clocks are gated by the struct clk
256 * flags fields, which mark them as 2420-only.
257 */
258static const struct clksel_rate common_clkout_src_core_rates[] = {
259 { .div = 1, .val = 0, .flags = RATE_IN_24XX | DEFAULT_RATE },
260 { .div = 0 }
261};
262
263static const struct clksel_rate common_clkout_src_sys_rates[] = {
264 { .div = 1, .val = 1, .flags = RATE_IN_24XX | DEFAULT_RATE },
265 { .div = 0 }
266};
267
268static const struct clksel_rate common_clkout_src_96m_rates[] = {
269 { .div = 1, .val = 2, .flags = RATE_IN_24XX | DEFAULT_RATE },
270 { .div = 0 }
271};
272
273static const struct clksel_rate common_clkout_src_54m_rates[] = {
274 { .div = 1, .val = 3, .flags = RATE_IN_24XX | DEFAULT_RATE },
275 { .div = 0 }
276};
277
278static const struct clksel common_clkout_src_clksel[] = {
279 { .parent = &core_ck, .rates = common_clkout_src_core_rates },
280 { .parent = &sys_ck, .rates = common_clkout_src_sys_rates },
281 { .parent = &func_96m_ck, .rates = common_clkout_src_96m_rates },
282 { .parent = &func_54m_ck, .rates = common_clkout_src_54m_rates },
283 { .parent = NULL }
284};
285
286static struct clk sys_clkout_src = {
287 .name = "sys_clkout_src",
288 .ops = &clkops_omap2_dflt,
289 .parent = &func_54m_ck,
290 .clkdm_name = "wkup_clkdm",
291 .enable_reg = OMAP2420_PRCM_CLKOUT_CTRL,
292 .enable_bit = OMAP24XX_CLKOUT_EN_SHIFT,
293 .init = &omap2_init_clksel_parent,
294 .clksel_reg = OMAP2420_PRCM_CLKOUT_CTRL,
295 .clksel_mask = OMAP24XX_CLKOUT_SOURCE_MASK,
296 .clksel = common_clkout_src_clksel,
297 .recalc = &omap2_clksel_recalc,
298 .round_rate = &omap2_clksel_round_rate,
299 .set_rate = &omap2_clksel_set_rate
300};
301
302static const struct clksel_rate common_clkout_rates[] = {
303 { .div = 1, .val = 0, .flags = RATE_IN_24XX | DEFAULT_RATE },
304 { .div = 2, .val = 1, .flags = RATE_IN_24XX },
305 { .div = 4, .val = 2, .flags = RATE_IN_24XX },
306 { .div = 8, .val = 3, .flags = RATE_IN_24XX },
307 { .div = 16, .val = 4, .flags = RATE_IN_24XX },
308 { .div = 0 },
309};
310
311static const struct clksel sys_clkout_clksel[] = {
312 { .parent = &sys_clkout_src, .rates = common_clkout_rates },
313 { .parent = NULL }
314};
315
316static struct clk sys_clkout = {
317 .name = "sys_clkout",
318 .ops = &clkops_null,
319 .parent = &sys_clkout_src,
320 .clkdm_name = "wkup_clkdm",
321 .clksel_reg = OMAP2420_PRCM_CLKOUT_CTRL,
322 .clksel_mask = OMAP24XX_CLKOUT_DIV_MASK,
323 .clksel = sys_clkout_clksel,
324 .recalc = &omap2_clksel_recalc,
325 .round_rate = &omap2_clksel_round_rate,
326 .set_rate = &omap2_clksel_set_rate
327};
328
329/* In 2430, new in 2420 ES2 */
330static struct clk sys_clkout2_src = {
331 .name = "sys_clkout2_src",
332 .ops = &clkops_omap2_dflt,
333 .parent = &func_54m_ck,
334 .clkdm_name = "wkup_clkdm",
335 .enable_reg = OMAP2420_PRCM_CLKOUT_CTRL,
336 .enable_bit = OMAP2420_CLKOUT2_EN_SHIFT,
337 .init = &omap2_init_clksel_parent,
338 .clksel_reg = OMAP2420_PRCM_CLKOUT_CTRL,
339 .clksel_mask = OMAP2420_CLKOUT2_SOURCE_MASK,
340 .clksel = common_clkout_src_clksel,
341 .recalc = &omap2_clksel_recalc,
342 .round_rate = &omap2_clksel_round_rate,
343 .set_rate = &omap2_clksel_set_rate
344};
345
346static const struct clksel sys_clkout2_clksel[] = {
347 { .parent = &sys_clkout2_src, .rates = common_clkout_rates },
348 { .parent = NULL }
349};
350
351/* In 2430, new in 2420 ES2 */
352static struct clk sys_clkout2 = {
353 .name = "sys_clkout2",
354 .ops = &clkops_null,
355 .parent = &sys_clkout2_src,
356 .clkdm_name = "wkup_clkdm",
357 .clksel_reg = OMAP2420_PRCM_CLKOUT_CTRL,
358 .clksel_mask = OMAP2420_CLKOUT2_DIV_MASK,
359 .clksel = sys_clkout2_clksel,
360 .recalc = &omap2_clksel_recalc,
361 .round_rate = &omap2_clksel_round_rate,
362 .set_rate = &omap2_clksel_set_rate
363};
364
365static struct clk emul_ck = {
366 .name = "emul_ck",
367 .ops = &clkops_omap2_dflt,
368 .parent = &func_54m_ck,
369 .clkdm_name = "wkup_clkdm",
370 .enable_reg = OMAP2420_PRCM_CLKEMUL_CTRL,
371 .enable_bit = OMAP24XX_EMULATION_EN_SHIFT,
372 .recalc = &followparent_recalc,
373
374};
375
376/*
377 * MPU clock domain
378 * Clocks:
379 * MPU_FCLK, MPU_ICLK
380 * INT_M_FCLK, INT_M_I_CLK
381 *
382 * - Individual clocks are hardware managed.
383 * - Base divider comes from: CM_CLKSEL_MPU
384 *
385 */
386static const struct clksel_rate mpu_core_rates[] = {
387 { .div = 1, .val = 1, .flags = RATE_IN_24XX | DEFAULT_RATE },
388 { .div = 2, .val = 2, .flags = RATE_IN_24XX },
389 { .div = 4, .val = 4, .flags = RATE_IN_242X },
390 { .div = 6, .val = 6, .flags = RATE_IN_242X },
391 { .div = 8, .val = 8, .flags = RATE_IN_242X },
392 { .div = 0 },
393};
394
395static const struct clksel mpu_clksel[] = {
396 { .parent = &core_ck, .rates = mpu_core_rates },
397 { .parent = NULL }
398};
399
400static struct clk mpu_ck = { /* Control cpu */
401 .name = "mpu_ck",
402 .ops = &clkops_null,
403 .parent = &core_ck,
404 .clkdm_name = "mpu_clkdm",
405 .init = &omap2_init_clksel_parent,
406 .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, CM_CLKSEL),
407 .clksel_mask = OMAP24XX_CLKSEL_MPU_MASK,
408 .clksel = mpu_clksel,
409 .recalc = &omap2_clksel_recalc,
410};
411
412/*
413 * DSP (2420-UMA+IVA1) clock domain
414 * Clocks:
415 * 2420: UMA_FCLK, UMA_ICLK, IVA_MPU, IVA_COP
416 *
417 * Won't be too specific here. The core clock comes into this block
418 * it is divided then tee'ed. One branch goes directly to xyz enable
419 * controls. The other branch gets further divided by 2 then possibly
420 * routed into a synchronizer and out of clocks abc.
421 */
422static const struct clksel_rate dsp_fck_core_rates[] = {
423 { .div = 1, .val = 1, .flags = RATE_IN_24XX | DEFAULT_RATE },
424 { .div = 2, .val = 2, .flags = RATE_IN_24XX },
425 { .div = 3, .val = 3, .flags = RATE_IN_24XX },
426 { .div = 4, .val = 4, .flags = RATE_IN_24XX },
427 { .div = 6, .val = 6, .flags = RATE_IN_242X },
428 { .div = 8, .val = 8, .flags = RATE_IN_242X },
429 { .div = 12, .val = 12, .flags = RATE_IN_242X },
430 { .div = 0 },
431};
432
433static const struct clksel dsp_fck_clksel[] = {
434 { .parent = &core_ck, .rates = dsp_fck_core_rates },
435 { .parent = NULL }
436};
437
438static struct clk dsp_fck = {
439 .name = "dsp_fck",
440 .ops = &clkops_omap2_dflt_wait,
441 .parent = &core_ck,
442 .clkdm_name = "dsp_clkdm",
443 .enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
444 .enable_bit = OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT,
445 .clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),
446 .clksel_mask = OMAP24XX_CLKSEL_DSP_MASK,
447 .clksel = dsp_fck_clksel,
448 .recalc = &omap2_clksel_recalc,
449};
450
451/* DSP interface clock */
452static const struct clksel_rate dsp_irate_ick_rates[] = {
453 { .div = 1, .val = 1, .flags = RATE_IN_24XX | DEFAULT_RATE },
454 { .div = 2, .val = 2, .flags = RATE_IN_24XX },
455 { .div = 0 },
456};
457
458static const struct clksel dsp_irate_ick_clksel[] = {
459 { .parent = &dsp_fck, .rates = dsp_irate_ick_rates },
460 { .parent = NULL }
461};
462
463/* This clock does not exist as such in the TRM. */
464static struct clk dsp_irate_ick = {
465 .name = "dsp_irate_ick",
466 .ops = &clkops_null,
467 .parent = &dsp_fck,
468 .clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),
469 .clksel_mask = OMAP24XX_CLKSEL_DSP_IF_MASK,
470 .clksel = dsp_irate_ick_clksel,
471 .recalc = &omap2_clksel_recalc,
472};
473
474/* 2420 only */
475static struct clk dsp_ick = {
476 .name = "dsp_ick", /* apparently ipi and isp */
477 .ops = &clkops_omap2_dflt_wait,
478 .parent = &dsp_irate_ick,
479 .enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_ICLKEN),
480 .enable_bit = OMAP2420_EN_DSP_IPI_SHIFT, /* for ipi */
481};
482
483/*
484 * The IVA1 is an ARM7 core on the 2420 that has nothing to do with
485 * the C54x, but which is contained in the DSP powerdomain. Does not
486 * exist on later OMAPs.
487 */
488static struct clk iva1_ifck = {
489 .name = "iva1_ifck",
490 .ops = &clkops_omap2_dflt_wait,
491 .parent = &core_ck,
492 .clkdm_name = "iva1_clkdm",
493 .enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
494 .enable_bit = OMAP2420_EN_IVA_COP_SHIFT,
495 .clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),
496 .clksel_mask = OMAP2420_CLKSEL_IVA_MASK,
497 .clksel = dsp_fck_clksel,
498 .recalc = &omap2_clksel_recalc,
499};
500
501/* IVA1 mpu/int/i/f clocks are /2 of parent */
502static struct clk iva1_mpu_int_ifck = {
503 .name = "iva1_mpu_int_ifck",
504 .ops = &clkops_omap2_dflt_wait,
505 .parent = &iva1_ifck,
506 .clkdm_name = "iva1_clkdm",
507 .enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
508 .enable_bit = OMAP2420_EN_IVA_MPU_SHIFT,
509 .fixed_div = 2,
510 .recalc = &omap_fixed_divisor_recalc,
511};
512
513/*
514 * L3 clock domain
515 * L3 clocks are used for both interface and functional clocks to
516 * multiple entities. Some of these clocks are completely managed
517 * by hardware, and some others allow software control. Hardware
518 * managed ones general are based on directly CLK_REQ signals and
519 * various auto idle settings. The functional spec sets many of these
520 * as 'tie-high' for their enables.
521 *
522 * I-CLOCKS:
523 * L3-Interconnect, SMS, GPMC, SDRC, OCM_RAM, OCM_ROM, SDMA
524 * CAM, HS-USB.
525 * F-CLOCK
526 * SSI.
527 *
528 * GPMC memories and SDRC have timing and clock sensitive registers which
529 * may very well need notification when the clock changes. Currently for low
530 * operating points, these are taken care of in sleep.S.
531 */
532static const struct clksel_rate core_l3_core_rates[] = {
533 { .div = 1, .val = 1, .flags = RATE_IN_24XX },
534 { .div = 2, .val = 2, .flags = RATE_IN_242X },
535 { .div = 4, .val = 4, .flags = RATE_IN_24XX | DEFAULT_RATE },
536 { .div = 6, .val = 6, .flags = RATE_IN_24XX },
537 { .div = 8, .val = 8, .flags = RATE_IN_242X },
538 { .div = 12, .val = 12, .flags = RATE_IN_242X },
539 { .div = 16, .val = 16, .flags = RATE_IN_242X },
540 { .div = 0 }
541};
542
543static const struct clksel core_l3_clksel[] = {
544 { .parent = &core_ck, .rates = core_l3_core_rates },
545 { .parent = NULL }
546};
547
548static struct clk core_l3_ck = { /* Used for ick and fck, interconnect */
549 .name = "core_l3_ck",
550 .ops = &clkops_null,
551 .parent = &core_ck,
552 .clkdm_name = "core_l3_clkdm",
553 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
554 .clksel_mask = OMAP24XX_CLKSEL_L3_MASK,
555 .clksel = core_l3_clksel,
556 .recalc = &omap2_clksel_recalc,
557};
558
559/* usb_l4_ick */
560static const struct clksel_rate usb_l4_ick_core_l3_rates[] = {
561 { .div = 1, .val = 1, .flags = RATE_IN_24XX },
562 { .div = 2, .val = 2, .flags = RATE_IN_24XX | DEFAULT_RATE },
563 { .div = 4, .val = 4, .flags = RATE_IN_24XX },
564 { .div = 0 }
565};
566
567static const struct clksel usb_l4_ick_clksel[] = {
568 { .parent = &core_l3_ck, .rates = usb_l4_ick_core_l3_rates },
569 { .parent = NULL },
570};
571
572/* It is unclear from TRM whether usb_l4_ick is really in L3 or L4 clkdm */
573static struct clk usb_l4_ick = { /* FS-USB interface clock */
574 .name = "usb_l4_ick",
575 .ops = &clkops_omap2_dflt_wait,
576 .parent = &core_l3_ck,
577 .clkdm_name = "core_l4_clkdm",
578 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
579 .enable_bit = OMAP24XX_EN_USB_SHIFT,
580 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
581 .clksel_mask = OMAP24XX_CLKSEL_USB_MASK,
582 .clksel = usb_l4_ick_clksel,
583 .recalc = &omap2_clksel_recalc,
584};
585
586/*
587 * L4 clock management domain
588 *
589 * This domain contains lots of interface clocks from the L4 interface, some
590 * functional clocks. Fixed APLL functional source clocks are managed in
591 * this domain.
592 */
593static const struct clksel_rate l4_core_l3_rates[] = {
594 { .div = 1, .val = 1, .flags = RATE_IN_24XX | DEFAULT_RATE },
595 { .div = 2, .val = 2, .flags = RATE_IN_24XX },
596 { .div = 0 }
597};
598
599static const struct clksel l4_clksel[] = {
600 { .parent = &core_l3_ck, .rates = l4_core_l3_rates },
601 { .parent = NULL }
602};
603
604static struct clk l4_ck = { /* used both as an ick and fck */
605 .name = "l4_ck",
606 .ops = &clkops_null,
607 .parent = &core_l3_ck,
608 .clkdm_name = "core_l4_clkdm",
609 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
610 .clksel_mask = OMAP24XX_CLKSEL_L4_MASK,
611 .clksel = l4_clksel,
612 .recalc = &omap2_clksel_recalc,
613};
614
615/*
616 * SSI is in L3 management domain, its direct parent is core not l3,
617 * many core power domain entities are grouped into the L3 clock
618 * domain.
619 * SSI_SSR_FCLK, SSI_SST_FCLK, SSI_L4_ICLK
620 *
621 * ssr = core/1/2/3/4/5, sst = 1/2 ssr.
622 */
623static const struct clksel_rate ssi_ssr_sst_fck_core_rates[] = {
624 { .div = 1, .val = 1, .flags = RATE_IN_24XX },
625 { .div = 2, .val = 2, .flags = RATE_IN_24XX | DEFAULT_RATE },
626 { .div = 3, .val = 3, .flags = RATE_IN_24XX },
627 { .div = 4, .val = 4, .flags = RATE_IN_24XX },
628 { .div = 6, .val = 6, .flags = RATE_IN_242X },
629 { .div = 8, .val = 8, .flags = RATE_IN_242X },
630 { .div = 0 }
631};
632
633static const struct clksel ssi_ssr_sst_fck_clksel[] = {
634 { .parent = &core_ck, .rates = ssi_ssr_sst_fck_core_rates },
635 { .parent = NULL }
636};
637
638static struct clk ssi_ssr_sst_fck = {
639 .name = "ssi_fck",
640 .ops = &clkops_omap2_dflt_wait,
641 .parent = &core_ck,
642 .clkdm_name = "core_l3_clkdm",
643 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
644 .enable_bit = OMAP24XX_EN_SSI_SHIFT,
645 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
646 .clksel_mask = OMAP24XX_CLKSEL_SSI_MASK,
647 .clksel = ssi_ssr_sst_fck_clksel,
648 .recalc = &omap2_clksel_recalc,
649};
650
651/*
652 * Presumably this is the same as SSI_ICLK.
653 * TRM contradicts itself on what clockdomain SSI_ICLK is in
654 */
655static struct clk ssi_l4_ick = {
656 .name = "ssi_l4_ick",
657 .ops = &clkops_omap2_dflt_wait,
658 .parent = &l4_ck,
659 .clkdm_name = "core_l4_clkdm",
660 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
661 .enable_bit = OMAP24XX_EN_SSI_SHIFT,
662 .recalc = &followparent_recalc,
663};
664
665
666/*
667 * GFX clock domain
668 * Clocks:
669 * GFX_FCLK, GFX_ICLK
670 * GFX_CG1(2d), GFX_CG2(3d)
671 *
672 * GFX_FCLK runs from L3, and is divided by (1,2,3,4)
673 * The 2d and 3d clocks run at a hardware determined
674 * divided value of fclk.
675 *
676 */
677
678/* This clksel struct is shared between gfx_3d_fck and gfx_2d_fck */
679static const struct clksel gfx_fck_clksel[] = {
680 { .parent = &core_l3_ck, .rates = gfx_l3_rates },
681 { .parent = NULL },
682};
683
684static struct clk gfx_3d_fck = {
685 .name = "gfx_3d_fck",
686 .ops = &clkops_omap2_dflt_wait,
687 .parent = &core_l3_ck,
688 .clkdm_name = "gfx_clkdm",
689 .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
690 .enable_bit = OMAP24XX_EN_3D_SHIFT,
691 .clksel_reg = OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),
692 .clksel_mask = OMAP_CLKSEL_GFX_MASK,
693 .clksel = gfx_fck_clksel,
694 .recalc = &omap2_clksel_recalc,
695 .round_rate = &omap2_clksel_round_rate,
696 .set_rate = &omap2_clksel_set_rate
697};
698
699static struct clk gfx_2d_fck = {
700 .name = "gfx_2d_fck",
701 .ops = &clkops_omap2_dflt_wait,
702 .parent = &core_l3_ck,
703 .clkdm_name = "gfx_clkdm",
704 .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
705 .enable_bit = OMAP24XX_EN_2D_SHIFT,
706 .clksel_reg = OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),
707 .clksel_mask = OMAP_CLKSEL_GFX_MASK,
708 .clksel = gfx_fck_clksel,
709 .recalc = &omap2_clksel_recalc,
710};
711
712static struct clk gfx_ick = {
713 .name = "gfx_ick", /* From l3 */
714 .ops = &clkops_omap2_dflt_wait,
715 .parent = &core_l3_ck,
716 .clkdm_name = "gfx_clkdm",
717 .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_ICLKEN),
718 .enable_bit = OMAP_EN_GFX_SHIFT,
719 .recalc = &followparent_recalc,
720};
721
722/*
723 * DSS clock domain
724 * CLOCKs:
725 * DSS_L4_ICLK, DSS_L3_ICLK,
726 * DSS_CLK1, DSS_CLK2, DSS_54MHz_CLK
727 *
728 * DSS is both initiator and target.
729 */
730/* XXX Add RATE_NOT_VALIDATED */
731
732static const struct clksel_rate dss1_fck_sys_rates[] = {
733 { .div = 1, .val = 0, .flags = RATE_IN_24XX | DEFAULT_RATE },
734 { .div = 0 }
735};
736
737static const struct clksel_rate dss1_fck_core_rates[] = {
738 { .div = 1, .val = 1, .flags = RATE_IN_24XX },
739 { .div = 2, .val = 2, .flags = RATE_IN_24XX },
740 { .div = 3, .val = 3, .flags = RATE_IN_24XX },
741 { .div = 4, .val = 4, .flags = RATE_IN_24XX },
742 { .div = 5, .val = 5, .flags = RATE_IN_24XX },
743 { .div = 6, .val = 6, .flags = RATE_IN_24XX },
744 { .div = 8, .val = 8, .flags = RATE_IN_24XX },
745 { .div = 9, .val = 9, .flags = RATE_IN_24XX },
746 { .div = 12, .val = 12, .flags = RATE_IN_24XX },
747 { .div = 16, .val = 16, .flags = RATE_IN_24XX | DEFAULT_RATE },
748 { .div = 0 }
749};
750
751static const struct clksel dss1_fck_clksel[] = {
752 { .parent = &sys_ck, .rates = dss1_fck_sys_rates },
753 { .parent = &core_ck, .rates = dss1_fck_core_rates },
754 { .parent = NULL },
755};
756
757static struct clk dss_ick = { /* Enables both L3,L4 ICLK's */
758 .name = "dss_ick",
759 .ops = &clkops_omap2_dflt,
760 .parent = &l4_ck, /* really both l3 and l4 */
761 .clkdm_name = "dss_clkdm",
762 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
763 .enable_bit = OMAP24XX_EN_DSS1_SHIFT,
764 .recalc = &followparent_recalc,
765};
766
767static struct clk dss1_fck = {
768 .name = "dss1_fck",
769 .ops = &clkops_omap2_dflt,
770 .parent = &core_ck, /* Core or sys */
771 .clkdm_name = "dss_clkdm",
772 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
773 .enable_bit = OMAP24XX_EN_DSS1_SHIFT,
774 .init = &omap2_init_clksel_parent,
775 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
776 .clksel_mask = OMAP24XX_CLKSEL_DSS1_MASK,
777 .clksel = dss1_fck_clksel,
778 .recalc = &omap2_clksel_recalc,
779};
780
781static const struct clksel_rate dss2_fck_sys_rates[] = {
782 { .div = 1, .val = 0, .flags = RATE_IN_24XX | DEFAULT_RATE },
783 { .div = 0 }
784};
785
786static const struct clksel_rate dss2_fck_48m_rates[] = {
787 { .div = 1, .val = 1, .flags = RATE_IN_24XX | DEFAULT_RATE },
788 { .div = 0 }
789};
790
791static const struct clksel dss2_fck_clksel[] = {
792 { .parent = &sys_ck, .rates = dss2_fck_sys_rates },
793 { .parent = &func_48m_ck, .rates = dss2_fck_48m_rates },
794 { .parent = NULL }
795};
796
797static struct clk dss2_fck = { /* Alt clk used in power management */
798 .name = "dss2_fck",
799 .ops = &clkops_omap2_dflt,
800 .parent = &sys_ck, /* fixed at sys_ck or 48MHz */
801 .clkdm_name = "dss_clkdm",
802 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
803 .enable_bit = OMAP24XX_EN_DSS2_SHIFT,
804 .init = &omap2_init_clksel_parent,
805 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
806 .clksel_mask = OMAP24XX_CLKSEL_DSS2_MASK,
807 .clksel = dss2_fck_clksel,
808 .recalc = &followparent_recalc,
809};
810
811static struct clk dss_54m_fck = { /* Alt clk used in power management */
812 .name = "dss_54m_fck", /* 54m tv clk */
813 .ops = &clkops_omap2_dflt_wait,
814 .parent = &func_54m_ck,
815 .clkdm_name = "dss_clkdm",
816 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
817 .enable_bit = OMAP24XX_EN_TV_SHIFT,
818 .recalc = &followparent_recalc,
819};
820
821/*
822 * CORE power domain ICLK & FCLK defines.
823 * Many of the these can have more than one possible parent. Entries
824 * here will likely have an L4 interface parent, and may have multiple
825 * functional clock parents.
826 */
827static const struct clksel_rate gpt_alt_rates[] = {
828 { .div = 1, .val = 2, .flags = RATE_IN_24XX | DEFAULT_RATE },
829 { .div = 0 }
830};
831
832static const struct clksel omap24xx_gpt_clksel[] = {
833 { .parent = &func_32k_ck, .rates = gpt_32k_rates },
834 { .parent = &sys_ck, .rates = gpt_sys_rates },
835 { .parent = &alt_ck, .rates = gpt_alt_rates },
836 { .parent = NULL },
837};
838
839static struct clk gpt1_ick = {
840 .name = "gpt1_ick",
841 .ops = &clkops_omap2_dflt_wait,
842 .parent = &l4_ck,
843 .clkdm_name = "core_l4_clkdm",
844 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
845 .enable_bit = OMAP24XX_EN_GPT1_SHIFT,
846 .recalc = &followparent_recalc,
847};
848
849static struct clk gpt1_fck = {
850 .name = "gpt1_fck",
851 .ops = &clkops_omap2_dflt_wait,
852 .parent = &func_32k_ck,
853 .clkdm_name = "core_l4_clkdm",
854 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
855 .enable_bit = OMAP24XX_EN_GPT1_SHIFT,
856 .init = &omap2_init_clksel_parent,
857 .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL1),
858 .clksel_mask = OMAP24XX_CLKSEL_GPT1_MASK,
859 .clksel = omap24xx_gpt_clksel,
860 .recalc = &omap2_clksel_recalc,
861 .round_rate = &omap2_clksel_round_rate,
862 .set_rate = &omap2_clksel_set_rate
863};
864
865static struct clk gpt2_ick = {
866 .name = "gpt2_ick",
867 .ops = &clkops_omap2_dflt_wait,
868 .parent = &l4_ck,
869 .clkdm_name = "core_l4_clkdm",
870 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
871 .enable_bit = OMAP24XX_EN_GPT2_SHIFT,
872 .recalc = &followparent_recalc,
873};
874
875static struct clk gpt2_fck = {
876 .name = "gpt2_fck",
877 .ops = &clkops_omap2_dflt_wait,
878 .parent = &func_32k_ck,
879 .clkdm_name = "core_l4_clkdm",
880 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
881 .enable_bit = OMAP24XX_EN_GPT2_SHIFT,
882 .init = &omap2_init_clksel_parent,
883 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
884 .clksel_mask = OMAP24XX_CLKSEL_GPT2_MASK,
885 .clksel = omap24xx_gpt_clksel,
886 .recalc = &omap2_clksel_recalc,
887};
888
889static struct clk gpt3_ick = {
890 .name = "gpt3_ick",
891 .ops = &clkops_omap2_dflt_wait,
892 .parent = &l4_ck,
893 .clkdm_name = "core_l4_clkdm",
894 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
895 .enable_bit = OMAP24XX_EN_GPT3_SHIFT,
896 .recalc = &followparent_recalc,
897};
898
899static struct clk gpt3_fck = {
900 .name = "gpt3_fck",
901 .ops = &clkops_omap2_dflt_wait,
902 .parent = &func_32k_ck,
903 .clkdm_name = "core_l4_clkdm",
904 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
905 .enable_bit = OMAP24XX_EN_GPT3_SHIFT,
906 .init = &omap2_init_clksel_parent,
907 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
908 .clksel_mask = OMAP24XX_CLKSEL_GPT3_MASK,
909 .clksel = omap24xx_gpt_clksel,
910 .recalc = &omap2_clksel_recalc,
911};
912
913static struct clk gpt4_ick = {
914 .name = "gpt4_ick",
915 .ops = &clkops_omap2_dflt_wait,
916 .parent = &l4_ck,
917 .clkdm_name = "core_l4_clkdm",
918 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
919 .enable_bit = OMAP24XX_EN_GPT4_SHIFT,
920 .recalc = &followparent_recalc,
921};
922
923static struct clk gpt4_fck = {
924 .name = "gpt4_fck",
925 .ops = &clkops_omap2_dflt_wait,
926 .parent = &func_32k_ck,
927 .clkdm_name = "core_l4_clkdm",
928 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
929 .enable_bit = OMAP24XX_EN_GPT4_SHIFT,
930 .init = &omap2_init_clksel_parent,
931 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
932 .clksel_mask = OMAP24XX_CLKSEL_GPT4_MASK,
933 .clksel = omap24xx_gpt_clksel,
934 .recalc = &omap2_clksel_recalc,
935};
936
937static struct clk gpt5_ick = {
938 .name = "gpt5_ick",
939 .ops = &clkops_omap2_dflt_wait,
940 .parent = &l4_ck,
941 .clkdm_name = "core_l4_clkdm",
942 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
943 .enable_bit = OMAP24XX_EN_GPT5_SHIFT,
944 .recalc = &followparent_recalc,
945};
946
947static struct clk gpt5_fck = {
948 .name = "gpt5_fck",
949 .ops = &clkops_omap2_dflt_wait,
950 .parent = &func_32k_ck,
951 .clkdm_name = "core_l4_clkdm",
952 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
953 .enable_bit = OMAP24XX_EN_GPT5_SHIFT,
954 .init = &omap2_init_clksel_parent,
955 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
956 .clksel_mask = OMAP24XX_CLKSEL_GPT5_MASK,
957 .clksel = omap24xx_gpt_clksel,
958 .recalc = &omap2_clksel_recalc,
959};
960
961static struct clk gpt6_ick = {
962 .name = "gpt6_ick",
963 .ops = &clkops_omap2_dflt_wait,
964 .parent = &l4_ck,
965 .clkdm_name = "core_l4_clkdm",
966 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
967 .enable_bit = OMAP24XX_EN_GPT6_SHIFT,
968 .recalc = &followparent_recalc,
969};
970
971static struct clk gpt6_fck = {
972 .name = "gpt6_fck",
973 .ops = &clkops_omap2_dflt_wait,
974 .parent = &func_32k_ck,
975 .clkdm_name = "core_l4_clkdm",
976 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
977 .enable_bit = OMAP24XX_EN_GPT6_SHIFT,
978 .init = &omap2_init_clksel_parent,
979 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
980 .clksel_mask = OMAP24XX_CLKSEL_GPT6_MASK,
981 .clksel = omap24xx_gpt_clksel,
982 .recalc = &omap2_clksel_recalc,
983};
984
985static struct clk gpt7_ick = {
986 .name = "gpt7_ick",
987 .ops = &clkops_omap2_dflt_wait,
988 .parent = &l4_ck,
989 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
990 .enable_bit = OMAP24XX_EN_GPT7_SHIFT,
991 .recalc = &followparent_recalc,
992};
993
994static struct clk gpt7_fck = {
995 .name = "gpt7_fck",
996 .ops = &clkops_omap2_dflt_wait,
997 .parent = &func_32k_ck,
998 .clkdm_name = "core_l4_clkdm",
999 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1000 .enable_bit = OMAP24XX_EN_GPT7_SHIFT,
1001 .init = &omap2_init_clksel_parent,
1002 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1003 .clksel_mask = OMAP24XX_CLKSEL_GPT7_MASK,
1004 .clksel = omap24xx_gpt_clksel,
1005 .recalc = &omap2_clksel_recalc,
1006};
1007
1008static struct clk gpt8_ick = {
1009 .name = "gpt8_ick",
1010 .ops = &clkops_omap2_dflt_wait,
1011 .parent = &l4_ck,
1012 .clkdm_name = "core_l4_clkdm",
1013 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1014 .enable_bit = OMAP24XX_EN_GPT8_SHIFT,
1015 .recalc = &followparent_recalc,
1016};
1017
1018static struct clk gpt8_fck = {
1019 .name = "gpt8_fck",
1020 .ops = &clkops_omap2_dflt_wait,
1021 .parent = &func_32k_ck,
1022 .clkdm_name = "core_l4_clkdm",
1023 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1024 .enable_bit = OMAP24XX_EN_GPT8_SHIFT,
1025 .init = &omap2_init_clksel_parent,
1026 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1027 .clksel_mask = OMAP24XX_CLKSEL_GPT8_MASK,
1028 .clksel = omap24xx_gpt_clksel,
1029 .recalc = &omap2_clksel_recalc,
1030};
1031
1032static struct clk gpt9_ick = {
1033 .name = "gpt9_ick",
1034 .ops = &clkops_omap2_dflt_wait,
1035 .parent = &l4_ck,
1036 .clkdm_name = "core_l4_clkdm",
1037 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1038 .enable_bit = OMAP24XX_EN_GPT9_SHIFT,
1039 .recalc = &followparent_recalc,
1040};
1041
1042static struct clk gpt9_fck = {
1043 .name = "gpt9_fck",
1044 .ops = &clkops_omap2_dflt_wait,
1045 .parent = &func_32k_ck,
1046 .clkdm_name = "core_l4_clkdm",
1047 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1048 .enable_bit = OMAP24XX_EN_GPT9_SHIFT,
1049 .init = &omap2_init_clksel_parent,
1050 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1051 .clksel_mask = OMAP24XX_CLKSEL_GPT9_MASK,
1052 .clksel = omap24xx_gpt_clksel,
1053 .recalc = &omap2_clksel_recalc,
1054};
1055
1056static struct clk gpt10_ick = {
1057 .name = "gpt10_ick",
1058 .ops = &clkops_omap2_dflt_wait,
1059 .parent = &l4_ck,
1060 .clkdm_name = "core_l4_clkdm",
1061 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1062 .enable_bit = OMAP24XX_EN_GPT10_SHIFT,
1063 .recalc = &followparent_recalc,
1064};
1065
1066static struct clk gpt10_fck = {
1067 .name = "gpt10_fck",
1068 .ops = &clkops_omap2_dflt_wait,
1069 .parent = &func_32k_ck,
1070 .clkdm_name = "core_l4_clkdm",
1071 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1072 .enable_bit = OMAP24XX_EN_GPT10_SHIFT,
1073 .init = &omap2_init_clksel_parent,
1074 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1075 .clksel_mask = OMAP24XX_CLKSEL_GPT10_MASK,
1076 .clksel = omap24xx_gpt_clksel,
1077 .recalc = &omap2_clksel_recalc,
1078};
1079
1080static struct clk gpt11_ick = {
1081 .name = "gpt11_ick",
1082 .ops = &clkops_omap2_dflt_wait,
1083 .parent = &l4_ck,
1084 .clkdm_name = "core_l4_clkdm",
1085 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1086 .enable_bit = OMAP24XX_EN_GPT11_SHIFT,
1087 .recalc = &followparent_recalc,
1088};
1089
1090static struct clk gpt11_fck = {
1091 .name = "gpt11_fck",
1092 .ops = &clkops_omap2_dflt_wait,
1093 .parent = &func_32k_ck,
1094 .clkdm_name = "core_l4_clkdm",
1095 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1096 .enable_bit = OMAP24XX_EN_GPT11_SHIFT,
1097 .init = &omap2_init_clksel_parent,
1098 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1099 .clksel_mask = OMAP24XX_CLKSEL_GPT11_MASK,
1100 .clksel = omap24xx_gpt_clksel,
1101 .recalc = &omap2_clksel_recalc,
1102};
1103
1104static struct clk gpt12_ick = {
1105 .name = "gpt12_ick",
1106 .ops = &clkops_omap2_dflt_wait,
1107 .parent = &l4_ck,
1108 .clkdm_name = "core_l4_clkdm",
1109 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1110 .enable_bit = OMAP24XX_EN_GPT12_SHIFT,
1111 .recalc = &followparent_recalc,
1112};
1113
1114static struct clk gpt12_fck = {
1115 .name = "gpt12_fck",
1116 .ops = &clkops_omap2_dflt_wait,
1117 .parent = &secure_32k_ck,
1118 .clkdm_name = "core_l4_clkdm",
1119 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1120 .enable_bit = OMAP24XX_EN_GPT12_SHIFT,
1121 .init = &omap2_init_clksel_parent,
1122 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),
1123 .clksel_mask = OMAP24XX_CLKSEL_GPT12_MASK,
1124 .clksel = omap24xx_gpt_clksel,
1125 .recalc = &omap2_clksel_recalc,
1126};
1127
1128static struct clk mcbsp1_ick = {
1129 .name = "mcbsp1_ick",
1130 .ops = &clkops_omap2_dflt_wait,
1131 .parent = &l4_ck,
1132 .clkdm_name = "core_l4_clkdm",
1133 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1134 .enable_bit = OMAP24XX_EN_MCBSP1_SHIFT,
1135 .recalc = &followparent_recalc,
1136};
1137
1138static struct clk mcbsp1_fck = {
1139 .name = "mcbsp1_fck",
1140 .ops = &clkops_omap2_dflt_wait,
1141 .parent = &func_96m_ck,
1142 .clkdm_name = "core_l4_clkdm",
1143 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1144 .enable_bit = OMAP24XX_EN_MCBSP1_SHIFT,
1145 .recalc = &followparent_recalc,
1146};
1147
1148static struct clk mcbsp2_ick = {
1149 .name = "mcbsp2_ick",
1150 .ops = &clkops_omap2_dflt_wait,
1151 .parent = &l4_ck,
1152 .clkdm_name = "core_l4_clkdm",
1153 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1154 .enable_bit = OMAP24XX_EN_MCBSP2_SHIFT,
1155 .recalc = &followparent_recalc,
1156};
1157
1158static struct clk mcbsp2_fck = {
1159 .name = "mcbsp2_fck",
1160 .ops = &clkops_omap2_dflt_wait,
1161 .parent = &func_96m_ck,
1162 .clkdm_name = "core_l4_clkdm",
1163 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1164 .enable_bit = OMAP24XX_EN_MCBSP2_SHIFT,
1165 .recalc = &followparent_recalc,
1166};
1167
1168static struct clk mcspi1_ick = {
1169 .name = "mcspi1_ick",
1170 .ops = &clkops_omap2_dflt_wait,
1171 .parent = &l4_ck,
1172 .clkdm_name = "core_l4_clkdm",
1173 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1174 .enable_bit = OMAP24XX_EN_MCSPI1_SHIFT,
1175 .recalc = &followparent_recalc,
1176};
1177
1178static struct clk mcspi1_fck = {
1179 .name = "mcspi1_fck",
1180 .ops = &clkops_omap2_dflt_wait,
1181 .parent = &func_48m_ck,
1182 .clkdm_name = "core_l4_clkdm",
1183 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1184 .enable_bit = OMAP24XX_EN_MCSPI1_SHIFT,
1185 .recalc = &followparent_recalc,
1186};
1187
1188static struct clk mcspi2_ick = {
1189 .name = "mcspi2_ick",
1190 .ops = &clkops_omap2_dflt_wait,
1191 .parent = &l4_ck,
1192 .clkdm_name = "core_l4_clkdm",
1193 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1194 .enable_bit = OMAP24XX_EN_MCSPI2_SHIFT,
1195 .recalc = &followparent_recalc,
1196};
1197
1198static struct clk mcspi2_fck = {
1199 .name = "mcspi2_fck",
1200 .ops = &clkops_omap2_dflt_wait,
1201 .parent = &func_48m_ck,
1202 .clkdm_name = "core_l4_clkdm",
1203 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1204 .enable_bit = OMAP24XX_EN_MCSPI2_SHIFT,
1205 .recalc = &followparent_recalc,
1206};
1207
1208static struct clk uart1_ick = {
1209 .name = "uart1_ick",
1210 .ops = &clkops_omap2_dflt_wait,
1211 .parent = &l4_ck,
1212 .clkdm_name = "core_l4_clkdm",
1213 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1214 .enable_bit = OMAP24XX_EN_UART1_SHIFT,
1215 .recalc = &followparent_recalc,
1216};
1217
1218static struct clk uart1_fck = {
1219 .name = "uart1_fck",
1220 .ops = &clkops_omap2_dflt_wait,
1221 .parent = &func_48m_ck,
1222 .clkdm_name = "core_l4_clkdm",
1223 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1224 .enable_bit = OMAP24XX_EN_UART1_SHIFT,
1225 .recalc = &followparent_recalc,
1226};
1227
1228static struct clk uart2_ick = {
1229 .name = "uart2_ick",
1230 .ops = &clkops_omap2_dflt_wait,
1231 .parent = &l4_ck,
1232 .clkdm_name = "core_l4_clkdm",
1233 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1234 .enable_bit = OMAP24XX_EN_UART2_SHIFT,
1235 .recalc = &followparent_recalc,
1236};
1237
1238static struct clk uart2_fck = {
1239 .name = "uart2_fck",
1240 .ops = &clkops_omap2_dflt_wait,
1241 .parent = &func_48m_ck,
1242 .clkdm_name = "core_l4_clkdm",
1243 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1244 .enable_bit = OMAP24XX_EN_UART2_SHIFT,
1245 .recalc = &followparent_recalc,
1246};
1247
1248static struct clk uart3_ick = {
1249 .name = "uart3_ick",
1250 .ops = &clkops_omap2_dflt_wait,
1251 .parent = &l4_ck,
1252 .clkdm_name = "core_l4_clkdm",
1253 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
1254 .enable_bit = OMAP24XX_EN_UART3_SHIFT,
1255 .recalc = &followparent_recalc,
1256};
1257
1258static struct clk uart3_fck = {
1259 .name = "uart3_fck",
1260 .ops = &clkops_omap2_dflt_wait,
1261 .parent = &func_48m_ck,
1262 .clkdm_name = "core_l4_clkdm",
1263 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1264 .enable_bit = OMAP24XX_EN_UART3_SHIFT,
1265 .recalc = &followparent_recalc,
1266};
1267
1268static struct clk gpios_ick = {
1269 .name = "gpios_ick",
1270 .ops = &clkops_omap2_dflt_wait,
1271 .parent = &l4_ck,
1272 .clkdm_name = "core_l4_clkdm",
1273 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
1274 .enable_bit = OMAP24XX_EN_GPIOS_SHIFT,
1275 .recalc = &followparent_recalc,
1276};
1277
1278static struct clk gpios_fck = {
1279 .name = "gpios_fck",
1280 .ops = &clkops_omap2_dflt_wait,
1281 .parent = &func_32k_ck,
1282 .clkdm_name = "wkup_clkdm",
1283 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
1284 .enable_bit = OMAP24XX_EN_GPIOS_SHIFT,
1285 .recalc = &followparent_recalc,
1286};
1287
1288static struct clk mpu_wdt_ick = {
1289 .name = "mpu_wdt_ick",
1290 .ops = &clkops_omap2_dflt_wait,
1291 .parent = &l4_ck,
1292 .clkdm_name = "core_l4_clkdm",
1293 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
1294 .enable_bit = OMAP24XX_EN_MPU_WDT_SHIFT,
1295 .recalc = &followparent_recalc,
1296};
1297
1298static struct clk mpu_wdt_fck = {
1299 .name = "mpu_wdt_fck",
1300 .ops = &clkops_omap2_dflt_wait,
1301 .parent = &func_32k_ck,
1302 .clkdm_name = "wkup_clkdm",
1303 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
1304 .enable_bit = OMAP24XX_EN_MPU_WDT_SHIFT,
1305 .recalc = &followparent_recalc,
1306};
1307
1308static struct clk sync_32k_ick = {
1309 .name = "sync_32k_ick",
1310 .ops = &clkops_omap2_dflt_wait,
1311 .parent = &l4_ck,
1312 .flags = ENABLE_ON_INIT,
1313 .clkdm_name = "core_l4_clkdm",
1314 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
1315 .enable_bit = OMAP24XX_EN_32KSYNC_SHIFT,
1316 .recalc = &followparent_recalc,
1317};
1318
1319static struct clk wdt1_ick = {
1320 .name = "wdt1_ick",
1321 .ops = &clkops_omap2_dflt_wait,
1322 .parent = &l4_ck,
1323 .clkdm_name = "core_l4_clkdm",
1324 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
1325 .enable_bit = OMAP24XX_EN_WDT1_SHIFT,
1326 .recalc = &followparent_recalc,
1327};
1328
1329static struct clk omapctrl_ick = {
1330 .name = "omapctrl_ick",
1331 .ops = &clkops_omap2_dflt_wait,
1332 .parent = &l4_ck,
1333 .flags = ENABLE_ON_INIT,
1334 .clkdm_name = "core_l4_clkdm",
1335 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
1336 .enable_bit = OMAP24XX_EN_OMAPCTRL_SHIFT,
1337 .recalc = &followparent_recalc,
1338};
1339
1340static struct clk cam_ick = {
1341 .name = "cam_ick",
1342 .ops = &clkops_omap2_dflt,
1343 .parent = &l4_ck,
1344 .clkdm_name = "core_l4_clkdm",
1345 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1346 .enable_bit = OMAP24XX_EN_CAM_SHIFT,
1347 .recalc = &followparent_recalc,
1348};
1349
1350/*
1351 * cam_fck controls both CAM_MCLK and CAM_FCLK. It should probably be
1352 * split into two separate clocks, since the parent clocks are different
1353 * and the clockdomains are also different.
1354 */
1355static struct clk cam_fck = {
1356 .name = "cam_fck",
1357 .ops = &clkops_omap2_dflt,
1358 .parent = &func_96m_ck,
1359 .clkdm_name = "core_l3_clkdm",
1360 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1361 .enable_bit = OMAP24XX_EN_CAM_SHIFT,
1362 .recalc = &followparent_recalc,
1363};
1364
1365static struct clk mailboxes_ick = {
1366 .name = "mailboxes_ick",
1367 .ops = &clkops_omap2_dflt_wait,
1368 .parent = &l4_ck,
1369 .clkdm_name = "core_l4_clkdm",
1370 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1371 .enable_bit = OMAP24XX_EN_MAILBOXES_SHIFT,
1372 .recalc = &followparent_recalc,
1373};
1374
1375static struct clk wdt4_ick = {
1376 .name = "wdt4_ick",
1377 .ops = &clkops_omap2_dflt_wait,
1378 .parent = &l4_ck,
1379 .clkdm_name = "core_l4_clkdm",
1380 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1381 .enable_bit = OMAP24XX_EN_WDT4_SHIFT,
1382 .recalc = &followparent_recalc,
1383};
1384
1385static struct clk wdt4_fck = {
1386 .name = "wdt4_fck",
1387 .ops = &clkops_omap2_dflt_wait,
1388 .parent = &func_32k_ck,
1389 .clkdm_name = "core_l4_clkdm",
1390 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1391 .enable_bit = OMAP24XX_EN_WDT4_SHIFT,
1392 .recalc = &followparent_recalc,
1393};
1394
1395static struct clk wdt3_ick = {
1396 .name = "wdt3_ick",
1397 .ops = &clkops_omap2_dflt_wait,
1398 .parent = &l4_ck,
1399 .clkdm_name = "core_l4_clkdm",
1400 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1401 .enable_bit = OMAP2420_EN_WDT3_SHIFT,
1402 .recalc = &followparent_recalc,
1403};
1404
1405static struct clk wdt3_fck = {
1406 .name = "wdt3_fck",
1407 .ops = &clkops_omap2_dflt_wait,
1408 .parent = &func_32k_ck,
1409 .clkdm_name = "core_l4_clkdm",
1410 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1411 .enable_bit = OMAP2420_EN_WDT3_SHIFT,
1412 .recalc = &followparent_recalc,
1413};
1414
1415static struct clk mspro_ick = {
1416 .name = "mspro_ick",
1417 .ops = &clkops_omap2_dflt_wait,
1418 .parent = &l4_ck,
1419 .clkdm_name = "core_l4_clkdm",
1420 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1421 .enable_bit = OMAP24XX_EN_MSPRO_SHIFT,
1422 .recalc = &followparent_recalc,
1423};
1424
1425static struct clk mspro_fck = {
1426 .name = "mspro_fck",
1427 .ops = &clkops_omap2_dflt_wait,
1428 .parent = &func_96m_ck,
1429 .clkdm_name = "core_l4_clkdm",
1430 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1431 .enable_bit = OMAP24XX_EN_MSPRO_SHIFT,
1432 .recalc = &followparent_recalc,
1433};
1434
1435static struct clk mmc_ick = {
1436 .name = "mmc_ick",
1437 .ops = &clkops_omap2_dflt_wait,
1438 .parent = &l4_ck,
1439 .clkdm_name = "core_l4_clkdm",
1440 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1441 .enable_bit = OMAP2420_EN_MMC_SHIFT,
1442 .recalc = &followparent_recalc,
1443};
1444
1445static struct clk mmc_fck = {
1446 .name = "mmc_fck",
1447 .ops = &clkops_omap2_dflt_wait,
1448 .parent = &func_96m_ck,
1449 .clkdm_name = "core_l4_clkdm",
1450 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1451 .enable_bit = OMAP2420_EN_MMC_SHIFT,
1452 .recalc = &followparent_recalc,
1453};
1454
1455static struct clk fac_ick = {
1456 .name = "fac_ick",
1457 .ops = &clkops_omap2_dflt_wait,
1458 .parent = &l4_ck,
1459 .clkdm_name = "core_l4_clkdm",
1460 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1461 .enable_bit = OMAP24XX_EN_FAC_SHIFT,
1462 .recalc = &followparent_recalc,
1463};
1464
1465static struct clk fac_fck = {
1466 .name = "fac_fck",
1467 .ops = &clkops_omap2_dflt_wait,
1468 .parent = &func_12m_ck,
1469 .clkdm_name = "core_l4_clkdm",
1470 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1471 .enable_bit = OMAP24XX_EN_FAC_SHIFT,
1472 .recalc = &followparent_recalc,
1473};
1474
1475static struct clk eac_ick = {
1476 .name = "eac_ick",
1477 .ops = &clkops_omap2_dflt_wait,
1478 .parent = &l4_ck,
1479 .clkdm_name = "core_l4_clkdm",
1480 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1481 .enable_bit = OMAP2420_EN_EAC_SHIFT,
1482 .recalc = &followparent_recalc,
1483};
1484
1485static struct clk eac_fck = {
1486 .name = "eac_fck",
1487 .ops = &clkops_omap2_dflt_wait,
1488 .parent = &func_96m_ck,
1489 .clkdm_name = "core_l4_clkdm",
1490 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1491 .enable_bit = OMAP2420_EN_EAC_SHIFT,
1492 .recalc = &followparent_recalc,
1493};
1494
1495static struct clk hdq_ick = {
1496 .name = "hdq_ick",
1497 .ops = &clkops_omap2_dflt_wait,
1498 .parent = &l4_ck,
1499 .clkdm_name = "core_l4_clkdm",
1500 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1501 .enable_bit = OMAP24XX_EN_HDQ_SHIFT,
1502 .recalc = &followparent_recalc,
1503};
1504
1505static struct clk hdq_fck = {
1506 .name = "hdq_fck",
1507 .ops = &clkops_omap2_dflt_wait,
1508 .parent = &func_12m_ck,
1509 .clkdm_name = "core_l4_clkdm",
1510 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1511 .enable_bit = OMAP24XX_EN_HDQ_SHIFT,
1512 .recalc = &followparent_recalc,
1513};
1514
1515static struct clk i2c2_ick = {
1516 .name = "i2c2_ick",
1517 .ops = &clkops_omap2_dflt_wait,
1518 .parent = &l4_ck,
1519 .clkdm_name = "core_l4_clkdm",
1520 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1521 .enable_bit = OMAP2420_EN_I2C2_SHIFT,
1522 .recalc = &followparent_recalc,
1523};
1524
1525static struct clk i2c2_fck = {
1526 .name = "i2c2_fck",
1527 .ops = &clkops_omap2_dflt_wait,
1528 .parent = &func_12m_ck,
1529 .clkdm_name = "core_l4_clkdm",
1530 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1531 .enable_bit = OMAP2420_EN_I2C2_SHIFT,
1532 .recalc = &followparent_recalc,
1533};
1534
1535static struct clk i2c1_ick = {
1536 .name = "i2c1_ick",
1537 .ops = &clkops_omap2_dflt_wait,
1538 .parent = &l4_ck,
1539 .clkdm_name = "core_l4_clkdm",
1540 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1541 .enable_bit = OMAP2420_EN_I2C1_SHIFT,
1542 .recalc = &followparent_recalc,
1543};
1544
1545static struct clk i2c1_fck = {
1546 .name = "i2c1_fck",
1547 .ops = &clkops_omap2_dflt_wait,
1548 .parent = &func_12m_ck,
1549 .clkdm_name = "core_l4_clkdm",
1550 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1551 .enable_bit = OMAP2420_EN_I2C1_SHIFT,
1552 .recalc = &followparent_recalc,
1553};
1554
1555static struct clk gpmc_fck = {
1556 .name = "gpmc_fck",
1557 .ops = &clkops_null, /* RMK: missing? */
1558 .parent = &core_l3_ck,
1559 .flags = ENABLE_ON_INIT,
1560 .clkdm_name = "core_l3_clkdm",
1561 .recalc = &followparent_recalc,
1562};
1563
1564static struct clk sdma_fck = {
1565 .name = "sdma_fck",
1566 .ops = &clkops_null, /* RMK: missing? */
1567 .parent = &core_l3_ck,
1568 .clkdm_name = "core_l3_clkdm",
1569 .recalc = &followparent_recalc,
1570};
1571
1572static struct clk sdma_ick = {
1573 .name = "sdma_ick",
1574 .ops = &clkops_null, /* RMK: missing? */
1575 .parent = &l4_ck,
1576 .clkdm_name = "core_l3_clkdm",
1577 .recalc = &followparent_recalc,
1578};
1579
1580static struct clk vlynq_ick = {
1581 .name = "vlynq_ick",
1582 .ops = &clkops_omap2_dflt_wait,
1583 .parent = &core_l3_ck,
1584 .clkdm_name = "core_l3_clkdm",
1585 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1586 .enable_bit = OMAP2420_EN_VLYNQ_SHIFT,
1587 .recalc = &followparent_recalc,
1588};
1589
1590static const struct clksel_rate vlynq_fck_96m_rates[] = {
1591 { .div = 1, .val = 0, .flags = RATE_IN_242X | DEFAULT_RATE },
1592 { .div = 0 }
1593};
1594
1595static const struct clksel_rate vlynq_fck_core_rates[] = {
1596 { .div = 1, .val = 1, .flags = RATE_IN_242X },
1597 { .div = 2, .val = 2, .flags = RATE_IN_242X },
1598 { .div = 3, .val = 3, .flags = RATE_IN_242X },
1599 { .div = 4, .val = 4, .flags = RATE_IN_242X },
1600 { .div = 6, .val = 6, .flags = RATE_IN_242X },
1601 { .div = 8, .val = 8, .flags = RATE_IN_242X },
1602 { .div = 9, .val = 9, .flags = RATE_IN_242X },
1603 { .div = 12, .val = 12, .flags = RATE_IN_242X },
1604 { .div = 16, .val = 16, .flags = RATE_IN_242X | DEFAULT_RATE },
1605 { .div = 18, .val = 18, .flags = RATE_IN_242X },
1606 { .div = 0 }
1607};
1608
1609static const struct clksel vlynq_fck_clksel[] = {
1610 { .parent = &func_96m_ck, .rates = vlynq_fck_96m_rates },
1611 { .parent = &core_ck, .rates = vlynq_fck_core_rates },
1612 { .parent = NULL }
1613};
1614
1615static struct clk vlynq_fck = {
1616 .name = "vlynq_fck",
1617 .ops = &clkops_omap2_dflt_wait,
1618 .parent = &func_96m_ck,
1619 .clkdm_name = "core_l3_clkdm",
1620 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1621 .enable_bit = OMAP2420_EN_VLYNQ_SHIFT,
1622 .init = &omap2_init_clksel_parent,
1623 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
1624 .clksel_mask = OMAP2420_CLKSEL_VLYNQ_MASK,
1625 .clksel = vlynq_fck_clksel,
1626 .recalc = &omap2_clksel_recalc,
1627};
1628
1629static struct clk des_ick = {
1630 .name = "des_ick",
1631 .ops = &clkops_omap2_dflt_wait,
1632 .parent = &l4_ck,
1633 .clkdm_name = "core_l4_clkdm",
1634 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
1635 .enable_bit = OMAP24XX_EN_DES_SHIFT,
1636 .recalc = &followparent_recalc,
1637};
1638
1639static struct clk sha_ick = {
1640 .name = "sha_ick",
1641 .ops = &clkops_omap2_dflt_wait,
1642 .parent = &l4_ck,
1643 .clkdm_name = "core_l4_clkdm",
1644 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
1645 .enable_bit = OMAP24XX_EN_SHA_SHIFT,
1646 .recalc = &followparent_recalc,
1647};
1648
1649static struct clk rng_ick = {
1650 .name = "rng_ick",
1651 .ops = &clkops_omap2_dflt_wait,
1652 .parent = &l4_ck,
1653 .clkdm_name = "core_l4_clkdm",
1654 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
1655 .enable_bit = OMAP24XX_EN_RNG_SHIFT,
1656 .recalc = &followparent_recalc,
1657};
1658
1659static struct clk aes_ick = {
1660 .name = "aes_ick",
1661 .ops = &clkops_omap2_dflt_wait,
1662 .parent = &l4_ck,
1663 .clkdm_name = "core_l4_clkdm",
1664 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
1665 .enable_bit = OMAP24XX_EN_AES_SHIFT,
1666 .recalc = &followparent_recalc,
1667};
1668
1669static struct clk pka_ick = {
1670 .name = "pka_ick",
1671 .ops = &clkops_omap2_dflt_wait,
1672 .parent = &l4_ck,
1673 .clkdm_name = "core_l4_clkdm",
1674 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),
1675 .enable_bit = OMAP24XX_EN_PKA_SHIFT,
1676 .recalc = &followparent_recalc,
1677};
1678
1679static struct clk usb_fck = {
1680 .name = "usb_fck",
1681 .ops = &clkops_omap2_dflt_wait,
1682 .parent = &func_48m_ck,
1683 .clkdm_name = "core_l3_clkdm",
1684 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1685 .enable_bit = OMAP24XX_EN_USB_SHIFT,
1686 .recalc = &followparent_recalc,
1687};
1688
1689/*
1690 * This clock is a composite clock which does entire set changes then
1691 * forces a rebalance. It keys on the MPU speed, but it really could
1692 * be any key speed part of a set in the rate table.
1693 *
1694 * to really change a set, you need memory table sets which get changed
1695 * in sram, pre-notifiers & post notifiers, changing the top set, without
1696 * having low level display recalc's won't work... this is why dpm notifiers
1697 * work, isr's off, walk a list of clocks already _off_ and not messing with
1698 * the bus.
1699 *
1700 * This clock should have no parent. It embodies the entire upper level
1701 * active set. A parent will mess up some of the init also.
1702 */
1703static struct clk virt_prcm_set = {
1704 .name = "virt_prcm_set",
1705 .ops = &clkops_null,
1706 .parent = &mpu_ck, /* Indexed by mpu speed, no parent */
1707 .recalc = &omap2_table_mpu_recalc, /* sets are keyed on mpu rate */
1708 .set_rate = &omap2_select_table_rate,
1709 .round_rate = &omap2_round_to_table_rate,
1710};
1711
1712
1713/*
1714 * clkdev integration
1715 */
1716
1717static struct omap_clk omap2420_clks[] = {
1718 /* external root sources */
1719 CLK(NULL, "func_32k_ck", &func_32k_ck, CK_242X),
1720 CLK(NULL, "secure_32k_ck", &secure_32k_ck, CK_242X),
1721 CLK(NULL, "osc_ck", &osc_ck, CK_242X),
1722 CLK(NULL, "sys_ck", &sys_ck, CK_242X),
1723 CLK(NULL, "alt_ck", &alt_ck, CK_242X),
1724 /* internal analog sources */
1725 CLK(NULL, "dpll_ck", &dpll_ck, CK_242X),
1726 CLK(NULL, "apll96_ck", &apll96_ck, CK_242X),
1727 CLK(NULL, "apll54_ck", &apll54_ck, CK_242X),
1728 /* internal prcm root sources */
1729 CLK(NULL, "func_54m_ck", &func_54m_ck, CK_242X),
1730 CLK(NULL, "core_ck", &core_ck, CK_242X),
1731 CLK(NULL, "func_96m_ck", &func_96m_ck, CK_242X),
1732 CLK(NULL, "func_48m_ck", &func_48m_ck, CK_242X),
1733 CLK(NULL, "func_12m_ck", &func_12m_ck, CK_242X),
1734 CLK(NULL, "ck_wdt1_osc", &wdt1_osc_ck, CK_242X),
1735 CLK(NULL, "sys_clkout_src", &sys_clkout_src, CK_242X),
1736 CLK(NULL, "sys_clkout", &sys_clkout, CK_242X),
1737 CLK(NULL, "sys_clkout2_src", &sys_clkout2_src, CK_242X),
1738 CLK(NULL, "sys_clkout2", &sys_clkout2, CK_242X),
1739 CLK(NULL, "emul_ck", &emul_ck, CK_242X),
1740 /* mpu domain clocks */
1741 CLK(NULL, "mpu_ck", &mpu_ck, CK_242X),
1742 /* dsp domain clocks */
1743 CLK(NULL, "dsp_fck", &dsp_fck, CK_242X),
1744 CLK(NULL, "dsp_irate_ick", &dsp_irate_ick, CK_242X),
1745 CLK(NULL, "dsp_ick", &dsp_ick, CK_242X),
1746 CLK(NULL, "iva1_ifck", &iva1_ifck, CK_242X),
1747 CLK(NULL, "iva1_mpu_int_ifck", &iva1_mpu_int_ifck, CK_242X),
1748 /* GFX domain clocks */
1749 CLK(NULL, "gfx_3d_fck", &gfx_3d_fck, CK_242X),
1750 CLK(NULL, "gfx_2d_fck", &gfx_2d_fck, CK_242X),
1751 CLK(NULL, "gfx_ick", &gfx_ick, CK_242X),
1752 /* DSS domain clocks */
1753 CLK("omapdss", "ick", &dss_ick, CK_242X),
1754 CLK("omapdss", "dss1_fck", &dss1_fck, CK_242X),
1755 CLK("omapdss", "dss2_fck", &dss2_fck, CK_242X),
1756 CLK("omapdss", "tv_fck", &dss_54m_fck, CK_242X),
1757 /* L3 domain clocks */
1758 CLK(NULL, "core_l3_ck", &core_l3_ck, CK_242X),
1759 CLK(NULL, "ssi_fck", &ssi_ssr_sst_fck, CK_242X),
1760 CLK(NULL, "usb_l4_ick", &usb_l4_ick, CK_242X),
1761 /* L4 domain clocks */
1762 CLK(NULL, "l4_ck", &l4_ck, CK_242X),
1763 CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_242X),
1764 /* virtual meta-group clock */
1765 CLK(NULL, "virt_prcm_set", &virt_prcm_set, CK_242X),
1766 /* general l4 interface ck, multi-parent functional clk */
1767 CLK(NULL, "gpt1_ick", &gpt1_ick, CK_242X),
1768 CLK(NULL, "gpt1_fck", &gpt1_fck, CK_242X),
1769 CLK(NULL, "gpt2_ick", &gpt2_ick, CK_242X),
1770 CLK(NULL, "gpt2_fck", &gpt2_fck, CK_242X),
1771 CLK(NULL, "gpt3_ick", &gpt3_ick, CK_242X),
1772 CLK(NULL, "gpt3_fck", &gpt3_fck, CK_242X),
1773 CLK(NULL, "gpt4_ick", &gpt4_ick, CK_242X),
1774 CLK(NULL, "gpt4_fck", &gpt4_fck, CK_242X),
1775 CLK(NULL, "gpt5_ick", &gpt5_ick, CK_242X),
1776 CLK(NULL, "gpt5_fck", &gpt5_fck, CK_242X),
1777 CLK(NULL, "gpt6_ick", &gpt6_ick, CK_242X),
1778 CLK(NULL, "gpt6_fck", &gpt6_fck, CK_242X),
1779 CLK(NULL, "gpt7_ick", &gpt7_ick, CK_242X),
1780 CLK(NULL, "gpt7_fck", &gpt7_fck, CK_242X),
1781 CLK(NULL, "gpt8_ick", &gpt8_ick, CK_242X),
1782 CLK(NULL, "gpt8_fck", &gpt8_fck, CK_242X),
1783 CLK(NULL, "gpt9_ick", &gpt9_ick, CK_242X),
1784 CLK(NULL, "gpt9_fck", &gpt9_fck, CK_242X),
1785 CLK(NULL, "gpt10_ick", &gpt10_ick, CK_242X),
1786 CLK(NULL, "gpt10_fck", &gpt10_fck, CK_242X),
1787 CLK(NULL, "gpt11_ick", &gpt11_ick, CK_242X),
1788 CLK(NULL, "gpt11_fck", &gpt11_fck, CK_242X),
1789 CLK(NULL, "gpt12_ick", &gpt12_ick, CK_242X),
1790 CLK(NULL, "gpt12_fck", &gpt12_fck, CK_242X),
1791 CLK("omap-mcbsp.1", "ick", &mcbsp1_ick, CK_242X),
1792 CLK("omap-mcbsp.1", "fck", &mcbsp1_fck, CK_242X),
1793 CLK("omap-mcbsp.2", "ick", &mcbsp2_ick, CK_242X),
1794 CLK("omap-mcbsp.2", "fck", &mcbsp2_fck, CK_242X),
1795 CLK("omap2_mcspi.1", "ick", &mcspi1_ick, CK_242X),
1796 CLK("omap2_mcspi.1", "fck", &mcspi1_fck, CK_242X),
1797 CLK("omap2_mcspi.2", "ick", &mcspi2_ick, CK_242X),
1798 CLK("omap2_mcspi.2", "fck", &mcspi2_fck, CK_242X),
1799 CLK(NULL, "uart1_ick", &uart1_ick, CK_242X),
1800 CLK(NULL, "uart1_fck", &uart1_fck, CK_242X),
1801 CLK(NULL, "uart2_ick", &uart2_ick, CK_242X),
1802 CLK(NULL, "uart2_fck", &uart2_fck, CK_242X),
1803 CLK(NULL, "uart3_ick", &uart3_ick, CK_242X),
1804 CLK(NULL, "uart3_fck", &uart3_fck, CK_242X),
1805 CLK(NULL, "gpios_ick", &gpios_ick, CK_242X),
1806 CLK(NULL, "gpios_fck", &gpios_fck, CK_242X),
1807 CLK("omap_wdt", "ick", &mpu_wdt_ick, CK_242X),
1808 CLK("omap_wdt", "fck", &mpu_wdt_fck, CK_242X),
1809 CLK(NULL, "sync_32k_ick", &sync_32k_ick, CK_242X),
1810 CLK(NULL, "wdt1_ick", &wdt1_ick, CK_242X),
1811 CLK(NULL, "omapctrl_ick", &omapctrl_ick, CK_242X),
1812 CLK("omap24xxcam", "fck", &cam_fck, CK_242X),
1813 CLK("omap24xxcam", "ick", &cam_ick, CK_242X),
1814 CLK(NULL, "mailboxes_ick", &mailboxes_ick, CK_242X),
1815 CLK(NULL, "wdt4_ick", &wdt4_ick, CK_242X),
1816 CLK(NULL, "wdt4_fck", &wdt4_fck, CK_242X),
1817 CLK(NULL, "wdt3_ick", &wdt3_ick, CK_242X),
1818 CLK(NULL, "wdt3_fck", &wdt3_fck, CK_242X),
1819 CLK(NULL, "mspro_ick", &mspro_ick, CK_242X),
1820 CLK(NULL, "mspro_fck", &mspro_fck, CK_242X),
1821 CLK("mmci-omap.0", "ick", &mmc_ick, CK_242X),
1822 CLK("mmci-omap.0", "fck", &mmc_fck, CK_242X),
1823 CLK(NULL, "fac_ick", &fac_ick, CK_242X),
1824 CLK(NULL, "fac_fck", &fac_fck, CK_242X),
1825 CLK(NULL, "eac_ick", &eac_ick, CK_242X),
1826 CLK(NULL, "eac_fck", &eac_fck, CK_242X),
1827 CLK("omap_hdq.0", "ick", &hdq_ick, CK_242X),
1828 CLK("omap_hdq.1", "fck", &hdq_fck, CK_242X),
1829 CLK("i2c_omap.1", "ick", &i2c1_ick, CK_242X),
1830 CLK("i2c_omap.1", "fck", &i2c1_fck, CK_242X),
1831 CLK("i2c_omap.2", "ick", &i2c2_ick, CK_242X),
1832 CLK("i2c_omap.2", "fck", &i2c2_fck, CK_242X),
1833 CLK(NULL, "gpmc_fck", &gpmc_fck, CK_242X),
1834 CLK(NULL, "sdma_fck", &sdma_fck, CK_242X),
1835 CLK(NULL, "sdma_ick", &sdma_ick, CK_242X),
1836 CLK(NULL, "vlynq_ick", &vlynq_ick, CK_242X),
1837 CLK(NULL, "vlynq_fck", &vlynq_fck, CK_242X),
1838 CLK(NULL, "des_ick", &des_ick, CK_242X),
1839 CLK(NULL, "sha_ick", &sha_ick, CK_242X),
1840 CLK("omap_rng", "ick", &rng_ick, CK_242X),
1841 CLK(NULL, "aes_ick", &aes_ick, CK_242X),
1842 CLK(NULL, "pka_ick", &pka_ick, CK_242X),
1843 CLK(NULL, "usb_fck", &usb_fck, CK_242X),
1844 CLK("musb_hdrc", "fck", &osc_ck, CK_242X),
1845};
1846
1847/*
1848 * init code
1849 */
1850
1851int __init omap2420_clk_init(void)
1852{
1853 const struct prcm_config *prcm;
1854 struct omap_clk *c;
1855 u32 clkrate;
1856
1857 prcm_clksrc_ctrl = OMAP2420_PRCM_CLKSRC_CTRL;
1858 cm_idlest_pll = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST);
1859 cpu_mask = RATE_IN_242X;
1860 rate_table = omap2420_rate_table;
1861
1862 clk_init(&omap2_clk_functions);
1863
1864 for (c = omap2420_clks; c < omap2420_clks + ARRAY_SIZE(omap2420_clks);
1865 c++)
1866 clk_preinit(c->lk.clk);
1867
1868 osc_ck.rate = omap2_osc_clk_recalc(&osc_ck);
1869 propagate_rate(&osc_ck);
1870 sys_ck.rate = omap2xxx_sys_clk_recalc(&sys_ck);
1871 propagate_rate(&sys_ck);
1872
1873 for (c = omap2420_clks; c < omap2420_clks + ARRAY_SIZE(omap2420_clks);
1874 c++) {
1875 clkdev_add(&c->lk);
1876 clk_register(c->lk.clk);
1877 omap2_init_clk_clkdm(c->lk.clk);
1878 }
1879
1880 /* Check the MPU rate set by bootloader */
1881 clkrate = omap2xxx_clk_get_core_rate(&dpll_ck);
1882 for (prcm = rate_table; prcm->mpu_speed; prcm++) {
1883 if (!(prcm->flags & cpu_mask))
1884 continue;
1885 if (prcm->xtal_speed != sys_ck.rate)
1886 continue;
1887 if (prcm->dpll_speed <= clkrate)
1888 break;
1889 }
1890 curr_prcm_set = prcm;
1891
1892 recalculate_root_clocks();
1893
1894 pr_info("Clocking rate (Crystal/DPLL/MPU): %ld.%01ld/%ld/%ld MHz\n",
1895 (sys_ck.rate / 1000000), (sys_ck.rate / 100000) % 10,
1896 (dpll_ck.rate / 1000000), (mpu_ck.rate / 1000000)) ;
1897
1898 /*
1899 * Only enable those clocks we will need, let the drivers
1900 * enable other clocks as necessary
1901 */
1902 clk_enable_init_clocks();
1903
1904 /* Avoid sleeping sleeping during omap2_clk_prepare_for_reboot() */
1905 vclk = clk_get(NULL, "virt_prcm_set");
1906 sclk = clk_get(NULL, "sys_ck");
1907 dclk = clk_get(NULL, "dpll_ck");
1908
1909 return 0;
1910}
1911
diff --git a/arch/arm/mach-omap2/clock2430.c b/arch/arm/mach-omap2/clock2430.c
new file mode 100644
index 000000000000..44d0cccc51a9
--- /dev/null
+++ b/arch/arm/mach-omap2/clock2430.c
@@ -0,0 +1,59 @@
1/*
2 * clock2430.c - OMAP2430-specific clock integration code
3 *
4 * Copyright (C) 2005-2008 Texas Instruments, Inc.
5 * Copyright (C) 2004-2010 Nokia Corporation
6 *
7 * Contacts:
8 * Richard Woodruff <r-woodruff2@ti.com>
9 * Paul Walmsley
10 *
11 * Based on earlier work by Tuukka Tikkanen, Tony Lindgren,
12 * Gordon McNutt and RidgeRun, Inc.
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#undef DEBUG
19
20#include <linux/kernel.h>
21#include <linux/clk.h>
22#include <linux/io.h>
23
24#include <plat/clock.h>
25
26#include "clock.h"
27#include "clock2xxx.h"
28#include "cm.h"
29#include "cm-regbits-24xx.h"
30
31/**
32 * omap2430_clk_i2chs_find_idlest - return CM_IDLEST info for 2430 I2CHS
33 * @clk: struct clk * being enabled
34 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
35 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
36 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
37 *
38 * OMAP2430 I2CHS CM_IDLEST bits are in CM_IDLEST1_CORE, but the
39 * CM_*CLKEN bits are in CM_{I,F}CLKEN2_CORE. This custom function
40 * passes back the correct CM_IDLEST register address for I2CHS
41 * modules. No return value.
42 */
43static void omap2430_clk_i2chs_find_idlest(struct clk *clk,
44 void __iomem **idlest_reg,
45 u8 *idlest_bit,
46 u8 *idlest_val)
47{
48 *idlest_reg = OMAP2430_CM_REGADDR(CORE_MOD, CM_IDLEST);
49 *idlest_bit = clk->enable_bit;
50 *idlest_val = OMAP24XX_CM_IDLEST_VAL;
51}
52
53/* 2430 I2CHS has non-standard IDLEST register */
54const struct clkops clkops_omap2430_i2chs_wait = {
55 .enable = omap2_dflt_clk_enable,
56 .disable = omap2_dflt_clk_disable,
57 .find_idlest = omap2430_clk_i2chs_find_idlest,
58 .find_companion = omap2_clk_dflt_find_companion,
59};
diff --git a/arch/arm/mach-omap2/clock24xx.h b/arch/arm/mach-omap2/clock2430_data.c
index d19cf7a7d8db..0438b6e4f51a 100644
--- a/arch/arm/mach-omap2/clock24xx.h
+++ b/arch/arm/mach-omap2/clock2430_data.c
@@ -1,8 +1,8 @@
1/* 1/*
2 * linux/arch/arm/mach-omap2/clock24xx.h 2 * linux/arch/arm/mach-omap2/clock2430_data.c
3 * 3 *
4 * Copyright (C) 2005-2008 Texas Instruments, Inc. 4 * Copyright (C) 2005-2009 Texas Instruments, Inc.
5 * Copyright (C) 2004-2008 Nokia Corporation 5 * Copyright (C) 2004-2010 Nokia Corporation
6 * 6 *
7 * Contacts: 7 * Contacts:
8 * Richard Woodruff <r-woodruff2@ti.com> 8 * Richard Woodruff <r-woodruff2@ti.com>
@@ -13,602 +13,25 @@
13 * published by the Free Software Foundation. 13 * published by the Free Software Foundation.
14 */ 14 */
15 15
16#ifndef __ARCH_ARM_MACH_OMAP2_CLOCK24XX_H 16#include <linux/kernel.h>
17#define __ARCH_ARM_MACH_OMAP2_CLOCK24XX_H 17#include <linux/clk.h>
18#include <linux/list.h>
18 19
19#include "clock.h" 20#include <plat/clkdev_omap.h>
20 21
22#include "clock.h"
23#include "clock2xxx.h"
24#include "opp2xxx.h"
21#include "prm.h" 25#include "prm.h"
22#include "cm.h" 26#include "cm.h"
23#include "prm-regbits-24xx.h" 27#include "prm-regbits-24xx.h"
24#include "cm-regbits-24xx.h" 28#include "cm-regbits-24xx.h"
25#include "sdrc.h" 29#include "sdrc.h"
26 30
27/* REVISIT: These should be set dynamically for CONFIG_MULTI_OMAP2 */
28#ifdef CONFIG_ARCH_OMAP2420
29#define OMAP_CM_REGADDR OMAP2420_CM_REGADDR
30#define OMAP24XX_PRCM_CLKOUT_CTRL OMAP2420_PRCM_CLKOUT_CTRL
31#define OMAP24XX_PRCM_CLKEMUL_CTRL OMAP2420_PRCM_CLKEMUL_CTRL
32#else
33#define OMAP_CM_REGADDR OMAP2430_CM_REGADDR 31#define OMAP_CM_REGADDR OMAP2430_CM_REGADDR
34#define OMAP24XX_PRCM_CLKOUT_CTRL OMAP2430_PRCM_CLKOUT_CTRL
35#define OMAP24XX_PRCM_CLKEMUL_CTRL OMAP2430_PRCM_CLKEMUL_CTRL
36#endif
37
38static unsigned long omap2_table_mpu_recalc(struct clk *clk);
39static int omap2_select_table_rate(struct clk *clk, unsigned long rate);
40static long omap2_round_to_table_rate(struct clk *clk, unsigned long rate);
41static unsigned long omap2_sys_clk_recalc(struct clk *clk);
42static unsigned long omap2_osc_clk_recalc(struct clk *clk);
43static unsigned long omap2_sys_clk_recalc(struct clk *clk);
44static unsigned long omap2_dpllcore_recalc(struct clk *clk);
45static int omap2_reprogram_dpllcore(struct clk *clk, unsigned long rate);
46
47/* Key dividers which make up a PRCM set. Ratio's for a PRCM are mandated.
48 * xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU,CM_CLKSEL_DSP
49 * CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL CM_CLKSEL2_PLL, CM_CLKSEL_MDM
50 */
51struct prcm_config {
52 unsigned long xtal_speed; /* crystal rate */
53 unsigned long dpll_speed; /* dpll: out*xtal*M/(N-1)table_recalc */
54 unsigned long mpu_speed; /* speed of MPU */
55 unsigned long cm_clksel_mpu; /* mpu divider */
56 unsigned long cm_clksel_dsp; /* dsp+iva1 div(2420), iva2.1(2430) */
57 unsigned long cm_clksel_gfx; /* gfx dividers */
58 unsigned long cm_clksel1_core; /* major subsystem dividers */
59 unsigned long cm_clksel1_pll; /* m,n */
60 unsigned long cm_clksel2_pll; /* dpllx1 or x2 out */
61 unsigned long cm_clksel_mdm; /* modem dividers 2430 only */
62 unsigned long base_sdrc_rfr; /* base refresh timing for a set */
63 unsigned char flags;
64};
65
66/*
67 * The OMAP2 processor can be run at several discrete 'PRCM configurations'.
68 * These configurations are characterized by voltage and speed for clocks.
69 * The device is only validated for certain combinations. One way to express
70 * these combinations is via the 'ratio's' which the clocks operate with
71 * respect to each other. These ratio sets are for a given voltage/DPLL
72 * setting. All configurations can be described by a DPLL setting and a ratio
73 * There are 3 ratio sets for the 2430 and X ratio sets for 2420.
74 *
75 * 2430 differs from 2420 in that there are no more phase synchronizers used.
76 * They both have a slightly different clock domain setup. 2420(iva1,dsp) vs
77 * 2430 (iva2.1, NOdsp, mdm)
78 */
79
80/* Core fields for cm_clksel, not ratio governed */
81#define RX_CLKSEL_DSS1 (0x10 << 8)
82#define RX_CLKSEL_DSS2 (0x0 << 13)
83#define RX_CLKSEL_SSI (0x5 << 20)
84
85/*-------------------------------------------------------------------------
86 * Voltage/DPLL ratios
87 *-------------------------------------------------------------------------*/
88
89/* 2430 Ratio's, 2430-Ratio Config 1 */
90#define R1_CLKSEL_L3 (4 << 0)
91#define R1_CLKSEL_L4 (2 << 5)
92#define R1_CLKSEL_USB (4 << 25)
93#define R1_CM_CLKSEL1_CORE_VAL R1_CLKSEL_USB | RX_CLKSEL_SSI | \
94 RX_CLKSEL_DSS2 | RX_CLKSEL_DSS1 | \
95 R1_CLKSEL_L4 | R1_CLKSEL_L3
96#define R1_CLKSEL_MPU (2 << 0)
97#define R1_CM_CLKSEL_MPU_VAL R1_CLKSEL_MPU
98#define R1_CLKSEL_DSP (2 << 0)
99#define R1_CLKSEL_DSP_IF (2 << 5)
100#define R1_CM_CLKSEL_DSP_VAL R1_CLKSEL_DSP | R1_CLKSEL_DSP_IF
101#define R1_CLKSEL_GFX (2 << 0)
102#define R1_CM_CLKSEL_GFX_VAL R1_CLKSEL_GFX
103#define R1_CLKSEL_MDM (4 << 0)
104#define R1_CM_CLKSEL_MDM_VAL R1_CLKSEL_MDM
105
106/* 2430-Ratio Config 2 */
107#define R2_CLKSEL_L3 (6 << 0)
108#define R2_CLKSEL_L4 (2 << 5)
109#define R2_CLKSEL_USB (2 << 25)
110#define R2_CM_CLKSEL1_CORE_VAL R2_CLKSEL_USB | RX_CLKSEL_SSI | \
111 RX_CLKSEL_DSS2 | RX_CLKSEL_DSS1 | \
112 R2_CLKSEL_L4 | R2_CLKSEL_L3
113#define R2_CLKSEL_MPU (2 << 0)
114#define R2_CM_CLKSEL_MPU_VAL R2_CLKSEL_MPU
115#define R2_CLKSEL_DSP (2 << 0)
116#define R2_CLKSEL_DSP_IF (3 << 5)
117#define R2_CM_CLKSEL_DSP_VAL R2_CLKSEL_DSP | R2_CLKSEL_DSP_IF
118#define R2_CLKSEL_GFX (2 << 0)
119#define R2_CM_CLKSEL_GFX_VAL R2_CLKSEL_GFX
120#define R2_CLKSEL_MDM (6 << 0)
121#define R2_CM_CLKSEL_MDM_VAL R2_CLKSEL_MDM
122
123/* 2430-Ratio Bootm (BYPASS) */
124#define RB_CLKSEL_L3 (1 << 0)
125#define RB_CLKSEL_L4 (1 << 5)
126#define RB_CLKSEL_USB (1 << 25)
127#define RB_CM_CLKSEL1_CORE_VAL RB_CLKSEL_USB | RX_CLKSEL_SSI | \
128 RX_CLKSEL_DSS2 | RX_CLKSEL_DSS1 | \
129 RB_CLKSEL_L4 | RB_CLKSEL_L3
130#define RB_CLKSEL_MPU (1 << 0)
131#define RB_CM_CLKSEL_MPU_VAL RB_CLKSEL_MPU
132#define RB_CLKSEL_DSP (1 << 0)
133#define RB_CLKSEL_DSP_IF (1 << 5)
134#define RB_CM_CLKSEL_DSP_VAL RB_CLKSEL_DSP | RB_CLKSEL_DSP_IF
135#define RB_CLKSEL_GFX (1 << 0)
136#define RB_CM_CLKSEL_GFX_VAL RB_CLKSEL_GFX
137#define RB_CLKSEL_MDM (1 << 0)
138#define RB_CM_CLKSEL_MDM_VAL RB_CLKSEL_MDM
139
140/* 2420 Ratio Equivalents */
141#define RXX_CLKSEL_VLYNQ (0x12 << 15)
142#define RXX_CLKSEL_SSI (0x8 << 20)
143
144/* 2420-PRCM III 532MHz core */
145#define RIII_CLKSEL_L3 (4 << 0) /* 133MHz */
146#define RIII_CLKSEL_L4 (2 << 5) /* 66.5MHz */
147#define RIII_CLKSEL_USB (4 << 25) /* 33.25MHz */
148#define RIII_CM_CLKSEL1_CORE_VAL RIII_CLKSEL_USB | RXX_CLKSEL_SSI | \
149 RXX_CLKSEL_VLYNQ | RX_CLKSEL_DSS2 | \
150 RX_CLKSEL_DSS1 | RIII_CLKSEL_L4 | \
151 RIII_CLKSEL_L3
152#define RIII_CLKSEL_MPU (2 << 0) /* 266MHz */
153#define RIII_CM_CLKSEL_MPU_VAL RIII_CLKSEL_MPU
154#define RIII_CLKSEL_DSP (3 << 0) /* c5x - 177.3MHz */
155#define RIII_CLKSEL_DSP_IF (2 << 5) /* c5x - 88.67MHz */
156#define RIII_SYNC_DSP (1 << 7) /* Enable sync */
157#define RIII_CLKSEL_IVA (6 << 8) /* iva1 - 88.67MHz */
158#define RIII_SYNC_IVA (1 << 13) /* Enable sync */
159#define RIII_CM_CLKSEL_DSP_VAL RIII_SYNC_IVA | RIII_CLKSEL_IVA | \
160 RIII_SYNC_DSP | RIII_CLKSEL_DSP_IF | \
161 RIII_CLKSEL_DSP
162#define RIII_CLKSEL_GFX (2 << 0) /* 66.5MHz */
163#define RIII_CM_CLKSEL_GFX_VAL RIII_CLKSEL_GFX
164
165/* 2420-PRCM II 600MHz core */
166#define RII_CLKSEL_L3 (6 << 0) /* 100MHz */
167#define RII_CLKSEL_L4 (2 << 5) /* 50MHz */
168#define RII_CLKSEL_USB (2 << 25) /* 50MHz */
169#define RII_CM_CLKSEL1_CORE_VAL RII_CLKSEL_USB | \
170 RXX_CLKSEL_SSI | RXX_CLKSEL_VLYNQ | \
171 RX_CLKSEL_DSS2 | RX_CLKSEL_DSS1 | \
172 RII_CLKSEL_L4 | RII_CLKSEL_L3
173#define RII_CLKSEL_MPU (2 << 0) /* 300MHz */
174#define RII_CM_CLKSEL_MPU_VAL RII_CLKSEL_MPU
175#define RII_CLKSEL_DSP (3 << 0) /* c5x - 200MHz */
176#define RII_CLKSEL_DSP_IF (2 << 5) /* c5x - 100MHz */
177#define RII_SYNC_DSP (0 << 7) /* Bypass sync */
178#define RII_CLKSEL_IVA (3 << 8) /* iva1 - 200MHz */
179#define RII_SYNC_IVA (0 << 13) /* Bypass sync */
180#define RII_CM_CLKSEL_DSP_VAL RII_SYNC_IVA | RII_CLKSEL_IVA | \
181 RII_SYNC_DSP | RII_CLKSEL_DSP_IF | \
182 RII_CLKSEL_DSP
183#define RII_CLKSEL_GFX (2 << 0) /* 50MHz */
184#define RII_CM_CLKSEL_GFX_VAL RII_CLKSEL_GFX
185
186/* 2420-PRCM I 660MHz core */
187#define RI_CLKSEL_L3 (4 << 0) /* 165MHz */
188#define RI_CLKSEL_L4 (2 << 5) /* 82.5MHz */
189#define RI_CLKSEL_USB (4 << 25) /* 41.25MHz */
190#define RI_CM_CLKSEL1_CORE_VAL RI_CLKSEL_USB | \
191 RXX_CLKSEL_SSI | RXX_CLKSEL_VLYNQ | \
192 RX_CLKSEL_DSS2 | RX_CLKSEL_DSS1 | \
193 RI_CLKSEL_L4 | RI_CLKSEL_L3
194#define RI_CLKSEL_MPU (2 << 0) /* 330MHz */
195#define RI_CM_CLKSEL_MPU_VAL RI_CLKSEL_MPU
196#define RI_CLKSEL_DSP (3 << 0) /* c5x - 220MHz */
197#define RI_CLKSEL_DSP_IF (2 << 5) /* c5x - 110MHz */
198#define RI_SYNC_DSP (1 << 7) /* Activate sync */
199#define RI_CLKSEL_IVA (4 << 8) /* iva1 - 165MHz */
200#define RI_SYNC_IVA (0 << 13) /* Bypass sync */
201#define RI_CM_CLKSEL_DSP_VAL RI_SYNC_IVA | RI_CLKSEL_IVA | \
202 RI_SYNC_DSP | RI_CLKSEL_DSP_IF | \
203 RI_CLKSEL_DSP
204#define RI_CLKSEL_GFX (1 << 0) /* 165MHz */
205#define RI_CM_CLKSEL_GFX_VAL RI_CLKSEL_GFX
206
207/* 2420-PRCM VII (boot) */
208#define RVII_CLKSEL_L3 (1 << 0)
209#define RVII_CLKSEL_L4 (1 << 5)
210#define RVII_CLKSEL_DSS1 (1 << 8)
211#define RVII_CLKSEL_DSS2 (0 << 13)
212#define RVII_CLKSEL_VLYNQ (1 << 15)
213#define RVII_CLKSEL_SSI (1 << 20)
214#define RVII_CLKSEL_USB (1 << 25)
215
216#define RVII_CM_CLKSEL1_CORE_VAL RVII_CLKSEL_USB | RVII_CLKSEL_SSI | \
217 RVII_CLKSEL_VLYNQ | RVII_CLKSEL_DSS2 | \
218 RVII_CLKSEL_DSS1 | RVII_CLKSEL_L4 | RVII_CLKSEL_L3
219
220#define RVII_CLKSEL_MPU (1 << 0) /* all divide by 1 */
221#define RVII_CM_CLKSEL_MPU_VAL RVII_CLKSEL_MPU
222
223#define RVII_CLKSEL_DSP (1 << 0)
224#define RVII_CLKSEL_DSP_IF (1 << 5)
225#define RVII_SYNC_DSP (0 << 7)
226#define RVII_CLKSEL_IVA (1 << 8)
227#define RVII_SYNC_IVA (0 << 13)
228#define RVII_CM_CLKSEL_DSP_VAL RVII_SYNC_IVA | RVII_CLKSEL_IVA | RVII_SYNC_DSP | \
229 RVII_CLKSEL_DSP_IF | RVII_CLKSEL_DSP
230
231#define RVII_CLKSEL_GFX (1 << 0)
232#define RVII_CM_CLKSEL_GFX_VAL RVII_CLKSEL_GFX
233
234/*-------------------------------------------------------------------------
235 * 2430 Target modes: Along with each configuration the CPU has several
236 * modes which goes along with them. Modes mainly are the addition of
237 * describe DPLL combinations to go along with a ratio.
238 *-------------------------------------------------------------------------*/
239
240/* Hardware governed */
241#define MX_48M_SRC (0 << 3)
242#define MX_54M_SRC (0 << 5)
243#define MX_APLLS_CLIKIN_12 (3 << 23)
244#define MX_APLLS_CLIKIN_13 (2 << 23)
245#define MX_APLLS_CLIKIN_19_2 (0 << 23)
246
247/*
248 * 2430 - standalone, 2*ref*M/(n+1), M/N is for exactness not relock speed
249 * #5a (ratio1) baseport-target, target DPLL = 266*2 = 532MHz
250 */
251#define M5A_DPLL_MULT_12 (133 << 12)
252#define M5A_DPLL_DIV_12 (5 << 8)
253#define M5A_CM_CLKSEL1_PLL_12_VAL MX_48M_SRC | MX_54M_SRC | \
254 M5A_DPLL_DIV_12 | M5A_DPLL_MULT_12 | \
255 MX_APLLS_CLIKIN_12
256#define M5A_DPLL_MULT_13 (61 << 12)
257#define M5A_DPLL_DIV_13 (2 << 8)
258#define M5A_CM_CLKSEL1_PLL_13_VAL MX_48M_SRC | MX_54M_SRC | \
259 M5A_DPLL_DIV_13 | M5A_DPLL_MULT_13 | \
260 MX_APLLS_CLIKIN_13
261#define M5A_DPLL_MULT_19 (55 << 12)
262#define M5A_DPLL_DIV_19 (3 << 8)
263#define M5A_CM_CLKSEL1_PLL_19_VAL MX_48M_SRC | MX_54M_SRC | \
264 M5A_DPLL_DIV_19 | M5A_DPLL_MULT_19 | \
265 MX_APLLS_CLIKIN_19_2
266/* #5b (ratio1) target DPLL = 200*2 = 400MHz */
267#define M5B_DPLL_MULT_12 (50 << 12)
268#define M5B_DPLL_DIV_12 (2 << 8)
269#define M5B_CM_CLKSEL1_PLL_12_VAL MX_48M_SRC | MX_54M_SRC | \
270 M5B_DPLL_DIV_12 | M5B_DPLL_MULT_12 | \
271 MX_APLLS_CLIKIN_12
272#define M5B_DPLL_MULT_13 (200 << 12)
273#define M5B_DPLL_DIV_13 (12 << 8)
274
275#define M5B_CM_CLKSEL1_PLL_13_VAL MX_48M_SRC | MX_54M_SRC | \
276 M5B_DPLL_DIV_13 | M5B_DPLL_MULT_13 | \
277 MX_APLLS_CLIKIN_13
278#define M5B_DPLL_MULT_19 (125 << 12)
279#define M5B_DPLL_DIV_19 (31 << 8)
280#define M5B_CM_CLKSEL1_PLL_19_VAL MX_48M_SRC | MX_54M_SRC | \
281 M5B_DPLL_DIV_19 | M5B_DPLL_MULT_19 | \
282 MX_APLLS_CLIKIN_19_2
283/*
284 * #4 (ratio2), DPLL = 399*2 = 798MHz, L3=133MHz
285 */
286#define M4_DPLL_MULT_12 (133 << 12)
287#define M4_DPLL_DIV_12 (3 << 8)
288#define M4_CM_CLKSEL1_PLL_12_VAL MX_48M_SRC | MX_54M_SRC | \
289 M4_DPLL_DIV_12 | M4_DPLL_MULT_12 | \
290 MX_APLLS_CLIKIN_12
291
292#define M4_DPLL_MULT_13 (399 << 12)
293#define M4_DPLL_DIV_13 (12 << 8)
294#define M4_CM_CLKSEL1_PLL_13_VAL MX_48M_SRC | MX_54M_SRC | \
295 M4_DPLL_DIV_13 | M4_DPLL_MULT_13 | \
296 MX_APLLS_CLIKIN_13
297
298#define M4_DPLL_MULT_19 (145 << 12)
299#define M4_DPLL_DIV_19 (6 << 8)
300#define M4_CM_CLKSEL1_PLL_19_VAL MX_48M_SRC | MX_54M_SRC | \
301 M4_DPLL_DIV_19 | M4_DPLL_MULT_19 | \
302 MX_APLLS_CLIKIN_19_2
303
304/*
305 * #3 (ratio2) baseport-target, target DPLL = 330*2 = 660MHz
306 */
307#define M3_DPLL_MULT_12 (55 << 12)
308#define M3_DPLL_DIV_12 (1 << 8)
309#define M3_CM_CLKSEL1_PLL_12_VAL MX_48M_SRC | MX_54M_SRC | \
310 M3_DPLL_DIV_12 | M3_DPLL_MULT_12 | \
311 MX_APLLS_CLIKIN_12
312#define M3_DPLL_MULT_13 (76 << 12)
313#define M3_DPLL_DIV_13 (2 << 8)
314#define M3_CM_CLKSEL1_PLL_13_VAL MX_48M_SRC | MX_54M_SRC | \
315 M3_DPLL_DIV_13 | M3_DPLL_MULT_13 | \
316 MX_APLLS_CLIKIN_13
317#define M3_DPLL_MULT_19 (17 << 12)
318#define M3_DPLL_DIV_19 (0 << 8)
319#define M3_CM_CLKSEL1_PLL_19_VAL MX_48M_SRC | MX_54M_SRC | \
320 M3_DPLL_DIV_19 | M3_DPLL_MULT_19 | \
321 MX_APLLS_CLIKIN_19_2
322
323/*
324 * #2 (ratio1) DPLL = 330*2 = 660MHz, L3=165MHz
325 */
326#define M2_DPLL_MULT_12 (55 << 12)
327#define M2_DPLL_DIV_12 (1 << 8)
328#define M2_CM_CLKSEL1_PLL_12_VAL MX_48M_SRC | MX_54M_SRC | \
329 M2_DPLL_DIV_12 | M2_DPLL_MULT_12 | \
330 MX_APLLS_CLIKIN_12
331
332/* Speed changes - Used 658.7MHz instead of 660MHz for LP-Refresh M=76 N=2,
333 * relock time issue */
334/* Core frequency changed from 330/165 to 329/164 MHz*/
335#define M2_DPLL_MULT_13 (76 << 12)
336#define M2_DPLL_DIV_13 (2 << 8)
337#define M2_CM_CLKSEL1_PLL_13_VAL MX_48M_SRC | MX_54M_SRC | \
338 M2_DPLL_DIV_13 | M2_DPLL_MULT_13 | \
339 MX_APLLS_CLIKIN_13
340
341#define M2_DPLL_MULT_19 (17 << 12)
342#define M2_DPLL_DIV_19 (0 << 8)
343#define M2_CM_CLKSEL1_PLL_19_VAL MX_48M_SRC | MX_54M_SRC | \
344 M2_DPLL_DIV_19 | M2_DPLL_MULT_19 | \
345 MX_APLLS_CLIKIN_19_2
346
347/* boot (boot) */
348#define MB_DPLL_MULT (1 << 12)
349#define MB_DPLL_DIV (0 << 8)
350#define MB_CM_CLKSEL1_PLL_12_VAL MX_48M_SRC | MX_54M_SRC | MB_DPLL_DIV |\
351 MB_DPLL_MULT | MX_APLLS_CLIKIN_12
352
353#define MB_CM_CLKSEL1_PLL_13_VAL MX_48M_SRC | MX_54M_SRC | MB_DPLL_DIV |\
354 MB_DPLL_MULT | MX_APLLS_CLIKIN_13
355
356#define MB_CM_CLKSEL1_PLL_19_VAL MX_48M_SRC | MX_54M_SRC | MB_DPLL_DIV |\
357 MB_DPLL_MULT | MX_APLLS_CLIKIN_19
358
359/*
360 * 2430 - chassis (sedna)
361 * 165 (ratio1) same as above #2
362 * 150 (ratio1)
363 * 133 (ratio2) same as above #4
364 * 110 (ratio2) same as above #3
365 * 104 (ratio2)
366 * boot (boot)
367 */
368
369/* PRCM I target DPLL = 2*330MHz = 660MHz */
370#define MI_DPLL_MULT_12 (55 << 12)
371#define MI_DPLL_DIV_12 (1 << 8)
372#define MI_CM_CLKSEL1_PLL_12_VAL MX_48M_SRC | MX_54M_SRC | \
373 MI_DPLL_DIV_12 | MI_DPLL_MULT_12 | \
374 MX_APLLS_CLIKIN_12
375 32
376/* 33/*
377 * 2420 Equivalent - mode registers 34 * 2430 clock tree.
378 * PRCM II , target DPLL = 2*300MHz = 600MHz
379 */
380#define MII_DPLL_MULT_12 (50 << 12)
381#define MII_DPLL_DIV_12 (1 << 8)
382#define MII_CM_CLKSEL1_PLL_12_VAL MX_48M_SRC | MX_54M_SRC | \
383 MII_DPLL_DIV_12 | MII_DPLL_MULT_12 | \
384 MX_APLLS_CLIKIN_12
385#define MII_DPLL_MULT_13 (300 << 12)
386#define MII_DPLL_DIV_13 (12 << 8)
387#define MII_CM_CLKSEL1_PLL_13_VAL MX_48M_SRC | MX_54M_SRC | \
388 MII_DPLL_DIV_13 | MII_DPLL_MULT_13 | \
389 MX_APLLS_CLIKIN_13
390
391/* PRCM III target DPLL = 2*266 = 532MHz*/
392#define MIII_DPLL_MULT_12 (133 << 12)
393#define MIII_DPLL_DIV_12 (5 << 8)
394#define MIII_CM_CLKSEL1_PLL_12_VAL MX_48M_SRC | MX_54M_SRC | \
395 MIII_DPLL_DIV_12 | MIII_DPLL_MULT_12 | \
396 MX_APLLS_CLIKIN_12
397#define MIII_DPLL_MULT_13 (266 << 12)
398#define MIII_DPLL_DIV_13 (12 << 8)
399#define MIII_CM_CLKSEL1_PLL_13_VAL MX_48M_SRC | MX_54M_SRC | \
400 MIII_DPLL_DIV_13 | MIII_DPLL_MULT_13 | \
401 MX_APLLS_CLIKIN_13
402
403/* PRCM VII (boot bypass) */
404#define MVII_CM_CLKSEL1_PLL_12_VAL MB_CM_CLKSEL1_PLL_12_VAL
405#define MVII_CM_CLKSEL1_PLL_13_VAL MB_CM_CLKSEL1_PLL_13_VAL
406
407/* High and low operation value */
408#define MX_CLKSEL2_PLL_2x_VAL (2 << 0)
409#define MX_CLKSEL2_PLL_1x_VAL (1 << 0)
410
411/* MPU speed defines */
412#define S12M 12000000
413#define S13M 13000000
414#define S19M 19200000
415#define S26M 26000000
416#define S100M 100000000
417#define S133M 133000000
418#define S150M 150000000
419#define S164M 164000000
420#define S165M 165000000
421#define S199M 199000000
422#define S200M 200000000
423#define S266M 266000000
424#define S300M 300000000
425#define S329M 329000000
426#define S330M 330000000
427#define S399M 399000000
428#define S400M 400000000
429#define S532M 532000000
430#define S600M 600000000
431#define S658M 658000000
432#define S660M 660000000
433#define S798M 798000000
434
435/*-------------------------------------------------------------------------
436 * Key dividers which make up a PRCM set. Ratio's for a PRCM are mandated.
437 * xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU,
438 * CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL,
439 * CM_CLKSEL2_PLL, CM_CLKSEL_MDM
440 *
441 * Filling in table based on H4 boards and 2430-SDPs variants available.
442 * There are quite a few more rates combinations which could be defined.
443 *
444 * When multiple values are defined the start up will try and choose the
445 * fastest one. If a 'fast' value is defined, then automatically, the /2
446 * one should be included as it can be used. Generally having more that
447 * one fast set does not make sense, as static timings need to be changed
448 * to change the set. The exception is the bypass setting which is
449 * availble for low power bypass.
450 *
451 * Note: This table needs to be sorted, fastest to slowest.
452 *-------------------------------------------------------------------------*/
453static struct prcm_config rate_table[] = {
454 /* PRCM I - FAST */
455 {S12M, S660M, S330M, RI_CM_CLKSEL_MPU_VAL, /* 330MHz ARM */
456 RI_CM_CLKSEL_DSP_VAL, RI_CM_CLKSEL_GFX_VAL,
457 RI_CM_CLKSEL1_CORE_VAL, MI_CM_CLKSEL1_PLL_12_VAL,
458 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_165MHz,
459 RATE_IN_242X},
460
461 /* PRCM II - FAST */
462 {S12M, S600M, S300M, RII_CM_CLKSEL_MPU_VAL, /* 300MHz ARM */
463 RII_CM_CLKSEL_DSP_VAL, RII_CM_CLKSEL_GFX_VAL,
464 RII_CM_CLKSEL1_CORE_VAL, MII_CM_CLKSEL1_PLL_12_VAL,
465 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_100MHz,
466 RATE_IN_242X},
467
468 {S13M, S600M, S300M, RII_CM_CLKSEL_MPU_VAL, /* 300MHz ARM */
469 RII_CM_CLKSEL_DSP_VAL, RII_CM_CLKSEL_GFX_VAL,
470 RII_CM_CLKSEL1_CORE_VAL, MII_CM_CLKSEL1_PLL_13_VAL,
471 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_100MHz,
472 RATE_IN_242X},
473
474 /* PRCM III - FAST */
475 {S12M, S532M, S266M, RIII_CM_CLKSEL_MPU_VAL, /* 266MHz ARM */
476 RIII_CM_CLKSEL_DSP_VAL, RIII_CM_CLKSEL_GFX_VAL,
477 RIII_CM_CLKSEL1_CORE_VAL, MIII_CM_CLKSEL1_PLL_12_VAL,
478 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_133MHz,
479 RATE_IN_242X},
480
481 {S13M, S532M, S266M, RIII_CM_CLKSEL_MPU_VAL, /* 266MHz ARM */
482 RIII_CM_CLKSEL_DSP_VAL, RIII_CM_CLKSEL_GFX_VAL,
483 RIII_CM_CLKSEL1_CORE_VAL, MIII_CM_CLKSEL1_PLL_13_VAL,
484 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_133MHz,
485 RATE_IN_242X},
486
487 /* PRCM II - SLOW */
488 {S12M, S300M, S150M, RII_CM_CLKSEL_MPU_VAL, /* 150MHz ARM */
489 RII_CM_CLKSEL_DSP_VAL, RII_CM_CLKSEL_GFX_VAL,
490 RII_CM_CLKSEL1_CORE_VAL, MII_CM_CLKSEL1_PLL_12_VAL,
491 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_100MHz,
492 RATE_IN_242X},
493
494 {S13M, S300M, S150M, RII_CM_CLKSEL_MPU_VAL, /* 150MHz ARM */
495 RII_CM_CLKSEL_DSP_VAL, RII_CM_CLKSEL_GFX_VAL,
496 RII_CM_CLKSEL1_CORE_VAL, MII_CM_CLKSEL1_PLL_13_VAL,
497 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_100MHz,
498 RATE_IN_242X},
499
500 /* PRCM III - SLOW */
501 {S12M, S266M, S133M, RIII_CM_CLKSEL_MPU_VAL, /* 133MHz ARM */
502 RIII_CM_CLKSEL_DSP_VAL, RIII_CM_CLKSEL_GFX_VAL,
503 RIII_CM_CLKSEL1_CORE_VAL, MIII_CM_CLKSEL1_PLL_12_VAL,
504 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_133MHz,
505 RATE_IN_242X},
506
507 {S13M, S266M, S133M, RIII_CM_CLKSEL_MPU_VAL, /* 133MHz ARM */
508 RIII_CM_CLKSEL_DSP_VAL, RIII_CM_CLKSEL_GFX_VAL,
509 RIII_CM_CLKSEL1_CORE_VAL, MIII_CM_CLKSEL1_PLL_13_VAL,
510 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_133MHz,
511 RATE_IN_242X},
512
513 /* PRCM-VII (boot-bypass) */
514 {S12M, S12M, S12M, RVII_CM_CLKSEL_MPU_VAL, /* 12MHz ARM*/
515 RVII_CM_CLKSEL_DSP_VAL, RVII_CM_CLKSEL_GFX_VAL,
516 RVII_CM_CLKSEL1_CORE_VAL, MVII_CM_CLKSEL1_PLL_12_VAL,
517 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_BYPASS,
518 RATE_IN_242X},
519
520 /* PRCM-VII (boot-bypass) */
521 {S13M, S13M, S13M, RVII_CM_CLKSEL_MPU_VAL, /* 13MHz ARM */
522 RVII_CM_CLKSEL_DSP_VAL, RVII_CM_CLKSEL_GFX_VAL,
523 RVII_CM_CLKSEL1_CORE_VAL, MVII_CM_CLKSEL1_PLL_13_VAL,
524 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_BYPASS,
525 RATE_IN_242X},
526
527 /* PRCM #4 - ratio2 (ES2.1) - FAST */
528 {S13M, S798M, S399M, R2_CM_CLKSEL_MPU_VAL, /* 399MHz ARM */
529 R2_CM_CLKSEL_DSP_VAL, R2_CM_CLKSEL_GFX_VAL,
530 R2_CM_CLKSEL1_CORE_VAL, M4_CM_CLKSEL1_PLL_13_VAL,
531 MX_CLKSEL2_PLL_2x_VAL, R2_CM_CLKSEL_MDM_VAL,
532 SDRC_RFR_CTRL_133MHz,
533 RATE_IN_243X},
534
535 /* PRCM #2 - ratio1 (ES2) - FAST */
536 {S13M, S658M, S329M, R1_CM_CLKSEL_MPU_VAL, /* 330MHz ARM */
537 R1_CM_CLKSEL_DSP_VAL, R1_CM_CLKSEL_GFX_VAL,
538 R1_CM_CLKSEL1_CORE_VAL, M2_CM_CLKSEL1_PLL_13_VAL,
539 MX_CLKSEL2_PLL_2x_VAL, R1_CM_CLKSEL_MDM_VAL,
540 SDRC_RFR_CTRL_165MHz,
541 RATE_IN_243X},
542
543 /* PRCM #5a - ratio1 - FAST */
544 {S13M, S532M, S266M, R1_CM_CLKSEL_MPU_VAL, /* 266MHz ARM */
545 R1_CM_CLKSEL_DSP_VAL, R1_CM_CLKSEL_GFX_VAL,
546 R1_CM_CLKSEL1_CORE_VAL, M5A_CM_CLKSEL1_PLL_13_VAL,
547 MX_CLKSEL2_PLL_2x_VAL, R1_CM_CLKSEL_MDM_VAL,
548 SDRC_RFR_CTRL_133MHz,
549 RATE_IN_243X},
550
551 /* PRCM #5b - ratio1 - FAST */
552 {S13M, S400M, S200M, R1_CM_CLKSEL_MPU_VAL, /* 200MHz ARM */
553 R1_CM_CLKSEL_DSP_VAL, R1_CM_CLKSEL_GFX_VAL,
554 R1_CM_CLKSEL1_CORE_VAL, M5B_CM_CLKSEL1_PLL_13_VAL,
555 MX_CLKSEL2_PLL_2x_VAL, R1_CM_CLKSEL_MDM_VAL,
556 SDRC_RFR_CTRL_100MHz,
557 RATE_IN_243X},
558
559 /* PRCM #4 - ratio1 (ES2.1) - SLOW */
560 {S13M, S399M, S199M, R2_CM_CLKSEL_MPU_VAL, /* 200MHz ARM */
561 R2_CM_CLKSEL_DSP_VAL, R2_CM_CLKSEL_GFX_VAL,
562 R2_CM_CLKSEL1_CORE_VAL, M4_CM_CLKSEL1_PLL_13_VAL,
563 MX_CLKSEL2_PLL_1x_VAL, R2_CM_CLKSEL_MDM_VAL,
564 SDRC_RFR_CTRL_133MHz,
565 RATE_IN_243X},
566
567 /* PRCM #2 - ratio1 (ES2) - SLOW */
568 {S13M, S329M, S164M, R1_CM_CLKSEL_MPU_VAL, /* 165MHz ARM */
569 R1_CM_CLKSEL_DSP_VAL, R1_CM_CLKSEL_GFX_VAL,
570 R1_CM_CLKSEL1_CORE_VAL, M2_CM_CLKSEL1_PLL_13_VAL,
571 MX_CLKSEL2_PLL_1x_VAL, R1_CM_CLKSEL_MDM_VAL,
572 SDRC_RFR_CTRL_165MHz,
573 RATE_IN_243X},
574
575 /* PRCM #5a - ratio1 - SLOW */
576 {S13M, S266M, S133M, R1_CM_CLKSEL_MPU_VAL, /* 133MHz ARM */
577 R1_CM_CLKSEL_DSP_VAL, R1_CM_CLKSEL_GFX_VAL,
578 R1_CM_CLKSEL1_CORE_VAL, M5A_CM_CLKSEL1_PLL_13_VAL,
579 MX_CLKSEL2_PLL_1x_VAL, R1_CM_CLKSEL_MDM_VAL,
580 SDRC_RFR_CTRL_133MHz,
581 RATE_IN_243X},
582
583 /* PRCM #5b - ratio1 - SLOW*/
584 {S13M, S200M, S100M, R1_CM_CLKSEL_MPU_VAL, /* 100MHz ARM */
585 R1_CM_CLKSEL_DSP_VAL, R1_CM_CLKSEL_GFX_VAL,
586 R1_CM_CLKSEL1_CORE_VAL, M5B_CM_CLKSEL1_PLL_13_VAL,
587 MX_CLKSEL2_PLL_1x_VAL, R1_CM_CLKSEL_MDM_VAL,
588 SDRC_RFR_CTRL_100MHz,
589 RATE_IN_243X},
590
591 /* PRCM-boot/bypass */
592 {S13M, S13M, S13M, RB_CM_CLKSEL_MPU_VAL, /* 13Mhz */
593 RB_CM_CLKSEL_DSP_VAL, RB_CM_CLKSEL_GFX_VAL,
594 RB_CM_CLKSEL1_CORE_VAL, MB_CM_CLKSEL1_PLL_13_VAL,
595 MX_CLKSEL2_PLL_2x_VAL, RB_CM_CLKSEL_MDM_VAL,
596 SDRC_RFR_CTRL_BYPASS,
597 RATE_IN_243X},
598
599 /* PRCM-boot/bypass */
600 {S12M, S12M, S12M, RB_CM_CLKSEL_MPU_VAL, /* 12Mhz */
601 RB_CM_CLKSEL_DSP_VAL, RB_CM_CLKSEL_GFX_VAL,
602 RB_CM_CLKSEL1_CORE_VAL, MB_CM_CLKSEL1_PLL_12_VAL,
603 MX_CLKSEL2_PLL_2x_VAL, RB_CM_CLKSEL_MDM_VAL,
604 SDRC_RFR_CTRL_BYPASS,
605 RATE_IN_243X},
606
607 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
608};
609
610/*-------------------------------------------------------------------------
611 * 24xx clock tree.
612 * 35 *
613 * NOTE:In many cases here we are assigning a 'default' parent. In many 36 * NOTE:In many cases here we are assigning a 'default' parent. In many
614 * cases the parent is selectable. The get/set parent calls will also 37 * cases the parent is selectable. The get/set parent calls will also
@@ -625,14 +48,13 @@ static struct prcm_config rate_table[] = {
625 * domains. Many get their interface clocks from the L4 domain, but get 48 * domains. Many get their interface clocks from the L4 domain, but get
626 * functional clocks from fixed sources or other core domain derived 49 * functional clocks from fixed sources or other core domain derived
627 * clocks. 50 * clocks.
628 *-------------------------------------------------------------------------*/ 51 */
629 52
630/* Base external input clocks */ 53/* Base external input clocks */
631static struct clk func_32k_ck = { 54static struct clk func_32k_ck = {
632 .name = "func_32k_ck", 55 .name = "func_32k_ck",
633 .ops = &clkops_null, 56 .ops = &clkops_null,
634 .rate = 32000, 57 .rate = 32000,
635 .flags = RATE_FIXED,
636 .clkdm_name = "wkup_clkdm", 58 .clkdm_name = "wkup_clkdm",
637}; 59};
638 60
@@ -640,7 +62,6 @@ static struct clk secure_32k_ck = {
640 .name = "secure_32k_ck", 62 .name = "secure_32k_ck",
641 .ops = &clkops_null, 63 .ops = &clkops_null,
642 .rate = 32768, 64 .rate = 32768,
643 .flags = RATE_FIXED,
644 .clkdm_name = "wkup_clkdm", 65 .clkdm_name = "wkup_clkdm",
645}; 66};
646 67
@@ -658,14 +79,13 @@ static struct clk sys_ck = { /* (*12, *13, 19.2, 26, 38.4)MHz */
658 .ops = &clkops_null, 79 .ops = &clkops_null,
659 .parent = &osc_ck, 80 .parent = &osc_ck,
660 .clkdm_name = "wkup_clkdm", 81 .clkdm_name = "wkup_clkdm",
661 .recalc = &omap2_sys_clk_recalc, 82 .recalc = &omap2xxx_sys_clk_recalc,
662}; 83};
663 84
664static struct clk alt_ck = { /* Typical 54M or 48M, may not exist */ 85static struct clk alt_ck = { /* Typical 54M or 48M, may not exist */
665 .name = "alt_ck", 86 .name = "alt_ck",
666 .ops = &clkops_null, 87 .ops = &clkops_null,
667 .rate = 54000000, 88 .rate = 54000000,
668 .flags = RATE_FIXED,
669 .clkdm_name = "wkup_clkdm", 89 .clkdm_name = "wkup_clkdm",
670}; 90};
671 91
@@ -686,7 +106,7 @@ static struct dpll_data dpll_dd = {
686 .clk_ref = &sys_ck, 106 .clk_ref = &sys_ck,
687 .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), 107 .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
688 .enable_mask = OMAP24XX_EN_DPLL_MASK, 108 .enable_mask = OMAP24XX_EN_DPLL_MASK,
689 .max_multiplier = 1024, 109 .max_multiplier = 1023,
690 .min_divider = 1, 110 .min_divider = 1,
691 .max_divider = 16, 111 .max_divider = 16,
692 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE 112 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE
@@ -708,10 +128,10 @@ static struct clk dpll_ck = {
708 128
709static struct clk apll96_ck = { 129static struct clk apll96_ck = {
710 .name = "apll96_ck", 130 .name = "apll96_ck",
711 .ops = &clkops_fixed, 131 .ops = &clkops_apll96,
712 .parent = &sys_ck, 132 .parent = &sys_ck,
713 .rate = 96000000, 133 .rate = 96000000,
714 .flags = RATE_FIXED | ENABLE_ON_INIT, 134 .flags = ENABLE_ON_INIT,
715 .clkdm_name = "wkup_clkdm", 135 .clkdm_name = "wkup_clkdm",
716 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), 136 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
717 .enable_bit = OMAP24XX_EN_96M_PLL_SHIFT, 137 .enable_bit = OMAP24XX_EN_96M_PLL_SHIFT,
@@ -719,10 +139,10 @@ static struct clk apll96_ck = {
719 139
720static struct clk apll54_ck = { 140static struct clk apll54_ck = {
721 .name = "apll54_ck", 141 .name = "apll54_ck",
722 .ops = &clkops_fixed, 142 .ops = &clkops_apll54,
723 .parent = &sys_ck, 143 .parent = &sys_ck,
724 .rate = 54000000, 144 .rate = 54000000,
725 .flags = RATE_FIXED | ENABLE_ON_INIT, 145 .flags = ENABLE_ON_INIT,
726 .clkdm_name = "wkup_clkdm", 146 .clkdm_name = "wkup_clkdm",
727 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), 147 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
728 .enable_bit = OMAP24XX_EN_54M_PLL_SHIFT, 148 .enable_bit = OMAP24XX_EN_54M_PLL_SHIFT,
@@ -787,7 +207,6 @@ static const struct clksel func_96m_clksel[] = {
787 { .parent = NULL } 207 { .parent = NULL }
788}; 208};
789 209
790/* The parent of this clock is not selectable on 2420. */
791static struct clk func_96m_ck = { 210static struct clk func_96m_ck = {
792 .name = "func_96m_ck", 211 .name = "func_96m_ck",
793 .ops = &clkops_null, 212 .ops = &clkops_null,
@@ -798,8 +217,6 @@ static struct clk func_96m_ck = {
798 .clksel_mask = OMAP2430_96M_SOURCE, 217 .clksel_mask = OMAP2430_96M_SOURCE,
799 .clksel = func_96m_clksel, 218 .clksel = func_96m_clksel,
800 .recalc = &omap2_clksel_recalc, 219 .recalc = &omap2_clksel_recalc,
801 .round_rate = &omap2_clksel_round_rate,
802 .set_rate = &omap2_clksel_set_rate
803}; 220};
804 221
805/* func_48m_ck */ 222/* func_48m_ck */
@@ -840,7 +257,7 @@ static struct clk func_12m_ck = {
840 .parent = &func_48m_ck, 257 .parent = &func_48m_ck,
841 .fixed_div = 4, 258 .fixed_div = 4,
842 .clkdm_name = "wkup_clkdm", 259 .clkdm_name = "wkup_clkdm",
843 .recalc = &omap2_fixed_divisor_recalc, 260 .recalc = &omap_fixed_divisor_recalc,
844}; 261};
845 262
846/* Secure timer, only available in secure mode */ 263/* Secure timer, only available in secure mode */
@@ -892,10 +309,10 @@ static struct clk sys_clkout_src = {
892 .ops = &clkops_omap2_dflt, 309 .ops = &clkops_omap2_dflt,
893 .parent = &func_54m_ck, 310 .parent = &func_54m_ck,
894 .clkdm_name = "wkup_clkdm", 311 .clkdm_name = "wkup_clkdm",
895 .enable_reg = OMAP24XX_PRCM_CLKOUT_CTRL, 312 .enable_reg = OMAP2430_PRCM_CLKOUT_CTRL,
896 .enable_bit = OMAP24XX_CLKOUT_EN_SHIFT, 313 .enable_bit = OMAP24XX_CLKOUT_EN_SHIFT,
897 .init = &omap2_init_clksel_parent, 314 .init = &omap2_init_clksel_parent,
898 .clksel_reg = OMAP24XX_PRCM_CLKOUT_CTRL, 315 .clksel_reg = OMAP2430_PRCM_CLKOUT_CTRL,
899 .clksel_mask = OMAP24XX_CLKOUT_SOURCE_MASK, 316 .clksel_mask = OMAP24XX_CLKOUT_SOURCE_MASK,
900 .clksel = common_clkout_src_clksel, 317 .clksel = common_clkout_src_clksel,
901 .recalc = &omap2_clksel_recalc, 318 .recalc = &omap2_clksel_recalc,
@@ -922,7 +339,7 @@ static struct clk sys_clkout = {
922 .ops = &clkops_null, 339 .ops = &clkops_null,
923 .parent = &sys_clkout_src, 340 .parent = &sys_clkout_src,
924 .clkdm_name = "wkup_clkdm", 341 .clkdm_name = "wkup_clkdm",
925 .clksel_reg = OMAP24XX_PRCM_CLKOUT_CTRL, 342 .clksel_reg = OMAP2430_PRCM_CLKOUT_CTRL,
926 .clksel_mask = OMAP24XX_CLKOUT_DIV_MASK, 343 .clksel_mask = OMAP24XX_CLKOUT_DIV_MASK,
927 .clksel = sys_clkout_clksel, 344 .clksel = sys_clkout_clksel,
928 .recalc = &omap2_clksel_recalc, 345 .recalc = &omap2_clksel_recalc,
@@ -930,48 +347,12 @@ static struct clk sys_clkout = {
930 .set_rate = &omap2_clksel_set_rate 347 .set_rate = &omap2_clksel_set_rate
931}; 348};
932 349
933/* In 2430, new in 2420 ES2 */
934static struct clk sys_clkout2_src = {
935 .name = "sys_clkout2_src",
936 .ops = &clkops_omap2_dflt,
937 .parent = &func_54m_ck,
938 .clkdm_name = "wkup_clkdm",
939 .enable_reg = OMAP24XX_PRCM_CLKOUT_CTRL,
940 .enable_bit = OMAP2420_CLKOUT2_EN_SHIFT,
941 .init = &omap2_init_clksel_parent,
942 .clksel_reg = OMAP24XX_PRCM_CLKOUT_CTRL,
943 .clksel_mask = OMAP2420_CLKOUT2_SOURCE_MASK,
944 .clksel = common_clkout_src_clksel,
945 .recalc = &omap2_clksel_recalc,
946 .round_rate = &omap2_clksel_round_rate,
947 .set_rate = &omap2_clksel_set_rate
948};
949
950static const struct clksel sys_clkout2_clksel[] = {
951 { .parent = &sys_clkout2_src, .rates = common_clkout_rates },
952 { .parent = NULL }
953};
954
955/* In 2430, new in 2420 ES2 */
956static struct clk sys_clkout2 = {
957 .name = "sys_clkout2",
958 .ops = &clkops_null,
959 .parent = &sys_clkout2_src,
960 .clkdm_name = "wkup_clkdm",
961 .clksel_reg = OMAP24XX_PRCM_CLKOUT_CTRL,
962 .clksel_mask = OMAP2420_CLKOUT2_DIV_MASK,
963 .clksel = sys_clkout2_clksel,
964 .recalc = &omap2_clksel_recalc,
965 .round_rate = &omap2_clksel_round_rate,
966 .set_rate = &omap2_clksel_set_rate
967};
968
969static struct clk emul_ck = { 350static struct clk emul_ck = {
970 .name = "emul_ck", 351 .name = "emul_ck",
971 .ops = &clkops_omap2_dflt, 352 .ops = &clkops_omap2_dflt,
972 .parent = &func_54m_ck, 353 .parent = &func_54m_ck,
973 .clkdm_name = "wkup_clkdm", 354 .clkdm_name = "wkup_clkdm",
974 .enable_reg = OMAP24XX_PRCM_CLKEMUL_CTRL, 355 .enable_reg = OMAP2430_PRCM_CLKEMUL_CTRL,
975 .enable_bit = OMAP24XX_EMULATION_EN_SHIFT, 356 .enable_bit = OMAP24XX_EMULATION_EN_SHIFT,
976 .recalc = &followparent_recalc, 357 .recalc = &followparent_recalc,
977 358
@@ -990,9 +371,6 @@ static struct clk emul_ck = {
990static const struct clksel_rate mpu_core_rates[] = { 371static const struct clksel_rate mpu_core_rates[] = {
991 { .div = 1, .val = 1, .flags = RATE_IN_24XX | DEFAULT_RATE }, 372 { .div = 1, .val = 1, .flags = RATE_IN_24XX | DEFAULT_RATE },
992 { .div = 2, .val = 2, .flags = RATE_IN_24XX }, 373 { .div = 2, .val = 2, .flags = RATE_IN_24XX },
993 { .div = 4, .val = 4, .flags = RATE_IN_242X },
994 { .div = 6, .val = 6, .flags = RATE_IN_242X },
995 { .div = 8, .val = 8, .flags = RATE_IN_242X },
996 { .div = 0 }, 374 { .div = 0 },
997}; 375};
998 376
@@ -1005,22 +383,18 @@ static struct clk mpu_ck = { /* Control cpu */
1005 .name = "mpu_ck", 383 .name = "mpu_ck",
1006 .ops = &clkops_null, 384 .ops = &clkops_null,
1007 .parent = &core_ck, 385 .parent = &core_ck,
1008 .flags = DELAYED_APP | CONFIG_PARTICIPANT,
1009 .clkdm_name = "mpu_clkdm", 386 .clkdm_name = "mpu_clkdm",
1010 .init = &omap2_init_clksel_parent, 387 .init = &omap2_init_clksel_parent,
1011 .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, CM_CLKSEL), 388 .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, CM_CLKSEL),
1012 .clksel_mask = OMAP24XX_CLKSEL_MPU_MASK, 389 .clksel_mask = OMAP24XX_CLKSEL_MPU_MASK,
1013 .clksel = mpu_clksel, 390 .clksel = mpu_clksel,
1014 .recalc = &omap2_clksel_recalc, 391 .recalc = &omap2_clksel_recalc,
1015 .round_rate = &omap2_clksel_round_rate,
1016 .set_rate = &omap2_clksel_set_rate
1017}; 392};
1018 393
1019/* 394/*
1020 * DSP (2430-IVA2.1) (2420-UMA+IVA1) clock domain 395 * DSP (2430-IVA2.1) clock domain
1021 * Clocks: 396 * Clocks:
1022 * 2430: IVA2.1_FCLK (really just DSP_FCLK), IVA2.1_ICLK 397 * 2430: IVA2.1_FCLK (really just DSP_FCLK), IVA2.1_ICLK
1023 * 2420: UMA_FCLK, UMA_ICLK, IVA_MPU, IVA_COP
1024 * 398 *
1025 * Won't be too specific here. The core clock comes into this block 399 * Won't be too specific here. The core clock comes into this block
1026 * it is divided then tee'ed. One branch goes directly to xyz enable 400 * it is divided then tee'ed. One branch goes directly to xyz enable
@@ -1032,9 +406,6 @@ static const struct clksel_rate dsp_fck_core_rates[] = {
1032 { .div = 2, .val = 2, .flags = RATE_IN_24XX }, 406 { .div = 2, .val = 2, .flags = RATE_IN_24XX },
1033 { .div = 3, .val = 3, .flags = RATE_IN_24XX }, 407 { .div = 3, .val = 3, .flags = RATE_IN_24XX },
1034 { .div = 4, .val = 4, .flags = RATE_IN_24XX }, 408 { .div = 4, .val = 4, .flags = RATE_IN_24XX },
1035 { .div = 6, .val = 6, .flags = RATE_IN_242X },
1036 { .div = 8, .val = 8, .flags = RATE_IN_242X },
1037 { .div = 12, .val = 12, .flags = RATE_IN_242X },
1038 { .div = 0 }, 409 { .div = 0 },
1039}; 410};
1040 411
@@ -1047,7 +418,6 @@ static struct clk dsp_fck = {
1047 .name = "dsp_fck", 418 .name = "dsp_fck",
1048 .ops = &clkops_omap2_dflt_wait, 419 .ops = &clkops_omap2_dflt_wait,
1049 .parent = &core_ck, 420 .parent = &core_ck,
1050 .flags = DELAYED_APP | CONFIG_PARTICIPANT,
1051 .clkdm_name = "dsp_clkdm", 421 .clkdm_name = "dsp_clkdm",
1052 .enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN), 422 .enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
1053 .enable_bit = OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT, 423 .enable_bit = OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT,
@@ -1055,8 +425,6 @@ static struct clk dsp_fck = {
1055 .clksel_mask = OMAP24XX_CLKSEL_DSP_MASK, 425 .clksel_mask = OMAP24XX_CLKSEL_DSP_MASK,
1056 .clksel = dsp_fck_clksel, 426 .clksel = dsp_fck_clksel,
1057 .recalc = &omap2_clksel_recalc, 427 .recalc = &omap2_clksel_recalc,
1058 .round_rate = &omap2_clksel_round_rate,
1059 .set_rate = &omap2_clksel_set_rate
1060}; 428};
1061 429
1062/* DSP interface clock */ 430/* DSP interface clock */
@@ -1077,23 +445,10 @@ static struct clk dsp_irate_ick = {
1077 .name = "dsp_irate_ick", 445 .name = "dsp_irate_ick",
1078 .ops = &clkops_null, 446 .ops = &clkops_null,
1079 .parent = &dsp_fck, 447 .parent = &dsp_fck,
1080 .flags = DELAYED_APP | CONFIG_PARTICIPANT,
1081 .clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL), 448 .clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),
1082 .clksel_mask = OMAP24XX_CLKSEL_DSP_IF_MASK, 449 .clksel_mask = OMAP24XX_CLKSEL_DSP_IF_MASK,
1083 .clksel = dsp_irate_ick_clksel, 450 .clksel = dsp_irate_ick_clksel,
1084 .recalc = &omap2_clksel_recalc, 451 .recalc = &omap2_clksel_recalc,
1085 .round_rate = &omap2_clksel_round_rate,
1086 .set_rate = &omap2_clksel_set_rate
1087};
1088
1089/* 2420 only */
1090static struct clk dsp_ick = {
1091 .name = "dsp_ick", /* apparently ipi and isp */
1092 .ops = &clkops_omap2_dflt_wait,
1093 .parent = &dsp_irate_ick,
1094 .flags = DELAYED_APP | CONFIG_PARTICIPANT,
1095 .enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_ICLKEN),
1096 .enable_bit = OMAP2420_EN_DSP_IPI_SHIFT, /* for ipi */
1097}; 452};
1098 453
1099/* 2430 only - EN_DSP controls both dsp fclk and iclk on 2430 */ 454/* 2430 only - EN_DSP controls both dsp fclk and iclk on 2430 */
@@ -1101,45 +456,11 @@ static struct clk iva2_1_ick = {
1101 .name = "iva2_1_ick", 456 .name = "iva2_1_ick",
1102 .ops = &clkops_omap2_dflt_wait, 457 .ops = &clkops_omap2_dflt_wait,
1103 .parent = &dsp_irate_ick, 458 .parent = &dsp_irate_ick,
1104 .flags = DELAYED_APP | CONFIG_PARTICIPANT,
1105 .enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN), 459 .enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
1106 .enable_bit = OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT, 460 .enable_bit = OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT,
1107}; 461};
1108 462
1109/* 463/*
1110 * The IVA1 is an ARM7 core on the 2420 that has nothing to do with
1111 * the C54x, but which is contained in the DSP powerdomain. Does not
1112 * exist on later OMAPs.
1113 */
1114static struct clk iva1_ifck = {
1115 .name = "iva1_ifck",
1116 .ops = &clkops_omap2_dflt_wait,
1117 .parent = &core_ck,
1118 .flags = CONFIG_PARTICIPANT | DELAYED_APP,
1119 .clkdm_name = "iva1_clkdm",
1120 .enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
1121 .enable_bit = OMAP2420_EN_IVA_COP_SHIFT,
1122 .clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),
1123 .clksel_mask = OMAP2420_CLKSEL_IVA_MASK,
1124 .clksel = dsp_fck_clksel,
1125 .recalc = &omap2_clksel_recalc,
1126 .round_rate = &omap2_clksel_round_rate,
1127 .set_rate = &omap2_clksel_set_rate
1128};
1129
1130/* IVA1 mpu/int/i/f clocks are /2 of parent */
1131static struct clk iva1_mpu_int_ifck = {
1132 .name = "iva1_mpu_int_ifck",
1133 .ops = &clkops_omap2_dflt_wait,
1134 .parent = &iva1_ifck,
1135 .clkdm_name = "iva1_clkdm",
1136 .enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),
1137 .enable_bit = OMAP2420_EN_IVA_MPU_SHIFT,
1138 .fixed_div = 2,
1139 .recalc = &omap2_fixed_divisor_recalc,
1140};
1141
1142/*
1143 * L3 clock domain 464 * L3 clock domain
1144 * L3 clocks are used for both interface and functional clocks to 465 * L3 clocks are used for both interface and functional clocks to
1145 * multiple entities. Some of these clocks are completely managed 466 * multiple entities. Some of these clocks are completely managed
@@ -1160,12 +481,8 @@ static struct clk iva1_mpu_int_ifck = {
1160 */ 481 */
1161static const struct clksel_rate core_l3_core_rates[] = { 482static const struct clksel_rate core_l3_core_rates[] = {
1162 { .div = 1, .val = 1, .flags = RATE_IN_24XX }, 483 { .div = 1, .val = 1, .flags = RATE_IN_24XX },
1163 { .div = 2, .val = 2, .flags = RATE_IN_242X },
1164 { .div = 4, .val = 4, .flags = RATE_IN_24XX | DEFAULT_RATE }, 484 { .div = 4, .val = 4, .flags = RATE_IN_24XX | DEFAULT_RATE },
1165 { .div = 6, .val = 6, .flags = RATE_IN_24XX }, 485 { .div = 6, .val = 6, .flags = RATE_IN_24XX },
1166 { .div = 8, .val = 8, .flags = RATE_IN_242X },
1167 { .div = 12, .val = 12, .flags = RATE_IN_242X },
1168 { .div = 16, .val = 16, .flags = RATE_IN_242X },
1169 { .div = 0 } 486 { .div = 0 }
1170}; 487};
1171 488
@@ -1178,14 +495,11 @@ static struct clk core_l3_ck = { /* Used for ick and fck, interconnect */
1178 .name = "core_l3_ck", 495 .name = "core_l3_ck",
1179 .ops = &clkops_null, 496 .ops = &clkops_null,
1180 .parent = &core_ck, 497 .parent = &core_ck,
1181 .flags = DELAYED_APP | CONFIG_PARTICIPANT,
1182 .clkdm_name = "core_l3_clkdm", 498 .clkdm_name = "core_l3_clkdm",
1183 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1), 499 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
1184 .clksel_mask = OMAP24XX_CLKSEL_L3_MASK, 500 .clksel_mask = OMAP24XX_CLKSEL_L3_MASK,
1185 .clksel = core_l3_clksel, 501 .clksel = core_l3_clksel,
1186 .recalc = &omap2_clksel_recalc, 502 .recalc = &omap2_clksel_recalc,
1187 .round_rate = &omap2_clksel_round_rate,
1188 .set_rate = &omap2_clksel_set_rate
1189}; 503};
1190 504
1191/* usb_l4_ick */ 505/* usb_l4_ick */
@@ -1206,7 +520,6 @@ static struct clk usb_l4_ick = { /* FS-USB interface clock */
1206 .name = "usb_l4_ick", 520 .name = "usb_l4_ick",
1207 .ops = &clkops_omap2_dflt_wait, 521 .ops = &clkops_omap2_dflt_wait,
1208 .parent = &core_l3_ck, 522 .parent = &core_l3_ck,
1209 .flags = DELAYED_APP | CONFIG_PARTICIPANT,
1210 .clkdm_name = "core_l4_clkdm", 523 .clkdm_name = "core_l4_clkdm",
1211 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), 524 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
1212 .enable_bit = OMAP24XX_EN_USB_SHIFT, 525 .enable_bit = OMAP24XX_EN_USB_SHIFT,
@@ -1214,8 +527,6 @@ static struct clk usb_l4_ick = { /* FS-USB interface clock */
1214 .clksel_mask = OMAP24XX_CLKSEL_USB_MASK, 527 .clksel_mask = OMAP24XX_CLKSEL_USB_MASK,
1215 .clksel = usb_l4_ick_clksel, 528 .clksel = usb_l4_ick_clksel,
1216 .recalc = &omap2_clksel_recalc, 529 .recalc = &omap2_clksel_recalc,
1217 .round_rate = &omap2_clksel_round_rate,
1218 .set_rate = &omap2_clksel_set_rate
1219}; 530};
1220 531
1221/* 532/*
@@ -1240,14 +551,11 @@ static struct clk l4_ck = { /* used both as an ick and fck */
1240 .name = "l4_ck", 551 .name = "l4_ck",
1241 .ops = &clkops_null, 552 .ops = &clkops_null,
1242 .parent = &core_l3_ck, 553 .parent = &core_l3_ck,
1243 .flags = DELAYED_APP,
1244 .clkdm_name = "core_l4_clkdm", 554 .clkdm_name = "core_l4_clkdm",
1245 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1), 555 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
1246 .clksel_mask = OMAP24XX_CLKSEL_L4_MASK, 556 .clksel_mask = OMAP24XX_CLKSEL_L4_MASK,
1247 .clksel = l4_clksel, 557 .clksel = l4_clksel,
1248 .recalc = &omap2_clksel_recalc, 558 .recalc = &omap2_clksel_recalc,
1249 .round_rate = &omap2_clksel_round_rate,
1250 .set_rate = &omap2_clksel_set_rate
1251}; 559};
1252 560
1253/* 561/*
@@ -1264,8 +572,6 @@ static const struct clksel_rate ssi_ssr_sst_fck_core_rates[] = {
1264 { .div = 3, .val = 3, .flags = RATE_IN_24XX }, 572 { .div = 3, .val = 3, .flags = RATE_IN_24XX },
1265 { .div = 4, .val = 4, .flags = RATE_IN_24XX }, 573 { .div = 4, .val = 4, .flags = RATE_IN_24XX },
1266 { .div = 5, .val = 5, .flags = RATE_IN_243X }, 574 { .div = 5, .val = 5, .flags = RATE_IN_243X },
1267 { .div = 6, .val = 6, .flags = RATE_IN_242X },
1268 { .div = 8, .val = 8, .flags = RATE_IN_242X },
1269 { .div = 0 } 575 { .div = 0 }
1270}; 576};
1271 577
@@ -1278,7 +584,6 @@ static struct clk ssi_ssr_sst_fck = {
1278 .name = "ssi_fck", 584 .name = "ssi_fck",
1279 .ops = &clkops_omap2_dflt_wait, 585 .ops = &clkops_omap2_dflt_wait,
1280 .parent = &core_ck, 586 .parent = &core_ck,
1281 .flags = DELAYED_APP,
1282 .clkdm_name = "core_l3_clkdm", 587 .clkdm_name = "core_l3_clkdm",
1283 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2), 588 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
1284 .enable_bit = OMAP24XX_EN_SSI_SHIFT, 589 .enable_bit = OMAP24XX_EN_SSI_SHIFT,
@@ -1286,8 +591,6 @@ static struct clk ssi_ssr_sst_fck = {
1286 .clksel_mask = OMAP24XX_CLKSEL_SSI_MASK, 591 .clksel_mask = OMAP24XX_CLKSEL_SSI_MASK,
1287 .clksel = ssi_ssr_sst_fck_clksel, 592 .clksel = ssi_ssr_sst_fck_clksel,
1288 .recalc = &omap2_clksel_recalc, 593 .recalc = &omap2_clksel_recalc,
1289 .round_rate = &omap2_clksel_round_rate,
1290 .set_rate = &omap2_clksel_set_rate
1291}; 594};
1292 595
1293/* 596/*
@@ -1316,7 +619,6 @@ static struct clk ssi_l4_ick = {
1316 * divided value of fclk. 619 * divided value of fclk.
1317 * 620 *
1318 */ 621 */
1319/* XXX REVISIT: GFX clock is part of CONFIG_PARTICIPANT, no? doublecheck. */
1320 622
1321/* This clksel struct is shared between gfx_3d_fck and gfx_2d_fck */ 623/* This clksel struct is shared between gfx_3d_fck and gfx_2d_fck */
1322static const struct clksel gfx_fck_clksel[] = { 624static const struct clksel gfx_fck_clksel[] = {
@@ -1350,8 +652,6 @@ static struct clk gfx_2d_fck = {
1350 .clksel_mask = OMAP_CLKSEL_GFX_MASK, 652 .clksel_mask = OMAP_CLKSEL_GFX_MASK,
1351 .clksel = gfx_fck_clksel, 653 .clksel = gfx_fck_clksel,
1352 .recalc = &omap2_clksel_recalc, 654 .recalc = &omap2_clksel_recalc,
1353 .round_rate = &omap2_clksel_round_rate,
1354 .set_rate = &omap2_clksel_set_rate
1355}; 655};
1356 656
1357static struct clk gfx_ick = { 657static struct clk gfx_ick = {
@@ -1388,7 +688,6 @@ static struct clk mdm_ick = { /* used both as a ick and fck */
1388 .name = "mdm_ick", 688 .name = "mdm_ick",
1389 .ops = &clkops_omap2_dflt_wait, 689 .ops = &clkops_omap2_dflt_wait,
1390 .parent = &core_ck, 690 .parent = &core_ck,
1391 .flags = DELAYED_APP | CONFIG_PARTICIPANT,
1392 .clkdm_name = "mdm_clkdm", 691 .clkdm_name = "mdm_clkdm",
1393 .enable_reg = OMAP_CM_REGADDR(OMAP2430_MDM_MOD, CM_ICLKEN), 692 .enable_reg = OMAP_CM_REGADDR(OMAP2430_MDM_MOD, CM_ICLKEN),
1394 .enable_bit = OMAP2430_CM_ICLKEN_MDM_EN_MDM_SHIFT, 693 .enable_bit = OMAP2430_CM_ICLKEN_MDM_EN_MDM_SHIFT,
@@ -1396,8 +695,6 @@ static struct clk mdm_ick = { /* used both as a ick and fck */
1396 .clksel_mask = OMAP2430_CLKSEL_MDM_MASK, 695 .clksel_mask = OMAP2430_CLKSEL_MDM_MASK,
1397 .clksel = mdm_ick_clksel, 696 .clksel = mdm_ick_clksel,
1398 .recalc = &omap2_clksel_recalc, 697 .recalc = &omap2_clksel_recalc,
1399 .round_rate = &omap2_clksel_round_rate,
1400 .set_rate = &omap2_clksel_set_rate
1401}; 698};
1402 699
1403static struct clk mdm_osc_ck = { 700static struct clk mdm_osc_ck = {
@@ -1459,7 +756,6 @@ static struct clk dss1_fck = {
1459 .name = "dss1_fck", 756 .name = "dss1_fck",
1460 .ops = &clkops_omap2_dflt, 757 .ops = &clkops_omap2_dflt,
1461 .parent = &core_ck, /* Core or sys */ 758 .parent = &core_ck, /* Core or sys */
1462 .flags = DELAYED_APP,
1463 .clkdm_name = "dss_clkdm", 759 .clkdm_name = "dss_clkdm",
1464 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), 760 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1465 .enable_bit = OMAP24XX_EN_DSS1_SHIFT, 761 .enable_bit = OMAP24XX_EN_DSS1_SHIFT,
@@ -1468,8 +764,6 @@ static struct clk dss1_fck = {
1468 .clksel_mask = OMAP24XX_CLKSEL_DSS1_MASK, 764 .clksel_mask = OMAP24XX_CLKSEL_DSS1_MASK,
1469 .clksel = dss1_fck_clksel, 765 .clksel = dss1_fck_clksel,
1470 .recalc = &omap2_clksel_recalc, 766 .recalc = &omap2_clksel_recalc,
1471 .round_rate = &omap2_clksel_round_rate,
1472 .set_rate = &omap2_clksel_set_rate
1473}; 767};
1474 768
1475static const struct clksel_rate dss2_fck_sys_rates[] = { 769static const struct clksel_rate dss2_fck_sys_rates[] = {
@@ -1492,7 +786,6 @@ static struct clk dss2_fck = { /* Alt clk used in power management */
1492 .name = "dss2_fck", 786 .name = "dss2_fck",
1493 .ops = &clkops_omap2_dflt, 787 .ops = &clkops_omap2_dflt,
1494 .parent = &sys_ck, /* fixed at sys_ck or 48MHz */ 788 .parent = &sys_ck, /* fixed at sys_ck or 48MHz */
1495 .flags = DELAYED_APP,
1496 .clkdm_name = "dss_clkdm", 789 .clkdm_name = "dss_clkdm",
1497 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), 790 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1498 .enable_bit = OMAP24XX_EN_DSS2_SHIFT, 791 .enable_bit = OMAP24XX_EN_DSS2_SHIFT,
@@ -1821,9 +1114,8 @@ static struct clk gpt12_fck = {
1821}; 1114};
1822 1115
1823static struct clk mcbsp1_ick = { 1116static struct clk mcbsp1_ick = {
1824 .name = "mcbsp_ick", 1117 .name = "mcbsp1_ick",
1825 .ops = &clkops_omap2_dflt_wait, 1118 .ops = &clkops_omap2_dflt_wait,
1826 .id = 1,
1827 .parent = &l4_ck, 1119 .parent = &l4_ck,
1828 .clkdm_name = "core_l4_clkdm", 1120 .clkdm_name = "core_l4_clkdm",
1829 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), 1121 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
@@ -1832,9 +1124,8 @@ static struct clk mcbsp1_ick = {
1832}; 1124};
1833 1125
1834static struct clk mcbsp1_fck = { 1126static struct clk mcbsp1_fck = {
1835 .name = "mcbsp_fck", 1127 .name = "mcbsp1_fck",
1836 .ops = &clkops_omap2_dflt_wait, 1128 .ops = &clkops_omap2_dflt_wait,
1837 .id = 1,
1838 .parent = &func_96m_ck, 1129 .parent = &func_96m_ck,
1839 .clkdm_name = "core_l4_clkdm", 1130 .clkdm_name = "core_l4_clkdm",
1840 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), 1131 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
@@ -1843,9 +1134,8 @@ static struct clk mcbsp1_fck = {
1843}; 1134};
1844 1135
1845static struct clk mcbsp2_ick = { 1136static struct clk mcbsp2_ick = {
1846 .name = "mcbsp_ick", 1137 .name = "mcbsp2_ick",
1847 .ops = &clkops_omap2_dflt_wait, 1138 .ops = &clkops_omap2_dflt_wait,
1848 .id = 2,
1849 .parent = &l4_ck, 1139 .parent = &l4_ck,
1850 .clkdm_name = "core_l4_clkdm", 1140 .clkdm_name = "core_l4_clkdm",
1851 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), 1141 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
@@ -1854,9 +1144,8 @@ static struct clk mcbsp2_ick = {
1854}; 1144};
1855 1145
1856static struct clk mcbsp2_fck = { 1146static struct clk mcbsp2_fck = {
1857 .name = "mcbsp_fck", 1147 .name = "mcbsp2_fck",
1858 .ops = &clkops_omap2_dflt_wait, 1148 .ops = &clkops_omap2_dflt_wait,
1859 .id = 2,
1860 .parent = &func_96m_ck, 1149 .parent = &func_96m_ck,
1861 .clkdm_name = "core_l4_clkdm", 1150 .clkdm_name = "core_l4_clkdm",
1862 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), 1151 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
@@ -1865,9 +1154,8 @@ static struct clk mcbsp2_fck = {
1865}; 1154};
1866 1155
1867static struct clk mcbsp3_ick = { 1156static struct clk mcbsp3_ick = {
1868 .name = "mcbsp_ick", 1157 .name = "mcbsp3_ick",
1869 .ops = &clkops_omap2_dflt_wait, 1158 .ops = &clkops_omap2_dflt_wait,
1870 .id = 3,
1871 .parent = &l4_ck, 1159 .parent = &l4_ck,
1872 .clkdm_name = "core_l4_clkdm", 1160 .clkdm_name = "core_l4_clkdm",
1873 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), 1161 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
@@ -1876,9 +1164,8 @@ static struct clk mcbsp3_ick = {
1876}; 1164};
1877 1165
1878static struct clk mcbsp3_fck = { 1166static struct clk mcbsp3_fck = {
1879 .name = "mcbsp_fck", 1167 .name = "mcbsp3_fck",
1880 .ops = &clkops_omap2_dflt_wait, 1168 .ops = &clkops_omap2_dflt_wait,
1881 .id = 3,
1882 .parent = &func_96m_ck, 1169 .parent = &func_96m_ck,
1883 .clkdm_name = "core_l4_clkdm", 1170 .clkdm_name = "core_l4_clkdm",
1884 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2), 1171 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
@@ -1887,9 +1174,8 @@ static struct clk mcbsp3_fck = {
1887}; 1174};
1888 1175
1889static struct clk mcbsp4_ick = { 1176static struct clk mcbsp4_ick = {
1890 .name = "mcbsp_ick", 1177 .name = "mcbsp4_ick",
1891 .ops = &clkops_omap2_dflt_wait, 1178 .ops = &clkops_omap2_dflt_wait,
1892 .id = 4,
1893 .parent = &l4_ck, 1179 .parent = &l4_ck,
1894 .clkdm_name = "core_l4_clkdm", 1180 .clkdm_name = "core_l4_clkdm",
1895 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), 1181 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
@@ -1898,9 +1184,8 @@ static struct clk mcbsp4_ick = {
1898}; 1184};
1899 1185
1900static struct clk mcbsp4_fck = { 1186static struct clk mcbsp4_fck = {
1901 .name = "mcbsp_fck", 1187 .name = "mcbsp4_fck",
1902 .ops = &clkops_omap2_dflt_wait, 1188 .ops = &clkops_omap2_dflt_wait,
1903 .id = 4,
1904 .parent = &func_96m_ck, 1189 .parent = &func_96m_ck,
1905 .clkdm_name = "core_l4_clkdm", 1190 .clkdm_name = "core_l4_clkdm",
1906 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2), 1191 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
@@ -1909,9 +1194,8 @@ static struct clk mcbsp4_fck = {
1909}; 1194};
1910 1195
1911static struct clk mcbsp5_ick = { 1196static struct clk mcbsp5_ick = {
1912 .name = "mcbsp_ick", 1197 .name = "mcbsp5_ick",
1913 .ops = &clkops_omap2_dflt_wait, 1198 .ops = &clkops_omap2_dflt_wait,
1914 .id = 5,
1915 .parent = &l4_ck, 1199 .parent = &l4_ck,
1916 .clkdm_name = "core_l4_clkdm", 1200 .clkdm_name = "core_l4_clkdm",
1917 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), 1201 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
@@ -1920,9 +1204,8 @@ static struct clk mcbsp5_ick = {
1920}; 1204};
1921 1205
1922static struct clk mcbsp5_fck = { 1206static struct clk mcbsp5_fck = {
1923 .name = "mcbsp_fck", 1207 .name = "mcbsp5_fck",
1924 .ops = &clkops_omap2_dflt_wait, 1208 .ops = &clkops_omap2_dflt_wait,
1925 .id = 5,
1926 .parent = &func_96m_ck, 1209 .parent = &func_96m_ck,
1927 .clkdm_name = "core_l4_clkdm", 1210 .clkdm_name = "core_l4_clkdm",
1928 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2), 1211 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
@@ -1931,9 +1214,8 @@ static struct clk mcbsp5_fck = {
1931}; 1214};
1932 1215
1933static struct clk mcspi1_ick = { 1216static struct clk mcspi1_ick = {
1934 .name = "mcspi_ick", 1217 .name = "mcspi1_ick",
1935 .ops = &clkops_omap2_dflt_wait, 1218 .ops = &clkops_omap2_dflt_wait,
1936 .id = 1,
1937 .parent = &l4_ck, 1219 .parent = &l4_ck,
1938 .clkdm_name = "core_l4_clkdm", 1220 .clkdm_name = "core_l4_clkdm",
1939 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), 1221 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
@@ -1942,9 +1224,8 @@ static struct clk mcspi1_ick = {
1942}; 1224};
1943 1225
1944static struct clk mcspi1_fck = { 1226static struct clk mcspi1_fck = {
1945 .name = "mcspi_fck", 1227 .name = "mcspi1_fck",
1946 .ops = &clkops_omap2_dflt_wait, 1228 .ops = &clkops_omap2_dflt_wait,
1947 .id = 1,
1948 .parent = &func_48m_ck, 1229 .parent = &func_48m_ck,
1949 .clkdm_name = "core_l4_clkdm", 1230 .clkdm_name = "core_l4_clkdm",
1950 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), 1231 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
@@ -1953,9 +1234,8 @@ static struct clk mcspi1_fck = {
1953}; 1234};
1954 1235
1955static struct clk mcspi2_ick = { 1236static struct clk mcspi2_ick = {
1956 .name = "mcspi_ick", 1237 .name = "mcspi2_ick",
1957 .ops = &clkops_omap2_dflt_wait, 1238 .ops = &clkops_omap2_dflt_wait,
1958 .id = 2,
1959 .parent = &l4_ck, 1239 .parent = &l4_ck,
1960 .clkdm_name = "core_l4_clkdm", 1240 .clkdm_name = "core_l4_clkdm",
1961 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), 1241 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
@@ -1964,9 +1244,8 @@ static struct clk mcspi2_ick = {
1964}; 1244};
1965 1245
1966static struct clk mcspi2_fck = { 1246static struct clk mcspi2_fck = {
1967 .name = "mcspi_fck", 1247 .name = "mcspi2_fck",
1968 .ops = &clkops_omap2_dflt_wait, 1248 .ops = &clkops_omap2_dflt_wait,
1969 .id = 2,
1970 .parent = &func_48m_ck, 1249 .parent = &func_48m_ck,
1971 .clkdm_name = "core_l4_clkdm", 1250 .clkdm_name = "core_l4_clkdm",
1972 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), 1251 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
@@ -1975,9 +1254,8 @@ static struct clk mcspi2_fck = {
1975}; 1254};
1976 1255
1977static struct clk mcspi3_ick = { 1256static struct clk mcspi3_ick = {
1978 .name = "mcspi_ick", 1257 .name = "mcspi3_ick",
1979 .ops = &clkops_omap2_dflt_wait, 1258 .ops = &clkops_omap2_dflt_wait,
1980 .id = 3,
1981 .parent = &l4_ck, 1259 .parent = &l4_ck,
1982 .clkdm_name = "core_l4_clkdm", 1260 .clkdm_name = "core_l4_clkdm",
1983 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), 1261 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
@@ -1986,9 +1264,8 @@ static struct clk mcspi3_ick = {
1986}; 1264};
1987 1265
1988static struct clk mcspi3_fck = { 1266static struct clk mcspi3_fck = {
1989 .name = "mcspi_fck", 1267 .name = "mcspi3_fck",
1990 .ops = &clkops_omap2_dflt_wait, 1268 .ops = &clkops_omap2_dflt_wait,
1991 .id = 3,
1992 .parent = &func_48m_ck, 1269 .parent = &func_48m_ck,
1993 .clkdm_name = "core_l4_clkdm", 1270 .clkdm_name = "core_l4_clkdm",
1994 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2), 1271 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
@@ -2193,26 +1470,6 @@ static struct clk wdt4_fck = {
2193 .recalc = &followparent_recalc, 1470 .recalc = &followparent_recalc,
2194}; 1471};
2195 1472
2196static struct clk wdt3_ick = {
2197 .name = "wdt3_ick",
2198 .ops = &clkops_omap2_dflt_wait,
2199 .parent = &l4_ck,
2200 .clkdm_name = "core_l4_clkdm",
2201 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2202 .enable_bit = OMAP2420_EN_WDT3_SHIFT,
2203 .recalc = &followparent_recalc,
2204};
2205
2206static struct clk wdt3_fck = {
2207 .name = "wdt3_fck",
2208 .ops = &clkops_omap2_dflt_wait,
2209 .parent = &func_32k_ck,
2210 .clkdm_name = "core_l4_clkdm",
2211 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
2212 .enable_bit = OMAP2420_EN_WDT3_SHIFT,
2213 .recalc = &followparent_recalc,
2214};
2215
2216static struct clk mspro_ick = { 1473static struct clk mspro_ick = {
2217 .name = "mspro_ick", 1474 .name = "mspro_ick",
2218 .ops = &clkops_omap2_dflt_wait, 1475 .ops = &clkops_omap2_dflt_wait,
@@ -2233,26 +1490,6 @@ static struct clk mspro_fck = {
2233 .recalc = &followparent_recalc, 1490 .recalc = &followparent_recalc,
2234}; 1491};
2235 1492
2236static struct clk mmc_ick = {
2237 .name = "mmc_ick",
2238 .ops = &clkops_omap2_dflt_wait,
2239 .parent = &l4_ck,
2240 .clkdm_name = "core_l4_clkdm",
2241 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2242 .enable_bit = OMAP2420_EN_MMC_SHIFT,
2243 .recalc = &followparent_recalc,
2244};
2245
2246static struct clk mmc_fck = {
2247 .name = "mmc_fck",
2248 .ops = &clkops_omap2_dflt_wait,
2249 .parent = &func_96m_ck,
2250 .clkdm_name = "core_l4_clkdm",
2251 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
2252 .enable_bit = OMAP2420_EN_MMC_SHIFT,
2253 .recalc = &followparent_recalc,
2254};
2255
2256static struct clk fac_ick = { 1493static struct clk fac_ick = {
2257 .name = "fac_ick", 1494 .name = "fac_ick",
2258 .ops = &clkops_omap2_dflt_wait, 1495 .ops = &clkops_omap2_dflt_wait,
@@ -2273,26 +1510,6 @@ static struct clk fac_fck = {
2273 .recalc = &followparent_recalc, 1510 .recalc = &followparent_recalc,
2274}; 1511};
2275 1512
2276static struct clk eac_ick = {
2277 .name = "eac_ick",
2278 .ops = &clkops_omap2_dflt_wait,
2279 .parent = &l4_ck,
2280 .clkdm_name = "core_l4_clkdm",
2281 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2282 .enable_bit = OMAP2420_EN_EAC_SHIFT,
2283 .recalc = &followparent_recalc,
2284};
2285
2286static struct clk eac_fck = {
2287 .name = "eac_fck",
2288 .ops = &clkops_omap2_dflt_wait,
2289 .parent = &func_96m_ck,
2290 .clkdm_name = "core_l4_clkdm",
2291 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
2292 .enable_bit = OMAP2420_EN_EAC_SHIFT,
2293 .recalc = &followparent_recalc,
2294};
2295
2296static struct clk hdq_ick = { 1513static struct clk hdq_ick = {
2297 .name = "hdq_ick", 1514 .name = "hdq_ick",
2298 .ops = &clkops_omap2_dflt_wait, 1515 .ops = &clkops_omap2_dflt_wait,
@@ -2313,10 +1530,13 @@ static struct clk hdq_fck = {
2313 .recalc = &followparent_recalc, 1530 .recalc = &followparent_recalc,
2314}; 1531};
2315 1532
1533/*
1534 * XXX This is marked as a 2420-only define, but it claims to be present
1535 * on 2430 also. Double-check.
1536 */
2316static struct clk i2c2_ick = { 1537static struct clk i2c2_ick = {
2317 .name = "i2c_ick", 1538 .name = "i2c2_ick",
2318 .ops = &clkops_omap2_dflt_wait, 1539 .ops = &clkops_omap2_dflt_wait,
2319 .id = 2,
2320 .parent = &l4_ck, 1540 .parent = &l4_ck,
2321 .clkdm_name = "core_l4_clkdm", 1541 .clkdm_name = "core_l4_clkdm",
2322 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), 1542 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
@@ -2324,21 +1544,9 @@ static struct clk i2c2_ick = {
2324 .recalc = &followparent_recalc, 1544 .recalc = &followparent_recalc,
2325}; 1545};
2326 1546
2327static struct clk i2c2_fck = {
2328 .name = "i2c_fck",
2329 .ops = &clkops_omap2_dflt_wait,
2330 .id = 2,
2331 .parent = &func_12m_ck,
2332 .clkdm_name = "core_l4_clkdm",
2333 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
2334 .enable_bit = OMAP2420_EN_I2C2_SHIFT,
2335 .recalc = &followparent_recalc,
2336};
2337
2338static struct clk i2chs2_fck = { 1547static struct clk i2chs2_fck = {
2339 .name = "i2c_fck", 1548 .name = "i2chs2_fck",
2340 .ops = &clkops_omap2430_i2chs_wait, 1549 .ops = &clkops_omap2430_i2chs_wait,
2341 .id = 2,
2342 .parent = &func_96m_ck, 1550 .parent = &func_96m_ck,
2343 .clkdm_name = "core_l4_clkdm", 1551 .clkdm_name = "core_l4_clkdm",
2344 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2), 1552 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
@@ -2346,10 +1554,13 @@ static struct clk i2chs2_fck = {
2346 .recalc = &followparent_recalc, 1554 .recalc = &followparent_recalc,
2347}; 1555};
2348 1556
1557/*
1558 * XXX This is marked as a 2420-only define, but it claims to be present
1559 * on 2430 also. Double-check.
1560 */
2349static struct clk i2c1_ick = { 1561static struct clk i2c1_ick = {
2350 .name = "i2c_ick", 1562 .name = "i2c1_ick",
2351 .ops = &clkops_omap2_dflt_wait, 1563 .ops = &clkops_omap2_dflt_wait,
2352 .id = 1,
2353 .parent = &l4_ck, 1564 .parent = &l4_ck,
2354 .clkdm_name = "core_l4_clkdm", 1565 .clkdm_name = "core_l4_clkdm",
2355 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1), 1566 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
@@ -2357,21 +1568,9 @@ static struct clk i2c1_ick = {
2357 .recalc = &followparent_recalc, 1568 .recalc = &followparent_recalc,
2358}; 1569};
2359 1570
2360static struct clk i2c1_fck = {
2361 .name = "i2c_fck",
2362 .ops = &clkops_omap2_dflt_wait,
2363 .id = 1,
2364 .parent = &func_12m_ck,
2365 .clkdm_name = "core_l4_clkdm",
2366 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
2367 .enable_bit = OMAP2420_EN_I2C1_SHIFT,
2368 .recalc = &followparent_recalc,
2369};
2370
2371static struct clk i2chs1_fck = { 1571static struct clk i2chs1_fck = {
2372 .name = "i2c_fck", 1572 .name = "i2chs1_fck",
2373 .ops = &clkops_omap2430_i2chs_wait, 1573 .ops = &clkops_omap2430_i2chs_wait,
2374 .id = 1,
2375 .parent = &func_96m_ck, 1574 .parent = &func_96m_ck,
2376 .clkdm_name = "core_l4_clkdm", 1575 .clkdm_name = "core_l4_clkdm",
2377 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2), 1576 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
@@ -2404,58 +1603,6 @@ static struct clk sdma_ick = {
2404 .recalc = &followparent_recalc, 1603 .recalc = &followparent_recalc,
2405}; 1604};
2406 1605
2407static struct clk vlynq_ick = {
2408 .name = "vlynq_ick",
2409 .ops = &clkops_omap2_dflt_wait,
2410 .parent = &core_l3_ck,
2411 .clkdm_name = "core_l3_clkdm",
2412 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2413 .enable_bit = OMAP2420_EN_VLYNQ_SHIFT,
2414 .recalc = &followparent_recalc,
2415};
2416
2417static const struct clksel_rate vlynq_fck_96m_rates[] = {
2418 { .div = 1, .val = 0, .flags = RATE_IN_242X | DEFAULT_RATE },
2419 { .div = 0 }
2420};
2421
2422static const struct clksel_rate vlynq_fck_core_rates[] = {
2423 { .div = 1, .val = 1, .flags = RATE_IN_242X },
2424 { .div = 2, .val = 2, .flags = RATE_IN_242X },
2425 { .div = 3, .val = 3, .flags = RATE_IN_242X },
2426 { .div = 4, .val = 4, .flags = RATE_IN_242X },
2427 { .div = 6, .val = 6, .flags = RATE_IN_242X },
2428 { .div = 8, .val = 8, .flags = RATE_IN_242X },
2429 { .div = 9, .val = 9, .flags = RATE_IN_242X },
2430 { .div = 12, .val = 12, .flags = RATE_IN_242X },
2431 { .div = 16, .val = 16, .flags = RATE_IN_242X | DEFAULT_RATE },
2432 { .div = 18, .val = 18, .flags = RATE_IN_242X },
2433 { .div = 0 }
2434};
2435
2436static const struct clksel vlynq_fck_clksel[] = {
2437 { .parent = &func_96m_ck, .rates = vlynq_fck_96m_rates },
2438 { .parent = &core_ck, .rates = vlynq_fck_core_rates },
2439 { .parent = NULL }
2440};
2441
2442static struct clk vlynq_fck = {
2443 .name = "vlynq_fck",
2444 .ops = &clkops_omap2_dflt_wait,
2445 .parent = &func_96m_ck,
2446 .flags = DELAYED_APP,
2447 .clkdm_name = "core_l3_clkdm",
2448 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
2449 .enable_bit = OMAP2420_EN_VLYNQ_SHIFT,
2450 .init = &omap2_init_clksel_parent,
2451 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),
2452 .clksel_mask = OMAP2420_CLKSEL_VLYNQ_MASK,
2453 .clksel = vlynq_fck_clksel,
2454 .recalc = &omap2_clksel_recalc,
2455 .round_rate = &omap2_clksel_round_rate,
2456 .set_rate = &omap2_clksel_set_rate
2457};
2458
2459static struct clk sdrc_ick = { 1606static struct clk sdrc_ick = {
2460 .name = "sdrc_ick", 1607 .name = "sdrc_ick",
2461 .ops = &clkops_omap2_dflt_wait, 1608 .ops = &clkops_omap2_dflt_wait,
@@ -2538,7 +1685,7 @@ static struct clk usbhs_ick = {
2538}; 1685};
2539 1686
2540static struct clk mmchs1_ick = { 1687static struct clk mmchs1_ick = {
2541 .name = "mmchs_ick", 1688 .name = "mmchs1_ick",
2542 .ops = &clkops_omap2_dflt_wait, 1689 .ops = &clkops_omap2_dflt_wait,
2543 .parent = &l4_ck, 1690 .parent = &l4_ck,
2544 .clkdm_name = "core_l4_clkdm", 1691 .clkdm_name = "core_l4_clkdm",
@@ -2548,7 +1695,7 @@ static struct clk mmchs1_ick = {
2548}; 1695};
2549 1696
2550static struct clk mmchs1_fck = { 1697static struct clk mmchs1_fck = {
2551 .name = "mmchs_fck", 1698 .name = "mmchs1_fck",
2552 .ops = &clkops_omap2_dflt_wait, 1699 .ops = &clkops_omap2_dflt_wait,
2553 .parent = &func_96m_ck, 1700 .parent = &func_96m_ck,
2554 .clkdm_name = "core_l3_clkdm", 1701 .clkdm_name = "core_l3_clkdm",
@@ -2558,9 +1705,8 @@ static struct clk mmchs1_fck = {
2558}; 1705};
2559 1706
2560static struct clk mmchs2_ick = { 1707static struct clk mmchs2_ick = {
2561 .name = "mmchs_ick", 1708 .name = "mmchs2_ick",
2562 .ops = &clkops_omap2_dflt_wait, 1709 .ops = &clkops_omap2_dflt_wait,
2563 .id = 1,
2564 .parent = &l4_ck, 1710 .parent = &l4_ck,
2565 .clkdm_name = "core_l4_clkdm", 1711 .clkdm_name = "core_l4_clkdm",
2566 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2), 1712 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
@@ -2569,9 +1715,8 @@ static struct clk mmchs2_ick = {
2569}; 1715};
2570 1716
2571static struct clk mmchs2_fck = { 1717static struct clk mmchs2_fck = {
2572 .name = "mmchs_fck", 1718 .name = "mmchs2_fck",
2573 .ops = &clkops_omap2_dflt_wait, 1719 .ops = &clkops_omap2_dflt_wait,
2574 .id = 1,
2575 .parent = &func_96m_ck, 1720 .parent = &func_96m_ck,
2576 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2), 1721 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
2577 .enable_bit = OMAP2430_EN_MMCHS2_SHIFT, 1722 .enable_bit = OMAP2430_EN_MMCHS2_SHIFT,
@@ -2609,7 +1754,7 @@ static struct clk mdm_intc_ick = {
2609}; 1754};
2610 1755
2611static struct clk mmchsdb1_fck = { 1756static struct clk mmchsdb1_fck = {
2612 .name = "mmchsdb_fck", 1757 .name = "mmchsdb1_fck",
2613 .ops = &clkops_omap2_dflt_wait, 1758 .ops = &clkops_omap2_dflt_wait,
2614 .parent = &func_32k_ck, 1759 .parent = &func_32k_ck,
2615 .clkdm_name = "core_l4_clkdm", 1760 .clkdm_name = "core_l4_clkdm",
@@ -2619,9 +1764,8 @@ static struct clk mmchsdb1_fck = {
2619}; 1764};
2620 1765
2621static struct clk mmchsdb2_fck = { 1766static struct clk mmchsdb2_fck = {
2622 .name = "mmchsdb_fck", 1767 .name = "mmchsdb2_fck",
2623 .ops = &clkops_omap2_dflt_wait, 1768 .ops = &clkops_omap2_dflt_wait,
2624 .id = 1,
2625 .parent = &func_32k_ck, 1769 .parent = &func_32k_ck,
2626 .clkdm_name = "core_l4_clkdm", 1770 .clkdm_name = "core_l4_clkdm",
2627 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2), 1771 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
@@ -2646,12 +1790,219 @@ static struct clk mmchsdb2_fck = {
2646static struct clk virt_prcm_set = { 1790static struct clk virt_prcm_set = {
2647 .name = "virt_prcm_set", 1791 .name = "virt_prcm_set",
2648 .ops = &clkops_null, 1792 .ops = &clkops_null,
2649 .flags = DELAYED_APP,
2650 .parent = &mpu_ck, /* Indexed by mpu speed, no parent */ 1793 .parent = &mpu_ck, /* Indexed by mpu speed, no parent */
2651 .recalc = &omap2_table_mpu_recalc, /* sets are keyed on mpu rate */ 1794 .recalc = &omap2_table_mpu_recalc, /* sets are keyed on mpu rate */
2652 .set_rate = &omap2_select_table_rate, 1795 .set_rate = &omap2_select_table_rate,
2653 .round_rate = &omap2_round_to_table_rate, 1796 .round_rate = &omap2_round_to_table_rate,
2654}; 1797};
2655 1798
2656#endif 1799
1800/*
1801 * clkdev integration
1802 */
1803
1804static struct omap_clk omap2430_clks[] = {
1805 /* external root sources */
1806 CLK(NULL, "func_32k_ck", &func_32k_ck, CK_243X),
1807 CLK(NULL, "secure_32k_ck", &secure_32k_ck, CK_243X),
1808 CLK(NULL, "osc_ck", &osc_ck, CK_243X),
1809 CLK(NULL, "sys_ck", &sys_ck, CK_243X),
1810 CLK(NULL, "alt_ck", &alt_ck, CK_243X),
1811 /* internal analog sources */
1812 CLK(NULL, "dpll_ck", &dpll_ck, CK_243X),
1813 CLK(NULL, "apll96_ck", &apll96_ck, CK_243X),
1814 CLK(NULL, "apll54_ck", &apll54_ck, CK_243X),
1815 /* internal prcm root sources */
1816 CLK(NULL, "func_54m_ck", &func_54m_ck, CK_243X),
1817 CLK(NULL, "core_ck", &core_ck, CK_243X),
1818 CLK(NULL, "func_96m_ck", &func_96m_ck, CK_243X),
1819 CLK(NULL, "func_48m_ck", &func_48m_ck, CK_243X),
1820 CLK(NULL, "func_12m_ck", &func_12m_ck, CK_243X),
1821 CLK(NULL, "ck_wdt1_osc", &wdt1_osc_ck, CK_243X),
1822 CLK(NULL, "sys_clkout_src", &sys_clkout_src, CK_243X),
1823 CLK(NULL, "sys_clkout", &sys_clkout, CK_243X),
1824 CLK(NULL, "emul_ck", &emul_ck, CK_243X),
1825 /* mpu domain clocks */
1826 CLK(NULL, "mpu_ck", &mpu_ck, CK_243X),
1827 /* dsp domain clocks */
1828 CLK(NULL, "dsp_fck", &dsp_fck, CK_243X),
1829 CLK(NULL, "dsp_irate_ick", &dsp_irate_ick, CK_243X),
1830 CLK(NULL, "iva2_1_ick", &iva2_1_ick, CK_243X),
1831 /* GFX domain clocks */
1832 CLK(NULL, "gfx_3d_fck", &gfx_3d_fck, CK_243X),
1833 CLK(NULL, "gfx_2d_fck", &gfx_2d_fck, CK_243X),
1834 CLK(NULL, "gfx_ick", &gfx_ick, CK_243X),
1835 /* Modem domain clocks */
1836 CLK(NULL, "mdm_ick", &mdm_ick, CK_243X),
1837 CLK(NULL, "mdm_osc_ck", &mdm_osc_ck, CK_243X),
1838 /* DSS domain clocks */
1839 CLK("omapdss", "ick", &dss_ick, CK_243X),
1840 CLK("omapdss", "dss1_fck", &dss1_fck, CK_243X),
1841 CLK("omapdss", "dss2_fck", &dss2_fck, CK_243X),
1842 CLK("omapdss", "tv_fck", &dss_54m_fck, CK_243X),
1843 /* L3 domain clocks */
1844 CLK(NULL, "core_l3_ck", &core_l3_ck, CK_243X),
1845 CLK(NULL, "ssi_fck", &ssi_ssr_sst_fck, CK_243X),
1846 CLK(NULL, "usb_l4_ick", &usb_l4_ick, CK_243X),
1847 /* L4 domain clocks */
1848 CLK(NULL, "l4_ck", &l4_ck, CK_243X),
1849 CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_243X),
1850 /* virtual meta-group clock */
1851 CLK(NULL, "virt_prcm_set", &virt_prcm_set, CK_243X),
1852 /* general l4 interface ck, multi-parent functional clk */
1853 CLK(NULL, "gpt1_ick", &gpt1_ick, CK_243X),
1854 CLK(NULL, "gpt1_fck", &gpt1_fck, CK_243X),
1855 CLK(NULL, "gpt2_ick", &gpt2_ick, CK_243X),
1856 CLK(NULL, "gpt2_fck", &gpt2_fck, CK_243X),
1857 CLK(NULL, "gpt3_ick", &gpt3_ick, CK_243X),
1858 CLK(NULL, "gpt3_fck", &gpt3_fck, CK_243X),
1859 CLK(NULL, "gpt4_ick", &gpt4_ick, CK_243X),
1860 CLK(NULL, "gpt4_fck", &gpt4_fck, CK_243X),
1861 CLK(NULL, "gpt5_ick", &gpt5_ick, CK_243X),
1862 CLK(NULL, "gpt5_fck", &gpt5_fck, CK_243X),
1863 CLK(NULL, "gpt6_ick", &gpt6_ick, CK_243X),
1864 CLK(NULL, "gpt6_fck", &gpt6_fck, CK_243X),
1865 CLK(NULL, "gpt7_ick", &gpt7_ick, CK_243X),
1866 CLK(NULL, "gpt7_fck", &gpt7_fck, CK_243X),
1867 CLK(NULL, "gpt8_ick", &gpt8_ick, CK_243X),
1868 CLK(NULL, "gpt8_fck", &gpt8_fck, CK_243X),
1869 CLK(NULL, "gpt9_ick", &gpt9_ick, CK_243X),
1870 CLK(NULL, "gpt9_fck", &gpt9_fck, CK_243X),
1871 CLK(NULL, "gpt10_ick", &gpt10_ick, CK_243X),
1872 CLK(NULL, "gpt10_fck", &gpt10_fck, CK_243X),
1873 CLK(NULL, "gpt11_ick", &gpt11_ick, CK_243X),
1874 CLK(NULL, "gpt11_fck", &gpt11_fck, CK_243X),
1875 CLK(NULL, "gpt12_ick", &gpt12_ick, CK_243X),
1876 CLK(NULL, "gpt12_fck", &gpt12_fck, CK_243X),
1877 CLK("omap-mcbsp.1", "ick", &mcbsp1_ick, CK_243X),
1878 CLK("omap-mcbsp.1", "fck", &mcbsp1_fck, CK_243X),
1879 CLK("omap-mcbsp.2", "ick", &mcbsp2_ick, CK_243X),
1880 CLK("omap-mcbsp.2", "fck", &mcbsp2_fck, CK_243X),
1881 CLK("omap-mcbsp.3", "ick", &mcbsp3_ick, CK_243X),
1882 CLK("omap-mcbsp.3", "fck", &mcbsp3_fck, CK_243X),
1883 CLK("omap-mcbsp.4", "ick", &mcbsp4_ick, CK_243X),
1884 CLK("omap-mcbsp.4", "fck", &mcbsp4_fck, CK_243X),
1885 CLK("omap-mcbsp.5", "ick", &mcbsp5_ick, CK_243X),
1886 CLK("omap-mcbsp.5", "fck", &mcbsp5_fck, CK_243X),
1887 CLK("omap2_mcspi.1", "ick", &mcspi1_ick, CK_243X),
1888 CLK("omap2_mcspi.1", "fck", &mcspi1_fck, CK_243X),
1889 CLK("omap2_mcspi.2", "ick", &mcspi2_ick, CK_243X),
1890 CLK("omap2_mcspi.2", "fck", &mcspi2_fck, CK_243X),
1891 CLK("omap2_mcspi.3", "ick", &mcspi3_ick, CK_243X),
1892 CLK("omap2_mcspi.3", "fck", &mcspi3_fck, CK_243X),
1893 CLK(NULL, "uart1_ick", &uart1_ick, CK_243X),
1894 CLK(NULL, "uart1_fck", &uart1_fck, CK_243X),
1895 CLK(NULL, "uart2_ick", &uart2_ick, CK_243X),
1896 CLK(NULL, "uart2_fck", &uart2_fck, CK_243X),
1897 CLK(NULL, "uart3_ick", &uart3_ick, CK_243X),
1898 CLK(NULL, "uart3_fck", &uart3_fck, CK_243X),
1899 CLK(NULL, "gpios_ick", &gpios_ick, CK_243X),
1900 CLK(NULL, "gpios_fck", &gpios_fck, CK_243X),
1901 CLK("omap_wdt", "ick", &mpu_wdt_ick, CK_243X),
1902 CLK("omap_wdt", "fck", &mpu_wdt_fck, CK_243X),
1903 CLK(NULL, "sync_32k_ick", &sync_32k_ick, CK_243X),
1904 CLK(NULL, "wdt1_ick", &wdt1_ick, CK_243X),
1905 CLK(NULL, "omapctrl_ick", &omapctrl_ick, CK_243X),
1906 CLK(NULL, "icr_ick", &icr_ick, CK_243X),
1907 CLK("omap24xxcam", "fck", &cam_fck, CK_243X),
1908 CLK("omap24xxcam", "ick", &cam_ick, CK_243X),
1909 CLK(NULL, "mailboxes_ick", &mailboxes_ick, CK_243X),
1910 CLK(NULL, "wdt4_ick", &wdt4_ick, CK_243X),
1911 CLK(NULL, "wdt4_fck", &wdt4_fck, CK_243X),
1912 CLK(NULL, "mspro_ick", &mspro_ick, CK_243X),
1913 CLK(NULL, "mspro_fck", &mspro_fck, CK_243X),
1914 CLK(NULL, "fac_ick", &fac_ick, CK_243X),
1915 CLK(NULL, "fac_fck", &fac_fck, CK_243X),
1916 CLK("omap_hdq.0", "ick", &hdq_ick, CK_243X),
1917 CLK("omap_hdq.1", "fck", &hdq_fck, CK_243X),
1918 CLK("i2c_omap.1", "ick", &i2c1_ick, CK_243X),
1919 CLK("i2c_omap.1", "fck", &i2chs1_fck, CK_243X),
1920 CLK("i2c_omap.2", "ick", &i2c2_ick, CK_243X),
1921 CLK("i2c_omap.2", "fck", &i2chs2_fck, CK_243X),
1922 CLK(NULL, "gpmc_fck", &gpmc_fck, CK_243X),
1923 CLK(NULL, "sdma_fck", &sdma_fck, CK_243X),
1924 CLK(NULL, "sdma_ick", &sdma_ick, CK_243X),
1925 CLK(NULL, "sdrc_ick", &sdrc_ick, CK_243X),
1926 CLK(NULL, "des_ick", &des_ick, CK_243X),
1927 CLK(NULL, "sha_ick", &sha_ick, CK_243X),
1928 CLK("omap_rng", "ick", &rng_ick, CK_243X),
1929 CLK(NULL, "aes_ick", &aes_ick, CK_243X),
1930 CLK(NULL, "pka_ick", &pka_ick, CK_243X),
1931 CLK(NULL, "usb_fck", &usb_fck, CK_243X),
1932 CLK("musb_hdrc", "ick", &usbhs_ick, CK_243X),
1933 CLK("mmci-omap-hs.0", "ick", &mmchs1_ick, CK_243X),
1934 CLK("mmci-omap-hs.0", "fck", &mmchs1_fck, CK_243X),
1935 CLK("mmci-omap-hs.1", "ick", &mmchs2_ick, CK_243X),
1936 CLK("mmci-omap-hs.1", "fck", &mmchs2_fck, CK_243X),
1937 CLK(NULL, "gpio5_ick", &gpio5_ick, CK_243X),
1938 CLK(NULL, "gpio5_fck", &gpio5_fck, CK_243X),
1939 CLK(NULL, "mdm_intc_ick", &mdm_intc_ick, CK_243X),
1940 CLK("mmci-omap-hs.0", "mmchsdb_fck", &mmchsdb1_fck, CK_243X),
1941 CLK("mmci-omap-hs.1", "mmchsdb_fck", &mmchsdb2_fck, CK_243X),
1942};
1943
1944/*
1945 * init code
1946 */
1947
1948int __init omap2430_clk_init(void)
1949{
1950 const struct prcm_config *prcm;
1951 struct omap_clk *c;
1952 u32 clkrate;
1953
1954 prcm_clksrc_ctrl = OMAP2430_PRCM_CLKSRC_CTRL;
1955 cm_idlest_pll = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST);
1956 cpu_mask = RATE_IN_243X;
1957 rate_table = omap2430_rate_table;
1958
1959 clk_init(&omap2_clk_functions);
1960
1961 for (c = omap2430_clks; c < omap2430_clks + ARRAY_SIZE(omap2430_clks);
1962 c++)
1963 clk_preinit(c->lk.clk);
1964
1965 osc_ck.rate = omap2_osc_clk_recalc(&osc_ck);
1966 propagate_rate(&osc_ck);
1967 sys_ck.rate = omap2xxx_sys_clk_recalc(&sys_ck);
1968 propagate_rate(&sys_ck);
1969
1970 for (c = omap2430_clks; c < omap2430_clks + ARRAY_SIZE(omap2430_clks);
1971 c++) {
1972 clkdev_add(&c->lk);
1973 clk_register(c->lk.clk);
1974 omap2_init_clk_clkdm(c->lk.clk);
1975 }
1976
1977 /* Check the MPU rate set by bootloader */
1978 clkrate = omap2xxx_clk_get_core_rate(&dpll_ck);
1979 for (prcm = rate_table; prcm->mpu_speed; prcm++) {
1980 if (!(prcm->flags & cpu_mask))
1981 continue;
1982 if (prcm->xtal_speed != sys_ck.rate)
1983 continue;
1984 if (prcm->dpll_speed <= clkrate)
1985 break;
1986 }
1987 curr_prcm_set = prcm;
1988
1989 recalculate_root_clocks();
1990
1991 pr_info("Clocking rate (Crystal/DPLL/MPU): %ld.%01ld/%ld/%ld MHz\n",
1992 (sys_ck.rate / 1000000), (sys_ck.rate / 100000) % 10,
1993 (dpll_ck.rate / 1000000), (mpu_ck.rate / 1000000)) ;
1994
1995 /*
1996 * Only enable those clocks we will need, let the drivers
1997 * enable other clocks as necessary
1998 */
1999 clk_enable_init_clocks();
2000
2001 /* Avoid sleeping sleeping during omap2_clk_prepare_for_reboot() */
2002 vclk = clk_get(NULL, "virt_prcm_set");
2003 sclk = clk_get(NULL, "sys_ck");
2004 dclk = clk_get(NULL, "dpll_ck");
2005
2006 return 0;
2007}
2657 2008
diff --git a/arch/arm/mach-omap2/clock24xx.c b/arch/arm/mach-omap2/clock24xx.c
deleted file mode 100644
index e2dbedd581e8..000000000000
--- a/arch/arm/mach-omap2/clock24xx.c
+++ /dev/null
@@ -1,805 +0,0 @@
1/*
2 * linux/arch/arm/mach-omap2/clock.c
3 *
4 * Copyright (C) 2005-2008 Texas Instruments, Inc.
5 * Copyright (C) 2004-2008 Nokia Corporation
6 *
7 * Contacts:
8 * Richard Woodruff <r-woodruff2@ti.com>
9 * Paul Walmsley
10 *
11 * Based on earlier work by Tuukka Tikkanen, Tony Lindgren,
12 * Gordon McNutt and RidgeRun, Inc.
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#undef DEBUG
19
20#include <linux/module.h>
21#include <linux/kernel.h>
22#include <linux/device.h>
23#include <linux/list.h>
24#include <linux/errno.h>
25#include <linux/delay.h>
26#include <linux/clk.h>
27#include <linux/io.h>
28#include <linux/cpufreq.h>
29#include <linux/bitops.h>
30
31#include <mach/clock.h>
32#include <mach/sram.h>
33#include <mach/prcm.h>
34#include <asm/div64.h>
35#include <asm/clkdev.h>
36
37#include <mach/sdrc.h>
38#include "clock.h"
39#include "prm.h"
40#include "prm-regbits-24xx.h"
41#include "cm.h"
42#include "cm-regbits-24xx.h"
43
44static const struct clkops clkops_oscck;
45static const struct clkops clkops_fixed;
46
47static void omap2430_clk_i2chs_find_idlest(struct clk *clk,
48 void __iomem **idlest_reg,
49 u8 *idlest_bit);
50
51/* 2430 I2CHS has non-standard IDLEST register */
52static const struct clkops clkops_omap2430_i2chs_wait = {
53 .enable = omap2_dflt_clk_enable,
54 .disable = omap2_dflt_clk_disable,
55 .find_idlest = omap2430_clk_i2chs_find_idlest,
56 .find_companion = omap2_clk_dflt_find_companion,
57};
58
59#include "clock24xx.h"
60
61struct omap_clk {
62 u32 cpu;
63 struct clk_lookup lk;
64};
65
66#define CLK(dev, con, ck, cp) \
67 { \
68 .cpu = cp, \
69 .lk = { \
70 .dev_id = dev, \
71 .con_id = con, \
72 .clk = ck, \
73 }, \
74 }
75
76#define CK_243X RATE_IN_243X
77#define CK_242X RATE_IN_242X
78
79static struct omap_clk omap24xx_clks[] = {
80 /* external root sources */
81 CLK(NULL, "func_32k_ck", &func_32k_ck, CK_243X | CK_242X),
82 CLK(NULL, "secure_32k_ck", &secure_32k_ck, CK_243X | CK_242X),
83 CLK(NULL, "osc_ck", &osc_ck, CK_243X | CK_242X),
84 CLK(NULL, "sys_ck", &sys_ck, CK_243X | CK_242X),
85 CLK(NULL, "alt_ck", &alt_ck, CK_243X | CK_242X),
86 /* internal analog sources */
87 CLK(NULL, "dpll_ck", &dpll_ck, CK_243X | CK_242X),
88 CLK(NULL, "apll96_ck", &apll96_ck, CK_243X | CK_242X),
89 CLK(NULL, "apll54_ck", &apll54_ck, CK_243X | CK_242X),
90 /* internal prcm root sources */
91 CLK(NULL, "func_54m_ck", &func_54m_ck, CK_243X | CK_242X),
92 CLK(NULL, "core_ck", &core_ck, CK_243X | CK_242X),
93 CLK(NULL, "func_96m_ck", &func_96m_ck, CK_243X | CK_242X),
94 CLK(NULL, "func_48m_ck", &func_48m_ck, CK_243X | CK_242X),
95 CLK(NULL, "func_12m_ck", &func_12m_ck, CK_243X | CK_242X),
96 CLK(NULL, "ck_wdt1_osc", &wdt1_osc_ck, CK_243X | CK_242X),
97 CLK(NULL, "sys_clkout_src", &sys_clkout_src, CK_243X | CK_242X),
98 CLK(NULL, "sys_clkout", &sys_clkout, CK_243X | CK_242X),
99 CLK(NULL, "sys_clkout2_src", &sys_clkout2_src, CK_242X),
100 CLK(NULL, "sys_clkout2", &sys_clkout2, CK_242X),
101 CLK(NULL, "emul_ck", &emul_ck, CK_242X),
102 /* mpu domain clocks */
103 CLK(NULL, "mpu_ck", &mpu_ck, CK_243X | CK_242X),
104 /* dsp domain clocks */
105 CLK(NULL, "dsp_fck", &dsp_fck, CK_243X | CK_242X),
106 CLK(NULL, "dsp_irate_ick", &dsp_irate_ick, CK_243X | CK_242X),
107 CLK(NULL, "dsp_ick", &dsp_ick, CK_242X),
108 CLK(NULL, "iva2_1_ick", &iva2_1_ick, CK_243X),
109 CLK(NULL, "iva1_ifck", &iva1_ifck, CK_242X),
110 CLK(NULL, "iva1_mpu_int_ifck", &iva1_mpu_int_ifck, CK_242X),
111 /* GFX domain clocks */
112 CLK(NULL, "gfx_3d_fck", &gfx_3d_fck, CK_243X | CK_242X),
113 CLK(NULL, "gfx_2d_fck", &gfx_2d_fck, CK_243X | CK_242X),
114 CLK(NULL, "gfx_ick", &gfx_ick, CK_243X | CK_242X),
115 /* Modem domain clocks */
116 CLK(NULL, "mdm_ick", &mdm_ick, CK_243X),
117 CLK(NULL, "mdm_osc_ck", &mdm_osc_ck, CK_243X),
118 /* DSS domain clocks */
119 CLK("omapfb", "ick", &dss_ick, CK_243X | CK_242X),
120 CLK("omapfb", "dss1_fck", &dss1_fck, CK_243X | CK_242X),
121 CLK("omapfb", "dss2_fck", &dss2_fck, CK_243X | CK_242X),
122 CLK("omapfb", "tv_fck", &dss_54m_fck, CK_243X | CK_242X),
123 /* L3 domain clocks */
124 CLK(NULL, "core_l3_ck", &core_l3_ck, CK_243X | CK_242X),
125 CLK(NULL, "ssi_fck", &ssi_ssr_sst_fck, CK_243X | CK_242X),
126 CLK(NULL, "usb_l4_ick", &usb_l4_ick, CK_243X | CK_242X),
127 /* L4 domain clocks */
128 CLK(NULL, "l4_ck", &l4_ck, CK_243X | CK_242X),
129 CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_243X | CK_242X),
130 /* virtual meta-group clock */
131 CLK(NULL, "virt_prcm_set", &virt_prcm_set, CK_243X | CK_242X),
132 /* general l4 interface ck, multi-parent functional clk */
133 CLK(NULL, "gpt1_ick", &gpt1_ick, CK_243X | CK_242X),
134 CLK(NULL, "gpt1_fck", &gpt1_fck, CK_243X | CK_242X),
135 CLK(NULL, "gpt2_ick", &gpt2_ick, CK_243X | CK_242X),
136 CLK(NULL, "gpt2_fck", &gpt2_fck, CK_243X | CK_242X),
137 CLK(NULL, "gpt3_ick", &gpt3_ick, CK_243X | CK_242X),
138 CLK(NULL, "gpt3_fck", &gpt3_fck, CK_243X | CK_242X),
139 CLK(NULL, "gpt4_ick", &gpt4_ick, CK_243X | CK_242X),
140 CLK(NULL, "gpt4_fck", &gpt4_fck, CK_243X | CK_242X),
141 CLK(NULL, "gpt5_ick", &gpt5_ick, CK_243X | CK_242X),
142 CLK(NULL, "gpt5_fck", &gpt5_fck, CK_243X | CK_242X),
143 CLK(NULL, "gpt6_ick", &gpt6_ick, CK_243X | CK_242X),
144 CLK(NULL, "gpt6_fck", &gpt6_fck, CK_243X | CK_242X),
145 CLK(NULL, "gpt7_ick", &gpt7_ick, CK_243X | CK_242X),
146 CLK(NULL, "gpt7_fck", &gpt7_fck, CK_243X | CK_242X),
147 CLK(NULL, "gpt8_ick", &gpt8_ick, CK_243X | CK_242X),
148 CLK(NULL, "gpt8_fck", &gpt8_fck, CK_243X | CK_242X),
149 CLK(NULL, "gpt9_ick", &gpt9_ick, CK_243X | CK_242X),
150 CLK(NULL, "gpt9_fck", &gpt9_fck, CK_243X | CK_242X),
151 CLK(NULL, "gpt10_ick", &gpt10_ick, CK_243X | CK_242X),
152 CLK(NULL, "gpt10_fck", &gpt10_fck, CK_243X | CK_242X),
153 CLK(NULL, "gpt11_ick", &gpt11_ick, CK_243X | CK_242X),
154 CLK(NULL, "gpt11_fck", &gpt11_fck, CK_243X | CK_242X),
155 CLK(NULL, "gpt12_ick", &gpt12_ick, CK_243X | CK_242X),
156 CLK(NULL, "gpt12_fck", &gpt12_fck, CK_243X | CK_242X),
157 CLK("omap-mcbsp.1", "ick", &mcbsp1_ick, CK_243X | CK_242X),
158 CLK("omap-mcbsp.1", "fck", &mcbsp1_fck, CK_243X | CK_242X),
159 CLK("omap-mcbsp.2", "ick", &mcbsp2_ick, CK_243X | CK_242X),
160 CLK("omap-mcbsp.2", "fck", &mcbsp2_fck, CK_243X | CK_242X),
161 CLK("omap-mcbsp.3", "ick", &mcbsp3_ick, CK_243X),
162 CLK("omap-mcbsp.3", "fck", &mcbsp3_fck, CK_243X),
163 CLK("omap-mcbsp.4", "ick", &mcbsp4_ick, CK_243X),
164 CLK("omap-mcbsp.4", "fck", &mcbsp4_fck, CK_243X),
165 CLK("omap-mcbsp.5", "ick", &mcbsp5_ick, CK_243X),
166 CLK("omap-mcbsp.5", "fck", &mcbsp5_fck, CK_243X),
167 CLK("omap2_mcspi.1", "ick", &mcspi1_ick, CK_243X | CK_242X),
168 CLK("omap2_mcspi.1", "fck", &mcspi1_fck, CK_243X | CK_242X),
169 CLK("omap2_mcspi.2", "ick", &mcspi2_ick, CK_243X | CK_242X),
170 CLK("omap2_mcspi.2", "fck", &mcspi2_fck, CK_243X | CK_242X),
171 CLK("omap2_mcspi.3", "ick", &mcspi3_ick, CK_243X),
172 CLK("omap2_mcspi.3", "fck", &mcspi3_fck, CK_243X),
173 CLK(NULL, "uart1_ick", &uart1_ick, CK_243X | CK_242X),
174 CLK(NULL, "uart1_fck", &uart1_fck, CK_243X | CK_242X),
175 CLK(NULL, "uart2_ick", &uart2_ick, CK_243X | CK_242X),
176 CLK(NULL, "uart2_fck", &uart2_fck, CK_243X | CK_242X),
177 CLK(NULL, "uart3_ick", &uart3_ick, CK_243X | CK_242X),
178 CLK(NULL, "uart3_fck", &uart3_fck, CK_243X | CK_242X),
179 CLK(NULL, "gpios_ick", &gpios_ick, CK_243X | CK_242X),
180 CLK(NULL, "gpios_fck", &gpios_fck, CK_243X | CK_242X),
181 CLK("omap_wdt", "ick", &mpu_wdt_ick, CK_243X | CK_242X),
182 CLK("omap_wdt", "fck", &mpu_wdt_fck, CK_243X | CK_242X),
183 CLK(NULL, "sync_32k_ick", &sync_32k_ick, CK_243X | CK_242X),
184 CLK(NULL, "wdt1_ick", &wdt1_ick, CK_243X | CK_242X),
185 CLK(NULL, "omapctrl_ick", &omapctrl_ick, CK_243X | CK_242X),
186 CLK(NULL, "icr_ick", &icr_ick, CK_243X),
187 CLK("omap24xxcam", "fck", &cam_fck, CK_243X | CK_242X),
188 CLK("omap24xxcam", "ick", &cam_ick, CK_243X | CK_242X),
189 CLK(NULL, "mailboxes_ick", &mailboxes_ick, CK_243X | CK_242X),
190 CLK(NULL, "wdt4_ick", &wdt4_ick, CK_243X | CK_242X),
191 CLK(NULL, "wdt4_fck", &wdt4_fck, CK_243X | CK_242X),
192 CLK(NULL, "wdt3_ick", &wdt3_ick, CK_242X),
193 CLK(NULL, "wdt3_fck", &wdt3_fck, CK_242X),
194 CLK(NULL, "mspro_ick", &mspro_ick, CK_243X | CK_242X),
195 CLK(NULL, "mspro_fck", &mspro_fck, CK_243X | CK_242X),
196 CLK("mmci-omap.0", "ick", &mmc_ick, CK_242X),
197 CLK("mmci-omap.0", "fck", &mmc_fck, CK_242X),
198 CLK(NULL, "fac_ick", &fac_ick, CK_243X | CK_242X),
199 CLK(NULL, "fac_fck", &fac_fck, CK_243X | CK_242X),
200 CLK(NULL, "eac_ick", &eac_ick, CK_242X),
201 CLK(NULL, "eac_fck", &eac_fck, CK_242X),
202 CLK("omap_hdq.0", "ick", &hdq_ick, CK_243X | CK_242X),
203 CLK("omap_hdq.1", "fck", &hdq_fck, CK_243X | CK_242X),
204 CLK("i2c_omap.1", "ick", &i2c1_ick, CK_243X | CK_242X),
205 CLK("i2c_omap.1", "fck", &i2c1_fck, CK_242X),
206 CLK("i2c_omap.1", "fck", &i2chs1_fck, CK_243X),
207 CLK("i2c_omap.2", "ick", &i2c2_ick, CK_243X | CK_242X),
208 CLK("i2c_omap.2", "fck", &i2c2_fck, CK_242X),
209 CLK("i2c_omap.2", "fck", &i2chs2_fck, CK_243X),
210 CLK(NULL, "gpmc_fck", &gpmc_fck, CK_243X | CK_242X),
211 CLK(NULL, "sdma_fck", &sdma_fck, CK_243X | CK_242X),
212 CLK(NULL, "sdma_ick", &sdma_ick, CK_243X | CK_242X),
213 CLK(NULL, "vlynq_ick", &vlynq_ick, CK_242X),
214 CLK(NULL, "vlynq_fck", &vlynq_fck, CK_242X),
215 CLK(NULL, "sdrc_ick", &sdrc_ick, CK_243X),
216 CLK(NULL, "des_ick", &des_ick, CK_243X | CK_242X),
217 CLK(NULL, "sha_ick", &sha_ick, CK_243X | CK_242X),
218 CLK("omap_rng", "ick", &rng_ick, CK_243X | CK_242X),
219 CLK(NULL, "aes_ick", &aes_ick, CK_243X | CK_242X),
220 CLK(NULL, "pka_ick", &pka_ick, CK_243X | CK_242X),
221 CLK(NULL, "usb_fck", &usb_fck, CK_243X | CK_242X),
222 CLK("musb_hdrc", "ick", &usbhs_ick, CK_243X),
223 CLK("mmci-omap-hs.0", "ick", &mmchs1_ick, CK_243X),
224 CLK("mmci-omap-hs.0", "fck", &mmchs1_fck, CK_243X),
225 CLK("mmci-omap-hs.1", "ick", &mmchs2_ick, CK_243X),
226 CLK("mmci-omap-hs.1", "fck", &mmchs2_fck, CK_243X),
227 CLK(NULL, "gpio5_ick", &gpio5_ick, CK_243X),
228 CLK(NULL, "gpio5_fck", &gpio5_fck, CK_243X),
229 CLK(NULL, "mdm_intc_ick", &mdm_intc_ick, CK_243X),
230 CLK("mmci-omap-hs.0", "mmchsdb_fck", &mmchsdb1_fck, CK_243X),
231 CLK("mmci-omap-hs.1", "mmchsdb_fck", &mmchsdb2_fck, CK_243X),
232};
233
234/* CM_CLKEN_PLL.EN_{54,96}M_PLL options (24XX) */
235#define EN_APLL_STOPPED 0
236#define EN_APLL_LOCKED 3
237
238/* CM_CLKSEL1_PLL.APLLS_CLKIN options (24XX) */
239#define APLLS_CLKIN_19_2MHZ 0
240#define APLLS_CLKIN_13MHZ 2
241#define APLLS_CLKIN_12MHZ 3
242
243/* #define DOWN_VARIABLE_DPLL 1 */ /* Experimental */
244
245static struct prcm_config *curr_prcm_set;
246static struct clk *vclk;
247static struct clk *sclk;
248
249static void __iomem *prcm_clksrc_ctrl;
250
251/*-------------------------------------------------------------------------
252 * Omap24xx specific clock functions
253 *-------------------------------------------------------------------------*/
254
255/**
256 * omap2430_clk_i2chs_find_idlest - return CM_IDLEST info for 2430 I2CHS
257 * @clk: struct clk * being enabled
258 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
259 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
260 *
261 * OMAP2430 I2CHS CM_IDLEST bits are in CM_IDLEST1_CORE, but the
262 * CM_*CLKEN bits are in CM_{I,F}CLKEN2_CORE. This custom function
263 * passes back the correct CM_IDLEST register address for I2CHS
264 * modules. No return value.
265 */
266static void omap2430_clk_i2chs_find_idlest(struct clk *clk,
267 void __iomem **idlest_reg,
268 u8 *idlest_bit)
269{
270 *idlest_reg = OMAP_CM_REGADDR(CORE_MOD, CM_IDLEST);
271 *idlest_bit = clk->enable_bit;
272}
273
274
275/**
276 * omap2xxx_clk_get_core_rate - return the CORE_CLK rate
277 * @clk: pointer to the combined dpll_ck + core_ck (currently "dpll_ck")
278 *
279 * Returns the CORE_CLK rate. CORE_CLK can have one of three rate
280 * sources on OMAP2xxx: the DPLL CLKOUT rate, DPLL CLKOUTX2, or 32KHz
281 * (the latter is unusual). This currently should be called with
282 * struct clk *dpll_ck, which is a composite clock of dpll_ck and
283 * core_ck.
284 */
285static unsigned long omap2xxx_clk_get_core_rate(struct clk *clk)
286{
287 long long core_clk;
288 u32 v;
289
290 core_clk = omap2_get_dpll_rate(clk);
291
292 v = cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
293 v &= OMAP24XX_CORE_CLK_SRC_MASK;
294
295 if (v == CORE_CLK_SRC_32K)
296 core_clk = 32768;
297 else
298 core_clk *= v;
299
300 return core_clk;
301}
302
303static int omap2_enable_osc_ck(struct clk *clk)
304{
305 u32 pcc;
306
307 pcc = __raw_readl(prcm_clksrc_ctrl);
308
309 __raw_writel(pcc & ~OMAP_AUTOEXTCLKMODE_MASK, prcm_clksrc_ctrl);
310
311 return 0;
312}
313
314static void omap2_disable_osc_ck(struct clk *clk)
315{
316 u32 pcc;
317
318 pcc = __raw_readl(prcm_clksrc_ctrl);
319
320 __raw_writel(pcc | OMAP_AUTOEXTCLKMODE_MASK, prcm_clksrc_ctrl);
321}
322
323static const struct clkops clkops_oscck = {
324 .enable = &omap2_enable_osc_ck,
325 .disable = &omap2_disable_osc_ck,
326};
327
328#ifdef OLD_CK
329/* Recalculate SYST_CLK */
330static void omap2_sys_clk_recalc(struct clk * clk)
331{
332 u32 div = PRCM_CLKSRC_CTRL;
333 div &= (1 << 7) | (1 << 6); /* Test if ext clk divided by 1 or 2 */
334 div >>= clk->rate_offset;
335 clk->rate = (clk->parent->rate / div);
336 propagate_rate(clk);
337}
338#endif /* OLD_CK */
339
340/* Enable an APLL if off */
341static int omap2_clk_fixed_enable(struct clk *clk)
342{
343 u32 cval, apll_mask;
344
345 apll_mask = EN_APLL_LOCKED << clk->enable_bit;
346
347 cval = cm_read_mod_reg(PLL_MOD, CM_CLKEN);
348
349 if ((cval & apll_mask) == apll_mask)
350 return 0; /* apll already enabled */
351
352 cval &= ~apll_mask;
353 cval |= apll_mask;
354 cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN);
355
356 if (clk == &apll96_ck)
357 cval = OMAP24XX_ST_96M_APLL;
358 else if (clk == &apll54_ck)
359 cval = OMAP24XX_ST_54M_APLL;
360
361 omap2_cm_wait_idlest(OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), cval,
362 clk->name);
363
364 /*
365 * REVISIT: Should we return an error code if omap2_wait_clock_ready()
366 * fails?
367 */
368 return 0;
369}
370
371/* Stop APLL */
372static void omap2_clk_fixed_disable(struct clk *clk)
373{
374 u32 cval;
375
376 cval = cm_read_mod_reg(PLL_MOD, CM_CLKEN);
377 cval &= ~(EN_APLL_LOCKED << clk->enable_bit);
378 cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN);
379}
380
381static const struct clkops clkops_fixed = {
382 .enable = &omap2_clk_fixed_enable,
383 .disable = &omap2_clk_fixed_disable,
384};
385
386/*
387 * Uses the current prcm set to tell if a rate is valid.
388 * You can go slower, but not faster within a given rate set.
389 */
390static long omap2_dpllcore_round_rate(unsigned long target_rate)
391{
392 u32 high, low, core_clk_src;
393
394 core_clk_src = cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
395 core_clk_src &= OMAP24XX_CORE_CLK_SRC_MASK;
396
397 if (core_clk_src == CORE_CLK_SRC_DPLL) { /* DPLL clockout */
398 high = curr_prcm_set->dpll_speed * 2;
399 low = curr_prcm_set->dpll_speed;
400 } else { /* DPLL clockout x 2 */
401 high = curr_prcm_set->dpll_speed;
402 low = curr_prcm_set->dpll_speed / 2;
403 }
404
405#ifdef DOWN_VARIABLE_DPLL
406 if (target_rate > high)
407 return high;
408 else
409 return target_rate;
410#else
411 if (target_rate > low)
412 return high;
413 else
414 return low;
415#endif
416
417}
418
419static unsigned long omap2_dpllcore_recalc(struct clk *clk)
420{
421 return omap2xxx_clk_get_core_rate(clk);
422}
423
424static int omap2_reprogram_dpllcore(struct clk *clk, unsigned long rate)
425{
426 u32 cur_rate, low, mult, div, valid_rate, done_rate;
427 u32 bypass = 0;
428 struct prcm_config tmpset;
429 const struct dpll_data *dd;
430
431 cur_rate = omap2xxx_clk_get_core_rate(&dpll_ck);
432 mult = cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
433 mult &= OMAP24XX_CORE_CLK_SRC_MASK;
434
435 if ((rate == (cur_rate / 2)) && (mult == 2)) {
436 omap2xxx_sdrc_reprogram(CORE_CLK_SRC_DPLL, 1);
437 } else if ((rate == (cur_rate * 2)) && (mult == 1)) {
438 omap2xxx_sdrc_reprogram(CORE_CLK_SRC_DPLL_X2, 1);
439 } else if (rate != cur_rate) {
440 valid_rate = omap2_dpllcore_round_rate(rate);
441 if (valid_rate != rate)
442 return -EINVAL;
443
444 if (mult == 1)
445 low = curr_prcm_set->dpll_speed;
446 else
447 low = curr_prcm_set->dpll_speed / 2;
448
449 dd = clk->dpll_data;
450 if (!dd)
451 return -EINVAL;
452
453 tmpset.cm_clksel1_pll = __raw_readl(dd->mult_div1_reg);
454 tmpset.cm_clksel1_pll &= ~(dd->mult_mask |
455 dd->div1_mask);
456 div = ((curr_prcm_set->xtal_speed / 1000000) - 1);
457 tmpset.cm_clksel2_pll = cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
458 tmpset.cm_clksel2_pll &= ~OMAP24XX_CORE_CLK_SRC_MASK;
459 if (rate > low) {
460 tmpset.cm_clksel2_pll |= CORE_CLK_SRC_DPLL_X2;
461 mult = ((rate / 2) / 1000000);
462 done_rate = CORE_CLK_SRC_DPLL_X2;
463 } else {
464 tmpset.cm_clksel2_pll |= CORE_CLK_SRC_DPLL;
465 mult = (rate / 1000000);
466 done_rate = CORE_CLK_SRC_DPLL;
467 }
468 tmpset.cm_clksel1_pll |= (div << __ffs(dd->mult_mask));
469 tmpset.cm_clksel1_pll |= (mult << __ffs(dd->div1_mask));
470
471 /* Worst case */
472 tmpset.base_sdrc_rfr = SDRC_RFR_CTRL_BYPASS;
473
474 if (rate == curr_prcm_set->xtal_speed) /* If asking for 1-1 */
475 bypass = 1;
476
477 /* For omap2xxx_sdrc_init_params() */
478 omap2xxx_sdrc_reprogram(CORE_CLK_SRC_DPLL_X2, 1);
479
480 /* Force dll lock mode */
481 omap2_set_prcm(tmpset.cm_clksel1_pll, tmpset.base_sdrc_rfr,
482 bypass);
483
484 /* Errata: ret dll entry state */
485 omap2xxx_sdrc_init_params(omap2xxx_sdrc_dll_is_unlocked());
486 omap2xxx_sdrc_reprogram(done_rate, 0);
487 }
488
489 return 0;
490}
491
492/**
493 * omap2_table_mpu_recalc - just return the MPU speed
494 * @clk: virt_prcm_set struct clk
495 *
496 * Set virt_prcm_set's rate to the mpu_speed field of the current PRCM set.
497 */
498static unsigned long omap2_table_mpu_recalc(struct clk *clk)
499{
500 return curr_prcm_set->mpu_speed;
501}
502
503/*
504 * Look for a rate equal or less than the target rate given a configuration set.
505 *
506 * What's not entirely clear is "which" field represents the key field.
507 * Some might argue L3-DDR, others ARM, others IVA. This code is simple and
508 * just uses the ARM rates.
509 */
510static long omap2_round_to_table_rate(struct clk *clk, unsigned long rate)
511{
512 struct prcm_config *ptr;
513 long highest_rate;
514
515 if (clk != &virt_prcm_set)
516 return -EINVAL;
517
518 highest_rate = -EINVAL;
519
520 for (ptr = rate_table; ptr->mpu_speed; ptr++) {
521 if (!(ptr->flags & cpu_mask))
522 continue;
523 if (ptr->xtal_speed != sys_ck.rate)
524 continue;
525
526 highest_rate = ptr->mpu_speed;
527
528 /* Can check only after xtal frequency check */
529 if (ptr->mpu_speed <= rate)
530 break;
531 }
532 return highest_rate;
533}
534
535/* Sets basic clocks based on the specified rate */
536static int omap2_select_table_rate(struct clk *clk, unsigned long rate)
537{
538 u32 cur_rate, done_rate, bypass = 0, tmp;
539 struct prcm_config *prcm;
540 unsigned long found_speed = 0;
541 unsigned long flags;
542
543 if (clk != &virt_prcm_set)
544 return -EINVAL;
545
546 for (prcm = rate_table; prcm->mpu_speed; prcm++) {
547 if (!(prcm->flags & cpu_mask))
548 continue;
549
550 if (prcm->xtal_speed != sys_ck.rate)
551 continue;
552
553 if (prcm->mpu_speed <= rate) {
554 found_speed = prcm->mpu_speed;
555 break;
556 }
557 }
558
559 if (!found_speed) {
560 printk(KERN_INFO "Could not set MPU rate to %luMHz\n",
561 rate / 1000000);
562 return -EINVAL;
563 }
564
565 curr_prcm_set = prcm;
566 cur_rate = omap2xxx_clk_get_core_rate(&dpll_ck);
567
568 if (prcm->dpll_speed == cur_rate / 2) {
569 omap2xxx_sdrc_reprogram(CORE_CLK_SRC_DPLL, 1);
570 } else if (prcm->dpll_speed == cur_rate * 2) {
571 omap2xxx_sdrc_reprogram(CORE_CLK_SRC_DPLL_X2, 1);
572 } else if (prcm->dpll_speed != cur_rate) {
573 local_irq_save(flags);
574
575 if (prcm->dpll_speed == prcm->xtal_speed)
576 bypass = 1;
577
578 if ((prcm->cm_clksel2_pll & OMAP24XX_CORE_CLK_SRC_MASK) ==
579 CORE_CLK_SRC_DPLL_X2)
580 done_rate = CORE_CLK_SRC_DPLL_X2;
581 else
582 done_rate = CORE_CLK_SRC_DPLL;
583
584 /* MPU divider */
585 cm_write_mod_reg(prcm->cm_clksel_mpu, MPU_MOD, CM_CLKSEL);
586
587 /* dsp + iva1 div(2420), iva2.1(2430) */
588 cm_write_mod_reg(prcm->cm_clksel_dsp,
589 OMAP24XX_DSP_MOD, CM_CLKSEL);
590
591 cm_write_mod_reg(prcm->cm_clksel_gfx, GFX_MOD, CM_CLKSEL);
592
593 /* Major subsystem dividers */
594 tmp = cm_read_mod_reg(CORE_MOD, CM_CLKSEL1) & OMAP24XX_CLKSEL_DSS2_MASK;
595 cm_write_mod_reg(prcm->cm_clksel1_core | tmp, CORE_MOD,
596 CM_CLKSEL1);
597
598 if (cpu_is_omap2430())
599 cm_write_mod_reg(prcm->cm_clksel_mdm,
600 OMAP2430_MDM_MOD, CM_CLKSEL);
601
602 /* x2 to enter omap2xxx_sdrc_init_params() */
603 omap2xxx_sdrc_reprogram(CORE_CLK_SRC_DPLL_X2, 1);
604
605 omap2_set_prcm(prcm->cm_clksel1_pll, prcm->base_sdrc_rfr,
606 bypass);
607
608 omap2xxx_sdrc_init_params(omap2xxx_sdrc_dll_is_unlocked());
609 omap2xxx_sdrc_reprogram(done_rate, 0);
610
611 local_irq_restore(flags);
612 }
613
614 return 0;
615}
616
617#ifdef CONFIG_CPU_FREQ
618/*
619 * Walk PRCM rate table and fillout cpufreq freq_table
620 */
621static struct cpufreq_frequency_table freq_table[ARRAY_SIZE(rate_table)];
622
623void omap2_clk_init_cpufreq_table(struct cpufreq_frequency_table **table)
624{
625 struct prcm_config *prcm;
626 int i = 0;
627
628 for (prcm = rate_table; prcm->mpu_speed; prcm++) {
629 if (!(prcm->flags & cpu_mask))
630 continue;
631 if (prcm->xtal_speed != sys_ck.rate)
632 continue;
633
634 /* don't put bypass rates in table */
635 if (prcm->dpll_speed == prcm->xtal_speed)
636 continue;
637
638 freq_table[i].index = i;
639 freq_table[i].frequency = prcm->mpu_speed / 1000;
640 i++;
641 }
642
643 if (i == 0) {
644 printk(KERN_WARNING "%s: failed to initialize frequency "
645 "table\n", __func__);
646 return;
647 }
648
649 freq_table[i].index = i;
650 freq_table[i].frequency = CPUFREQ_TABLE_END;
651
652 *table = &freq_table[0];
653}
654#endif
655
656static struct clk_functions omap2_clk_functions = {
657 .clk_enable = omap2_clk_enable,
658 .clk_disable = omap2_clk_disable,
659 .clk_round_rate = omap2_clk_round_rate,
660 .clk_set_rate = omap2_clk_set_rate,
661 .clk_set_parent = omap2_clk_set_parent,
662 .clk_disable_unused = omap2_clk_disable_unused,
663#ifdef CONFIG_CPU_FREQ
664 .clk_init_cpufreq_table = omap2_clk_init_cpufreq_table,
665#endif
666};
667
668static u32 omap2_get_apll_clkin(void)
669{
670 u32 aplls, srate = 0;
671
672 aplls = cm_read_mod_reg(PLL_MOD, CM_CLKSEL1);
673 aplls &= OMAP24XX_APLLS_CLKIN_MASK;
674 aplls >>= OMAP24XX_APLLS_CLKIN_SHIFT;
675
676 if (aplls == APLLS_CLKIN_19_2MHZ)
677 srate = 19200000;
678 else if (aplls == APLLS_CLKIN_13MHZ)
679 srate = 13000000;
680 else if (aplls == APLLS_CLKIN_12MHZ)
681 srate = 12000000;
682
683 return srate;
684}
685
686static u32 omap2_get_sysclkdiv(void)
687{
688 u32 div;
689
690 div = __raw_readl(prcm_clksrc_ctrl);
691 div &= OMAP_SYSCLKDIV_MASK;
692 div >>= OMAP_SYSCLKDIV_SHIFT;
693
694 return div;
695}
696
697static unsigned long omap2_osc_clk_recalc(struct clk *clk)
698{
699 return omap2_get_apll_clkin() * omap2_get_sysclkdiv();
700}
701
702static unsigned long omap2_sys_clk_recalc(struct clk *clk)
703{
704 return clk->parent->rate / omap2_get_sysclkdiv();
705}
706
707/*
708 * Set clocks for bypass mode for reboot to work.
709 */
710void omap2_clk_prepare_for_reboot(void)
711{
712 u32 rate;
713
714 if (vclk == NULL || sclk == NULL)
715 return;
716
717 rate = clk_get_rate(sclk);
718 clk_set_rate(vclk, rate);
719}
720
721/*
722 * Switch the MPU rate if specified on cmdline.
723 * We cannot do this early until cmdline is parsed.
724 */
725static int __init omap2_clk_arch_init(void)
726{
727 if (!mpurate)
728 return -EINVAL;
729
730 if (clk_set_rate(&virt_prcm_set, mpurate))
731 printk(KERN_ERR "Could not find matching MPU rate\n");
732
733 recalculate_root_clocks();
734
735 printk(KERN_INFO "Switched to new clocking rate (Crystal/DPLL/MPU): "
736 "%ld.%01ld/%ld/%ld MHz\n",
737 (sys_ck.rate / 1000000), (sys_ck.rate / 100000) % 10,
738 (dpll_ck.rate / 1000000), (mpu_ck.rate / 1000000)) ;
739
740 return 0;
741}
742arch_initcall(omap2_clk_arch_init);
743
744int __init omap2_clk_init(void)
745{
746 struct prcm_config *prcm;
747 struct omap_clk *c;
748 u32 clkrate;
749
750 if (cpu_is_omap242x()) {
751 prcm_clksrc_ctrl = OMAP2420_PRCM_CLKSRC_CTRL;
752 cpu_mask = RATE_IN_242X;
753 } else if (cpu_is_omap2430()) {
754 prcm_clksrc_ctrl = OMAP2430_PRCM_CLKSRC_CTRL;
755 cpu_mask = RATE_IN_243X;
756 }
757
758 clk_init(&omap2_clk_functions);
759
760 for (c = omap24xx_clks; c < omap24xx_clks + ARRAY_SIZE(omap24xx_clks); c++)
761 clk_preinit(c->lk.clk);
762
763 osc_ck.rate = omap2_osc_clk_recalc(&osc_ck);
764 propagate_rate(&osc_ck);
765 sys_ck.rate = omap2_sys_clk_recalc(&sys_ck);
766 propagate_rate(&sys_ck);
767
768 for (c = omap24xx_clks; c < omap24xx_clks + ARRAY_SIZE(omap24xx_clks); c++)
769 if (c->cpu & cpu_mask) {
770 clkdev_add(&c->lk);
771 clk_register(c->lk.clk);
772 omap2_init_clk_clkdm(c->lk.clk);
773 }
774
775 /* Check the MPU rate set by bootloader */
776 clkrate = omap2xxx_clk_get_core_rate(&dpll_ck);
777 for (prcm = rate_table; prcm->mpu_speed; prcm++) {
778 if (!(prcm->flags & cpu_mask))
779 continue;
780 if (prcm->xtal_speed != sys_ck.rate)
781 continue;
782 if (prcm->dpll_speed <= clkrate)
783 break;
784 }
785 curr_prcm_set = prcm;
786
787 recalculate_root_clocks();
788
789 printk(KERN_INFO "Clocking rate (Crystal/DPLL/MPU): "
790 "%ld.%01ld/%ld/%ld MHz\n",
791 (sys_ck.rate / 1000000), (sys_ck.rate / 100000) % 10,
792 (dpll_ck.rate / 1000000), (mpu_ck.rate / 1000000)) ;
793
794 /*
795 * Only enable those clocks we will need, let the drivers
796 * enable other clocks as necessary
797 */
798 clk_enable_init_clocks();
799
800 /* Avoid sleeping sleeping during omap2_clk_prepare_for_reboot() */
801 vclk = clk_get(NULL, "virt_prcm_set");
802 sclk = clk_get(NULL, "sys_ck");
803
804 return 0;
805}
diff --git a/arch/arm/mach-omap2/clock2xxx.c b/arch/arm/mach-omap2/clock2xxx.c
new file mode 100644
index 000000000000..80bb0f0e92e6
--- /dev/null
+++ b/arch/arm/mach-omap2/clock2xxx.c
@@ -0,0 +1,73 @@
1/*
2 * clock2xxx.c - OMAP2xxx-specific clock integration code
3 *
4 * Copyright (C) 2005-2008 Texas Instruments, Inc.
5 * Copyright (C) 2004-2010 Nokia Corporation
6 *
7 * Contacts:
8 * Richard Woodruff <r-woodruff2@ti.com>
9 * Paul Walmsley
10 *
11 * Based on earlier work by Tuukka Tikkanen, Tony Lindgren,
12 * Gordon McNutt and RidgeRun, Inc.
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#undef DEBUG
19
20#include <linux/kernel.h>
21#include <linux/errno.h>
22#include <linux/clk.h>
23#include <linux/io.h>
24
25#include <plat/clock.h>
26
27#include "clock.h"
28#include "clock2xxx.h"
29#include "cm.h"
30#include "cm-regbits-24xx.h"
31
32struct clk *vclk, *sclk, *dclk;
33
34/*
35 * Omap24xx specific clock functions
36 */
37
38/*
39 * Set clocks for bypass mode for reboot to work.
40 */
41void omap2xxx_clk_prepare_for_reboot(void)
42{
43 u32 rate;
44
45 if (vclk == NULL || sclk == NULL)
46 return;
47
48 rate = clk_get_rate(sclk);
49 clk_set_rate(vclk, rate);
50}
51
52/*
53 * Switch the MPU rate if specified on cmdline. We cannot do this
54 * early until cmdline is parsed. XXX This should be removed from the
55 * clock code and handled by the OPP layer code in the near future.
56 */
57static int __init omap2xxx_clk_arch_init(void)
58{
59 int ret;
60
61 if (!cpu_is_omap24xx())
62 return 0;
63
64 ret = omap2_clk_switch_mpurate_at_boot("virt_prcm_set");
65 if (!ret)
66 omap2_clk_print_new_rates("sys_ck", "dpll_ck", "mpu_ck");
67
68 return ret;
69}
70
71arch_initcall(omap2xxx_clk_arch_init);
72
73
diff --git a/arch/arm/mach-omap2/clock2xxx.h b/arch/arm/mach-omap2/clock2xxx.h
new file mode 100644
index 000000000000..6a658b890c17
--- /dev/null
+++ b/arch/arm/mach-omap2/clock2xxx.h
@@ -0,0 +1,44 @@
1/*
2 * OMAP2 clock function prototypes and macros
3 *
4 * Copyright (C) 2005-2010 Texas Instruments, Inc.
5 * Copyright (C) 2004-2010 Nokia Corporation
6 */
7
8#ifndef __ARCH_ARM_MACH_OMAP2_CLOCK2XXX_H
9#define __ARCH_ARM_MACH_OMAP2_CLOCK2XXX_H
10
11unsigned long omap2_table_mpu_recalc(struct clk *clk);
12int omap2_select_table_rate(struct clk *clk, unsigned long rate);
13long omap2_round_to_table_rate(struct clk *clk, unsigned long rate);
14unsigned long omap2xxx_sys_clk_recalc(struct clk *clk);
15unsigned long omap2_osc_clk_recalc(struct clk *clk);
16unsigned long omap2_dpllcore_recalc(struct clk *clk);
17int omap2_reprogram_dpllcore(struct clk *clk, unsigned long rate);
18unsigned long omap2xxx_clk_get_core_rate(struct clk *clk);
19u32 omap2xxx_get_apll_clkin(void);
20u32 omap2xxx_get_sysclkdiv(void);
21void omap2xxx_clk_prepare_for_reboot(void);
22
23#ifdef CONFIG_ARCH_OMAP2420
24int omap2420_clk_init(void);
25#else
26#define omap2420_clk_init() 0
27#endif
28
29#ifdef CONFIG_ARCH_OMAP2430
30int omap2430_clk_init(void);
31#else
32#define omap2430_clk_init() 0
33#endif
34
35extern void __iomem *prcm_clksrc_ctrl, *cm_idlest_pll;
36
37extern struct clk *dclk;
38
39extern const struct clkops clkops_omap2430_i2chs_wait;
40extern const struct clkops clkops_oscck;
41extern const struct clkops clkops_apll96;
42extern const struct clkops clkops_apll54;
43
44#endif
diff --git a/arch/arm/mach-omap2/clock34xx.c b/arch/arm/mach-omap2/clock34xx.c
index 7c5c00df3c70..6febd5f11e85 100644
--- a/arch/arm/mach-omap2/clock34xx.c
+++ b/arch/arm/mach-omap2/clock34xx.c
@@ -2,13 +2,14 @@
2 * OMAP3-specific clock framework functions 2 * OMAP3-specific clock framework functions
3 * 3 *
4 * Copyright (C) 2007-2008 Texas Instruments, Inc. 4 * Copyright (C) 2007-2008 Texas Instruments, Inc.
5 * Copyright (C) 2007-2009 Nokia Corporation 5 * Copyright (C) 2007-2010 Nokia Corporation
6 * 6 *
7 * Written by Paul Walmsley 7 * Paul Walmsley
8 * Testing and integration fixes by Jouni Högander 8 * Jouni Högander
9 * 9 *
10 * Parts of this code are based on code written by 10 * Parts of this code are based on code written by
11 * Richard Woodruff, Tony Lindgren, Tuukka Tikkanen, Karthik Dasu 11 * Richard Woodruff, Tony Lindgren, Tuukka Tikkanen, Karthik Dasu,
12 * Russell King
12 * 13 *
13 * This program is free software; you can redistribute it and/or modify 14 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License version 2 as 15 * it under the terms of the GNU General Public License version 2 as
@@ -16,340 +17,23 @@
16 */ 17 */
17#undef DEBUG 18#undef DEBUG
18 19
19#include <linux/module.h>
20#include <linux/kernel.h> 20#include <linux/kernel.h>
21#include <linux/device.h>
22#include <linux/list.h>
23#include <linux/errno.h>
24#include <linux/delay.h>
25#include <linux/clk.h> 21#include <linux/clk.h>
26#include <linux/io.h> 22#include <linux/io.h>
27#include <linux/limits.h>
28#include <linux/bitops.h>
29 23
30#include <mach/cpu.h> 24#include <plat/clock.h>
31#include <mach/clock.h>
32#include <mach/sram.h>
33#include <asm/div64.h>
34#include <asm/clkdev.h>
35 25
36#include <mach/sdrc.h>
37#include "clock.h" 26#include "clock.h"
38#include "prm.h" 27#include "clock34xx.h"
39#include "prm-regbits-34xx.h"
40#include "cm.h" 28#include "cm.h"
41#include "cm-regbits-34xx.h" 29#include "cm-regbits-34xx.h"
42 30
43static const struct clkops clkops_noncore_dpll_ops;
44
45static void omap3430es2_clk_ssi_find_idlest(struct clk *clk,
46 void __iomem **idlest_reg,
47 u8 *idlest_bit);
48static void omap3430es2_clk_hsotgusb_find_idlest(struct clk *clk,
49 void __iomem **idlest_reg,
50 u8 *idlest_bit);
51static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk *clk,
52 void __iomem **idlest_reg,
53 u8 *idlest_bit);
54
55static const struct clkops clkops_omap3430es2_ssi_wait = {
56 .enable = omap2_dflt_clk_enable,
57 .disable = omap2_dflt_clk_disable,
58 .find_idlest = omap3430es2_clk_ssi_find_idlest,
59 .find_companion = omap2_clk_dflt_find_companion,
60};
61
62static const struct clkops clkops_omap3430es2_hsotgusb_wait = {
63 .enable = omap2_dflt_clk_enable,
64 .disable = omap2_dflt_clk_disable,
65 .find_idlest = omap3430es2_clk_hsotgusb_find_idlest,
66 .find_companion = omap2_clk_dflt_find_companion,
67};
68
69static const struct clkops clkops_omap3430es2_dss_usbhost_wait = {
70 .enable = omap2_dflt_clk_enable,
71 .disable = omap2_dflt_clk_disable,
72 .find_idlest = omap3430es2_clk_dss_usbhost_find_idlest,
73 .find_companion = omap2_clk_dflt_find_companion,
74};
75
76#include "clock34xx.h"
77
78struct omap_clk {
79 u32 cpu;
80 struct clk_lookup lk;
81};
82
83#define CLK(dev, con, ck, cp) \
84 { \
85 .cpu = cp, \
86 .lk = { \
87 .dev_id = dev, \
88 .con_id = con, \
89 .clk = ck, \
90 }, \
91 }
92
93#define CK_343X (1 << 0)
94#define CK_3430ES1 (1 << 1)
95#define CK_3430ES2 (1 << 2)
96
97static struct omap_clk omap34xx_clks[] = {
98 CLK(NULL, "omap_32k_fck", &omap_32k_fck, CK_343X),
99 CLK(NULL, "virt_12m_ck", &virt_12m_ck, CK_343X),
100 CLK(NULL, "virt_13m_ck", &virt_13m_ck, CK_343X),
101 CLK(NULL, "virt_16_8m_ck", &virt_16_8m_ck, CK_3430ES2),
102 CLK(NULL, "virt_19_2m_ck", &virt_19_2m_ck, CK_343X),
103 CLK(NULL, "virt_26m_ck", &virt_26m_ck, CK_343X),
104 CLK(NULL, "virt_38_4m_ck", &virt_38_4m_ck, CK_343X),
105 CLK(NULL, "osc_sys_ck", &osc_sys_ck, CK_343X),
106 CLK(NULL, "sys_ck", &sys_ck, CK_343X),
107 CLK(NULL, "sys_altclk", &sys_altclk, CK_343X),
108 CLK(NULL, "mcbsp_clks", &mcbsp_clks, CK_343X),
109 CLK(NULL, "sys_clkout1", &sys_clkout1, CK_343X),
110 CLK(NULL, "dpll1_ck", &dpll1_ck, CK_343X),
111 CLK(NULL, "dpll1_x2_ck", &dpll1_x2_ck, CK_343X),
112 CLK(NULL, "dpll1_x2m2_ck", &dpll1_x2m2_ck, CK_343X),
113 CLK(NULL, "dpll2_ck", &dpll2_ck, CK_343X),
114 CLK(NULL, "dpll2_m2_ck", &dpll2_m2_ck, CK_343X),
115 CLK(NULL, "dpll3_ck", &dpll3_ck, CK_343X),
116 CLK(NULL, "core_ck", &core_ck, CK_343X),
117 CLK(NULL, "dpll3_x2_ck", &dpll3_x2_ck, CK_343X),
118 CLK(NULL, "dpll3_m2_ck", &dpll3_m2_ck, CK_343X),
119 CLK(NULL, "dpll3_m2x2_ck", &dpll3_m2x2_ck, CK_343X),
120 CLK(NULL, "dpll3_m3_ck", &dpll3_m3_ck, CK_343X),
121 CLK(NULL, "dpll3_m3x2_ck", &dpll3_m3x2_ck, CK_343X),
122 CLK(NULL, "emu_core_alwon_ck", &emu_core_alwon_ck, CK_343X),
123 CLK(NULL, "dpll4_ck", &dpll4_ck, CK_343X),
124 CLK(NULL, "dpll4_x2_ck", &dpll4_x2_ck, CK_343X),
125 CLK(NULL, "omap_96m_alwon_fck", &omap_96m_alwon_fck, CK_343X),
126 CLK(NULL, "omap_96m_fck", &omap_96m_fck, CK_343X),
127 CLK(NULL, "cm_96m_fck", &cm_96m_fck, CK_343X),
128 CLK(NULL, "omap_54m_fck", &omap_54m_fck, CK_343X),
129 CLK(NULL, "omap_48m_fck", &omap_48m_fck, CK_343X),
130 CLK(NULL, "omap_12m_fck", &omap_12m_fck, CK_343X),
131 CLK(NULL, "dpll4_m2_ck", &dpll4_m2_ck, CK_343X),
132 CLK(NULL, "dpll4_m2x2_ck", &dpll4_m2x2_ck, CK_343X),
133 CLK(NULL, "dpll4_m3_ck", &dpll4_m3_ck, CK_343X),
134 CLK(NULL, "dpll4_m3x2_ck", &dpll4_m3x2_ck, CK_343X),
135 CLK(NULL, "dpll4_m4_ck", &dpll4_m4_ck, CK_343X),
136 CLK(NULL, "dpll4_m4x2_ck", &dpll4_m4x2_ck, CK_343X),
137 CLK(NULL, "dpll4_m5_ck", &dpll4_m5_ck, CK_343X),
138 CLK(NULL, "dpll4_m5x2_ck", &dpll4_m5x2_ck, CK_343X),
139 CLK(NULL, "dpll4_m6_ck", &dpll4_m6_ck, CK_343X),
140 CLK(NULL, "dpll4_m6x2_ck", &dpll4_m6x2_ck, CK_343X),
141 CLK(NULL, "emu_per_alwon_ck", &emu_per_alwon_ck, CK_343X),
142 CLK(NULL, "dpll5_ck", &dpll5_ck, CK_3430ES2),
143 CLK(NULL, "dpll5_m2_ck", &dpll5_m2_ck, CK_3430ES2),
144 CLK(NULL, "clkout2_src_ck", &clkout2_src_ck, CK_343X),
145 CLK(NULL, "sys_clkout2", &sys_clkout2, CK_343X),
146 CLK(NULL, "corex2_fck", &corex2_fck, CK_343X),
147 CLK(NULL, "dpll1_fck", &dpll1_fck, CK_343X),
148 CLK(NULL, "mpu_ck", &mpu_ck, CK_343X),
149 CLK(NULL, "arm_fck", &arm_fck, CK_343X),
150 CLK(NULL, "emu_mpu_alwon_ck", &emu_mpu_alwon_ck, CK_343X),
151 CLK(NULL, "dpll2_fck", &dpll2_fck, CK_343X),
152 CLK(NULL, "iva2_ck", &iva2_ck, CK_343X),
153 CLK(NULL, "l3_ick", &l3_ick, CK_343X),
154 CLK(NULL, "l4_ick", &l4_ick, CK_343X),
155 CLK(NULL, "rm_ick", &rm_ick, CK_343X),
156 CLK(NULL, "gfx_l3_ck", &gfx_l3_ck, CK_3430ES1),
157 CLK(NULL, "gfx_l3_fck", &gfx_l3_fck, CK_3430ES1),
158 CLK(NULL, "gfx_l3_ick", &gfx_l3_ick, CK_3430ES1),
159 CLK(NULL, "gfx_cg1_ck", &gfx_cg1_ck, CK_3430ES1),
160 CLK(NULL, "gfx_cg2_ck", &gfx_cg2_ck, CK_3430ES1),
161 CLK(NULL, "sgx_fck", &sgx_fck, CK_3430ES2),
162 CLK(NULL, "sgx_ick", &sgx_ick, CK_3430ES2),
163 CLK(NULL, "d2d_26m_fck", &d2d_26m_fck, CK_3430ES1),
164 CLK(NULL, "modem_fck", &modem_fck, CK_343X),
165 CLK(NULL, "sad2d_ick", &sad2d_ick, CK_343X),
166 CLK(NULL, "mad2d_ick", &mad2d_ick, CK_343X),
167 CLK(NULL, "gpt10_fck", &gpt10_fck, CK_343X),
168 CLK(NULL, "gpt11_fck", &gpt11_fck, CK_343X),
169 CLK(NULL, "cpefuse_fck", &cpefuse_fck, CK_3430ES2),
170 CLK(NULL, "ts_fck", &ts_fck, CK_3430ES2),
171 CLK(NULL, "usbtll_fck", &usbtll_fck, CK_3430ES2),
172 CLK(NULL, "core_96m_fck", &core_96m_fck, CK_343X),
173 CLK("mmci-omap-hs.2", "fck", &mmchs3_fck, CK_3430ES2),
174 CLK("mmci-omap-hs.1", "fck", &mmchs2_fck, CK_343X),
175 CLK(NULL, "mspro_fck", &mspro_fck, CK_343X),
176 CLK("mmci-omap-hs.0", "fck", &mmchs1_fck, CK_343X),
177 CLK("i2c_omap.3", "fck", &i2c3_fck, CK_343X),
178 CLK("i2c_omap.2", "fck", &i2c2_fck, CK_343X),
179 CLK("i2c_omap.1", "fck", &i2c1_fck, CK_343X),
180 CLK("omap-mcbsp.5", "fck", &mcbsp5_fck, CK_343X),
181 CLK("omap-mcbsp.1", "fck", &mcbsp1_fck, CK_343X),
182 CLK(NULL, "core_48m_fck", &core_48m_fck, CK_343X),
183 CLK("omap2_mcspi.4", "fck", &mcspi4_fck, CK_343X),
184 CLK("omap2_mcspi.3", "fck", &mcspi3_fck, CK_343X),
185 CLK("omap2_mcspi.2", "fck", &mcspi2_fck, CK_343X),
186 CLK("omap2_mcspi.1", "fck", &mcspi1_fck, CK_343X),
187 CLK(NULL, "uart2_fck", &uart2_fck, CK_343X),
188 CLK(NULL, "uart1_fck", &uart1_fck, CK_343X),
189 CLK(NULL, "fshostusb_fck", &fshostusb_fck, CK_3430ES1),
190 CLK(NULL, "core_12m_fck", &core_12m_fck, CK_343X),
191 CLK("omap_hdq.0", "fck", &hdq_fck, CK_343X),
192 CLK(NULL, "ssi_ssr_fck", &ssi_ssr_fck_3430es1, CK_3430ES1),
193 CLK(NULL, "ssi_ssr_fck", &ssi_ssr_fck_3430es2, CK_3430ES2),
194 CLK(NULL, "ssi_sst_fck", &ssi_sst_fck_3430es1, CK_3430ES1),
195 CLK(NULL, "ssi_sst_fck", &ssi_sst_fck_3430es2, CK_3430ES2),
196 CLK(NULL, "core_l3_ick", &core_l3_ick, CK_343X),
197 CLK("musb_hdrc", "ick", &hsotgusb_ick_3430es1, CK_3430ES1),
198 CLK("musb_hdrc", "ick", &hsotgusb_ick_3430es2, CK_3430ES2),
199 CLK(NULL, "sdrc_ick", &sdrc_ick, CK_343X),
200 CLK(NULL, "gpmc_fck", &gpmc_fck, CK_343X),
201 CLK(NULL, "security_l3_ick", &security_l3_ick, CK_343X),
202 CLK(NULL, "pka_ick", &pka_ick, CK_343X),
203 CLK(NULL, "core_l4_ick", &core_l4_ick, CK_343X),
204 CLK(NULL, "usbtll_ick", &usbtll_ick, CK_3430ES2),
205 CLK("mmci-omap-hs.2", "ick", &mmchs3_ick, CK_3430ES2),
206 CLK(NULL, "icr_ick", &icr_ick, CK_343X),
207 CLK(NULL, "aes2_ick", &aes2_ick, CK_343X),
208 CLK(NULL, "sha12_ick", &sha12_ick, CK_343X),
209 CLK(NULL, "des2_ick", &des2_ick, CK_343X),
210 CLK("mmci-omap-hs.1", "ick", &mmchs2_ick, CK_343X),
211 CLK("mmci-omap-hs.0", "ick", &mmchs1_ick, CK_343X),
212 CLK(NULL, "mspro_ick", &mspro_ick, CK_343X),
213 CLK("omap_hdq.0", "ick", &hdq_ick, CK_343X),
214 CLK("omap2_mcspi.4", "ick", &mcspi4_ick, CK_343X),
215 CLK("omap2_mcspi.3", "ick", &mcspi3_ick, CK_343X),
216 CLK("omap2_mcspi.2", "ick", &mcspi2_ick, CK_343X),
217 CLK("omap2_mcspi.1", "ick", &mcspi1_ick, CK_343X),
218 CLK("i2c_omap.3", "ick", &i2c3_ick, CK_343X),
219 CLK("i2c_omap.2", "ick", &i2c2_ick, CK_343X),
220 CLK("i2c_omap.1", "ick", &i2c1_ick, CK_343X),
221 CLK(NULL, "uart2_ick", &uart2_ick, CK_343X),
222 CLK(NULL, "uart1_ick", &uart1_ick, CK_343X),
223 CLK(NULL, "gpt11_ick", &gpt11_ick, CK_343X),
224 CLK(NULL, "gpt10_ick", &gpt10_ick, CK_343X),
225 CLK("omap-mcbsp.5", "ick", &mcbsp5_ick, CK_343X),
226 CLK("omap-mcbsp.1", "ick", &mcbsp1_ick, CK_343X),
227 CLK(NULL, "fac_ick", &fac_ick, CK_3430ES1),
228 CLK(NULL, "mailboxes_ick", &mailboxes_ick, CK_343X),
229 CLK(NULL, "omapctrl_ick", &omapctrl_ick, CK_343X),
230 CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_343X),
231 CLK(NULL, "ssi_ick", &ssi_ick_3430es1, CK_3430ES1),
232 CLK(NULL, "ssi_ick", &ssi_ick_3430es2, CK_3430ES2),
233 CLK(NULL, "usb_l4_ick", &usb_l4_ick, CK_3430ES1),
234 CLK(NULL, "security_l4_ick2", &security_l4_ick2, CK_343X),
235 CLK(NULL, "aes1_ick", &aes1_ick, CK_343X),
236 CLK("omap_rng", "ick", &rng_ick, CK_343X),
237 CLK(NULL, "sha11_ick", &sha11_ick, CK_343X),
238 CLK(NULL, "des1_ick", &des1_ick, CK_343X),
239 CLK("omapfb", "dss1_fck", &dss1_alwon_fck_3430es1, CK_3430ES1),
240 CLK("omapfb", "dss1_fck", &dss1_alwon_fck_3430es2, CK_3430ES2),
241 CLK("omapfb", "tv_fck", &dss_tv_fck, CK_343X),
242 CLK("omapfb", "video_fck", &dss_96m_fck, CK_343X),
243 CLK("omapfb", "dss2_fck", &dss2_alwon_fck, CK_343X),
244 CLK("omapfb", "ick", &dss_ick_3430es1, CK_3430ES1),
245 CLK("omapfb", "ick", &dss_ick_3430es2, CK_3430ES2),
246 CLK(NULL, "cam_mclk", &cam_mclk, CK_343X),
247 CLK(NULL, "cam_ick", &cam_ick, CK_343X),
248 CLK(NULL, "csi2_96m_fck", &csi2_96m_fck, CK_343X),
249 CLK(NULL, "usbhost_120m_fck", &usbhost_120m_fck, CK_3430ES2),
250 CLK(NULL, "usbhost_48m_fck", &usbhost_48m_fck, CK_3430ES2),
251 CLK(NULL, "usbhost_ick", &usbhost_ick, CK_3430ES2),
252 CLK(NULL, "usim_fck", &usim_fck, CK_3430ES2),
253 CLK(NULL, "gpt1_fck", &gpt1_fck, CK_343X),
254 CLK(NULL, "wkup_32k_fck", &wkup_32k_fck, CK_343X),
255 CLK(NULL, "gpio1_dbck", &gpio1_dbck, CK_343X),
256 CLK("omap_wdt", "fck", &wdt2_fck, CK_343X),
257 CLK(NULL, "wkup_l4_ick", &wkup_l4_ick, CK_343X),
258 CLK(NULL, "usim_ick", &usim_ick, CK_3430ES2),
259 CLK("omap_wdt", "ick", &wdt2_ick, CK_343X),
260 CLK(NULL, "wdt1_ick", &wdt1_ick, CK_343X),
261 CLK(NULL, "gpio1_ick", &gpio1_ick, CK_343X),
262 CLK(NULL, "omap_32ksync_ick", &omap_32ksync_ick, CK_343X),
263 CLK(NULL, "gpt12_ick", &gpt12_ick, CK_343X),
264 CLK(NULL, "gpt1_ick", &gpt1_ick, CK_343X),
265 CLK(NULL, "per_96m_fck", &per_96m_fck, CK_343X),
266 CLK(NULL, "per_48m_fck", &per_48m_fck, CK_343X),
267 CLK(NULL, "uart3_fck", &uart3_fck, CK_343X),
268 CLK(NULL, "gpt2_fck", &gpt2_fck, CK_343X),
269 CLK(NULL, "gpt3_fck", &gpt3_fck, CK_343X),
270 CLK(NULL, "gpt4_fck", &gpt4_fck, CK_343X),
271 CLK(NULL, "gpt5_fck", &gpt5_fck, CK_343X),
272 CLK(NULL, "gpt6_fck", &gpt6_fck, CK_343X),
273 CLK(NULL, "gpt7_fck", &gpt7_fck, CK_343X),
274 CLK(NULL, "gpt8_fck", &gpt8_fck, CK_343X),
275 CLK(NULL, "gpt9_fck", &gpt9_fck, CK_343X),
276 CLK(NULL, "per_32k_alwon_fck", &per_32k_alwon_fck, CK_343X),
277 CLK(NULL, "gpio6_dbck", &gpio6_dbck, CK_343X),
278 CLK(NULL, "gpio5_dbck", &gpio5_dbck, CK_343X),
279 CLK(NULL, "gpio4_dbck", &gpio4_dbck, CK_343X),
280 CLK(NULL, "gpio3_dbck", &gpio3_dbck, CK_343X),
281 CLK(NULL, "gpio2_dbck", &gpio2_dbck, CK_343X),
282 CLK(NULL, "wdt3_fck", &wdt3_fck, CK_343X),
283 CLK(NULL, "per_l4_ick", &per_l4_ick, CK_343X),
284 CLK(NULL, "gpio6_ick", &gpio6_ick, CK_343X),
285 CLK(NULL, "gpio5_ick", &gpio5_ick, CK_343X),
286 CLK(NULL, "gpio4_ick", &gpio4_ick, CK_343X),
287 CLK(NULL, "gpio3_ick", &gpio3_ick, CK_343X),
288 CLK(NULL, "gpio2_ick", &gpio2_ick, CK_343X),
289 CLK(NULL, "wdt3_ick", &wdt3_ick, CK_343X),
290 CLK(NULL, "uart3_ick", &uart3_ick, CK_343X),
291 CLK(NULL, "gpt9_ick", &gpt9_ick, CK_343X),
292 CLK(NULL, "gpt8_ick", &gpt8_ick, CK_343X),
293 CLK(NULL, "gpt7_ick", &gpt7_ick, CK_343X),
294 CLK(NULL, "gpt6_ick", &gpt6_ick, CK_343X),
295 CLK(NULL, "gpt5_ick", &gpt5_ick, CK_343X),
296 CLK(NULL, "gpt4_ick", &gpt4_ick, CK_343X),
297 CLK(NULL, "gpt3_ick", &gpt3_ick, CK_343X),
298 CLK(NULL, "gpt2_ick", &gpt2_ick, CK_343X),
299 CLK("omap-mcbsp.2", "ick", &mcbsp2_ick, CK_343X),
300 CLK("omap-mcbsp.3", "ick", &mcbsp3_ick, CK_343X),
301 CLK("omap-mcbsp.4", "ick", &mcbsp4_ick, CK_343X),
302 CLK("omap-mcbsp.2", "fck", &mcbsp2_fck, CK_343X),
303 CLK("omap-mcbsp.3", "fck", &mcbsp3_fck, CK_343X),
304 CLK("omap-mcbsp.4", "fck", &mcbsp4_fck, CK_343X),
305 CLK(NULL, "emu_src_ck", &emu_src_ck, CK_343X),
306 CLK(NULL, "pclk_fck", &pclk_fck, CK_343X),
307 CLK(NULL, "pclkx2_fck", &pclkx2_fck, CK_343X),
308 CLK(NULL, "atclk_fck", &atclk_fck, CK_343X),
309 CLK(NULL, "traceclk_src_fck", &traceclk_src_fck, CK_343X),
310 CLK(NULL, "traceclk_fck", &traceclk_fck, CK_343X),
311 CLK(NULL, "sr1_fck", &sr1_fck, CK_343X),
312 CLK(NULL, "sr2_fck", &sr2_fck, CK_343X),
313 CLK(NULL, "sr_l4_ick", &sr_l4_ick, CK_343X),
314 CLK(NULL, "secure_32k_fck", &secure_32k_fck, CK_343X),
315 CLK(NULL, "gpt12_fck", &gpt12_fck, CK_343X),
316 CLK(NULL, "wdt1_fck", &wdt1_fck, CK_343X),
317};
318
319/* CM_AUTOIDLE_PLL*.AUTO_* bit values */
320#define DPLL_AUTOIDLE_DISABLE 0x0
321#define DPLL_AUTOIDLE_LOW_POWER_STOP 0x1
322
323#define MAX_DPLL_WAIT_TRIES 1000000
324
325#define MIN_SDRC_DLL_LOCK_FREQ 83000000
326
327#define CYCLES_PER_MHZ 1000000
328
329/* Scale factor for fixed-point arith in omap3_core_dpll_m2_set_rate() */
330#define SDRC_MPURATE_SCALE 8
331
332/* 2^SDRC_MPURATE_BASE_SHIFT: MPU MHz that SDRC_MPURATE_LOOPS is defined for */
333#define SDRC_MPURATE_BASE_SHIFT 9
334
335/*
336 * SDRC_MPURATE_LOOPS: Number of MPU loops to execute at
337 * 2^MPURATE_BASE_SHIFT MHz for SDRC to stabilize
338 */
339#define SDRC_MPURATE_LOOPS 96
340
341/*
342 * DPLL5_FREQ_FOR_USBHOST: USBHOST and USBTLL are the only clocks
343 * that are sourced by DPLL5, and both of these require this clock
344 * to be at 120 MHz for proper operation.
345 */
346#define DPLL5_FREQ_FOR_USBHOST 120000000
347
348/** 31/**
349 * omap3430es2_clk_ssi_find_idlest - return CM_IDLEST info for SSI 32 * omap3430es2_clk_ssi_find_idlest - return CM_IDLEST info for SSI
350 * @clk: struct clk * being enabled 33 * @clk: struct clk * being enabled
351 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into 34 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
352 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into 35 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
36 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
353 * 37 *
354 * The OMAP3430ES2 SSI target CM_IDLEST bit is at a different shift 38 * The OMAP3430ES2 SSI target CM_IDLEST bit is at a different shift
355 * from the CM_{I,F}CLKEN bit. Pass back the correct info via 39 * from the CM_{I,F}CLKEN bit. Pass back the correct info via
@@ -357,20 +41,30 @@ static struct omap_clk omap34xx_clks[] = {
357 */ 41 */
358static void omap3430es2_clk_ssi_find_idlest(struct clk *clk, 42static void omap3430es2_clk_ssi_find_idlest(struct clk *clk,
359 void __iomem **idlest_reg, 43 void __iomem **idlest_reg,
360 u8 *idlest_bit) 44 u8 *idlest_bit,
45 u8 *idlest_val)
361{ 46{
362 u32 r; 47 u32 r;
363 48
364 r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); 49 r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20);
365 *idlest_reg = (__force void __iomem *)r; 50 *idlest_reg = (__force void __iomem *)r;
366 *idlest_bit = OMAP3430ES2_ST_SSI_IDLE_SHIFT; 51 *idlest_bit = OMAP3430ES2_ST_SSI_IDLE_SHIFT;
52 *idlest_val = OMAP34XX_CM_IDLEST_VAL;
367} 53}
368 54
55const struct clkops clkops_omap3430es2_ssi_wait = {
56 .enable = omap2_dflt_clk_enable,
57 .disable = omap2_dflt_clk_disable,
58 .find_idlest = omap3430es2_clk_ssi_find_idlest,
59 .find_companion = omap2_clk_dflt_find_companion,
60};
61
369/** 62/**
370 * omap3430es2_clk_dss_usbhost_find_idlest - CM_IDLEST info for DSS, USBHOST 63 * omap3430es2_clk_dss_usbhost_find_idlest - CM_IDLEST info for DSS, USBHOST
371 * @clk: struct clk * being enabled 64 * @clk: struct clk * being enabled
372 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into 65 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
373 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into 66 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
67 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
374 * 68 *
375 * Some OMAP modules on OMAP3 ES2+ chips have both initiator and 69 * Some OMAP modules on OMAP3 ES2+ chips have both initiator and
376 * target IDLEST bits. For our purposes, we are concerned with the 70 * target IDLEST bits. For our purposes, we are concerned with the
@@ -381,7 +75,8 @@ static void omap3430es2_clk_ssi_find_idlest(struct clk *clk,
381 */ 75 */
382static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk *clk, 76static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk *clk,
383 void __iomem **idlest_reg, 77 void __iomem **idlest_reg,
384 u8 *idlest_bit) 78 u8 *idlest_bit,
79 u8 *idlest_val)
385{ 80{
386 u32 r; 81 u32 r;
387 82
@@ -389,13 +84,22 @@ static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk *clk,
389 *idlest_reg = (__force void __iomem *)r; 84 *idlest_reg = (__force void __iomem *)r;
390 /* USBHOST_IDLE has same shift */ 85 /* USBHOST_IDLE has same shift */
391 *idlest_bit = OMAP3430ES2_ST_DSS_IDLE_SHIFT; 86 *idlest_bit = OMAP3430ES2_ST_DSS_IDLE_SHIFT;
87 *idlest_val = OMAP34XX_CM_IDLEST_VAL;
392} 88}
393 89
90const struct clkops clkops_omap3430es2_dss_usbhost_wait = {
91 .enable = omap2_dflt_clk_enable,
92 .disable = omap2_dflt_clk_disable,
93 .find_idlest = omap3430es2_clk_dss_usbhost_find_idlest,
94 .find_companion = omap2_clk_dflt_find_companion,
95};
96
394/** 97/**
395 * omap3430es2_clk_hsotgusb_find_idlest - return CM_IDLEST info for HSOTGUSB 98 * omap3430es2_clk_hsotgusb_find_idlest - return CM_IDLEST info for HSOTGUSB
396 * @clk: struct clk * being enabled 99 * @clk: struct clk * being enabled
397 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into 100 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
398 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into 101 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
102 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
399 * 103 *
400 * The OMAP3430ES2 HSOTGUSB target CM_IDLEST bit is at a different 104 * The OMAP3430ES2 HSOTGUSB target CM_IDLEST bit is at a different
401 * shift from the CM_{I,F}CLKEN bit. Pass back the correct info via 105 * shift from the CM_{I,F}CLKEN bit. Pass back the correct info via
@@ -403,793 +107,20 @@ static void omap3430es2_clk_dss_usbhost_find_idlest(struct clk *clk,
403 */ 107 */
404static void omap3430es2_clk_hsotgusb_find_idlest(struct clk *clk, 108static void omap3430es2_clk_hsotgusb_find_idlest(struct clk *clk,
405 void __iomem **idlest_reg, 109 void __iomem **idlest_reg,
406 u8 *idlest_bit) 110 u8 *idlest_bit,
111 u8 *idlest_val)
407{ 112{
408 u32 r; 113 u32 r;
409 114
410 r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20); 115 r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20);
411 *idlest_reg = (__force void __iomem *)r; 116 *idlest_reg = (__force void __iomem *)r;
412 *idlest_bit = OMAP3430ES2_ST_HSOTGUSB_IDLE_SHIFT; 117 *idlest_bit = OMAP3430ES2_ST_HSOTGUSB_IDLE_SHIFT;
118 *idlest_val = OMAP34XX_CM_IDLEST_VAL;
413} 119}
414 120
415/** 121const struct clkops clkops_omap3430es2_hsotgusb_wait = {
416 * omap3_dpll_recalc - recalculate DPLL rate 122 .enable = omap2_dflt_clk_enable,
417 * @clk: DPLL struct clk 123 .disable = omap2_dflt_clk_disable,
418 * 124 .find_idlest = omap3430es2_clk_hsotgusb_find_idlest,
419 * Recalculate and propagate the DPLL rate. 125 .find_companion = omap2_clk_dflt_find_companion,
420 */
421static unsigned long omap3_dpll_recalc(struct clk *clk)
422{
423 return omap2_get_dpll_rate(clk);
424}
425
426/* _omap3_dpll_write_clken - write clken_bits arg to a DPLL's enable bits */
427static void _omap3_dpll_write_clken(struct clk *clk, u8 clken_bits)
428{
429 const struct dpll_data *dd;
430 u32 v;
431
432 dd = clk->dpll_data;
433
434 v = __raw_readl(dd->control_reg);
435 v &= ~dd->enable_mask;
436 v |= clken_bits << __ffs(dd->enable_mask);
437 __raw_writel(v, dd->control_reg);
438}
439
440/* _omap3_wait_dpll_status: wait for a DPLL to enter a specific state */
441static int _omap3_wait_dpll_status(struct clk *clk, u8 state)
442{
443 const struct dpll_data *dd;
444 int i = 0;
445 int ret = -EINVAL;
446
447 dd = clk->dpll_data;
448
449 state <<= __ffs(dd->idlest_mask);
450
451 while (((__raw_readl(dd->idlest_reg) & dd->idlest_mask) != state) &&
452 i < MAX_DPLL_WAIT_TRIES) {
453 i++;
454 udelay(1);
455 }
456
457 if (i == MAX_DPLL_WAIT_TRIES) {
458 printk(KERN_ERR "clock: %s failed transition to '%s'\n",
459 clk->name, (state) ? "locked" : "bypassed");
460 } else {
461 pr_debug("clock: %s transition to '%s' in %d loops\n",
462 clk->name, (state) ? "locked" : "bypassed", i);
463
464 ret = 0;
465 }
466
467 return ret;
468}
469
470/* From 3430 TRM ES2 4.7.6.2 */
471static u16 _omap3_dpll_compute_freqsel(struct clk *clk, u8 n)
472{
473 unsigned long fint;
474 u16 f = 0;
475
476 fint = clk->dpll_data->clk_ref->rate / n;
477
478 pr_debug("clock: fint is %lu\n", fint);
479
480 if (fint >= 750000 && fint <= 1000000)
481 f = 0x3;
482 else if (fint > 1000000 && fint <= 1250000)
483 f = 0x4;
484 else if (fint > 1250000 && fint <= 1500000)
485 f = 0x5;
486 else if (fint > 1500000 && fint <= 1750000)
487 f = 0x6;
488 else if (fint > 1750000 && fint <= 2100000)
489 f = 0x7;
490 else if (fint > 7500000 && fint <= 10000000)
491 f = 0xB;
492 else if (fint > 10000000 && fint <= 12500000)
493 f = 0xC;
494 else if (fint > 12500000 && fint <= 15000000)
495 f = 0xD;
496 else if (fint > 15000000 && fint <= 17500000)
497 f = 0xE;
498 else if (fint > 17500000 && fint <= 21000000)
499 f = 0xF;
500 else
501 pr_debug("clock: unknown freqsel setting for %d\n", n);
502
503 return f;
504}
505
506/* Non-CORE DPLL (e.g., DPLLs that do not control SDRC) clock functions */
507
508/*
509 * _omap3_noncore_dpll_lock - instruct a DPLL to lock and wait for readiness
510 * @clk: pointer to a DPLL struct clk
511 *
512 * Instructs a non-CORE DPLL to lock. Waits for the DPLL to report
513 * readiness before returning. Will save and restore the DPLL's
514 * autoidle state across the enable, per the CDP code. If the DPLL
515 * locked successfully, return 0; if the DPLL did not lock in the time
516 * allotted, or DPLL3 was passed in, return -EINVAL.
517 */
518static int _omap3_noncore_dpll_lock(struct clk *clk)
519{
520 u8 ai;
521 int r;
522
523 if (clk == &dpll3_ck)
524 return -EINVAL;
525
526 pr_debug("clock: locking DPLL %s\n", clk->name);
527
528 ai = omap3_dpll_autoidle_read(clk);
529
530 omap3_dpll_deny_idle(clk);
531
532 _omap3_dpll_write_clken(clk, DPLL_LOCKED);
533
534 r = _omap3_wait_dpll_status(clk, 1);
535
536 if (ai)
537 omap3_dpll_allow_idle(clk);
538
539 return r;
540}
541
542/*
543 * _omap3_noncore_dpll_bypass - instruct a DPLL to bypass and wait for readiness
544 * @clk: pointer to a DPLL struct clk
545 *
546 * Instructs a non-CORE DPLL to enter low-power bypass mode. In
547 * bypass mode, the DPLL's rate is set equal to its parent clock's
548 * rate. Waits for the DPLL to report readiness before returning.
549 * Will save and restore the DPLL's autoidle state across the enable,
550 * per the CDP code. If the DPLL entered bypass mode successfully,
551 * return 0; if the DPLL did not enter bypass in the time allotted, or
552 * DPLL3 was passed in, or the DPLL does not support low-power bypass,
553 * return -EINVAL.
554 */
555static int _omap3_noncore_dpll_bypass(struct clk *clk)
556{
557 int r;
558 u8 ai;
559
560 if (clk == &dpll3_ck)
561 return -EINVAL;
562
563 if (!(clk->dpll_data->modes & (1 << DPLL_LOW_POWER_BYPASS)))
564 return -EINVAL;
565
566 pr_debug("clock: configuring DPLL %s for low-power bypass\n",
567 clk->name);
568
569 ai = omap3_dpll_autoidle_read(clk);
570
571 _omap3_dpll_write_clken(clk, DPLL_LOW_POWER_BYPASS);
572
573 r = _omap3_wait_dpll_status(clk, 0);
574
575 if (ai)
576 omap3_dpll_allow_idle(clk);
577 else
578 omap3_dpll_deny_idle(clk);
579
580 return r;
581}
582
583/*
584 * _omap3_noncore_dpll_stop - instruct a DPLL to stop
585 * @clk: pointer to a DPLL struct clk
586 *
587 * Instructs a non-CORE DPLL to enter low-power stop. Will save and
588 * restore the DPLL's autoidle state across the stop, per the CDP
589 * code. If DPLL3 was passed in, or the DPLL does not support
590 * low-power stop, return -EINVAL; otherwise, return 0.
591 */
592static int _omap3_noncore_dpll_stop(struct clk *clk)
593{
594 u8 ai;
595
596 if (clk == &dpll3_ck)
597 return -EINVAL;
598
599 if (!(clk->dpll_data->modes & (1 << DPLL_LOW_POWER_STOP)))
600 return -EINVAL;
601
602 pr_debug("clock: stopping DPLL %s\n", clk->name);
603
604 ai = omap3_dpll_autoidle_read(clk);
605
606 _omap3_dpll_write_clken(clk, DPLL_LOW_POWER_STOP);
607
608 if (ai)
609 omap3_dpll_allow_idle(clk);
610 else
611 omap3_dpll_deny_idle(clk);
612
613 return 0;
614}
615
616/**
617 * omap3_noncore_dpll_enable - instruct a DPLL to enter bypass or lock mode
618 * @clk: pointer to a DPLL struct clk
619 *
620 * Instructs a non-CORE DPLL to enable, e.g., to enter bypass or lock.
621 * The choice of modes depends on the DPLL's programmed rate: if it is
622 * the same as the DPLL's parent clock, it will enter bypass;
623 * otherwise, it will enter lock. This code will wait for the DPLL to
624 * indicate readiness before returning, unless the DPLL takes too long
625 * to enter the target state. Intended to be used as the struct clk's
626 * enable function. If DPLL3 was passed in, or the DPLL does not
627 * support low-power stop, or if the DPLL took too long to enter
628 * bypass or lock, return -EINVAL; otherwise, return 0.
629 */
630static int omap3_noncore_dpll_enable(struct clk *clk)
631{
632 int r;
633 struct dpll_data *dd;
634
635 if (clk == &dpll3_ck)
636 return -EINVAL;
637
638 dd = clk->dpll_data;
639 if (!dd)
640 return -EINVAL;
641
642 if (clk->rate == dd->clk_bypass->rate) {
643 WARN_ON(clk->parent != dd->clk_bypass);
644 r = _omap3_noncore_dpll_bypass(clk);
645 } else {
646 WARN_ON(clk->parent != dd->clk_ref);
647 r = _omap3_noncore_dpll_lock(clk);
648 }
649 /* FIXME: this is dubious - if clk->rate has changed, what about propagating? */
650 if (!r)
651 clk->rate = omap2_get_dpll_rate(clk);
652
653 return r;
654}
655
656/**
657 * omap3_noncore_dpll_enable - instruct a DPLL to enter bypass or lock mode
658 * @clk: pointer to a DPLL struct clk
659 *
660 * Instructs a non-CORE DPLL to enable, e.g., to enter bypass or lock.
661 * The choice of modes depends on the DPLL's programmed rate: if it is
662 * the same as the DPLL's parent clock, it will enter bypass;
663 * otherwise, it will enter lock. This code will wait for the DPLL to
664 * indicate readiness before returning, unless the DPLL takes too long
665 * to enter the target state. Intended to be used as the struct clk's
666 * enable function. If DPLL3 was passed in, or the DPLL does not
667 * support low-power stop, or if the DPLL took too long to enter
668 * bypass or lock, return -EINVAL; otherwise, return 0.
669 */
670static void omap3_noncore_dpll_disable(struct clk *clk)
671{
672 if (clk == &dpll3_ck)
673 return;
674
675 _omap3_noncore_dpll_stop(clk);
676}
677
678
679/* Non-CORE DPLL rate set code */
680
681/*
682 * omap3_noncore_dpll_program - set non-core DPLL M,N values directly
683 * @clk: struct clk * of DPLL to set
684 * @m: DPLL multiplier to set
685 * @n: DPLL divider to set
686 * @freqsel: FREQSEL value to set
687 *
688 * Program the DPLL with the supplied M, N values, and wait for the DPLL to
689 * lock.. Returns -EINVAL upon error, or 0 upon success.
690 */
691static int omap3_noncore_dpll_program(struct clk *clk, u16 m, u8 n, u16 freqsel)
692{
693 struct dpll_data *dd = clk->dpll_data;
694 u32 v;
695
696 /* 3430 ES2 TRM: 4.7.6.9 DPLL Programming Sequence */
697 _omap3_noncore_dpll_bypass(clk);
698
699 /* Set jitter correction */
700 v = __raw_readl(dd->control_reg);
701 v &= ~dd->freqsel_mask;
702 v |= freqsel << __ffs(dd->freqsel_mask);
703 __raw_writel(v, dd->control_reg);
704
705 /* Set DPLL multiplier, divider */
706 v = __raw_readl(dd->mult_div1_reg);
707 v &= ~(dd->mult_mask | dd->div1_mask);
708 v |= m << __ffs(dd->mult_mask);
709 v |= (n - 1) << __ffs(dd->div1_mask);
710 __raw_writel(v, dd->mult_div1_reg);
711
712 /* We let the clock framework set the other output dividers later */
713
714 /* REVISIT: Set ramp-up delay? */
715
716 _omap3_noncore_dpll_lock(clk);
717
718 return 0;
719}
720
721/**
722 * omap3_noncore_dpll_set_rate - set non-core DPLL rate
723 * @clk: struct clk * of DPLL to set
724 * @rate: rounded target rate
725 *
726 * Set the DPLL CLKOUT to the target rate. If the DPLL can enter
727 * low-power bypass, and the target rate is the bypass source clock
728 * rate, then configure the DPLL for bypass. Otherwise, round the
729 * target rate if it hasn't been done already, then program and lock
730 * the DPLL. Returns -EINVAL upon error, or 0 upon success.
731 */
732static int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate)
733{
734 struct clk *new_parent = NULL;
735 u16 freqsel;
736 struct dpll_data *dd;
737 int ret;
738
739 if (!clk || !rate)
740 return -EINVAL;
741
742 dd = clk->dpll_data;
743 if (!dd)
744 return -EINVAL;
745
746 if (rate == omap2_get_dpll_rate(clk))
747 return 0;
748
749 /*
750 * Ensure both the bypass and ref clocks are enabled prior to
751 * doing anything; we need the bypass clock running to reprogram
752 * the DPLL.
753 */
754 omap2_clk_enable(dd->clk_bypass);
755 omap2_clk_enable(dd->clk_ref);
756
757 if (dd->clk_bypass->rate == rate &&
758 (clk->dpll_data->modes & (1 << DPLL_LOW_POWER_BYPASS))) {
759 pr_debug("clock: %s: set rate: entering bypass.\n", clk->name);
760
761 ret = _omap3_noncore_dpll_bypass(clk);
762 if (!ret)
763 new_parent = dd->clk_bypass;
764 } else {
765 if (dd->last_rounded_rate != rate)
766 omap2_dpll_round_rate(clk, rate);
767
768 if (dd->last_rounded_rate == 0)
769 return -EINVAL;
770
771 freqsel = _omap3_dpll_compute_freqsel(clk, dd->last_rounded_n);
772 if (!freqsel)
773 WARN_ON(1);
774
775 pr_debug("clock: %s: set rate: locking rate to %lu.\n",
776 clk->name, rate);
777
778 ret = omap3_noncore_dpll_program(clk, dd->last_rounded_m,
779 dd->last_rounded_n, freqsel);
780 if (!ret)
781 new_parent = dd->clk_ref;
782 }
783 if (!ret) {
784 /*
785 * Switch the parent clock in the heirarchy, and make sure
786 * that the new parent's usecount is correct. Note: we
787 * enable the new parent before disabling the old to avoid
788 * any unnecessary hardware disable->enable transitions.
789 */
790 if (clk->usecount) {
791 omap2_clk_enable(new_parent);
792 omap2_clk_disable(clk->parent);
793 }
794 clk_reparent(clk, new_parent);
795 clk->rate = rate;
796 }
797 omap2_clk_disable(dd->clk_ref);
798 omap2_clk_disable(dd->clk_bypass);
799
800 return 0;
801}
802
803static int omap3_dpll4_set_rate(struct clk *clk, unsigned long rate)
804{
805 /*
806 * According to the 12-5 CDP code from TI, "Limitation 2.5"
807 * on 3430ES1 prevents us from changing DPLL multipliers or dividers
808 * on DPLL4.
809 */
810 if (omap_rev() == OMAP3430_REV_ES1_0) {
811 printk(KERN_ERR "clock: DPLL4 cannot change rate due to "
812 "silicon 'Limitation 2.5' on 3430ES1.\n");
813 return -EINVAL;
814 }
815 return omap3_noncore_dpll_set_rate(clk, rate);
816}
817
818
819/*
820 * CORE DPLL (DPLL3) rate programming functions
821 *
822 * These call into SRAM code to do the actual CM writes, since the SDRAM
823 * is clocked from DPLL3.
824 */
825
826/**
827 * omap3_core_dpll_m2_set_rate - set CORE DPLL M2 divider
828 * @clk: struct clk * of DPLL to set
829 * @rate: rounded target rate
830 *
831 * Program the DPLL M2 divider with the rounded target rate. Returns
832 * -EINVAL upon error, or 0 upon success.
833 */
834static int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
835{
836 u32 new_div = 0;
837 u32 unlock_dll = 0;
838 u32 c;
839 unsigned long validrate, sdrcrate, mpurate;
840 struct omap_sdrc_params *sdrc_cs0;
841 struct omap_sdrc_params *sdrc_cs1;
842 int ret;
843
844 if (!clk || !rate)
845 return -EINVAL;
846
847 if (clk != &dpll3_m2_ck)
848 return -EINVAL;
849
850 validrate = omap2_clksel_round_rate_div(clk, rate, &new_div);
851 if (validrate != rate)
852 return -EINVAL;
853
854 sdrcrate = sdrc_ick.rate;
855 if (rate > clk->rate)
856 sdrcrate <<= ((rate / clk->rate) >> 1);
857 else
858 sdrcrate >>= ((clk->rate / rate) >> 1);
859
860 ret = omap2_sdrc_get_params(sdrcrate, &sdrc_cs0, &sdrc_cs1);
861 if (ret)
862 return -EINVAL;
863
864 if (sdrcrate < MIN_SDRC_DLL_LOCK_FREQ) {
865 pr_debug("clock: will unlock SDRC DLL\n");
866 unlock_dll = 1;
867 }
868
869 /*
870 * XXX This only needs to be done when the CPU frequency changes
871 */
872 mpurate = arm_fck.rate / CYCLES_PER_MHZ;
873 c = (mpurate << SDRC_MPURATE_SCALE) >> SDRC_MPURATE_BASE_SHIFT;
874 c += 1; /* for safety */
875 c *= SDRC_MPURATE_LOOPS;
876 c >>= SDRC_MPURATE_SCALE;
877 if (c == 0)
878 c = 1;
879
880 pr_debug("clock: changing CORE DPLL rate from %lu to %lu\n", clk->rate,
881 validrate);
882 pr_debug("clock: SDRC CS0 timing params used:"
883 " RFR %08x CTRLA %08x CTRLB %08x MR %08x\n",
884 sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
885 sdrc_cs0->actim_ctrlb, sdrc_cs0->mr);
886 if (sdrc_cs1)
887 pr_debug("clock: SDRC CS1 timing params used: "
888 " RFR %08x CTRLA %08x CTRLB %08x MR %08x\n",
889 sdrc_cs1->rfr_ctrl, sdrc_cs1->actim_ctrla,
890 sdrc_cs1->actim_ctrlb, sdrc_cs1->mr);
891
892 if (sdrc_cs1)
893 omap3_configure_core_dpll(
894 new_div, unlock_dll, c, rate > clk->rate,
895 sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
896 sdrc_cs0->actim_ctrlb, sdrc_cs0->mr,
897 sdrc_cs1->rfr_ctrl, sdrc_cs1->actim_ctrla,
898 sdrc_cs1->actim_ctrlb, sdrc_cs1->mr);
899 else
900 omap3_configure_core_dpll(
901 new_div, unlock_dll, c, rate > clk->rate,
902 sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
903 sdrc_cs0->actim_ctrlb, sdrc_cs0->mr,
904 0, 0, 0, 0);
905
906 return 0;
907}
908
909
910static const struct clkops clkops_noncore_dpll_ops = {
911 .enable = &omap3_noncore_dpll_enable,
912 .disable = &omap3_noncore_dpll_disable,
913};
914
915/* DPLL autoidle read/set code */
916
917
918/**
919 * omap3_dpll_autoidle_read - read a DPLL's autoidle bits
920 * @clk: struct clk * of the DPLL to read
921 *
922 * Return the DPLL's autoidle bits, shifted down to bit 0. Returns
923 * -EINVAL if passed a null pointer or if the struct clk does not
924 * appear to refer to a DPLL.
925 */
926static u32 omap3_dpll_autoidle_read(struct clk *clk)
927{
928 const struct dpll_data *dd;
929 u32 v;
930
931 if (!clk || !clk->dpll_data)
932 return -EINVAL;
933
934 dd = clk->dpll_data;
935
936 v = __raw_readl(dd->autoidle_reg);
937 v &= dd->autoidle_mask;
938 v >>= __ffs(dd->autoidle_mask);
939
940 return v;
941}
942
943/**
944 * omap3_dpll_allow_idle - enable DPLL autoidle bits
945 * @clk: struct clk * of the DPLL to operate on
946 *
947 * Enable DPLL automatic idle control. This automatic idle mode
948 * switching takes effect only when the DPLL is locked, at least on
949 * OMAP3430. The DPLL will enter low-power stop when its downstream
950 * clocks are gated. No return value.
951 */
952static void omap3_dpll_allow_idle(struct clk *clk)
953{
954 const struct dpll_data *dd;
955 u32 v;
956
957 if (!clk || !clk->dpll_data)
958 return;
959
960 dd = clk->dpll_data;
961
962 /*
963 * REVISIT: CORE DPLL can optionally enter low-power bypass
964 * by writing 0x5 instead of 0x1. Add some mechanism to
965 * optionally enter this mode.
966 */
967 v = __raw_readl(dd->autoidle_reg);
968 v &= ~dd->autoidle_mask;
969 v |= DPLL_AUTOIDLE_LOW_POWER_STOP << __ffs(dd->autoidle_mask);
970 __raw_writel(v, dd->autoidle_reg);
971}
972
973/**
974 * omap3_dpll_deny_idle - prevent DPLL from automatically idling
975 * @clk: struct clk * of the DPLL to operate on
976 *
977 * Disable DPLL automatic idle control. No return value.
978 */
979static void omap3_dpll_deny_idle(struct clk *clk)
980{
981 const struct dpll_data *dd;
982 u32 v;
983
984 if (!clk || !clk->dpll_data)
985 return;
986
987 dd = clk->dpll_data;
988
989 v = __raw_readl(dd->autoidle_reg);
990 v &= ~dd->autoidle_mask;
991 v |= DPLL_AUTOIDLE_DISABLE << __ffs(dd->autoidle_mask);
992 __raw_writel(v, dd->autoidle_reg);
993}
994
995/* Clock control for DPLL outputs */
996
997/**
998 * omap3_clkoutx2_recalc - recalculate DPLL X2 output virtual clock rate
999 * @clk: DPLL output struct clk
1000 *
1001 * Using parent clock DPLL data, look up DPLL state. If locked, set our
1002 * rate to the dpll_clk * 2; otherwise, just use dpll_clk.
1003 */
1004static unsigned long omap3_clkoutx2_recalc(struct clk *clk)
1005{
1006 const struct dpll_data *dd;
1007 unsigned long rate;
1008 u32 v;
1009 struct clk *pclk;
1010
1011 /* Walk up the parents of clk, looking for a DPLL */
1012 pclk = clk->parent;
1013 while (pclk && !pclk->dpll_data)
1014 pclk = pclk->parent;
1015
1016 /* clk does not have a DPLL as a parent? */
1017 WARN_ON(!pclk);
1018
1019 dd = pclk->dpll_data;
1020
1021 WARN_ON(!dd->enable_mask);
1022
1023 v = __raw_readl(dd->control_reg) & dd->enable_mask;
1024 v >>= __ffs(dd->enable_mask);
1025 if (v != OMAP3XXX_EN_DPLL_LOCKED)
1026 rate = clk->parent->rate;
1027 else
1028 rate = clk->parent->rate * 2;
1029 return rate;
1030}
1031
1032/* Common clock code */
1033
1034/*
1035 * As it is structured now, this will prevent an OMAP2/3 multiboot
1036 * kernel from compiling. This will need further attention.
1037 */
1038#if defined(CONFIG_ARCH_OMAP3)
1039
1040static struct clk_functions omap2_clk_functions = {
1041 .clk_enable = omap2_clk_enable,
1042 .clk_disable = omap2_clk_disable,
1043 .clk_round_rate = omap2_clk_round_rate,
1044 .clk_set_rate = omap2_clk_set_rate,
1045 .clk_set_parent = omap2_clk_set_parent,
1046 .clk_disable_unused = omap2_clk_disable_unused,
1047}; 126};
1048
1049/*
1050 * Set clocks for bypass mode for reboot to work.
1051 */
1052void omap2_clk_prepare_for_reboot(void)
1053{
1054 /* REVISIT: Not ready for 343x */
1055#if 0
1056 u32 rate;
1057
1058 if (vclk == NULL || sclk == NULL)
1059 return;
1060
1061 rate = clk_get_rate(sclk);
1062 clk_set_rate(vclk, rate);
1063#endif
1064}
1065
1066static void omap3_clk_lock_dpll5(void)
1067{
1068 struct clk *dpll5_clk;
1069 struct clk *dpll5_m2_clk;
1070
1071 dpll5_clk = clk_get(NULL, "dpll5_ck");
1072 clk_set_rate(dpll5_clk, DPLL5_FREQ_FOR_USBHOST);
1073 clk_enable(dpll5_clk);
1074
1075 /* Enable autoidle to allow it to enter low power bypass */
1076 omap3_dpll_allow_idle(dpll5_clk);
1077
1078 /* Program dpll5_m2_clk divider for no division */
1079 dpll5_m2_clk = clk_get(NULL, "dpll5_m2_ck");
1080 clk_enable(dpll5_m2_clk);
1081 clk_set_rate(dpll5_m2_clk, DPLL5_FREQ_FOR_USBHOST);
1082
1083 clk_disable(dpll5_m2_clk);
1084 clk_disable(dpll5_clk);
1085 return;
1086}
1087
1088/* REVISIT: Move this init stuff out into clock.c */
1089
1090/*
1091 * Switch the MPU rate if specified on cmdline.
1092 * We cannot do this early until cmdline is parsed.
1093 */
1094static int __init omap2_clk_arch_init(void)
1095{
1096 if (!mpurate)
1097 return -EINVAL;
1098
1099 /* REVISIT: not yet ready for 343x */
1100 if (clk_set_rate(&dpll1_ck, mpurate))
1101 printk(KERN_ERR "*** Unable to set MPU rate\n");
1102
1103 recalculate_root_clocks();
1104
1105 printk(KERN_INFO "Switched to new clocking rate (Crystal/Core/MPU): "
1106 "%ld.%01ld/%ld/%ld MHz\n",
1107 (osc_sys_ck.rate / 1000000), ((osc_sys_ck.rate / 100000) % 10),
1108 (core_ck.rate / 1000000), (arm_fck.rate / 1000000)) ;
1109
1110 calibrate_delay();
1111
1112 return 0;
1113}
1114arch_initcall(omap2_clk_arch_init);
1115
1116int __init omap2_clk_init(void)
1117{
1118 /* struct prcm_config *prcm; */
1119 struct omap_clk *c;
1120 /* u32 clkrate; */
1121 u32 cpu_clkflg;
1122
1123 if (cpu_is_omap34xx()) {
1124 cpu_mask = RATE_IN_343X;
1125 cpu_clkflg = CK_343X;
1126
1127 /*
1128 * Update this if there are further clock changes between ES2
1129 * and production parts
1130 */
1131 if (omap_rev() == OMAP3430_REV_ES1_0) {
1132 /* No 3430ES1-only rates exist, so no RATE_IN_3430ES1 */
1133 cpu_clkflg |= CK_3430ES1;
1134 } else {
1135 cpu_mask |= RATE_IN_3430ES2;
1136 cpu_clkflg |= CK_3430ES2;
1137 }
1138 }
1139
1140 clk_init(&omap2_clk_functions);
1141
1142 for (c = omap34xx_clks; c < omap34xx_clks + ARRAY_SIZE(omap34xx_clks); c++)
1143 clk_preinit(c->lk.clk);
1144
1145 for (c = omap34xx_clks; c < omap34xx_clks + ARRAY_SIZE(omap34xx_clks); c++)
1146 if (c->cpu & cpu_clkflg) {
1147 clkdev_add(&c->lk);
1148 clk_register(c->lk.clk);
1149 omap2_init_clk_clkdm(c->lk.clk);
1150 }
1151
1152 /* REVISIT: Not yet ready for OMAP3 */
1153#if 0
1154 /* Check the MPU rate set by bootloader */
1155 clkrate = omap2_get_dpll_rate_24xx(&dpll_ck);
1156 for (prcm = rate_table; prcm->mpu_speed; prcm++) {
1157 if (!(prcm->flags & cpu_mask))
1158 continue;
1159 if (prcm->xtal_speed != sys_ck.rate)
1160 continue;
1161 if (prcm->dpll_speed <= clkrate)
1162 break;
1163 }
1164 curr_prcm_set = prcm;
1165#endif
1166
1167 recalculate_root_clocks();
1168
1169 printk(KERN_INFO "Clocking rate (Crystal/Core/MPU): "
1170 "%ld.%01ld/%ld/%ld MHz\n",
1171 (osc_sys_ck.rate / 1000000), (osc_sys_ck.rate / 100000) % 10,
1172 (core_ck.rate / 1000000), (arm_fck.rate / 1000000));
1173
1174 /*
1175 * Only enable those clocks we will need, let the drivers
1176 * enable other clocks as necessary
1177 */
1178 clk_enable_init_clocks();
1179
1180 /*
1181 * Lock DPLL5 and put it in autoidle.
1182 */
1183 if (omap_rev() >= OMAP3430_REV_ES2_0)
1184 omap3_clk_lock_dpll5();
1185
1186 /* Avoid sleeping during omap2_clk_prepare_for_reboot() */
1187 /* REVISIT: not yet ready for 343x */
1188#if 0
1189 vclk = clk_get(NULL, "virt_prcm_set");
1190 sclk = clk_get(NULL, "sys_ck");
1191#endif
1192 return 0;
1193}
1194
1195#endif
diff --git a/arch/arm/mach-omap2/clock34xx.h b/arch/arm/mach-omap2/clock34xx.h
index 9565c05bebd2..628e8de57680 100644
--- a/arch/arm/mach-omap2/clock34xx.h
+++ b/arch/arm/mach-omap2/clock34xx.h
@@ -1,2993 +1,15 @@
1/* 1/*
2 * OMAP3 clock framework 2 * OMAP34xx clock function prototypes and macros
3 * 3 *
4 * Copyright (C) 2007-2008 Texas Instruments, Inc. 4 * Copyright (C) 2007-2010 Texas Instruments, Inc.
5 * Copyright (C) 2007-2008 Nokia Corporation 5 * Copyright (C) 2007-2010 Nokia Corporation
6 *
7 * Written by Paul Walmsley
8 * With many device clock fixes by Kevin Hilman and Jouni Högander
9 * DPLL bypass clock support added by Roman Tereshonkov
10 *
11 */
12
13/*
14 * Virtual clocks are introduced as convenient tools.
15 * They are sources for other clocks and not supposed
16 * to be requested from drivers directly.
17 */ 6 */
18 7
19#ifndef __ARCH_ARM_MACH_OMAP2_CLOCK34XX_H 8#ifndef __ARCH_ARM_MACH_OMAP2_CLOCK34XX_H
20#define __ARCH_ARM_MACH_OMAP2_CLOCK34XX_H 9#define __ARCH_ARM_MACH_OMAP2_CLOCK34XX_H
21 10
22#include <mach/control.h> 11extern const struct clkops clkops_omap3430es2_ssi_wait;
23 12extern const struct clkops clkops_omap3430es2_hsotgusb_wait;
24#include "clock.h" 13extern const struct clkops clkops_omap3430es2_dss_usbhost_wait;
25#include "cm.h"
26#include "cm-regbits-34xx.h"
27#include "prm.h"
28#include "prm-regbits-34xx.h"
29
30#define OMAP_CM_REGADDR OMAP34XX_CM_REGADDR
31
32static unsigned long omap3_dpll_recalc(struct clk *clk);
33static unsigned long omap3_clkoutx2_recalc(struct clk *clk);
34static void omap3_dpll_allow_idle(struct clk *clk);
35static void omap3_dpll_deny_idle(struct clk *clk);
36static u32 omap3_dpll_autoidle_read(struct clk *clk);
37static int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate);
38static int omap3_dpll4_set_rate(struct clk *clk, unsigned long rate);
39static int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate);
40
41/* Maximum DPLL multiplier, divider values for OMAP3 */
42#define OMAP3_MAX_DPLL_MULT 2048
43#define OMAP3_MAX_DPLL_DIV 128
44
45/*
46 * DPLL1 supplies clock to the MPU.
47 * DPLL2 supplies clock to the IVA2.
48 * DPLL3 supplies CORE domain clocks.
49 * DPLL4 supplies peripheral clocks.
50 * DPLL5 supplies other peripheral clocks (USBHOST, USIM).
51 */
52
53/* Forward declarations for DPLL bypass clocks */
54static struct clk dpll1_fck;
55static struct clk dpll2_fck;
56
57/* CM_CLKEN_PLL*.EN* bit values - not all are available for every DPLL */
58#define DPLL_LOW_POWER_STOP 0x1
59#define DPLL_LOW_POWER_BYPASS 0x5
60#define DPLL_LOCKED 0x7
61
62/* PRM CLOCKS */
63
64/* According to timer32k.c, this is a 32768Hz clock, not a 32000Hz clock. */
65static struct clk omap_32k_fck = {
66 .name = "omap_32k_fck",
67 .ops = &clkops_null,
68 .rate = 32768,
69 .flags = RATE_FIXED,
70};
71
72static struct clk secure_32k_fck = {
73 .name = "secure_32k_fck",
74 .ops = &clkops_null,
75 .rate = 32768,
76 .flags = RATE_FIXED,
77};
78
79/* Virtual source clocks for osc_sys_ck */
80static struct clk virt_12m_ck = {
81 .name = "virt_12m_ck",
82 .ops = &clkops_null,
83 .rate = 12000000,
84 .flags = RATE_FIXED,
85};
86
87static struct clk virt_13m_ck = {
88 .name = "virt_13m_ck",
89 .ops = &clkops_null,
90 .rate = 13000000,
91 .flags = RATE_FIXED,
92};
93
94static struct clk virt_16_8m_ck = {
95 .name = "virt_16_8m_ck",
96 .ops = &clkops_null,
97 .rate = 16800000,
98 .flags = RATE_FIXED,
99};
100
101static struct clk virt_19_2m_ck = {
102 .name = "virt_19_2m_ck",
103 .ops = &clkops_null,
104 .rate = 19200000,
105 .flags = RATE_FIXED,
106};
107
108static struct clk virt_26m_ck = {
109 .name = "virt_26m_ck",
110 .ops = &clkops_null,
111 .rate = 26000000,
112 .flags = RATE_FIXED,
113};
114
115static struct clk virt_38_4m_ck = {
116 .name = "virt_38_4m_ck",
117 .ops = &clkops_null,
118 .rate = 38400000,
119 .flags = RATE_FIXED,
120};
121
122static const struct clksel_rate osc_sys_12m_rates[] = {
123 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
124 { .div = 0 }
125};
126
127static const struct clksel_rate osc_sys_13m_rates[] = {
128 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
129 { .div = 0 }
130};
131
132static const struct clksel_rate osc_sys_16_8m_rates[] = {
133 { .div = 1, .val = 5, .flags = RATE_IN_3430ES2 | DEFAULT_RATE },
134 { .div = 0 }
135};
136
137static const struct clksel_rate osc_sys_19_2m_rates[] = {
138 { .div = 1, .val = 2, .flags = RATE_IN_343X | DEFAULT_RATE },
139 { .div = 0 }
140};
141
142static const struct clksel_rate osc_sys_26m_rates[] = {
143 { .div = 1, .val = 3, .flags = RATE_IN_343X | DEFAULT_RATE },
144 { .div = 0 }
145};
146
147static const struct clksel_rate osc_sys_38_4m_rates[] = {
148 { .div = 1, .val = 4, .flags = RATE_IN_343X | DEFAULT_RATE },
149 { .div = 0 }
150};
151
152static const struct clksel osc_sys_clksel[] = {
153 { .parent = &virt_12m_ck, .rates = osc_sys_12m_rates },
154 { .parent = &virt_13m_ck, .rates = osc_sys_13m_rates },
155 { .parent = &virt_16_8m_ck, .rates = osc_sys_16_8m_rates },
156 { .parent = &virt_19_2m_ck, .rates = osc_sys_19_2m_rates },
157 { .parent = &virt_26m_ck, .rates = osc_sys_26m_rates },
158 { .parent = &virt_38_4m_ck, .rates = osc_sys_38_4m_rates },
159 { .parent = NULL },
160};
161
162/* Oscillator clock */
163/* 12, 13, 16.8, 19.2, 26, or 38.4 MHz */
164static struct clk osc_sys_ck = {
165 .name = "osc_sys_ck",
166 .ops = &clkops_null,
167 .init = &omap2_init_clksel_parent,
168 .clksel_reg = OMAP3430_PRM_CLKSEL,
169 .clksel_mask = OMAP3430_SYS_CLKIN_SEL_MASK,
170 .clksel = osc_sys_clksel,
171 /* REVISIT: deal with autoextclkmode? */
172 .flags = RATE_FIXED,
173 .recalc = &omap2_clksel_recalc,
174};
175
176static const struct clksel_rate div2_rates[] = {
177 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
178 { .div = 2, .val = 2, .flags = RATE_IN_343X },
179 { .div = 0 }
180};
181
182static const struct clksel sys_clksel[] = {
183 { .parent = &osc_sys_ck, .rates = div2_rates },
184 { .parent = NULL }
185};
186
187/* Latency: this clock is only enabled after PRM_CLKSETUP.SETUP_TIME */
188/* Feeds DPLLs - divided first by PRM_CLKSRC_CTRL.SYSCLKDIV? */
189static struct clk sys_ck = {
190 .name = "sys_ck",
191 .ops = &clkops_null,
192 .parent = &osc_sys_ck,
193 .init = &omap2_init_clksel_parent,
194 .clksel_reg = OMAP3430_PRM_CLKSRC_CTRL,
195 .clksel_mask = OMAP_SYSCLKDIV_MASK,
196 .clksel = sys_clksel,
197 .recalc = &omap2_clksel_recalc,
198};
199
200static struct clk sys_altclk = {
201 .name = "sys_altclk",
202 .ops = &clkops_null,
203};
204
205/* Optional external clock input for some McBSPs */
206static struct clk mcbsp_clks = {
207 .name = "mcbsp_clks",
208 .ops = &clkops_null,
209};
210
211/* PRM EXTERNAL CLOCK OUTPUT */
212
213static struct clk sys_clkout1 = {
214 .name = "sys_clkout1",
215 .ops = &clkops_omap2_dflt,
216 .parent = &osc_sys_ck,
217 .enable_reg = OMAP3430_PRM_CLKOUT_CTRL,
218 .enable_bit = OMAP3430_CLKOUT_EN_SHIFT,
219 .recalc = &followparent_recalc,
220};
221
222/* DPLLS */
223
224/* CM CLOCKS */
225
226static const struct clksel_rate div16_dpll_rates[] = {
227 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
228 { .div = 2, .val = 2, .flags = RATE_IN_343X },
229 { .div = 3, .val = 3, .flags = RATE_IN_343X },
230 { .div = 4, .val = 4, .flags = RATE_IN_343X },
231 { .div = 5, .val = 5, .flags = RATE_IN_343X },
232 { .div = 6, .val = 6, .flags = RATE_IN_343X },
233 { .div = 7, .val = 7, .flags = RATE_IN_343X },
234 { .div = 8, .val = 8, .flags = RATE_IN_343X },
235 { .div = 9, .val = 9, .flags = RATE_IN_343X },
236 { .div = 10, .val = 10, .flags = RATE_IN_343X },
237 { .div = 11, .val = 11, .flags = RATE_IN_343X },
238 { .div = 12, .val = 12, .flags = RATE_IN_343X },
239 { .div = 13, .val = 13, .flags = RATE_IN_343X },
240 { .div = 14, .val = 14, .flags = RATE_IN_343X },
241 { .div = 15, .val = 15, .flags = RATE_IN_343X },
242 { .div = 16, .val = 16, .flags = RATE_IN_343X },
243 { .div = 0 }
244};
245
246/* DPLL1 */
247/* MPU clock source */
248/* Type: DPLL */
249static struct dpll_data dpll1_dd = {
250 .mult_div1_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL),
251 .mult_mask = OMAP3430_MPU_DPLL_MULT_MASK,
252 .div1_mask = OMAP3430_MPU_DPLL_DIV_MASK,
253 .clk_bypass = &dpll1_fck,
254 .clk_ref = &sys_ck,
255 .freqsel_mask = OMAP3430_MPU_DPLL_FREQSEL_MASK,
256 .control_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKEN_PLL),
257 .enable_mask = OMAP3430_EN_MPU_DPLL_MASK,
258 .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
259 .auto_recal_bit = OMAP3430_EN_MPU_DPLL_DRIFTGUARD_SHIFT,
260 .recal_en_bit = OMAP3430_MPU_DPLL_RECAL_EN_SHIFT,
261 .recal_st_bit = OMAP3430_MPU_DPLL_ST_SHIFT,
262 .autoidle_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_AUTOIDLE_PLL),
263 .autoidle_mask = OMAP3430_AUTO_MPU_DPLL_MASK,
264 .idlest_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_IDLEST_PLL),
265 .idlest_mask = OMAP3430_ST_MPU_CLK_MASK,
266 .max_multiplier = OMAP3_MAX_DPLL_MULT,
267 .min_divider = 1,
268 .max_divider = OMAP3_MAX_DPLL_DIV,
269 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE
270};
271
272static struct clk dpll1_ck = {
273 .name = "dpll1_ck",
274 .ops = &clkops_null,
275 .parent = &sys_ck,
276 .dpll_data = &dpll1_dd,
277 .round_rate = &omap2_dpll_round_rate,
278 .set_rate = &omap3_noncore_dpll_set_rate,
279 .clkdm_name = "dpll1_clkdm",
280 .recalc = &omap3_dpll_recalc,
281};
282
283/*
284 * This virtual clock provides the CLKOUTX2 output from the DPLL if the
285 * DPLL isn't bypassed.
286 */
287static struct clk dpll1_x2_ck = {
288 .name = "dpll1_x2_ck",
289 .ops = &clkops_null,
290 .parent = &dpll1_ck,
291 .clkdm_name = "dpll1_clkdm",
292 .recalc = &omap3_clkoutx2_recalc,
293};
294
295/* On DPLL1, unlike other DPLLs, the divider is downstream from CLKOUTX2 */
296static const struct clksel div16_dpll1_x2m2_clksel[] = {
297 { .parent = &dpll1_x2_ck, .rates = div16_dpll_rates },
298 { .parent = NULL }
299};
300
301/*
302 * Does not exist in the TRM - needed to separate the M2 divider from
303 * bypass selection in mpu_ck
304 */
305static struct clk dpll1_x2m2_ck = {
306 .name = "dpll1_x2m2_ck",
307 .ops = &clkops_null,
308 .parent = &dpll1_x2_ck,
309 .init = &omap2_init_clksel_parent,
310 .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL2_PLL),
311 .clksel_mask = OMAP3430_MPU_DPLL_CLKOUT_DIV_MASK,
312 .clksel = div16_dpll1_x2m2_clksel,
313 .clkdm_name = "dpll1_clkdm",
314 .recalc = &omap2_clksel_recalc,
315};
316
317/* DPLL2 */
318/* IVA2 clock source */
319/* Type: DPLL */
320
321static struct dpll_data dpll2_dd = {
322 .mult_div1_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSEL1_PLL),
323 .mult_mask = OMAP3430_IVA2_DPLL_MULT_MASK,
324 .div1_mask = OMAP3430_IVA2_DPLL_DIV_MASK,
325 .clk_bypass = &dpll2_fck,
326 .clk_ref = &sys_ck,
327 .freqsel_mask = OMAP3430_IVA2_DPLL_FREQSEL_MASK,
328 .control_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKEN_PLL),
329 .enable_mask = OMAP3430_EN_IVA2_DPLL_MASK,
330 .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED) |
331 (1 << DPLL_LOW_POWER_BYPASS),
332 .auto_recal_bit = OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_SHIFT,
333 .recal_en_bit = OMAP3430_PRM_IRQENABLE_MPU_IVA2_DPLL_RECAL_EN_SHIFT,
334 .recal_st_bit = OMAP3430_PRM_IRQSTATUS_MPU_IVA2_DPLL_ST_SHIFT,
335 .autoidle_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_AUTOIDLE_PLL),
336 .autoidle_mask = OMAP3430_AUTO_IVA2_DPLL_MASK,
337 .idlest_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_IDLEST_PLL),
338 .idlest_mask = OMAP3430_ST_IVA2_CLK_MASK,
339 .max_multiplier = OMAP3_MAX_DPLL_MULT,
340 .min_divider = 1,
341 .max_divider = OMAP3_MAX_DPLL_DIV,
342 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE
343};
344
345static struct clk dpll2_ck = {
346 .name = "dpll2_ck",
347 .ops = &clkops_noncore_dpll_ops,
348 .parent = &sys_ck,
349 .dpll_data = &dpll2_dd,
350 .round_rate = &omap2_dpll_round_rate,
351 .set_rate = &omap3_noncore_dpll_set_rate,
352 .clkdm_name = "dpll2_clkdm",
353 .recalc = &omap3_dpll_recalc,
354};
355
356static const struct clksel div16_dpll2_m2x2_clksel[] = {
357 { .parent = &dpll2_ck, .rates = div16_dpll_rates },
358 { .parent = NULL }
359};
360
361/*
362 * The TRM is conflicted on whether IVA2 clock comes from DPLL2 CLKOUT
363 * or CLKOUTX2. CLKOUT seems most plausible.
364 */
365static struct clk dpll2_m2_ck = {
366 .name = "dpll2_m2_ck",
367 .ops = &clkops_null,
368 .parent = &dpll2_ck,
369 .init = &omap2_init_clksel_parent,
370 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD,
371 OMAP3430_CM_CLKSEL2_PLL),
372 .clksel_mask = OMAP3430_IVA2_DPLL_CLKOUT_DIV_MASK,
373 .clksel = div16_dpll2_m2x2_clksel,
374 .clkdm_name = "dpll2_clkdm",
375 .recalc = &omap2_clksel_recalc,
376};
377
378/*
379 * DPLL3
380 * Source clock for all interfaces and for some device fclks
381 * REVISIT: Also supports fast relock bypass - not included below
382 */
383static struct dpll_data dpll3_dd = {
384 .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
385 .mult_mask = OMAP3430_CORE_DPLL_MULT_MASK,
386 .div1_mask = OMAP3430_CORE_DPLL_DIV_MASK,
387 .clk_bypass = &sys_ck,
388 .clk_ref = &sys_ck,
389 .freqsel_mask = OMAP3430_CORE_DPLL_FREQSEL_MASK,
390 .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
391 .enable_mask = OMAP3430_EN_CORE_DPLL_MASK,
392 .auto_recal_bit = OMAP3430_EN_CORE_DPLL_DRIFTGUARD_SHIFT,
393 .recal_en_bit = OMAP3430_CORE_DPLL_RECAL_EN_SHIFT,
394 .recal_st_bit = OMAP3430_CORE_DPLL_ST_SHIFT,
395 .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, CM_AUTOIDLE),
396 .autoidle_mask = OMAP3430_AUTO_CORE_DPLL_MASK,
397 .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST),
398 .idlest_mask = OMAP3430_ST_CORE_CLK_MASK,
399 .max_multiplier = OMAP3_MAX_DPLL_MULT,
400 .min_divider = 1,
401 .max_divider = OMAP3_MAX_DPLL_DIV,
402 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE
403};
404
405static struct clk dpll3_ck = {
406 .name = "dpll3_ck",
407 .ops = &clkops_null,
408 .parent = &sys_ck,
409 .dpll_data = &dpll3_dd,
410 .round_rate = &omap2_dpll_round_rate,
411 .clkdm_name = "dpll3_clkdm",
412 .recalc = &omap3_dpll_recalc,
413};
414
415/*
416 * This virtual clock provides the CLKOUTX2 output from the DPLL if the
417 * DPLL isn't bypassed
418 */
419static struct clk dpll3_x2_ck = {
420 .name = "dpll3_x2_ck",
421 .ops = &clkops_null,
422 .parent = &dpll3_ck,
423 .clkdm_name = "dpll3_clkdm",
424 .recalc = &omap3_clkoutx2_recalc,
425};
426
427static const struct clksel_rate div31_dpll3_rates[] = {
428 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
429 { .div = 2, .val = 2, .flags = RATE_IN_343X },
430 { .div = 3, .val = 3, .flags = RATE_IN_3430ES2 },
431 { .div = 4, .val = 4, .flags = RATE_IN_3430ES2 },
432 { .div = 5, .val = 5, .flags = RATE_IN_3430ES2 },
433 { .div = 6, .val = 6, .flags = RATE_IN_3430ES2 },
434 { .div = 7, .val = 7, .flags = RATE_IN_3430ES2 },
435 { .div = 8, .val = 8, .flags = RATE_IN_3430ES2 },
436 { .div = 9, .val = 9, .flags = RATE_IN_3430ES2 },
437 { .div = 10, .val = 10, .flags = RATE_IN_3430ES2 },
438 { .div = 11, .val = 11, .flags = RATE_IN_3430ES2 },
439 { .div = 12, .val = 12, .flags = RATE_IN_3430ES2 },
440 { .div = 13, .val = 13, .flags = RATE_IN_3430ES2 },
441 { .div = 14, .val = 14, .flags = RATE_IN_3430ES2 },
442 { .div = 15, .val = 15, .flags = RATE_IN_3430ES2 },
443 { .div = 16, .val = 16, .flags = RATE_IN_3430ES2 },
444 { .div = 17, .val = 17, .flags = RATE_IN_3430ES2 },
445 { .div = 18, .val = 18, .flags = RATE_IN_3430ES2 },
446 { .div = 19, .val = 19, .flags = RATE_IN_3430ES2 },
447 { .div = 20, .val = 20, .flags = RATE_IN_3430ES2 },
448 { .div = 21, .val = 21, .flags = RATE_IN_3430ES2 },
449 { .div = 22, .val = 22, .flags = RATE_IN_3430ES2 },
450 { .div = 23, .val = 23, .flags = RATE_IN_3430ES2 },
451 { .div = 24, .val = 24, .flags = RATE_IN_3430ES2 },
452 { .div = 25, .val = 25, .flags = RATE_IN_3430ES2 },
453 { .div = 26, .val = 26, .flags = RATE_IN_3430ES2 },
454 { .div = 27, .val = 27, .flags = RATE_IN_3430ES2 },
455 { .div = 28, .val = 28, .flags = RATE_IN_3430ES2 },
456 { .div = 29, .val = 29, .flags = RATE_IN_3430ES2 },
457 { .div = 30, .val = 30, .flags = RATE_IN_3430ES2 },
458 { .div = 31, .val = 31, .flags = RATE_IN_3430ES2 },
459 { .div = 0 },
460};
461
462static const struct clksel div31_dpll3m2_clksel[] = {
463 { .parent = &dpll3_ck, .rates = div31_dpll3_rates },
464 { .parent = NULL }
465};
466
467/* DPLL3 output M2 - primary control point for CORE speed */
468static struct clk dpll3_m2_ck = {
469 .name = "dpll3_m2_ck",
470 .ops = &clkops_null,
471 .parent = &dpll3_ck,
472 .init = &omap2_init_clksel_parent,
473 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
474 .clksel_mask = OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK,
475 .clksel = div31_dpll3m2_clksel,
476 .clkdm_name = "dpll3_clkdm",
477 .round_rate = &omap2_clksel_round_rate,
478 .set_rate = &omap3_core_dpll_m2_set_rate,
479 .recalc = &omap2_clksel_recalc,
480};
481
482static struct clk core_ck = {
483 .name = "core_ck",
484 .ops = &clkops_null,
485 .parent = &dpll3_m2_ck,
486 .recalc = &followparent_recalc,
487};
488
489static struct clk dpll3_m2x2_ck = {
490 .name = "dpll3_m2x2_ck",
491 .ops = &clkops_null,
492 .parent = &dpll3_m2_ck,
493 .clkdm_name = "dpll3_clkdm",
494 .recalc = &omap3_clkoutx2_recalc,
495};
496
497/* The PWRDN bit is apparently only available on 3430ES2 and above */
498static const struct clksel div16_dpll3_clksel[] = {
499 { .parent = &dpll3_ck, .rates = div16_dpll_rates },
500 { .parent = NULL }
501};
502
503/* This virtual clock is the source for dpll3_m3x2_ck */
504static struct clk dpll3_m3_ck = {
505 .name = "dpll3_m3_ck",
506 .ops = &clkops_null,
507 .parent = &dpll3_ck,
508 .init = &omap2_init_clksel_parent,
509 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
510 .clksel_mask = OMAP3430_DIV_DPLL3_MASK,
511 .clksel = div16_dpll3_clksel,
512 .clkdm_name = "dpll3_clkdm",
513 .recalc = &omap2_clksel_recalc,
514};
515
516/* The PWRDN bit is apparently only available on 3430ES2 and above */
517static struct clk dpll3_m3x2_ck = {
518 .name = "dpll3_m3x2_ck",
519 .ops = &clkops_omap2_dflt_wait,
520 .parent = &dpll3_m3_ck,
521 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
522 .enable_bit = OMAP3430_PWRDN_EMU_CORE_SHIFT,
523 .flags = INVERT_ENABLE,
524 .clkdm_name = "dpll3_clkdm",
525 .recalc = &omap3_clkoutx2_recalc,
526};
527
528static struct clk emu_core_alwon_ck = {
529 .name = "emu_core_alwon_ck",
530 .ops = &clkops_null,
531 .parent = &dpll3_m3x2_ck,
532 .clkdm_name = "dpll3_clkdm",
533 .recalc = &followparent_recalc,
534};
535
536/* DPLL4 */
537/* Supplies 96MHz, 54Mhz TV DAC, DSS fclk, CAM sensor clock, emul trace clk */
538/* Type: DPLL */
539static struct dpll_data dpll4_dd = {
540 .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL2),
541 .mult_mask = OMAP3430_PERIPH_DPLL_MULT_MASK,
542 .div1_mask = OMAP3430_PERIPH_DPLL_DIV_MASK,
543 .clk_bypass = &sys_ck,
544 .clk_ref = &sys_ck,
545 .freqsel_mask = OMAP3430_PERIPH_DPLL_FREQSEL_MASK,
546 .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
547 .enable_mask = OMAP3430_EN_PERIPH_DPLL_MASK,
548 .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED),
549 .auto_recal_bit = OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_SHIFT,
550 .recal_en_bit = OMAP3430_PERIPH_DPLL_RECAL_EN_SHIFT,
551 .recal_st_bit = OMAP3430_PERIPH_DPLL_ST_SHIFT,
552 .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, CM_AUTOIDLE),
553 .autoidle_mask = OMAP3430_AUTO_PERIPH_DPLL_MASK,
554 .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST),
555 .idlest_mask = OMAP3430_ST_PERIPH_CLK_MASK,
556 .max_multiplier = OMAP3_MAX_DPLL_MULT,
557 .min_divider = 1,
558 .max_divider = OMAP3_MAX_DPLL_DIV,
559 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE
560};
561
562static struct clk dpll4_ck = {
563 .name = "dpll4_ck",
564 .ops = &clkops_noncore_dpll_ops,
565 .parent = &sys_ck,
566 .dpll_data = &dpll4_dd,
567 .round_rate = &omap2_dpll_round_rate,
568 .set_rate = &omap3_dpll4_set_rate,
569 .clkdm_name = "dpll4_clkdm",
570 .recalc = &omap3_dpll_recalc,
571};
572
573/*
574 * This virtual clock provides the CLKOUTX2 output from the DPLL if the
575 * DPLL isn't bypassed --
576 * XXX does this serve any downstream clocks?
577 */
578static struct clk dpll4_x2_ck = {
579 .name = "dpll4_x2_ck",
580 .ops = &clkops_null,
581 .parent = &dpll4_ck,
582 .clkdm_name = "dpll4_clkdm",
583 .recalc = &omap3_clkoutx2_recalc,
584};
585
586static const struct clksel div16_dpll4_clksel[] = {
587 { .parent = &dpll4_ck, .rates = div16_dpll_rates },
588 { .parent = NULL }
589};
590
591/* This virtual clock is the source for dpll4_m2x2_ck */
592static struct clk dpll4_m2_ck = {
593 .name = "dpll4_m2_ck",
594 .ops = &clkops_null,
595 .parent = &dpll4_ck,
596 .init = &omap2_init_clksel_parent,
597 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430_CM_CLKSEL3),
598 .clksel_mask = OMAP3430_DIV_96M_MASK,
599 .clksel = div16_dpll4_clksel,
600 .clkdm_name = "dpll4_clkdm",
601 .recalc = &omap2_clksel_recalc,
602};
603
604/* The PWRDN bit is apparently only available on 3430ES2 and above */
605static struct clk dpll4_m2x2_ck = {
606 .name = "dpll4_m2x2_ck",
607 .ops = &clkops_omap2_dflt_wait,
608 .parent = &dpll4_m2_ck,
609 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
610 .enable_bit = OMAP3430_PWRDN_96M_SHIFT,
611 .flags = INVERT_ENABLE,
612 .clkdm_name = "dpll4_clkdm",
613 .recalc = &omap3_clkoutx2_recalc,
614};
615
616/*
617 * DPLL4 generates DPLL4_M2X2_CLK which is then routed into the PRM as
618 * PRM_96M_ALWON_(F)CLK. Two clocks then emerge from the PRM:
619 * 96M_ALWON_FCLK (called "omap_96m_alwon_fck" below) and
620 * CM_96K_(F)CLK.
621 */
622static struct clk omap_96m_alwon_fck = {
623 .name = "omap_96m_alwon_fck",
624 .ops = &clkops_null,
625 .parent = &dpll4_m2x2_ck,
626 .recalc = &followparent_recalc,
627};
628
629static struct clk cm_96m_fck = {
630 .name = "cm_96m_fck",
631 .ops = &clkops_null,
632 .parent = &omap_96m_alwon_fck,
633 .recalc = &followparent_recalc,
634};
635
636static const struct clksel_rate omap_96m_dpll_rates[] = {
637 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
638 { .div = 0 }
639};
640
641static const struct clksel_rate omap_96m_sys_rates[] = {
642 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
643 { .div = 0 }
644};
645
646static const struct clksel omap_96m_fck_clksel[] = {
647 { .parent = &cm_96m_fck, .rates = omap_96m_dpll_rates },
648 { .parent = &sys_ck, .rates = omap_96m_sys_rates },
649 { .parent = NULL }
650};
651
652static struct clk omap_96m_fck = {
653 .name = "omap_96m_fck",
654 .ops = &clkops_null,
655 .parent = &sys_ck,
656 .init = &omap2_init_clksel_parent,
657 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
658 .clksel_mask = OMAP3430_SOURCE_96M_MASK,
659 .clksel = omap_96m_fck_clksel,
660 .recalc = &omap2_clksel_recalc,
661};
662
663/* This virtual clock is the source for dpll4_m3x2_ck */
664static struct clk dpll4_m3_ck = {
665 .name = "dpll4_m3_ck",
666 .ops = &clkops_null,
667 .parent = &dpll4_ck,
668 .init = &omap2_init_clksel_parent,
669 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL),
670 .clksel_mask = OMAP3430_CLKSEL_TV_MASK,
671 .clksel = div16_dpll4_clksel,
672 .clkdm_name = "dpll4_clkdm",
673 .recalc = &omap2_clksel_recalc,
674};
675
676/* The PWRDN bit is apparently only available on 3430ES2 and above */
677static struct clk dpll4_m3x2_ck = {
678 .name = "dpll4_m3x2_ck",
679 .ops = &clkops_omap2_dflt_wait,
680 .parent = &dpll4_m3_ck,
681 .init = &omap2_init_clksel_parent,
682 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
683 .enable_bit = OMAP3430_PWRDN_TV_SHIFT,
684 .flags = INVERT_ENABLE,
685 .clkdm_name = "dpll4_clkdm",
686 .recalc = &omap3_clkoutx2_recalc,
687};
688
689static const struct clksel_rate omap_54m_d4m3x2_rates[] = {
690 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
691 { .div = 0 }
692};
693
694static const struct clksel_rate omap_54m_alt_rates[] = {
695 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
696 { .div = 0 }
697};
698
699static const struct clksel omap_54m_clksel[] = {
700 { .parent = &dpll4_m3x2_ck, .rates = omap_54m_d4m3x2_rates },
701 { .parent = &sys_altclk, .rates = omap_54m_alt_rates },
702 { .parent = NULL }
703};
704
705static struct clk omap_54m_fck = {
706 .name = "omap_54m_fck",
707 .ops = &clkops_null,
708 .init = &omap2_init_clksel_parent,
709 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
710 .clksel_mask = OMAP3430_SOURCE_54M_MASK,
711 .clksel = omap_54m_clksel,
712 .recalc = &omap2_clksel_recalc,
713};
714
715static const struct clksel_rate omap_48m_cm96m_rates[] = {
716 { .div = 2, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
717 { .div = 0 }
718};
719
720static const struct clksel_rate omap_48m_alt_rates[] = {
721 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
722 { .div = 0 }
723};
724
725static const struct clksel omap_48m_clksel[] = {
726 { .parent = &cm_96m_fck, .rates = omap_48m_cm96m_rates },
727 { .parent = &sys_altclk, .rates = omap_48m_alt_rates },
728 { .parent = NULL }
729};
730
731static struct clk omap_48m_fck = {
732 .name = "omap_48m_fck",
733 .ops = &clkops_null,
734 .init = &omap2_init_clksel_parent,
735 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
736 .clksel_mask = OMAP3430_SOURCE_48M_MASK,
737 .clksel = omap_48m_clksel,
738 .recalc = &omap2_clksel_recalc,
739};
740
741static struct clk omap_12m_fck = {
742 .name = "omap_12m_fck",
743 .ops = &clkops_null,
744 .parent = &omap_48m_fck,
745 .fixed_div = 4,
746 .recalc = &omap2_fixed_divisor_recalc,
747};
748
749/* This virstual clock is the source for dpll4_m4x2_ck */
750static struct clk dpll4_m4_ck = {
751 .name = "dpll4_m4_ck",
752 .ops = &clkops_null,
753 .parent = &dpll4_ck,
754 .init = &omap2_init_clksel_parent,
755 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL),
756 .clksel_mask = OMAP3430_CLKSEL_DSS1_MASK,
757 .clksel = div16_dpll4_clksel,
758 .clkdm_name = "dpll4_clkdm",
759 .recalc = &omap2_clksel_recalc,
760 .set_rate = &omap2_clksel_set_rate,
761 .round_rate = &omap2_clksel_round_rate,
762};
763
764/* The PWRDN bit is apparently only available on 3430ES2 and above */
765static struct clk dpll4_m4x2_ck = {
766 .name = "dpll4_m4x2_ck",
767 .ops = &clkops_omap2_dflt_wait,
768 .parent = &dpll4_m4_ck,
769 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
770 .enable_bit = OMAP3430_PWRDN_CAM_SHIFT,
771 .flags = INVERT_ENABLE,
772 .clkdm_name = "dpll4_clkdm",
773 .recalc = &omap3_clkoutx2_recalc,
774};
775
776/* This virtual clock is the source for dpll4_m5x2_ck */
777static struct clk dpll4_m5_ck = {
778 .name = "dpll4_m5_ck",
779 .ops = &clkops_null,
780 .parent = &dpll4_ck,
781 .init = &omap2_init_clksel_parent,
782 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_CLKSEL),
783 .clksel_mask = OMAP3430_CLKSEL_CAM_MASK,
784 .clksel = div16_dpll4_clksel,
785 .clkdm_name = "dpll4_clkdm",
786 .recalc = &omap2_clksel_recalc,
787};
788
789/* The PWRDN bit is apparently only available on 3430ES2 and above */
790static struct clk dpll4_m5x2_ck = {
791 .name = "dpll4_m5x2_ck",
792 .ops = &clkops_omap2_dflt_wait,
793 .parent = &dpll4_m5_ck,
794 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
795 .enable_bit = OMAP3430_PWRDN_CAM_SHIFT,
796 .flags = INVERT_ENABLE,
797 .clkdm_name = "dpll4_clkdm",
798 .recalc = &omap3_clkoutx2_recalc,
799};
800
801/* This virtual clock is the source for dpll4_m6x2_ck */
802static struct clk dpll4_m6_ck = {
803 .name = "dpll4_m6_ck",
804 .ops = &clkops_null,
805 .parent = &dpll4_ck,
806 .init = &omap2_init_clksel_parent,
807 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
808 .clksel_mask = OMAP3430_DIV_DPLL4_MASK,
809 .clksel = div16_dpll4_clksel,
810 .clkdm_name = "dpll4_clkdm",
811 .recalc = &omap2_clksel_recalc,
812};
813
814/* The PWRDN bit is apparently only available on 3430ES2 and above */
815static struct clk dpll4_m6x2_ck = {
816 .name = "dpll4_m6x2_ck",
817 .ops = &clkops_omap2_dflt_wait,
818 .parent = &dpll4_m6_ck,
819 .init = &omap2_init_clksel_parent,
820 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
821 .enable_bit = OMAP3430_PWRDN_EMU_PERIPH_SHIFT,
822 .flags = INVERT_ENABLE,
823 .clkdm_name = "dpll4_clkdm",
824 .recalc = &omap3_clkoutx2_recalc,
825};
826
827static struct clk emu_per_alwon_ck = {
828 .name = "emu_per_alwon_ck",
829 .ops = &clkops_null,
830 .parent = &dpll4_m6x2_ck,
831 .clkdm_name = "dpll4_clkdm",
832 .recalc = &followparent_recalc,
833};
834
835/* DPLL5 */
836/* Supplies 120MHz clock, USIM source clock */
837/* Type: DPLL */
838/* 3430ES2 only */
839static struct dpll_data dpll5_dd = {
840 .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKSEL4),
841 .mult_mask = OMAP3430ES2_PERIPH2_DPLL_MULT_MASK,
842 .div1_mask = OMAP3430ES2_PERIPH2_DPLL_DIV_MASK,
843 .clk_bypass = &sys_ck,
844 .clk_ref = &sys_ck,
845 .freqsel_mask = OMAP3430ES2_PERIPH2_DPLL_FREQSEL_MASK,
846 .control_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKEN2),
847 .enable_mask = OMAP3430ES2_EN_PERIPH2_DPLL_MASK,
848 .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED),
849 .auto_recal_bit = OMAP3430ES2_EN_PERIPH2_DPLL_DRIFTGUARD_SHIFT,
850 .recal_en_bit = OMAP3430ES2_SND_PERIPH_DPLL_RECAL_EN_SHIFT,
851 .recal_st_bit = OMAP3430ES2_SND_PERIPH_DPLL_ST_SHIFT,
852 .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_AUTOIDLE2_PLL),
853 .autoidle_mask = OMAP3430ES2_AUTO_PERIPH2_DPLL_MASK,
854 .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST2),
855 .idlest_mask = OMAP3430ES2_ST_PERIPH2_CLK_MASK,
856 .max_multiplier = OMAP3_MAX_DPLL_MULT,
857 .min_divider = 1,
858 .max_divider = OMAP3_MAX_DPLL_DIV,
859 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE
860};
861
862static struct clk dpll5_ck = {
863 .name = "dpll5_ck",
864 .ops = &clkops_noncore_dpll_ops,
865 .parent = &sys_ck,
866 .dpll_data = &dpll5_dd,
867 .round_rate = &omap2_dpll_round_rate,
868 .set_rate = &omap3_noncore_dpll_set_rate,
869 .clkdm_name = "dpll5_clkdm",
870 .recalc = &omap3_dpll_recalc,
871};
872
873static const struct clksel div16_dpll5_clksel[] = {
874 { .parent = &dpll5_ck, .rates = div16_dpll_rates },
875 { .parent = NULL }
876};
877
878static struct clk dpll5_m2_ck = {
879 .name = "dpll5_m2_ck",
880 .ops = &clkops_null,
881 .parent = &dpll5_ck,
882 .init = &omap2_init_clksel_parent,
883 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKSEL5),
884 .clksel_mask = OMAP3430ES2_DIV_120M_MASK,
885 .clksel = div16_dpll5_clksel,
886 .clkdm_name = "dpll5_clkdm",
887 .recalc = &omap2_clksel_recalc,
888};
889
890/* CM EXTERNAL CLOCK OUTPUTS */
891
892static const struct clksel_rate clkout2_src_core_rates[] = {
893 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
894 { .div = 0 }
895};
896
897static const struct clksel_rate clkout2_src_sys_rates[] = {
898 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
899 { .div = 0 }
900};
901
902static const struct clksel_rate clkout2_src_96m_rates[] = {
903 { .div = 1, .val = 2, .flags = RATE_IN_343X | DEFAULT_RATE },
904 { .div = 0 }
905};
906
907static const struct clksel_rate clkout2_src_54m_rates[] = {
908 { .div = 1, .val = 3, .flags = RATE_IN_343X | DEFAULT_RATE },
909 { .div = 0 }
910};
911
912static const struct clksel clkout2_src_clksel[] = {
913 { .parent = &core_ck, .rates = clkout2_src_core_rates },
914 { .parent = &sys_ck, .rates = clkout2_src_sys_rates },
915 { .parent = &cm_96m_fck, .rates = clkout2_src_96m_rates },
916 { .parent = &omap_54m_fck, .rates = clkout2_src_54m_rates },
917 { .parent = NULL }
918};
919
920static struct clk clkout2_src_ck = {
921 .name = "clkout2_src_ck",
922 .ops = &clkops_omap2_dflt,
923 .init = &omap2_init_clksel_parent,
924 .enable_reg = OMAP3430_CM_CLKOUT_CTRL,
925 .enable_bit = OMAP3430_CLKOUT2_EN_SHIFT,
926 .clksel_reg = OMAP3430_CM_CLKOUT_CTRL,
927 .clksel_mask = OMAP3430_CLKOUT2SOURCE_MASK,
928 .clksel = clkout2_src_clksel,
929 .clkdm_name = "core_clkdm",
930 .recalc = &omap2_clksel_recalc,
931};
932
933static const struct clksel_rate sys_clkout2_rates[] = {
934 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
935 { .div = 2, .val = 1, .flags = RATE_IN_343X },
936 { .div = 4, .val = 2, .flags = RATE_IN_343X },
937 { .div = 8, .val = 3, .flags = RATE_IN_343X },
938 { .div = 16, .val = 4, .flags = RATE_IN_343X },
939 { .div = 0 },
940};
941
942static const struct clksel sys_clkout2_clksel[] = {
943 { .parent = &clkout2_src_ck, .rates = sys_clkout2_rates },
944 { .parent = NULL },
945};
946
947static struct clk sys_clkout2 = {
948 .name = "sys_clkout2",
949 .ops = &clkops_null,
950 .init = &omap2_init_clksel_parent,
951 .clksel_reg = OMAP3430_CM_CLKOUT_CTRL,
952 .clksel_mask = OMAP3430_CLKOUT2_DIV_MASK,
953 .clksel = sys_clkout2_clksel,
954 .recalc = &omap2_clksel_recalc,
955};
956
957/* CM OUTPUT CLOCKS */
958
959static struct clk corex2_fck = {
960 .name = "corex2_fck",
961 .ops = &clkops_null,
962 .parent = &dpll3_m2x2_ck,
963 .recalc = &followparent_recalc,
964};
965
966/* DPLL power domain clock controls */
967
968static const struct clksel_rate div4_rates[] = {
969 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
970 { .div = 2, .val = 2, .flags = RATE_IN_343X },
971 { .div = 4, .val = 4, .flags = RATE_IN_343X },
972 { .div = 0 }
973};
974
975static const struct clksel div4_core_clksel[] = {
976 { .parent = &core_ck, .rates = div4_rates },
977 { .parent = NULL }
978};
979
980/*
981 * REVISIT: Are these in DPLL power domain or CM power domain? docs
982 * may be inconsistent here?
983 */
984static struct clk dpll1_fck = {
985 .name = "dpll1_fck",
986 .ops = &clkops_null,
987 .parent = &core_ck,
988 .init = &omap2_init_clksel_parent,
989 .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL),
990 .clksel_mask = OMAP3430_MPU_CLK_SRC_MASK,
991 .clksel = div4_core_clksel,
992 .recalc = &omap2_clksel_recalc,
993};
994
995static struct clk mpu_ck = {
996 .name = "mpu_ck",
997 .ops = &clkops_null,
998 .parent = &dpll1_x2m2_ck,
999 .clkdm_name = "mpu_clkdm",
1000 .recalc = &followparent_recalc,
1001};
1002
1003/* arm_fck is divided by two when DPLL1 locked; otherwise, passthrough mpu_ck */
1004static const struct clksel_rate arm_fck_rates[] = {
1005 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
1006 { .div = 2, .val = 1, .flags = RATE_IN_343X },
1007 { .div = 0 },
1008};
1009
1010static const struct clksel arm_fck_clksel[] = {
1011 { .parent = &mpu_ck, .rates = arm_fck_rates },
1012 { .parent = NULL }
1013};
1014
1015static struct clk arm_fck = {
1016 .name = "arm_fck",
1017 .ops = &clkops_null,
1018 .parent = &mpu_ck,
1019 .init = &omap2_init_clksel_parent,
1020 .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_IDLEST_PLL),
1021 .clksel_mask = OMAP3430_ST_MPU_CLK_MASK,
1022 .clksel = arm_fck_clksel,
1023 .clkdm_name = "mpu_clkdm",
1024 .recalc = &omap2_clksel_recalc,
1025};
1026
1027/* XXX What about neon_clkdm ? */
1028
1029/*
1030 * REVISIT: This clock is never specifically defined in the 3430 TRM,
1031 * although it is referenced - so this is a guess
1032 */
1033static struct clk emu_mpu_alwon_ck = {
1034 .name = "emu_mpu_alwon_ck",
1035 .ops = &clkops_null,
1036 .parent = &mpu_ck,
1037 .recalc = &followparent_recalc,
1038};
1039
1040static struct clk dpll2_fck = {
1041 .name = "dpll2_fck",
1042 .ops = &clkops_null,
1043 .parent = &core_ck,
1044 .init = &omap2_init_clksel_parent,
1045 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSEL1_PLL),
1046 .clksel_mask = OMAP3430_IVA2_CLK_SRC_MASK,
1047 .clksel = div4_core_clksel,
1048 .recalc = &omap2_clksel_recalc,
1049};
1050
1051static struct clk iva2_ck = {
1052 .name = "iva2_ck",
1053 .ops = &clkops_omap2_dflt_wait,
1054 .parent = &dpll2_m2_ck,
1055 .init = &omap2_init_clksel_parent,
1056 .enable_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, CM_FCLKEN),
1057 .enable_bit = OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT,
1058 .clkdm_name = "iva2_clkdm",
1059 .recalc = &followparent_recalc,
1060};
1061
1062/* Common interface clocks */
1063
1064static const struct clksel div2_core_clksel[] = {
1065 { .parent = &core_ck, .rates = div2_rates },
1066 { .parent = NULL }
1067};
1068
1069static struct clk l3_ick = {
1070 .name = "l3_ick",
1071 .ops = &clkops_null,
1072 .parent = &core_ck,
1073 .init = &omap2_init_clksel_parent,
1074 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1075 .clksel_mask = OMAP3430_CLKSEL_L3_MASK,
1076 .clksel = div2_core_clksel,
1077 .clkdm_name = "core_l3_clkdm",
1078 .recalc = &omap2_clksel_recalc,
1079};
1080
1081static const struct clksel div2_l3_clksel[] = {
1082 { .parent = &l3_ick, .rates = div2_rates },
1083 { .parent = NULL }
1084};
1085
1086static struct clk l4_ick = {
1087 .name = "l4_ick",
1088 .ops = &clkops_null,
1089 .parent = &l3_ick,
1090 .init = &omap2_init_clksel_parent,
1091 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1092 .clksel_mask = OMAP3430_CLKSEL_L4_MASK,
1093 .clksel = div2_l3_clksel,
1094 .clkdm_name = "core_l4_clkdm",
1095 .recalc = &omap2_clksel_recalc,
1096
1097};
1098
1099static const struct clksel div2_l4_clksel[] = {
1100 { .parent = &l4_ick, .rates = div2_rates },
1101 { .parent = NULL }
1102};
1103
1104static struct clk rm_ick = {
1105 .name = "rm_ick",
1106 .ops = &clkops_null,
1107 .parent = &l4_ick,
1108 .init = &omap2_init_clksel_parent,
1109 .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL),
1110 .clksel_mask = OMAP3430_CLKSEL_RM_MASK,
1111 .clksel = div2_l4_clksel,
1112 .recalc = &omap2_clksel_recalc,
1113};
1114
1115/* GFX power domain */
1116
1117/* GFX clocks are in 3430ES1 only. 3430ES2 and later uses the SGX instead */
1118
1119static const struct clksel gfx_l3_clksel[] = {
1120 { .parent = &l3_ick, .rates = gfx_l3_rates },
1121 { .parent = NULL }
1122};
1123
1124/* Virtual parent clock for gfx_l3_ick and gfx_l3_fck */
1125static struct clk gfx_l3_ck = {
1126 .name = "gfx_l3_ck",
1127 .ops = &clkops_omap2_dflt_wait,
1128 .parent = &l3_ick,
1129 .init = &omap2_init_clksel_parent,
1130 .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_ICLKEN),
1131 .enable_bit = OMAP_EN_GFX_SHIFT,
1132 .recalc = &followparent_recalc,
1133};
1134
1135static struct clk gfx_l3_fck = {
1136 .name = "gfx_l3_fck",
1137 .ops = &clkops_null,
1138 .parent = &gfx_l3_ck,
1139 .init = &omap2_init_clksel_parent,
1140 .clksel_reg = OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),
1141 .clksel_mask = OMAP_CLKSEL_GFX_MASK,
1142 .clksel = gfx_l3_clksel,
1143 .clkdm_name = "gfx_3430es1_clkdm",
1144 .recalc = &omap2_clksel_recalc,
1145};
1146
1147static struct clk gfx_l3_ick = {
1148 .name = "gfx_l3_ick",
1149 .ops = &clkops_null,
1150 .parent = &gfx_l3_ck,
1151 .clkdm_name = "gfx_3430es1_clkdm",
1152 .recalc = &followparent_recalc,
1153};
1154
1155static struct clk gfx_cg1_ck = {
1156 .name = "gfx_cg1_ck",
1157 .ops = &clkops_omap2_dflt_wait,
1158 .parent = &gfx_l3_fck, /* REVISIT: correct? */
1159 .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
1160 .enable_bit = OMAP3430ES1_EN_2D_SHIFT,
1161 .clkdm_name = "gfx_3430es1_clkdm",
1162 .recalc = &followparent_recalc,
1163};
1164
1165static struct clk gfx_cg2_ck = {
1166 .name = "gfx_cg2_ck",
1167 .ops = &clkops_omap2_dflt_wait,
1168 .parent = &gfx_l3_fck, /* REVISIT: correct? */
1169 .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
1170 .enable_bit = OMAP3430ES1_EN_3D_SHIFT,
1171 .clkdm_name = "gfx_3430es1_clkdm",
1172 .recalc = &followparent_recalc,
1173};
1174
1175/* SGX power domain - 3430ES2 only */
1176
1177static const struct clksel_rate sgx_core_rates[] = {
1178 { .div = 3, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
1179 { .div = 4, .val = 1, .flags = RATE_IN_343X },
1180 { .div = 6, .val = 2, .flags = RATE_IN_343X },
1181 { .div = 0 },
1182};
1183
1184static const struct clksel_rate sgx_96m_rates[] = {
1185 { .div = 1, .val = 3, .flags = RATE_IN_343X | DEFAULT_RATE },
1186 { .div = 0 },
1187};
1188
1189static const struct clksel sgx_clksel[] = {
1190 { .parent = &core_ck, .rates = sgx_core_rates },
1191 { .parent = &cm_96m_fck, .rates = sgx_96m_rates },
1192 { .parent = NULL },
1193};
1194
1195static struct clk sgx_fck = {
1196 .name = "sgx_fck",
1197 .ops = &clkops_omap2_dflt_wait,
1198 .init = &omap2_init_clksel_parent,
1199 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_FCLKEN),
1200 .enable_bit = OMAP3430ES2_CM_FCLKEN_SGX_EN_SGX_SHIFT,
1201 .clksel_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_CLKSEL),
1202 .clksel_mask = OMAP3430ES2_CLKSEL_SGX_MASK,
1203 .clksel = sgx_clksel,
1204 .clkdm_name = "sgx_clkdm",
1205 .recalc = &omap2_clksel_recalc,
1206};
1207
1208static struct clk sgx_ick = {
1209 .name = "sgx_ick",
1210 .ops = &clkops_omap2_dflt_wait,
1211 .parent = &l3_ick,
1212 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_ICLKEN),
1213 .enable_bit = OMAP3430ES2_CM_ICLKEN_SGX_EN_SGX_SHIFT,
1214 .clkdm_name = "sgx_clkdm",
1215 .recalc = &followparent_recalc,
1216};
1217
1218/* CORE power domain */
1219
1220static struct clk d2d_26m_fck = {
1221 .name = "d2d_26m_fck",
1222 .ops = &clkops_omap2_dflt_wait,
1223 .parent = &sys_ck,
1224 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1225 .enable_bit = OMAP3430ES1_EN_D2D_SHIFT,
1226 .clkdm_name = "d2d_clkdm",
1227 .recalc = &followparent_recalc,
1228};
1229
1230static struct clk modem_fck = {
1231 .name = "modem_fck",
1232 .ops = &clkops_omap2_dflt_wait,
1233 .parent = &sys_ck,
1234 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1235 .enable_bit = OMAP3430_EN_MODEM_SHIFT,
1236 .clkdm_name = "d2d_clkdm",
1237 .recalc = &followparent_recalc,
1238};
1239
1240static struct clk sad2d_ick = {
1241 .name = "sad2d_ick",
1242 .ops = &clkops_omap2_dflt_wait,
1243 .parent = &l3_ick,
1244 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1245 .enable_bit = OMAP3430_EN_SAD2D_SHIFT,
1246 .clkdm_name = "d2d_clkdm",
1247 .recalc = &followparent_recalc,
1248};
1249
1250static struct clk mad2d_ick = {
1251 .name = "mad2d_ick",
1252 .ops = &clkops_omap2_dflt_wait,
1253 .parent = &l3_ick,
1254 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
1255 .enable_bit = OMAP3430_EN_MAD2D_SHIFT,
1256 .clkdm_name = "d2d_clkdm",
1257 .recalc = &followparent_recalc,
1258};
1259
1260static const struct clksel omap343x_gpt_clksel[] = {
1261 { .parent = &omap_32k_fck, .rates = gpt_32k_rates },
1262 { .parent = &sys_ck, .rates = gpt_sys_rates },
1263 { .parent = NULL}
1264};
1265
1266static struct clk gpt10_fck = {
1267 .name = "gpt10_fck",
1268 .ops = &clkops_omap2_dflt_wait,
1269 .parent = &sys_ck,
1270 .init = &omap2_init_clksel_parent,
1271 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1272 .enable_bit = OMAP3430_EN_GPT10_SHIFT,
1273 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1274 .clksel_mask = OMAP3430_CLKSEL_GPT10_MASK,
1275 .clksel = omap343x_gpt_clksel,
1276 .clkdm_name = "core_l4_clkdm",
1277 .recalc = &omap2_clksel_recalc,
1278};
1279
1280static struct clk gpt11_fck = {
1281 .name = "gpt11_fck",
1282 .ops = &clkops_omap2_dflt_wait,
1283 .parent = &sys_ck,
1284 .init = &omap2_init_clksel_parent,
1285 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1286 .enable_bit = OMAP3430_EN_GPT11_SHIFT,
1287 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1288 .clksel_mask = OMAP3430_CLKSEL_GPT11_MASK,
1289 .clksel = omap343x_gpt_clksel,
1290 .clkdm_name = "core_l4_clkdm",
1291 .recalc = &omap2_clksel_recalc,
1292};
1293
1294static struct clk cpefuse_fck = {
1295 .name = "cpefuse_fck",
1296 .ops = &clkops_omap2_dflt,
1297 .parent = &sys_ck,
1298 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3),
1299 .enable_bit = OMAP3430ES2_EN_CPEFUSE_SHIFT,
1300 .recalc = &followparent_recalc,
1301};
1302
1303static struct clk ts_fck = {
1304 .name = "ts_fck",
1305 .ops = &clkops_omap2_dflt,
1306 .parent = &omap_32k_fck,
1307 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3),
1308 .enable_bit = OMAP3430ES2_EN_TS_SHIFT,
1309 .recalc = &followparent_recalc,
1310};
1311
1312static struct clk usbtll_fck = {
1313 .name = "usbtll_fck",
1314 .ops = &clkops_omap2_dflt,
1315 .parent = &dpll5_m2_ck,
1316 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3),
1317 .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT,
1318 .recalc = &followparent_recalc,
1319};
1320
1321/* CORE 96M FCLK-derived clocks */
1322
1323static struct clk core_96m_fck = {
1324 .name = "core_96m_fck",
1325 .ops = &clkops_null,
1326 .parent = &omap_96m_fck,
1327 .clkdm_name = "core_l4_clkdm",
1328 .recalc = &followparent_recalc,
1329};
1330
1331static struct clk mmchs3_fck = {
1332 .name = "mmchs_fck",
1333 .ops = &clkops_omap2_dflt_wait,
1334 .id = 2,
1335 .parent = &core_96m_fck,
1336 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1337 .enable_bit = OMAP3430ES2_EN_MMC3_SHIFT,
1338 .clkdm_name = "core_l4_clkdm",
1339 .recalc = &followparent_recalc,
1340};
1341
1342static struct clk mmchs2_fck = {
1343 .name = "mmchs_fck",
1344 .ops = &clkops_omap2_dflt_wait,
1345 .id = 1,
1346 .parent = &core_96m_fck,
1347 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1348 .enable_bit = OMAP3430_EN_MMC2_SHIFT,
1349 .clkdm_name = "core_l4_clkdm",
1350 .recalc = &followparent_recalc,
1351};
1352
1353static struct clk mspro_fck = {
1354 .name = "mspro_fck",
1355 .ops = &clkops_omap2_dflt_wait,
1356 .parent = &core_96m_fck,
1357 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1358 .enable_bit = OMAP3430_EN_MSPRO_SHIFT,
1359 .clkdm_name = "core_l4_clkdm",
1360 .recalc = &followparent_recalc,
1361};
1362
1363static struct clk mmchs1_fck = {
1364 .name = "mmchs_fck",
1365 .ops = &clkops_omap2_dflt_wait,
1366 .parent = &core_96m_fck,
1367 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1368 .enable_bit = OMAP3430_EN_MMC1_SHIFT,
1369 .clkdm_name = "core_l4_clkdm",
1370 .recalc = &followparent_recalc,
1371};
1372
1373static struct clk i2c3_fck = {
1374 .name = "i2c_fck",
1375 .ops = &clkops_omap2_dflt_wait,
1376 .id = 3,
1377 .parent = &core_96m_fck,
1378 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1379 .enable_bit = OMAP3430_EN_I2C3_SHIFT,
1380 .clkdm_name = "core_l4_clkdm",
1381 .recalc = &followparent_recalc,
1382};
1383
1384static struct clk i2c2_fck = {
1385 .name = "i2c_fck",
1386 .ops = &clkops_omap2_dflt_wait,
1387 .id = 2,
1388 .parent = &core_96m_fck,
1389 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1390 .enable_bit = OMAP3430_EN_I2C2_SHIFT,
1391 .clkdm_name = "core_l4_clkdm",
1392 .recalc = &followparent_recalc,
1393};
1394
1395static struct clk i2c1_fck = {
1396 .name = "i2c_fck",
1397 .ops = &clkops_omap2_dflt_wait,
1398 .id = 1,
1399 .parent = &core_96m_fck,
1400 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1401 .enable_bit = OMAP3430_EN_I2C1_SHIFT,
1402 .clkdm_name = "core_l4_clkdm",
1403 .recalc = &followparent_recalc,
1404};
1405
1406/*
1407 * MCBSP 1 & 5 get their 96MHz clock from core_96m_fck;
1408 * MCBSP 2, 3, 4 get their 96MHz clock from per_96m_fck.
1409 */
1410static const struct clksel_rate common_mcbsp_96m_rates[] = {
1411 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
1412 { .div = 0 }
1413};
1414
1415static const struct clksel_rate common_mcbsp_mcbsp_rates[] = {
1416 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
1417 { .div = 0 }
1418};
1419
1420static const struct clksel mcbsp_15_clksel[] = {
1421 { .parent = &core_96m_fck, .rates = common_mcbsp_96m_rates },
1422 { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },
1423 { .parent = NULL }
1424};
1425
1426static struct clk mcbsp5_fck = {
1427 .name = "mcbsp_fck",
1428 .ops = &clkops_omap2_dflt_wait,
1429 .id = 5,
1430 .init = &omap2_init_clksel_parent,
1431 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1432 .enable_bit = OMAP3430_EN_MCBSP5_SHIFT,
1433 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1),
1434 .clksel_mask = OMAP2_MCBSP5_CLKS_MASK,
1435 .clksel = mcbsp_15_clksel,
1436 .clkdm_name = "core_l4_clkdm",
1437 .recalc = &omap2_clksel_recalc,
1438};
1439
1440static struct clk mcbsp1_fck = {
1441 .name = "mcbsp_fck",
1442 .ops = &clkops_omap2_dflt_wait,
1443 .id = 1,
1444 .init = &omap2_init_clksel_parent,
1445 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1446 .enable_bit = OMAP3430_EN_MCBSP1_SHIFT,
1447 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
1448 .clksel_mask = OMAP2_MCBSP1_CLKS_MASK,
1449 .clksel = mcbsp_15_clksel,
1450 .clkdm_name = "core_l4_clkdm",
1451 .recalc = &omap2_clksel_recalc,
1452};
1453
1454/* CORE_48M_FCK-derived clocks */
1455
1456static struct clk core_48m_fck = {
1457 .name = "core_48m_fck",
1458 .ops = &clkops_null,
1459 .parent = &omap_48m_fck,
1460 .clkdm_name = "core_l4_clkdm",
1461 .recalc = &followparent_recalc,
1462};
1463
1464static struct clk mcspi4_fck = {
1465 .name = "mcspi_fck",
1466 .ops = &clkops_omap2_dflt_wait,
1467 .id = 4,
1468 .parent = &core_48m_fck,
1469 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1470 .enable_bit = OMAP3430_EN_MCSPI4_SHIFT,
1471 .recalc = &followparent_recalc,
1472};
1473
1474static struct clk mcspi3_fck = {
1475 .name = "mcspi_fck",
1476 .ops = &clkops_omap2_dflt_wait,
1477 .id = 3,
1478 .parent = &core_48m_fck,
1479 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1480 .enable_bit = OMAP3430_EN_MCSPI3_SHIFT,
1481 .recalc = &followparent_recalc,
1482};
1483
1484static struct clk mcspi2_fck = {
1485 .name = "mcspi_fck",
1486 .ops = &clkops_omap2_dflt_wait,
1487 .id = 2,
1488 .parent = &core_48m_fck,
1489 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1490 .enable_bit = OMAP3430_EN_MCSPI2_SHIFT,
1491 .recalc = &followparent_recalc,
1492};
1493
1494static struct clk mcspi1_fck = {
1495 .name = "mcspi_fck",
1496 .ops = &clkops_omap2_dflt_wait,
1497 .id = 1,
1498 .parent = &core_48m_fck,
1499 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1500 .enable_bit = OMAP3430_EN_MCSPI1_SHIFT,
1501 .recalc = &followparent_recalc,
1502};
1503
1504static struct clk uart2_fck = {
1505 .name = "uart2_fck",
1506 .ops = &clkops_omap2_dflt_wait,
1507 .parent = &core_48m_fck,
1508 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1509 .enable_bit = OMAP3430_EN_UART2_SHIFT,
1510 .recalc = &followparent_recalc,
1511};
1512
1513static struct clk uart1_fck = {
1514 .name = "uart1_fck",
1515 .ops = &clkops_omap2_dflt_wait,
1516 .parent = &core_48m_fck,
1517 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1518 .enable_bit = OMAP3430_EN_UART1_SHIFT,
1519 .recalc = &followparent_recalc,
1520};
1521
1522static struct clk fshostusb_fck = {
1523 .name = "fshostusb_fck",
1524 .ops = &clkops_omap2_dflt_wait,
1525 .parent = &core_48m_fck,
1526 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1527 .enable_bit = OMAP3430ES1_EN_FSHOSTUSB_SHIFT,
1528 .recalc = &followparent_recalc,
1529};
1530
1531/* CORE_12M_FCK based clocks */
1532
1533static struct clk core_12m_fck = {
1534 .name = "core_12m_fck",
1535 .ops = &clkops_null,
1536 .parent = &omap_12m_fck,
1537 .clkdm_name = "core_l4_clkdm",
1538 .recalc = &followparent_recalc,
1539};
1540
1541static struct clk hdq_fck = {
1542 .name = "hdq_fck",
1543 .ops = &clkops_omap2_dflt_wait,
1544 .parent = &core_12m_fck,
1545 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1546 .enable_bit = OMAP3430_EN_HDQ_SHIFT,
1547 .recalc = &followparent_recalc,
1548};
1549
1550/* DPLL3-derived clock */
1551
1552static const struct clksel_rate ssi_ssr_corex2_rates[] = {
1553 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
1554 { .div = 2, .val = 2, .flags = RATE_IN_343X },
1555 { .div = 3, .val = 3, .flags = RATE_IN_343X },
1556 { .div = 4, .val = 4, .flags = RATE_IN_343X },
1557 { .div = 6, .val = 6, .flags = RATE_IN_343X },
1558 { .div = 8, .val = 8, .flags = RATE_IN_343X },
1559 { .div = 0 }
1560};
1561
1562static const struct clksel ssi_ssr_clksel[] = {
1563 { .parent = &corex2_fck, .rates = ssi_ssr_corex2_rates },
1564 { .parent = NULL }
1565};
1566
1567static struct clk ssi_ssr_fck_3430es1 = {
1568 .name = "ssi_ssr_fck",
1569 .ops = &clkops_omap2_dflt,
1570 .init = &omap2_init_clksel_parent,
1571 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1572 .enable_bit = OMAP3430_EN_SSI_SHIFT,
1573 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1574 .clksel_mask = OMAP3430_CLKSEL_SSI_MASK,
1575 .clksel = ssi_ssr_clksel,
1576 .clkdm_name = "core_l4_clkdm",
1577 .recalc = &omap2_clksel_recalc,
1578};
1579
1580static struct clk ssi_ssr_fck_3430es2 = {
1581 .name = "ssi_ssr_fck",
1582 .ops = &clkops_omap3430es2_ssi_wait,
1583 .init = &omap2_init_clksel_parent,
1584 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1585 .enable_bit = OMAP3430_EN_SSI_SHIFT,
1586 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1587 .clksel_mask = OMAP3430_CLKSEL_SSI_MASK,
1588 .clksel = ssi_ssr_clksel,
1589 .clkdm_name = "core_l4_clkdm",
1590 .recalc = &omap2_clksel_recalc,
1591};
1592
1593static struct clk ssi_sst_fck_3430es1 = {
1594 .name = "ssi_sst_fck",
1595 .ops = &clkops_null,
1596 .parent = &ssi_ssr_fck_3430es1,
1597 .fixed_div = 2,
1598 .recalc = &omap2_fixed_divisor_recalc,
1599};
1600
1601static struct clk ssi_sst_fck_3430es2 = {
1602 .name = "ssi_sst_fck",
1603 .ops = &clkops_null,
1604 .parent = &ssi_ssr_fck_3430es2,
1605 .fixed_div = 2,
1606 .recalc = &omap2_fixed_divisor_recalc,
1607};
1608
1609
1610
1611/* CORE_L3_ICK based clocks */
1612
1613/*
1614 * XXX must add clk_enable/clk_disable for these if standard code won't
1615 * handle it
1616 */
1617static struct clk core_l3_ick = {
1618 .name = "core_l3_ick",
1619 .ops = &clkops_null,
1620 .parent = &l3_ick,
1621 .clkdm_name = "core_l3_clkdm",
1622 .recalc = &followparent_recalc,
1623};
1624
1625static struct clk hsotgusb_ick_3430es1 = {
1626 .name = "hsotgusb_ick",
1627 .ops = &clkops_omap2_dflt,
1628 .parent = &core_l3_ick,
1629 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1630 .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT,
1631 .clkdm_name = "core_l3_clkdm",
1632 .recalc = &followparent_recalc,
1633};
1634
1635static struct clk hsotgusb_ick_3430es2 = {
1636 .name = "hsotgusb_ick",
1637 .ops = &clkops_omap3430es2_hsotgusb_wait,
1638 .parent = &core_l3_ick,
1639 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1640 .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT,
1641 .clkdm_name = "core_l3_clkdm",
1642 .recalc = &followparent_recalc,
1643};
1644
1645static struct clk sdrc_ick = {
1646 .name = "sdrc_ick",
1647 .ops = &clkops_omap2_dflt_wait,
1648 .parent = &core_l3_ick,
1649 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1650 .enable_bit = OMAP3430_EN_SDRC_SHIFT,
1651 .flags = ENABLE_ON_INIT,
1652 .clkdm_name = "core_l3_clkdm",
1653 .recalc = &followparent_recalc,
1654};
1655
1656static struct clk gpmc_fck = {
1657 .name = "gpmc_fck",
1658 .ops = &clkops_null,
1659 .parent = &core_l3_ick,
1660 .flags = ENABLE_ON_INIT, /* huh? */
1661 .clkdm_name = "core_l3_clkdm",
1662 .recalc = &followparent_recalc,
1663};
1664
1665/* SECURITY_L3_ICK based clocks */
1666
1667static struct clk security_l3_ick = {
1668 .name = "security_l3_ick",
1669 .ops = &clkops_null,
1670 .parent = &l3_ick,
1671 .recalc = &followparent_recalc,
1672};
1673
1674static struct clk pka_ick = {
1675 .name = "pka_ick",
1676 .ops = &clkops_omap2_dflt_wait,
1677 .parent = &security_l3_ick,
1678 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
1679 .enable_bit = OMAP3430_EN_PKA_SHIFT,
1680 .recalc = &followparent_recalc,
1681};
1682
1683/* CORE_L4_ICK based clocks */
1684
1685static struct clk core_l4_ick = {
1686 .name = "core_l4_ick",
1687 .ops = &clkops_null,
1688 .parent = &l4_ick,
1689 .clkdm_name = "core_l4_clkdm",
1690 .recalc = &followparent_recalc,
1691};
1692
1693static struct clk usbtll_ick = {
1694 .name = "usbtll_ick",
1695 .ops = &clkops_omap2_dflt_wait,
1696 .parent = &core_l4_ick,
1697 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
1698 .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT,
1699 .clkdm_name = "core_l4_clkdm",
1700 .recalc = &followparent_recalc,
1701};
1702
1703static struct clk mmchs3_ick = {
1704 .name = "mmchs_ick",
1705 .ops = &clkops_omap2_dflt_wait,
1706 .id = 2,
1707 .parent = &core_l4_ick,
1708 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1709 .enable_bit = OMAP3430ES2_EN_MMC3_SHIFT,
1710 .clkdm_name = "core_l4_clkdm",
1711 .recalc = &followparent_recalc,
1712};
1713
1714/* Intersystem Communication Registers - chassis mode only */
1715static struct clk icr_ick = {
1716 .name = "icr_ick",
1717 .ops = &clkops_omap2_dflt_wait,
1718 .parent = &core_l4_ick,
1719 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1720 .enable_bit = OMAP3430_EN_ICR_SHIFT,
1721 .clkdm_name = "core_l4_clkdm",
1722 .recalc = &followparent_recalc,
1723};
1724
1725static struct clk aes2_ick = {
1726 .name = "aes2_ick",
1727 .ops = &clkops_omap2_dflt_wait,
1728 .parent = &core_l4_ick,
1729 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1730 .enable_bit = OMAP3430_EN_AES2_SHIFT,
1731 .clkdm_name = "core_l4_clkdm",
1732 .recalc = &followparent_recalc,
1733};
1734
1735static struct clk sha12_ick = {
1736 .name = "sha12_ick",
1737 .ops = &clkops_omap2_dflt_wait,
1738 .parent = &core_l4_ick,
1739 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1740 .enable_bit = OMAP3430_EN_SHA12_SHIFT,
1741 .clkdm_name = "core_l4_clkdm",
1742 .recalc = &followparent_recalc,
1743};
1744
1745static struct clk des2_ick = {
1746 .name = "des2_ick",
1747 .ops = &clkops_omap2_dflt_wait,
1748 .parent = &core_l4_ick,
1749 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1750 .enable_bit = OMAP3430_EN_DES2_SHIFT,
1751 .clkdm_name = "core_l4_clkdm",
1752 .recalc = &followparent_recalc,
1753};
1754
1755static struct clk mmchs2_ick = {
1756 .name = "mmchs_ick",
1757 .ops = &clkops_omap2_dflt_wait,
1758 .id = 1,
1759 .parent = &core_l4_ick,
1760 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1761 .enable_bit = OMAP3430_EN_MMC2_SHIFT,
1762 .clkdm_name = "core_l4_clkdm",
1763 .recalc = &followparent_recalc,
1764};
1765
1766static struct clk mmchs1_ick = {
1767 .name = "mmchs_ick",
1768 .ops = &clkops_omap2_dflt_wait,
1769 .parent = &core_l4_ick,
1770 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1771 .enable_bit = OMAP3430_EN_MMC1_SHIFT,
1772 .clkdm_name = "core_l4_clkdm",
1773 .recalc = &followparent_recalc,
1774};
1775
1776static struct clk mspro_ick = {
1777 .name = "mspro_ick",
1778 .ops = &clkops_omap2_dflt_wait,
1779 .parent = &core_l4_ick,
1780 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1781 .enable_bit = OMAP3430_EN_MSPRO_SHIFT,
1782 .clkdm_name = "core_l4_clkdm",
1783 .recalc = &followparent_recalc,
1784};
1785
1786static struct clk hdq_ick = {
1787 .name = "hdq_ick",
1788 .ops = &clkops_omap2_dflt_wait,
1789 .parent = &core_l4_ick,
1790 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1791 .enable_bit = OMAP3430_EN_HDQ_SHIFT,
1792 .clkdm_name = "core_l4_clkdm",
1793 .recalc = &followparent_recalc,
1794};
1795
1796static struct clk mcspi4_ick = {
1797 .name = "mcspi_ick",
1798 .ops = &clkops_omap2_dflt_wait,
1799 .id = 4,
1800 .parent = &core_l4_ick,
1801 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1802 .enable_bit = OMAP3430_EN_MCSPI4_SHIFT,
1803 .clkdm_name = "core_l4_clkdm",
1804 .recalc = &followparent_recalc,
1805};
1806
1807static struct clk mcspi3_ick = {
1808 .name = "mcspi_ick",
1809 .ops = &clkops_omap2_dflt_wait,
1810 .id = 3,
1811 .parent = &core_l4_ick,
1812 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1813 .enable_bit = OMAP3430_EN_MCSPI3_SHIFT,
1814 .clkdm_name = "core_l4_clkdm",
1815 .recalc = &followparent_recalc,
1816};
1817
1818static struct clk mcspi2_ick = {
1819 .name = "mcspi_ick",
1820 .ops = &clkops_omap2_dflt_wait,
1821 .id = 2,
1822 .parent = &core_l4_ick,
1823 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1824 .enable_bit = OMAP3430_EN_MCSPI2_SHIFT,
1825 .clkdm_name = "core_l4_clkdm",
1826 .recalc = &followparent_recalc,
1827};
1828
1829static struct clk mcspi1_ick = {
1830 .name = "mcspi_ick",
1831 .ops = &clkops_omap2_dflt_wait,
1832 .id = 1,
1833 .parent = &core_l4_ick,
1834 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1835 .enable_bit = OMAP3430_EN_MCSPI1_SHIFT,
1836 .clkdm_name = "core_l4_clkdm",
1837 .recalc = &followparent_recalc,
1838};
1839
1840static struct clk i2c3_ick = {
1841 .name = "i2c_ick",
1842 .ops = &clkops_omap2_dflt_wait,
1843 .id = 3,
1844 .parent = &core_l4_ick,
1845 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1846 .enable_bit = OMAP3430_EN_I2C3_SHIFT,
1847 .clkdm_name = "core_l4_clkdm",
1848 .recalc = &followparent_recalc,
1849};
1850
1851static struct clk i2c2_ick = {
1852 .name = "i2c_ick",
1853 .ops = &clkops_omap2_dflt_wait,
1854 .id = 2,
1855 .parent = &core_l4_ick,
1856 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1857 .enable_bit = OMAP3430_EN_I2C2_SHIFT,
1858 .clkdm_name = "core_l4_clkdm",
1859 .recalc = &followparent_recalc,
1860};
1861
1862static struct clk i2c1_ick = {
1863 .name = "i2c_ick",
1864 .ops = &clkops_omap2_dflt_wait,
1865 .id = 1,
1866 .parent = &core_l4_ick,
1867 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1868 .enable_bit = OMAP3430_EN_I2C1_SHIFT,
1869 .clkdm_name = "core_l4_clkdm",
1870 .recalc = &followparent_recalc,
1871};
1872
1873static struct clk uart2_ick = {
1874 .name = "uart2_ick",
1875 .ops = &clkops_omap2_dflt_wait,
1876 .parent = &core_l4_ick,
1877 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1878 .enable_bit = OMAP3430_EN_UART2_SHIFT,
1879 .clkdm_name = "core_l4_clkdm",
1880 .recalc = &followparent_recalc,
1881};
1882
1883static struct clk uart1_ick = {
1884 .name = "uart1_ick",
1885 .ops = &clkops_omap2_dflt_wait,
1886 .parent = &core_l4_ick,
1887 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1888 .enable_bit = OMAP3430_EN_UART1_SHIFT,
1889 .clkdm_name = "core_l4_clkdm",
1890 .recalc = &followparent_recalc,
1891};
1892
1893static struct clk gpt11_ick = {
1894 .name = "gpt11_ick",
1895 .ops = &clkops_omap2_dflt_wait,
1896 .parent = &core_l4_ick,
1897 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1898 .enable_bit = OMAP3430_EN_GPT11_SHIFT,
1899 .clkdm_name = "core_l4_clkdm",
1900 .recalc = &followparent_recalc,
1901};
1902
1903static struct clk gpt10_ick = {
1904 .name = "gpt10_ick",
1905 .ops = &clkops_omap2_dflt_wait,
1906 .parent = &core_l4_ick,
1907 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1908 .enable_bit = OMAP3430_EN_GPT10_SHIFT,
1909 .clkdm_name = "core_l4_clkdm",
1910 .recalc = &followparent_recalc,
1911};
1912
1913static struct clk mcbsp5_ick = {
1914 .name = "mcbsp_ick",
1915 .ops = &clkops_omap2_dflt_wait,
1916 .id = 5,
1917 .parent = &core_l4_ick,
1918 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1919 .enable_bit = OMAP3430_EN_MCBSP5_SHIFT,
1920 .clkdm_name = "core_l4_clkdm",
1921 .recalc = &followparent_recalc,
1922};
1923
1924static struct clk mcbsp1_ick = {
1925 .name = "mcbsp_ick",
1926 .ops = &clkops_omap2_dflt_wait,
1927 .id = 1,
1928 .parent = &core_l4_ick,
1929 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1930 .enable_bit = OMAP3430_EN_MCBSP1_SHIFT,
1931 .clkdm_name = "core_l4_clkdm",
1932 .recalc = &followparent_recalc,
1933};
1934
1935static struct clk fac_ick = {
1936 .name = "fac_ick",
1937 .ops = &clkops_omap2_dflt_wait,
1938 .parent = &core_l4_ick,
1939 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1940 .enable_bit = OMAP3430ES1_EN_FAC_SHIFT,
1941 .clkdm_name = "core_l4_clkdm",
1942 .recalc = &followparent_recalc,
1943};
1944
1945static struct clk mailboxes_ick = {
1946 .name = "mailboxes_ick",
1947 .ops = &clkops_omap2_dflt_wait,
1948 .parent = &core_l4_ick,
1949 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1950 .enable_bit = OMAP3430_EN_MAILBOXES_SHIFT,
1951 .clkdm_name = "core_l4_clkdm",
1952 .recalc = &followparent_recalc,
1953};
1954
1955static struct clk omapctrl_ick = {
1956 .name = "omapctrl_ick",
1957 .ops = &clkops_omap2_dflt_wait,
1958 .parent = &core_l4_ick,
1959 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1960 .enable_bit = OMAP3430_EN_OMAPCTRL_SHIFT,
1961 .flags = ENABLE_ON_INIT,
1962 .recalc = &followparent_recalc,
1963};
1964
1965/* SSI_L4_ICK based clocks */
1966
1967static struct clk ssi_l4_ick = {
1968 .name = "ssi_l4_ick",
1969 .ops = &clkops_null,
1970 .parent = &l4_ick,
1971 .clkdm_name = "core_l4_clkdm",
1972 .recalc = &followparent_recalc,
1973};
1974
1975static struct clk ssi_ick_3430es1 = {
1976 .name = "ssi_ick",
1977 .ops = &clkops_omap2_dflt,
1978 .parent = &ssi_l4_ick,
1979 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1980 .enable_bit = OMAP3430_EN_SSI_SHIFT,
1981 .clkdm_name = "core_l4_clkdm",
1982 .recalc = &followparent_recalc,
1983};
1984
1985static struct clk ssi_ick_3430es2 = {
1986 .name = "ssi_ick",
1987 .ops = &clkops_omap3430es2_ssi_wait,
1988 .parent = &ssi_l4_ick,
1989 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1990 .enable_bit = OMAP3430_EN_SSI_SHIFT,
1991 .clkdm_name = "core_l4_clkdm",
1992 .recalc = &followparent_recalc,
1993};
1994
1995/* REVISIT: Technically the TRM claims that this is CORE_CLK based,
1996 * but l4_ick makes more sense to me */
1997
1998static const struct clksel usb_l4_clksel[] = {
1999 { .parent = &l4_ick, .rates = div2_rates },
2000 { .parent = NULL },
2001};
2002
2003static struct clk usb_l4_ick = {
2004 .name = "usb_l4_ick",
2005 .ops = &clkops_omap2_dflt_wait,
2006 .parent = &l4_ick,
2007 .init = &omap2_init_clksel_parent,
2008 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2009 .enable_bit = OMAP3430ES1_EN_FSHOSTUSB_SHIFT,
2010 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
2011 .clksel_mask = OMAP3430ES1_CLKSEL_FSHOSTUSB_MASK,
2012 .clksel = usb_l4_clksel,
2013 .recalc = &omap2_clksel_recalc,
2014};
2015
2016/* SECURITY_L4_ICK2 based clocks */
2017
2018static struct clk security_l4_ick2 = {
2019 .name = "security_l4_ick2",
2020 .ops = &clkops_null,
2021 .parent = &l4_ick,
2022 .recalc = &followparent_recalc,
2023};
2024
2025static struct clk aes1_ick = {
2026 .name = "aes1_ick",
2027 .ops = &clkops_omap2_dflt_wait,
2028 .parent = &security_l4_ick2,
2029 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
2030 .enable_bit = OMAP3430_EN_AES1_SHIFT,
2031 .recalc = &followparent_recalc,
2032};
2033
2034static struct clk rng_ick = {
2035 .name = "rng_ick",
2036 .ops = &clkops_omap2_dflt_wait,
2037 .parent = &security_l4_ick2,
2038 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
2039 .enable_bit = OMAP3430_EN_RNG_SHIFT,
2040 .recalc = &followparent_recalc,
2041};
2042
2043static struct clk sha11_ick = {
2044 .name = "sha11_ick",
2045 .ops = &clkops_omap2_dflt_wait,
2046 .parent = &security_l4_ick2,
2047 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
2048 .enable_bit = OMAP3430_EN_SHA11_SHIFT,
2049 .recalc = &followparent_recalc,
2050};
2051
2052static struct clk des1_ick = {
2053 .name = "des1_ick",
2054 .ops = &clkops_omap2_dflt_wait,
2055 .parent = &security_l4_ick2,
2056 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
2057 .enable_bit = OMAP3430_EN_DES1_SHIFT,
2058 .recalc = &followparent_recalc,
2059};
2060
2061/* DSS */
2062static struct clk dss1_alwon_fck_3430es1 = {
2063 .name = "dss1_alwon_fck",
2064 .ops = &clkops_omap2_dflt,
2065 .parent = &dpll4_m4x2_ck,
2066 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2067 .enable_bit = OMAP3430_EN_DSS1_SHIFT,
2068 .clkdm_name = "dss_clkdm",
2069 .recalc = &followparent_recalc,
2070};
2071
2072static struct clk dss1_alwon_fck_3430es2 = {
2073 .name = "dss1_alwon_fck",
2074 .ops = &clkops_omap3430es2_dss_usbhost_wait,
2075 .parent = &dpll4_m4x2_ck,
2076 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2077 .enable_bit = OMAP3430_EN_DSS1_SHIFT,
2078 .clkdm_name = "dss_clkdm",
2079 .recalc = &followparent_recalc,
2080};
2081
2082static struct clk dss_tv_fck = {
2083 .name = "dss_tv_fck",
2084 .ops = &clkops_omap2_dflt,
2085 .parent = &omap_54m_fck,
2086 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2087 .enable_bit = OMAP3430_EN_TV_SHIFT,
2088 .clkdm_name = "dss_clkdm",
2089 .recalc = &followparent_recalc,
2090};
2091
2092static struct clk dss_96m_fck = {
2093 .name = "dss_96m_fck",
2094 .ops = &clkops_omap2_dflt,
2095 .parent = &omap_96m_fck,
2096 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2097 .enable_bit = OMAP3430_EN_TV_SHIFT,
2098 .clkdm_name = "dss_clkdm",
2099 .recalc = &followparent_recalc,
2100};
2101
2102static struct clk dss2_alwon_fck = {
2103 .name = "dss2_alwon_fck",
2104 .ops = &clkops_omap2_dflt,
2105 .parent = &sys_ck,
2106 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2107 .enable_bit = OMAP3430_EN_DSS2_SHIFT,
2108 .clkdm_name = "dss_clkdm",
2109 .recalc = &followparent_recalc,
2110};
2111
2112static struct clk dss_ick_3430es1 = {
2113 /* Handles both L3 and L4 clocks */
2114 .name = "dss_ick",
2115 .ops = &clkops_omap2_dflt,
2116 .parent = &l4_ick,
2117 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN),
2118 .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT,
2119 .clkdm_name = "dss_clkdm",
2120 .recalc = &followparent_recalc,
2121};
2122
2123static struct clk dss_ick_3430es2 = {
2124 /* Handles both L3 and L4 clocks */
2125 .name = "dss_ick",
2126 .ops = &clkops_omap3430es2_dss_usbhost_wait,
2127 .parent = &l4_ick,
2128 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN),
2129 .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT,
2130 .clkdm_name = "dss_clkdm",
2131 .recalc = &followparent_recalc,
2132};
2133
2134/* CAM */
2135
2136static struct clk cam_mclk = {
2137 .name = "cam_mclk",
2138 .ops = &clkops_omap2_dflt,
2139 .parent = &dpll4_m5x2_ck,
2140 .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_FCLKEN),
2141 .enable_bit = OMAP3430_EN_CAM_SHIFT,
2142 .clkdm_name = "cam_clkdm",
2143 .recalc = &followparent_recalc,
2144};
2145
2146static struct clk cam_ick = {
2147 /* Handles both L3 and L4 clocks */
2148 .name = "cam_ick",
2149 .ops = &clkops_omap2_dflt,
2150 .parent = &l4_ick,
2151 .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_ICLKEN),
2152 .enable_bit = OMAP3430_EN_CAM_SHIFT,
2153 .clkdm_name = "cam_clkdm",
2154 .recalc = &followparent_recalc,
2155};
2156
2157static struct clk csi2_96m_fck = {
2158 .name = "csi2_96m_fck",
2159 .ops = &clkops_omap2_dflt,
2160 .parent = &core_96m_fck,
2161 .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_FCLKEN),
2162 .enable_bit = OMAP3430_EN_CSI2_SHIFT,
2163 .clkdm_name = "cam_clkdm",
2164 .recalc = &followparent_recalc,
2165};
2166
2167/* USBHOST - 3430ES2 only */
2168
2169static struct clk usbhost_120m_fck = {
2170 .name = "usbhost_120m_fck",
2171 .ops = &clkops_omap2_dflt,
2172 .parent = &dpll5_m2_ck,
2173 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN),
2174 .enable_bit = OMAP3430ES2_EN_USBHOST2_SHIFT,
2175 .clkdm_name = "usbhost_clkdm",
2176 .recalc = &followparent_recalc,
2177};
2178
2179static struct clk usbhost_48m_fck = {
2180 .name = "usbhost_48m_fck",
2181 .ops = &clkops_omap3430es2_dss_usbhost_wait,
2182 .parent = &omap_48m_fck,
2183 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN),
2184 .enable_bit = OMAP3430ES2_EN_USBHOST1_SHIFT,
2185 .clkdm_name = "usbhost_clkdm",
2186 .recalc = &followparent_recalc,
2187};
2188
2189static struct clk usbhost_ick = {
2190 /* Handles both L3 and L4 clocks */
2191 .name = "usbhost_ick",
2192 .ops = &clkops_omap3430es2_dss_usbhost_wait,
2193 .parent = &l4_ick,
2194 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_ICLKEN),
2195 .enable_bit = OMAP3430ES2_EN_USBHOST_SHIFT,
2196 .clkdm_name = "usbhost_clkdm",
2197 .recalc = &followparent_recalc,
2198};
2199
2200/* WKUP */
2201
2202static const struct clksel_rate usim_96m_rates[] = {
2203 { .div = 2, .val = 3, .flags = RATE_IN_343X | DEFAULT_RATE },
2204 { .div = 4, .val = 4, .flags = RATE_IN_343X },
2205 { .div = 8, .val = 5, .flags = RATE_IN_343X },
2206 { .div = 10, .val = 6, .flags = RATE_IN_343X },
2207 { .div = 0 },
2208};
2209
2210static const struct clksel_rate usim_120m_rates[] = {
2211 { .div = 4, .val = 7, .flags = RATE_IN_343X | DEFAULT_RATE },
2212 { .div = 8, .val = 8, .flags = RATE_IN_343X },
2213 { .div = 16, .val = 9, .flags = RATE_IN_343X },
2214 { .div = 20, .val = 10, .flags = RATE_IN_343X },
2215 { .div = 0 },
2216};
2217
2218static const struct clksel usim_clksel[] = {
2219 { .parent = &omap_96m_fck, .rates = usim_96m_rates },
2220 { .parent = &dpll5_m2_ck, .rates = usim_120m_rates },
2221 { .parent = &sys_ck, .rates = div2_rates },
2222 { .parent = NULL },
2223};
2224
2225/* 3430ES2 only */
2226static struct clk usim_fck = {
2227 .name = "usim_fck",
2228 .ops = &clkops_omap2_dflt_wait,
2229 .init = &omap2_init_clksel_parent,
2230 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2231 .enable_bit = OMAP3430ES2_EN_USIMOCP_SHIFT,
2232 .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL),
2233 .clksel_mask = OMAP3430ES2_CLKSEL_USIMOCP_MASK,
2234 .clksel = usim_clksel,
2235 .recalc = &omap2_clksel_recalc,
2236};
2237
2238/* XXX should gpt1's clksel have wkup_32k_fck as the 32k opt? */
2239static struct clk gpt1_fck = {
2240 .name = "gpt1_fck",
2241 .ops = &clkops_omap2_dflt_wait,
2242 .init = &omap2_init_clksel_parent,
2243 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2244 .enable_bit = OMAP3430_EN_GPT1_SHIFT,
2245 .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL),
2246 .clksel_mask = OMAP3430_CLKSEL_GPT1_MASK,
2247 .clksel = omap343x_gpt_clksel,
2248 .clkdm_name = "wkup_clkdm",
2249 .recalc = &omap2_clksel_recalc,
2250};
2251
2252static struct clk wkup_32k_fck = {
2253 .name = "wkup_32k_fck",
2254 .ops = &clkops_null,
2255 .parent = &omap_32k_fck,
2256 .clkdm_name = "wkup_clkdm",
2257 .recalc = &followparent_recalc,
2258};
2259
2260static struct clk gpio1_dbck = {
2261 .name = "gpio1_dbck",
2262 .ops = &clkops_omap2_dflt,
2263 .parent = &wkup_32k_fck,
2264 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2265 .enable_bit = OMAP3430_EN_GPIO1_SHIFT,
2266 .clkdm_name = "wkup_clkdm",
2267 .recalc = &followparent_recalc,
2268};
2269
2270static struct clk wdt2_fck = {
2271 .name = "wdt2_fck",
2272 .ops = &clkops_omap2_dflt_wait,
2273 .parent = &wkup_32k_fck,
2274 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2275 .enable_bit = OMAP3430_EN_WDT2_SHIFT,
2276 .clkdm_name = "wkup_clkdm",
2277 .recalc = &followparent_recalc,
2278};
2279
2280static struct clk wkup_l4_ick = {
2281 .name = "wkup_l4_ick",
2282 .ops = &clkops_null,
2283 .parent = &sys_ck,
2284 .clkdm_name = "wkup_clkdm",
2285 .recalc = &followparent_recalc,
2286};
2287
2288/* 3430ES2 only */
2289/* Never specifically named in the TRM, so we have to infer a likely name */
2290static struct clk usim_ick = {
2291 .name = "usim_ick",
2292 .ops = &clkops_omap2_dflt_wait,
2293 .parent = &wkup_l4_ick,
2294 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2295 .enable_bit = OMAP3430ES2_EN_USIMOCP_SHIFT,
2296 .clkdm_name = "wkup_clkdm",
2297 .recalc = &followparent_recalc,
2298};
2299
2300static struct clk wdt2_ick = {
2301 .name = "wdt2_ick",
2302 .ops = &clkops_omap2_dflt_wait,
2303 .parent = &wkup_l4_ick,
2304 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2305 .enable_bit = OMAP3430_EN_WDT2_SHIFT,
2306 .clkdm_name = "wkup_clkdm",
2307 .recalc = &followparent_recalc,
2308};
2309
2310static struct clk wdt1_ick = {
2311 .name = "wdt1_ick",
2312 .ops = &clkops_omap2_dflt_wait,
2313 .parent = &wkup_l4_ick,
2314 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2315 .enable_bit = OMAP3430_EN_WDT1_SHIFT,
2316 .clkdm_name = "wkup_clkdm",
2317 .recalc = &followparent_recalc,
2318};
2319
2320static struct clk gpio1_ick = {
2321 .name = "gpio1_ick",
2322 .ops = &clkops_omap2_dflt_wait,
2323 .parent = &wkup_l4_ick,
2324 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2325 .enable_bit = OMAP3430_EN_GPIO1_SHIFT,
2326 .clkdm_name = "wkup_clkdm",
2327 .recalc = &followparent_recalc,
2328};
2329
2330static struct clk omap_32ksync_ick = {
2331 .name = "omap_32ksync_ick",
2332 .ops = &clkops_omap2_dflt_wait,
2333 .parent = &wkup_l4_ick,
2334 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2335 .enable_bit = OMAP3430_EN_32KSYNC_SHIFT,
2336 .clkdm_name = "wkup_clkdm",
2337 .recalc = &followparent_recalc,
2338};
2339
2340/* XXX This clock no longer exists in 3430 TRM rev F */
2341static struct clk gpt12_ick = {
2342 .name = "gpt12_ick",
2343 .ops = &clkops_omap2_dflt_wait,
2344 .parent = &wkup_l4_ick,
2345 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2346 .enable_bit = OMAP3430_EN_GPT12_SHIFT,
2347 .clkdm_name = "wkup_clkdm",
2348 .recalc = &followparent_recalc,
2349};
2350
2351static struct clk gpt1_ick = {
2352 .name = "gpt1_ick",
2353 .ops = &clkops_omap2_dflt_wait,
2354 .parent = &wkup_l4_ick,
2355 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2356 .enable_bit = OMAP3430_EN_GPT1_SHIFT,
2357 .clkdm_name = "wkup_clkdm",
2358 .recalc = &followparent_recalc,
2359};
2360
2361
2362
2363/* PER clock domain */
2364
2365static struct clk per_96m_fck = {
2366 .name = "per_96m_fck",
2367 .ops = &clkops_null,
2368 .parent = &omap_96m_alwon_fck,
2369 .clkdm_name = "per_clkdm",
2370 .recalc = &followparent_recalc,
2371};
2372
2373static struct clk per_48m_fck = {
2374 .name = "per_48m_fck",
2375 .ops = &clkops_null,
2376 .parent = &omap_48m_fck,
2377 .clkdm_name = "per_clkdm",
2378 .recalc = &followparent_recalc,
2379};
2380
2381static struct clk uart3_fck = {
2382 .name = "uart3_fck",
2383 .ops = &clkops_omap2_dflt_wait,
2384 .parent = &per_48m_fck,
2385 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2386 .enable_bit = OMAP3430_EN_UART3_SHIFT,
2387 .clkdm_name = "per_clkdm",
2388 .recalc = &followparent_recalc,
2389};
2390
2391static struct clk gpt2_fck = {
2392 .name = "gpt2_fck",
2393 .ops = &clkops_omap2_dflt_wait,
2394 .init = &omap2_init_clksel_parent,
2395 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2396 .enable_bit = OMAP3430_EN_GPT2_SHIFT,
2397 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2398 .clksel_mask = OMAP3430_CLKSEL_GPT2_MASK,
2399 .clksel = omap343x_gpt_clksel,
2400 .clkdm_name = "per_clkdm",
2401 .recalc = &omap2_clksel_recalc,
2402};
2403
2404static struct clk gpt3_fck = {
2405 .name = "gpt3_fck",
2406 .ops = &clkops_omap2_dflt_wait,
2407 .init = &omap2_init_clksel_parent,
2408 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2409 .enable_bit = OMAP3430_EN_GPT3_SHIFT,
2410 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2411 .clksel_mask = OMAP3430_CLKSEL_GPT3_MASK,
2412 .clksel = omap343x_gpt_clksel,
2413 .clkdm_name = "per_clkdm",
2414 .recalc = &omap2_clksel_recalc,
2415};
2416
2417static struct clk gpt4_fck = {
2418 .name = "gpt4_fck",
2419 .ops = &clkops_omap2_dflt_wait,
2420 .init = &omap2_init_clksel_parent,
2421 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2422 .enable_bit = OMAP3430_EN_GPT4_SHIFT,
2423 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2424 .clksel_mask = OMAP3430_CLKSEL_GPT4_MASK,
2425 .clksel = omap343x_gpt_clksel,
2426 .clkdm_name = "per_clkdm",
2427 .recalc = &omap2_clksel_recalc,
2428};
2429
2430static struct clk gpt5_fck = {
2431 .name = "gpt5_fck",
2432 .ops = &clkops_omap2_dflt_wait,
2433 .init = &omap2_init_clksel_parent,
2434 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2435 .enable_bit = OMAP3430_EN_GPT5_SHIFT,
2436 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2437 .clksel_mask = OMAP3430_CLKSEL_GPT5_MASK,
2438 .clksel = omap343x_gpt_clksel,
2439 .clkdm_name = "per_clkdm",
2440 .recalc = &omap2_clksel_recalc,
2441};
2442
2443static struct clk gpt6_fck = {
2444 .name = "gpt6_fck",
2445 .ops = &clkops_omap2_dflt_wait,
2446 .init = &omap2_init_clksel_parent,
2447 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2448 .enable_bit = OMAP3430_EN_GPT6_SHIFT,
2449 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2450 .clksel_mask = OMAP3430_CLKSEL_GPT6_MASK,
2451 .clksel = omap343x_gpt_clksel,
2452 .clkdm_name = "per_clkdm",
2453 .recalc = &omap2_clksel_recalc,
2454};
2455
2456static struct clk gpt7_fck = {
2457 .name = "gpt7_fck",
2458 .ops = &clkops_omap2_dflt_wait,
2459 .init = &omap2_init_clksel_parent,
2460 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2461 .enable_bit = OMAP3430_EN_GPT7_SHIFT,
2462 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2463 .clksel_mask = OMAP3430_CLKSEL_GPT7_MASK,
2464 .clksel = omap343x_gpt_clksel,
2465 .clkdm_name = "per_clkdm",
2466 .recalc = &omap2_clksel_recalc,
2467};
2468
2469static struct clk gpt8_fck = {
2470 .name = "gpt8_fck",
2471 .ops = &clkops_omap2_dflt_wait,
2472 .init = &omap2_init_clksel_parent,
2473 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2474 .enable_bit = OMAP3430_EN_GPT8_SHIFT,
2475 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2476 .clksel_mask = OMAP3430_CLKSEL_GPT8_MASK,
2477 .clksel = omap343x_gpt_clksel,
2478 .clkdm_name = "per_clkdm",
2479 .recalc = &omap2_clksel_recalc,
2480};
2481
2482static struct clk gpt9_fck = {
2483 .name = "gpt9_fck",
2484 .ops = &clkops_omap2_dflt_wait,
2485 .init = &omap2_init_clksel_parent,
2486 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2487 .enable_bit = OMAP3430_EN_GPT9_SHIFT,
2488 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2489 .clksel_mask = OMAP3430_CLKSEL_GPT9_MASK,
2490 .clksel = omap343x_gpt_clksel,
2491 .clkdm_name = "per_clkdm",
2492 .recalc = &omap2_clksel_recalc,
2493};
2494
2495static struct clk per_32k_alwon_fck = {
2496 .name = "per_32k_alwon_fck",
2497 .ops = &clkops_null,
2498 .parent = &omap_32k_fck,
2499 .clkdm_name = "per_clkdm",
2500 .recalc = &followparent_recalc,
2501};
2502
2503static struct clk gpio6_dbck = {
2504 .name = "gpio6_dbck",
2505 .ops = &clkops_omap2_dflt,
2506 .parent = &per_32k_alwon_fck,
2507 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2508 .enable_bit = OMAP3430_EN_GPIO6_SHIFT,
2509 .clkdm_name = "per_clkdm",
2510 .recalc = &followparent_recalc,
2511};
2512
2513static struct clk gpio5_dbck = {
2514 .name = "gpio5_dbck",
2515 .ops = &clkops_omap2_dflt,
2516 .parent = &per_32k_alwon_fck,
2517 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2518 .enable_bit = OMAP3430_EN_GPIO5_SHIFT,
2519 .clkdm_name = "per_clkdm",
2520 .recalc = &followparent_recalc,
2521};
2522
2523static struct clk gpio4_dbck = {
2524 .name = "gpio4_dbck",
2525 .ops = &clkops_omap2_dflt,
2526 .parent = &per_32k_alwon_fck,
2527 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2528 .enable_bit = OMAP3430_EN_GPIO4_SHIFT,
2529 .clkdm_name = "per_clkdm",
2530 .recalc = &followparent_recalc,
2531};
2532
2533static struct clk gpio3_dbck = {
2534 .name = "gpio3_dbck",
2535 .ops = &clkops_omap2_dflt,
2536 .parent = &per_32k_alwon_fck,
2537 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2538 .enable_bit = OMAP3430_EN_GPIO3_SHIFT,
2539 .clkdm_name = "per_clkdm",
2540 .recalc = &followparent_recalc,
2541};
2542
2543static struct clk gpio2_dbck = {
2544 .name = "gpio2_dbck",
2545 .ops = &clkops_omap2_dflt,
2546 .parent = &per_32k_alwon_fck,
2547 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2548 .enable_bit = OMAP3430_EN_GPIO2_SHIFT,
2549 .clkdm_name = "per_clkdm",
2550 .recalc = &followparent_recalc,
2551};
2552
2553static struct clk wdt3_fck = {
2554 .name = "wdt3_fck",
2555 .ops = &clkops_omap2_dflt_wait,
2556 .parent = &per_32k_alwon_fck,
2557 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2558 .enable_bit = OMAP3430_EN_WDT3_SHIFT,
2559 .clkdm_name = "per_clkdm",
2560 .recalc = &followparent_recalc,
2561};
2562
2563static struct clk per_l4_ick = {
2564 .name = "per_l4_ick",
2565 .ops = &clkops_null,
2566 .parent = &l4_ick,
2567 .clkdm_name = "per_clkdm",
2568 .recalc = &followparent_recalc,
2569};
2570
2571static struct clk gpio6_ick = {
2572 .name = "gpio6_ick",
2573 .ops = &clkops_omap2_dflt_wait,
2574 .parent = &per_l4_ick,
2575 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2576 .enable_bit = OMAP3430_EN_GPIO6_SHIFT,
2577 .clkdm_name = "per_clkdm",
2578 .recalc = &followparent_recalc,
2579};
2580
2581static struct clk gpio5_ick = {
2582 .name = "gpio5_ick",
2583 .ops = &clkops_omap2_dflt_wait,
2584 .parent = &per_l4_ick,
2585 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2586 .enable_bit = OMAP3430_EN_GPIO5_SHIFT,
2587 .clkdm_name = "per_clkdm",
2588 .recalc = &followparent_recalc,
2589};
2590
2591static struct clk gpio4_ick = {
2592 .name = "gpio4_ick",
2593 .ops = &clkops_omap2_dflt_wait,
2594 .parent = &per_l4_ick,
2595 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2596 .enable_bit = OMAP3430_EN_GPIO4_SHIFT,
2597 .clkdm_name = "per_clkdm",
2598 .recalc = &followparent_recalc,
2599};
2600
2601static struct clk gpio3_ick = {
2602 .name = "gpio3_ick",
2603 .ops = &clkops_omap2_dflt_wait,
2604 .parent = &per_l4_ick,
2605 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2606 .enable_bit = OMAP3430_EN_GPIO3_SHIFT,
2607 .clkdm_name = "per_clkdm",
2608 .recalc = &followparent_recalc,
2609};
2610
2611static struct clk gpio2_ick = {
2612 .name = "gpio2_ick",
2613 .ops = &clkops_omap2_dflt_wait,
2614 .parent = &per_l4_ick,
2615 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2616 .enable_bit = OMAP3430_EN_GPIO2_SHIFT,
2617 .clkdm_name = "per_clkdm",
2618 .recalc = &followparent_recalc,
2619};
2620
2621static struct clk wdt3_ick = {
2622 .name = "wdt3_ick",
2623 .ops = &clkops_omap2_dflt_wait,
2624 .parent = &per_l4_ick,
2625 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2626 .enable_bit = OMAP3430_EN_WDT3_SHIFT,
2627 .clkdm_name = "per_clkdm",
2628 .recalc = &followparent_recalc,
2629};
2630
2631static struct clk uart3_ick = {
2632 .name = "uart3_ick",
2633 .ops = &clkops_omap2_dflt_wait,
2634 .parent = &per_l4_ick,
2635 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2636 .enable_bit = OMAP3430_EN_UART3_SHIFT,
2637 .clkdm_name = "per_clkdm",
2638 .recalc = &followparent_recalc,
2639};
2640
2641static struct clk gpt9_ick = {
2642 .name = "gpt9_ick",
2643 .ops = &clkops_omap2_dflt_wait,
2644 .parent = &per_l4_ick,
2645 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2646 .enable_bit = OMAP3430_EN_GPT9_SHIFT,
2647 .clkdm_name = "per_clkdm",
2648 .recalc = &followparent_recalc,
2649};
2650
2651static struct clk gpt8_ick = {
2652 .name = "gpt8_ick",
2653 .ops = &clkops_omap2_dflt_wait,
2654 .parent = &per_l4_ick,
2655 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2656 .enable_bit = OMAP3430_EN_GPT8_SHIFT,
2657 .clkdm_name = "per_clkdm",
2658 .recalc = &followparent_recalc,
2659};
2660
2661static struct clk gpt7_ick = {
2662 .name = "gpt7_ick",
2663 .ops = &clkops_omap2_dflt_wait,
2664 .parent = &per_l4_ick,
2665 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2666 .enable_bit = OMAP3430_EN_GPT7_SHIFT,
2667 .clkdm_name = "per_clkdm",
2668 .recalc = &followparent_recalc,
2669};
2670
2671static struct clk gpt6_ick = {
2672 .name = "gpt6_ick",
2673 .ops = &clkops_omap2_dflt_wait,
2674 .parent = &per_l4_ick,
2675 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2676 .enable_bit = OMAP3430_EN_GPT6_SHIFT,
2677 .clkdm_name = "per_clkdm",
2678 .recalc = &followparent_recalc,
2679};
2680
2681static struct clk gpt5_ick = {
2682 .name = "gpt5_ick",
2683 .ops = &clkops_omap2_dflt_wait,
2684 .parent = &per_l4_ick,
2685 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2686 .enable_bit = OMAP3430_EN_GPT5_SHIFT,
2687 .clkdm_name = "per_clkdm",
2688 .recalc = &followparent_recalc,
2689};
2690
2691static struct clk gpt4_ick = {
2692 .name = "gpt4_ick",
2693 .ops = &clkops_omap2_dflt_wait,
2694 .parent = &per_l4_ick,
2695 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2696 .enable_bit = OMAP3430_EN_GPT4_SHIFT,
2697 .clkdm_name = "per_clkdm",
2698 .recalc = &followparent_recalc,
2699};
2700
2701static struct clk gpt3_ick = {
2702 .name = "gpt3_ick",
2703 .ops = &clkops_omap2_dflt_wait,
2704 .parent = &per_l4_ick,
2705 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2706 .enable_bit = OMAP3430_EN_GPT3_SHIFT,
2707 .clkdm_name = "per_clkdm",
2708 .recalc = &followparent_recalc,
2709};
2710
2711static struct clk gpt2_ick = {
2712 .name = "gpt2_ick",
2713 .ops = &clkops_omap2_dflt_wait,
2714 .parent = &per_l4_ick,
2715 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2716 .enable_bit = OMAP3430_EN_GPT2_SHIFT,
2717 .clkdm_name = "per_clkdm",
2718 .recalc = &followparent_recalc,
2719};
2720
2721static struct clk mcbsp2_ick = {
2722 .name = "mcbsp_ick",
2723 .ops = &clkops_omap2_dflt_wait,
2724 .id = 2,
2725 .parent = &per_l4_ick,
2726 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2727 .enable_bit = OMAP3430_EN_MCBSP2_SHIFT,
2728 .clkdm_name = "per_clkdm",
2729 .recalc = &followparent_recalc,
2730};
2731
2732static struct clk mcbsp3_ick = {
2733 .name = "mcbsp_ick",
2734 .ops = &clkops_omap2_dflt_wait,
2735 .id = 3,
2736 .parent = &per_l4_ick,
2737 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2738 .enable_bit = OMAP3430_EN_MCBSP3_SHIFT,
2739 .clkdm_name = "per_clkdm",
2740 .recalc = &followparent_recalc,
2741};
2742
2743static struct clk mcbsp4_ick = {
2744 .name = "mcbsp_ick",
2745 .ops = &clkops_omap2_dflt_wait,
2746 .id = 4,
2747 .parent = &per_l4_ick,
2748 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2749 .enable_bit = OMAP3430_EN_MCBSP4_SHIFT,
2750 .clkdm_name = "per_clkdm",
2751 .recalc = &followparent_recalc,
2752};
2753
2754static const struct clksel mcbsp_234_clksel[] = {
2755 { .parent = &core_96m_fck, .rates = common_mcbsp_96m_rates },
2756 { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },
2757 { .parent = NULL }
2758};
2759
2760static struct clk mcbsp2_fck = {
2761 .name = "mcbsp_fck",
2762 .ops = &clkops_omap2_dflt_wait,
2763 .id = 2,
2764 .init = &omap2_init_clksel_parent,
2765 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2766 .enable_bit = OMAP3430_EN_MCBSP2_SHIFT,
2767 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
2768 .clksel_mask = OMAP2_MCBSP2_CLKS_MASK,
2769 .clksel = mcbsp_234_clksel,
2770 .clkdm_name = "per_clkdm",
2771 .recalc = &omap2_clksel_recalc,
2772};
2773
2774static struct clk mcbsp3_fck = {
2775 .name = "mcbsp_fck",
2776 .ops = &clkops_omap2_dflt_wait,
2777 .id = 3,
2778 .init = &omap2_init_clksel_parent,
2779 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2780 .enable_bit = OMAP3430_EN_MCBSP3_SHIFT,
2781 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1),
2782 .clksel_mask = OMAP2_MCBSP3_CLKS_MASK,
2783 .clksel = mcbsp_234_clksel,
2784 .clkdm_name = "per_clkdm",
2785 .recalc = &omap2_clksel_recalc,
2786};
2787
2788static struct clk mcbsp4_fck = {
2789 .name = "mcbsp_fck",
2790 .ops = &clkops_omap2_dflt_wait,
2791 .id = 4,
2792 .init = &omap2_init_clksel_parent,
2793 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2794 .enable_bit = OMAP3430_EN_MCBSP4_SHIFT,
2795 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1),
2796 .clksel_mask = OMAP2_MCBSP4_CLKS_MASK,
2797 .clksel = mcbsp_234_clksel,
2798 .clkdm_name = "per_clkdm",
2799 .recalc = &omap2_clksel_recalc,
2800};
2801
2802/* EMU clocks */
2803
2804/* More information: ARM Cortex-A8 Technical Reference Manual, sect 10.1 */
2805
2806static const struct clksel_rate emu_src_sys_rates[] = {
2807 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
2808 { .div = 0 },
2809};
2810
2811static const struct clksel_rate emu_src_core_rates[] = {
2812 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
2813 { .div = 0 },
2814};
2815
2816static const struct clksel_rate emu_src_per_rates[] = {
2817 { .div = 1, .val = 2, .flags = RATE_IN_343X | DEFAULT_RATE },
2818 { .div = 0 },
2819};
2820
2821static const struct clksel_rate emu_src_mpu_rates[] = {
2822 { .div = 1, .val = 3, .flags = RATE_IN_343X | DEFAULT_RATE },
2823 { .div = 0 },
2824};
2825
2826static const struct clksel emu_src_clksel[] = {
2827 { .parent = &sys_ck, .rates = emu_src_sys_rates },
2828 { .parent = &emu_core_alwon_ck, .rates = emu_src_core_rates },
2829 { .parent = &emu_per_alwon_ck, .rates = emu_src_per_rates },
2830 { .parent = &emu_mpu_alwon_ck, .rates = emu_src_mpu_rates },
2831 { .parent = NULL },
2832};
2833
2834/*
2835 * Like the clkout_src clocks, emu_src_clk is a virtual clock, existing only
2836 * to switch the source of some of the EMU clocks.
2837 * XXX Are there CLKEN bits for these EMU clks?
2838 */
2839static struct clk emu_src_ck = {
2840 .name = "emu_src_ck",
2841 .ops = &clkops_null,
2842 .init = &omap2_init_clksel_parent,
2843 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
2844 .clksel_mask = OMAP3430_MUX_CTRL_MASK,
2845 .clksel = emu_src_clksel,
2846 .clkdm_name = "emu_clkdm",
2847 .recalc = &omap2_clksel_recalc,
2848};
2849
2850static const struct clksel_rate pclk_emu_rates[] = {
2851 { .div = 2, .val = 2, .flags = RATE_IN_343X | DEFAULT_RATE },
2852 { .div = 3, .val = 3, .flags = RATE_IN_343X },
2853 { .div = 4, .val = 4, .flags = RATE_IN_343X },
2854 { .div = 6, .val = 6, .flags = RATE_IN_343X },
2855 { .div = 0 },
2856};
2857
2858static const struct clksel pclk_emu_clksel[] = {
2859 { .parent = &emu_src_ck, .rates = pclk_emu_rates },
2860 { .parent = NULL },
2861};
2862
2863static struct clk pclk_fck = {
2864 .name = "pclk_fck",
2865 .ops = &clkops_null,
2866 .init = &omap2_init_clksel_parent,
2867 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
2868 .clksel_mask = OMAP3430_CLKSEL_PCLK_MASK,
2869 .clksel = pclk_emu_clksel,
2870 .clkdm_name = "emu_clkdm",
2871 .recalc = &omap2_clksel_recalc,
2872};
2873
2874static const struct clksel_rate pclkx2_emu_rates[] = {
2875 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
2876 { .div = 2, .val = 2, .flags = RATE_IN_343X },
2877 { .div = 3, .val = 3, .flags = RATE_IN_343X },
2878 { .div = 0 },
2879};
2880
2881static const struct clksel pclkx2_emu_clksel[] = {
2882 { .parent = &emu_src_ck, .rates = pclkx2_emu_rates },
2883 { .parent = NULL },
2884};
2885
2886static struct clk pclkx2_fck = {
2887 .name = "pclkx2_fck",
2888 .ops = &clkops_null,
2889 .init = &omap2_init_clksel_parent,
2890 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
2891 .clksel_mask = OMAP3430_CLKSEL_PCLKX2_MASK,
2892 .clksel = pclkx2_emu_clksel,
2893 .clkdm_name = "emu_clkdm",
2894 .recalc = &omap2_clksel_recalc,
2895};
2896
2897static const struct clksel atclk_emu_clksel[] = {
2898 { .parent = &emu_src_ck, .rates = div2_rates },
2899 { .parent = NULL },
2900};
2901
2902static struct clk atclk_fck = {
2903 .name = "atclk_fck",
2904 .ops = &clkops_null,
2905 .init = &omap2_init_clksel_parent,
2906 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
2907 .clksel_mask = OMAP3430_CLKSEL_ATCLK_MASK,
2908 .clksel = atclk_emu_clksel,
2909 .clkdm_name = "emu_clkdm",
2910 .recalc = &omap2_clksel_recalc,
2911};
2912
2913static struct clk traceclk_src_fck = {
2914 .name = "traceclk_src_fck",
2915 .ops = &clkops_null,
2916 .init = &omap2_init_clksel_parent,
2917 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
2918 .clksel_mask = OMAP3430_TRACE_MUX_CTRL_MASK,
2919 .clksel = emu_src_clksel,
2920 .clkdm_name = "emu_clkdm",
2921 .recalc = &omap2_clksel_recalc,
2922};
2923
2924static const struct clksel_rate traceclk_rates[] = {
2925 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
2926 { .div = 2, .val = 2, .flags = RATE_IN_343X },
2927 { .div = 4, .val = 4, .flags = RATE_IN_343X },
2928 { .div = 0 },
2929};
2930
2931static const struct clksel traceclk_clksel[] = {
2932 { .parent = &traceclk_src_fck, .rates = traceclk_rates },
2933 { .parent = NULL },
2934};
2935
2936static struct clk traceclk_fck = {
2937 .name = "traceclk_fck",
2938 .ops = &clkops_null,
2939 .init = &omap2_init_clksel_parent,
2940 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
2941 .clksel_mask = OMAP3430_CLKSEL_TRACECLK_MASK,
2942 .clksel = traceclk_clksel,
2943 .clkdm_name = "emu_clkdm",
2944 .recalc = &omap2_clksel_recalc,
2945};
2946
2947/* SR clocks */
2948
2949/* SmartReflex fclk (VDD1) */
2950static struct clk sr1_fck = {
2951 .name = "sr1_fck",
2952 .ops = &clkops_omap2_dflt_wait,
2953 .parent = &sys_ck,
2954 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2955 .enable_bit = OMAP3430_EN_SR1_SHIFT,
2956 .recalc = &followparent_recalc,
2957};
2958
2959/* SmartReflex fclk (VDD2) */
2960static struct clk sr2_fck = {
2961 .name = "sr2_fck",
2962 .ops = &clkops_omap2_dflt_wait,
2963 .parent = &sys_ck,
2964 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2965 .enable_bit = OMAP3430_EN_SR2_SHIFT,
2966 .recalc = &followparent_recalc,
2967};
2968
2969static struct clk sr_l4_ick = {
2970 .name = "sr_l4_ick",
2971 .ops = &clkops_null, /* RMK: missing? */
2972 .parent = &l4_ick,
2973 .clkdm_name = "core_l4_clkdm",
2974 .recalc = &followparent_recalc,
2975};
2976
2977/* SECURE_32K_FCK clocks */
2978
2979static struct clk gpt12_fck = {
2980 .name = "gpt12_fck",
2981 .ops = &clkops_null,
2982 .parent = &secure_32k_fck,
2983 .recalc = &followparent_recalc,
2984};
2985
2986static struct clk wdt1_fck = {
2987 .name = "wdt1_fck",
2988 .ops = &clkops_null,
2989 .parent = &secure_32k_fck,
2990 .recalc = &followparent_recalc,
2991};
2992 14
2993#endif 15#endif
diff --git a/arch/arm/mach-omap2/clock3517.c b/arch/arm/mach-omap2/clock3517.c
new file mode 100644
index 000000000000..b496a9305e1c
--- /dev/null
+++ b/arch/arm/mach-omap2/clock3517.c
@@ -0,0 +1,124 @@
1/*
2 * OMAP3517/3505-specific clock framework functions
3 *
4 * Copyright (C) 2010 Texas Instruments, Inc.
5 * Copyright (C) 2010 Nokia Corporation
6 *
7 * Ranjith Lohithakshan
8 * Paul Walmsley
9 *
10 * Parts of this code are based on code written by
11 * Richard Woodruff, Tony Lindgren, Tuukka Tikkanen, Karthik Dasu,
12 * Russell King
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#undef DEBUG
19
20#include <linux/kernel.h>
21#include <linux/clk.h>
22#include <linux/io.h>
23
24#include <plat/clock.h>
25
26#include "clock.h"
27#include "clock3517.h"
28#include "cm.h"
29#include "cm-regbits-34xx.h"
30
31/*
32 * In AM35xx IPSS, the {ICK,FCK} enable bits for modules are exported
33 * in the same register at a bit offset of 0x8. The EN_ACK for ICK is
34 * at an offset of 4 from ICK enable bit.
35 */
36#define AM35XX_IPSS_ICK_MASK 0xF
37#define AM35XX_IPSS_ICK_EN_ACK_OFFSET 0x4
38#define AM35XX_IPSS_ICK_FCK_OFFSET 0x8
39#define AM35XX_IPSS_CLK_IDLEST_VAL 0
40
41/**
42 * am35xx_clk_find_idlest - return clock ACK info for AM35XX IPSS
43 * @clk: struct clk * being enabled
44 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
45 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
46 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
47 *
48 * The interface clocks on AM35xx IPSS reflects the clock idle status
49 * in the enable register itsel at a bit offset of 4 from the enable
50 * bit. A value of 1 indicates that clock is enabled.
51 */
52static void am35xx_clk_find_idlest(struct clk *clk,
53 void __iomem **idlest_reg,
54 u8 *idlest_bit,
55 u8 *idlest_val)
56{
57 *idlest_reg = (__force void __iomem *)(clk->enable_reg);
58 *idlest_bit = clk->enable_bit + AM35XX_IPSS_ICK_EN_ACK_OFFSET;
59 *idlest_val = AM35XX_IPSS_CLK_IDLEST_VAL;
60}
61
62/**
63 * am35xx_clk_find_companion - find companion clock to @clk
64 * @clk: struct clk * to find the companion clock of
65 * @other_reg: void __iomem ** to return the companion clock CM_*CLKEN va in
66 * @other_bit: u8 ** to return the companion clock bit shift in
67 *
68 * Some clocks don't have companion clocks. For example, modules with
69 * only an interface clock (such as HECC) don't have a companion
70 * clock. Right now, this code relies on the hardware exporting a bit
71 * in the correct companion register that indicates that the
72 * nonexistent 'companion clock' is active. Future patches will
73 * associate this type of code with per-module data structures to
74 * avoid this issue, and remove the casts. No return value.
75 */
76static void am35xx_clk_find_companion(struct clk *clk, void __iomem **other_reg,
77 u8 *other_bit)
78{
79 *other_reg = (__force void __iomem *)(clk->enable_reg);
80 if (clk->enable_bit & AM35XX_IPSS_ICK_MASK)
81 *other_bit = clk->enable_bit + AM35XX_IPSS_ICK_FCK_OFFSET;
82 else
83 *other_bit = clk->enable_bit - AM35XX_IPSS_ICK_FCK_OFFSET;
84}
85
86const struct clkops clkops_am35xx_ipss_module_wait = {
87 .enable = omap2_dflt_clk_enable,
88 .disable = omap2_dflt_clk_disable,
89 .find_idlest = am35xx_clk_find_idlest,
90 .find_companion = am35xx_clk_find_companion,
91};
92
93/**
94 * am35xx_clk_ipss_find_idlest - return CM_IDLEST info for IPSS
95 * @clk: struct clk * being enabled
96 * @idlest_reg: void __iomem ** to store CM_IDLEST reg address into
97 * @idlest_bit: pointer to a u8 to store the CM_IDLEST bit shift into
98 * @idlest_val: pointer to a u8 to store the CM_IDLEST indicator
99 *
100 * The IPSS target CM_IDLEST bit is at a different shift from the
101 * CM_{I,F}CLKEN bit. Pass back the correct info via @idlest_reg
102 * and @idlest_bit. No return value.
103 */
104static void am35xx_clk_ipss_find_idlest(struct clk *clk,
105 void __iomem **idlest_reg,
106 u8 *idlest_bit,
107 u8 *idlest_val)
108{
109 u32 r;
110
111 r = (((__force u32)clk->enable_reg & ~0xf0) | 0x20);
112 *idlest_reg = (__force void __iomem *)r;
113 *idlest_bit = AM35XX_ST_IPSS_SHIFT;
114 *idlest_val = OMAP34XX_CM_IDLEST_VAL;
115}
116
117const struct clkops clkops_am35xx_ipss_wait = {
118 .enable = omap2_dflt_clk_enable,
119 .disable = omap2_dflt_clk_disable,
120 .find_idlest = am35xx_clk_ipss_find_idlest,
121 .find_companion = omap2_clk_dflt_find_companion,
122};
123
124
diff --git a/arch/arm/mach-omap2/clock3517.h b/arch/arm/mach-omap2/clock3517.h
new file mode 100644
index 000000000000..ca5e5a64c2e2
--- /dev/null
+++ b/arch/arm/mach-omap2/clock3517.h
@@ -0,0 +1,14 @@
1/*
2 * OMAP3517/3505 clock function prototypes and macros
3 *
4 * Copyright (C) 2010 Texas Instruments, Inc.
5 * Copyright (C) 2010 Nokia Corporation
6 */
7
8#ifndef __ARCH_ARM_MACH_OMAP2_CLOCK3517_H
9#define __ARCH_ARM_MACH_OMAP2_CLOCK3517_H
10
11extern const struct clkops clkops_am35xx_ipss_module_wait;
12extern const struct clkops clkops_am35xx_ipss_wait;
13
14#endif
diff --git a/arch/arm/mach-omap2/clock36xx.c b/arch/arm/mach-omap2/clock36xx.c
new file mode 100644
index 000000000000..0c5e25ed8879
--- /dev/null
+++ b/arch/arm/mach-omap2/clock36xx.c
@@ -0,0 +1,72 @@
1/*
2 * OMAP36xx-specific clkops
3 *
4 * Copyright (C) 2010 Texas Instruments, Inc.
5 * Copyright (C) 2010 Nokia Corporation
6 *
7 * Mike Turquette
8 * Vijaykumar GN
9 * Paul Walmsley
10 *
11 * Parts of this code are based on code written by
12 * Richard Woodruff, Tony Lindgren, Tuukka Tikkanen, Karthik Dasu,
13 * Russell King
14 *
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License version 2 as
17 * published by the Free Software Foundation.
18 */
19#undef DEBUG
20
21#include <linux/kernel.h>
22#include <linux/clk.h>
23#include <linux/io.h>
24
25#include <plat/clock.h>
26
27#include "clock.h"
28#include "clock36xx.h"
29
30
31/**
32 * omap36xx_pwrdn_clk_enable_with_hsdiv_restore - enable clocks suffering
33 * from HSDivider PWRDN problem Implements Errata ID: i556.
34 * @clk: DPLL output struct clk
35 *
36 * 3630 only: dpll3_m3_ck, dpll4_m2_ck, dpll4_m3_ck, dpll4_m4_ck,
37 * dpll4_m5_ck & dpll4_m6_ck dividers gets loaded with reset
38 * valueafter their respective PWRDN bits are set. Any dummy write
39 * (Any other value different from the Read value) to the
40 * corresponding CM_CLKSEL register will refresh the dividers.
41 */
42static int omap36xx_pwrdn_clk_enable_with_hsdiv_restore(struct clk *clk)
43{
44 u32 dummy_v, orig_v, clksel_shift;
45 int ret;
46
47 /* Clear PWRDN bit of HSDIVIDER */
48 ret = omap2_dflt_clk_enable(clk);
49
50 /* Restore the dividers */
51 if (!ret) {
52 clksel_shift = __ffs(clk->parent->clksel_mask);
53 orig_v = __raw_readl(clk->parent->clksel_reg);
54 dummy_v = orig_v;
55
56 /* Write any other value different from the Read value */
57 dummy_v ^= (1 << clksel_shift);
58 __raw_writel(dummy_v, clk->parent->clksel_reg);
59
60 /* Write the original divider */
61 __raw_writel(orig_v, clk->parent->clksel_reg);
62 }
63
64 return ret;
65}
66
67const struct clkops clkops_omap36xx_pwrdn_with_hsdiv_wait_restore = {
68 .enable = omap36xx_pwrdn_clk_enable_with_hsdiv_restore,
69 .disable = omap2_dflt_clk_disable,
70 .find_companion = omap2_clk_dflt_find_companion,
71 .find_idlest = omap2_clk_dflt_find_idlest,
72};
diff --git a/arch/arm/mach-omap2/clock36xx.h b/arch/arm/mach-omap2/clock36xx.h
new file mode 100644
index 000000000000..a7dee5bc6364
--- /dev/null
+++ b/arch/arm/mach-omap2/clock36xx.h
@@ -0,0 +1,13 @@
1/*
2 * OMAP36xx clock function prototypes and macros
3 *
4 * Copyright (C) 2010 Texas Instruments, Inc.
5 * Copyright (C) 2010 Nokia Corporation
6 */
7
8#ifndef __ARCH_ARM_MACH_OMAP2_CLOCK36XX_H
9#define __ARCH_ARM_MACH_OMAP2_CLOCK36XX_H
10
11extern const struct clkops clkops_omap36xx_pwrdn_with_hsdiv_wait_restore;
12
13#endif
diff --git a/arch/arm/mach-omap2/clock3xxx.c b/arch/arm/mach-omap2/clock3xxx.c
new file mode 100644
index 000000000000..a447c4d2c28a
--- /dev/null
+++ b/arch/arm/mach-omap2/clock3xxx.c
@@ -0,0 +1,104 @@
1/*
2 * OMAP3-specific clock framework functions
3 *
4 * Copyright (C) 2007-2008 Texas Instruments, Inc.
5 * Copyright (C) 2007-2010 Nokia Corporation
6 *
7 * Paul Walmsley
8 * Jouni Högander
9 *
10 * Parts of this code are based on code written by
11 * Richard Woodruff, Tony Lindgren, Tuukka Tikkanen, Karthik Dasu
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License version 2 as
15 * published by the Free Software Foundation.
16 */
17#undef DEBUG
18
19#include <linux/kernel.h>
20#include <linux/errno.h>
21#include <linux/clk.h>
22#include <linux/io.h>
23
24#include <plat/clock.h>
25
26#include "clock.h"
27#include "clock3xxx.h"
28#include "prm.h"
29#include "prm-regbits-34xx.h"
30#include "cm.h"
31#include "cm-regbits-34xx.h"
32
33/*
34 * DPLL5_FREQ_FOR_USBHOST: USBHOST and USBTLL are the only clocks
35 * that are sourced by DPLL5, and both of these require this clock
36 * to be at 120 MHz for proper operation.
37 */
38#define DPLL5_FREQ_FOR_USBHOST 120000000
39
40/* needed by omap3_core_dpll_m2_set_rate() */
41struct clk *sdrc_ick_p, *arm_fck_p;
42
43int omap3_dpll4_set_rate(struct clk *clk, unsigned long rate)
44{
45 /*
46 * According to the 12-5 CDP code from TI, "Limitation 2.5"
47 * on 3430ES1 prevents us from changing DPLL multipliers or dividers
48 * on DPLL4.
49 */
50 if (omap_rev() == OMAP3430_REV_ES1_0) {
51 pr_err("clock: DPLL4 cannot change rate due to "
52 "silicon 'Limitation 2.5' on 3430ES1.\n");
53 return -EINVAL;
54 }
55
56 return omap3_noncore_dpll_set_rate(clk, rate);
57}
58
59void __init omap3_clk_lock_dpll5(void)
60{
61 struct clk *dpll5_clk;
62 struct clk *dpll5_m2_clk;
63
64 dpll5_clk = clk_get(NULL, "dpll5_ck");
65 clk_set_rate(dpll5_clk, DPLL5_FREQ_FOR_USBHOST);
66 clk_enable(dpll5_clk);
67
68 /* Enable autoidle to allow it to enter low power bypass */
69 omap3_dpll_allow_idle(dpll5_clk);
70
71 /* Program dpll5_m2_clk divider for no division */
72 dpll5_m2_clk = clk_get(NULL, "dpll5_m2_ck");
73 clk_enable(dpll5_m2_clk);
74 clk_set_rate(dpll5_m2_clk, DPLL5_FREQ_FOR_USBHOST);
75
76 clk_disable(dpll5_m2_clk);
77 clk_disable(dpll5_clk);
78 return;
79}
80
81/* Common clock code */
82
83/*
84 * Switch the MPU rate if specified on cmdline. We cannot do this
85 * early until cmdline is parsed. XXX This should be removed from the
86 * clock code and handled by the OPP layer code in the near future.
87 */
88static int __init omap3xxx_clk_arch_init(void)
89{
90 int ret;
91
92 if (!cpu_is_omap34xx())
93 return 0;
94
95 ret = omap2_clk_switch_mpurate_at_boot("dpll1_ck");
96 if (!ret)
97 omap2_clk_print_new_rates("osc_sys_ck", "arm_fck", "core_ck");
98
99 return ret;
100}
101
102arch_initcall(omap3xxx_clk_arch_init);
103
104
diff --git a/arch/arm/mach-omap2/clock3xxx.h b/arch/arm/mach-omap2/clock3xxx.h
new file mode 100644
index 000000000000..8bbeeaf399e2
--- /dev/null
+++ b/arch/arm/mach-omap2/clock3xxx.h
@@ -0,0 +1,21 @@
1/*
2 * OMAP3-common clock function prototypes and macros
3 *
4 * Copyright (C) 2007-2010 Texas Instruments, Inc.
5 * Copyright (C) 2007-2010 Nokia Corporation
6 */
7
8#ifndef __ARCH_ARM_MACH_OMAP2_CLOCK3XXX_H
9#define __ARCH_ARM_MACH_OMAP2_CLOCK3XXX_H
10
11int omap3xxx_clk_init(void);
12int omap3_dpll4_set_rate(struct clk *clk, unsigned long rate);
13int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate);
14void omap3_clk_lock_dpll5(void);
15
16extern struct clk *sdrc_ick_p;
17extern struct clk *arm_fck_p;
18
19extern const struct clkops clkops_noncore_dpll_ops;
20
21#endif
diff --git a/arch/arm/mach-omap2/clock3xxx_data.c b/arch/arm/mach-omap2/clock3xxx_data.c
new file mode 100644
index 000000000000..9cba5560519b
--- /dev/null
+++ b/arch/arm/mach-omap2/clock3xxx_data.c
@@ -0,0 +1,3601 @@
1/*
2 * OMAP3 clock data
3 *
4 * Copyright (C) 2007-2010 Texas Instruments, Inc.
5 * Copyright (C) 2007-2010 Nokia Corporation
6 *
7 * Written by Paul Walmsley
8 * With many device clock fixes by Kevin Hilman and Jouni Högander
9 * DPLL bypass clock support added by Roman Tereshonkov
10 *
11 */
12
13/*
14 * Virtual clocks are introduced as convenient tools.
15 * They are sources for other clocks and not supposed
16 * to be requested from drivers directly.
17 */
18
19#include <linux/kernel.h>
20#include <linux/clk.h>
21#include <linux/list.h>
22
23#include <plat/control.h>
24#include <plat/clkdev_omap.h>
25
26#include "clock.h"
27#include "clock3xxx.h"
28#include "clock34xx.h"
29#include "clock36xx.h"
30#include "clock3517.h"
31
32#include "cm.h"
33#include "cm-regbits-34xx.h"
34#include "prm.h"
35#include "prm-regbits-34xx.h"
36
37/*
38 * clocks
39 */
40
41#define OMAP_CM_REGADDR OMAP34XX_CM_REGADDR
42
43/* Maximum DPLL multiplier, divider values for OMAP3 */
44#define OMAP3_MAX_DPLL_MULT 2047
45#define OMAP3630_MAX_JTYPE_DPLL_MULT 4095
46#define OMAP3_MAX_DPLL_DIV 128
47
48/*
49 * DPLL1 supplies clock to the MPU.
50 * DPLL2 supplies clock to the IVA2.
51 * DPLL3 supplies CORE domain clocks.
52 * DPLL4 supplies peripheral clocks.
53 * DPLL5 supplies other peripheral clocks (USBHOST, USIM).
54 */
55
56/* Forward declarations for DPLL bypass clocks */
57static struct clk dpll1_fck;
58static struct clk dpll2_fck;
59
60/* PRM CLOCKS */
61
62/* According to timer32k.c, this is a 32768Hz clock, not a 32000Hz clock. */
63static struct clk omap_32k_fck = {
64 .name = "omap_32k_fck",
65 .ops = &clkops_null,
66 .rate = 32768,
67};
68
69static struct clk secure_32k_fck = {
70 .name = "secure_32k_fck",
71 .ops = &clkops_null,
72 .rate = 32768,
73};
74
75/* Virtual source clocks for osc_sys_ck */
76static struct clk virt_12m_ck = {
77 .name = "virt_12m_ck",
78 .ops = &clkops_null,
79 .rate = 12000000,
80};
81
82static struct clk virt_13m_ck = {
83 .name = "virt_13m_ck",
84 .ops = &clkops_null,
85 .rate = 13000000,
86};
87
88static struct clk virt_16_8m_ck = {
89 .name = "virt_16_8m_ck",
90 .ops = &clkops_null,
91 .rate = 16800000,
92};
93
94static struct clk virt_19_2m_ck = {
95 .name = "virt_19_2m_ck",
96 .ops = &clkops_null,
97 .rate = 19200000,
98};
99
100static struct clk virt_26m_ck = {
101 .name = "virt_26m_ck",
102 .ops = &clkops_null,
103 .rate = 26000000,
104};
105
106static struct clk virt_38_4m_ck = {
107 .name = "virt_38_4m_ck",
108 .ops = &clkops_null,
109 .rate = 38400000,
110};
111
112static const struct clksel_rate osc_sys_12m_rates[] = {
113 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
114 { .div = 0 }
115};
116
117static const struct clksel_rate osc_sys_13m_rates[] = {
118 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
119 { .div = 0 }
120};
121
122static const struct clksel_rate osc_sys_16_8m_rates[] = {
123 { .div = 1, .val = 5, .flags = RATE_IN_3430ES2 | DEFAULT_RATE },
124 { .div = 0 }
125};
126
127static const struct clksel_rate osc_sys_19_2m_rates[] = {
128 { .div = 1, .val = 2, .flags = RATE_IN_343X | DEFAULT_RATE },
129 { .div = 0 }
130};
131
132static const struct clksel_rate osc_sys_26m_rates[] = {
133 { .div = 1, .val = 3, .flags = RATE_IN_343X | DEFAULT_RATE },
134 { .div = 0 }
135};
136
137static const struct clksel_rate osc_sys_38_4m_rates[] = {
138 { .div = 1, .val = 4, .flags = RATE_IN_343X | DEFAULT_RATE },
139 { .div = 0 }
140};
141
142static const struct clksel osc_sys_clksel[] = {
143 { .parent = &virt_12m_ck, .rates = osc_sys_12m_rates },
144 { .parent = &virt_13m_ck, .rates = osc_sys_13m_rates },
145 { .parent = &virt_16_8m_ck, .rates = osc_sys_16_8m_rates },
146 { .parent = &virt_19_2m_ck, .rates = osc_sys_19_2m_rates },
147 { .parent = &virt_26m_ck, .rates = osc_sys_26m_rates },
148 { .parent = &virt_38_4m_ck, .rates = osc_sys_38_4m_rates },
149 { .parent = NULL },
150};
151
152/* Oscillator clock */
153/* 12, 13, 16.8, 19.2, 26, or 38.4 MHz */
154static struct clk osc_sys_ck = {
155 .name = "osc_sys_ck",
156 .ops = &clkops_null,
157 .init = &omap2_init_clksel_parent,
158 .clksel_reg = OMAP3430_PRM_CLKSEL,
159 .clksel_mask = OMAP3430_SYS_CLKIN_SEL_MASK,
160 .clksel = osc_sys_clksel,
161 /* REVISIT: deal with autoextclkmode? */
162 .recalc = &omap2_clksel_recalc,
163};
164
165static const struct clksel_rate div2_rates[] = {
166 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
167 { .div = 2, .val = 2, .flags = RATE_IN_343X },
168 { .div = 0 }
169};
170
171static const struct clksel sys_clksel[] = {
172 { .parent = &osc_sys_ck, .rates = div2_rates },
173 { .parent = NULL }
174};
175
176/* Latency: this clock is only enabled after PRM_CLKSETUP.SETUP_TIME */
177/* Feeds DPLLs - divided first by PRM_CLKSRC_CTRL.SYSCLKDIV? */
178static struct clk sys_ck = {
179 .name = "sys_ck",
180 .ops = &clkops_null,
181 .parent = &osc_sys_ck,
182 .init = &omap2_init_clksel_parent,
183 .clksel_reg = OMAP3430_PRM_CLKSRC_CTRL,
184 .clksel_mask = OMAP_SYSCLKDIV_MASK,
185 .clksel = sys_clksel,
186 .recalc = &omap2_clksel_recalc,
187};
188
189static struct clk sys_altclk = {
190 .name = "sys_altclk",
191 .ops = &clkops_null,
192};
193
194/* Optional external clock input for some McBSPs */
195static struct clk mcbsp_clks = {
196 .name = "mcbsp_clks",
197 .ops = &clkops_null,
198};
199
200/* PRM EXTERNAL CLOCK OUTPUT */
201
202static struct clk sys_clkout1 = {
203 .name = "sys_clkout1",
204 .ops = &clkops_omap2_dflt,
205 .parent = &osc_sys_ck,
206 .enable_reg = OMAP3430_PRM_CLKOUT_CTRL,
207 .enable_bit = OMAP3430_CLKOUT_EN_SHIFT,
208 .recalc = &followparent_recalc,
209};
210
211/* DPLLS */
212
213/* CM CLOCKS */
214
215static const struct clksel_rate div16_dpll_rates[] = {
216 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
217 { .div = 2, .val = 2, .flags = RATE_IN_343X },
218 { .div = 3, .val = 3, .flags = RATE_IN_343X },
219 { .div = 4, .val = 4, .flags = RATE_IN_343X },
220 { .div = 5, .val = 5, .flags = RATE_IN_343X },
221 { .div = 6, .val = 6, .flags = RATE_IN_343X },
222 { .div = 7, .val = 7, .flags = RATE_IN_343X },
223 { .div = 8, .val = 8, .flags = RATE_IN_343X },
224 { .div = 9, .val = 9, .flags = RATE_IN_343X },
225 { .div = 10, .val = 10, .flags = RATE_IN_343X },
226 { .div = 11, .val = 11, .flags = RATE_IN_343X },
227 { .div = 12, .val = 12, .flags = RATE_IN_343X },
228 { .div = 13, .val = 13, .flags = RATE_IN_343X },
229 { .div = 14, .val = 14, .flags = RATE_IN_343X },
230 { .div = 15, .val = 15, .flags = RATE_IN_343X },
231 { .div = 16, .val = 16, .flags = RATE_IN_343X },
232 { .div = 0 }
233};
234
235static const struct clksel_rate div32_dpll4_rates_3630[] = {
236 { .div = 1, .val = 1, .flags = RATE_IN_36XX | DEFAULT_RATE },
237 { .div = 2, .val = 2, .flags = RATE_IN_36XX },
238 { .div = 3, .val = 3, .flags = RATE_IN_36XX },
239 { .div = 4, .val = 4, .flags = RATE_IN_36XX },
240 { .div = 5, .val = 5, .flags = RATE_IN_36XX },
241 { .div = 6, .val = 6, .flags = RATE_IN_36XX },
242 { .div = 7, .val = 7, .flags = RATE_IN_36XX },
243 { .div = 8, .val = 8, .flags = RATE_IN_36XX },
244 { .div = 9, .val = 9, .flags = RATE_IN_36XX },
245 { .div = 10, .val = 10, .flags = RATE_IN_36XX },
246 { .div = 11, .val = 11, .flags = RATE_IN_36XX },
247 { .div = 12, .val = 12, .flags = RATE_IN_36XX },
248 { .div = 13, .val = 13, .flags = RATE_IN_36XX },
249 { .div = 14, .val = 14, .flags = RATE_IN_36XX },
250 { .div = 15, .val = 15, .flags = RATE_IN_36XX },
251 { .div = 16, .val = 16, .flags = RATE_IN_36XX },
252 { .div = 17, .val = 17, .flags = RATE_IN_36XX },
253 { .div = 18, .val = 18, .flags = RATE_IN_36XX },
254 { .div = 19, .val = 19, .flags = RATE_IN_36XX },
255 { .div = 20, .val = 20, .flags = RATE_IN_36XX },
256 { .div = 21, .val = 21, .flags = RATE_IN_36XX },
257 { .div = 22, .val = 22, .flags = RATE_IN_36XX },
258 { .div = 23, .val = 23, .flags = RATE_IN_36XX },
259 { .div = 24, .val = 24, .flags = RATE_IN_36XX },
260 { .div = 25, .val = 25, .flags = RATE_IN_36XX },
261 { .div = 26, .val = 26, .flags = RATE_IN_36XX },
262 { .div = 27, .val = 27, .flags = RATE_IN_36XX },
263 { .div = 28, .val = 28, .flags = RATE_IN_36XX },
264 { .div = 29, .val = 29, .flags = RATE_IN_36XX },
265 { .div = 30, .val = 30, .flags = RATE_IN_36XX },
266 { .div = 31, .val = 31, .flags = RATE_IN_36XX },
267 { .div = 32, .val = 32, .flags = RATE_IN_36XX },
268 { .div = 0 }
269};
270
271/* DPLL1 */
272/* MPU clock source */
273/* Type: DPLL */
274static struct dpll_data dpll1_dd = {
275 .mult_div1_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL),
276 .mult_mask = OMAP3430_MPU_DPLL_MULT_MASK,
277 .div1_mask = OMAP3430_MPU_DPLL_DIV_MASK,
278 .clk_bypass = &dpll1_fck,
279 .clk_ref = &sys_ck,
280 .freqsel_mask = OMAP3430_MPU_DPLL_FREQSEL_MASK,
281 .control_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKEN_PLL),
282 .enable_mask = OMAP3430_EN_MPU_DPLL_MASK,
283 .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
284 .auto_recal_bit = OMAP3430_EN_MPU_DPLL_DRIFTGUARD_SHIFT,
285 .recal_en_bit = OMAP3430_MPU_DPLL_RECAL_EN_SHIFT,
286 .recal_st_bit = OMAP3430_MPU_DPLL_ST_SHIFT,
287 .autoidle_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_AUTOIDLE_PLL),
288 .autoidle_mask = OMAP3430_AUTO_MPU_DPLL_MASK,
289 .idlest_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_IDLEST_PLL),
290 .idlest_mask = OMAP3430_ST_MPU_CLK_MASK,
291 .max_multiplier = OMAP3_MAX_DPLL_MULT,
292 .min_divider = 1,
293 .max_divider = OMAP3_MAX_DPLL_DIV,
294 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE
295};
296
297static struct clk dpll1_ck = {
298 .name = "dpll1_ck",
299 .ops = &clkops_null,
300 .parent = &sys_ck,
301 .dpll_data = &dpll1_dd,
302 .round_rate = &omap2_dpll_round_rate,
303 .set_rate = &omap3_noncore_dpll_set_rate,
304 .clkdm_name = "dpll1_clkdm",
305 .recalc = &omap3_dpll_recalc,
306};
307
308/*
309 * This virtual clock provides the CLKOUTX2 output from the DPLL if the
310 * DPLL isn't bypassed.
311 */
312static struct clk dpll1_x2_ck = {
313 .name = "dpll1_x2_ck",
314 .ops = &clkops_null,
315 .parent = &dpll1_ck,
316 .clkdm_name = "dpll1_clkdm",
317 .recalc = &omap3_clkoutx2_recalc,
318};
319
320/* On DPLL1, unlike other DPLLs, the divider is downstream from CLKOUTX2 */
321static const struct clksel div16_dpll1_x2m2_clksel[] = {
322 { .parent = &dpll1_x2_ck, .rates = div16_dpll_rates },
323 { .parent = NULL }
324};
325
326/*
327 * Does not exist in the TRM - needed to separate the M2 divider from
328 * bypass selection in mpu_ck
329 */
330static struct clk dpll1_x2m2_ck = {
331 .name = "dpll1_x2m2_ck",
332 .ops = &clkops_null,
333 .parent = &dpll1_x2_ck,
334 .init = &omap2_init_clksel_parent,
335 .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL2_PLL),
336 .clksel_mask = OMAP3430_MPU_DPLL_CLKOUT_DIV_MASK,
337 .clksel = div16_dpll1_x2m2_clksel,
338 .clkdm_name = "dpll1_clkdm",
339 .recalc = &omap2_clksel_recalc,
340};
341
342/* DPLL2 */
343/* IVA2 clock source */
344/* Type: DPLL */
345
346static struct dpll_data dpll2_dd = {
347 .mult_div1_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSEL1_PLL),
348 .mult_mask = OMAP3430_IVA2_DPLL_MULT_MASK,
349 .div1_mask = OMAP3430_IVA2_DPLL_DIV_MASK,
350 .clk_bypass = &dpll2_fck,
351 .clk_ref = &sys_ck,
352 .freqsel_mask = OMAP3430_IVA2_DPLL_FREQSEL_MASK,
353 .control_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKEN_PLL),
354 .enable_mask = OMAP3430_EN_IVA2_DPLL_MASK,
355 .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED) |
356 (1 << DPLL_LOW_POWER_BYPASS),
357 .auto_recal_bit = OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_SHIFT,
358 .recal_en_bit = OMAP3430_PRM_IRQENABLE_MPU_IVA2_DPLL_RECAL_EN_SHIFT,
359 .recal_st_bit = OMAP3430_PRM_IRQSTATUS_MPU_IVA2_DPLL_ST_SHIFT,
360 .autoidle_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_AUTOIDLE_PLL),
361 .autoidle_mask = OMAP3430_AUTO_IVA2_DPLL_MASK,
362 .idlest_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_IDLEST_PLL),
363 .idlest_mask = OMAP3430_ST_IVA2_CLK_MASK,
364 .max_multiplier = OMAP3_MAX_DPLL_MULT,
365 .min_divider = 1,
366 .max_divider = OMAP3_MAX_DPLL_DIV,
367 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE
368};
369
370static struct clk dpll2_ck = {
371 .name = "dpll2_ck",
372 .ops = &clkops_omap3_noncore_dpll_ops,
373 .parent = &sys_ck,
374 .dpll_data = &dpll2_dd,
375 .round_rate = &omap2_dpll_round_rate,
376 .set_rate = &omap3_noncore_dpll_set_rate,
377 .clkdm_name = "dpll2_clkdm",
378 .recalc = &omap3_dpll_recalc,
379};
380
381static const struct clksel div16_dpll2_m2x2_clksel[] = {
382 { .parent = &dpll2_ck, .rates = div16_dpll_rates },
383 { .parent = NULL }
384};
385
386/*
387 * The TRM is conflicted on whether IVA2 clock comes from DPLL2 CLKOUT
388 * or CLKOUTX2. CLKOUT seems most plausible.
389 */
390static struct clk dpll2_m2_ck = {
391 .name = "dpll2_m2_ck",
392 .ops = &clkops_null,
393 .parent = &dpll2_ck,
394 .init = &omap2_init_clksel_parent,
395 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD,
396 OMAP3430_CM_CLKSEL2_PLL),
397 .clksel_mask = OMAP3430_IVA2_DPLL_CLKOUT_DIV_MASK,
398 .clksel = div16_dpll2_m2x2_clksel,
399 .clkdm_name = "dpll2_clkdm",
400 .recalc = &omap2_clksel_recalc,
401};
402
403/*
404 * DPLL3
405 * Source clock for all interfaces and for some device fclks
406 * REVISIT: Also supports fast relock bypass - not included below
407 */
408static struct dpll_data dpll3_dd = {
409 .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
410 .mult_mask = OMAP3430_CORE_DPLL_MULT_MASK,
411 .div1_mask = OMAP3430_CORE_DPLL_DIV_MASK,
412 .clk_bypass = &sys_ck,
413 .clk_ref = &sys_ck,
414 .freqsel_mask = OMAP3430_CORE_DPLL_FREQSEL_MASK,
415 .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
416 .enable_mask = OMAP3430_EN_CORE_DPLL_MASK,
417 .auto_recal_bit = OMAP3430_EN_CORE_DPLL_DRIFTGUARD_SHIFT,
418 .recal_en_bit = OMAP3430_CORE_DPLL_RECAL_EN_SHIFT,
419 .recal_st_bit = OMAP3430_CORE_DPLL_ST_SHIFT,
420 .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, CM_AUTOIDLE),
421 .autoidle_mask = OMAP3430_AUTO_CORE_DPLL_MASK,
422 .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST),
423 .idlest_mask = OMAP3430_ST_CORE_CLK_MASK,
424 .max_multiplier = OMAP3_MAX_DPLL_MULT,
425 .min_divider = 1,
426 .max_divider = OMAP3_MAX_DPLL_DIV,
427 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE
428};
429
430static struct clk dpll3_ck = {
431 .name = "dpll3_ck",
432 .ops = &clkops_null,
433 .parent = &sys_ck,
434 .dpll_data = &dpll3_dd,
435 .round_rate = &omap2_dpll_round_rate,
436 .clkdm_name = "dpll3_clkdm",
437 .recalc = &omap3_dpll_recalc,
438};
439
440/*
441 * This virtual clock provides the CLKOUTX2 output from the DPLL if the
442 * DPLL isn't bypassed
443 */
444static struct clk dpll3_x2_ck = {
445 .name = "dpll3_x2_ck",
446 .ops = &clkops_null,
447 .parent = &dpll3_ck,
448 .clkdm_name = "dpll3_clkdm",
449 .recalc = &omap3_clkoutx2_recalc,
450};
451
452static const struct clksel_rate div31_dpll3_rates[] = {
453 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
454 { .div = 2, .val = 2, .flags = RATE_IN_343X },
455 { .div = 3, .val = 3, .flags = RATE_IN_3430ES2 },
456 { .div = 4, .val = 4, .flags = RATE_IN_3430ES2 },
457 { .div = 5, .val = 5, .flags = RATE_IN_3430ES2 },
458 { .div = 6, .val = 6, .flags = RATE_IN_3430ES2 },
459 { .div = 7, .val = 7, .flags = RATE_IN_3430ES2 },
460 { .div = 8, .val = 8, .flags = RATE_IN_3430ES2 },
461 { .div = 9, .val = 9, .flags = RATE_IN_3430ES2 },
462 { .div = 10, .val = 10, .flags = RATE_IN_3430ES2 },
463 { .div = 11, .val = 11, .flags = RATE_IN_3430ES2 },
464 { .div = 12, .val = 12, .flags = RATE_IN_3430ES2 },
465 { .div = 13, .val = 13, .flags = RATE_IN_3430ES2 },
466 { .div = 14, .val = 14, .flags = RATE_IN_3430ES2 },
467 { .div = 15, .val = 15, .flags = RATE_IN_3430ES2 },
468 { .div = 16, .val = 16, .flags = RATE_IN_3430ES2 },
469 { .div = 17, .val = 17, .flags = RATE_IN_3430ES2 },
470 { .div = 18, .val = 18, .flags = RATE_IN_3430ES2 },
471 { .div = 19, .val = 19, .flags = RATE_IN_3430ES2 },
472 { .div = 20, .val = 20, .flags = RATE_IN_3430ES2 },
473 { .div = 21, .val = 21, .flags = RATE_IN_3430ES2 },
474 { .div = 22, .val = 22, .flags = RATE_IN_3430ES2 },
475 { .div = 23, .val = 23, .flags = RATE_IN_3430ES2 },
476 { .div = 24, .val = 24, .flags = RATE_IN_3430ES2 },
477 { .div = 25, .val = 25, .flags = RATE_IN_3430ES2 },
478 { .div = 26, .val = 26, .flags = RATE_IN_3430ES2 },
479 { .div = 27, .val = 27, .flags = RATE_IN_3430ES2 },
480 { .div = 28, .val = 28, .flags = RATE_IN_3430ES2 },
481 { .div = 29, .val = 29, .flags = RATE_IN_3430ES2 },
482 { .div = 30, .val = 30, .flags = RATE_IN_3430ES2 },
483 { .div = 31, .val = 31, .flags = RATE_IN_3430ES2 },
484 { .div = 0 },
485};
486
487static const struct clksel div31_dpll3m2_clksel[] = {
488 { .parent = &dpll3_ck, .rates = div31_dpll3_rates },
489 { .parent = NULL }
490};
491
492/* DPLL3 output M2 - primary control point for CORE speed */
493static struct clk dpll3_m2_ck = {
494 .name = "dpll3_m2_ck",
495 .ops = &clkops_null,
496 .parent = &dpll3_ck,
497 .init = &omap2_init_clksel_parent,
498 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
499 .clksel_mask = OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK,
500 .clksel = div31_dpll3m2_clksel,
501 .clkdm_name = "dpll3_clkdm",
502 .round_rate = &omap2_clksel_round_rate,
503 .set_rate = &omap3_core_dpll_m2_set_rate,
504 .recalc = &omap2_clksel_recalc,
505};
506
507static struct clk core_ck = {
508 .name = "core_ck",
509 .ops = &clkops_null,
510 .parent = &dpll3_m2_ck,
511 .recalc = &followparent_recalc,
512};
513
514static struct clk dpll3_m2x2_ck = {
515 .name = "dpll3_m2x2_ck",
516 .ops = &clkops_null,
517 .parent = &dpll3_m2_ck,
518 .clkdm_name = "dpll3_clkdm",
519 .recalc = &omap3_clkoutx2_recalc,
520};
521
522/* The PWRDN bit is apparently only available on 3430ES2 and above */
523static const struct clksel div16_dpll3_clksel[] = {
524 { .parent = &dpll3_ck, .rates = div16_dpll_rates },
525 { .parent = NULL }
526};
527
528/* This virtual clock is the source for dpll3_m3x2_ck */
529static struct clk dpll3_m3_ck = {
530 .name = "dpll3_m3_ck",
531 .ops = &clkops_null,
532 .parent = &dpll3_ck,
533 .init = &omap2_init_clksel_parent,
534 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
535 .clksel_mask = OMAP3430_DIV_DPLL3_MASK,
536 .clksel = div16_dpll3_clksel,
537 .clkdm_name = "dpll3_clkdm",
538 .recalc = &omap2_clksel_recalc,
539};
540
541/* The PWRDN bit is apparently only available on 3430ES2 and above */
542static struct clk dpll3_m3x2_ck = {
543 .name = "dpll3_m3x2_ck",
544 .ops = &clkops_omap2_dflt_wait,
545 .parent = &dpll3_m3_ck,
546 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
547 .enable_bit = OMAP3430_PWRDN_EMU_CORE_SHIFT,
548 .flags = INVERT_ENABLE,
549 .clkdm_name = "dpll3_clkdm",
550 .recalc = &omap3_clkoutx2_recalc,
551};
552
553static struct clk emu_core_alwon_ck = {
554 .name = "emu_core_alwon_ck",
555 .ops = &clkops_null,
556 .parent = &dpll3_m3x2_ck,
557 .clkdm_name = "dpll3_clkdm",
558 .recalc = &followparent_recalc,
559};
560
561/* DPLL4 */
562/* Supplies 96MHz, 54Mhz TV DAC, DSS fclk, CAM sensor clock, emul trace clk */
563/* Type: DPLL */
564static struct dpll_data dpll4_dd;
565static struct dpll_data dpll4_dd_34xx __initdata = {
566 .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL2),
567 .mult_mask = OMAP3430_PERIPH_DPLL_MULT_MASK,
568 .div1_mask = OMAP3430_PERIPH_DPLL_DIV_MASK,
569 .clk_bypass = &sys_ck,
570 .clk_ref = &sys_ck,
571 .freqsel_mask = OMAP3430_PERIPH_DPLL_FREQSEL_MASK,
572 .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
573 .enable_mask = OMAP3430_EN_PERIPH_DPLL_MASK,
574 .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED),
575 .auto_recal_bit = OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_SHIFT,
576 .recal_en_bit = OMAP3430_PERIPH_DPLL_RECAL_EN_SHIFT,
577 .recal_st_bit = OMAP3430_PERIPH_DPLL_ST_SHIFT,
578 .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, CM_AUTOIDLE),
579 .autoidle_mask = OMAP3430_AUTO_PERIPH_DPLL_MASK,
580 .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST),
581 .idlest_mask = OMAP3430_ST_PERIPH_CLK_MASK,
582 .max_multiplier = OMAP3_MAX_DPLL_MULT,
583 .min_divider = 1,
584 .max_divider = OMAP3_MAX_DPLL_DIV,
585 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE
586};
587
588static struct dpll_data dpll4_dd_3630 __initdata = {
589 .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL2),
590 .mult_mask = OMAP3630_PERIPH_DPLL_MULT_MASK,
591 .div1_mask = OMAP3430_PERIPH_DPLL_DIV_MASK,
592 .clk_bypass = &sys_ck,
593 .clk_ref = &sys_ck,
594 .control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
595 .enable_mask = OMAP3430_EN_PERIPH_DPLL_MASK,
596 .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED),
597 .auto_recal_bit = OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_SHIFT,
598 .recal_en_bit = OMAP3430_PERIPH_DPLL_RECAL_EN_SHIFT,
599 .recal_st_bit = OMAP3430_PERIPH_DPLL_ST_SHIFT,
600 .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, CM_AUTOIDLE),
601 .autoidle_mask = OMAP3430_AUTO_PERIPH_DPLL_MASK,
602 .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST),
603 .idlest_mask = OMAP3430_ST_PERIPH_CLK_MASK,
604 .max_multiplier = OMAP3630_MAX_JTYPE_DPLL_MULT,
605 .min_divider = 1,
606 .max_divider = OMAP3_MAX_DPLL_DIV,
607 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE,
608 .flags = DPLL_J_TYPE
609};
610
611static struct clk dpll4_ck = {
612 .name = "dpll4_ck",
613 .ops = &clkops_omap3_noncore_dpll_ops,
614 .parent = &sys_ck,
615 .dpll_data = &dpll4_dd,
616 .round_rate = &omap2_dpll_round_rate,
617 .set_rate = &omap3_dpll4_set_rate,
618 .clkdm_name = "dpll4_clkdm",
619 .recalc = &omap3_dpll_recalc,
620};
621
622/*
623 * This virtual clock provides the CLKOUTX2 output from the DPLL if the
624 * DPLL isn't bypassed --
625 * XXX does this serve any downstream clocks?
626 */
627static struct clk dpll4_x2_ck = {
628 .name = "dpll4_x2_ck",
629 .ops = &clkops_null,
630 .parent = &dpll4_ck,
631 .clkdm_name = "dpll4_clkdm",
632 .recalc = &omap3_clkoutx2_recalc,
633};
634
635static const struct clksel div16_dpll4_clksel[] = {
636 { .parent = &dpll4_ck, .rates = div16_dpll_rates },
637 { .parent = NULL }
638};
639
640static const struct clksel div32_dpll4_clksel[] = {
641 { .parent = &dpll4_ck, .rates = div32_dpll4_rates_3630 },
642 { .parent = NULL }
643};
644
645/* This virtual clock is the source for dpll4_m2x2_ck */
646static struct clk dpll4_m2_ck;
647
648static struct clk dpll4_m2_ck_34xx __initdata = {
649 .name = "dpll4_m2_ck",
650 .ops = &clkops_null,
651 .parent = &dpll4_ck,
652 .init = &omap2_init_clksel_parent,
653 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430_CM_CLKSEL3),
654 .clksel_mask = OMAP3430_DIV_96M_MASK,
655 .clksel = div16_dpll4_clksel,
656 .clkdm_name = "dpll4_clkdm",
657 .recalc = &omap2_clksel_recalc,
658};
659
660static struct clk dpll4_m2_ck_3630 __initdata = {
661 .name = "dpll4_m2_ck",
662 .ops = &clkops_null,
663 .parent = &dpll4_ck,
664 .init = &omap2_init_clksel_parent,
665 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430_CM_CLKSEL3),
666 .clksel_mask = OMAP3630_DIV_96M_MASK,
667 .clksel = div32_dpll4_clksel,
668 .clkdm_name = "dpll4_clkdm",
669 .recalc = &omap2_clksel_recalc,
670};
671
672/* The PWRDN bit is apparently only available on 3430ES2 and above */
673static struct clk dpll4_m2x2_ck = {
674 .name = "dpll4_m2x2_ck",
675 .ops = &clkops_omap2_dflt_wait,
676 .parent = &dpll4_m2_ck,
677 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
678 .enable_bit = OMAP3430_PWRDN_96M_SHIFT,
679 .flags = INVERT_ENABLE,
680 .clkdm_name = "dpll4_clkdm",
681 .recalc = &omap3_clkoutx2_recalc,
682};
683
684/*
685 * DPLL4 generates DPLL4_M2X2_CLK which is then routed into the PRM as
686 * PRM_96M_ALWON_(F)CLK. Two clocks then emerge from the PRM:
687 * 96M_ALWON_FCLK (called "omap_96m_alwon_fck" below) and
688 * CM_96K_(F)CLK.
689 */
690
691/* Adding 192MHz Clock node needed by SGX */
692static struct clk omap_192m_alwon_fck = {
693 .name = "omap_192m_alwon_fck",
694 .ops = &clkops_null,
695 .parent = &dpll4_m2x2_ck,
696 .recalc = &followparent_recalc,
697};
698
699static const struct clksel_rate omap_96m_alwon_fck_rates[] = {
700 { .div = 1, .val = 1, .flags = RATE_IN_36XX },
701 { .div = 2, .val = 2, .flags = RATE_IN_36XX | DEFAULT_RATE },
702 { .div = 0 }
703};
704
705static const struct clksel omap_96m_alwon_fck_clksel[] = {
706 { .parent = &omap_192m_alwon_fck, .rates = omap_96m_alwon_fck_rates },
707 { .parent = NULL }
708};
709
710static const struct clksel_rate omap_96m_dpll_rates[] = {
711 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
712 { .div = 0 }
713};
714
715static const struct clksel_rate omap_96m_sys_rates[] = {
716 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
717 { .div = 0 }
718};
719
720static struct clk omap_96m_alwon_fck = {
721 .name = "omap_96m_alwon_fck",
722 .ops = &clkops_null,
723 .parent = &dpll4_m2x2_ck,
724 .recalc = &followparent_recalc,
725};
726
727static struct clk omap_96m_alwon_fck_3630 = {
728 .name = "omap_96m_alwon_fck",
729 .parent = &omap_192m_alwon_fck,
730 .init = &omap2_init_clksel_parent,
731 .ops = &clkops_null,
732 .recalc = &omap2_clksel_recalc,
733 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
734 .clksel_mask = OMAP3630_CLKSEL_96M_MASK,
735 .clksel = omap_96m_alwon_fck_clksel
736};
737
738static struct clk cm_96m_fck = {
739 .name = "cm_96m_fck",
740 .ops = &clkops_null,
741 .parent = &omap_96m_alwon_fck,
742 .recalc = &followparent_recalc,
743};
744
745static const struct clksel omap_96m_fck_clksel[] = {
746 { .parent = &cm_96m_fck, .rates = omap_96m_dpll_rates },
747 { .parent = &sys_ck, .rates = omap_96m_sys_rates },
748 { .parent = NULL }
749};
750
751static struct clk omap_96m_fck = {
752 .name = "omap_96m_fck",
753 .ops = &clkops_null,
754 .parent = &sys_ck,
755 .init = &omap2_init_clksel_parent,
756 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
757 .clksel_mask = OMAP3430_SOURCE_96M_MASK,
758 .clksel = omap_96m_fck_clksel,
759 .recalc = &omap2_clksel_recalc,
760};
761
762/* This virtual clock is the source for dpll4_m3x2_ck */
763static struct clk dpll4_m3_ck;
764
765static struct clk dpll4_m3_ck_34xx __initdata = {
766 .name = "dpll4_m3_ck",
767 .ops = &clkops_null,
768 .parent = &dpll4_ck,
769 .init = &omap2_init_clksel_parent,
770 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL),
771 .clksel_mask = OMAP3430_CLKSEL_TV_MASK,
772 .clksel = div16_dpll4_clksel,
773 .clkdm_name = "dpll4_clkdm",
774 .recalc = &omap2_clksel_recalc,
775};
776
777static struct clk dpll4_m3_ck_3630 __initdata = {
778 .name = "dpll4_m3_ck",
779 .ops = &clkops_null,
780 .parent = &dpll4_ck,
781 .init = &omap2_init_clksel_parent,
782 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL),
783 .clksel_mask = OMAP3630_CLKSEL_TV_MASK,
784 .clksel = div32_dpll4_clksel,
785 .clkdm_name = "dpll4_clkdm",
786 .recalc = &omap2_clksel_recalc,
787};
788
789/* The PWRDN bit is apparently only available on 3430ES2 and above */
790static struct clk dpll4_m3x2_ck = {
791 .name = "dpll4_m3x2_ck",
792 .ops = &clkops_omap2_dflt_wait,
793 .parent = &dpll4_m3_ck,
794 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
795 .enable_bit = OMAP3430_PWRDN_TV_SHIFT,
796 .flags = INVERT_ENABLE,
797 .clkdm_name = "dpll4_clkdm",
798 .recalc = &omap3_clkoutx2_recalc,
799};
800
801static const struct clksel_rate omap_54m_d4m3x2_rates[] = {
802 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
803 { .div = 0 }
804};
805
806static const struct clksel_rate omap_54m_alt_rates[] = {
807 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
808 { .div = 0 }
809};
810
811static const struct clksel omap_54m_clksel[] = {
812 { .parent = &dpll4_m3x2_ck, .rates = omap_54m_d4m3x2_rates },
813 { .parent = &sys_altclk, .rates = omap_54m_alt_rates },
814 { .parent = NULL }
815};
816
817static struct clk omap_54m_fck = {
818 .name = "omap_54m_fck",
819 .ops = &clkops_null,
820 .init = &omap2_init_clksel_parent,
821 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
822 .clksel_mask = OMAP3430_SOURCE_54M_MASK,
823 .clksel = omap_54m_clksel,
824 .recalc = &omap2_clksel_recalc,
825};
826
827static const struct clksel_rate omap_48m_cm96m_rates[] = {
828 { .div = 2, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
829 { .div = 0 }
830};
831
832static const struct clksel_rate omap_48m_alt_rates[] = {
833 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
834 { .div = 0 }
835};
836
837static const struct clksel omap_48m_clksel[] = {
838 { .parent = &cm_96m_fck, .rates = omap_48m_cm96m_rates },
839 { .parent = &sys_altclk, .rates = omap_48m_alt_rates },
840 { .parent = NULL }
841};
842
843static struct clk omap_48m_fck = {
844 .name = "omap_48m_fck",
845 .ops = &clkops_null,
846 .init = &omap2_init_clksel_parent,
847 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),
848 .clksel_mask = OMAP3430_SOURCE_48M_MASK,
849 .clksel = omap_48m_clksel,
850 .recalc = &omap2_clksel_recalc,
851};
852
853static struct clk omap_12m_fck = {
854 .name = "omap_12m_fck",
855 .ops = &clkops_null,
856 .parent = &omap_48m_fck,
857 .fixed_div = 4,
858 .recalc = &omap_fixed_divisor_recalc,
859};
860
861/* This virstual clock is the source for dpll4_m4x2_ck */
862static struct clk dpll4_m4_ck;
863
864static struct clk dpll4_m4_ck_34xx __initdata = {
865 .name = "dpll4_m4_ck",
866 .ops = &clkops_null,
867 .parent = &dpll4_ck,
868 .init = &omap2_init_clksel_parent,
869 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL),
870 .clksel_mask = OMAP3430_CLKSEL_DSS1_MASK,
871 .clksel = div16_dpll4_clksel,
872 .clkdm_name = "dpll4_clkdm",
873 .recalc = &omap2_clksel_recalc,
874 .set_rate = &omap2_clksel_set_rate,
875 .round_rate = &omap2_clksel_round_rate,
876};
877
878static struct clk dpll4_m4_ck_3630 __initdata = {
879 .name = "dpll4_m4_ck",
880 .ops = &clkops_null,
881 .parent = &dpll4_ck,
882 .init = &omap2_init_clksel_parent,
883 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_CLKSEL),
884 .clksel_mask = OMAP3630_CLKSEL_DSS1_MASK,
885 .clksel = div32_dpll4_clksel,
886 .clkdm_name = "dpll4_clkdm",
887 .recalc = &omap2_clksel_recalc,
888 .set_rate = &omap2_clksel_set_rate,
889 .round_rate = &omap2_clksel_round_rate,
890};
891
892/* The PWRDN bit is apparently only available on 3430ES2 and above */
893static struct clk dpll4_m4x2_ck = {
894 .name = "dpll4_m4x2_ck",
895 .ops = &clkops_omap2_dflt_wait,
896 .parent = &dpll4_m4_ck,
897 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
898 .enable_bit = OMAP3430_PWRDN_DSS1_SHIFT,
899 .flags = INVERT_ENABLE,
900 .clkdm_name = "dpll4_clkdm",
901 .recalc = &omap3_clkoutx2_recalc,
902};
903
904/* This virtual clock is the source for dpll4_m5x2_ck */
905static struct clk dpll4_m5_ck;
906
907static struct clk dpll4_m5_ck_34xx __initdata = {
908 .name = "dpll4_m5_ck",
909 .ops = &clkops_null,
910 .parent = &dpll4_ck,
911 .init = &omap2_init_clksel_parent,
912 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_CLKSEL),
913 .clksel_mask = OMAP3430_CLKSEL_CAM_MASK,
914 .clksel = div16_dpll4_clksel,
915 .clkdm_name = "dpll4_clkdm",
916 .set_rate = &omap2_clksel_set_rate,
917 .round_rate = &omap2_clksel_round_rate,
918 .recalc = &omap2_clksel_recalc,
919};
920
921static struct clk dpll4_m5_ck_3630 __initdata = {
922 .name = "dpll4_m5_ck",
923 .ops = &clkops_null,
924 .parent = &dpll4_ck,
925 .init = &omap2_init_clksel_parent,
926 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_CLKSEL),
927 .clksel_mask = OMAP3630_CLKSEL_CAM_MASK,
928 .clksel = div32_dpll4_clksel,
929 .clkdm_name = "dpll4_clkdm",
930 .set_rate = &omap2_clksel_set_rate,
931 .round_rate = &omap2_clksel_round_rate,
932 .recalc = &omap2_clksel_recalc,
933};
934
935/* The PWRDN bit is apparently only available on 3430ES2 and above */
936static struct clk dpll4_m5x2_ck = {
937 .name = "dpll4_m5x2_ck",
938 .ops = &clkops_omap2_dflt_wait,
939 .parent = &dpll4_m5_ck,
940 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
941 .enable_bit = OMAP3430_PWRDN_CAM_SHIFT,
942 .flags = INVERT_ENABLE,
943 .clkdm_name = "dpll4_clkdm",
944 .recalc = &omap3_clkoutx2_recalc,
945};
946
947/* This virtual clock is the source for dpll4_m6x2_ck */
948static struct clk dpll4_m6_ck;
949
950static struct clk dpll4_m6_ck_34xx __initdata = {
951 .name = "dpll4_m6_ck",
952 .ops = &clkops_null,
953 .parent = &dpll4_ck,
954 .init = &omap2_init_clksel_parent,
955 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
956 .clksel_mask = OMAP3430_DIV_DPLL4_MASK,
957 .clksel = div16_dpll4_clksel,
958 .clkdm_name = "dpll4_clkdm",
959 .recalc = &omap2_clksel_recalc,
960};
961
962static struct clk dpll4_m6_ck_3630 __initdata = {
963 .name = "dpll4_m6_ck",
964 .ops = &clkops_null,
965 .parent = &dpll4_ck,
966 .init = &omap2_init_clksel_parent,
967 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
968 .clksel_mask = OMAP3630_DIV_DPLL4_MASK,
969 .clksel = div32_dpll4_clksel,
970 .clkdm_name = "dpll4_clkdm",
971 .recalc = &omap2_clksel_recalc,
972};
973
974/* The PWRDN bit is apparently only available on 3430ES2 and above */
975static struct clk dpll4_m6x2_ck = {
976 .name = "dpll4_m6x2_ck",
977 .ops = &clkops_omap2_dflt_wait,
978 .parent = &dpll4_m6_ck,
979 .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
980 .enable_bit = OMAP3430_PWRDN_EMU_PERIPH_SHIFT,
981 .flags = INVERT_ENABLE,
982 .clkdm_name = "dpll4_clkdm",
983 .recalc = &omap3_clkoutx2_recalc,
984};
985
986static struct clk emu_per_alwon_ck = {
987 .name = "emu_per_alwon_ck",
988 .ops = &clkops_null,
989 .parent = &dpll4_m6x2_ck,
990 .clkdm_name = "dpll4_clkdm",
991 .recalc = &followparent_recalc,
992};
993
994/* DPLL5 */
995/* Supplies 120MHz clock, USIM source clock */
996/* Type: DPLL */
997/* 3430ES2 only */
998static struct dpll_data dpll5_dd = {
999 .mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKSEL4),
1000 .mult_mask = OMAP3430ES2_PERIPH2_DPLL_MULT_MASK,
1001 .div1_mask = OMAP3430ES2_PERIPH2_DPLL_DIV_MASK,
1002 .clk_bypass = &sys_ck,
1003 .clk_ref = &sys_ck,
1004 .freqsel_mask = OMAP3430ES2_PERIPH2_DPLL_FREQSEL_MASK,
1005 .control_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKEN2),
1006 .enable_mask = OMAP3430ES2_EN_PERIPH2_DPLL_MASK,
1007 .modes = (1 << DPLL_LOW_POWER_STOP) | (1 << DPLL_LOCKED),
1008 .auto_recal_bit = OMAP3430ES2_EN_PERIPH2_DPLL_DRIFTGUARD_SHIFT,
1009 .recal_en_bit = OMAP3430ES2_SND_PERIPH_DPLL_RECAL_EN_SHIFT,
1010 .recal_st_bit = OMAP3430ES2_SND_PERIPH_DPLL_ST_SHIFT,
1011 .autoidle_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_AUTOIDLE2_PLL),
1012 .autoidle_mask = OMAP3430ES2_AUTO_PERIPH2_DPLL_MASK,
1013 .idlest_reg = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST2),
1014 .idlest_mask = OMAP3430ES2_ST_PERIPH2_CLK_MASK,
1015 .max_multiplier = OMAP3_MAX_DPLL_MULT,
1016 .min_divider = 1,
1017 .max_divider = OMAP3_MAX_DPLL_DIV,
1018 .rate_tolerance = DEFAULT_DPLL_RATE_TOLERANCE
1019};
1020
1021static struct clk dpll5_ck = {
1022 .name = "dpll5_ck",
1023 .ops = &clkops_omap3_noncore_dpll_ops,
1024 .parent = &sys_ck,
1025 .dpll_data = &dpll5_dd,
1026 .round_rate = &omap2_dpll_round_rate,
1027 .set_rate = &omap3_noncore_dpll_set_rate,
1028 .clkdm_name = "dpll5_clkdm",
1029 .recalc = &omap3_dpll_recalc,
1030};
1031
1032static const struct clksel div16_dpll5_clksel[] = {
1033 { .parent = &dpll5_ck, .rates = div16_dpll_rates },
1034 { .parent = NULL }
1035};
1036
1037static struct clk dpll5_m2_ck = {
1038 .name = "dpll5_m2_ck",
1039 .ops = &clkops_null,
1040 .parent = &dpll5_ck,
1041 .init = &omap2_init_clksel_parent,
1042 .clksel_reg = OMAP_CM_REGADDR(PLL_MOD, OMAP3430ES2_CM_CLKSEL5),
1043 .clksel_mask = OMAP3430ES2_DIV_120M_MASK,
1044 .clksel = div16_dpll5_clksel,
1045 .clkdm_name = "dpll5_clkdm",
1046 .recalc = &omap2_clksel_recalc,
1047};
1048
1049/* CM EXTERNAL CLOCK OUTPUTS */
1050
1051static const struct clksel_rate clkout2_src_core_rates[] = {
1052 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
1053 { .div = 0 }
1054};
1055
1056static const struct clksel_rate clkout2_src_sys_rates[] = {
1057 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
1058 { .div = 0 }
1059};
1060
1061static const struct clksel_rate clkout2_src_96m_rates[] = {
1062 { .div = 1, .val = 2, .flags = RATE_IN_343X | DEFAULT_RATE },
1063 { .div = 0 }
1064};
1065
1066static const struct clksel_rate clkout2_src_54m_rates[] = {
1067 { .div = 1, .val = 3, .flags = RATE_IN_343X | DEFAULT_RATE },
1068 { .div = 0 }
1069};
1070
1071static const struct clksel clkout2_src_clksel[] = {
1072 { .parent = &core_ck, .rates = clkout2_src_core_rates },
1073 { .parent = &sys_ck, .rates = clkout2_src_sys_rates },
1074 { .parent = &cm_96m_fck, .rates = clkout2_src_96m_rates },
1075 { .parent = &omap_54m_fck, .rates = clkout2_src_54m_rates },
1076 { .parent = NULL }
1077};
1078
1079static struct clk clkout2_src_ck = {
1080 .name = "clkout2_src_ck",
1081 .ops = &clkops_omap2_dflt,
1082 .init = &omap2_init_clksel_parent,
1083 .enable_reg = OMAP3430_CM_CLKOUT_CTRL,
1084 .enable_bit = OMAP3430_CLKOUT2_EN_SHIFT,
1085 .clksel_reg = OMAP3430_CM_CLKOUT_CTRL,
1086 .clksel_mask = OMAP3430_CLKOUT2SOURCE_MASK,
1087 .clksel = clkout2_src_clksel,
1088 .clkdm_name = "core_clkdm",
1089 .recalc = &omap2_clksel_recalc,
1090};
1091
1092static const struct clksel_rate sys_clkout2_rates[] = {
1093 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
1094 { .div = 2, .val = 1, .flags = RATE_IN_343X },
1095 { .div = 4, .val = 2, .flags = RATE_IN_343X },
1096 { .div = 8, .val = 3, .flags = RATE_IN_343X },
1097 { .div = 16, .val = 4, .flags = RATE_IN_343X },
1098 { .div = 0 },
1099};
1100
1101static const struct clksel sys_clkout2_clksel[] = {
1102 { .parent = &clkout2_src_ck, .rates = sys_clkout2_rates },
1103 { .parent = NULL },
1104};
1105
1106static struct clk sys_clkout2 = {
1107 .name = "sys_clkout2",
1108 .ops = &clkops_null,
1109 .init = &omap2_init_clksel_parent,
1110 .clksel_reg = OMAP3430_CM_CLKOUT_CTRL,
1111 .clksel_mask = OMAP3430_CLKOUT2_DIV_MASK,
1112 .clksel = sys_clkout2_clksel,
1113 .recalc = &omap2_clksel_recalc,
1114};
1115
1116/* CM OUTPUT CLOCKS */
1117
1118static struct clk corex2_fck = {
1119 .name = "corex2_fck",
1120 .ops = &clkops_null,
1121 .parent = &dpll3_m2x2_ck,
1122 .recalc = &followparent_recalc,
1123};
1124
1125/* DPLL power domain clock controls */
1126
1127static const struct clksel_rate div4_rates[] = {
1128 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
1129 { .div = 2, .val = 2, .flags = RATE_IN_343X },
1130 { .div = 4, .val = 4, .flags = RATE_IN_343X },
1131 { .div = 0 }
1132};
1133
1134static const struct clksel div4_core_clksel[] = {
1135 { .parent = &core_ck, .rates = div4_rates },
1136 { .parent = NULL }
1137};
1138
1139/*
1140 * REVISIT: Are these in DPLL power domain or CM power domain? docs
1141 * may be inconsistent here?
1142 */
1143static struct clk dpll1_fck = {
1144 .name = "dpll1_fck",
1145 .ops = &clkops_null,
1146 .parent = &core_ck,
1147 .init = &omap2_init_clksel_parent,
1148 .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL),
1149 .clksel_mask = OMAP3430_MPU_CLK_SRC_MASK,
1150 .clksel = div4_core_clksel,
1151 .recalc = &omap2_clksel_recalc,
1152};
1153
1154static struct clk mpu_ck = {
1155 .name = "mpu_ck",
1156 .ops = &clkops_null,
1157 .parent = &dpll1_x2m2_ck,
1158 .clkdm_name = "mpu_clkdm",
1159 .recalc = &followparent_recalc,
1160};
1161
1162/* arm_fck is divided by two when DPLL1 locked; otherwise, passthrough mpu_ck */
1163static const struct clksel_rate arm_fck_rates[] = {
1164 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
1165 { .div = 2, .val = 1, .flags = RATE_IN_343X },
1166 { .div = 0 },
1167};
1168
1169static const struct clksel arm_fck_clksel[] = {
1170 { .parent = &mpu_ck, .rates = arm_fck_rates },
1171 { .parent = NULL }
1172};
1173
1174static struct clk arm_fck = {
1175 .name = "arm_fck",
1176 .ops = &clkops_null,
1177 .parent = &mpu_ck,
1178 .init = &omap2_init_clksel_parent,
1179 .clksel_reg = OMAP_CM_REGADDR(MPU_MOD, OMAP3430_CM_IDLEST_PLL),
1180 .clksel_mask = OMAP3430_ST_MPU_CLK_MASK,
1181 .clksel = arm_fck_clksel,
1182 .clkdm_name = "mpu_clkdm",
1183 .recalc = &omap2_clksel_recalc,
1184};
1185
1186/* XXX What about neon_clkdm ? */
1187
1188/*
1189 * REVISIT: This clock is never specifically defined in the 3430 TRM,
1190 * although it is referenced - so this is a guess
1191 */
1192static struct clk emu_mpu_alwon_ck = {
1193 .name = "emu_mpu_alwon_ck",
1194 .ops = &clkops_null,
1195 .parent = &mpu_ck,
1196 .recalc = &followparent_recalc,
1197};
1198
1199static struct clk dpll2_fck = {
1200 .name = "dpll2_fck",
1201 .ops = &clkops_null,
1202 .parent = &core_ck,
1203 .init = &omap2_init_clksel_parent,
1204 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, OMAP3430_CM_CLKSEL1_PLL),
1205 .clksel_mask = OMAP3430_IVA2_CLK_SRC_MASK,
1206 .clksel = div4_core_clksel,
1207 .recalc = &omap2_clksel_recalc,
1208};
1209
1210static struct clk iva2_ck = {
1211 .name = "iva2_ck",
1212 .ops = &clkops_omap2_dflt_wait,
1213 .parent = &dpll2_m2_ck,
1214 .enable_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, CM_FCLKEN),
1215 .enable_bit = OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT,
1216 .clkdm_name = "iva2_clkdm",
1217 .recalc = &followparent_recalc,
1218};
1219
1220/* Common interface clocks */
1221
1222static const struct clksel div2_core_clksel[] = {
1223 { .parent = &core_ck, .rates = div2_rates },
1224 { .parent = NULL }
1225};
1226
1227static struct clk l3_ick = {
1228 .name = "l3_ick",
1229 .ops = &clkops_null,
1230 .parent = &core_ck,
1231 .init = &omap2_init_clksel_parent,
1232 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1233 .clksel_mask = OMAP3430_CLKSEL_L3_MASK,
1234 .clksel = div2_core_clksel,
1235 .clkdm_name = "core_l3_clkdm",
1236 .recalc = &omap2_clksel_recalc,
1237};
1238
1239static const struct clksel div2_l3_clksel[] = {
1240 { .parent = &l3_ick, .rates = div2_rates },
1241 { .parent = NULL }
1242};
1243
1244static struct clk l4_ick = {
1245 .name = "l4_ick",
1246 .ops = &clkops_null,
1247 .parent = &l3_ick,
1248 .init = &omap2_init_clksel_parent,
1249 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1250 .clksel_mask = OMAP3430_CLKSEL_L4_MASK,
1251 .clksel = div2_l3_clksel,
1252 .clkdm_name = "core_l4_clkdm",
1253 .recalc = &omap2_clksel_recalc,
1254
1255};
1256
1257static const struct clksel div2_l4_clksel[] = {
1258 { .parent = &l4_ick, .rates = div2_rates },
1259 { .parent = NULL }
1260};
1261
1262static struct clk rm_ick = {
1263 .name = "rm_ick",
1264 .ops = &clkops_null,
1265 .parent = &l4_ick,
1266 .init = &omap2_init_clksel_parent,
1267 .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL),
1268 .clksel_mask = OMAP3430_CLKSEL_RM_MASK,
1269 .clksel = div2_l4_clksel,
1270 .recalc = &omap2_clksel_recalc,
1271};
1272
1273/* GFX power domain */
1274
1275/* GFX clocks are in 3430ES1 only. 3430ES2 and later uses the SGX instead */
1276
1277static const struct clksel gfx_l3_clksel[] = {
1278 { .parent = &l3_ick, .rates = gfx_l3_rates },
1279 { .parent = NULL }
1280};
1281
1282/* Virtual parent clock for gfx_l3_ick and gfx_l3_fck */
1283static struct clk gfx_l3_ck = {
1284 .name = "gfx_l3_ck",
1285 .ops = &clkops_omap2_dflt_wait,
1286 .parent = &l3_ick,
1287 .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_ICLKEN),
1288 .enable_bit = OMAP_EN_GFX_SHIFT,
1289 .recalc = &followparent_recalc,
1290};
1291
1292static struct clk gfx_l3_fck = {
1293 .name = "gfx_l3_fck",
1294 .ops = &clkops_null,
1295 .parent = &gfx_l3_ck,
1296 .init = &omap2_init_clksel_parent,
1297 .clksel_reg = OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),
1298 .clksel_mask = OMAP_CLKSEL_GFX_MASK,
1299 .clksel = gfx_l3_clksel,
1300 .clkdm_name = "gfx_3430es1_clkdm",
1301 .recalc = &omap2_clksel_recalc,
1302};
1303
1304static struct clk gfx_l3_ick = {
1305 .name = "gfx_l3_ick",
1306 .ops = &clkops_null,
1307 .parent = &gfx_l3_ck,
1308 .clkdm_name = "gfx_3430es1_clkdm",
1309 .recalc = &followparent_recalc,
1310};
1311
1312static struct clk gfx_cg1_ck = {
1313 .name = "gfx_cg1_ck",
1314 .ops = &clkops_omap2_dflt_wait,
1315 .parent = &gfx_l3_fck, /* REVISIT: correct? */
1316 .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
1317 .enable_bit = OMAP3430ES1_EN_2D_SHIFT,
1318 .clkdm_name = "gfx_3430es1_clkdm",
1319 .recalc = &followparent_recalc,
1320};
1321
1322static struct clk gfx_cg2_ck = {
1323 .name = "gfx_cg2_ck",
1324 .ops = &clkops_omap2_dflt_wait,
1325 .parent = &gfx_l3_fck, /* REVISIT: correct? */
1326 .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),
1327 .enable_bit = OMAP3430ES1_EN_3D_SHIFT,
1328 .clkdm_name = "gfx_3430es1_clkdm",
1329 .recalc = &followparent_recalc,
1330};
1331
1332/* SGX power domain - 3430ES2 only */
1333
1334static const struct clksel_rate sgx_core_rates[] = {
1335 { .div = 2, .val = 5, .flags = RATE_IN_36XX },
1336 { .div = 3, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
1337 { .div = 4, .val = 1, .flags = RATE_IN_343X },
1338 { .div = 6, .val = 2, .flags = RATE_IN_343X },
1339 { .div = 0 },
1340};
1341
1342static const struct clksel_rate sgx_192m_rates[] = {
1343 { .div = 1, .val = 4, .flags = RATE_IN_36XX | DEFAULT_RATE },
1344 { .div = 0 },
1345};
1346
1347static const struct clksel_rate sgx_corex2_rates[] = {
1348 { .div = 3, .val = 6, .flags = RATE_IN_36XX | DEFAULT_RATE },
1349 { .div = 5, .val = 7, .flags = RATE_IN_36XX },
1350 { .div = 0 },
1351};
1352
1353static const struct clksel_rate sgx_96m_rates[] = {
1354 { .div = 1, .val = 3, .flags = RATE_IN_343X | DEFAULT_RATE },
1355 { .div = 0 },
1356};
1357
1358static const struct clksel sgx_clksel[] = {
1359 { .parent = &core_ck, .rates = sgx_core_rates },
1360 { .parent = &cm_96m_fck, .rates = sgx_96m_rates },
1361 { .parent = &omap_192m_alwon_fck, .rates = sgx_192m_rates },
1362 { .parent = &corex2_fck, .rates = sgx_corex2_rates },
1363 { .parent = NULL }
1364};
1365
1366static struct clk sgx_fck = {
1367 .name = "sgx_fck",
1368 .ops = &clkops_omap2_dflt_wait,
1369 .init = &omap2_init_clksel_parent,
1370 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_FCLKEN),
1371 .enable_bit = OMAP3430ES2_CM_FCLKEN_SGX_EN_SGX_SHIFT,
1372 .clksel_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_CLKSEL),
1373 .clksel_mask = OMAP3430ES2_CLKSEL_SGX_MASK,
1374 .clksel = sgx_clksel,
1375 .clkdm_name = "sgx_clkdm",
1376 .recalc = &omap2_clksel_recalc,
1377 .set_rate = &omap2_clksel_set_rate,
1378 .round_rate = &omap2_clksel_round_rate
1379};
1380
1381static struct clk sgx_ick = {
1382 .name = "sgx_ick",
1383 .ops = &clkops_omap2_dflt_wait,
1384 .parent = &l3_ick,
1385 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_SGX_MOD, CM_ICLKEN),
1386 .enable_bit = OMAP3430ES2_CM_ICLKEN_SGX_EN_SGX_SHIFT,
1387 .clkdm_name = "sgx_clkdm",
1388 .recalc = &followparent_recalc,
1389};
1390
1391/* CORE power domain */
1392
1393static struct clk d2d_26m_fck = {
1394 .name = "d2d_26m_fck",
1395 .ops = &clkops_omap2_dflt_wait,
1396 .parent = &sys_ck,
1397 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1398 .enable_bit = OMAP3430ES1_EN_D2D_SHIFT,
1399 .clkdm_name = "d2d_clkdm",
1400 .recalc = &followparent_recalc,
1401};
1402
1403static struct clk modem_fck = {
1404 .name = "modem_fck",
1405 .ops = &clkops_omap2_dflt_wait,
1406 .parent = &sys_ck,
1407 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1408 .enable_bit = OMAP3430_EN_MODEM_SHIFT,
1409 .clkdm_name = "d2d_clkdm",
1410 .recalc = &followparent_recalc,
1411};
1412
1413static struct clk sad2d_ick = {
1414 .name = "sad2d_ick",
1415 .ops = &clkops_omap2_dflt_wait,
1416 .parent = &l3_ick,
1417 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1418 .enable_bit = OMAP3430_EN_SAD2D_SHIFT,
1419 .clkdm_name = "d2d_clkdm",
1420 .recalc = &followparent_recalc,
1421};
1422
1423static struct clk mad2d_ick = {
1424 .name = "mad2d_ick",
1425 .ops = &clkops_omap2_dflt_wait,
1426 .parent = &l3_ick,
1427 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
1428 .enable_bit = OMAP3430_EN_MAD2D_SHIFT,
1429 .clkdm_name = "d2d_clkdm",
1430 .recalc = &followparent_recalc,
1431};
1432
1433static const struct clksel omap343x_gpt_clksel[] = {
1434 { .parent = &omap_32k_fck, .rates = gpt_32k_rates },
1435 { .parent = &sys_ck, .rates = gpt_sys_rates },
1436 { .parent = NULL}
1437};
1438
1439static struct clk gpt10_fck = {
1440 .name = "gpt10_fck",
1441 .ops = &clkops_omap2_dflt_wait,
1442 .parent = &sys_ck,
1443 .init = &omap2_init_clksel_parent,
1444 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1445 .enable_bit = OMAP3430_EN_GPT10_SHIFT,
1446 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1447 .clksel_mask = OMAP3430_CLKSEL_GPT10_MASK,
1448 .clksel = omap343x_gpt_clksel,
1449 .clkdm_name = "core_l4_clkdm",
1450 .recalc = &omap2_clksel_recalc,
1451};
1452
1453static struct clk gpt11_fck = {
1454 .name = "gpt11_fck",
1455 .ops = &clkops_omap2_dflt_wait,
1456 .parent = &sys_ck,
1457 .init = &omap2_init_clksel_parent,
1458 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1459 .enable_bit = OMAP3430_EN_GPT11_SHIFT,
1460 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1461 .clksel_mask = OMAP3430_CLKSEL_GPT11_MASK,
1462 .clksel = omap343x_gpt_clksel,
1463 .clkdm_name = "core_l4_clkdm",
1464 .recalc = &omap2_clksel_recalc,
1465};
1466
1467static struct clk cpefuse_fck = {
1468 .name = "cpefuse_fck",
1469 .ops = &clkops_omap2_dflt,
1470 .parent = &sys_ck,
1471 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3),
1472 .enable_bit = OMAP3430ES2_EN_CPEFUSE_SHIFT,
1473 .recalc = &followparent_recalc,
1474};
1475
1476static struct clk ts_fck = {
1477 .name = "ts_fck",
1478 .ops = &clkops_omap2_dflt,
1479 .parent = &omap_32k_fck,
1480 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3),
1481 .enable_bit = OMAP3430ES2_EN_TS_SHIFT,
1482 .recalc = &followparent_recalc,
1483};
1484
1485static struct clk usbtll_fck = {
1486 .name = "usbtll_fck",
1487 .ops = &clkops_omap2_dflt,
1488 .parent = &dpll5_m2_ck,
1489 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP3430ES2_CM_FCLKEN3),
1490 .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT,
1491 .recalc = &followparent_recalc,
1492};
1493
1494/* CORE 96M FCLK-derived clocks */
1495
1496static struct clk core_96m_fck = {
1497 .name = "core_96m_fck",
1498 .ops = &clkops_null,
1499 .parent = &omap_96m_fck,
1500 .clkdm_name = "core_l4_clkdm",
1501 .recalc = &followparent_recalc,
1502};
1503
1504static struct clk mmchs3_fck = {
1505 .name = "mmchs3_fck",
1506 .ops = &clkops_omap2_dflt_wait,
1507 .parent = &core_96m_fck,
1508 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1509 .enable_bit = OMAP3430ES2_EN_MMC3_SHIFT,
1510 .clkdm_name = "core_l4_clkdm",
1511 .recalc = &followparent_recalc,
1512};
1513
1514static struct clk mmchs2_fck = {
1515 .name = "mmchs2_fck",
1516 .ops = &clkops_omap2_dflt_wait,
1517 .parent = &core_96m_fck,
1518 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1519 .enable_bit = OMAP3430_EN_MMC2_SHIFT,
1520 .clkdm_name = "core_l4_clkdm",
1521 .recalc = &followparent_recalc,
1522};
1523
1524static struct clk mspro_fck = {
1525 .name = "mspro_fck",
1526 .ops = &clkops_omap2_dflt_wait,
1527 .parent = &core_96m_fck,
1528 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1529 .enable_bit = OMAP3430_EN_MSPRO_SHIFT,
1530 .clkdm_name = "core_l4_clkdm",
1531 .recalc = &followparent_recalc,
1532};
1533
1534static struct clk mmchs1_fck = {
1535 .name = "mmchs1_fck",
1536 .ops = &clkops_omap2_dflt_wait,
1537 .parent = &core_96m_fck,
1538 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1539 .enable_bit = OMAP3430_EN_MMC1_SHIFT,
1540 .clkdm_name = "core_l4_clkdm",
1541 .recalc = &followparent_recalc,
1542};
1543
1544static struct clk i2c3_fck = {
1545 .name = "i2c3_fck",
1546 .ops = &clkops_omap2_dflt_wait,
1547 .parent = &core_96m_fck,
1548 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1549 .enable_bit = OMAP3430_EN_I2C3_SHIFT,
1550 .clkdm_name = "core_l4_clkdm",
1551 .recalc = &followparent_recalc,
1552};
1553
1554static struct clk i2c2_fck = {
1555 .name = "i2c2_fck",
1556 .ops = &clkops_omap2_dflt_wait,
1557 .parent = &core_96m_fck,
1558 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1559 .enable_bit = OMAP3430_EN_I2C2_SHIFT,
1560 .clkdm_name = "core_l4_clkdm",
1561 .recalc = &followparent_recalc,
1562};
1563
1564static struct clk i2c1_fck = {
1565 .name = "i2c1_fck",
1566 .ops = &clkops_omap2_dflt_wait,
1567 .parent = &core_96m_fck,
1568 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1569 .enable_bit = OMAP3430_EN_I2C1_SHIFT,
1570 .clkdm_name = "core_l4_clkdm",
1571 .recalc = &followparent_recalc,
1572};
1573
1574/*
1575 * MCBSP 1 & 5 get their 96MHz clock from core_96m_fck;
1576 * MCBSP 2, 3, 4 get their 96MHz clock from per_96m_fck.
1577 */
1578static const struct clksel_rate common_mcbsp_96m_rates[] = {
1579 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
1580 { .div = 0 }
1581};
1582
1583static const struct clksel_rate common_mcbsp_mcbsp_rates[] = {
1584 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
1585 { .div = 0 }
1586};
1587
1588static const struct clksel mcbsp_15_clksel[] = {
1589 { .parent = &core_96m_fck, .rates = common_mcbsp_96m_rates },
1590 { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },
1591 { .parent = NULL }
1592};
1593
1594static struct clk mcbsp5_fck = {
1595 .name = "mcbsp5_fck",
1596 .ops = &clkops_omap2_dflt_wait,
1597 .init = &omap2_init_clksel_parent,
1598 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1599 .enable_bit = OMAP3430_EN_MCBSP5_SHIFT,
1600 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1),
1601 .clksel_mask = OMAP2_MCBSP5_CLKS_MASK,
1602 .clksel = mcbsp_15_clksel,
1603 .clkdm_name = "core_l4_clkdm",
1604 .recalc = &omap2_clksel_recalc,
1605};
1606
1607static struct clk mcbsp1_fck = {
1608 .name = "mcbsp1_fck",
1609 .ops = &clkops_omap2_dflt_wait,
1610 .init = &omap2_init_clksel_parent,
1611 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1612 .enable_bit = OMAP3430_EN_MCBSP1_SHIFT,
1613 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
1614 .clksel_mask = OMAP2_MCBSP1_CLKS_MASK,
1615 .clksel = mcbsp_15_clksel,
1616 .clkdm_name = "core_l4_clkdm",
1617 .recalc = &omap2_clksel_recalc,
1618};
1619
1620/* CORE_48M_FCK-derived clocks */
1621
1622static struct clk core_48m_fck = {
1623 .name = "core_48m_fck",
1624 .ops = &clkops_null,
1625 .parent = &omap_48m_fck,
1626 .clkdm_name = "core_l4_clkdm",
1627 .recalc = &followparent_recalc,
1628};
1629
1630static struct clk mcspi4_fck = {
1631 .name = "mcspi4_fck",
1632 .ops = &clkops_omap2_dflt_wait,
1633 .parent = &core_48m_fck,
1634 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1635 .enable_bit = OMAP3430_EN_MCSPI4_SHIFT,
1636 .recalc = &followparent_recalc,
1637};
1638
1639static struct clk mcspi3_fck = {
1640 .name = "mcspi3_fck",
1641 .ops = &clkops_omap2_dflt_wait,
1642 .parent = &core_48m_fck,
1643 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1644 .enable_bit = OMAP3430_EN_MCSPI3_SHIFT,
1645 .recalc = &followparent_recalc,
1646};
1647
1648static struct clk mcspi2_fck = {
1649 .name = "mcspi2_fck",
1650 .ops = &clkops_omap2_dflt_wait,
1651 .parent = &core_48m_fck,
1652 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1653 .enable_bit = OMAP3430_EN_MCSPI2_SHIFT,
1654 .recalc = &followparent_recalc,
1655};
1656
1657static struct clk mcspi1_fck = {
1658 .name = "mcspi1_fck",
1659 .ops = &clkops_omap2_dflt_wait,
1660 .parent = &core_48m_fck,
1661 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1662 .enable_bit = OMAP3430_EN_MCSPI1_SHIFT,
1663 .recalc = &followparent_recalc,
1664};
1665
1666static struct clk uart2_fck = {
1667 .name = "uart2_fck",
1668 .ops = &clkops_omap2_dflt_wait,
1669 .parent = &core_48m_fck,
1670 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1671 .enable_bit = OMAP3430_EN_UART2_SHIFT,
1672 .clkdm_name = "core_l4_clkdm",
1673 .recalc = &followparent_recalc,
1674};
1675
1676static struct clk uart1_fck = {
1677 .name = "uart1_fck",
1678 .ops = &clkops_omap2_dflt_wait,
1679 .parent = &core_48m_fck,
1680 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1681 .enable_bit = OMAP3430_EN_UART1_SHIFT,
1682 .clkdm_name = "core_l4_clkdm",
1683 .recalc = &followparent_recalc,
1684};
1685
1686static struct clk fshostusb_fck = {
1687 .name = "fshostusb_fck",
1688 .ops = &clkops_omap2_dflt_wait,
1689 .parent = &core_48m_fck,
1690 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1691 .enable_bit = OMAP3430ES1_EN_FSHOSTUSB_SHIFT,
1692 .recalc = &followparent_recalc,
1693};
1694
1695/* CORE_12M_FCK based clocks */
1696
1697static struct clk core_12m_fck = {
1698 .name = "core_12m_fck",
1699 .ops = &clkops_null,
1700 .parent = &omap_12m_fck,
1701 .clkdm_name = "core_l4_clkdm",
1702 .recalc = &followparent_recalc,
1703};
1704
1705static struct clk hdq_fck = {
1706 .name = "hdq_fck",
1707 .ops = &clkops_omap2_dflt_wait,
1708 .parent = &core_12m_fck,
1709 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1710 .enable_bit = OMAP3430_EN_HDQ_SHIFT,
1711 .recalc = &followparent_recalc,
1712};
1713
1714/* DPLL3-derived clock */
1715
1716static const struct clksel_rate ssi_ssr_corex2_rates[] = {
1717 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
1718 { .div = 2, .val = 2, .flags = RATE_IN_343X },
1719 { .div = 3, .val = 3, .flags = RATE_IN_343X },
1720 { .div = 4, .val = 4, .flags = RATE_IN_343X },
1721 { .div = 6, .val = 6, .flags = RATE_IN_343X },
1722 { .div = 8, .val = 8, .flags = RATE_IN_343X },
1723 { .div = 0 }
1724};
1725
1726static const struct clksel ssi_ssr_clksel[] = {
1727 { .parent = &corex2_fck, .rates = ssi_ssr_corex2_rates },
1728 { .parent = NULL }
1729};
1730
1731static struct clk ssi_ssr_fck_3430es1 = {
1732 .name = "ssi_ssr_fck",
1733 .ops = &clkops_omap2_dflt,
1734 .init = &omap2_init_clksel_parent,
1735 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1736 .enable_bit = OMAP3430_EN_SSI_SHIFT,
1737 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1738 .clksel_mask = OMAP3430_CLKSEL_SSI_MASK,
1739 .clksel = ssi_ssr_clksel,
1740 .clkdm_name = "core_l4_clkdm",
1741 .recalc = &omap2_clksel_recalc,
1742};
1743
1744static struct clk ssi_ssr_fck_3430es2 = {
1745 .name = "ssi_ssr_fck",
1746 .ops = &clkops_omap3430es2_ssi_wait,
1747 .init = &omap2_init_clksel_parent,
1748 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
1749 .enable_bit = OMAP3430_EN_SSI_SHIFT,
1750 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
1751 .clksel_mask = OMAP3430_CLKSEL_SSI_MASK,
1752 .clksel = ssi_ssr_clksel,
1753 .clkdm_name = "core_l4_clkdm",
1754 .recalc = &omap2_clksel_recalc,
1755};
1756
1757static struct clk ssi_sst_fck_3430es1 = {
1758 .name = "ssi_sst_fck",
1759 .ops = &clkops_null,
1760 .parent = &ssi_ssr_fck_3430es1,
1761 .fixed_div = 2,
1762 .recalc = &omap_fixed_divisor_recalc,
1763};
1764
1765static struct clk ssi_sst_fck_3430es2 = {
1766 .name = "ssi_sst_fck",
1767 .ops = &clkops_null,
1768 .parent = &ssi_ssr_fck_3430es2,
1769 .fixed_div = 2,
1770 .recalc = &omap_fixed_divisor_recalc,
1771};
1772
1773
1774
1775/* CORE_L3_ICK based clocks */
1776
1777/*
1778 * XXX must add clk_enable/clk_disable for these if standard code won't
1779 * handle it
1780 */
1781static struct clk core_l3_ick = {
1782 .name = "core_l3_ick",
1783 .ops = &clkops_null,
1784 .parent = &l3_ick,
1785 .clkdm_name = "core_l3_clkdm",
1786 .recalc = &followparent_recalc,
1787};
1788
1789static struct clk hsotgusb_ick_3430es1 = {
1790 .name = "hsotgusb_ick",
1791 .ops = &clkops_omap2_dflt,
1792 .parent = &core_l3_ick,
1793 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1794 .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT,
1795 .clkdm_name = "core_l3_clkdm",
1796 .recalc = &followparent_recalc,
1797};
1798
1799static struct clk hsotgusb_ick_3430es2 = {
1800 .name = "hsotgusb_ick",
1801 .ops = &clkops_omap3430es2_hsotgusb_wait,
1802 .parent = &core_l3_ick,
1803 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1804 .enable_bit = OMAP3430_EN_HSOTGUSB_SHIFT,
1805 .clkdm_name = "core_l3_clkdm",
1806 .recalc = &followparent_recalc,
1807};
1808
1809static struct clk sdrc_ick = {
1810 .name = "sdrc_ick",
1811 .ops = &clkops_omap2_dflt_wait,
1812 .parent = &core_l3_ick,
1813 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1814 .enable_bit = OMAP3430_EN_SDRC_SHIFT,
1815 .flags = ENABLE_ON_INIT,
1816 .clkdm_name = "core_l3_clkdm",
1817 .recalc = &followparent_recalc,
1818};
1819
1820static struct clk gpmc_fck = {
1821 .name = "gpmc_fck",
1822 .ops = &clkops_null,
1823 .parent = &core_l3_ick,
1824 .flags = ENABLE_ON_INIT, /* huh? */
1825 .clkdm_name = "core_l3_clkdm",
1826 .recalc = &followparent_recalc,
1827};
1828
1829/* SECURITY_L3_ICK based clocks */
1830
1831static struct clk security_l3_ick = {
1832 .name = "security_l3_ick",
1833 .ops = &clkops_null,
1834 .parent = &l3_ick,
1835 .recalc = &followparent_recalc,
1836};
1837
1838static struct clk pka_ick = {
1839 .name = "pka_ick",
1840 .ops = &clkops_omap2_dflt_wait,
1841 .parent = &security_l3_ick,
1842 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
1843 .enable_bit = OMAP3430_EN_PKA_SHIFT,
1844 .recalc = &followparent_recalc,
1845};
1846
1847/* CORE_L4_ICK based clocks */
1848
1849static struct clk core_l4_ick = {
1850 .name = "core_l4_ick",
1851 .ops = &clkops_null,
1852 .parent = &l4_ick,
1853 .clkdm_name = "core_l4_clkdm",
1854 .recalc = &followparent_recalc,
1855};
1856
1857static struct clk usbtll_ick = {
1858 .name = "usbtll_ick",
1859 .ops = &clkops_omap2_dflt_wait,
1860 .parent = &core_l4_ick,
1861 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),
1862 .enable_bit = OMAP3430ES2_EN_USBTLL_SHIFT,
1863 .clkdm_name = "core_l4_clkdm",
1864 .recalc = &followparent_recalc,
1865};
1866
1867static struct clk mmchs3_ick = {
1868 .name = "mmchs3_ick",
1869 .ops = &clkops_omap2_dflt_wait,
1870 .parent = &core_l4_ick,
1871 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1872 .enable_bit = OMAP3430ES2_EN_MMC3_SHIFT,
1873 .clkdm_name = "core_l4_clkdm",
1874 .recalc = &followparent_recalc,
1875};
1876
1877/* Intersystem Communication Registers - chassis mode only */
1878static struct clk icr_ick = {
1879 .name = "icr_ick",
1880 .ops = &clkops_omap2_dflt_wait,
1881 .parent = &core_l4_ick,
1882 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1883 .enable_bit = OMAP3430_EN_ICR_SHIFT,
1884 .clkdm_name = "core_l4_clkdm",
1885 .recalc = &followparent_recalc,
1886};
1887
1888static struct clk aes2_ick = {
1889 .name = "aes2_ick",
1890 .ops = &clkops_omap2_dflt_wait,
1891 .parent = &core_l4_ick,
1892 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1893 .enable_bit = OMAP3430_EN_AES2_SHIFT,
1894 .clkdm_name = "core_l4_clkdm",
1895 .recalc = &followparent_recalc,
1896};
1897
1898static struct clk sha12_ick = {
1899 .name = "sha12_ick",
1900 .ops = &clkops_omap2_dflt_wait,
1901 .parent = &core_l4_ick,
1902 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1903 .enable_bit = OMAP3430_EN_SHA12_SHIFT,
1904 .clkdm_name = "core_l4_clkdm",
1905 .recalc = &followparent_recalc,
1906};
1907
1908static struct clk des2_ick = {
1909 .name = "des2_ick",
1910 .ops = &clkops_omap2_dflt_wait,
1911 .parent = &core_l4_ick,
1912 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1913 .enable_bit = OMAP3430_EN_DES2_SHIFT,
1914 .clkdm_name = "core_l4_clkdm",
1915 .recalc = &followparent_recalc,
1916};
1917
1918static struct clk mmchs2_ick = {
1919 .name = "mmchs2_ick",
1920 .ops = &clkops_omap2_dflt_wait,
1921 .parent = &core_l4_ick,
1922 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1923 .enable_bit = OMAP3430_EN_MMC2_SHIFT,
1924 .clkdm_name = "core_l4_clkdm",
1925 .recalc = &followparent_recalc,
1926};
1927
1928static struct clk mmchs1_ick = {
1929 .name = "mmchs1_ick",
1930 .ops = &clkops_omap2_dflt_wait,
1931 .parent = &core_l4_ick,
1932 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1933 .enable_bit = OMAP3430_EN_MMC1_SHIFT,
1934 .clkdm_name = "core_l4_clkdm",
1935 .recalc = &followparent_recalc,
1936};
1937
1938static struct clk mspro_ick = {
1939 .name = "mspro_ick",
1940 .ops = &clkops_omap2_dflt_wait,
1941 .parent = &core_l4_ick,
1942 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1943 .enable_bit = OMAP3430_EN_MSPRO_SHIFT,
1944 .clkdm_name = "core_l4_clkdm",
1945 .recalc = &followparent_recalc,
1946};
1947
1948static struct clk hdq_ick = {
1949 .name = "hdq_ick",
1950 .ops = &clkops_omap2_dflt_wait,
1951 .parent = &core_l4_ick,
1952 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1953 .enable_bit = OMAP3430_EN_HDQ_SHIFT,
1954 .clkdm_name = "core_l4_clkdm",
1955 .recalc = &followparent_recalc,
1956};
1957
1958static struct clk mcspi4_ick = {
1959 .name = "mcspi4_ick",
1960 .ops = &clkops_omap2_dflt_wait,
1961 .parent = &core_l4_ick,
1962 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1963 .enable_bit = OMAP3430_EN_MCSPI4_SHIFT,
1964 .clkdm_name = "core_l4_clkdm",
1965 .recalc = &followparent_recalc,
1966};
1967
1968static struct clk mcspi3_ick = {
1969 .name = "mcspi3_ick",
1970 .ops = &clkops_omap2_dflt_wait,
1971 .parent = &core_l4_ick,
1972 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1973 .enable_bit = OMAP3430_EN_MCSPI3_SHIFT,
1974 .clkdm_name = "core_l4_clkdm",
1975 .recalc = &followparent_recalc,
1976};
1977
1978static struct clk mcspi2_ick = {
1979 .name = "mcspi2_ick",
1980 .ops = &clkops_omap2_dflt_wait,
1981 .parent = &core_l4_ick,
1982 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1983 .enable_bit = OMAP3430_EN_MCSPI2_SHIFT,
1984 .clkdm_name = "core_l4_clkdm",
1985 .recalc = &followparent_recalc,
1986};
1987
1988static struct clk mcspi1_ick = {
1989 .name = "mcspi1_ick",
1990 .ops = &clkops_omap2_dflt_wait,
1991 .parent = &core_l4_ick,
1992 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
1993 .enable_bit = OMAP3430_EN_MCSPI1_SHIFT,
1994 .clkdm_name = "core_l4_clkdm",
1995 .recalc = &followparent_recalc,
1996};
1997
1998static struct clk i2c3_ick = {
1999 .name = "i2c3_ick",
2000 .ops = &clkops_omap2_dflt_wait,
2001 .parent = &core_l4_ick,
2002 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2003 .enable_bit = OMAP3430_EN_I2C3_SHIFT,
2004 .clkdm_name = "core_l4_clkdm",
2005 .recalc = &followparent_recalc,
2006};
2007
2008static struct clk i2c2_ick = {
2009 .name = "i2c2_ick",
2010 .ops = &clkops_omap2_dflt_wait,
2011 .parent = &core_l4_ick,
2012 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2013 .enable_bit = OMAP3430_EN_I2C2_SHIFT,
2014 .clkdm_name = "core_l4_clkdm",
2015 .recalc = &followparent_recalc,
2016};
2017
2018static struct clk i2c1_ick = {
2019 .name = "i2c1_ick",
2020 .ops = &clkops_omap2_dflt_wait,
2021 .parent = &core_l4_ick,
2022 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2023 .enable_bit = OMAP3430_EN_I2C1_SHIFT,
2024 .clkdm_name = "core_l4_clkdm",
2025 .recalc = &followparent_recalc,
2026};
2027
2028static struct clk uart2_ick = {
2029 .name = "uart2_ick",
2030 .ops = &clkops_omap2_dflt_wait,
2031 .parent = &core_l4_ick,
2032 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2033 .enable_bit = OMAP3430_EN_UART2_SHIFT,
2034 .clkdm_name = "core_l4_clkdm",
2035 .recalc = &followparent_recalc,
2036};
2037
2038static struct clk uart1_ick = {
2039 .name = "uart1_ick",
2040 .ops = &clkops_omap2_dflt_wait,
2041 .parent = &core_l4_ick,
2042 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2043 .enable_bit = OMAP3430_EN_UART1_SHIFT,
2044 .clkdm_name = "core_l4_clkdm",
2045 .recalc = &followparent_recalc,
2046};
2047
2048static struct clk gpt11_ick = {
2049 .name = "gpt11_ick",
2050 .ops = &clkops_omap2_dflt_wait,
2051 .parent = &core_l4_ick,
2052 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2053 .enable_bit = OMAP3430_EN_GPT11_SHIFT,
2054 .clkdm_name = "core_l4_clkdm",
2055 .recalc = &followparent_recalc,
2056};
2057
2058static struct clk gpt10_ick = {
2059 .name = "gpt10_ick",
2060 .ops = &clkops_omap2_dflt_wait,
2061 .parent = &core_l4_ick,
2062 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2063 .enable_bit = OMAP3430_EN_GPT10_SHIFT,
2064 .clkdm_name = "core_l4_clkdm",
2065 .recalc = &followparent_recalc,
2066};
2067
2068static struct clk mcbsp5_ick = {
2069 .name = "mcbsp5_ick",
2070 .ops = &clkops_omap2_dflt_wait,
2071 .parent = &core_l4_ick,
2072 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2073 .enable_bit = OMAP3430_EN_MCBSP5_SHIFT,
2074 .clkdm_name = "core_l4_clkdm",
2075 .recalc = &followparent_recalc,
2076};
2077
2078static struct clk mcbsp1_ick = {
2079 .name = "mcbsp1_ick",
2080 .ops = &clkops_omap2_dflt_wait,
2081 .parent = &core_l4_ick,
2082 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2083 .enable_bit = OMAP3430_EN_MCBSP1_SHIFT,
2084 .clkdm_name = "core_l4_clkdm",
2085 .recalc = &followparent_recalc,
2086};
2087
2088static struct clk fac_ick = {
2089 .name = "fac_ick",
2090 .ops = &clkops_omap2_dflt_wait,
2091 .parent = &core_l4_ick,
2092 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2093 .enable_bit = OMAP3430ES1_EN_FAC_SHIFT,
2094 .clkdm_name = "core_l4_clkdm",
2095 .recalc = &followparent_recalc,
2096};
2097
2098static struct clk mailboxes_ick = {
2099 .name = "mailboxes_ick",
2100 .ops = &clkops_omap2_dflt_wait,
2101 .parent = &core_l4_ick,
2102 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2103 .enable_bit = OMAP3430_EN_MAILBOXES_SHIFT,
2104 .clkdm_name = "core_l4_clkdm",
2105 .recalc = &followparent_recalc,
2106};
2107
2108static struct clk omapctrl_ick = {
2109 .name = "omapctrl_ick",
2110 .ops = &clkops_omap2_dflt_wait,
2111 .parent = &core_l4_ick,
2112 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2113 .enable_bit = OMAP3430_EN_OMAPCTRL_SHIFT,
2114 .flags = ENABLE_ON_INIT,
2115 .recalc = &followparent_recalc,
2116};
2117
2118/* SSI_L4_ICK based clocks */
2119
2120static struct clk ssi_l4_ick = {
2121 .name = "ssi_l4_ick",
2122 .ops = &clkops_null,
2123 .parent = &l4_ick,
2124 .clkdm_name = "core_l4_clkdm",
2125 .recalc = &followparent_recalc,
2126};
2127
2128static struct clk ssi_ick_3430es1 = {
2129 .name = "ssi_ick",
2130 .ops = &clkops_omap2_dflt,
2131 .parent = &ssi_l4_ick,
2132 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2133 .enable_bit = OMAP3430_EN_SSI_SHIFT,
2134 .clkdm_name = "core_l4_clkdm",
2135 .recalc = &followparent_recalc,
2136};
2137
2138static struct clk ssi_ick_3430es2 = {
2139 .name = "ssi_ick",
2140 .ops = &clkops_omap3430es2_ssi_wait,
2141 .parent = &ssi_l4_ick,
2142 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2143 .enable_bit = OMAP3430_EN_SSI_SHIFT,
2144 .clkdm_name = "core_l4_clkdm",
2145 .recalc = &followparent_recalc,
2146};
2147
2148/* REVISIT: Technically the TRM claims that this is CORE_CLK based,
2149 * but l4_ick makes more sense to me */
2150
2151static const struct clksel usb_l4_clksel[] = {
2152 { .parent = &l4_ick, .rates = div2_rates },
2153 { .parent = NULL },
2154};
2155
2156static struct clk usb_l4_ick = {
2157 .name = "usb_l4_ick",
2158 .ops = &clkops_omap2_dflt_wait,
2159 .parent = &l4_ick,
2160 .init = &omap2_init_clksel_parent,
2161 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
2162 .enable_bit = OMAP3430ES1_EN_FSHOSTUSB_SHIFT,
2163 .clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL),
2164 .clksel_mask = OMAP3430ES1_CLKSEL_FSHOSTUSB_MASK,
2165 .clksel = usb_l4_clksel,
2166 .recalc = &omap2_clksel_recalc,
2167};
2168
2169/* SECURITY_L4_ICK2 based clocks */
2170
2171static struct clk security_l4_ick2 = {
2172 .name = "security_l4_ick2",
2173 .ops = &clkops_null,
2174 .parent = &l4_ick,
2175 .recalc = &followparent_recalc,
2176};
2177
2178static struct clk aes1_ick = {
2179 .name = "aes1_ick",
2180 .ops = &clkops_omap2_dflt_wait,
2181 .parent = &security_l4_ick2,
2182 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
2183 .enable_bit = OMAP3430_EN_AES1_SHIFT,
2184 .recalc = &followparent_recalc,
2185};
2186
2187static struct clk rng_ick = {
2188 .name = "rng_ick",
2189 .ops = &clkops_omap2_dflt_wait,
2190 .parent = &security_l4_ick2,
2191 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
2192 .enable_bit = OMAP3430_EN_RNG_SHIFT,
2193 .recalc = &followparent_recalc,
2194};
2195
2196static struct clk sha11_ick = {
2197 .name = "sha11_ick",
2198 .ops = &clkops_omap2_dflt_wait,
2199 .parent = &security_l4_ick2,
2200 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
2201 .enable_bit = OMAP3430_EN_SHA11_SHIFT,
2202 .recalc = &followparent_recalc,
2203};
2204
2205static struct clk des1_ick = {
2206 .name = "des1_ick",
2207 .ops = &clkops_omap2_dflt_wait,
2208 .parent = &security_l4_ick2,
2209 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),
2210 .enable_bit = OMAP3430_EN_DES1_SHIFT,
2211 .recalc = &followparent_recalc,
2212};
2213
2214/* DSS */
2215static struct clk dss1_alwon_fck_3430es1 = {
2216 .name = "dss1_alwon_fck",
2217 .ops = &clkops_omap2_dflt,
2218 .parent = &dpll4_m4x2_ck,
2219 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2220 .enable_bit = OMAP3430_EN_DSS1_SHIFT,
2221 .clkdm_name = "dss_clkdm",
2222 .recalc = &followparent_recalc,
2223};
2224
2225static struct clk dss1_alwon_fck_3430es2 = {
2226 .name = "dss1_alwon_fck",
2227 .ops = &clkops_omap3430es2_dss_usbhost_wait,
2228 .parent = &dpll4_m4x2_ck,
2229 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2230 .enable_bit = OMAP3430_EN_DSS1_SHIFT,
2231 .clkdm_name = "dss_clkdm",
2232 .recalc = &followparent_recalc,
2233};
2234
2235static struct clk dss_tv_fck = {
2236 .name = "dss_tv_fck",
2237 .ops = &clkops_omap2_dflt,
2238 .parent = &omap_54m_fck,
2239 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2240 .enable_bit = OMAP3430_EN_TV_SHIFT,
2241 .clkdm_name = "dss_clkdm",
2242 .recalc = &followparent_recalc,
2243};
2244
2245static struct clk dss_96m_fck = {
2246 .name = "dss_96m_fck",
2247 .ops = &clkops_omap2_dflt,
2248 .parent = &omap_96m_fck,
2249 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2250 .enable_bit = OMAP3430_EN_TV_SHIFT,
2251 .clkdm_name = "dss_clkdm",
2252 .recalc = &followparent_recalc,
2253};
2254
2255static struct clk dss2_alwon_fck = {
2256 .name = "dss2_alwon_fck",
2257 .ops = &clkops_omap2_dflt,
2258 .parent = &sys_ck,
2259 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_FCLKEN),
2260 .enable_bit = OMAP3430_EN_DSS2_SHIFT,
2261 .clkdm_name = "dss_clkdm",
2262 .recalc = &followparent_recalc,
2263};
2264
2265static struct clk dss_ick_3430es1 = {
2266 /* Handles both L3 and L4 clocks */
2267 .name = "dss_ick",
2268 .ops = &clkops_omap2_dflt,
2269 .parent = &l4_ick,
2270 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN),
2271 .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT,
2272 .clkdm_name = "dss_clkdm",
2273 .recalc = &followparent_recalc,
2274};
2275
2276static struct clk dss_ick_3430es2 = {
2277 /* Handles both L3 and L4 clocks */
2278 .name = "dss_ick",
2279 .ops = &clkops_omap3430es2_dss_usbhost_wait,
2280 .parent = &l4_ick,
2281 .enable_reg = OMAP_CM_REGADDR(OMAP3430_DSS_MOD, CM_ICLKEN),
2282 .enable_bit = OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT,
2283 .clkdm_name = "dss_clkdm",
2284 .recalc = &followparent_recalc,
2285};
2286
2287/* CAM */
2288
2289static struct clk cam_mclk = {
2290 .name = "cam_mclk",
2291 .ops = &clkops_omap2_dflt,
2292 .parent = &dpll4_m5x2_ck,
2293 .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_FCLKEN),
2294 .enable_bit = OMAP3430_EN_CAM_SHIFT,
2295 .clkdm_name = "cam_clkdm",
2296 .recalc = &followparent_recalc,
2297};
2298
2299static struct clk cam_ick = {
2300 /* Handles both L3 and L4 clocks */
2301 .name = "cam_ick",
2302 .ops = &clkops_omap2_dflt,
2303 .parent = &l4_ick,
2304 .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_ICLKEN),
2305 .enable_bit = OMAP3430_EN_CAM_SHIFT,
2306 .clkdm_name = "cam_clkdm",
2307 .recalc = &followparent_recalc,
2308};
2309
2310static struct clk csi2_96m_fck = {
2311 .name = "csi2_96m_fck",
2312 .ops = &clkops_omap2_dflt,
2313 .parent = &core_96m_fck,
2314 .enable_reg = OMAP_CM_REGADDR(OMAP3430_CAM_MOD, CM_FCLKEN),
2315 .enable_bit = OMAP3430_EN_CSI2_SHIFT,
2316 .clkdm_name = "cam_clkdm",
2317 .recalc = &followparent_recalc,
2318};
2319
2320/* USBHOST - 3430ES2 only */
2321
2322static struct clk usbhost_120m_fck = {
2323 .name = "usbhost_120m_fck",
2324 .ops = &clkops_omap2_dflt,
2325 .parent = &dpll5_m2_ck,
2326 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN),
2327 .enable_bit = OMAP3430ES2_EN_USBHOST2_SHIFT,
2328 .clkdm_name = "usbhost_clkdm",
2329 .recalc = &followparent_recalc,
2330};
2331
2332static struct clk usbhost_48m_fck = {
2333 .name = "usbhost_48m_fck",
2334 .ops = &clkops_omap3430es2_dss_usbhost_wait,
2335 .parent = &omap_48m_fck,
2336 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN),
2337 .enable_bit = OMAP3430ES2_EN_USBHOST1_SHIFT,
2338 .clkdm_name = "usbhost_clkdm",
2339 .recalc = &followparent_recalc,
2340};
2341
2342static struct clk usbhost_ick = {
2343 /* Handles both L3 and L4 clocks */
2344 .name = "usbhost_ick",
2345 .ops = &clkops_omap3430es2_dss_usbhost_wait,
2346 .parent = &l4_ick,
2347 .enable_reg = OMAP_CM_REGADDR(OMAP3430ES2_USBHOST_MOD, CM_ICLKEN),
2348 .enable_bit = OMAP3430ES2_EN_USBHOST_SHIFT,
2349 .clkdm_name = "usbhost_clkdm",
2350 .recalc = &followparent_recalc,
2351};
2352
2353/* WKUP */
2354
2355static const struct clksel_rate usim_96m_rates[] = {
2356 { .div = 2, .val = 3, .flags = RATE_IN_343X | DEFAULT_RATE },
2357 { .div = 4, .val = 4, .flags = RATE_IN_343X },
2358 { .div = 8, .val = 5, .flags = RATE_IN_343X },
2359 { .div = 10, .val = 6, .flags = RATE_IN_343X },
2360 { .div = 0 },
2361};
2362
2363static const struct clksel_rate usim_120m_rates[] = {
2364 { .div = 4, .val = 7, .flags = RATE_IN_343X | DEFAULT_RATE },
2365 { .div = 8, .val = 8, .flags = RATE_IN_343X },
2366 { .div = 16, .val = 9, .flags = RATE_IN_343X },
2367 { .div = 20, .val = 10, .flags = RATE_IN_343X },
2368 { .div = 0 },
2369};
2370
2371static const struct clksel usim_clksel[] = {
2372 { .parent = &omap_96m_fck, .rates = usim_96m_rates },
2373 { .parent = &dpll5_m2_ck, .rates = usim_120m_rates },
2374 { .parent = &sys_ck, .rates = div2_rates },
2375 { .parent = NULL },
2376};
2377
2378/* 3430ES2 only */
2379static struct clk usim_fck = {
2380 .name = "usim_fck",
2381 .ops = &clkops_omap2_dflt_wait,
2382 .init = &omap2_init_clksel_parent,
2383 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2384 .enable_bit = OMAP3430ES2_EN_USIMOCP_SHIFT,
2385 .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL),
2386 .clksel_mask = OMAP3430ES2_CLKSEL_USIMOCP_MASK,
2387 .clksel = usim_clksel,
2388 .recalc = &omap2_clksel_recalc,
2389};
2390
2391/* XXX should gpt1's clksel have wkup_32k_fck as the 32k opt? */
2392static struct clk gpt1_fck = {
2393 .name = "gpt1_fck",
2394 .ops = &clkops_omap2_dflt_wait,
2395 .init = &omap2_init_clksel_parent,
2396 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2397 .enable_bit = OMAP3430_EN_GPT1_SHIFT,
2398 .clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL),
2399 .clksel_mask = OMAP3430_CLKSEL_GPT1_MASK,
2400 .clksel = omap343x_gpt_clksel,
2401 .clkdm_name = "wkup_clkdm",
2402 .recalc = &omap2_clksel_recalc,
2403};
2404
2405static struct clk wkup_32k_fck = {
2406 .name = "wkup_32k_fck",
2407 .ops = &clkops_null,
2408 .parent = &omap_32k_fck,
2409 .clkdm_name = "wkup_clkdm",
2410 .recalc = &followparent_recalc,
2411};
2412
2413static struct clk gpio1_dbck = {
2414 .name = "gpio1_dbck",
2415 .ops = &clkops_omap2_dflt,
2416 .parent = &wkup_32k_fck,
2417 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2418 .enable_bit = OMAP3430_EN_GPIO1_SHIFT,
2419 .clkdm_name = "wkup_clkdm",
2420 .recalc = &followparent_recalc,
2421};
2422
2423static struct clk wdt2_fck = {
2424 .name = "wdt2_fck",
2425 .ops = &clkops_omap2_dflt_wait,
2426 .parent = &wkup_32k_fck,
2427 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
2428 .enable_bit = OMAP3430_EN_WDT2_SHIFT,
2429 .clkdm_name = "wkup_clkdm",
2430 .recalc = &followparent_recalc,
2431};
2432
2433static struct clk wkup_l4_ick = {
2434 .name = "wkup_l4_ick",
2435 .ops = &clkops_null,
2436 .parent = &sys_ck,
2437 .clkdm_name = "wkup_clkdm",
2438 .recalc = &followparent_recalc,
2439};
2440
2441/* 3430ES2 only */
2442/* Never specifically named in the TRM, so we have to infer a likely name */
2443static struct clk usim_ick = {
2444 .name = "usim_ick",
2445 .ops = &clkops_omap2_dflt_wait,
2446 .parent = &wkup_l4_ick,
2447 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2448 .enable_bit = OMAP3430ES2_EN_USIMOCP_SHIFT,
2449 .clkdm_name = "wkup_clkdm",
2450 .recalc = &followparent_recalc,
2451};
2452
2453static struct clk wdt2_ick = {
2454 .name = "wdt2_ick",
2455 .ops = &clkops_omap2_dflt_wait,
2456 .parent = &wkup_l4_ick,
2457 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2458 .enable_bit = OMAP3430_EN_WDT2_SHIFT,
2459 .clkdm_name = "wkup_clkdm",
2460 .recalc = &followparent_recalc,
2461};
2462
2463static struct clk wdt1_ick = {
2464 .name = "wdt1_ick",
2465 .ops = &clkops_omap2_dflt_wait,
2466 .parent = &wkup_l4_ick,
2467 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2468 .enable_bit = OMAP3430_EN_WDT1_SHIFT,
2469 .clkdm_name = "wkup_clkdm",
2470 .recalc = &followparent_recalc,
2471};
2472
2473static struct clk gpio1_ick = {
2474 .name = "gpio1_ick",
2475 .ops = &clkops_omap2_dflt_wait,
2476 .parent = &wkup_l4_ick,
2477 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2478 .enable_bit = OMAP3430_EN_GPIO1_SHIFT,
2479 .clkdm_name = "wkup_clkdm",
2480 .recalc = &followparent_recalc,
2481};
2482
2483static struct clk omap_32ksync_ick = {
2484 .name = "omap_32ksync_ick",
2485 .ops = &clkops_omap2_dflt_wait,
2486 .parent = &wkup_l4_ick,
2487 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2488 .enable_bit = OMAP3430_EN_32KSYNC_SHIFT,
2489 .clkdm_name = "wkup_clkdm",
2490 .recalc = &followparent_recalc,
2491};
2492
2493/* XXX This clock no longer exists in 3430 TRM rev F */
2494static struct clk gpt12_ick = {
2495 .name = "gpt12_ick",
2496 .ops = &clkops_omap2_dflt_wait,
2497 .parent = &wkup_l4_ick,
2498 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2499 .enable_bit = OMAP3430_EN_GPT12_SHIFT,
2500 .clkdm_name = "wkup_clkdm",
2501 .recalc = &followparent_recalc,
2502};
2503
2504static struct clk gpt1_ick = {
2505 .name = "gpt1_ick",
2506 .ops = &clkops_omap2_dflt_wait,
2507 .parent = &wkup_l4_ick,
2508 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),
2509 .enable_bit = OMAP3430_EN_GPT1_SHIFT,
2510 .clkdm_name = "wkup_clkdm",
2511 .recalc = &followparent_recalc,
2512};
2513
2514
2515
2516/* PER clock domain */
2517
2518static struct clk per_96m_fck = {
2519 .name = "per_96m_fck",
2520 .ops = &clkops_null,
2521 .parent = &omap_96m_alwon_fck,
2522 .clkdm_name = "per_clkdm",
2523 .recalc = &followparent_recalc,
2524};
2525
2526static struct clk per_48m_fck = {
2527 .name = "per_48m_fck",
2528 .ops = &clkops_null,
2529 .parent = &omap_48m_fck,
2530 .clkdm_name = "per_clkdm",
2531 .recalc = &followparent_recalc,
2532};
2533
2534static struct clk uart3_fck = {
2535 .name = "uart3_fck",
2536 .ops = &clkops_omap2_dflt_wait,
2537 .parent = &per_48m_fck,
2538 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2539 .enable_bit = OMAP3430_EN_UART3_SHIFT,
2540 .clkdm_name = "per_clkdm",
2541 .recalc = &followparent_recalc,
2542};
2543
2544static struct clk gpt2_fck = {
2545 .name = "gpt2_fck",
2546 .ops = &clkops_omap2_dflt_wait,
2547 .init = &omap2_init_clksel_parent,
2548 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2549 .enable_bit = OMAP3430_EN_GPT2_SHIFT,
2550 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2551 .clksel_mask = OMAP3430_CLKSEL_GPT2_MASK,
2552 .clksel = omap343x_gpt_clksel,
2553 .clkdm_name = "per_clkdm",
2554 .recalc = &omap2_clksel_recalc,
2555};
2556
2557static struct clk gpt3_fck = {
2558 .name = "gpt3_fck",
2559 .ops = &clkops_omap2_dflt_wait,
2560 .init = &omap2_init_clksel_parent,
2561 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2562 .enable_bit = OMAP3430_EN_GPT3_SHIFT,
2563 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2564 .clksel_mask = OMAP3430_CLKSEL_GPT3_MASK,
2565 .clksel = omap343x_gpt_clksel,
2566 .clkdm_name = "per_clkdm",
2567 .recalc = &omap2_clksel_recalc,
2568};
2569
2570static struct clk gpt4_fck = {
2571 .name = "gpt4_fck",
2572 .ops = &clkops_omap2_dflt_wait,
2573 .init = &omap2_init_clksel_parent,
2574 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2575 .enable_bit = OMAP3430_EN_GPT4_SHIFT,
2576 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2577 .clksel_mask = OMAP3430_CLKSEL_GPT4_MASK,
2578 .clksel = omap343x_gpt_clksel,
2579 .clkdm_name = "per_clkdm",
2580 .recalc = &omap2_clksel_recalc,
2581};
2582
2583static struct clk gpt5_fck = {
2584 .name = "gpt5_fck",
2585 .ops = &clkops_omap2_dflt_wait,
2586 .init = &omap2_init_clksel_parent,
2587 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2588 .enable_bit = OMAP3430_EN_GPT5_SHIFT,
2589 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2590 .clksel_mask = OMAP3430_CLKSEL_GPT5_MASK,
2591 .clksel = omap343x_gpt_clksel,
2592 .clkdm_name = "per_clkdm",
2593 .recalc = &omap2_clksel_recalc,
2594};
2595
2596static struct clk gpt6_fck = {
2597 .name = "gpt6_fck",
2598 .ops = &clkops_omap2_dflt_wait,
2599 .init = &omap2_init_clksel_parent,
2600 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2601 .enable_bit = OMAP3430_EN_GPT6_SHIFT,
2602 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2603 .clksel_mask = OMAP3430_CLKSEL_GPT6_MASK,
2604 .clksel = omap343x_gpt_clksel,
2605 .clkdm_name = "per_clkdm",
2606 .recalc = &omap2_clksel_recalc,
2607};
2608
2609static struct clk gpt7_fck = {
2610 .name = "gpt7_fck",
2611 .ops = &clkops_omap2_dflt_wait,
2612 .init = &omap2_init_clksel_parent,
2613 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2614 .enable_bit = OMAP3430_EN_GPT7_SHIFT,
2615 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2616 .clksel_mask = OMAP3430_CLKSEL_GPT7_MASK,
2617 .clksel = omap343x_gpt_clksel,
2618 .clkdm_name = "per_clkdm",
2619 .recalc = &omap2_clksel_recalc,
2620};
2621
2622static struct clk gpt8_fck = {
2623 .name = "gpt8_fck",
2624 .ops = &clkops_omap2_dflt_wait,
2625 .init = &omap2_init_clksel_parent,
2626 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2627 .enable_bit = OMAP3430_EN_GPT8_SHIFT,
2628 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2629 .clksel_mask = OMAP3430_CLKSEL_GPT8_MASK,
2630 .clksel = omap343x_gpt_clksel,
2631 .clkdm_name = "per_clkdm",
2632 .recalc = &omap2_clksel_recalc,
2633};
2634
2635static struct clk gpt9_fck = {
2636 .name = "gpt9_fck",
2637 .ops = &clkops_omap2_dflt_wait,
2638 .init = &omap2_init_clksel_parent,
2639 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2640 .enable_bit = OMAP3430_EN_GPT9_SHIFT,
2641 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_CLKSEL),
2642 .clksel_mask = OMAP3430_CLKSEL_GPT9_MASK,
2643 .clksel = omap343x_gpt_clksel,
2644 .clkdm_name = "per_clkdm",
2645 .recalc = &omap2_clksel_recalc,
2646};
2647
2648static struct clk per_32k_alwon_fck = {
2649 .name = "per_32k_alwon_fck",
2650 .ops = &clkops_null,
2651 .parent = &omap_32k_fck,
2652 .clkdm_name = "per_clkdm",
2653 .recalc = &followparent_recalc,
2654};
2655
2656static struct clk gpio6_dbck = {
2657 .name = "gpio6_dbck",
2658 .ops = &clkops_omap2_dflt,
2659 .parent = &per_32k_alwon_fck,
2660 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2661 .enable_bit = OMAP3430_EN_GPIO6_SHIFT,
2662 .clkdm_name = "per_clkdm",
2663 .recalc = &followparent_recalc,
2664};
2665
2666static struct clk gpio5_dbck = {
2667 .name = "gpio5_dbck",
2668 .ops = &clkops_omap2_dflt,
2669 .parent = &per_32k_alwon_fck,
2670 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2671 .enable_bit = OMAP3430_EN_GPIO5_SHIFT,
2672 .clkdm_name = "per_clkdm",
2673 .recalc = &followparent_recalc,
2674};
2675
2676static struct clk gpio4_dbck = {
2677 .name = "gpio4_dbck",
2678 .ops = &clkops_omap2_dflt,
2679 .parent = &per_32k_alwon_fck,
2680 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2681 .enable_bit = OMAP3430_EN_GPIO4_SHIFT,
2682 .clkdm_name = "per_clkdm",
2683 .recalc = &followparent_recalc,
2684};
2685
2686static struct clk gpio3_dbck = {
2687 .name = "gpio3_dbck",
2688 .ops = &clkops_omap2_dflt,
2689 .parent = &per_32k_alwon_fck,
2690 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2691 .enable_bit = OMAP3430_EN_GPIO3_SHIFT,
2692 .clkdm_name = "per_clkdm",
2693 .recalc = &followparent_recalc,
2694};
2695
2696static struct clk gpio2_dbck = {
2697 .name = "gpio2_dbck",
2698 .ops = &clkops_omap2_dflt,
2699 .parent = &per_32k_alwon_fck,
2700 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2701 .enable_bit = OMAP3430_EN_GPIO2_SHIFT,
2702 .clkdm_name = "per_clkdm",
2703 .recalc = &followparent_recalc,
2704};
2705
2706static struct clk wdt3_fck = {
2707 .name = "wdt3_fck",
2708 .ops = &clkops_omap2_dflt_wait,
2709 .parent = &per_32k_alwon_fck,
2710 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2711 .enable_bit = OMAP3430_EN_WDT3_SHIFT,
2712 .clkdm_name = "per_clkdm",
2713 .recalc = &followparent_recalc,
2714};
2715
2716static struct clk per_l4_ick = {
2717 .name = "per_l4_ick",
2718 .ops = &clkops_null,
2719 .parent = &l4_ick,
2720 .clkdm_name = "per_clkdm",
2721 .recalc = &followparent_recalc,
2722};
2723
2724static struct clk gpio6_ick = {
2725 .name = "gpio6_ick",
2726 .ops = &clkops_omap2_dflt_wait,
2727 .parent = &per_l4_ick,
2728 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2729 .enable_bit = OMAP3430_EN_GPIO6_SHIFT,
2730 .clkdm_name = "per_clkdm",
2731 .recalc = &followparent_recalc,
2732};
2733
2734static struct clk gpio5_ick = {
2735 .name = "gpio5_ick",
2736 .ops = &clkops_omap2_dflt_wait,
2737 .parent = &per_l4_ick,
2738 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2739 .enable_bit = OMAP3430_EN_GPIO5_SHIFT,
2740 .clkdm_name = "per_clkdm",
2741 .recalc = &followparent_recalc,
2742};
2743
2744static struct clk gpio4_ick = {
2745 .name = "gpio4_ick",
2746 .ops = &clkops_omap2_dflt_wait,
2747 .parent = &per_l4_ick,
2748 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2749 .enable_bit = OMAP3430_EN_GPIO4_SHIFT,
2750 .clkdm_name = "per_clkdm",
2751 .recalc = &followparent_recalc,
2752};
2753
2754static struct clk gpio3_ick = {
2755 .name = "gpio3_ick",
2756 .ops = &clkops_omap2_dflt_wait,
2757 .parent = &per_l4_ick,
2758 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2759 .enable_bit = OMAP3430_EN_GPIO3_SHIFT,
2760 .clkdm_name = "per_clkdm",
2761 .recalc = &followparent_recalc,
2762};
2763
2764static struct clk gpio2_ick = {
2765 .name = "gpio2_ick",
2766 .ops = &clkops_omap2_dflt_wait,
2767 .parent = &per_l4_ick,
2768 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2769 .enable_bit = OMAP3430_EN_GPIO2_SHIFT,
2770 .clkdm_name = "per_clkdm",
2771 .recalc = &followparent_recalc,
2772};
2773
2774static struct clk wdt3_ick = {
2775 .name = "wdt3_ick",
2776 .ops = &clkops_omap2_dflt_wait,
2777 .parent = &per_l4_ick,
2778 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2779 .enable_bit = OMAP3430_EN_WDT3_SHIFT,
2780 .clkdm_name = "per_clkdm",
2781 .recalc = &followparent_recalc,
2782};
2783
2784static struct clk uart3_ick = {
2785 .name = "uart3_ick",
2786 .ops = &clkops_omap2_dflt_wait,
2787 .parent = &per_l4_ick,
2788 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2789 .enable_bit = OMAP3430_EN_UART3_SHIFT,
2790 .clkdm_name = "per_clkdm",
2791 .recalc = &followparent_recalc,
2792};
2793
2794static struct clk gpt9_ick = {
2795 .name = "gpt9_ick",
2796 .ops = &clkops_omap2_dflt_wait,
2797 .parent = &per_l4_ick,
2798 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2799 .enable_bit = OMAP3430_EN_GPT9_SHIFT,
2800 .clkdm_name = "per_clkdm",
2801 .recalc = &followparent_recalc,
2802};
2803
2804static struct clk gpt8_ick = {
2805 .name = "gpt8_ick",
2806 .ops = &clkops_omap2_dflt_wait,
2807 .parent = &per_l4_ick,
2808 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2809 .enable_bit = OMAP3430_EN_GPT8_SHIFT,
2810 .clkdm_name = "per_clkdm",
2811 .recalc = &followparent_recalc,
2812};
2813
2814static struct clk gpt7_ick = {
2815 .name = "gpt7_ick",
2816 .ops = &clkops_omap2_dflt_wait,
2817 .parent = &per_l4_ick,
2818 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2819 .enable_bit = OMAP3430_EN_GPT7_SHIFT,
2820 .clkdm_name = "per_clkdm",
2821 .recalc = &followparent_recalc,
2822};
2823
2824static struct clk gpt6_ick = {
2825 .name = "gpt6_ick",
2826 .ops = &clkops_omap2_dflt_wait,
2827 .parent = &per_l4_ick,
2828 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2829 .enable_bit = OMAP3430_EN_GPT6_SHIFT,
2830 .clkdm_name = "per_clkdm",
2831 .recalc = &followparent_recalc,
2832};
2833
2834static struct clk gpt5_ick = {
2835 .name = "gpt5_ick",
2836 .ops = &clkops_omap2_dflt_wait,
2837 .parent = &per_l4_ick,
2838 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2839 .enable_bit = OMAP3430_EN_GPT5_SHIFT,
2840 .clkdm_name = "per_clkdm",
2841 .recalc = &followparent_recalc,
2842};
2843
2844static struct clk gpt4_ick = {
2845 .name = "gpt4_ick",
2846 .ops = &clkops_omap2_dflt_wait,
2847 .parent = &per_l4_ick,
2848 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2849 .enable_bit = OMAP3430_EN_GPT4_SHIFT,
2850 .clkdm_name = "per_clkdm",
2851 .recalc = &followparent_recalc,
2852};
2853
2854static struct clk gpt3_ick = {
2855 .name = "gpt3_ick",
2856 .ops = &clkops_omap2_dflt_wait,
2857 .parent = &per_l4_ick,
2858 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2859 .enable_bit = OMAP3430_EN_GPT3_SHIFT,
2860 .clkdm_name = "per_clkdm",
2861 .recalc = &followparent_recalc,
2862};
2863
2864static struct clk gpt2_ick = {
2865 .name = "gpt2_ick",
2866 .ops = &clkops_omap2_dflt_wait,
2867 .parent = &per_l4_ick,
2868 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2869 .enable_bit = OMAP3430_EN_GPT2_SHIFT,
2870 .clkdm_name = "per_clkdm",
2871 .recalc = &followparent_recalc,
2872};
2873
2874static struct clk mcbsp2_ick = {
2875 .name = "mcbsp2_ick",
2876 .ops = &clkops_omap2_dflt_wait,
2877 .parent = &per_l4_ick,
2878 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2879 .enable_bit = OMAP3430_EN_MCBSP2_SHIFT,
2880 .clkdm_name = "per_clkdm",
2881 .recalc = &followparent_recalc,
2882};
2883
2884static struct clk mcbsp3_ick = {
2885 .name = "mcbsp3_ick",
2886 .ops = &clkops_omap2_dflt_wait,
2887 .parent = &per_l4_ick,
2888 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2889 .enable_bit = OMAP3430_EN_MCBSP3_SHIFT,
2890 .clkdm_name = "per_clkdm",
2891 .recalc = &followparent_recalc,
2892};
2893
2894static struct clk mcbsp4_ick = {
2895 .name = "mcbsp4_ick",
2896 .ops = &clkops_omap2_dflt_wait,
2897 .parent = &per_l4_ick,
2898 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
2899 .enable_bit = OMAP3430_EN_MCBSP4_SHIFT,
2900 .clkdm_name = "per_clkdm",
2901 .recalc = &followparent_recalc,
2902};
2903
2904static const struct clksel mcbsp_234_clksel[] = {
2905 { .parent = &per_96m_fck, .rates = common_mcbsp_96m_rates },
2906 { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },
2907 { .parent = NULL }
2908};
2909
2910static struct clk mcbsp2_fck = {
2911 .name = "mcbsp2_fck",
2912 .ops = &clkops_omap2_dflt_wait,
2913 .init = &omap2_init_clksel_parent,
2914 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2915 .enable_bit = OMAP3430_EN_MCBSP2_SHIFT,
2916 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
2917 .clksel_mask = OMAP2_MCBSP2_CLKS_MASK,
2918 .clksel = mcbsp_234_clksel,
2919 .clkdm_name = "per_clkdm",
2920 .recalc = &omap2_clksel_recalc,
2921};
2922
2923static struct clk mcbsp3_fck = {
2924 .name = "mcbsp3_fck",
2925 .ops = &clkops_omap2_dflt_wait,
2926 .init = &omap2_init_clksel_parent,
2927 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2928 .enable_bit = OMAP3430_EN_MCBSP3_SHIFT,
2929 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1),
2930 .clksel_mask = OMAP2_MCBSP3_CLKS_MASK,
2931 .clksel = mcbsp_234_clksel,
2932 .clkdm_name = "per_clkdm",
2933 .recalc = &omap2_clksel_recalc,
2934};
2935
2936static struct clk mcbsp4_fck = {
2937 .name = "mcbsp4_fck",
2938 .ops = &clkops_omap2_dflt_wait,
2939 .init = &omap2_init_clksel_parent,
2940 .enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
2941 .enable_bit = OMAP3430_EN_MCBSP4_SHIFT,
2942 .clksel_reg = OMAP343X_CTRL_REGADDR(OMAP343X_CONTROL_DEVCONF1),
2943 .clksel_mask = OMAP2_MCBSP4_CLKS_MASK,
2944 .clksel = mcbsp_234_clksel,
2945 .clkdm_name = "per_clkdm",
2946 .recalc = &omap2_clksel_recalc,
2947};
2948
2949/* EMU clocks */
2950
2951/* More information: ARM Cortex-A8 Technical Reference Manual, sect 10.1 */
2952
2953static const struct clksel_rate emu_src_sys_rates[] = {
2954 { .div = 1, .val = 0, .flags = RATE_IN_343X | DEFAULT_RATE },
2955 { .div = 0 },
2956};
2957
2958static const struct clksel_rate emu_src_core_rates[] = {
2959 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
2960 { .div = 0 },
2961};
2962
2963static const struct clksel_rate emu_src_per_rates[] = {
2964 { .div = 1, .val = 2, .flags = RATE_IN_343X | DEFAULT_RATE },
2965 { .div = 0 },
2966};
2967
2968static const struct clksel_rate emu_src_mpu_rates[] = {
2969 { .div = 1, .val = 3, .flags = RATE_IN_343X | DEFAULT_RATE },
2970 { .div = 0 },
2971};
2972
2973static const struct clksel emu_src_clksel[] = {
2974 { .parent = &sys_ck, .rates = emu_src_sys_rates },
2975 { .parent = &emu_core_alwon_ck, .rates = emu_src_core_rates },
2976 { .parent = &emu_per_alwon_ck, .rates = emu_src_per_rates },
2977 { .parent = &emu_mpu_alwon_ck, .rates = emu_src_mpu_rates },
2978 { .parent = NULL },
2979};
2980
2981/*
2982 * Like the clkout_src clocks, emu_src_clk is a virtual clock, existing only
2983 * to switch the source of some of the EMU clocks.
2984 * XXX Are there CLKEN bits for these EMU clks?
2985 */
2986static struct clk emu_src_ck = {
2987 .name = "emu_src_ck",
2988 .ops = &clkops_null,
2989 .init = &omap2_init_clksel_parent,
2990 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
2991 .clksel_mask = OMAP3430_MUX_CTRL_MASK,
2992 .clksel = emu_src_clksel,
2993 .clkdm_name = "emu_clkdm",
2994 .recalc = &omap2_clksel_recalc,
2995};
2996
2997static const struct clksel_rate pclk_emu_rates[] = {
2998 { .div = 2, .val = 2, .flags = RATE_IN_343X | DEFAULT_RATE },
2999 { .div = 3, .val = 3, .flags = RATE_IN_343X },
3000 { .div = 4, .val = 4, .flags = RATE_IN_343X },
3001 { .div = 6, .val = 6, .flags = RATE_IN_343X },
3002 { .div = 0 },
3003};
3004
3005static const struct clksel pclk_emu_clksel[] = {
3006 { .parent = &emu_src_ck, .rates = pclk_emu_rates },
3007 { .parent = NULL },
3008};
3009
3010static struct clk pclk_fck = {
3011 .name = "pclk_fck",
3012 .ops = &clkops_null,
3013 .init = &omap2_init_clksel_parent,
3014 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
3015 .clksel_mask = OMAP3430_CLKSEL_PCLK_MASK,
3016 .clksel = pclk_emu_clksel,
3017 .clkdm_name = "emu_clkdm",
3018 .recalc = &omap2_clksel_recalc,
3019};
3020
3021static const struct clksel_rate pclkx2_emu_rates[] = {
3022 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
3023 { .div = 2, .val = 2, .flags = RATE_IN_343X },
3024 { .div = 3, .val = 3, .flags = RATE_IN_343X },
3025 { .div = 0 },
3026};
3027
3028static const struct clksel pclkx2_emu_clksel[] = {
3029 { .parent = &emu_src_ck, .rates = pclkx2_emu_rates },
3030 { .parent = NULL },
3031};
3032
3033static struct clk pclkx2_fck = {
3034 .name = "pclkx2_fck",
3035 .ops = &clkops_null,
3036 .init = &omap2_init_clksel_parent,
3037 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
3038 .clksel_mask = OMAP3430_CLKSEL_PCLKX2_MASK,
3039 .clksel = pclkx2_emu_clksel,
3040 .clkdm_name = "emu_clkdm",
3041 .recalc = &omap2_clksel_recalc,
3042};
3043
3044static const struct clksel atclk_emu_clksel[] = {
3045 { .parent = &emu_src_ck, .rates = div2_rates },
3046 { .parent = NULL },
3047};
3048
3049static struct clk atclk_fck = {
3050 .name = "atclk_fck",
3051 .ops = &clkops_null,
3052 .init = &omap2_init_clksel_parent,
3053 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
3054 .clksel_mask = OMAP3430_CLKSEL_ATCLK_MASK,
3055 .clksel = atclk_emu_clksel,
3056 .clkdm_name = "emu_clkdm",
3057 .recalc = &omap2_clksel_recalc,
3058};
3059
3060static struct clk traceclk_src_fck = {
3061 .name = "traceclk_src_fck",
3062 .ops = &clkops_null,
3063 .init = &omap2_init_clksel_parent,
3064 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
3065 .clksel_mask = OMAP3430_TRACE_MUX_CTRL_MASK,
3066 .clksel = emu_src_clksel,
3067 .clkdm_name = "emu_clkdm",
3068 .recalc = &omap2_clksel_recalc,
3069};
3070
3071static const struct clksel_rate traceclk_rates[] = {
3072 { .div = 1, .val = 1, .flags = RATE_IN_343X | DEFAULT_RATE },
3073 { .div = 2, .val = 2, .flags = RATE_IN_343X },
3074 { .div = 4, .val = 4, .flags = RATE_IN_343X },
3075 { .div = 0 },
3076};
3077
3078static const struct clksel traceclk_clksel[] = {
3079 { .parent = &traceclk_src_fck, .rates = traceclk_rates },
3080 { .parent = NULL },
3081};
3082
3083static struct clk traceclk_fck = {
3084 .name = "traceclk_fck",
3085 .ops = &clkops_null,
3086 .init = &omap2_init_clksel_parent,
3087 .clksel_reg = OMAP_CM_REGADDR(OMAP3430_EMU_MOD, CM_CLKSEL1),
3088 .clksel_mask = OMAP3430_CLKSEL_TRACECLK_MASK,
3089 .clksel = traceclk_clksel,
3090 .clkdm_name = "emu_clkdm",
3091 .recalc = &omap2_clksel_recalc,
3092};
3093
3094/* SR clocks */
3095
3096/* SmartReflex fclk (VDD1) */
3097static struct clk sr1_fck = {
3098 .name = "sr1_fck",
3099 .ops = &clkops_omap2_dflt_wait,
3100 .parent = &sys_ck,
3101 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
3102 .enable_bit = OMAP3430_EN_SR1_SHIFT,
3103 .recalc = &followparent_recalc,
3104};
3105
3106/* SmartReflex fclk (VDD2) */
3107static struct clk sr2_fck = {
3108 .name = "sr2_fck",
3109 .ops = &clkops_omap2_dflt_wait,
3110 .parent = &sys_ck,
3111 .enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),
3112 .enable_bit = OMAP3430_EN_SR2_SHIFT,
3113 .recalc = &followparent_recalc,
3114};
3115
3116static struct clk sr_l4_ick = {
3117 .name = "sr_l4_ick",
3118 .ops = &clkops_null, /* RMK: missing? */
3119 .parent = &l4_ick,
3120 .clkdm_name = "core_l4_clkdm",
3121 .recalc = &followparent_recalc,
3122};
3123
3124/* SECURE_32K_FCK clocks */
3125
3126static struct clk gpt12_fck = {
3127 .name = "gpt12_fck",
3128 .ops = &clkops_null,
3129 .parent = &secure_32k_fck,
3130 .recalc = &followparent_recalc,
3131};
3132
3133static struct clk wdt1_fck = {
3134 .name = "wdt1_fck",
3135 .ops = &clkops_null,
3136 .parent = &secure_32k_fck,
3137 .recalc = &followparent_recalc,
3138};
3139
3140/* Clocks for AM35XX */
3141static struct clk ipss_ick = {
3142 .name = "ipss_ick",
3143 .ops = &clkops_am35xx_ipss_wait,
3144 .parent = &core_l3_ick,
3145 .clkdm_name = "core_l3_clkdm",
3146 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
3147 .enable_bit = AM35XX_EN_IPSS_SHIFT,
3148 .recalc = &followparent_recalc,
3149};
3150
3151static struct clk emac_ick = {
3152 .name = "emac_ick",
3153 .ops = &clkops_am35xx_ipss_module_wait,
3154 .parent = &ipss_ick,
3155 .clkdm_name = "core_l3_clkdm",
3156 .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL),
3157 .enable_bit = AM35XX_CPGMAC_VBUSP_CLK_SHIFT,
3158 .recalc = &followparent_recalc,
3159};
3160
3161static struct clk rmii_ck = {
3162 .name = "rmii_ck",
3163 .ops = &clkops_null,
3164 .rate = 50000000,
3165};
3166
3167static struct clk emac_fck = {
3168 .name = "emac_fck",
3169 .ops = &clkops_omap2_dflt,
3170 .parent = &rmii_ck,
3171 .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL),
3172 .enable_bit = AM35XX_CPGMAC_FCLK_SHIFT,
3173 .recalc = &followparent_recalc,
3174};
3175
3176static struct clk hsotgusb_ick_am35xx = {
3177 .name = "hsotgusb_ick",
3178 .ops = &clkops_am35xx_ipss_module_wait,
3179 .parent = &ipss_ick,
3180 .clkdm_name = "core_l3_clkdm",
3181 .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL),
3182 .enable_bit = AM35XX_USBOTG_VBUSP_CLK_SHIFT,
3183 .recalc = &followparent_recalc,
3184};
3185
3186static struct clk hsotgusb_fck_am35xx = {
3187 .name = "hsotgusb_fck",
3188 .ops = &clkops_omap2_dflt,
3189 .parent = &sys_ck,
3190 .clkdm_name = "core_l3_clkdm",
3191 .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL),
3192 .enable_bit = AM35XX_USBOTG_FCLK_SHIFT,
3193 .recalc = &followparent_recalc,
3194};
3195
3196static struct clk hecc_ck = {
3197 .name = "hecc_ck",
3198 .ops = &clkops_am35xx_ipss_module_wait,
3199 .parent = &sys_ck,
3200 .clkdm_name = "core_l3_clkdm",
3201 .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL),
3202 .enable_bit = AM35XX_HECC_VBUSP_CLK_SHIFT,
3203 .recalc = &followparent_recalc,
3204};
3205
3206static struct clk vpfe_ick = {
3207 .name = "vpfe_ick",
3208 .ops = &clkops_am35xx_ipss_module_wait,
3209 .parent = &ipss_ick,
3210 .clkdm_name = "core_l3_clkdm",
3211 .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL),
3212 .enable_bit = AM35XX_VPFE_VBUSP_CLK_SHIFT,
3213 .recalc = &followparent_recalc,
3214};
3215
3216static struct clk pclk_ck = {
3217 .name = "pclk_ck",
3218 .ops = &clkops_null,
3219 .rate = 27000000,
3220};
3221
3222static struct clk vpfe_fck = {
3223 .name = "vpfe_fck",
3224 .ops = &clkops_omap2_dflt,
3225 .parent = &pclk_ck,
3226 .enable_reg = OMAP343X_CTRL_REGADDR(AM35XX_CONTROL_IPSS_CLK_CTRL),
3227 .enable_bit = AM35XX_VPFE_FCLK_SHIFT,
3228 .recalc = &followparent_recalc,
3229};
3230
3231/*
3232 * The UART1/2 functional clock acts as the functional
3233 * clock for UART4. No separate fclk control available.
3234 */
3235static struct clk uart4_ick_am35xx = {
3236 .name = "uart4_ick",
3237 .ops = &clkops_omap2_dflt_wait,
3238 .parent = &core_l4_ick,
3239 .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),
3240 .enable_bit = AM35XX_EN_UART4_SHIFT,
3241 .clkdm_name = "core_l4_clkdm",
3242 .recalc = &followparent_recalc,
3243};
3244
3245
3246/*
3247 * clkdev
3248 */
3249
3250/* XXX At some point we should rename this file to clock3xxx_data.c */
3251static struct omap_clk omap3xxx_clks[] = {
3252 CLK(NULL, "omap_32k_fck", &omap_32k_fck, CK_3XXX),
3253 CLK(NULL, "virt_12m_ck", &virt_12m_ck, CK_3XXX),
3254 CLK(NULL, "virt_13m_ck", &virt_13m_ck, CK_3XXX),
3255 CLK(NULL, "virt_16_8m_ck", &virt_16_8m_ck, CK_3430ES2 | CK_AM35XX),
3256 CLK(NULL, "virt_19_2m_ck", &virt_19_2m_ck, CK_3XXX),
3257 CLK(NULL, "virt_26m_ck", &virt_26m_ck, CK_3XXX),
3258 CLK(NULL, "virt_38_4m_ck", &virt_38_4m_ck, CK_3XXX),
3259 CLK(NULL, "osc_sys_ck", &osc_sys_ck, CK_3XXX),
3260 CLK(NULL, "sys_ck", &sys_ck, CK_3XXX),
3261 CLK(NULL, "sys_altclk", &sys_altclk, CK_3XXX),
3262 CLK(NULL, "mcbsp_clks", &mcbsp_clks, CK_3XXX),
3263 CLK(NULL, "sys_clkout1", &sys_clkout1, CK_3XXX),
3264 CLK(NULL, "dpll1_ck", &dpll1_ck, CK_3XXX),
3265 CLK(NULL, "dpll1_x2_ck", &dpll1_x2_ck, CK_3XXX),
3266 CLK(NULL, "dpll1_x2m2_ck", &dpll1_x2m2_ck, CK_3XXX),
3267 CLK(NULL, "dpll2_ck", &dpll2_ck, CK_343X),
3268 CLK(NULL, "dpll2_m2_ck", &dpll2_m2_ck, CK_343X),
3269 CLK(NULL, "dpll3_ck", &dpll3_ck, CK_3XXX),
3270 CLK(NULL, "core_ck", &core_ck, CK_3XXX),
3271 CLK(NULL, "dpll3_x2_ck", &dpll3_x2_ck, CK_3XXX),
3272 CLK(NULL, "dpll3_m2_ck", &dpll3_m2_ck, CK_3XXX),
3273 CLK(NULL, "dpll3_m2x2_ck", &dpll3_m2x2_ck, CK_3XXX),
3274 CLK(NULL, "dpll3_m3_ck", &dpll3_m3_ck, CK_3XXX),
3275 CLK(NULL, "dpll3_m3x2_ck", &dpll3_m3x2_ck, CK_3XXX),
3276 CLK("etb", "emu_core_alwon_ck", &emu_core_alwon_ck, CK_3XXX),
3277 CLK(NULL, "dpll4_ck", &dpll4_ck, CK_3XXX),
3278 CLK(NULL, "dpll4_x2_ck", &dpll4_x2_ck, CK_3XXX),
3279 CLK(NULL, "omap_192m_alwon_fck", &omap_192m_alwon_fck, CK_36XX),
3280 CLK(NULL, "omap_96m_alwon_fck", &omap_96m_alwon_fck, CK_3XXX),
3281 CLK(NULL, "omap_96m_fck", &omap_96m_fck, CK_3XXX),
3282 CLK(NULL, "cm_96m_fck", &cm_96m_fck, CK_3XXX),
3283 CLK(NULL, "omap_54m_fck", &omap_54m_fck, CK_3XXX),
3284 CLK(NULL, "omap_48m_fck", &omap_48m_fck, CK_3XXX),
3285 CLK(NULL, "omap_12m_fck", &omap_12m_fck, CK_3XXX),
3286 CLK(NULL, "dpll4_m2_ck", &dpll4_m2_ck, CK_3XXX),
3287 CLK(NULL, "dpll4_m2x2_ck", &dpll4_m2x2_ck, CK_3XXX),
3288 CLK(NULL, "dpll4_m3_ck", &dpll4_m3_ck, CK_3XXX),
3289 CLK(NULL, "dpll4_m3x2_ck", &dpll4_m3x2_ck, CK_3XXX),
3290 CLK(NULL, "dpll4_m4_ck", &dpll4_m4_ck, CK_3XXX),
3291 CLK(NULL, "dpll4_m4x2_ck", &dpll4_m4x2_ck, CK_3XXX),
3292 CLK(NULL, "dpll4_m5_ck", &dpll4_m5_ck, CK_3XXX),
3293 CLK(NULL, "dpll4_m5x2_ck", &dpll4_m5x2_ck, CK_3XXX),
3294 CLK(NULL, "dpll4_m6_ck", &dpll4_m6_ck, CK_3XXX),
3295 CLK(NULL, "dpll4_m6x2_ck", &dpll4_m6x2_ck, CK_3XXX),
3296 CLK("etb", "emu_per_alwon_ck", &emu_per_alwon_ck, CK_3XXX),
3297 CLK(NULL, "dpll5_ck", &dpll5_ck, CK_3430ES2 | CK_AM35XX),
3298 CLK(NULL, "dpll5_m2_ck", &dpll5_m2_ck, CK_3430ES2 | CK_AM35XX),
3299 CLK(NULL, "clkout2_src_ck", &clkout2_src_ck, CK_3XXX),
3300 CLK(NULL, "sys_clkout2", &sys_clkout2, CK_3XXX),
3301 CLK(NULL, "corex2_fck", &corex2_fck, CK_3XXX),
3302 CLK(NULL, "dpll1_fck", &dpll1_fck, CK_3XXX),
3303 CLK(NULL, "mpu_ck", &mpu_ck, CK_3XXX),
3304 CLK(NULL, "arm_fck", &arm_fck, CK_3XXX),
3305 CLK("etb", "emu_mpu_alwon_ck", &emu_mpu_alwon_ck, CK_3XXX),
3306 CLK(NULL, "dpll2_fck", &dpll2_fck, CK_343X),
3307 CLK(NULL, "iva2_ck", &iva2_ck, CK_343X),
3308 CLK(NULL, "l3_ick", &l3_ick, CK_3XXX),
3309 CLK(NULL, "l4_ick", &l4_ick, CK_3XXX),
3310 CLK(NULL, "rm_ick", &rm_ick, CK_3XXX),
3311 CLK(NULL, "gfx_l3_ck", &gfx_l3_ck, CK_3430ES1),
3312 CLK(NULL, "gfx_l3_fck", &gfx_l3_fck, CK_3430ES1),
3313 CLK(NULL, "gfx_l3_ick", &gfx_l3_ick, CK_3430ES1),
3314 CLK(NULL, "gfx_cg1_ck", &gfx_cg1_ck, CK_3430ES1),
3315 CLK(NULL, "gfx_cg2_ck", &gfx_cg2_ck, CK_3430ES1),
3316 CLK(NULL, "sgx_fck", &sgx_fck, CK_3430ES2 | CK_3517),
3317 CLK(NULL, "sgx_ick", &sgx_ick, CK_3430ES2 | CK_3517),
3318 CLK(NULL, "d2d_26m_fck", &d2d_26m_fck, CK_3430ES1),
3319 CLK(NULL, "modem_fck", &modem_fck, CK_343X),
3320 CLK(NULL, "sad2d_ick", &sad2d_ick, CK_343X),
3321 CLK(NULL, "mad2d_ick", &mad2d_ick, CK_343X),
3322 CLK(NULL, "gpt10_fck", &gpt10_fck, CK_3XXX),
3323 CLK(NULL, "gpt11_fck", &gpt11_fck, CK_3XXX),
3324 CLK(NULL, "cpefuse_fck", &cpefuse_fck, CK_3430ES2 | CK_AM35XX),
3325 CLK(NULL, "ts_fck", &ts_fck, CK_3430ES2 | CK_AM35XX),
3326 CLK(NULL, "usbtll_fck", &usbtll_fck, CK_3430ES2 | CK_AM35XX),
3327 CLK(NULL, "core_96m_fck", &core_96m_fck, CK_3XXX),
3328 CLK("mmci-omap-hs.2", "fck", &mmchs3_fck, CK_3430ES2 | CK_AM35XX),
3329 CLK("mmci-omap-hs.1", "fck", &mmchs2_fck, CK_3XXX),
3330 CLK(NULL, "mspro_fck", &mspro_fck, CK_343X),
3331 CLK("mmci-omap-hs.0", "fck", &mmchs1_fck, CK_3XXX),
3332 CLK("i2c_omap.3", "fck", &i2c3_fck, CK_3XXX),
3333 CLK("i2c_omap.2", "fck", &i2c2_fck, CK_3XXX),
3334 CLK("i2c_omap.1", "fck", &i2c1_fck, CK_3XXX),
3335 CLK("omap-mcbsp.5", "fck", &mcbsp5_fck, CK_3XXX),
3336 CLK("omap-mcbsp.1", "fck", &mcbsp1_fck, CK_3XXX),
3337 CLK(NULL, "core_48m_fck", &core_48m_fck, CK_3XXX),
3338 CLK("omap2_mcspi.4", "fck", &mcspi4_fck, CK_3XXX),
3339 CLK("omap2_mcspi.3", "fck", &mcspi3_fck, CK_3XXX),
3340 CLK("omap2_mcspi.2", "fck", &mcspi2_fck, CK_3XXX),
3341 CLK("omap2_mcspi.1", "fck", &mcspi1_fck, CK_3XXX),
3342 CLK(NULL, "uart2_fck", &uart2_fck, CK_3XXX),
3343 CLK(NULL, "uart1_fck", &uart1_fck, CK_3XXX),
3344 CLK(NULL, "fshostusb_fck", &fshostusb_fck, CK_3430ES1),
3345 CLK(NULL, "core_12m_fck", &core_12m_fck, CK_3XXX),
3346 CLK("omap_hdq.0", "fck", &hdq_fck, CK_3XXX),
3347 CLK(NULL, "ssi_ssr_fck", &ssi_ssr_fck_3430es1, CK_3430ES1),
3348 CLK(NULL, "ssi_ssr_fck", &ssi_ssr_fck_3430es2, CK_3430ES2),
3349 CLK(NULL, "ssi_sst_fck", &ssi_sst_fck_3430es1, CK_3430ES1),
3350 CLK(NULL, "ssi_sst_fck", &ssi_sst_fck_3430es2, CK_3430ES2),
3351 CLK(NULL, "core_l3_ick", &core_l3_ick, CK_3XXX),
3352 CLK("musb_hdrc", "ick", &hsotgusb_ick_3430es1, CK_3430ES1),
3353 CLK("musb_hdrc", "ick", &hsotgusb_ick_3430es2, CK_3430ES2),
3354 CLK(NULL, "sdrc_ick", &sdrc_ick, CK_3XXX),
3355 CLK(NULL, "gpmc_fck", &gpmc_fck, CK_3XXX),
3356 CLK(NULL, "security_l3_ick", &security_l3_ick, CK_343X),
3357 CLK(NULL, "pka_ick", &pka_ick, CK_343X),
3358 CLK(NULL, "core_l4_ick", &core_l4_ick, CK_3XXX),
3359 CLK(NULL, "usbtll_ick", &usbtll_ick, CK_3430ES2 | CK_AM35XX),
3360 CLK("mmci-omap-hs.2", "ick", &mmchs3_ick, CK_3430ES2 | CK_AM35XX),
3361 CLK(NULL, "icr_ick", &icr_ick, CK_343X),
3362 CLK(NULL, "aes2_ick", &aes2_ick, CK_343X),
3363 CLK(NULL, "sha12_ick", &sha12_ick, CK_343X),
3364 CLK(NULL, "des2_ick", &des2_ick, CK_343X),
3365 CLK("mmci-omap-hs.1", "ick", &mmchs2_ick, CK_3XXX),
3366 CLK("mmci-omap-hs.0", "ick", &mmchs1_ick, CK_3XXX),
3367 CLK(NULL, "mspro_ick", &mspro_ick, CK_343X),
3368 CLK("omap_hdq.0", "ick", &hdq_ick, CK_3XXX),
3369 CLK("omap2_mcspi.4", "ick", &mcspi4_ick, CK_3XXX),
3370 CLK("omap2_mcspi.3", "ick", &mcspi3_ick, CK_3XXX),
3371 CLK("omap2_mcspi.2", "ick", &mcspi2_ick, CK_3XXX),
3372 CLK("omap2_mcspi.1", "ick", &mcspi1_ick, CK_3XXX),
3373 CLK("i2c_omap.3", "ick", &i2c3_ick, CK_3XXX),
3374 CLK("i2c_omap.2", "ick", &i2c2_ick, CK_3XXX),
3375 CLK("i2c_omap.1", "ick", &i2c1_ick, CK_3XXX),
3376 CLK(NULL, "uart2_ick", &uart2_ick, CK_3XXX),
3377 CLK(NULL, "uart1_ick", &uart1_ick, CK_3XXX),
3378 CLK(NULL, "gpt11_ick", &gpt11_ick, CK_3XXX),
3379 CLK(NULL, "gpt10_ick", &gpt10_ick, CK_3XXX),
3380 CLK("omap-mcbsp.5", "ick", &mcbsp5_ick, CK_3XXX),
3381 CLK("omap-mcbsp.1", "ick", &mcbsp1_ick, CK_3XXX),
3382 CLK(NULL, "fac_ick", &fac_ick, CK_3430ES1),
3383 CLK(NULL, "mailboxes_ick", &mailboxes_ick, CK_343X),
3384 CLK(NULL, "omapctrl_ick", &omapctrl_ick, CK_3XXX),
3385 CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_343X),
3386 CLK(NULL, "ssi_ick", &ssi_ick_3430es1, CK_3430ES1),
3387 CLK(NULL, "ssi_ick", &ssi_ick_3430es2, CK_3430ES2),
3388 CLK(NULL, "usb_l4_ick", &usb_l4_ick, CK_3430ES1),
3389 CLK(NULL, "security_l4_ick2", &security_l4_ick2, CK_343X),
3390 CLK(NULL, "aes1_ick", &aes1_ick, CK_343X),
3391 CLK("omap_rng", "ick", &rng_ick, CK_343X),
3392 CLK(NULL, "sha11_ick", &sha11_ick, CK_343X),
3393 CLK(NULL, "des1_ick", &des1_ick, CK_343X),
3394 CLK("omapdss", "dss1_fck", &dss1_alwon_fck_3430es1, CK_3430ES1),
3395 CLK("omapdss", "dss1_fck", &dss1_alwon_fck_3430es2, CK_3430ES2 | CK_AM35XX),
3396 CLK("omapdss", "tv_fck", &dss_tv_fck, CK_3XXX),
3397 CLK("omapdss", "video_fck", &dss_96m_fck, CK_3XXX),
3398 CLK("omapdss", "dss2_fck", &dss2_alwon_fck, CK_3XXX),
3399 CLK("omapdss", "ick", &dss_ick_3430es1, CK_3430ES1),
3400 CLK("omapdss", "ick", &dss_ick_3430es2, CK_3430ES2 | CK_AM35XX),
3401 CLK(NULL, "cam_mclk", &cam_mclk, CK_343X),
3402 CLK(NULL, "cam_ick", &cam_ick, CK_343X),
3403 CLK(NULL, "csi2_96m_fck", &csi2_96m_fck, CK_343X),
3404 CLK(NULL, "usbhost_120m_fck", &usbhost_120m_fck, CK_3430ES2 | CK_AM35XX),
3405 CLK(NULL, "usbhost_48m_fck", &usbhost_48m_fck, CK_3430ES2 | CK_AM35XX),
3406 CLK(NULL, "usbhost_ick", &usbhost_ick, CK_3430ES2 | CK_AM35XX),
3407 CLK(NULL, "usim_fck", &usim_fck, CK_3430ES2),
3408 CLK(NULL, "gpt1_fck", &gpt1_fck, CK_3XXX),
3409 CLK(NULL, "wkup_32k_fck", &wkup_32k_fck, CK_3XXX),
3410 CLK(NULL, "gpio1_dbck", &gpio1_dbck, CK_3XXX),
3411 CLK("omap_wdt", "fck", &wdt2_fck, CK_3XXX),
3412 CLK(NULL, "wkup_l4_ick", &wkup_l4_ick, CK_343X),
3413 CLK(NULL, "usim_ick", &usim_ick, CK_3430ES2),
3414 CLK("omap_wdt", "ick", &wdt2_ick, CK_3XXX),
3415 CLK(NULL, "wdt1_ick", &wdt1_ick, CK_3XXX),
3416 CLK(NULL, "gpio1_ick", &gpio1_ick, CK_3XXX),
3417 CLK(NULL, "omap_32ksync_ick", &omap_32ksync_ick, CK_3XXX),
3418 CLK(NULL, "gpt12_ick", &gpt12_ick, CK_3XXX),
3419 CLK(NULL, "gpt1_ick", &gpt1_ick, CK_3XXX),
3420 CLK(NULL, "per_96m_fck", &per_96m_fck, CK_3XXX),
3421 CLK(NULL, "per_48m_fck", &per_48m_fck, CK_3XXX),
3422 CLK(NULL, "uart3_fck", &uart3_fck, CK_3XXX),
3423 CLK(NULL, "gpt2_fck", &gpt2_fck, CK_3XXX),
3424 CLK(NULL, "gpt3_fck", &gpt3_fck, CK_3XXX),
3425 CLK(NULL, "gpt4_fck", &gpt4_fck, CK_3XXX),
3426 CLK(NULL, "gpt5_fck", &gpt5_fck, CK_3XXX),
3427 CLK(NULL, "gpt6_fck", &gpt6_fck, CK_3XXX),
3428 CLK(NULL, "gpt7_fck", &gpt7_fck, CK_3XXX),
3429 CLK(NULL, "gpt8_fck", &gpt8_fck, CK_3XXX),
3430 CLK(NULL, "gpt9_fck", &gpt9_fck, CK_3XXX),
3431 CLK(NULL, "per_32k_alwon_fck", &per_32k_alwon_fck, CK_3XXX),
3432 CLK(NULL, "gpio6_dbck", &gpio6_dbck, CK_3XXX),
3433 CLK(NULL, "gpio5_dbck", &gpio5_dbck, CK_3XXX),
3434 CLK(NULL, "gpio4_dbck", &gpio4_dbck, CK_3XXX),
3435 CLK(NULL, "gpio3_dbck", &gpio3_dbck, CK_3XXX),
3436 CLK(NULL, "gpio2_dbck", &gpio2_dbck, CK_3XXX),
3437 CLK(NULL, "wdt3_fck", &wdt3_fck, CK_3XXX),
3438 CLK(NULL, "per_l4_ick", &per_l4_ick, CK_3XXX),
3439 CLK(NULL, "gpio6_ick", &gpio6_ick, CK_3XXX),
3440 CLK(NULL, "gpio5_ick", &gpio5_ick, CK_3XXX),
3441 CLK(NULL, "gpio4_ick", &gpio4_ick, CK_3XXX),
3442 CLK(NULL, "gpio3_ick", &gpio3_ick, CK_3XXX),
3443 CLK(NULL, "gpio2_ick", &gpio2_ick, CK_3XXX),
3444 CLK(NULL, "wdt3_ick", &wdt3_ick, CK_3XXX),
3445 CLK(NULL, "uart3_ick", &uart3_ick, CK_3XXX),
3446 CLK(NULL, "gpt9_ick", &gpt9_ick, CK_3XXX),
3447 CLK(NULL, "gpt8_ick", &gpt8_ick, CK_3XXX),
3448 CLK(NULL, "gpt7_ick", &gpt7_ick, CK_3XXX),
3449 CLK(NULL, "gpt6_ick", &gpt6_ick, CK_3XXX),
3450 CLK(NULL, "gpt5_ick", &gpt5_ick, CK_3XXX),
3451 CLK(NULL, "gpt4_ick", &gpt4_ick, CK_3XXX),
3452 CLK(NULL, "gpt3_ick", &gpt3_ick, CK_3XXX),
3453 CLK(NULL, "gpt2_ick", &gpt2_ick, CK_3XXX),
3454 CLK("omap-mcbsp.2", "ick", &mcbsp2_ick, CK_3XXX),
3455 CLK("omap-mcbsp.3", "ick", &mcbsp3_ick, CK_3XXX),
3456 CLK("omap-mcbsp.4", "ick", &mcbsp4_ick, CK_3XXX),
3457 CLK("omap-mcbsp.2", "fck", &mcbsp2_fck, CK_3XXX),
3458 CLK("omap-mcbsp.3", "fck", &mcbsp3_fck, CK_3XXX),
3459 CLK("omap-mcbsp.4", "fck", &mcbsp4_fck, CK_3XXX),
3460 CLK("etb", "emu_src_ck", &emu_src_ck, CK_3XXX),
3461 CLK(NULL, "pclk_fck", &pclk_fck, CK_3XXX),
3462 CLK(NULL, "pclkx2_fck", &pclkx2_fck, CK_3XXX),
3463 CLK(NULL, "atclk_fck", &atclk_fck, CK_3XXX),
3464 CLK(NULL, "traceclk_src_fck", &traceclk_src_fck, CK_3XXX),
3465 CLK(NULL, "traceclk_fck", &traceclk_fck, CK_3XXX),
3466 CLK(NULL, "sr1_fck", &sr1_fck, CK_343X),
3467 CLK(NULL, "sr2_fck", &sr2_fck, CK_343X),
3468 CLK(NULL, "sr_l4_ick", &sr_l4_ick, CK_343X),
3469 CLK(NULL, "secure_32k_fck", &secure_32k_fck, CK_3XXX),
3470 CLK(NULL, "gpt12_fck", &gpt12_fck, CK_3XXX),
3471 CLK(NULL, "wdt1_fck", &wdt1_fck, CK_3XXX),
3472 CLK(NULL, "ipss_ick", &ipss_ick, CK_AM35XX),
3473 CLK(NULL, "rmii_ck", &rmii_ck, CK_AM35XX),
3474 CLK(NULL, "pclk_ck", &pclk_ck, CK_AM35XX),
3475 CLK("davinci_emac", "ick", &emac_ick, CK_AM35XX),
3476 CLK("davinci_emac", "fck", &emac_fck, CK_AM35XX),
3477 CLK("vpfe-capture", "master", &vpfe_ick, CK_AM35XX),
3478 CLK("vpfe-capture", "slave", &vpfe_fck, CK_AM35XX),
3479 CLK("musb_hdrc", "ick", &hsotgusb_ick_am35xx, CK_AM35XX),
3480 CLK("musb_hdrc", "fck", &hsotgusb_fck_am35xx, CK_AM35XX),
3481 CLK(NULL, "hecc_ck", &hecc_ck, CK_AM35XX),
3482 CLK(NULL, "uart4_ick", &uart4_ick_am35xx, CK_AM35XX),
3483};
3484
3485
3486int __init omap3xxx_clk_init(void)
3487{
3488 struct omap_clk *c;
3489 u32 cpu_clkflg = CK_3XXX;
3490
3491 if (cpu_is_omap3517()) {
3492 cpu_mask = RATE_IN_343X | RATE_IN_3430ES2;
3493 cpu_clkflg |= CK_3517;
3494 } else if (cpu_is_omap3505()) {
3495 cpu_mask = RATE_IN_343X | RATE_IN_3430ES2;
3496 cpu_clkflg |= CK_3505;
3497 } else if (cpu_is_omap34xx()) {
3498 cpu_mask = RATE_IN_343X;
3499 cpu_clkflg |= CK_343X;
3500
3501 /*
3502 * Update this if there are further clock changes between ES2
3503 * and production parts
3504 */
3505 if (omap_rev() == OMAP3430_REV_ES1_0) {
3506 /* No 3430ES1-only rates exist, so no RATE_IN_3430ES1 */
3507 cpu_clkflg |= CK_3430ES1;
3508 } else {
3509 cpu_mask |= RATE_IN_3430ES2;
3510 cpu_clkflg |= CK_3430ES2;
3511 }
3512 }
3513 if (omap3_has_192mhz_clk())
3514 omap_96m_alwon_fck = omap_96m_alwon_fck_3630;
3515
3516 if (cpu_is_omap3630()) {
3517 cpu_mask |= RATE_IN_36XX;
3518 cpu_clkflg |= CK_36XX;
3519
3520 /*
3521 * XXX This type of dynamic rewriting of the clock tree is
3522 * deprecated and should be revised soon.
3523 */
3524 dpll4_m2_ck = dpll4_m2_ck_3630;
3525 dpll4_m3_ck = dpll4_m3_ck_3630;
3526 dpll4_m4_ck = dpll4_m4_ck_3630;
3527 dpll4_m5_ck = dpll4_m5_ck_3630;
3528 dpll4_m6_ck = dpll4_m6_ck_3630;
3529
3530 /*
3531 * For 3630: override clkops_omap2_dflt_wait for the
3532 * clocks affected from PWRDN reset Limitation
3533 */
3534 dpll3_m3x2_ck.ops =
3535 &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore;
3536 dpll4_m2x2_ck.ops =
3537 &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore;
3538 dpll4_m3x2_ck.ops =
3539 &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore;
3540 dpll4_m4x2_ck.ops =
3541 &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore;
3542 dpll4_m5x2_ck.ops =
3543 &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore;
3544 dpll4_m6x2_ck.ops =
3545 &clkops_omap36xx_pwrdn_with_hsdiv_wait_restore;
3546 } else {
3547 /*
3548 * XXX This type of dynamic rewriting of the clock tree is
3549 * deprecated and should be revised soon.
3550 */
3551 dpll4_m2_ck = dpll4_m2_ck_34xx;
3552 dpll4_m3_ck = dpll4_m3_ck_34xx;
3553 dpll4_m4_ck = dpll4_m4_ck_34xx;
3554 dpll4_m5_ck = dpll4_m5_ck_34xx;
3555 dpll4_m6_ck = dpll4_m6_ck_34xx;
3556 }
3557
3558 if (cpu_is_omap3630())
3559 dpll4_dd = dpll4_dd_3630;
3560 else
3561 dpll4_dd = dpll4_dd_34xx;
3562
3563 clk_init(&omap2_clk_functions);
3564
3565 for (c = omap3xxx_clks; c < omap3xxx_clks + ARRAY_SIZE(omap3xxx_clks);
3566 c++)
3567 clk_preinit(c->lk.clk);
3568
3569 for (c = omap3xxx_clks; c < omap3xxx_clks + ARRAY_SIZE(omap3xxx_clks);
3570 c++)
3571 if (c->cpu & cpu_clkflg) {
3572 clkdev_add(&c->lk);
3573 clk_register(c->lk.clk);
3574 omap2_init_clk_clkdm(c->lk.clk);
3575 }
3576
3577 recalculate_root_clocks();
3578
3579 printk(KERN_INFO "Clocking rate (Crystal/Core/MPU): "
3580 "%ld.%01ld/%ld/%ld MHz\n",
3581 (osc_sys_ck.rate / 1000000), (osc_sys_ck.rate / 100000) % 10,
3582 (core_ck.rate / 1000000), (arm_fck.rate / 1000000));
3583
3584 /*
3585 * Only enable those clocks we will need, let the drivers
3586 * enable other clocks as necessary
3587 */
3588 clk_enable_init_clocks();
3589
3590 /*
3591 * Lock DPLL5 and put it in autoidle.
3592 */
3593 if (omap_rev() >= OMAP3430_REV_ES2_0)
3594 omap3_clk_lock_dpll5();
3595
3596 /* Avoid sleeping during omap3_core_dpll_m2_set_rate() */
3597 sdrc_ick_p = clk_get(NULL, "sdrc_ick");
3598 arm_fck_p = clk_get(NULL, "arm_fck");
3599
3600 return 0;
3601}
diff --git a/arch/arm/mach-omap2/clock44xx.h b/arch/arm/mach-omap2/clock44xx.h
new file mode 100644
index 000000000000..6be1095936db
--- /dev/null
+++ b/arch/arm/mach-omap2/clock44xx.h
@@ -0,0 +1,20 @@
1/*
2 * OMAP4 clock function prototypes and macros
3 *
4 * Copyright (C) 2009 Texas Instruments, Inc.
5 * Copyright (C) 2010 Nokia Corporation
6 */
7
8#ifndef __ARCH_ARM_MACH_OMAP2_CLOCK44XX_H
9#define __ARCH_ARM_MACH_OMAP2_CLOCK44XX_H
10
11/*
12 * XXX Missing values for the OMAP4 DPLL_USB
13 * XXX Missing min_multiplier values for all OMAP4 DPLLs
14 */
15#define OMAP4430_MAX_DPLL_MULT 2047
16#define OMAP4430_MAX_DPLL_DIV 128
17
18int omap4xxx_clk_init(void);
19
20#endif
diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c
new file mode 100644
index 000000000000..a5c0c9c8e496
--- /dev/null
+++ b/arch/arm/mach-omap2/clock44xx_data.c
@@ -0,0 +1,2718 @@
1/*
2 * OMAP4 Clock data
3 *
4 * Copyright (C) 2009-2010 Texas Instruments, Inc.
5 * Copyright (C) 2009-2010 Nokia Corporation
6 *
7 * Paul Walmsley (paul@pwsan.com)
8 * Rajendra Nayak (rnayak@ti.com)
9 * Benoit Cousson (b-cousson@ti.com)
10 *
11 * This file is automatically generated from the OMAP hardware databases.
12 * We respectfully ask that any modifications to this file be coordinated
13 * with the public linux-omap@vger.kernel.org mailing list and the
14 * authors above to ensure that the autogeneration scripts are kept
15 * up-to-date with the file contents.
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License version 2 as
19 * published by the Free Software Foundation.
20 */
21
22#include <linux/kernel.h>
23#include <linux/list.h>
24#include <linux/clk.h>
25
26#include <plat/control.h>
27#include <plat/clkdev_omap.h>
28
29#include "clock.h"
30#include "clock44xx.h"
31#include "cm.h"
32#include "cm-regbits-44xx.h"
33#include "prm.h"
34#include "prm-regbits-44xx.h"
35
36/* Root clocks */
37
38static struct clk extalt_clkin_ck = {
39 .name = "extalt_clkin_ck",
40 .rate = 59000000,
41 .ops = &clkops_null,
42};
43
44static struct clk pad_clks_ck = {
45 .name = "pad_clks_ck",
46 .rate = 12000000,
47 .ops = &clkops_null,
48};
49
50static struct clk pad_slimbus_core_clks_ck = {
51 .name = "pad_slimbus_core_clks_ck",
52 .rate = 12000000,
53 .ops = &clkops_null,
54};
55
56static struct clk secure_32k_clk_src_ck = {
57 .name = "secure_32k_clk_src_ck",
58 .rate = 32768,
59 .ops = &clkops_null,
60};
61
62static struct clk slimbus_clk = {
63 .name = "slimbus_clk",
64 .rate = 12000000,
65 .ops = &clkops_null,
66};
67
68static struct clk sys_32k_ck = {
69 .name = "sys_32k_ck",
70 .rate = 32768,
71 .ops = &clkops_null,
72};
73
74static struct clk virt_12000000_ck = {
75 .name = "virt_12000000_ck",
76 .ops = &clkops_null,
77 .rate = 12000000,
78};
79
80static struct clk virt_13000000_ck = {
81 .name = "virt_13000000_ck",
82 .ops = &clkops_null,
83 .rate = 13000000,
84};
85
86static struct clk virt_16800000_ck = {
87 .name = "virt_16800000_ck",
88 .ops = &clkops_null,
89 .rate = 16800000,
90};
91
92static struct clk virt_19200000_ck = {
93 .name = "virt_19200000_ck",
94 .ops = &clkops_null,
95 .rate = 19200000,
96};
97
98static struct clk virt_26000000_ck = {
99 .name = "virt_26000000_ck",
100 .ops = &clkops_null,
101 .rate = 26000000,
102};
103
104static struct clk virt_27000000_ck = {
105 .name = "virt_27000000_ck",
106 .ops = &clkops_null,
107 .rate = 27000000,
108};
109
110static struct clk virt_38400000_ck = {
111 .name = "virt_38400000_ck",
112 .ops = &clkops_null,
113 .rate = 38400000,
114};
115
116static const struct clksel_rate div_1_0_rates[] = {
117 { .div = 1, .val = 0, .flags = RATE_IN_4430 },
118 { .div = 0 },
119};
120
121static const struct clksel_rate div_1_1_rates[] = {
122 { .div = 1, .val = 1, .flags = RATE_IN_4430 },
123 { .div = 0 },
124};
125
126static const struct clksel_rate div_1_2_rates[] = {
127 { .div = 1, .val = 2, .flags = RATE_IN_4430 },
128 { .div = 0 },
129};
130
131static const struct clksel_rate div_1_3_rates[] = {
132 { .div = 1, .val = 3, .flags = RATE_IN_4430 },
133 { .div = 0 },
134};
135
136static const struct clksel_rate div_1_4_rates[] = {
137 { .div = 1, .val = 4, .flags = RATE_IN_4430 },
138 { .div = 0 },
139};
140
141static const struct clksel_rate div_1_5_rates[] = {
142 { .div = 1, .val = 5, .flags = RATE_IN_4430 },
143 { .div = 0 },
144};
145
146static const struct clksel_rate div_1_6_rates[] = {
147 { .div = 1, .val = 6, .flags = RATE_IN_4430 },
148 { .div = 0 },
149};
150
151static const struct clksel_rate div_1_7_rates[] = {
152 { .div = 1, .val = 7, .flags = RATE_IN_4430 },
153 { .div = 0 },
154};
155
156static const struct clksel sys_clkin_sel[] = {
157 { .parent = &virt_12000000_ck, .rates = div_1_1_rates },
158 { .parent = &virt_13000000_ck, .rates = div_1_2_rates },
159 { .parent = &virt_16800000_ck, .rates = div_1_3_rates },
160 { .parent = &virt_19200000_ck, .rates = div_1_4_rates },
161 { .parent = &virt_26000000_ck, .rates = div_1_5_rates },
162 { .parent = &virt_27000000_ck, .rates = div_1_6_rates },
163 { .parent = &virt_38400000_ck, .rates = div_1_7_rates },
164 { .parent = NULL },
165};
166
167static struct clk sys_clkin_ck = {
168 .name = "sys_clkin_ck",
169 .rate = 38400000,
170 .clksel = sys_clkin_sel,
171 .init = &omap2_init_clksel_parent,
172 .clksel_reg = OMAP4430_CM_SYS_CLKSEL,
173 .clksel_mask = OMAP4430_SYS_CLKSEL_MASK,
174 .ops = &clkops_null,
175 .recalc = &omap2_clksel_recalc,
176};
177
178static struct clk utmi_phy_clkout_ck = {
179 .name = "utmi_phy_clkout_ck",
180 .rate = 12000000,
181 .ops = &clkops_null,
182};
183
184static struct clk xclk60mhsp1_ck = {
185 .name = "xclk60mhsp1_ck",
186 .rate = 12000000,
187 .ops = &clkops_null,
188};
189
190static struct clk xclk60mhsp2_ck = {
191 .name = "xclk60mhsp2_ck",
192 .rate = 12000000,
193 .ops = &clkops_null,
194};
195
196static struct clk xclk60motg_ck = {
197 .name = "xclk60motg_ck",
198 .rate = 60000000,
199 .ops = &clkops_null,
200};
201
202/* Module clocks and DPLL outputs */
203
204static const struct clksel_rate div2_1to2_rates[] = {
205 { .div = 1, .val = 0, .flags = RATE_IN_4430 },
206 { .div = 2, .val = 1, .flags = RATE_IN_4430 },
207 { .div = 0 },
208};
209
210static const struct clksel dpll_sys_ref_clk_div[] = {
211 { .parent = &sys_clkin_ck, .rates = div2_1to2_rates },
212 { .parent = NULL },
213};
214
215static struct clk dpll_sys_ref_clk = {
216 .name = "dpll_sys_ref_clk",
217 .parent = &sys_clkin_ck,
218 .clksel = dpll_sys_ref_clk_div,
219 .clksel_reg = OMAP4430_CM_DPLL_SYS_REF_CLKSEL,
220 .clksel_mask = OMAP4430_CLKSEL_0_0_MASK,
221 .ops = &clkops_null,
222 .recalc = &omap2_clksel_recalc,
223 .round_rate = &omap2_clksel_round_rate,
224 .set_rate = &omap2_clksel_set_rate,
225};
226
227static const struct clksel abe_dpll_refclk_mux_sel[] = {
228 { .parent = &dpll_sys_ref_clk, .rates = div_1_0_rates },
229 { .parent = &sys_32k_ck, .rates = div_1_1_rates },
230 { .parent = NULL },
231};
232
233static struct clk abe_dpll_refclk_mux_ck = {
234 .name = "abe_dpll_refclk_mux_ck",
235 .parent = &dpll_sys_ref_clk,
236 .clksel = abe_dpll_refclk_mux_sel,
237 .init = &omap2_init_clksel_parent,
238 .clksel_reg = OMAP4430_CM_ABE_PLL_REF_CLKSEL,
239 .clksel_mask = OMAP4430_CLKSEL_0_0_MASK,
240 .ops = &clkops_null,
241 .recalc = &omap2_clksel_recalc,
242};
243
244/* DPLL_ABE */
245static struct dpll_data dpll_abe_dd = {
246 .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_ABE,
247 .clk_bypass = &sys_clkin_ck,
248 .clk_ref = &abe_dpll_refclk_mux_ck,
249 .control_reg = OMAP4430_CM_CLKMODE_DPLL_ABE,
250 .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
251 .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_ABE,
252 .idlest_reg = OMAP4430_CM_IDLEST_DPLL_ABE,
253 .mult_mask = OMAP4430_DPLL_MULT_MASK,
254 .div1_mask = OMAP4430_DPLL_DIV_MASK,
255 .enable_mask = OMAP4430_DPLL_EN_MASK,
256 .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
257 .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
258 .max_multiplier = OMAP4430_MAX_DPLL_MULT,
259 .max_divider = OMAP4430_MAX_DPLL_DIV,
260 .min_divider = 1,
261};
262
263
264static struct clk dpll_abe_ck = {
265 .name = "dpll_abe_ck",
266 .parent = &abe_dpll_refclk_mux_ck,
267 .dpll_data = &dpll_abe_dd,
268 .init = &omap2_init_dpll_parent,
269 .ops = &clkops_omap3_noncore_dpll_ops,
270 .recalc = &omap3_dpll_recalc,
271 .round_rate = &omap2_dpll_round_rate,
272 .set_rate = &omap3_noncore_dpll_set_rate,
273};
274
275static struct clk dpll_abe_m2x2_ck = {
276 .name = "dpll_abe_m2x2_ck",
277 .parent = &dpll_abe_ck,
278 .ops = &clkops_null,
279 .recalc = &followparent_recalc,
280};
281
282static struct clk abe_24m_fclk = {
283 .name = "abe_24m_fclk",
284 .parent = &dpll_abe_m2x2_ck,
285 .ops = &clkops_null,
286 .recalc = &followparent_recalc,
287};
288
289static const struct clksel_rate div3_1to4_rates[] = {
290 { .div = 1, .val = 0, .flags = RATE_IN_4430 },
291 { .div = 2, .val = 1, .flags = RATE_IN_4430 },
292 { .div = 4, .val = 2, .flags = RATE_IN_4430 },
293 { .div = 0 },
294};
295
296static const struct clksel abe_clk_div[] = {
297 { .parent = &dpll_abe_m2x2_ck, .rates = div3_1to4_rates },
298 { .parent = NULL },
299};
300
301static struct clk abe_clk = {
302 .name = "abe_clk",
303 .parent = &dpll_abe_m2x2_ck,
304 .clksel = abe_clk_div,
305 .clksel_reg = OMAP4430_CM_CLKSEL_ABE,
306 .clksel_mask = OMAP4430_CLKSEL_OPP_MASK,
307 .ops = &clkops_null,
308 .recalc = &omap2_clksel_recalc,
309 .round_rate = &omap2_clksel_round_rate,
310 .set_rate = &omap2_clksel_set_rate,
311};
312
313static const struct clksel aess_fclk_div[] = {
314 { .parent = &abe_clk, .rates = div2_1to2_rates },
315 { .parent = NULL },
316};
317
318static struct clk aess_fclk = {
319 .name = "aess_fclk",
320 .parent = &abe_clk,
321 .clksel = aess_fclk_div,
322 .clksel_reg = OMAP4430_CM1_ABE_AESS_CLKCTRL,
323 .clksel_mask = OMAP4430_CLKSEL_AESS_FCLK_MASK,
324 .ops = &clkops_null,
325 .recalc = &omap2_clksel_recalc,
326 .round_rate = &omap2_clksel_round_rate,
327 .set_rate = &omap2_clksel_set_rate,
328};
329
330static const struct clksel_rate div31_1to31_rates[] = {
331 { .div = 1, .val = 1, .flags = RATE_IN_4430 },
332 { .div = 2, .val = 2, .flags = RATE_IN_4430 },
333 { .div = 3, .val = 3, .flags = RATE_IN_4430 },
334 { .div = 4, .val = 4, .flags = RATE_IN_4430 },
335 { .div = 5, .val = 5, .flags = RATE_IN_4430 },
336 { .div = 6, .val = 6, .flags = RATE_IN_4430 },
337 { .div = 7, .val = 7, .flags = RATE_IN_4430 },
338 { .div = 8, .val = 8, .flags = RATE_IN_4430 },
339 { .div = 9, .val = 9, .flags = RATE_IN_4430 },
340 { .div = 10, .val = 10, .flags = RATE_IN_4430 },
341 { .div = 11, .val = 11, .flags = RATE_IN_4430 },
342 { .div = 12, .val = 12, .flags = RATE_IN_4430 },
343 { .div = 13, .val = 13, .flags = RATE_IN_4430 },
344 { .div = 14, .val = 14, .flags = RATE_IN_4430 },
345 { .div = 15, .val = 15, .flags = RATE_IN_4430 },
346 { .div = 16, .val = 16, .flags = RATE_IN_4430 },
347 { .div = 17, .val = 17, .flags = RATE_IN_4430 },
348 { .div = 18, .val = 18, .flags = RATE_IN_4430 },
349 { .div = 19, .val = 19, .flags = RATE_IN_4430 },
350 { .div = 20, .val = 20, .flags = RATE_IN_4430 },
351 { .div = 21, .val = 21, .flags = RATE_IN_4430 },
352 { .div = 22, .val = 22, .flags = RATE_IN_4430 },
353 { .div = 23, .val = 23, .flags = RATE_IN_4430 },
354 { .div = 24, .val = 24, .flags = RATE_IN_4430 },
355 { .div = 25, .val = 25, .flags = RATE_IN_4430 },
356 { .div = 26, .val = 26, .flags = RATE_IN_4430 },
357 { .div = 27, .val = 27, .flags = RATE_IN_4430 },
358 { .div = 28, .val = 28, .flags = RATE_IN_4430 },
359 { .div = 29, .val = 29, .flags = RATE_IN_4430 },
360 { .div = 30, .val = 30, .flags = RATE_IN_4430 },
361 { .div = 31, .val = 31, .flags = RATE_IN_4430 },
362 { .div = 0 },
363};
364
365static const struct clksel dpll_abe_m3_div[] = {
366 { .parent = &dpll_abe_ck, .rates = div31_1to31_rates },
367 { .parent = NULL },
368};
369
370static struct clk dpll_abe_m3_ck = {
371 .name = "dpll_abe_m3_ck",
372 .parent = &dpll_abe_ck,
373 .clksel = dpll_abe_m3_div,
374 .clksel_reg = OMAP4430_CM_DIV_M3_DPLL_ABE,
375 .clksel_mask = OMAP4430_DPLL_CLKOUTHIF_DIV_MASK,
376 .ops = &clkops_null,
377 .recalc = &omap2_clksel_recalc,
378 .round_rate = &omap2_clksel_round_rate,
379 .set_rate = &omap2_clksel_set_rate,
380};
381
382static const struct clksel core_hsd_byp_clk_mux_sel[] = {
383 { .parent = &dpll_sys_ref_clk, .rates = div_1_0_rates },
384 { .parent = &dpll_abe_m3_ck, .rates = div_1_1_rates },
385 { .parent = NULL },
386};
387
388static struct clk core_hsd_byp_clk_mux_ck = {
389 .name = "core_hsd_byp_clk_mux_ck",
390 .parent = &dpll_sys_ref_clk,
391 .clksel = core_hsd_byp_clk_mux_sel,
392 .init = &omap2_init_clksel_parent,
393 .clksel_reg = OMAP4430_CM_CLKSEL_DPLL_CORE,
394 .clksel_mask = OMAP4430_DPLL_BYP_CLKSEL_MASK,
395 .ops = &clkops_null,
396 .recalc = &omap2_clksel_recalc,
397};
398
399/* DPLL_CORE */
400static struct dpll_data dpll_core_dd = {
401 .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_CORE,
402 .clk_bypass = &core_hsd_byp_clk_mux_ck,
403 .clk_ref = &dpll_sys_ref_clk,
404 .control_reg = OMAP4430_CM_CLKMODE_DPLL_CORE,
405 .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
406 .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_CORE,
407 .idlest_reg = OMAP4430_CM_IDLEST_DPLL_CORE,
408 .mult_mask = OMAP4430_DPLL_MULT_MASK,
409 .div1_mask = OMAP4430_DPLL_DIV_MASK,
410 .enable_mask = OMAP4430_DPLL_EN_MASK,
411 .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
412 .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
413 .max_multiplier = OMAP4430_MAX_DPLL_MULT,
414 .max_divider = OMAP4430_MAX_DPLL_DIV,
415 .min_divider = 1,
416};
417
418
419static struct clk dpll_core_ck = {
420 .name = "dpll_core_ck",
421 .parent = &dpll_sys_ref_clk,
422 .dpll_data = &dpll_core_dd,
423 .init = &omap2_init_dpll_parent,
424 .ops = &clkops_null,
425 .recalc = &omap3_dpll_recalc,
426};
427
428static const struct clksel dpll_core_m6_div[] = {
429 { .parent = &dpll_core_ck, .rates = div31_1to31_rates },
430 { .parent = NULL },
431};
432
433static struct clk dpll_core_m6_ck = {
434 .name = "dpll_core_m6_ck",
435 .parent = &dpll_core_ck,
436 .clksel = dpll_core_m6_div,
437 .clksel_reg = OMAP4430_CM_DIV_M6_DPLL_CORE,
438 .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT3_DIV_MASK,
439 .ops = &clkops_null,
440 .recalc = &omap2_clksel_recalc,
441 .round_rate = &omap2_clksel_round_rate,
442 .set_rate = &omap2_clksel_set_rate,
443};
444
445static const struct clksel dbgclk_mux_sel[] = {
446 { .parent = &sys_clkin_ck, .rates = div_1_0_rates },
447 { .parent = &dpll_core_m6_ck, .rates = div_1_1_rates },
448 { .parent = NULL },
449};
450
451static struct clk dbgclk_mux_ck = {
452 .name = "dbgclk_mux_ck",
453 .parent = &sys_clkin_ck,
454 .ops = &clkops_null,
455 .recalc = &followparent_recalc,
456};
457
458static struct clk dpll_core_m2_ck = {
459 .name = "dpll_core_m2_ck",
460 .parent = &dpll_core_ck,
461 .clksel = dpll_core_m6_div,
462 .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_CORE,
463 .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK,
464 .ops = &clkops_null,
465 .recalc = &omap2_clksel_recalc,
466 .round_rate = &omap2_clksel_round_rate,
467 .set_rate = &omap2_clksel_set_rate,
468};
469
470static struct clk ddrphy_ck = {
471 .name = "ddrphy_ck",
472 .parent = &dpll_core_m2_ck,
473 .ops = &clkops_null,
474 .recalc = &followparent_recalc,
475};
476
477static struct clk dpll_core_m5_ck = {
478 .name = "dpll_core_m5_ck",
479 .parent = &dpll_core_ck,
480 .clksel = dpll_core_m6_div,
481 .clksel_reg = OMAP4430_CM_DIV_M5_DPLL_CORE,
482 .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK,
483 .ops = &clkops_null,
484 .recalc = &omap2_clksel_recalc,
485 .round_rate = &omap2_clksel_round_rate,
486 .set_rate = &omap2_clksel_set_rate,
487};
488
489static const struct clksel div_core_div[] = {
490 { .parent = &dpll_core_m5_ck, .rates = div2_1to2_rates },
491 { .parent = NULL },
492};
493
494static struct clk div_core_ck = {
495 .name = "div_core_ck",
496 .parent = &dpll_core_m5_ck,
497 .clksel = div_core_div,
498 .clksel_reg = OMAP4430_CM_CLKSEL_CORE,
499 .clksel_mask = OMAP4430_CLKSEL_CORE_MASK,
500 .ops = &clkops_null,
501 .recalc = &omap2_clksel_recalc,
502 .round_rate = &omap2_clksel_round_rate,
503 .set_rate = &omap2_clksel_set_rate,
504};
505
506static const struct clksel_rate div4_1to8_rates[] = {
507 { .div = 1, .val = 0, .flags = RATE_IN_4430 },
508 { .div = 2, .val = 1, .flags = RATE_IN_4430 },
509 { .div = 4, .val = 2, .flags = RATE_IN_4430 },
510 { .div = 8, .val = 3, .flags = RATE_IN_4430 },
511 { .div = 0 },
512};
513
514static const struct clksel div_iva_hs_clk_div[] = {
515 { .parent = &dpll_core_m5_ck, .rates = div4_1to8_rates },
516 { .parent = NULL },
517};
518
519static struct clk div_iva_hs_clk = {
520 .name = "div_iva_hs_clk",
521 .parent = &dpll_core_m5_ck,
522 .clksel = div_iva_hs_clk_div,
523 .clksel_reg = OMAP4430_CM_BYPCLK_DPLL_IVA,
524 .clksel_mask = OMAP4430_CLKSEL_0_1_MASK,
525 .ops = &clkops_null,
526 .recalc = &omap2_clksel_recalc,
527 .round_rate = &omap2_clksel_round_rate,
528 .set_rate = &omap2_clksel_set_rate,
529};
530
531static struct clk div_mpu_hs_clk = {
532 .name = "div_mpu_hs_clk",
533 .parent = &dpll_core_m5_ck,
534 .clksel = div_iva_hs_clk_div,
535 .clksel_reg = OMAP4430_CM_BYPCLK_DPLL_MPU,
536 .clksel_mask = OMAP4430_CLKSEL_0_1_MASK,
537 .ops = &clkops_null,
538 .recalc = &omap2_clksel_recalc,
539 .round_rate = &omap2_clksel_round_rate,
540 .set_rate = &omap2_clksel_set_rate,
541};
542
543static struct clk dpll_core_m4_ck = {
544 .name = "dpll_core_m4_ck",
545 .parent = &dpll_core_ck,
546 .clksel = dpll_core_m6_div,
547 .clksel_reg = OMAP4430_CM_DIV_M4_DPLL_CORE,
548 .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK,
549 .ops = &clkops_null,
550 .recalc = &omap2_clksel_recalc,
551 .round_rate = &omap2_clksel_round_rate,
552 .set_rate = &omap2_clksel_set_rate,
553};
554
555static struct clk dll_clk_div_ck = {
556 .name = "dll_clk_div_ck",
557 .parent = &dpll_core_m4_ck,
558 .ops = &clkops_null,
559 .recalc = &followparent_recalc,
560};
561
562static struct clk dpll_abe_m2_ck = {
563 .name = "dpll_abe_m2_ck",
564 .parent = &dpll_abe_ck,
565 .clksel = dpll_abe_m3_div,
566 .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_ABE,
567 .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK,
568 .ops = &clkops_null,
569 .recalc = &omap2_clksel_recalc,
570 .round_rate = &omap2_clksel_round_rate,
571 .set_rate = &omap2_clksel_set_rate,
572};
573
574static struct clk dpll_core_m3_ck = {
575 .name = "dpll_core_m3_ck",
576 .parent = &dpll_core_ck,
577 .clksel = dpll_core_m6_div,
578 .clksel_reg = OMAP4430_CM_DIV_M3_DPLL_CORE,
579 .clksel_mask = OMAP4430_DPLL_CLKOUTHIF_DIV_MASK,
580 .ops = &clkops_null,
581 .recalc = &omap2_clksel_recalc,
582 .round_rate = &omap2_clksel_round_rate,
583 .set_rate = &omap2_clksel_set_rate,
584};
585
586static struct clk dpll_core_m7_ck = {
587 .name = "dpll_core_m7_ck",
588 .parent = &dpll_core_ck,
589 .clksel = dpll_core_m6_div,
590 .clksel_reg = OMAP4430_CM_DIV_M7_DPLL_CORE,
591 .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT4_DIV_MASK,
592 .ops = &clkops_null,
593 .recalc = &omap2_clksel_recalc,
594 .round_rate = &omap2_clksel_round_rate,
595 .set_rate = &omap2_clksel_set_rate,
596};
597
598static const struct clksel iva_hsd_byp_clk_mux_sel[] = {
599 { .parent = &dpll_sys_ref_clk, .rates = div_1_0_rates },
600 { .parent = &div_iva_hs_clk, .rates = div_1_1_rates },
601 { .parent = NULL },
602};
603
604static struct clk iva_hsd_byp_clk_mux_ck = {
605 .name = "iva_hsd_byp_clk_mux_ck",
606 .parent = &dpll_sys_ref_clk,
607 .ops = &clkops_null,
608 .recalc = &followparent_recalc,
609};
610
611/* DPLL_IVA */
612static struct dpll_data dpll_iva_dd = {
613 .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_IVA,
614 .clk_bypass = &iva_hsd_byp_clk_mux_ck,
615 .clk_ref = &dpll_sys_ref_clk,
616 .control_reg = OMAP4430_CM_CLKMODE_DPLL_IVA,
617 .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
618 .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_IVA,
619 .idlest_reg = OMAP4430_CM_IDLEST_DPLL_IVA,
620 .mult_mask = OMAP4430_DPLL_MULT_MASK,
621 .div1_mask = OMAP4430_DPLL_DIV_MASK,
622 .enable_mask = OMAP4430_DPLL_EN_MASK,
623 .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
624 .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
625 .max_multiplier = OMAP4430_MAX_DPLL_MULT,
626 .max_divider = OMAP4430_MAX_DPLL_DIV,
627 .min_divider = 1,
628};
629
630
631static struct clk dpll_iva_ck = {
632 .name = "dpll_iva_ck",
633 .parent = &dpll_sys_ref_clk,
634 .dpll_data = &dpll_iva_dd,
635 .init = &omap2_init_dpll_parent,
636 .ops = &clkops_omap3_noncore_dpll_ops,
637 .recalc = &omap3_dpll_recalc,
638 .round_rate = &omap2_dpll_round_rate,
639 .set_rate = &omap3_noncore_dpll_set_rate,
640};
641
642static const struct clksel dpll_iva_m4_div[] = {
643 { .parent = &dpll_iva_ck, .rates = div31_1to31_rates },
644 { .parent = NULL },
645};
646
647static struct clk dpll_iva_m4_ck = {
648 .name = "dpll_iva_m4_ck",
649 .parent = &dpll_iva_ck,
650 .clksel = dpll_iva_m4_div,
651 .clksel_reg = OMAP4430_CM_DIV_M4_DPLL_IVA,
652 .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK,
653 .ops = &clkops_null,
654 .recalc = &omap2_clksel_recalc,
655 .round_rate = &omap2_clksel_round_rate,
656 .set_rate = &omap2_clksel_set_rate,
657};
658
659static struct clk dpll_iva_m5_ck = {
660 .name = "dpll_iva_m5_ck",
661 .parent = &dpll_iva_ck,
662 .clksel = dpll_iva_m4_div,
663 .clksel_reg = OMAP4430_CM_DIV_M5_DPLL_IVA,
664 .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK,
665 .ops = &clkops_null,
666 .recalc = &omap2_clksel_recalc,
667 .round_rate = &omap2_clksel_round_rate,
668 .set_rate = &omap2_clksel_set_rate,
669};
670
671/* DPLL_MPU */
672static struct dpll_data dpll_mpu_dd = {
673 .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_MPU,
674 .clk_bypass = &div_mpu_hs_clk,
675 .clk_ref = &dpll_sys_ref_clk,
676 .control_reg = OMAP4430_CM_CLKMODE_DPLL_MPU,
677 .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
678 .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_MPU,
679 .idlest_reg = OMAP4430_CM_IDLEST_DPLL_MPU,
680 .mult_mask = OMAP4430_DPLL_MULT_MASK,
681 .div1_mask = OMAP4430_DPLL_DIV_MASK,
682 .enable_mask = OMAP4430_DPLL_EN_MASK,
683 .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
684 .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
685 .max_multiplier = OMAP4430_MAX_DPLL_MULT,
686 .max_divider = OMAP4430_MAX_DPLL_DIV,
687 .min_divider = 1,
688};
689
690
691static struct clk dpll_mpu_ck = {
692 .name = "dpll_mpu_ck",
693 .parent = &dpll_sys_ref_clk,
694 .dpll_data = &dpll_mpu_dd,
695 .init = &omap2_init_dpll_parent,
696 .ops = &clkops_omap3_noncore_dpll_ops,
697 .recalc = &omap3_dpll_recalc,
698 .round_rate = &omap2_dpll_round_rate,
699 .set_rate = &omap3_noncore_dpll_set_rate,
700};
701
702static const struct clksel dpll_mpu_m2_div[] = {
703 { .parent = &dpll_mpu_ck, .rates = div31_1to31_rates },
704 { .parent = NULL },
705};
706
707static struct clk dpll_mpu_m2_ck = {
708 .name = "dpll_mpu_m2_ck",
709 .parent = &dpll_mpu_ck,
710 .clksel = dpll_mpu_m2_div,
711 .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_MPU,
712 .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK,
713 .ops = &clkops_null,
714 .recalc = &omap2_clksel_recalc,
715 .round_rate = &omap2_clksel_round_rate,
716 .set_rate = &omap2_clksel_set_rate,
717};
718
719static struct clk per_hs_clk_div_ck = {
720 .name = "per_hs_clk_div_ck",
721 .parent = &dpll_abe_m3_ck,
722 .ops = &clkops_null,
723 .recalc = &followparent_recalc,
724};
725
726static const struct clksel per_hsd_byp_clk_mux_sel[] = {
727 { .parent = &dpll_sys_ref_clk, .rates = div_1_0_rates },
728 { .parent = &per_hs_clk_div_ck, .rates = div_1_1_rates },
729 { .parent = NULL },
730};
731
732static struct clk per_hsd_byp_clk_mux_ck = {
733 .name = "per_hsd_byp_clk_mux_ck",
734 .parent = &dpll_sys_ref_clk,
735 .clksel = per_hsd_byp_clk_mux_sel,
736 .init = &omap2_init_clksel_parent,
737 .clksel_reg = OMAP4430_CM_CLKSEL_DPLL_PER,
738 .clksel_mask = OMAP4430_DPLL_BYP_CLKSEL_MASK,
739 .ops = &clkops_null,
740 .recalc = &omap2_clksel_recalc,
741};
742
743/* DPLL_PER */
744static struct dpll_data dpll_per_dd = {
745 .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_PER,
746 .clk_bypass = &per_hsd_byp_clk_mux_ck,
747 .clk_ref = &dpll_sys_ref_clk,
748 .control_reg = OMAP4430_CM_CLKMODE_DPLL_PER,
749 .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
750 .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_PER,
751 .idlest_reg = OMAP4430_CM_IDLEST_DPLL_PER,
752 .mult_mask = OMAP4430_DPLL_MULT_MASK,
753 .div1_mask = OMAP4430_DPLL_DIV_MASK,
754 .enable_mask = OMAP4430_DPLL_EN_MASK,
755 .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
756 .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
757 .max_multiplier = OMAP4430_MAX_DPLL_MULT,
758 .max_divider = OMAP4430_MAX_DPLL_DIV,
759 .min_divider = 1,
760};
761
762
763static struct clk dpll_per_ck = {
764 .name = "dpll_per_ck",
765 .parent = &dpll_sys_ref_clk,
766 .dpll_data = &dpll_per_dd,
767 .init = &omap2_init_dpll_parent,
768 .ops = &clkops_omap3_noncore_dpll_ops,
769 .recalc = &omap3_dpll_recalc,
770 .round_rate = &omap2_dpll_round_rate,
771 .set_rate = &omap3_noncore_dpll_set_rate,
772};
773
774static const struct clksel dpll_per_m2_div[] = {
775 { .parent = &dpll_per_ck, .rates = div31_1to31_rates },
776 { .parent = NULL },
777};
778
779static struct clk dpll_per_m2_ck = {
780 .name = "dpll_per_m2_ck",
781 .parent = &dpll_per_ck,
782 .clksel = dpll_per_m2_div,
783 .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_PER,
784 .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK,
785 .ops = &clkops_null,
786 .recalc = &omap2_clksel_recalc,
787 .round_rate = &omap2_clksel_round_rate,
788 .set_rate = &omap2_clksel_set_rate,
789};
790
791static struct clk dpll_per_m2x2_ck = {
792 .name = "dpll_per_m2x2_ck",
793 .parent = &dpll_per_ck,
794 .ops = &clkops_null,
795 .recalc = &followparent_recalc,
796};
797
798static struct clk dpll_per_m3_ck = {
799 .name = "dpll_per_m3_ck",
800 .parent = &dpll_per_ck,
801 .clksel = dpll_per_m2_div,
802 .clksel_reg = OMAP4430_CM_DIV_M3_DPLL_PER,
803 .clksel_mask = OMAP4430_DPLL_CLKOUTHIF_DIV_MASK,
804 .ops = &clkops_null,
805 .recalc = &omap2_clksel_recalc,
806 .round_rate = &omap2_clksel_round_rate,
807 .set_rate = &omap2_clksel_set_rate,
808};
809
810static struct clk dpll_per_m4_ck = {
811 .name = "dpll_per_m4_ck",
812 .parent = &dpll_per_ck,
813 .clksel = dpll_per_m2_div,
814 .clksel_reg = OMAP4430_CM_DIV_M4_DPLL_PER,
815 .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK,
816 .ops = &clkops_null,
817 .recalc = &omap2_clksel_recalc,
818 .round_rate = &omap2_clksel_round_rate,
819 .set_rate = &omap2_clksel_set_rate,
820};
821
822static struct clk dpll_per_m5_ck = {
823 .name = "dpll_per_m5_ck",
824 .parent = &dpll_per_ck,
825 .clksel = dpll_per_m2_div,
826 .clksel_reg = OMAP4430_CM_DIV_M5_DPLL_PER,
827 .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK,
828 .ops = &clkops_null,
829 .recalc = &omap2_clksel_recalc,
830 .round_rate = &omap2_clksel_round_rate,
831 .set_rate = &omap2_clksel_set_rate,
832};
833
834static struct clk dpll_per_m6_ck = {
835 .name = "dpll_per_m6_ck",
836 .parent = &dpll_per_ck,
837 .clksel = dpll_per_m2_div,
838 .clksel_reg = OMAP4430_CM_DIV_M6_DPLL_PER,
839 .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT3_DIV_MASK,
840 .ops = &clkops_null,
841 .recalc = &omap2_clksel_recalc,
842 .round_rate = &omap2_clksel_round_rate,
843 .set_rate = &omap2_clksel_set_rate,
844};
845
846static struct clk dpll_per_m7_ck = {
847 .name = "dpll_per_m7_ck",
848 .parent = &dpll_per_ck,
849 .clksel = dpll_per_m2_div,
850 .clksel_reg = OMAP4430_CM_DIV_M7_DPLL_PER,
851 .clksel_mask = OMAP4430_HSDIVIDER_CLKOUT4_DIV_MASK,
852 .ops = &clkops_null,
853 .recalc = &omap2_clksel_recalc,
854 .round_rate = &omap2_clksel_round_rate,
855 .set_rate = &omap2_clksel_set_rate,
856};
857
858/* DPLL_UNIPRO */
859static struct dpll_data dpll_unipro_dd = {
860 .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_UNIPRO,
861 .clk_bypass = &dpll_sys_ref_clk,
862 .clk_ref = &dpll_sys_ref_clk,
863 .control_reg = OMAP4430_CM_CLKMODE_DPLL_UNIPRO,
864 .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
865 .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_UNIPRO,
866 .idlest_reg = OMAP4430_CM_IDLEST_DPLL_UNIPRO,
867 .mult_mask = OMAP4430_DPLL_MULT_MASK,
868 .div1_mask = OMAP4430_DPLL_DIV_MASK,
869 .enable_mask = OMAP4430_DPLL_EN_MASK,
870 .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
871 .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
872 .max_multiplier = OMAP4430_MAX_DPLL_MULT,
873 .max_divider = OMAP4430_MAX_DPLL_DIV,
874 .min_divider = 1,
875};
876
877
878static struct clk dpll_unipro_ck = {
879 .name = "dpll_unipro_ck",
880 .parent = &dpll_sys_ref_clk,
881 .dpll_data = &dpll_unipro_dd,
882 .init = &omap2_init_dpll_parent,
883 .ops = &clkops_omap3_noncore_dpll_ops,
884 .recalc = &omap3_dpll_recalc,
885 .round_rate = &omap2_dpll_round_rate,
886 .set_rate = &omap3_noncore_dpll_set_rate,
887};
888
889static const struct clksel dpll_unipro_m2x2_div[] = {
890 { .parent = &dpll_unipro_ck, .rates = div31_1to31_rates },
891 { .parent = NULL },
892};
893
894static struct clk dpll_unipro_m2x2_ck = {
895 .name = "dpll_unipro_m2x2_ck",
896 .parent = &dpll_unipro_ck,
897 .clksel = dpll_unipro_m2x2_div,
898 .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_UNIPRO,
899 .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_MASK,
900 .ops = &clkops_null,
901 .recalc = &omap2_clksel_recalc,
902 .round_rate = &omap2_clksel_round_rate,
903 .set_rate = &omap2_clksel_set_rate,
904};
905
906static struct clk usb_hs_clk_div_ck = {
907 .name = "usb_hs_clk_div_ck",
908 .parent = &dpll_abe_m3_ck,
909 .ops = &clkops_null,
910 .recalc = &followparent_recalc,
911};
912
913/* DPLL_USB */
914static struct dpll_data dpll_usb_dd = {
915 .mult_div1_reg = OMAP4430_CM_CLKSEL_DPLL_USB,
916 .clk_bypass = &usb_hs_clk_div_ck,
917 .clk_ref = &dpll_sys_ref_clk,
918 .control_reg = OMAP4430_CM_CLKMODE_DPLL_USB,
919 .modes = (1 << DPLL_LOW_POWER_BYPASS) | (1 << DPLL_LOCKED),
920 .autoidle_reg = OMAP4430_CM_AUTOIDLE_DPLL_USB,
921 .idlest_reg = OMAP4430_CM_IDLEST_DPLL_USB,
922 .mult_mask = OMAP4430_DPLL_MULT_MASK,
923 .div1_mask = OMAP4430_DPLL_DIV_MASK,
924 .enable_mask = OMAP4430_DPLL_EN_MASK,
925 .autoidle_mask = OMAP4430_AUTO_DPLL_MODE_MASK,
926 .idlest_mask = OMAP4430_ST_DPLL_CLK_MASK,
927 .max_multiplier = OMAP4430_MAX_DPLL_MULT,
928 .max_divider = OMAP4430_MAX_DPLL_DIV,
929 .min_divider = 1,
930 .flags = DPLL_J_TYPE | DPLL_NO_DCO_SEL
931};
932
933
934static struct clk dpll_usb_ck = {
935 .name = "dpll_usb_ck",
936 .parent = &dpll_sys_ref_clk,
937 .dpll_data = &dpll_usb_dd,
938 .init = &omap2_init_dpll_parent,
939 .ops = &clkops_omap3_noncore_dpll_ops,
940 .recalc = &omap3_dpll_recalc,
941 .round_rate = &omap2_dpll_round_rate,
942 .set_rate = &omap3_noncore_dpll_set_rate,
943};
944
945static struct clk dpll_usb_clkdcoldo_ck = {
946 .name = "dpll_usb_clkdcoldo_ck",
947 .parent = &dpll_usb_ck,
948 .ops = &clkops_null,
949 .recalc = &followparent_recalc,
950};
951
952static const struct clksel dpll_usb_m2_div[] = {
953 { .parent = &dpll_usb_ck, .rates = div31_1to31_rates },
954 { .parent = NULL },
955};
956
957static struct clk dpll_usb_m2_ck = {
958 .name = "dpll_usb_m2_ck",
959 .parent = &dpll_usb_ck,
960 .clksel = dpll_usb_m2_div,
961 .clksel_reg = OMAP4430_CM_DIV_M2_DPLL_USB,
962 .clksel_mask = OMAP4430_DPLL_CLKOUT_DIV_0_6_MASK,
963 .ops = &clkops_null,
964 .recalc = &omap2_clksel_recalc,
965 .round_rate = &omap2_clksel_round_rate,
966 .set_rate = &omap2_clksel_set_rate,
967};
968
969static const struct clksel ducati_clk_mux_sel[] = {
970 { .parent = &div_core_ck, .rates = div_1_0_rates },
971 { .parent = &dpll_per_m6_ck, .rates = div_1_1_rates },
972 { .parent = NULL },
973};
974
975static struct clk ducati_clk_mux_ck = {
976 .name = "ducati_clk_mux_ck",
977 .parent = &div_core_ck,
978 .clksel = ducati_clk_mux_sel,
979 .init = &omap2_init_clksel_parent,
980 .clksel_reg = OMAP4430_CM_CLKSEL_DUCATI_ISS_ROOT,
981 .clksel_mask = OMAP4430_CLKSEL_0_0_MASK,
982 .ops = &clkops_null,
983 .recalc = &omap2_clksel_recalc,
984};
985
986static struct clk func_12m_fclk = {
987 .name = "func_12m_fclk",
988 .parent = &dpll_per_m2x2_ck,
989 .ops = &clkops_null,
990 .recalc = &followparent_recalc,
991};
992
993static struct clk func_24m_clk = {
994 .name = "func_24m_clk",
995 .parent = &dpll_per_m2_ck,
996 .ops = &clkops_null,
997 .recalc = &followparent_recalc,
998};
999
1000static struct clk func_24mc_fclk = {
1001 .name = "func_24mc_fclk",
1002 .parent = &dpll_per_m2x2_ck,
1003 .ops = &clkops_null,
1004 .recalc = &followparent_recalc,
1005};
1006
1007static const struct clksel_rate div2_4to8_rates[] = {
1008 { .div = 4, .val = 0, .flags = RATE_IN_4430 },
1009 { .div = 8, .val = 1, .flags = RATE_IN_4430 },
1010 { .div = 0 },
1011};
1012
1013static const struct clksel func_48m_fclk_div[] = {
1014 { .parent = &dpll_per_m2x2_ck, .rates = div2_4to8_rates },
1015 { .parent = NULL },
1016};
1017
1018static struct clk func_48m_fclk = {
1019 .name = "func_48m_fclk",
1020 .parent = &dpll_per_m2x2_ck,
1021 .clksel = func_48m_fclk_div,
1022 .clksel_reg = OMAP4430_CM_SCALE_FCLK,
1023 .clksel_mask = OMAP4430_SCALE_FCLK_MASK,
1024 .ops = &clkops_null,
1025 .recalc = &omap2_clksel_recalc,
1026 .round_rate = &omap2_clksel_round_rate,
1027 .set_rate = &omap2_clksel_set_rate,
1028};
1029
1030static struct clk func_48mc_fclk = {
1031 .name = "func_48mc_fclk",
1032 .parent = &dpll_per_m2x2_ck,
1033 .ops = &clkops_null,
1034 .recalc = &followparent_recalc,
1035};
1036
1037static const struct clksel_rate div2_2to4_rates[] = {
1038 { .div = 2, .val = 0, .flags = RATE_IN_4430 },
1039 { .div = 4, .val = 1, .flags = RATE_IN_4430 },
1040 { .div = 0 },
1041};
1042
1043static const struct clksel func_64m_fclk_div[] = {
1044 { .parent = &dpll_per_m4_ck, .rates = div2_2to4_rates },
1045 { .parent = NULL },
1046};
1047
1048static struct clk func_64m_fclk = {
1049 .name = "func_64m_fclk",
1050 .parent = &dpll_per_m4_ck,
1051 .clksel = func_64m_fclk_div,
1052 .clksel_reg = OMAP4430_CM_SCALE_FCLK,
1053 .clksel_mask = OMAP4430_SCALE_FCLK_MASK,
1054 .ops = &clkops_null,
1055 .recalc = &omap2_clksel_recalc,
1056 .round_rate = &omap2_clksel_round_rate,
1057 .set_rate = &omap2_clksel_set_rate,
1058};
1059
1060static const struct clksel func_96m_fclk_div[] = {
1061 { .parent = &dpll_per_m2x2_ck, .rates = div2_2to4_rates },
1062 { .parent = NULL },
1063};
1064
1065static struct clk func_96m_fclk = {
1066 .name = "func_96m_fclk",
1067 .parent = &dpll_per_m2x2_ck,
1068 .clksel = func_96m_fclk_div,
1069 .clksel_reg = OMAP4430_CM_SCALE_FCLK,
1070 .clksel_mask = OMAP4430_SCALE_FCLK_MASK,
1071 .ops = &clkops_null,
1072 .recalc = &omap2_clksel_recalc,
1073 .round_rate = &omap2_clksel_round_rate,
1074 .set_rate = &omap2_clksel_set_rate,
1075};
1076
1077static const struct clksel hsmmc6_fclk_sel[] = {
1078 { .parent = &func_64m_fclk, .rates = div_1_0_rates },
1079 { .parent = &func_96m_fclk, .rates = div_1_1_rates },
1080 { .parent = NULL },
1081};
1082
1083static struct clk hsmmc6_fclk = {
1084 .name = "hsmmc6_fclk",
1085 .parent = &func_64m_fclk,
1086 .ops = &clkops_null,
1087 .recalc = &followparent_recalc,
1088};
1089
1090static const struct clksel_rate div2_1to8_rates[] = {
1091 { .div = 1, .val = 0, .flags = RATE_IN_4430 },
1092 { .div = 8, .val = 1, .flags = RATE_IN_4430 },
1093 { .div = 0 },
1094};
1095
1096static const struct clksel init_60m_fclk_div[] = {
1097 { .parent = &dpll_usb_m2_ck, .rates = div2_1to8_rates },
1098 { .parent = NULL },
1099};
1100
1101static struct clk init_60m_fclk = {
1102 .name = "init_60m_fclk",
1103 .parent = &dpll_usb_m2_ck,
1104 .clksel = init_60m_fclk_div,
1105 .clksel_reg = OMAP4430_CM_CLKSEL_USB_60MHZ,
1106 .clksel_mask = OMAP4430_CLKSEL_0_0_MASK,
1107 .ops = &clkops_null,
1108 .recalc = &omap2_clksel_recalc,
1109 .round_rate = &omap2_clksel_round_rate,
1110 .set_rate = &omap2_clksel_set_rate,
1111};
1112
1113static const struct clksel l3_div_div[] = {
1114 { .parent = &div_core_ck, .rates = div2_1to2_rates },
1115 { .parent = NULL },
1116};
1117
1118static struct clk l3_div_ck = {
1119 .name = "l3_div_ck",
1120 .parent = &div_core_ck,
1121 .clksel = l3_div_div,
1122 .clksel_reg = OMAP4430_CM_CLKSEL_CORE,
1123 .clksel_mask = OMAP4430_CLKSEL_L3_MASK,
1124 .ops = &clkops_null,
1125 .recalc = &omap2_clksel_recalc,
1126 .round_rate = &omap2_clksel_round_rate,
1127 .set_rate = &omap2_clksel_set_rate,
1128};
1129
1130static const struct clksel l4_div_div[] = {
1131 { .parent = &l3_div_ck, .rates = div2_1to2_rates },
1132 { .parent = NULL },
1133};
1134
1135static struct clk l4_div_ck = {
1136 .name = "l4_div_ck",
1137 .parent = &l3_div_ck,
1138 .clksel = l4_div_div,
1139 .clksel_reg = OMAP4430_CM_CLKSEL_CORE,
1140 .clksel_mask = OMAP4430_CLKSEL_L4_MASK,
1141 .ops = &clkops_null,
1142 .recalc = &omap2_clksel_recalc,
1143 .round_rate = &omap2_clksel_round_rate,
1144 .set_rate = &omap2_clksel_set_rate,
1145};
1146
1147static struct clk lp_clk_div_ck = {
1148 .name = "lp_clk_div_ck",
1149 .parent = &dpll_abe_m2x2_ck,
1150 .ops = &clkops_null,
1151 .recalc = &followparent_recalc,
1152};
1153
1154static const struct clksel l4_wkup_clk_mux_sel[] = {
1155 { .parent = &sys_clkin_ck, .rates = div_1_0_rates },
1156 { .parent = &lp_clk_div_ck, .rates = div_1_1_rates },
1157 { .parent = NULL },
1158};
1159
1160static struct clk l4_wkup_clk_mux_ck = {
1161 .name = "l4_wkup_clk_mux_ck",
1162 .parent = &sys_clkin_ck,
1163 .clksel = l4_wkup_clk_mux_sel,
1164 .init = &omap2_init_clksel_parent,
1165 .clksel_reg = OMAP4430_CM_L4_WKUP_CLKSEL,
1166 .clksel_mask = OMAP4430_CLKSEL_0_0_MASK,
1167 .ops = &clkops_null,
1168 .recalc = &omap2_clksel_recalc,
1169};
1170
1171static const struct clksel per_abe_nc_fclk_div[] = {
1172 { .parent = &dpll_abe_m2_ck, .rates = div2_1to2_rates },
1173 { .parent = NULL },
1174};
1175
1176static struct clk per_abe_nc_fclk = {
1177 .name = "per_abe_nc_fclk",
1178 .parent = &dpll_abe_m2_ck,
1179 .clksel = per_abe_nc_fclk_div,
1180 .clksel_reg = OMAP4430_CM_SCALE_FCLK,
1181 .clksel_mask = OMAP4430_SCALE_FCLK_MASK,
1182 .ops = &clkops_null,
1183 .recalc = &omap2_clksel_recalc,
1184 .round_rate = &omap2_clksel_round_rate,
1185 .set_rate = &omap2_clksel_set_rate,
1186};
1187
1188static const struct clksel mcasp2_fclk_sel[] = {
1189 { .parent = &func_96m_fclk, .rates = div_1_0_rates },
1190 { .parent = &per_abe_nc_fclk, .rates = div_1_1_rates },
1191 { .parent = NULL },
1192};
1193
1194static struct clk mcasp2_fclk = {
1195 .name = "mcasp2_fclk",
1196 .parent = &func_96m_fclk,
1197 .ops = &clkops_null,
1198 .recalc = &followparent_recalc,
1199};
1200
1201static struct clk mcasp3_fclk = {
1202 .name = "mcasp3_fclk",
1203 .parent = &func_96m_fclk,
1204 .ops = &clkops_null,
1205 .recalc = &followparent_recalc,
1206};
1207
1208static struct clk ocp_abe_iclk = {
1209 .name = "ocp_abe_iclk",
1210 .parent = &aess_fclk,
1211 .ops = &clkops_null,
1212 .recalc = &followparent_recalc,
1213};
1214
1215static struct clk per_abe_24m_fclk = {
1216 .name = "per_abe_24m_fclk",
1217 .parent = &dpll_abe_m2_ck,
1218 .ops = &clkops_null,
1219 .recalc = &followparent_recalc,
1220};
1221
1222static const struct clksel pmd_stm_clock_mux_sel[] = {
1223 { .parent = &sys_clkin_ck, .rates = div_1_0_rates },
1224 { .parent = &dpll_core_m6_ck, .rates = div_1_1_rates },
1225 { .parent = &dpll_per_m7_ck, .rates = div_1_2_rates },
1226 { .parent = NULL },
1227};
1228
1229static struct clk pmd_stm_clock_mux_ck = {
1230 .name = "pmd_stm_clock_mux_ck",
1231 .parent = &sys_clkin_ck,
1232 .ops = &clkops_null,
1233 .recalc = &followparent_recalc,
1234};
1235
1236static struct clk pmd_trace_clk_mux_ck = {
1237 .name = "pmd_trace_clk_mux_ck",
1238 .parent = &sys_clkin_ck,
1239 .ops = &clkops_null,
1240 .recalc = &followparent_recalc,
1241};
1242
1243static struct clk syc_clk_div_ck = {
1244 .name = "syc_clk_div_ck",
1245 .parent = &sys_clkin_ck,
1246 .clksel = dpll_sys_ref_clk_div,
1247 .clksel_reg = OMAP4430_CM_ABE_DSS_SYS_CLKSEL,
1248 .clksel_mask = OMAP4430_CLKSEL_0_0_MASK,
1249 .ops = &clkops_null,
1250 .recalc = &omap2_clksel_recalc,
1251 .round_rate = &omap2_clksel_round_rate,
1252 .set_rate = &omap2_clksel_set_rate,
1253};
1254
1255/* Leaf clocks controlled by modules */
1256
1257static struct clk aes1_fck = {
1258 .name = "aes1_fck",
1259 .ops = &clkops_omap2_dflt,
1260 .enable_reg = OMAP4430_CM_L4SEC_AES1_CLKCTRL,
1261 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1262 .clkdm_name = "l4_secure_clkdm",
1263 .parent = &l3_div_ck,
1264 .recalc = &followparent_recalc,
1265};
1266
1267static struct clk aes2_fck = {
1268 .name = "aes2_fck",
1269 .ops = &clkops_omap2_dflt,
1270 .enable_reg = OMAP4430_CM_L4SEC_AES2_CLKCTRL,
1271 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1272 .clkdm_name = "l4_secure_clkdm",
1273 .parent = &l3_div_ck,
1274 .recalc = &followparent_recalc,
1275};
1276
1277static struct clk aess_fck = {
1278 .name = "aess_fck",
1279 .ops = &clkops_omap2_dflt,
1280 .enable_reg = OMAP4430_CM1_ABE_AESS_CLKCTRL,
1281 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1282 .clkdm_name = "abe_clkdm",
1283 .parent = &aess_fclk,
1284 .recalc = &followparent_recalc,
1285};
1286
1287static struct clk cust_efuse_fck = {
1288 .name = "cust_efuse_fck",
1289 .ops = &clkops_omap2_dflt,
1290 .enable_reg = OMAP4430_CM_CEFUSE_CEFUSE_CLKCTRL,
1291 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1292 .clkdm_name = "l4_cefuse_clkdm",
1293 .parent = &sys_clkin_ck,
1294 .recalc = &followparent_recalc,
1295};
1296
1297static struct clk des3des_fck = {
1298 .name = "des3des_fck",
1299 .ops = &clkops_omap2_dflt,
1300 .enable_reg = OMAP4430_CM_L4SEC_DES3DES_CLKCTRL,
1301 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1302 .clkdm_name = "l4_secure_clkdm",
1303 .parent = &l4_div_ck,
1304 .recalc = &followparent_recalc,
1305};
1306
1307static const struct clksel dmic_sync_mux_sel[] = {
1308 { .parent = &abe_24m_fclk, .rates = div_1_0_rates },
1309 { .parent = &syc_clk_div_ck, .rates = div_1_1_rates },
1310 { .parent = &func_24m_clk, .rates = div_1_2_rates },
1311 { .parent = NULL },
1312};
1313
1314static struct clk dmic_sync_mux_ck = {
1315 .name = "dmic_sync_mux_ck",
1316 .parent = &abe_24m_fclk,
1317 .clksel = dmic_sync_mux_sel,
1318 .init = &omap2_init_clksel_parent,
1319 .clksel_reg = OMAP4430_CM1_ABE_DMIC_CLKCTRL,
1320 .clksel_mask = OMAP4430_CLKSEL_INTERNAL_SOURCE_MASK,
1321 .ops = &clkops_null,
1322 .recalc = &omap2_clksel_recalc,
1323};
1324
1325static const struct clksel func_dmic_abe_gfclk_sel[] = {
1326 { .parent = &dmic_sync_mux_ck, .rates = div_1_0_rates },
1327 { .parent = &pad_clks_ck, .rates = div_1_1_rates },
1328 { .parent = &slimbus_clk, .rates = div_1_2_rates },
1329 { .parent = NULL },
1330};
1331
1332/* Merged func_dmic_abe_gfclk into dmic */
1333static struct clk dmic_fck = {
1334 .name = "dmic_fck",
1335 .parent = &dmic_sync_mux_ck,
1336 .clksel = func_dmic_abe_gfclk_sel,
1337 .init = &omap2_init_clksel_parent,
1338 .clksel_reg = OMAP4430_CM1_ABE_DMIC_CLKCTRL,
1339 .clksel_mask = OMAP4430_CLKSEL_SOURCE_MASK,
1340 .ops = &clkops_omap2_dflt,
1341 .recalc = &omap2_clksel_recalc,
1342 .enable_reg = OMAP4430_CM1_ABE_DMIC_CLKCTRL,
1343 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1344 .clkdm_name = "abe_clkdm",
1345};
1346
1347static struct clk dss_fck = {
1348 .name = "dss_fck",
1349 .ops = &clkops_omap2_dflt,
1350 .enable_reg = OMAP4430_CM_DSS_DSS_CLKCTRL,
1351 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1352 .clkdm_name = "l3_dss_clkdm",
1353 .parent = &l3_div_ck,
1354 .recalc = &followparent_recalc,
1355};
1356
1357static struct clk ducati_ick = {
1358 .name = "ducati_ick",
1359 .ops = &clkops_omap2_dflt,
1360 .enable_reg = OMAP4430_CM_DUCATI_DUCATI_CLKCTRL,
1361 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
1362 .clkdm_name = "ducati_clkdm",
1363 .parent = &ducati_clk_mux_ck,
1364 .recalc = &followparent_recalc,
1365};
1366
1367static struct clk emif1_ick = {
1368 .name = "emif1_ick",
1369 .ops = &clkops_omap2_dflt,
1370 .enable_reg = OMAP4430_CM_MEMIF_EMIF_1_CLKCTRL,
1371 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
1372 .clkdm_name = "l3_emif_clkdm",
1373 .parent = &ddrphy_ck,
1374 .recalc = &followparent_recalc,
1375};
1376
1377static struct clk emif2_ick = {
1378 .name = "emif2_ick",
1379 .ops = &clkops_omap2_dflt,
1380 .enable_reg = OMAP4430_CM_MEMIF_EMIF_2_CLKCTRL,
1381 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
1382 .clkdm_name = "l3_emif_clkdm",
1383 .parent = &ddrphy_ck,
1384 .recalc = &followparent_recalc,
1385};
1386
1387static const struct clksel fdif_fclk_div[] = {
1388 { .parent = &dpll_per_m4_ck, .rates = div3_1to4_rates },
1389 { .parent = NULL },
1390};
1391
1392/* Merged fdif_fclk into fdif */
1393static struct clk fdif_fck = {
1394 .name = "fdif_fck",
1395 .parent = &dpll_per_m4_ck,
1396 .clksel = fdif_fclk_div,
1397 .clksel_reg = OMAP4430_CM_CAM_FDIF_CLKCTRL,
1398 .clksel_mask = OMAP4430_CLKSEL_FCLK_MASK,
1399 .ops = &clkops_omap2_dflt,
1400 .recalc = &omap2_clksel_recalc,
1401 .round_rate = &omap2_clksel_round_rate,
1402 .set_rate = &omap2_clksel_set_rate,
1403 .enable_reg = OMAP4430_CM_CAM_FDIF_CLKCTRL,
1404 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1405 .clkdm_name = "iss_clkdm",
1406};
1407
1408static const struct clksel per_sgx_fclk_div[] = {
1409 { .parent = &dpll_per_m2x2_ck, .rates = div3_1to4_rates },
1410 { .parent = NULL },
1411};
1412
1413static struct clk per_sgx_fclk = {
1414 .name = "per_sgx_fclk",
1415 .parent = &dpll_per_m2x2_ck,
1416 .clksel = per_sgx_fclk_div,
1417 .clksel_reg = OMAP4430_CM_GFX_GFX_CLKCTRL,
1418 .clksel_mask = OMAP4430_CLKSEL_PER_192M_MASK,
1419 .ops = &clkops_null,
1420 .recalc = &omap2_clksel_recalc,
1421 .round_rate = &omap2_clksel_round_rate,
1422 .set_rate = &omap2_clksel_set_rate,
1423};
1424
1425static const struct clksel sgx_clk_mux_sel[] = {
1426 { .parent = &dpll_core_m7_ck, .rates = div_1_0_rates },
1427 { .parent = &per_sgx_fclk, .rates = div_1_1_rates },
1428 { .parent = NULL },
1429};
1430
1431/* Merged sgx_clk_mux into gfx */
1432static struct clk gfx_fck = {
1433 .name = "gfx_fck",
1434 .parent = &dpll_core_m7_ck,
1435 .clksel = sgx_clk_mux_sel,
1436 .init = &omap2_init_clksel_parent,
1437 .clksel_reg = OMAP4430_CM_GFX_GFX_CLKCTRL,
1438 .clksel_mask = OMAP4430_CLKSEL_SGX_FCLK_MASK,
1439 .ops = &clkops_omap2_dflt,
1440 .recalc = &omap2_clksel_recalc,
1441 .enable_reg = OMAP4430_CM_GFX_GFX_CLKCTRL,
1442 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1443 .clkdm_name = "l3_gfx_clkdm",
1444};
1445
1446static struct clk gpio1_ick = {
1447 .name = "gpio1_ick",
1448 .ops = &clkops_omap2_dflt,
1449 .enable_reg = OMAP4430_CM_WKUP_GPIO1_CLKCTRL,
1450 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
1451 .clkdm_name = "l4_wkup_clkdm",
1452 .parent = &l4_wkup_clk_mux_ck,
1453 .recalc = &followparent_recalc,
1454};
1455
1456static struct clk gpio2_ick = {
1457 .name = "gpio2_ick",
1458 .ops = &clkops_omap2_dflt,
1459 .enable_reg = OMAP4430_CM_L4PER_GPIO2_CLKCTRL,
1460 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
1461 .clkdm_name = "l4_per_clkdm",
1462 .parent = &l4_div_ck,
1463 .recalc = &followparent_recalc,
1464};
1465
1466static struct clk gpio3_ick = {
1467 .name = "gpio3_ick",
1468 .ops = &clkops_omap2_dflt,
1469 .enable_reg = OMAP4430_CM_L4PER_GPIO3_CLKCTRL,
1470 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
1471 .clkdm_name = "l4_per_clkdm",
1472 .parent = &l4_div_ck,
1473 .recalc = &followparent_recalc,
1474};
1475
1476static struct clk gpio4_ick = {
1477 .name = "gpio4_ick",
1478 .ops = &clkops_omap2_dflt,
1479 .enable_reg = OMAP4430_CM_L4PER_GPIO4_CLKCTRL,
1480 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
1481 .clkdm_name = "l4_per_clkdm",
1482 .parent = &l4_div_ck,
1483 .recalc = &followparent_recalc,
1484};
1485
1486static struct clk gpio5_ick = {
1487 .name = "gpio5_ick",
1488 .ops = &clkops_omap2_dflt,
1489 .enable_reg = OMAP4430_CM_L4PER_GPIO5_CLKCTRL,
1490 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
1491 .clkdm_name = "l4_per_clkdm",
1492 .parent = &l4_div_ck,
1493 .recalc = &followparent_recalc,
1494};
1495
1496static struct clk gpio6_ick = {
1497 .name = "gpio6_ick",
1498 .ops = &clkops_omap2_dflt,
1499 .enable_reg = OMAP4430_CM_L4PER_GPIO6_CLKCTRL,
1500 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
1501 .clkdm_name = "l4_per_clkdm",
1502 .parent = &l4_div_ck,
1503 .recalc = &followparent_recalc,
1504};
1505
1506static struct clk gpmc_ick = {
1507 .name = "gpmc_ick",
1508 .ops = &clkops_omap2_dflt,
1509 .enable_reg = OMAP4430_CM_L3_2_GPMC_CLKCTRL,
1510 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
1511 .clkdm_name = "l3_2_clkdm",
1512 .parent = &l3_div_ck,
1513 .recalc = &followparent_recalc,
1514};
1515
1516static const struct clksel dmt1_clk_mux_sel[] = {
1517 { .parent = &sys_clkin_ck, .rates = div_1_0_rates },
1518 { .parent = &sys_32k_ck, .rates = div_1_1_rates },
1519 { .parent = NULL },
1520};
1521
1522/*
1523 * Merged dmt1_clk_mux into gptimer1
1524 * gptimer1 renamed temporarily into gpt1 to match OMAP3 convention
1525 */
1526static struct clk gpt1_fck = {
1527 .name = "gpt1_fck",
1528 .parent = &sys_clkin_ck,
1529 .clksel = dmt1_clk_mux_sel,
1530 .init = &omap2_init_clksel_parent,
1531 .clksel_reg = OMAP4430_CM_WKUP_TIMER1_CLKCTRL,
1532 .clksel_mask = OMAP4430_CLKSEL_MASK,
1533 .ops = &clkops_omap2_dflt,
1534 .recalc = &omap2_clksel_recalc,
1535 .enable_reg = OMAP4430_CM_WKUP_TIMER1_CLKCTRL,
1536 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1537 .clkdm_name = "l4_wkup_clkdm",
1538};
1539
1540/*
1541 * Merged cm2_dm10_mux into gptimer10
1542 * gptimer10 renamed temporarily into gpt10 to match OMAP3 convention
1543 */
1544static struct clk gpt10_fck = {
1545 .name = "gpt10_fck",
1546 .parent = &sys_clkin_ck,
1547 .clksel = dmt1_clk_mux_sel,
1548 .init = &omap2_init_clksel_parent,
1549 .clksel_reg = OMAP4430_CM_L4PER_DMTIMER10_CLKCTRL,
1550 .clksel_mask = OMAP4430_CLKSEL_MASK,
1551 .ops = &clkops_omap2_dflt,
1552 .recalc = &omap2_clksel_recalc,
1553 .enable_reg = OMAP4430_CM_L4PER_DMTIMER10_CLKCTRL,
1554 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1555 .clkdm_name = "l4_per_clkdm",
1556};
1557
1558/*
1559 * Merged cm2_dm11_mux into gptimer11
1560 * gptimer11 renamed temporarily into gpt11 to match OMAP3 convention
1561 */
1562static struct clk gpt11_fck = {
1563 .name = "gpt11_fck",
1564 .parent = &sys_clkin_ck,
1565 .clksel = dmt1_clk_mux_sel,
1566 .init = &omap2_init_clksel_parent,
1567 .clksel_reg = OMAP4430_CM_L4PER_DMTIMER11_CLKCTRL,
1568 .clksel_mask = OMAP4430_CLKSEL_MASK,
1569 .ops = &clkops_omap2_dflt,
1570 .recalc = &omap2_clksel_recalc,
1571 .enable_reg = OMAP4430_CM_L4PER_DMTIMER11_CLKCTRL,
1572 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1573 .clkdm_name = "l4_per_clkdm",
1574};
1575
1576/*
1577 * Merged cm2_dm2_mux into gptimer2
1578 * gptimer2 renamed temporarily into gpt2 to match OMAP3 convention
1579 */
1580static struct clk gpt2_fck = {
1581 .name = "gpt2_fck",
1582 .parent = &sys_clkin_ck,
1583 .clksel = dmt1_clk_mux_sel,
1584 .init = &omap2_init_clksel_parent,
1585 .clksel_reg = OMAP4430_CM_L4PER_DMTIMER2_CLKCTRL,
1586 .clksel_mask = OMAP4430_CLKSEL_MASK,
1587 .ops = &clkops_omap2_dflt,
1588 .recalc = &omap2_clksel_recalc,
1589 .enable_reg = OMAP4430_CM_L4PER_DMTIMER2_CLKCTRL,
1590 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1591 .clkdm_name = "l4_per_clkdm",
1592};
1593
1594/*
1595 * Merged cm2_dm3_mux into gptimer3
1596 * gptimer3 renamed temporarily into gpt3 to match OMAP3 convention
1597 */
1598static struct clk gpt3_fck = {
1599 .name = "gpt3_fck",
1600 .parent = &sys_clkin_ck,
1601 .clksel = dmt1_clk_mux_sel,
1602 .init = &omap2_init_clksel_parent,
1603 .clksel_reg = OMAP4430_CM_L4PER_DMTIMER3_CLKCTRL,
1604 .clksel_mask = OMAP4430_CLKSEL_MASK,
1605 .ops = &clkops_omap2_dflt,
1606 .recalc = &omap2_clksel_recalc,
1607 .enable_reg = OMAP4430_CM_L4PER_DMTIMER3_CLKCTRL,
1608 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1609 .clkdm_name = "l4_per_clkdm",
1610};
1611
1612/*
1613 * Merged cm2_dm4_mux into gptimer4
1614 * gptimer4 renamed temporarily into gpt4 to match OMAP3 convention
1615 */
1616static struct clk gpt4_fck = {
1617 .name = "gpt4_fck",
1618 .parent = &sys_clkin_ck,
1619 .clksel = dmt1_clk_mux_sel,
1620 .init = &omap2_init_clksel_parent,
1621 .clksel_reg = OMAP4430_CM_L4PER_DMTIMER4_CLKCTRL,
1622 .clksel_mask = OMAP4430_CLKSEL_MASK,
1623 .ops = &clkops_omap2_dflt,
1624 .recalc = &omap2_clksel_recalc,
1625 .enable_reg = OMAP4430_CM_L4PER_DMTIMER4_CLKCTRL,
1626 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1627 .clkdm_name = "l4_per_clkdm",
1628};
1629
1630static const struct clksel timer5_sync_mux_sel[] = {
1631 { .parent = &syc_clk_div_ck, .rates = div_1_0_rates },
1632 { .parent = &sys_32k_ck, .rates = div_1_1_rates },
1633 { .parent = NULL },
1634};
1635
1636/*
1637 * Merged timer5_sync_mux into gptimer5
1638 * gptimer5 renamed temporarily into gpt5 to match OMAP3 convention
1639 */
1640static struct clk gpt5_fck = {
1641 .name = "gpt5_fck",
1642 .parent = &syc_clk_div_ck,
1643 .clksel = timer5_sync_mux_sel,
1644 .init = &omap2_init_clksel_parent,
1645 .clksel_reg = OMAP4430_CM1_ABE_TIMER5_CLKCTRL,
1646 .clksel_mask = OMAP4430_CLKSEL_MASK,
1647 .ops = &clkops_omap2_dflt,
1648 .recalc = &omap2_clksel_recalc,
1649 .enable_reg = OMAP4430_CM1_ABE_TIMER5_CLKCTRL,
1650 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1651 .clkdm_name = "abe_clkdm",
1652};
1653
1654/*
1655 * Merged timer6_sync_mux into gptimer6
1656 * gptimer6 renamed temporarily into gpt6 to match OMAP3 convention
1657 */
1658static struct clk gpt6_fck = {
1659 .name = "gpt6_fck",
1660 .parent = &syc_clk_div_ck,
1661 .clksel = timer5_sync_mux_sel,
1662 .init = &omap2_init_clksel_parent,
1663 .clksel_reg = OMAP4430_CM1_ABE_TIMER6_CLKCTRL,
1664 .clksel_mask = OMAP4430_CLKSEL_MASK,
1665 .ops = &clkops_omap2_dflt,
1666 .recalc = &omap2_clksel_recalc,
1667 .enable_reg = OMAP4430_CM1_ABE_TIMER6_CLKCTRL,
1668 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1669 .clkdm_name = "abe_clkdm",
1670};
1671
1672/*
1673 * Merged timer7_sync_mux into gptimer7
1674 * gptimer7 renamed temporarily into gpt7 to match OMAP3 convention
1675 */
1676static struct clk gpt7_fck = {
1677 .name = "gpt7_fck",
1678 .parent = &syc_clk_div_ck,
1679 .clksel = timer5_sync_mux_sel,
1680 .init = &omap2_init_clksel_parent,
1681 .clksel_reg = OMAP4430_CM1_ABE_TIMER7_CLKCTRL,
1682 .clksel_mask = OMAP4430_CLKSEL_MASK,
1683 .ops = &clkops_omap2_dflt,
1684 .recalc = &omap2_clksel_recalc,
1685 .enable_reg = OMAP4430_CM1_ABE_TIMER7_CLKCTRL,
1686 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1687 .clkdm_name = "abe_clkdm",
1688};
1689
1690/*
1691 * Merged timer8_sync_mux into gptimer8
1692 * gptimer8 renamed temporarily into gpt8 to match OMAP3 convention
1693 */
1694static struct clk gpt8_fck = {
1695 .name = "gpt8_fck",
1696 .parent = &syc_clk_div_ck,
1697 .clksel = timer5_sync_mux_sel,
1698 .init = &omap2_init_clksel_parent,
1699 .clksel_reg = OMAP4430_CM1_ABE_TIMER8_CLKCTRL,
1700 .clksel_mask = OMAP4430_CLKSEL_MASK,
1701 .ops = &clkops_omap2_dflt,
1702 .recalc = &omap2_clksel_recalc,
1703 .enable_reg = OMAP4430_CM1_ABE_TIMER8_CLKCTRL,
1704 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1705 .clkdm_name = "abe_clkdm",
1706};
1707
1708/*
1709 * Merged cm2_dm9_mux into gptimer9
1710 * gptimer9 renamed temporarily into gpt9 to match OMAP3 convention
1711 */
1712static struct clk gpt9_fck = {
1713 .name = "gpt9_fck",
1714 .parent = &sys_clkin_ck,
1715 .clksel = dmt1_clk_mux_sel,
1716 .init = &omap2_init_clksel_parent,
1717 .clksel_reg = OMAP4430_CM_L4PER_DMTIMER9_CLKCTRL,
1718 .clksel_mask = OMAP4430_CLKSEL_MASK,
1719 .ops = &clkops_omap2_dflt,
1720 .recalc = &omap2_clksel_recalc,
1721 .enable_reg = OMAP4430_CM_L4PER_DMTIMER9_CLKCTRL,
1722 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1723 .clkdm_name = "l4_per_clkdm",
1724};
1725
1726static struct clk hdq1w_fck = {
1727 .name = "hdq1w_fck",
1728 .ops = &clkops_omap2_dflt,
1729 .enable_reg = OMAP4430_CM_L4PER_HDQ1W_CLKCTRL,
1730 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1731 .clkdm_name = "l4_per_clkdm",
1732 .parent = &func_12m_fclk,
1733 .recalc = &followparent_recalc,
1734};
1735
1736/* Merged hsi_fclk into hsi */
1737static struct clk hsi_ick = {
1738 .name = "hsi_ick",
1739 .parent = &dpll_per_m2x2_ck,
1740 .clksel = per_sgx_fclk_div,
1741 .clksel_reg = OMAP4430_CM_L3INIT_HSI_CLKCTRL,
1742 .clksel_mask = OMAP4430_CLKSEL_24_25_MASK,
1743 .ops = &clkops_omap2_dflt,
1744 .recalc = &omap2_clksel_recalc,
1745 .round_rate = &omap2_clksel_round_rate,
1746 .set_rate = &omap2_clksel_set_rate,
1747 .enable_reg = OMAP4430_CM_L3INIT_HSI_CLKCTRL,
1748 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
1749 .clkdm_name = "l3_init_clkdm",
1750};
1751
1752static struct clk i2c1_fck = {
1753 .name = "i2c1_fck",
1754 .ops = &clkops_omap2_dflt,
1755 .enable_reg = OMAP4430_CM_L4PER_I2C1_CLKCTRL,
1756 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1757 .clkdm_name = "l4_per_clkdm",
1758 .parent = &func_96m_fclk,
1759 .recalc = &followparent_recalc,
1760};
1761
1762static struct clk i2c2_fck = {
1763 .name = "i2c2_fck",
1764 .ops = &clkops_omap2_dflt,
1765 .enable_reg = OMAP4430_CM_L4PER_I2C2_CLKCTRL,
1766 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1767 .clkdm_name = "l4_per_clkdm",
1768 .parent = &func_96m_fclk,
1769 .recalc = &followparent_recalc,
1770};
1771
1772static struct clk i2c3_fck = {
1773 .name = "i2c3_fck",
1774 .ops = &clkops_omap2_dflt,
1775 .enable_reg = OMAP4430_CM_L4PER_I2C3_CLKCTRL,
1776 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1777 .clkdm_name = "l4_per_clkdm",
1778 .parent = &func_96m_fclk,
1779 .recalc = &followparent_recalc,
1780};
1781
1782static struct clk i2c4_fck = {
1783 .name = "i2c4_fck",
1784 .ops = &clkops_omap2_dflt,
1785 .enable_reg = OMAP4430_CM_L4PER_I2C4_CLKCTRL,
1786 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1787 .clkdm_name = "l4_per_clkdm",
1788 .parent = &func_96m_fclk,
1789 .recalc = &followparent_recalc,
1790};
1791
1792static struct clk iss_fck = {
1793 .name = "iss_fck",
1794 .ops = &clkops_omap2_dflt,
1795 .enable_reg = OMAP4430_CM_CAM_ISS_CLKCTRL,
1796 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1797 .clkdm_name = "iss_clkdm",
1798 .parent = &ducati_clk_mux_ck,
1799 .recalc = &followparent_recalc,
1800};
1801
1802static struct clk ivahd_ick = {
1803 .name = "ivahd_ick",
1804 .ops = &clkops_omap2_dflt,
1805 .enable_reg = OMAP4430_CM_IVAHD_IVAHD_CLKCTRL,
1806 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
1807 .clkdm_name = "ivahd_clkdm",
1808 .parent = &dpll_iva_m5_ck,
1809 .recalc = &followparent_recalc,
1810};
1811
1812static struct clk keyboard_fck = {
1813 .name = "keyboard_fck",
1814 .ops = &clkops_omap2_dflt,
1815 .enable_reg = OMAP4430_CM_WKUP_KEYBOARD_CLKCTRL,
1816 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1817 .clkdm_name = "l4_wkup_clkdm",
1818 .parent = &sys_32k_ck,
1819 .recalc = &followparent_recalc,
1820};
1821
1822static struct clk l3_instr_interconnect_ick = {
1823 .name = "l3_instr_interconnect_ick",
1824 .ops = &clkops_omap2_dflt,
1825 .enable_reg = OMAP4430_CM_L3INSTR_L3_INSTR_CLKCTRL,
1826 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
1827 .clkdm_name = "l3_instr_clkdm",
1828 .parent = &l3_div_ck,
1829 .recalc = &followparent_recalc,
1830};
1831
1832static struct clk l3_interconnect_3_ick = {
1833 .name = "l3_interconnect_3_ick",
1834 .ops = &clkops_omap2_dflt,
1835 .enable_reg = OMAP4430_CM_L3INSTR_L3_3_CLKCTRL,
1836 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
1837 .clkdm_name = "l3_instr_clkdm",
1838 .parent = &l3_div_ck,
1839 .recalc = &followparent_recalc,
1840};
1841
1842static struct clk mcasp_sync_mux_ck = {
1843 .name = "mcasp_sync_mux_ck",
1844 .parent = &abe_24m_fclk,
1845 .clksel = dmic_sync_mux_sel,
1846 .init = &omap2_init_clksel_parent,
1847 .clksel_reg = OMAP4430_CM1_ABE_MCASP_CLKCTRL,
1848 .clksel_mask = OMAP4430_CLKSEL_INTERNAL_SOURCE_MASK,
1849 .ops = &clkops_null,
1850 .recalc = &omap2_clksel_recalc,
1851};
1852
1853static const struct clksel func_mcasp_abe_gfclk_sel[] = {
1854 { .parent = &mcasp_sync_mux_ck, .rates = div_1_0_rates },
1855 { .parent = &pad_clks_ck, .rates = div_1_1_rates },
1856 { .parent = &slimbus_clk, .rates = div_1_2_rates },
1857 { .parent = NULL },
1858};
1859
1860/* Merged func_mcasp_abe_gfclk into mcasp */
1861static struct clk mcasp_fck = {
1862 .name = "mcasp_fck",
1863 .parent = &mcasp_sync_mux_ck,
1864 .clksel = func_mcasp_abe_gfclk_sel,
1865 .init = &omap2_init_clksel_parent,
1866 .clksel_reg = OMAP4430_CM1_ABE_MCASP_CLKCTRL,
1867 .clksel_mask = OMAP4430_CLKSEL_SOURCE_MASK,
1868 .ops = &clkops_omap2_dflt,
1869 .recalc = &omap2_clksel_recalc,
1870 .enable_reg = OMAP4430_CM1_ABE_MCASP_CLKCTRL,
1871 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1872 .clkdm_name = "abe_clkdm",
1873};
1874
1875static struct clk mcbsp1_sync_mux_ck = {
1876 .name = "mcbsp1_sync_mux_ck",
1877 .parent = &abe_24m_fclk,
1878 .clksel = dmic_sync_mux_sel,
1879 .init = &omap2_init_clksel_parent,
1880 .clksel_reg = OMAP4430_CM1_ABE_MCBSP1_CLKCTRL,
1881 .clksel_mask = OMAP4430_CLKSEL_INTERNAL_SOURCE_MASK,
1882 .ops = &clkops_null,
1883 .recalc = &omap2_clksel_recalc,
1884};
1885
1886static const struct clksel func_mcbsp1_gfclk_sel[] = {
1887 { .parent = &mcbsp1_sync_mux_ck, .rates = div_1_0_rates },
1888 { .parent = &pad_clks_ck, .rates = div_1_1_rates },
1889 { .parent = &slimbus_clk, .rates = div_1_2_rates },
1890 { .parent = NULL },
1891};
1892
1893/* Merged func_mcbsp1_gfclk into mcbsp1 */
1894static struct clk mcbsp1_fck = {
1895 .name = "mcbsp1_fck",
1896 .parent = &mcbsp1_sync_mux_ck,
1897 .clksel = func_mcbsp1_gfclk_sel,
1898 .init = &omap2_init_clksel_parent,
1899 .clksel_reg = OMAP4430_CM1_ABE_MCBSP1_CLKCTRL,
1900 .clksel_mask = OMAP4430_CLKSEL_SOURCE_MASK,
1901 .ops = &clkops_omap2_dflt,
1902 .recalc = &omap2_clksel_recalc,
1903 .enable_reg = OMAP4430_CM1_ABE_MCBSP1_CLKCTRL,
1904 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1905 .clkdm_name = "abe_clkdm",
1906};
1907
1908static struct clk mcbsp2_sync_mux_ck = {
1909 .name = "mcbsp2_sync_mux_ck",
1910 .parent = &abe_24m_fclk,
1911 .clksel = dmic_sync_mux_sel,
1912 .init = &omap2_init_clksel_parent,
1913 .clksel_reg = OMAP4430_CM1_ABE_MCBSP2_CLKCTRL,
1914 .clksel_mask = OMAP4430_CLKSEL_INTERNAL_SOURCE_MASK,
1915 .ops = &clkops_null,
1916 .recalc = &omap2_clksel_recalc,
1917};
1918
1919static const struct clksel func_mcbsp2_gfclk_sel[] = {
1920 { .parent = &mcbsp2_sync_mux_ck, .rates = div_1_0_rates },
1921 { .parent = &pad_clks_ck, .rates = div_1_1_rates },
1922 { .parent = &slimbus_clk, .rates = div_1_2_rates },
1923 { .parent = NULL },
1924};
1925
1926/* Merged func_mcbsp2_gfclk into mcbsp2 */
1927static struct clk mcbsp2_fck = {
1928 .name = "mcbsp2_fck",
1929 .parent = &mcbsp2_sync_mux_ck,
1930 .clksel = func_mcbsp2_gfclk_sel,
1931 .init = &omap2_init_clksel_parent,
1932 .clksel_reg = OMAP4430_CM1_ABE_MCBSP2_CLKCTRL,
1933 .clksel_mask = OMAP4430_CLKSEL_SOURCE_MASK,
1934 .ops = &clkops_omap2_dflt,
1935 .recalc = &omap2_clksel_recalc,
1936 .enable_reg = OMAP4430_CM1_ABE_MCBSP2_CLKCTRL,
1937 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1938 .clkdm_name = "abe_clkdm",
1939};
1940
1941static struct clk mcbsp3_sync_mux_ck = {
1942 .name = "mcbsp3_sync_mux_ck",
1943 .parent = &abe_24m_fclk,
1944 .clksel = dmic_sync_mux_sel,
1945 .init = &omap2_init_clksel_parent,
1946 .clksel_reg = OMAP4430_CM1_ABE_MCBSP3_CLKCTRL,
1947 .clksel_mask = OMAP4430_CLKSEL_INTERNAL_SOURCE_MASK,
1948 .ops = &clkops_null,
1949 .recalc = &omap2_clksel_recalc,
1950};
1951
1952static const struct clksel func_mcbsp3_gfclk_sel[] = {
1953 { .parent = &mcbsp3_sync_mux_ck, .rates = div_1_0_rates },
1954 { .parent = &pad_clks_ck, .rates = div_1_1_rates },
1955 { .parent = &slimbus_clk, .rates = div_1_2_rates },
1956 { .parent = NULL },
1957};
1958
1959/* Merged func_mcbsp3_gfclk into mcbsp3 */
1960static struct clk mcbsp3_fck = {
1961 .name = "mcbsp3_fck",
1962 .parent = &mcbsp3_sync_mux_ck,
1963 .clksel = func_mcbsp3_gfclk_sel,
1964 .init = &omap2_init_clksel_parent,
1965 .clksel_reg = OMAP4430_CM1_ABE_MCBSP3_CLKCTRL,
1966 .clksel_mask = OMAP4430_CLKSEL_SOURCE_MASK,
1967 .ops = &clkops_omap2_dflt,
1968 .recalc = &omap2_clksel_recalc,
1969 .enable_reg = OMAP4430_CM1_ABE_MCBSP3_CLKCTRL,
1970 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
1971 .clkdm_name = "abe_clkdm",
1972};
1973
1974static struct clk mcbsp4_sync_mux_ck = {
1975 .name = "mcbsp4_sync_mux_ck",
1976 .parent = &func_96m_fclk,
1977 .clksel = mcasp2_fclk_sel,
1978 .init = &omap2_init_clksel_parent,
1979 .clksel_reg = OMAP4430_CM_L4PER_MCBSP4_CLKCTRL,
1980 .clksel_mask = OMAP4430_CLKSEL_INTERNAL_SOURCE_MASK,
1981 .ops = &clkops_null,
1982 .recalc = &omap2_clksel_recalc,
1983};
1984
1985static const struct clksel per_mcbsp4_gfclk_sel[] = {
1986 { .parent = &mcbsp4_sync_mux_ck, .rates = div_1_0_rates },
1987 { .parent = &pad_clks_ck, .rates = div_1_1_rates },
1988 { .parent = NULL },
1989};
1990
1991/* Merged per_mcbsp4_gfclk into mcbsp4 */
1992static struct clk mcbsp4_fck = {
1993 .name = "mcbsp4_fck",
1994 .parent = &mcbsp4_sync_mux_ck,
1995 .clksel = per_mcbsp4_gfclk_sel,
1996 .init = &omap2_init_clksel_parent,
1997 .clksel_reg = OMAP4430_CM_L4PER_MCBSP4_CLKCTRL,
1998 .clksel_mask = OMAP4430_CLKSEL_SOURCE_24_24_MASK,
1999 .ops = &clkops_omap2_dflt,
2000 .recalc = &omap2_clksel_recalc,
2001 .enable_reg = OMAP4430_CM_L4PER_MCBSP4_CLKCTRL,
2002 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2003 .clkdm_name = "l4_per_clkdm",
2004};
2005
2006static struct clk mcspi1_fck = {
2007 .name = "mcspi1_fck",
2008 .ops = &clkops_omap2_dflt,
2009 .enable_reg = OMAP4430_CM_L4PER_MCSPI1_CLKCTRL,
2010 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2011 .clkdm_name = "l4_per_clkdm",
2012 .parent = &func_48m_fclk,
2013 .recalc = &followparent_recalc,
2014};
2015
2016static struct clk mcspi2_fck = {
2017 .name = "mcspi2_fck",
2018 .ops = &clkops_omap2_dflt,
2019 .enable_reg = OMAP4430_CM_L4PER_MCSPI2_CLKCTRL,
2020 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2021 .clkdm_name = "l4_per_clkdm",
2022 .parent = &func_48m_fclk,
2023 .recalc = &followparent_recalc,
2024};
2025
2026static struct clk mcspi3_fck = {
2027 .name = "mcspi3_fck",
2028 .ops = &clkops_omap2_dflt,
2029 .enable_reg = OMAP4430_CM_L4PER_MCSPI3_CLKCTRL,
2030 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2031 .clkdm_name = "l4_per_clkdm",
2032 .parent = &func_48m_fclk,
2033 .recalc = &followparent_recalc,
2034};
2035
2036static struct clk mcspi4_fck = {
2037 .name = "mcspi4_fck",
2038 .ops = &clkops_omap2_dflt,
2039 .enable_reg = OMAP4430_CM_L4PER_MCSPI4_CLKCTRL,
2040 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2041 .clkdm_name = "l4_per_clkdm",
2042 .parent = &func_48m_fclk,
2043 .recalc = &followparent_recalc,
2044};
2045
2046/* Merged hsmmc1_fclk into mmc1 */
2047static struct clk mmc1_fck = {
2048 .name = "mmc1_fck",
2049 .parent = &func_64m_fclk,
2050 .clksel = hsmmc6_fclk_sel,
2051 .init = &omap2_init_clksel_parent,
2052 .clksel_reg = OMAP4430_CM_L3INIT_MMC1_CLKCTRL,
2053 .clksel_mask = OMAP4430_CLKSEL_MASK,
2054 .ops = &clkops_omap2_dflt,
2055 .recalc = &omap2_clksel_recalc,
2056 .enable_reg = OMAP4430_CM_L3INIT_MMC1_CLKCTRL,
2057 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2058 .clkdm_name = "l3_init_clkdm",
2059};
2060
2061/* Merged hsmmc2_fclk into mmc2 */
2062static struct clk mmc2_fck = {
2063 .name = "mmc2_fck",
2064 .parent = &func_64m_fclk,
2065 .clksel = hsmmc6_fclk_sel,
2066 .init = &omap2_init_clksel_parent,
2067 .clksel_reg = OMAP4430_CM_L3INIT_MMC2_CLKCTRL,
2068 .clksel_mask = OMAP4430_CLKSEL_MASK,
2069 .ops = &clkops_omap2_dflt,
2070 .recalc = &omap2_clksel_recalc,
2071 .enable_reg = OMAP4430_CM_L3INIT_MMC2_CLKCTRL,
2072 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2073 .clkdm_name = "l3_init_clkdm",
2074};
2075
2076static struct clk mmc3_fck = {
2077 .name = "mmc3_fck",
2078 .ops = &clkops_omap2_dflt,
2079 .enable_reg = OMAP4430_CM_L4PER_MMCSD3_CLKCTRL,
2080 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2081 .clkdm_name = "l4_per_clkdm",
2082 .parent = &func_48m_fclk,
2083 .recalc = &followparent_recalc,
2084};
2085
2086static struct clk mmc4_fck = {
2087 .name = "mmc4_fck",
2088 .ops = &clkops_omap2_dflt,
2089 .enable_reg = OMAP4430_CM_L4PER_MMCSD4_CLKCTRL,
2090 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2091 .clkdm_name = "l4_per_clkdm",
2092 .parent = &func_48m_fclk,
2093 .recalc = &followparent_recalc,
2094};
2095
2096static struct clk mmc5_fck = {
2097 .name = "mmc5_fck",
2098 .ops = &clkops_omap2_dflt,
2099 .enable_reg = OMAP4430_CM_L4PER_MMCSD5_CLKCTRL,
2100 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2101 .clkdm_name = "l4_per_clkdm",
2102 .parent = &func_48m_fclk,
2103 .recalc = &followparent_recalc,
2104};
2105
2106static struct clk ocp_wp1_ick = {
2107 .name = "ocp_wp1_ick",
2108 .ops = &clkops_omap2_dflt,
2109 .enable_reg = OMAP4430_CM_L3INSTR_OCP_WP1_CLKCTRL,
2110 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
2111 .clkdm_name = "l3_instr_clkdm",
2112 .parent = &l3_div_ck,
2113 .recalc = &followparent_recalc,
2114};
2115
2116static struct clk pdm_fck = {
2117 .name = "pdm_fck",
2118 .ops = &clkops_omap2_dflt,
2119 .enable_reg = OMAP4430_CM1_ABE_PDM_CLKCTRL,
2120 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2121 .clkdm_name = "abe_clkdm",
2122 .parent = &pad_clks_ck,
2123 .recalc = &followparent_recalc,
2124};
2125
2126static struct clk pkaeip29_fck = {
2127 .name = "pkaeip29_fck",
2128 .ops = &clkops_omap2_dflt,
2129 .enable_reg = OMAP4430_CM_L4SEC_PKAEIP29_CLKCTRL,
2130 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2131 .clkdm_name = "l4_secure_clkdm",
2132 .parent = &l4_div_ck,
2133 .recalc = &followparent_recalc,
2134};
2135
2136static struct clk rng_ick = {
2137 .name = "rng_ick",
2138 .ops = &clkops_omap2_dflt,
2139 .enable_reg = OMAP4430_CM_L4SEC_RNG_CLKCTRL,
2140 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
2141 .clkdm_name = "l4_secure_clkdm",
2142 .parent = &l4_div_ck,
2143 .recalc = &followparent_recalc,
2144};
2145
2146static struct clk sha2md51_fck = {
2147 .name = "sha2md51_fck",
2148 .ops = &clkops_omap2_dflt,
2149 .enable_reg = OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL,
2150 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2151 .clkdm_name = "l4_secure_clkdm",
2152 .parent = &l3_div_ck,
2153 .recalc = &followparent_recalc,
2154};
2155
2156static struct clk sl2_ick = {
2157 .name = "sl2_ick",
2158 .ops = &clkops_omap2_dflt,
2159 .enable_reg = OMAP4430_CM_IVAHD_SL2_CLKCTRL,
2160 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
2161 .clkdm_name = "ivahd_clkdm",
2162 .parent = &dpll_iva_m5_ck,
2163 .recalc = &followparent_recalc,
2164};
2165
2166static struct clk slimbus1_fck = {
2167 .name = "slimbus1_fck",
2168 .ops = &clkops_omap2_dflt,
2169 .enable_reg = OMAP4430_CM1_ABE_SLIMBUS_CLKCTRL,
2170 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2171 .clkdm_name = "abe_clkdm",
2172 .parent = &ocp_abe_iclk,
2173 .recalc = &followparent_recalc,
2174};
2175
2176static struct clk slimbus2_fck = {
2177 .name = "slimbus2_fck",
2178 .ops = &clkops_omap2_dflt,
2179 .enable_reg = OMAP4430_CM_L4PER_SLIMBUS2_CLKCTRL,
2180 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2181 .clkdm_name = "l4_per_clkdm",
2182 .parent = &l4_div_ck,
2183 .recalc = &followparent_recalc,
2184};
2185
2186static struct clk sr_core_fck = {
2187 .name = "sr_core_fck",
2188 .ops = &clkops_omap2_dflt,
2189 .enable_reg = OMAP4430_CM_ALWON_SR_CORE_CLKCTRL,
2190 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2191 .clkdm_name = "l4_ao_clkdm",
2192 .parent = &l4_wkup_clk_mux_ck,
2193 .recalc = &followparent_recalc,
2194};
2195
2196static struct clk sr_iva_fck = {
2197 .name = "sr_iva_fck",
2198 .ops = &clkops_omap2_dflt,
2199 .enable_reg = OMAP4430_CM_ALWON_SR_IVA_CLKCTRL,
2200 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2201 .clkdm_name = "l4_ao_clkdm",
2202 .parent = &l4_wkup_clk_mux_ck,
2203 .recalc = &followparent_recalc,
2204};
2205
2206static struct clk sr_mpu_fck = {
2207 .name = "sr_mpu_fck",
2208 .ops = &clkops_omap2_dflt,
2209 .enable_reg = OMAP4430_CM_ALWON_SR_MPU_CLKCTRL,
2210 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2211 .clkdm_name = "l4_ao_clkdm",
2212 .parent = &l4_wkup_clk_mux_ck,
2213 .recalc = &followparent_recalc,
2214};
2215
2216static struct clk tesla_ick = {
2217 .name = "tesla_ick",
2218 .ops = &clkops_omap2_dflt,
2219 .enable_reg = OMAP4430_CM_TESLA_TESLA_CLKCTRL,
2220 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
2221 .clkdm_name = "tesla_clkdm",
2222 .parent = &dpll_iva_m4_ck,
2223 .recalc = &followparent_recalc,
2224};
2225
2226static struct clk uart1_fck = {
2227 .name = "uart1_fck",
2228 .ops = &clkops_omap2_dflt,
2229 .enable_reg = OMAP4430_CM_L4PER_UART1_CLKCTRL,
2230 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2231 .clkdm_name = "l4_per_clkdm",
2232 .parent = &func_48m_fclk,
2233 .recalc = &followparent_recalc,
2234};
2235
2236static struct clk uart2_fck = {
2237 .name = "uart2_fck",
2238 .ops = &clkops_omap2_dflt,
2239 .enable_reg = OMAP4430_CM_L4PER_UART2_CLKCTRL,
2240 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2241 .clkdm_name = "l4_per_clkdm",
2242 .parent = &func_48m_fclk,
2243 .recalc = &followparent_recalc,
2244};
2245
2246static struct clk uart3_fck = {
2247 .name = "uart3_fck",
2248 .ops = &clkops_omap2_dflt,
2249 .enable_reg = OMAP4430_CM_L4PER_UART3_CLKCTRL,
2250 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2251 .clkdm_name = "l4_per_clkdm",
2252 .parent = &func_48m_fclk,
2253 .recalc = &followparent_recalc,
2254};
2255
2256static struct clk uart4_fck = {
2257 .name = "uart4_fck",
2258 .ops = &clkops_omap2_dflt,
2259 .enable_reg = OMAP4430_CM_L4PER_UART4_CLKCTRL,
2260 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2261 .clkdm_name = "l4_per_clkdm",
2262 .parent = &func_48m_fclk,
2263 .recalc = &followparent_recalc,
2264};
2265
2266static struct clk unipro1_fck = {
2267 .name = "unipro1_fck",
2268 .ops = &clkops_omap2_dflt,
2269 .enable_reg = OMAP4430_CM_L3INIT_UNIPRO1_CLKCTRL,
2270 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2271 .clkdm_name = "l3_init_clkdm",
2272 .parent = &func_96m_fclk,
2273 .recalc = &followparent_recalc,
2274};
2275
2276static struct clk usb_host_fck = {
2277 .name = "usb_host_fck",
2278 .ops = &clkops_omap2_dflt,
2279 .enable_reg = OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
2280 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2281 .clkdm_name = "l3_init_clkdm",
2282 .parent = &init_60m_fclk,
2283 .recalc = &followparent_recalc,
2284};
2285
2286static struct clk usb_host_fs_fck = {
2287 .name = "usb_host_fs_fck",
2288 .ops = &clkops_omap2_dflt,
2289 .enable_reg = OMAP4430_CM_L3INIT_USB_HOST_FS_CLKCTRL,
2290 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2291 .clkdm_name = "l3_init_clkdm",
2292 .parent = &func_48mc_fclk,
2293 .recalc = &followparent_recalc,
2294};
2295
2296static struct clk usb_otg_ick = {
2297 .name = "usb_otg_ick",
2298 .ops = &clkops_omap2_dflt,
2299 .enable_reg = OMAP4430_CM_L3INIT_USB_OTG_CLKCTRL,
2300 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
2301 .clkdm_name = "l3_init_clkdm",
2302 .parent = &l3_div_ck,
2303 .recalc = &followparent_recalc,
2304};
2305
2306static struct clk usb_tll_ick = {
2307 .name = "usb_tll_ick",
2308 .ops = &clkops_omap2_dflt,
2309 .enable_reg = OMAP4430_CM_L3INIT_USB_TLL_CLKCTRL,
2310 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
2311 .clkdm_name = "l3_init_clkdm",
2312 .parent = &l4_div_ck,
2313 .recalc = &followparent_recalc,
2314};
2315
2316static struct clk usbphyocp2scp_ick = {
2317 .name = "usbphyocp2scp_ick",
2318 .ops = &clkops_omap2_dflt,
2319 .enable_reg = OMAP4430_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL,
2320 .enable_bit = OMAP4430_MODULEMODE_HWCTRL,
2321 .clkdm_name = "l3_init_clkdm",
2322 .parent = &l4_div_ck,
2323 .recalc = &followparent_recalc,
2324};
2325
2326static struct clk usim_fck = {
2327 .name = "usim_fck",
2328 .ops = &clkops_omap2_dflt,
2329 .enable_reg = OMAP4430_CM_WKUP_USIM_CLKCTRL,
2330 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2331 .clkdm_name = "l4_wkup_clkdm",
2332 .parent = &sys_32k_ck,
2333 .recalc = &followparent_recalc,
2334};
2335
2336static struct clk wdt2_fck = {
2337 .name = "wdt2_fck",
2338 .ops = &clkops_omap2_dflt,
2339 .enable_reg = OMAP4430_CM_WKUP_WDT2_CLKCTRL,
2340 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2341 .clkdm_name = "l4_wkup_clkdm",
2342 .parent = &sys_32k_ck,
2343 .recalc = &followparent_recalc,
2344};
2345
2346static struct clk wdt3_fck = {
2347 .name = "wdt3_fck",
2348 .ops = &clkops_omap2_dflt,
2349 .enable_reg = OMAP4430_CM1_ABE_WDT3_CLKCTRL,
2350 .enable_bit = OMAP4430_MODULEMODE_SWCTRL,
2351 .clkdm_name = "abe_clkdm",
2352 .parent = &sys_32k_ck,
2353 .recalc = &followparent_recalc,
2354};
2355
2356/* Remaining optional clocks */
2357static const struct clksel otg_60m_gfclk_sel[] = {
2358 { .parent = &utmi_phy_clkout_ck, .rates = div_1_0_rates },
2359 { .parent = &xclk60motg_ck, .rates = div_1_1_rates },
2360 { .parent = NULL },
2361};
2362
2363static struct clk otg_60m_gfclk_ck = {
2364 .name = "otg_60m_gfclk_ck",
2365 .parent = &utmi_phy_clkout_ck,
2366 .clksel = otg_60m_gfclk_sel,
2367 .init = &omap2_init_clksel_parent,
2368 .clksel_reg = OMAP4430_CM_L3INIT_USB_OTG_CLKCTRL,
2369 .clksel_mask = OMAP4430_CLKSEL_60M_MASK,
2370 .ops = &clkops_null,
2371 .recalc = &omap2_clksel_recalc,
2372};
2373
2374static const struct clksel stm_clk_div_div[] = {
2375 { .parent = &pmd_stm_clock_mux_ck, .rates = div3_1to4_rates },
2376 { .parent = NULL },
2377};
2378
2379static struct clk stm_clk_div_ck = {
2380 .name = "stm_clk_div_ck",
2381 .parent = &pmd_stm_clock_mux_ck,
2382 .clksel = stm_clk_div_div,
2383 .clksel_reg = OMAP4430_CM_EMU_DEBUGSS_CLKCTRL,
2384 .clksel_mask = OMAP4430_CLKSEL_PMD_STM_CLK_MASK,
2385 .ops = &clkops_null,
2386 .recalc = &omap2_clksel_recalc,
2387 .round_rate = &omap2_clksel_round_rate,
2388 .set_rate = &omap2_clksel_set_rate,
2389};
2390
2391static const struct clksel trace_clk_div_div[] = {
2392 { .parent = &pmd_trace_clk_mux_ck, .rates = div3_1to4_rates },
2393 { .parent = NULL },
2394};
2395
2396static struct clk trace_clk_div_ck = {
2397 .name = "trace_clk_div_ck",
2398 .parent = &pmd_trace_clk_mux_ck,
2399 .clksel = trace_clk_div_div,
2400 .clksel_reg = OMAP4430_CM_EMU_DEBUGSS_CLKCTRL,
2401 .clksel_mask = OMAP4430_CLKSEL_PMD_TRACE_CLK_MASK,
2402 .ops = &clkops_null,
2403 .recalc = &omap2_clksel_recalc,
2404 .round_rate = &omap2_clksel_round_rate,
2405 .set_rate = &omap2_clksel_set_rate,
2406};
2407
2408static const struct clksel_rate div2_14to18_rates[] = {
2409 { .div = 14, .val = 0, .flags = RATE_IN_4430 },
2410 { .div = 18, .val = 1, .flags = RATE_IN_4430 },
2411 { .div = 0 },
2412};
2413
2414static const struct clksel usim_fclk_div[] = {
2415 { .parent = &dpll_per_m4_ck, .rates = div2_14to18_rates },
2416 { .parent = NULL },
2417};
2418
2419static struct clk usim_fclk = {
2420 .name = "usim_fclk",
2421 .parent = &dpll_per_m4_ck,
2422 .clksel = usim_fclk_div,
2423 .clksel_reg = OMAP4430_CM_WKUP_USIM_CLKCTRL,
2424 .clksel_mask = OMAP4430_CLKSEL_DIV_MASK,
2425 .ops = &clkops_null,
2426 .recalc = &omap2_clksel_recalc,
2427 .round_rate = &omap2_clksel_round_rate,
2428 .set_rate = &omap2_clksel_set_rate,
2429};
2430
2431static const struct clksel utmi_p1_gfclk_sel[] = {
2432 { .parent = &init_60m_fclk, .rates = div_1_0_rates },
2433 { .parent = &xclk60mhsp1_ck, .rates = div_1_1_rates },
2434 { .parent = NULL },
2435};
2436
2437static struct clk utmi_p1_gfclk_ck = {
2438 .name = "utmi_p1_gfclk_ck",
2439 .parent = &init_60m_fclk,
2440 .clksel = utmi_p1_gfclk_sel,
2441 .init = &omap2_init_clksel_parent,
2442 .clksel_reg = OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
2443 .clksel_mask = OMAP4430_CLKSEL_UTMI_P1_MASK,
2444 .ops = &clkops_null,
2445 .recalc = &omap2_clksel_recalc,
2446};
2447
2448static const struct clksel utmi_p2_gfclk_sel[] = {
2449 { .parent = &init_60m_fclk, .rates = div_1_0_rates },
2450 { .parent = &xclk60mhsp2_ck, .rates = div_1_1_rates },
2451 { .parent = NULL },
2452};
2453
2454static struct clk utmi_p2_gfclk_ck = {
2455 .name = "utmi_p2_gfclk_ck",
2456 .parent = &init_60m_fclk,
2457 .clksel = utmi_p2_gfclk_sel,
2458 .init = &omap2_init_clksel_parent,
2459 .clksel_reg = OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL,
2460 .clksel_mask = OMAP4430_CLKSEL_UTMI_P2_MASK,
2461 .ops = &clkops_null,
2462 .recalc = &omap2_clksel_recalc,
2463};
2464
2465/*
2466 * clkdev
2467 */
2468
2469static struct omap_clk omap44xx_clks[] = {
2470 CLK(NULL, "extalt_clkin_ck", &extalt_clkin_ck, CK_443X),
2471 CLK(NULL, "pad_clks_ck", &pad_clks_ck, CK_443X),
2472 CLK(NULL, "pad_slimbus_core_clks_ck", &pad_slimbus_core_clks_ck, CK_443X),
2473 CLK(NULL, "secure_32k_clk_src_ck", &secure_32k_clk_src_ck, CK_443X),
2474 CLK(NULL, "slimbus_clk", &slimbus_clk, CK_443X),
2475 CLK(NULL, "sys_32k_ck", &sys_32k_ck, CK_443X),
2476 CLK(NULL, "virt_12000000_ck", &virt_12000000_ck, CK_443X),
2477 CLK(NULL, "virt_13000000_ck", &virt_13000000_ck, CK_443X),
2478 CLK(NULL, "virt_16800000_ck", &virt_16800000_ck, CK_443X),
2479 CLK(NULL, "virt_19200000_ck", &virt_19200000_ck, CK_443X),
2480 CLK(NULL, "virt_26000000_ck", &virt_26000000_ck, CK_443X),
2481 CLK(NULL, "virt_27000000_ck", &virt_27000000_ck, CK_443X),
2482 CLK(NULL, "virt_38400000_ck", &virt_38400000_ck, CK_443X),
2483 CLK(NULL, "sys_clkin_ck", &sys_clkin_ck, CK_443X),
2484 CLK(NULL, "utmi_phy_clkout_ck", &utmi_phy_clkout_ck, CK_443X),
2485 CLK(NULL, "xclk60mhsp1_ck", &xclk60mhsp1_ck, CK_443X),
2486 CLK(NULL, "xclk60mhsp2_ck", &xclk60mhsp2_ck, CK_443X),
2487 CLK(NULL, "xclk60motg_ck", &xclk60motg_ck, CK_443X),
2488 CLK(NULL, "dpll_sys_ref_clk", &dpll_sys_ref_clk, CK_443X),
2489 CLK(NULL, "abe_dpll_refclk_mux_ck", &abe_dpll_refclk_mux_ck, CK_443X),
2490 CLK(NULL, "dpll_abe_ck", &dpll_abe_ck, CK_443X),
2491 CLK(NULL, "dpll_abe_m2x2_ck", &dpll_abe_m2x2_ck, CK_443X),
2492 CLK(NULL, "abe_24m_fclk", &abe_24m_fclk, CK_443X),
2493 CLK(NULL, "abe_clk", &abe_clk, CK_443X),
2494 CLK(NULL, "aess_fclk", &aess_fclk, CK_443X),
2495 CLK(NULL, "dpll_abe_m3_ck", &dpll_abe_m3_ck, CK_443X),
2496 CLK(NULL, "core_hsd_byp_clk_mux_ck", &core_hsd_byp_clk_mux_ck, CK_443X),
2497 CLK(NULL, "dpll_core_ck", &dpll_core_ck, CK_443X),
2498 CLK(NULL, "dpll_core_m6_ck", &dpll_core_m6_ck, CK_443X),
2499 CLK(NULL, "dbgclk_mux_ck", &dbgclk_mux_ck, CK_443X),
2500 CLK(NULL, "dpll_core_m2_ck", &dpll_core_m2_ck, CK_443X),
2501 CLK(NULL, "ddrphy_ck", &ddrphy_ck, CK_443X),
2502 CLK(NULL, "dpll_core_m5_ck", &dpll_core_m5_ck, CK_443X),
2503 CLK(NULL, "div_core_ck", &div_core_ck, CK_443X),
2504 CLK(NULL, "div_iva_hs_clk", &div_iva_hs_clk, CK_443X),
2505 CLK(NULL, "div_mpu_hs_clk", &div_mpu_hs_clk, CK_443X),
2506 CLK(NULL, "dpll_core_m4_ck", &dpll_core_m4_ck, CK_443X),
2507 CLK(NULL, "dll_clk_div_ck", &dll_clk_div_ck, CK_443X),
2508 CLK(NULL, "dpll_abe_m2_ck", &dpll_abe_m2_ck, CK_443X),
2509 CLK(NULL, "dpll_core_m3_ck", &dpll_core_m3_ck, CK_443X),
2510 CLK(NULL, "dpll_core_m7_ck", &dpll_core_m7_ck, CK_443X),
2511 CLK(NULL, "iva_hsd_byp_clk_mux_ck", &iva_hsd_byp_clk_mux_ck, CK_443X),
2512 CLK(NULL, "dpll_iva_ck", &dpll_iva_ck, CK_443X),
2513 CLK(NULL, "dpll_iva_m4_ck", &dpll_iva_m4_ck, CK_443X),
2514 CLK(NULL, "dpll_iva_m5_ck", &dpll_iva_m5_ck, CK_443X),
2515 CLK(NULL, "dpll_mpu_ck", &dpll_mpu_ck, CK_443X),
2516 CLK(NULL, "dpll_mpu_m2_ck", &dpll_mpu_m2_ck, CK_443X),
2517 CLK(NULL, "per_hs_clk_div_ck", &per_hs_clk_div_ck, CK_443X),
2518 CLK(NULL, "per_hsd_byp_clk_mux_ck", &per_hsd_byp_clk_mux_ck, CK_443X),
2519 CLK(NULL, "dpll_per_ck", &dpll_per_ck, CK_443X),
2520 CLK(NULL, "dpll_per_m2_ck", &dpll_per_m2_ck, CK_443X),
2521 CLK(NULL, "dpll_per_m2x2_ck", &dpll_per_m2x2_ck, CK_443X),
2522 CLK(NULL, "dpll_per_m3_ck", &dpll_per_m3_ck, CK_443X),
2523 CLK(NULL, "dpll_per_m4_ck", &dpll_per_m4_ck, CK_443X),
2524 CLK(NULL, "dpll_per_m5_ck", &dpll_per_m5_ck, CK_443X),
2525 CLK(NULL, "dpll_per_m6_ck", &dpll_per_m6_ck, CK_443X),
2526 CLK(NULL, "dpll_per_m7_ck", &dpll_per_m7_ck, CK_443X),
2527 CLK(NULL, "dpll_unipro_ck", &dpll_unipro_ck, CK_443X),
2528 CLK(NULL, "dpll_unipro_m2x2_ck", &dpll_unipro_m2x2_ck, CK_443X),
2529 CLK(NULL, "usb_hs_clk_div_ck", &usb_hs_clk_div_ck, CK_443X),
2530 CLK(NULL, "dpll_usb_ck", &dpll_usb_ck, CK_443X),
2531 CLK(NULL, "dpll_usb_clkdcoldo_ck", &dpll_usb_clkdcoldo_ck, CK_443X),
2532 CLK(NULL, "dpll_usb_m2_ck", &dpll_usb_m2_ck, CK_443X),
2533 CLK(NULL, "ducati_clk_mux_ck", &ducati_clk_mux_ck, CK_443X),
2534 CLK(NULL, "func_12m_fclk", &func_12m_fclk, CK_443X),
2535 CLK(NULL, "func_24m_clk", &func_24m_clk, CK_443X),
2536 CLK(NULL, "func_24mc_fclk", &func_24mc_fclk, CK_443X),
2537 CLK(NULL, "func_48m_fclk", &func_48m_fclk, CK_443X),
2538 CLK(NULL, "func_48mc_fclk", &func_48mc_fclk, CK_443X),
2539 CLK(NULL, "func_64m_fclk", &func_64m_fclk, CK_443X),
2540 CLK(NULL, "func_96m_fclk", &func_96m_fclk, CK_443X),
2541 CLK(NULL, "hsmmc6_fclk", &hsmmc6_fclk, CK_443X),
2542 CLK(NULL, "init_60m_fclk", &init_60m_fclk, CK_443X),
2543 CLK(NULL, "l3_div_ck", &l3_div_ck, CK_443X),
2544 CLK(NULL, "l4_div_ck", &l4_div_ck, CK_443X),
2545 CLK(NULL, "lp_clk_div_ck", &lp_clk_div_ck, CK_443X),
2546 CLK(NULL, "l4_wkup_clk_mux_ck", &l4_wkup_clk_mux_ck, CK_443X),
2547 CLK(NULL, "per_abe_nc_fclk", &per_abe_nc_fclk, CK_443X),
2548 CLK(NULL, "mcasp2_fclk", &mcasp2_fclk, CK_443X),
2549 CLK(NULL, "mcasp3_fclk", &mcasp3_fclk, CK_443X),
2550 CLK(NULL, "ocp_abe_iclk", &ocp_abe_iclk, CK_443X),
2551 CLK(NULL, "per_abe_24m_fclk", &per_abe_24m_fclk, CK_443X),
2552 CLK(NULL, "pmd_stm_clock_mux_ck", &pmd_stm_clock_mux_ck, CK_443X),
2553 CLK(NULL, "pmd_trace_clk_mux_ck", &pmd_trace_clk_mux_ck, CK_443X),
2554 CLK(NULL, "syc_clk_div_ck", &syc_clk_div_ck, CK_443X),
2555 CLK(NULL, "aes1_fck", &aes1_fck, CK_443X),
2556 CLK(NULL, "aes2_fck", &aes2_fck, CK_443X),
2557 CLK(NULL, "aess_fck", &aess_fck, CK_443X),
2558 CLK(NULL, "cust_efuse_fck", &cust_efuse_fck, CK_443X),
2559 CLK(NULL, "des3des_fck", &des3des_fck, CK_443X),
2560 CLK(NULL, "dmic_sync_mux_ck", &dmic_sync_mux_ck, CK_443X),
2561 CLK(NULL, "dmic_fck", &dmic_fck, CK_443X),
2562 CLK(NULL, "dss_fck", &dss_fck, CK_443X),
2563 CLK(NULL, "ducati_ick", &ducati_ick, CK_443X),
2564 CLK(NULL, "emif1_ick", &emif1_ick, CK_443X),
2565 CLK(NULL, "emif2_ick", &emif2_ick, CK_443X),
2566 CLK(NULL, "fdif_fck", &fdif_fck, CK_443X),
2567 CLK(NULL, "per_sgx_fclk", &per_sgx_fclk, CK_443X),
2568 CLK(NULL, "gfx_fck", &gfx_fck, CK_443X),
2569 CLK(NULL, "gpio1_ick", &gpio1_ick, CK_443X),
2570 CLK(NULL, "gpio2_ick", &gpio2_ick, CK_443X),
2571 CLK(NULL, "gpio3_ick", &gpio3_ick, CK_443X),
2572 CLK(NULL, "gpio4_ick", &gpio4_ick, CK_443X),
2573 CLK(NULL, "gpio5_ick", &gpio5_ick, CK_443X),
2574 CLK(NULL, "gpio6_ick", &gpio6_ick, CK_443X),
2575 CLK(NULL, "gpmc_ick", &gpmc_ick, CK_443X),
2576 CLK(NULL, "gpt1_fck", &gpt1_fck, CK_443X),
2577 CLK(NULL, "gpt10_fck", &gpt10_fck, CK_443X),
2578 CLK(NULL, "gpt11_fck", &gpt11_fck, CK_443X),
2579 CLK(NULL, "gpt2_fck", &gpt2_fck, CK_443X),
2580 CLK(NULL, "gpt3_fck", &gpt3_fck, CK_443X),
2581 CLK(NULL, "gpt4_fck", &gpt4_fck, CK_443X),
2582 CLK(NULL, "gpt5_fck", &gpt5_fck, CK_443X),
2583 CLK(NULL, "gpt6_fck", &gpt6_fck, CK_443X),
2584 CLK(NULL, "gpt7_fck", &gpt7_fck, CK_443X),
2585 CLK(NULL, "gpt8_fck", &gpt8_fck, CK_443X),
2586 CLK(NULL, "gpt9_fck", &gpt9_fck, CK_443X),
2587 CLK("omap2_hdq.0", "fck", &hdq1w_fck, CK_443X),
2588 CLK(NULL, "hsi_ick", &hsi_ick, CK_443X),
2589 CLK("i2c_omap.1", "fck", &i2c1_fck, CK_443X),
2590 CLK("i2c_omap.2", "fck", &i2c2_fck, CK_443X),
2591 CLK("i2c_omap.3", "fck", &i2c3_fck, CK_443X),
2592 CLK("i2c_omap.4", "fck", &i2c4_fck, CK_443X),
2593 CLK(NULL, "iss_fck", &iss_fck, CK_443X),
2594 CLK(NULL, "ivahd_ick", &ivahd_ick, CK_443X),
2595 CLK(NULL, "keyboard_fck", &keyboard_fck, CK_443X),
2596 CLK(NULL, "l3_instr_interconnect_ick", &l3_instr_interconnect_ick, CK_443X),
2597 CLK(NULL, "l3_interconnect_3_ick", &l3_interconnect_3_ick, CK_443X),
2598 CLK(NULL, "mcasp_sync_mux_ck", &mcasp_sync_mux_ck, CK_443X),
2599 CLK(NULL, "mcasp_fck", &mcasp_fck, CK_443X),
2600 CLK(NULL, "mcbsp1_sync_mux_ck", &mcbsp1_sync_mux_ck, CK_443X),
2601 CLK("omap-mcbsp.1", "fck", &mcbsp1_fck, CK_443X),
2602 CLK(NULL, "mcbsp2_sync_mux_ck", &mcbsp2_sync_mux_ck, CK_443X),
2603 CLK("omap-mcbsp.2", "fck", &mcbsp2_fck, CK_443X),
2604 CLK(NULL, "mcbsp3_sync_mux_ck", &mcbsp3_sync_mux_ck, CK_443X),
2605 CLK("omap-mcbsp.3", "fck", &mcbsp3_fck, CK_443X),
2606 CLK(NULL, "mcbsp4_sync_mux_ck", &mcbsp4_sync_mux_ck, CK_443X),
2607 CLK("omap-mcbsp.4", "fck", &mcbsp4_fck, CK_443X),
2608 CLK("omap2_mcspi.1", "fck", &mcspi1_fck, CK_443X),
2609 CLK("omap2_mcspi.2", "fck", &mcspi2_fck, CK_443X),
2610 CLK("omap2_mcspi.3", "fck", &mcspi3_fck, CK_443X),
2611 CLK("omap2_mcspi.4", "fck", &mcspi4_fck, CK_443X),
2612 CLK("mmci-omap-hs.0", "fck", &mmc1_fck, CK_443X),
2613 CLK("mmci-omap-hs.1", "fck", &mmc2_fck, CK_443X),
2614 CLK("mmci-omap-hs.2", "fck", &mmc3_fck, CK_443X),
2615 CLK("mmci-omap-hs.3", "fck", &mmc4_fck, CK_443X),
2616 CLK("mmci-omap-hs.4", "fck", &mmc5_fck, CK_443X),
2617 CLK(NULL, "ocp_wp1_ick", &ocp_wp1_ick, CK_443X),
2618 CLK(NULL, "pdm_fck", &pdm_fck, CK_443X),
2619 CLK(NULL, "pkaeip29_fck", &pkaeip29_fck, CK_443X),
2620 CLK("omap_rng", "ick", &rng_ick, CK_443X),
2621 CLK(NULL, "sha2md51_fck", &sha2md51_fck, CK_443X),
2622 CLK(NULL, "sl2_ick", &sl2_ick, CK_443X),
2623 CLK(NULL, "slimbus1_fck", &slimbus1_fck, CK_443X),
2624 CLK(NULL, "slimbus2_fck", &slimbus2_fck, CK_443X),
2625 CLK(NULL, "sr_core_fck", &sr_core_fck, CK_443X),
2626 CLK(NULL, "sr_iva_fck", &sr_iva_fck, CK_443X),
2627 CLK(NULL, "sr_mpu_fck", &sr_mpu_fck, CK_443X),
2628 CLK(NULL, "tesla_ick", &tesla_ick, CK_443X),
2629 CLK(NULL, "uart1_fck", &uart1_fck, CK_443X),
2630 CLK(NULL, "uart2_fck", &uart2_fck, CK_443X),
2631 CLK(NULL, "uart3_fck", &uart3_fck, CK_443X),
2632 CLK(NULL, "uart4_fck", &uart4_fck, CK_443X),
2633 CLK(NULL, "unipro1_fck", &unipro1_fck, CK_443X),
2634 CLK(NULL, "usb_host_fck", &usb_host_fck, CK_443X),
2635 CLK(NULL, "usb_host_fs_fck", &usb_host_fs_fck, CK_443X),
2636 CLK("musb_hdrc", "ick", &usb_otg_ick, CK_443X),
2637 CLK(NULL, "usb_tll_ick", &usb_tll_ick, CK_443X),
2638 CLK(NULL, "usbphyocp2scp_ick", &usbphyocp2scp_ick, CK_443X),
2639 CLK(NULL, "usim_fck", &usim_fck, CK_443X),
2640 CLK("omap_wdt", "fck", &wdt2_fck, CK_443X),
2641 CLK(NULL, "wdt3_fck", &wdt3_fck, CK_443X),
2642 CLK(NULL, "otg_60m_gfclk_ck", &otg_60m_gfclk_ck, CK_443X),
2643 CLK(NULL, "stm_clk_div_ck", &stm_clk_div_ck, CK_443X),
2644 CLK(NULL, "trace_clk_div_ck", &trace_clk_div_ck, CK_443X),
2645 CLK(NULL, "usim_fclk", &usim_fclk, CK_443X),
2646 CLK(NULL, "utmi_p1_gfclk_ck", &utmi_p1_gfclk_ck, CK_443X),
2647 CLK(NULL, "utmi_p2_gfclk_ck", &utmi_p2_gfclk_ck, CK_443X),
2648 CLK(NULL, "gpio1_dbck", &dummy_ck, CK_443X),
2649 CLK(NULL, "gpio2_dbck", &dummy_ck, CK_443X),
2650 CLK(NULL, "gpio3_dbck", &dummy_ck, CK_443X),
2651 CLK(NULL, "gpio4_dbck", &dummy_ck, CK_443X),
2652 CLK(NULL, "gpio5_dbck", &dummy_ck, CK_443X),
2653 CLK(NULL, "gpio6_dbck", &dummy_ck, CK_443X),
2654 CLK(NULL, "gpmc_ck", &dummy_ck, CK_443X),
2655 CLK(NULL, "gpt1_ick", &dummy_ck, CK_443X),
2656 CLK(NULL, "gpt2_ick", &dummy_ck, CK_443X),
2657 CLK(NULL, "gpt3_ick", &dummy_ck, CK_443X),
2658 CLK(NULL, "gpt4_ick", &dummy_ck, CK_443X),
2659 CLK(NULL, "gpt5_ick", &dummy_ck, CK_443X),
2660 CLK(NULL, "gpt6_ick", &dummy_ck, CK_443X),
2661 CLK(NULL, "gpt7_ick", &dummy_ck, CK_443X),
2662 CLK(NULL, "gpt8_ick", &dummy_ck, CK_443X),
2663 CLK(NULL, "gpt9_ick", &dummy_ck, CK_443X),
2664 CLK(NULL, "gpt10_ick", &dummy_ck, CK_443X),
2665 CLK(NULL, "gpt11_ick", &dummy_ck, CK_443X),
2666 CLK("i2c_omap.1", "ick", &dummy_ck, CK_443X),
2667 CLK("i2c_omap.2", "ick", &dummy_ck, CK_443X),
2668 CLK("i2c_omap.3", "ick", &dummy_ck, CK_443X),
2669 CLK("i2c_omap.4", "ick", &dummy_ck, CK_443X),
2670 CLK("omap-mcbsp.1", "ick", &dummy_ck, CK_443X),
2671 CLK("omap-mcbsp.2", "ick", &dummy_ck, CK_443X),
2672 CLK("omap-mcbsp.3", "ick", &dummy_ck, CK_443X),
2673 CLK("omap-mcbsp.4", "ick", &dummy_ck, CK_443X),
2674 CLK("omap2_mcspi.1", "ick", &dummy_ck, CK_443X),
2675 CLK("omap2_mcspi.2", "ick", &dummy_ck, CK_443X),
2676 CLK("omap2_mcspi.3", "ick", &dummy_ck, CK_443X),
2677 CLK("omap2_mcspi.4", "ick", &dummy_ck, CK_443X),
2678 CLK(NULL, "uart1_ick", &dummy_ck, CK_443X),
2679 CLK(NULL, "uart2_ick", &dummy_ck, CK_443X),
2680 CLK(NULL, "uart3_ick", &dummy_ck, CK_443X),
2681 CLK(NULL, "uart4_ick", &dummy_ck, CK_443X),
2682 CLK("omap_wdt", "ick", &dummy_ck, CK_443X),
2683};
2684
2685int __init omap4xxx_clk_init(void)
2686{
2687 struct omap_clk *c;
2688 u32 cpu_clkflg;
2689
2690 if (cpu_is_omap44xx()) {
2691 cpu_mask = RATE_IN_4430;
2692 cpu_clkflg = CK_443X;
2693 }
2694
2695 clk_init(&omap2_clk_functions);
2696
2697 for (c = omap44xx_clks; c < omap44xx_clks + ARRAY_SIZE(omap44xx_clks);
2698 c++)
2699 clk_preinit(c->lk.clk);
2700
2701 for (c = omap44xx_clks; c < omap44xx_clks + ARRAY_SIZE(omap44xx_clks);
2702 c++)
2703 if (c->cpu & cpu_clkflg) {
2704 clkdev_add(&c->lk);
2705 clk_register(c->lk.clk);
2706 omap2_init_clk_clkdm(c->lk.clk);
2707 }
2708
2709 recalculate_root_clocks();
2710
2711 /*
2712 * Only enable those clocks we will need, let the drivers
2713 * enable other clocks as necessary
2714 */
2715 clk_enable_init_clocks();
2716
2717 return 0;
2718}
diff --git a/arch/arm/mach-omap2/clock_common_data.c b/arch/arm/mach-omap2/clock_common_data.c
new file mode 100644
index 000000000000..f69096b88cdb
--- /dev/null
+++ b/arch/arm/mach-omap2/clock_common_data.c
@@ -0,0 +1,39 @@
1/*
2 * linux/arch/arm/mach-omap2/clock_common_data.c
3 *
4 * Copyright (C) 2005-2009 Texas Instruments, Inc.
5 * Copyright (C) 2004-2009 Nokia Corporation
6 *
7 * Contacts:
8 * Richard Woodruff <r-woodruff2@ti.com>
9 * Paul Walmsley
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
14 *
15 * This file contains clock data that is common to both the OMAP2xxx and
16 * OMAP3xxx clock definition files.
17 */
18
19#include "clock.h"
20
21/* clksel_rate data common to 24xx/343x */
22const struct clksel_rate gpt_32k_rates[] = {
23 { .div = 1, .val = 0, .flags = RATE_IN_24XX | RATE_IN_343X | DEFAULT_RATE },
24 { .div = 0 }
25};
26
27const struct clksel_rate gpt_sys_rates[] = {
28 { .div = 1, .val = 1, .flags = RATE_IN_24XX | RATE_IN_343X | DEFAULT_RATE },
29 { .div = 0 }
30};
31
32const struct clksel_rate gfx_l3_rates[] = {
33 { .div = 1, .val = 1, .flags = RATE_IN_24XX | RATE_IN_343X },
34 { .div = 2, .val = 2, .flags = RATE_IN_24XX | RATE_IN_343X | DEFAULT_RATE },
35 { .div = 3, .val = 3, .flags = RATE_IN_243X | RATE_IN_343X },
36 { .div = 4, .val = 4, .flags = RATE_IN_243X | RATE_IN_343X },
37 { .div = 0 }
38};
39
diff --git a/arch/arm/mach-omap2/clockdomain.c b/arch/arm/mach-omap2/clockdomain.c
index 58aff8485df9..6e568ec995ee 100644
--- a/arch/arm/mach-omap2/clockdomain.c
+++ b/arch/arm/mach-omap2/clockdomain.c
@@ -1,18 +1,17 @@
1/* 1/*
2 * OMAP2/3 clockdomain framework functions 2 * OMAP2/3/4 clockdomain framework functions
3 * 3 *
4 * Copyright (C) 2008 Texas Instruments, Inc. 4 * Copyright (C) 2008-2010 Texas Instruments, Inc.
5 * Copyright (C) 2008 Nokia Corporation 5 * Copyright (C) 2008-2010 Nokia Corporation
6 * 6 *
7 * Written by Paul Walmsley and Jouni Högander 7 * Written by Paul Walmsley and Jouni Högander
8 * Added OMAP4 specific support by Abhijit Pagare <abhijitpagare@ti.com>
8 * 9 *
9 * This program is free software; you can redistribute it and/or modify 10 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as 11 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation. 12 * published by the Free Software Foundation.
12 */ 13 */
13#ifdef CONFIG_OMAP_DEBUG_CLOCKDOMAIN 14#undef DEBUG
14# define DEBUG
15#endif
16 15
17#include <linux/module.h> 16#include <linux/module.h>
18#include <linux/kernel.h> 17#include <linux/kernel.h>
@@ -28,43 +27,124 @@
28 27
29#include <linux/bitops.h> 28#include <linux/bitops.h>
30 29
31#include <mach/clock.h>
32
33#include "prm.h" 30#include "prm.h"
34#include "prm-regbits-24xx.h" 31#include "prm-regbits-24xx.h"
35#include "cm.h" 32#include "cm.h"
36 33
37#include <mach/powerdomain.h> 34#include <plat/clock.h>
38#include <mach/clockdomain.h> 35#include <plat/powerdomain.h>
36#include <plat/clockdomain.h>
37#include <plat/prcm.h>
39 38
40/* clkdm_list contains all registered struct clockdomains */ 39/* clkdm_list contains all registered struct clockdomains */
41static LIST_HEAD(clkdm_list); 40static LIST_HEAD(clkdm_list);
42 41
43/* clkdm_mutex protects clkdm_list add and del ops */ 42/* array of clockdomain deps to be added/removed when clkdm in hwsup mode */
44static DEFINE_MUTEX(clkdm_mutex); 43static struct clkdm_autodep *autodeps;
45
46/* array of powerdomain deps to be added/removed when clkdm in hwsup mode */
47static struct clkdm_pwrdm_autodep *autodeps;
48 44
49 45
50/* Private functions */ 46/* Private functions */
51 47
48static struct clockdomain *_clkdm_lookup(const char *name)
49{
50 struct clockdomain *clkdm, *temp_clkdm;
51
52 if (!name)
53 return NULL;
54
55 clkdm = NULL;
56
57 list_for_each_entry(temp_clkdm, &clkdm_list, node) {
58 if (!strcmp(name, temp_clkdm->name)) {
59 clkdm = temp_clkdm;
60 break;
61 }
62 }
63
64 return clkdm;
65}
66
67/**
68 * _clkdm_register - register a clockdomain
69 * @clkdm: struct clockdomain * to register
70 *
71 * Adds a clockdomain to the internal clockdomain list.
72 * Returns -EINVAL if given a null pointer, -EEXIST if a clockdomain is
73 * already registered by the provided name, or 0 upon success.
74 */
75static int _clkdm_register(struct clockdomain *clkdm)
76{
77 struct powerdomain *pwrdm;
78
79 if (!clkdm || !clkdm->name)
80 return -EINVAL;
81
82 if (!omap_chip_is(clkdm->omap_chip))
83 return -EINVAL;
84
85 pwrdm = pwrdm_lookup(clkdm->pwrdm.name);
86 if (!pwrdm) {
87 pr_err("clockdomain: %s: powerdomain %s does not exist\n",
88 clkdm->name, clkdm->pwrdm.name);
89 return -EINVAL;
90 }
91 clkdm->pwrdm.ptr = pwrdm;
92
93 /* Verify that the clockdomain is not already registered */
94 if (_clkdm_lookup(clkdm->name))
95 return -EEXIST;
96
97 list_add(&clkdm->node, &clkdm_list);
98
99 pwrdm_add_clkdm(pwrdm, clkdm);
100
101 pr_debug("clockdomain: registered %s\n", clkdm->name);
102
103 return 0;
104}
105
106/* _clkdm_deps_lookup - look up the specified clockdomain in a clkdm list */
107static struct clkdm_dep *_clkdm_deps_lookup(struct clockdomain *clkdm,
108 struct clkdm_dep *deps)
109{
110 struct clkdm_dep *cd;
111
112 if (!clkdm || !deps || !omap_chip_is(clkdm->omap_chip))
113 return ERR_PTR(-EINVAL);
114
115 for (cd = deps; cd->clkdm_name; cd++) {
116 if (!omap_chip_is(cd->omap_chip))
117 continue;
118
119 if (!cd->clkdm && cd->clkdm_name)
120 cd->clkdm = _clkdm_lookup(cd->clkdm_name);
121
122 if (cd->clkdm == clkdm)
123 break;
124 }
125
126 if (!cd->clkdm_name)
127 return ERR_PTR(-ENOENT);
128
129 return cd;
130}
131
52/* 132/*
53 * _autodep_lookup - resolve autodep pwrdm names to pwrdm pointers; store 133 * _autodep_lookup - resolve autodep clkdm names to clkdm pointers; store
54 * @autodep: struct clkdm_pwrdm_autodep * to resolve 134 * @autodep: struct clkdm_autodep * to resolve
55 * 135 *
56 * Resolve autodep powerdomain names to powerdomain pointers via 136 * Resolve autodep clockdomain names to clockdomain pointers via
57 * pwrdm_lookup() and store the pointers in the autodep structure. An 137 * clkdm_lookup() and store the pointers in the autodep structure. An
58 * "autodep" is a powerdomain sleep/wakeup dependency that is 138 * "autodep" is a clockdomain sleep/wakeup dependency that is
59 * automatically added and removed whenever clocks in the associated 139 * automatically added and removed whenever clocks in the associated
60 * clockdomain are enabled or disabled (respectively) when the 140 * clockdomain are enabled or disabled (respectively) when the
61 * clockdomain is in hardware-supervised mode. Meant to be called 141 * clockdomain is in hardware-supervised mode. Meant to be called
62 * once at clockdomain layer initialization, since these should remain 142 * once at clockdomain layer initialization, since these should remain
63 * fixed for a particular architecture. No return value. 143 * fixed for a particular architecture. No return value.
64 */ 144 */
65static void _autodep_lookup(struct clkdm_pwrdm_autodep *autodep) 145static void _autodep_lookup(struct clkdm_autodep *autodep)
66{ 146{
67 struct powerdomain *pwrdm; 147 struct clockdomain *clkdm;
68 148
69 if (!autodep) 149 if (!autodep)
70 return; 150 return;
@@ -72,13 +152,13 @@ static void _autodep_lookup(struct clkdm_pwrdm_autodep *autodep)
72 if (!omap_chip_is(autodep->omap_chip)) 152 if (!omap_chip_is(autodep->omap_chip))
73 return; 153 return;
74 154
75 pwrdm = pwrdm_lookup(autodep->pwrdm.name); 155 clkdm = clkdm_lookup(autodep->clkdm.name);
76 if (!pwrdm) { 156 if (!clkdm) {
77 pr_err("clockdomain: autodeps: powerdomain %s does not exist\n", 157 pr_err("clockdomain: autodeps: clockdomain %s does not exist\n",
78 autodep->pwrdm.name); 158 autodep->clkdm.name);
79 pwrdm = ERR_PTR(-ENOENT); 159 clkdm = ERR_PTR(-ENOENT);
80 } 160 }
81 autodep->pwrdm.ptr = pwrdm; 161 autodep->clkdm.ptr = clkdm;
82} 162}
83 163
84/* 164/*
@@ -91,21 +171,24 @@ static void _autodep_lookup(struct clkdm_pwrdm_autodep *autodep)
91 */ 171 */
92static void _clkdm_add_autodeps(struct clockdomain *clkdm) 172static void _clkdm_add_autodeps(struct clockdomain *clkdm)
93{ 173{
94 struct clkdm_pwrdm_autodep *autodep; 174 struct clkdm_autodep *autodep;
175
176 if (!autodeps)
177 return;
95 178
96 for (autodep = autodeps; autodep->pwrdm.ptr; autodep++) { 179 for (autodep = autodeps; autodep->clkdm.ptr; autodep++) {
97 if (IS_ERR(autodep->pwrdm.ptr)) 180 if (IS_ERR(autodep->clkdm.ptr))
98 continue; 181 continue;
99 182
100 if (!omap_chip_is(autodep->omap_chip)) 183 if (!omap_chip_is(autodep->omap_chip))
101 continue; 184 continue;
102 185
103 pr_debug("clockdomain: adding %s sleepdep/wkdep for " 186 pr_debug("clockdomain: adding %s sleepdep/wkdep for "
104 "pwrdm %s\n", autodep->pwrdm.ptr->name, 187 "clkdm %s\n", autodep->clkdm.ptr->name,
105 clkdm->pwrdm.ptr->name); 188 clkdm->name);
106 189
107 pwrdm_add_sleepdep(clkdm->pwrdm.ptr, autodep->pwrdm.ptr); 190 clkdm_add_sleepdep(clkdm, autodep->clkdm.ptr);
108 pwrdm_add_wkdep(clkdm->pwrdm.ptr, autodep->pwrdm.ptr); 191 clkdm_add_wkdep(clkdm, autodep->clkdm.ptr);
109 } 192 }
110} 193}
111 194
@@ -119,21 +202,24 @@ static void _clkdm_add_autodeps(struct clockdomain *clkdm)
119 */ 202 */
120static void _clkdm_del_autodeps(struct clockdomain *clkdm) 203static void _clkdm_del_autodeps(struct clockdomain *clkdm)
121{ 204{
122 struct clkdm_pwrdm_autodep *autodep; 205 struct clkdm_autodep *autodep;
123 206
124 for (autodep = autodeps; autodep->pwrdm.ptr; autodep++) { 207 if (!autodeps)
125 if (IS_ERR(autodep->pwrdm.ptr)) 208 return;
209
210 for (autodep = autodeps; autodep->clkdm.ptr; autodep++) {
211 if (IS_ERR(autodep->clkdm.ptr))
126 continue; 212 continue;
127 213
128 if (!omap_chip_is(autodep->omap_chip)) 214 if (!omap_chip_is(autodep->omap_chip))
129 continue; 215 continue;
130 216
131 pr_debug("clockdomain: removing %s sleepdep/wkdep for " 217 pr_debug("clockdomain: removing %s sleepdep/wkdep for "
132 "pwrdm %s\n", autodep->pwrdm.ptr->name, 218 "clkdm %s\n", autodep->clkdm.ptr->name,
133 clkdm->pwrdm.ptr->name); 219 clkdm->name);
134 220
135 pwrdm_del_sleepdep(clkdm->pwrdm.ptr, autodep->pwrdm.ptr); 221 clkdm_del_sleepdep(clkdm, autodep->clkdm.ptr);
136 pwrdm_del_wkdep(clkdm->pwrdm.ptr, autodep->pwrdm.ptr); 222 clkdm_del_wkdep(clkdm, autodep->clkdm.ptr);
137 } 223 }
138} 224}
139 225
@@ -147,152 +233,167 @@ static void _clkdm_del_autodeps(struct clockdomain *clkdm)
147 */ 233 */
148static void _omap2_clkdm_set_hwsup(struct clockdomain *clkdm, int enable) 234static void _omap2_clkdm_set_hwsup(struct clockdomain *clkdm, int enable)
149{ 235{
150 u32 v; 236 u32 bits, v;
151 237
152 if (cpu_is_omap24xx()) { 238 if (cpu_is_omap24xx()) {
153 if (enable) 239 if (enable)
154 v = OMAP24XX_CLKSTCTRL_ENABLE_AUTO; 240 bits = OMAP24XX_CLKSTCTRL_ENABLE_AUTO;
155 else 241 else
156 v = OMAP24XX_CLKSTCTRL_DISABLE_AUTO; 242 bits = OMAP24XX_CLKSTCTRL_DISABLE_AUTO;
157 } else if (cpu_is_omap34xx()) { 243 } else if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
158 if (enable) 244 if (enable)
159 v = OMAP34XX_CLKSTCTRL_ENABLE_AUTO; 245 bits = OMAP34XX_CLKSTCTRL_ENABLE_AUTO;
160 else 246 else
161 v = OMAP34XX_CLKSTCTRL_DISABLE_AUTO; 247 bits = OMAP34XX_CLKSTCTRL_DISABLE_AUTO;
162 } else { 248 } else {
163 BUG(); 249 BUG();
164 } 250 }
165 251
166 cm_rmw_mod_reg_bits(clkdm->clktrctrl_mask, 252 bits = bits << __ffs(clkdm->clktrctrl_mask);
167 v << __ffs(clkdm->clktrctrl_mask),
168 clkdm->pwrdm.ptr->prcm_offs, CM_CLKSTCTRL);
169}
170 253
171static struct clockdomain *_clkdm_lookup(const char *name) 254 v = __raw_readl(clkdm->clkstctrl_reg);
172{ 255 v &= ~(clkdm->clktrctrl_mask);
173 struct clockdomain *clkdm, *temp_clkdm; 256 v |= bits;
174 257 __raw_writel(v, clkdm->clkstctrl_reg);
175 if (!name)
176 return NULL;
177
178 clkdm = NULL;
179
180 list_for_each_entry(temp_clkdm, &clkdm_list, node) {
181 if (!strcmp(name, temp_clkdm->name)) {
182 clkdm = temp_clkdm;
183 break;
184 }
185 }
186 258
187 return clkdm;
188} 259}
189 260
190
191/* Public functions */
192
193/** 261/**
194 * clkdm_init - set up the clockdomain layer 262 * _init_wkdep_usecount - initialize wkdep usecounts to match hardware
195 * @clkdms: optional pointer to an array of clockdomains to register 263 * @clkdm: clockdomain to initialize wkdep usecounts
196 * @init_autodeps: optional pointer to an array of autodeps to register
197 * 264 *
198 * Set up internal state. If a pointer to an array of clockdomains 265 * Initialize the wakeup dependency usecount variables for clockdomain @clkdm.
199 * was supplied, loop through the list of clockdomains, register all 266 * If a wakeup dependency is present in the hardware, the usecount will be
200 * that are available on the current platform. Similarly, if a 267 * set to 1; otherwise, it will be set to 0. Software should clear all
201 * pointer to an array of clockdomain-powerdomain autodependencies was 268 * software wakeup dependencies prior to calling this function if it wishes
202 * provided, register those. No return value. 269 * to ensure that all usecounts start at 0. No return value.
203 */ 270 */
204void clkdm_init(struct clockdomain **clkdms, 271static void _init_wkdep_usecount(struct clockdomain *clkdm)
205 struct clkdm_pwrdm_autodep *init_autodeps)
206{ 272{
207 struct clockdomain **c = NULL; 273 u32 v;
208 struct clkdm_pwrdm_autodep *autodep = NULL; 274 struct clkdm_dep *cd;
209 275
210 if (clkdms) 276 if (!clkdm->wkdep_srcs)
211 for (c = clkdms; *c; c++) 277 return;
212 clkdm_register(*c);
213 278
214 autodeps = init_autodeps; 279 for (cd = clkdm->wkdep_srcs; cd->clkdm_name; cd++) {
215 if (autodeps) 280 if (!omap_chip_is(cd->omap_chip))
216 for (autodep = autodeps; autodep->pwrdm.ptr; autodep++) 281 continue;
217 _autodep_lookup(autodep); 282
283 if (!cd->clkdm && cd->clkdm_name)
284 cd->clkdm = _clkdm_lookup(cd->clkdm_name);
285
286 if (!cd->clkdm) {
287 WARN(!cd->clkdm, "clockdomain: %s: wkdep clkdm %s not "
288 "found\n", clkdm->name, cd->clkdm_name);
289 continue;
290 }
291
292 v = prm_read_mod_bits_shift(clkdm->pwrdm.ptr->prcm_offs,
293 PM_WKDEP,
294 (1 << cd->clkdm->dep_bit));
295
296 if (v)
297 pr_debug("clockdomain: %s: wakeup dependency already "
298 "set to wake up when %s wakes\n",
299 clkdm->name, cd->clkdm->name);
300
301 atomic_set(&cd->wkdep_usecount, (v) ? 1 : 0);
302 }
218} 303}
219 304
220/** 305/**
221 * clkdm_register - register a clockdomain 306 * _init_sleepdep_usecount - initialize sleepdep usecounts to match hardware
222 * @clkdm: struct clockdomain * to register 307 * @clkdm: clockdomain to initialize sleepdep usecounts
223 * 308 *
224 * Adds a clockdomain to the internal clockdomain list. 309 * Initialize the sleep dependency usecount variables for clockdomain @clkdm.
225 * Returns -EINVAL if given a null pointer, -EEXIST if a clockdomain is 310 * If a sleep dependency is present in the hardware, the usecount will be
226 * already registered by the provided name, or 0 upon success. 311 * set to 1; otherwise, it will be set to 0. Software should clear all
312 * software sleep dependencies prior to calling this function if it wishes
313 * to ensure that all usecounts start at 0. No return value.
227 */ 314 */
228int clkdm_register(struct clockdomain *clkdm) 315static void _init_sleepdep_usecount(struct clockdomain *clkdm)
229{ 316{
230 int ret = -EINVAL; 317 u32 v;
231 struct powerdomain *pwrdm; 318 struct clkdm_dep *cd;
232 319
233 if (!clkdm || !clkdm->name) 320 if (!cpu_is_omap34xx())
234 return -EINVAL; 321 return;
235 322
236 if (!omap_chip_is(clkdm->omap_chip)) 323 if (!clkdm->sleepdep_srcs)
237 return -EINVAL; 324 return;
238 325
239 pwrdm = pwrdm_lookup(clkdm->pwrdm.name); 326 for (cd = clkdm->sleepdep_srcs; cd->clkdm_name; cd++) {
240 if (!pwrdm) { 327 if (!omap_chip_is(cd->omap_chip))
241 pr_err("clockdomain: %s: powerdomain %s does not exist\n", 328 continue;
242 clkdm->name, clkdm->pwrdm.name);
243 return -EINVAL;
244 }
245 clkdm->pwrdm.ptr = pwrdm;
246 329
247 mutex_lock(&clkdm_mutex); 330 if (!cd->clkdm && cd->clkdm_name)
248 /* Verify that the clockdomain is not already registered */ 331 cd->clkdm = _clkdm_lookup(cd->clkdm_name);
249 if (_clkdm_lookup(clkdm->name)) {
250 ret = -EEXIST;
251 goto cr_unlock;
252 }
253 332
254 list_add(&clkdm->node, &clkdm_list); 333 if (!cd->clkdm) {
334 WARN(!cd->clkdm, "clockdomain: %s: sleepdep clkdm %s "
335 "not found\n", clkdm->name, cd->clkdm_name);
336 continue;
337 }
255 338
256 pwrdm_add_clkdm(pwrdm, clkdm); 339 v = prm_read_mod_bits_shift(clkdm->pwrdm.ptr->prcm_offs,
340 OMAP3430_CM_SLEEPDEP,
341 (1 << cd->clkdm->dep_bit));
257 342
258 pr_debug("clockdomain: registered %s\n", clkdm->name); 343 if (v)
259 ret = 0; 344 pr_debug("clockdomain: %s: sleep dependency already "
345 "set to prevent from idling until %s "
346 "idles\n", clkdm->name, cd->clkdm->name);
260 347
261cr_unlock: 348 atomic_set(&cd->sleepdep_usecount, (v) ? 1 : 0);
262 mutex_unlock(&clkdm_mutex); 349 }
350};
263 351
264 return ret; 352/* Public functions */
265}
266 353
267/** 354/**
268 * clkdm_unregister - unregister a clockdomain 355 * clkdm_init - set up the clockdomain layer
269 * @clkdm: struct clockdomain * to unregister 356 * @clkdms: optional pointer to an array of clockdomains to register
357 * @init_autodeps: optional pointer to an array of autodeps to register
270 * 358 *
271 * Removes a clockdomain from the internal clockdomain list. Returns 359 * Set up internal state. If a pointer to an array of clockdomains
272 * -EINVAL if clkdm argument is NULL. 360 * @clkdms was supplied, loop through the list of clockdomains,
361 * register all that are available on the current platform. Similarly,
362 * if a pointer to an array of clockdomain autodependencies
363 * @init_autodeps was provided, register those. No return value.
273 */ 364 */
274int clkdm_unregister(struct clockdomain *clkdm) 365void clkdm_init(struct clockdomain **clkdms,
366 struct clkdm_autodep *init_autodeps)
275{ 367{
276 if (!clkdm) 368 struct clockdomain **c = NULL;
277 return -EINVAL; 369 struct clockdomain *clkdm;
278 370 struct clkdm_autodep *autodep = NULL;
279 pwrdm_del_clkdm(clkdm->pwrdm.ptr, clkdm);
280 371
281 mutex_lock(&clkdm_mutex); 372 if (clkdms)
282 list_del(&clkdm->node); 373 for (c = clkdms; *c; c++)
283 mutex_unlock(&clkdm_mutex); 374 _clkdm_register(*c);
284 375
285 pr_debug("clockdomain: unregistered %s\n", clkdm->name); 376 autodeps = init_autodeps;
377 if (autodeps)
378 for (autodep = autodeps; autodep->clkdm.ptr; autodep++)
379 _autodep_lookup(autodep);
286 380
287 return 0; 381 /*
382 * Ensure that the *dep_usecount registers reflect the current
383 * state of the PRCM.
384 */
385 list_for_each_entry(clkdm, &clkdm_list, node) {
386 _init_wkdep_usecount(clkdm);
387 _init_sleepdep_usecount(clkdm);
388 }
288} 389}
289 390
290/** 391/**
291 * clkdm_lookup - look up a clockdomain by name, return a pointer 392 * clkdm_lookup - look up a clockdomain by name, return a pointer
292 * @name: name of clockdomain 393 * @name: name of clockdomain
293 * 394 *
294 * Find a registered clockdomain by its name. Returns a pointer to the 395 * Find a registered clockdomain by its name @name. Returns a pointer
295 * struct clockdomain if found, or NULL otherwise. 396 * to the struct clockdomain if found, or NULL otherwise.
296 */ 397 */
297struct clockdomain *clkdm_lookup(const char *name) 398struct clockdomain *clkdm_lookup(const char *name)
298{ 399{
@@ -303,14 +404,12 @@ struct clockdomain *clkdm_lookup(const char *name)
303 404
304 clkdm = NULL; 405 clkdm = NULL;
305 406
306 mutex_lock(&clkdm_mutex);
307 list_for_each_entry(temp_clkdm, &clkdm_list, node) { 407 list_for_each_entry(temp_clkdm, &clkdm_list, node) {
308 if (!strcmp(name, temp_clkdm->name)) { 408 if (!strcmp(name, temp_clkdm->name)) {
309 clkdm = temp_clkdm; 409 clkdm = temp_clkdm;
310 break; 410 break;
311 } 411 }
312 } 412 }
313 mutex_unlock(&clkdm_mutex);
314 413
315 return clkdm; 414 return clkdm;
316} 415}
@@ -319,8 +418,8 @@ struct clockdomain *clkdm_lookup(const char *name)
319 * clkdm_for_each - call function on each registered clockdomain 418 * clkdm_for_each - call function on each registered clockdomain
320 * @fn: callback function * 419 * @fn: callback function *
321 * 420 *
322 * Call the supplied function for each registered clockdomain. 421 * Call the supplied function @fn for each registered clockdomain.
323 * The callback function can return anything but 0 to bail 422 * The callback function @fn can return anything but 0 to bail
324 * out early from the iterator. The callback function is called with 423 * out early from the iterator. The callback function is called with
325 * the clkdm_mutex held, so no clockdomain structure manipulation 424 * the clkdm_mutex held, so no clockdomain structure manipulation
326 * functions should be called from the callback, although hardware 425 * functions should be called from the callback, although hardware
@@ -338,13 +437,11 @@ int clkdm_for_each(int (*fn)(struct clockdomain *clkdm, void *user),
338 if (!fn) 437 if (!fn)
339 return -EINVAL; 438 return -EINVAL;
340 439
341 mutex_lock(&clkdm_mutex);
342 list_for_each_entry(clkdm, &clkdm_list, node) { 440 list_for_each_entry(clkdm, &clkdm_list, node) {
343 ret = (*fn)(clkdm, user); 441 ret = (*fn)(clkdm, user);
344 if (ret) 442 if (ret)
345 break; 443 break;
346 } 444 }
347 mutex_unlock(&clkdm_mutex);
348 445
349 return ret; 446 return ret;
350} 447}
@@ -355,7 +452,7 @@ int clkdm_for_each(int (*fn)(struct clockdomain *clkdm, void *user),
355 * @clkdm: struct clockdomain * 452 * @clkdm: struct clockdomain *
356 * 453 *
357 * Return a pointer to the struct powerdomain that the specified clockdomain 454 * Return a pointer to the struct powerdomain that the specified clockdomain
358 * 'clkdm' exists in, or returns NULL if clkdm argument is NULL. 455 * @clkdm exists in, or returns NULL if @clkdm is NULL.
359 */ 456 */
360struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm) 457struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm)
361{ 458{
@@ -369,11 +466,309 @@ struct powerdomain *clkdm_get_pwrdm(struct clockdomain *clkdm)
369/* Hardware clockdomain control */ 466/* Hardware clockdomain control */
370 467
371/** 468/**
469 * clkdm_add_wkdep - add a wakeup dependency from clkdm2 to clkdm1
470 * @clkdm1: wake this struct clockdomain * up (dependent)
471 * @clkdm2: when this struct clockdomain * wakes up (source)
472 *
473 * When the clockdomain represented by @clkdm2 wakes up, wake up
474 * @clkdm1. Implemented in hardware on the OMAP, this feature is
475 * designed to reduce wakeup latency of the dependent clockdomain @clkdm1.
476 * Returns -EINVAL if presented with invalid clockdomain pointers,
477 * -ENOENT if @clkdm2 cannot wake up clkdm1 in hardware, or 0 upon
478 * success.
479 */
480int clkdm_add_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2)
481{
482 struct clkdm_dep *cd;
483
484 if (!clkdm1 || !clkdm2)
485 return -EINVAL;
486
487 cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs);
488 if (IS_ERR(cd)) {
489 pr_debug("clockdomain: hardware cannot set/clear wake up of "
490 "%s when %s wakes up\n", clkdm1->name, clkdm2->name);
491 return PTR_ERR(cd);
492 }
493
494 if (atomic_inc_return(&cd->wkdep_usecount) == 1) {
495 pr_debug("clockdomain: hardware will wake up %s when %s wakes "
496 "up\n", clkdm1->name, clkdm2->name);
497
498 prm_set_mod_reg_bits((1 << clkdm2->dep_bit),
499 clkdm1->pwrdm.ptr->prcm_offs, PM_WKDEP);
500 }
501
502 return 0;
503}
504
505/**
506 * clkdm_del_wkdep - remove a wakeup dependency from clkdm2 to clkdm1
507 * @clkdm1: wake this struct clockdomain * up (dependent)
508 * @clkdm2: when this struct clockdomain * wakes up (source)
509 *
510 * Remove a wakeup dependency causing @clkdm1 to wake up when @clkdm2
511 * wakes up. Returns -EINVAL if presented with invalid clockdomain
512 * pointers, -ENOENT if @clkdm2 cannot wake up clkdm1 in hardware, or
513 * 0 upon success.
514 */
515int clkdm_del_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2)
516{
517 struct clkdm_dep *cd;
518
519 if (!clkdm1 || !clkdm2)
520 return -EINVAL;
521
522 cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs);
523 if (IS_ERR(cd)) {
524 pr_debug("clockdomain: hardware cannot set/clear wake up of "
525 "%s when %s wakes up\n", clkdm1->name, clkdm2->name);
526 return PTR_ERR(cd);
527 }
528
529 if (atomic_dec_return(&cd->wkdep_usecount) == 0) {
530 pr_debug("clockdomain: hardware will no longer wake up %s "
531 "after %s wakes up\n", clkdm1->name, clkdm2->name);
532
533 prm_clear_mod_reg_bits((1 << clkdm2->dep_bit),
534 clkdm1->pwrdm.ptr->prcm_offs, PM_WKDEP);
535 }
536
537 return 0;
538}
539
540/**
541 * clkdm_read_wkdep - read wakeup dependency state from clkdm2 to clkdm1
542 * @clkdm1: wake this struct clockdomain * up (dependent)
543 * @clkdm2: when this struct clockdomain * wakes up (source)
544 *
545 * Return 1 if a hardware wakeup dependency exists wherein @clkdm1 will be
546 * awoken when @clkdm2 wakes up; 0 if dependency is not set; -EINVAL
547 * if either clockdomain pointer is invalid; or -ENOENT if the hardware
548 * is incapable.
549 *
550 * REVISIT: Currently this function only represents software-controllable
551 * wakeup dependencies. Wakeup dependencies fixed in hardware are not
552 * yet handled here.
553 */
554int clkdm_read_wkdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2)
555{
556 struct clkdm_dep *cd;
557
558 if (!clkdm1 || !clkdm2)
559 return -EINVAL;
560
561 cd = _clkdm_deps_lookup(clkdm2, clkdm1->wkdep_srcs);
562 if (IS_ERR(cd)) {
563 pr_debug("clockdomain: hardware cannot set/clear wake up of "
564 "%s when %s wakes up\n", clkdm1->name, clkdm2->name);
565 return PTR_ERR(cd);
566 }
567
568 /* XXX It's faster to return the atomic wkdep_usecount */
569 return prm_read_mod_bits_shift(clkdm1->pwrdm.ptr->prcm_offs, PM_WKDEP,
570 (1 << clkdm2->dep_bit));
571}
572
573/**
574 * clkdm_clear_all_wkdeps - remove all wakeup dependencies from target clkdm
575 * @clkdm: struct clockdomain * to remove all wakeup dependencies from
576 *
577 * Remove all inter-clockdomain wakeup dependencies that could cause
578 * @clkdm to wake. Intended to be used during boot to initialize the
579 * PRCM to a known state, after all clockdomains are put into swsup idle
580 * and woken up. Returns -EINVAL if @clkdm pointer is invalid, or
581 * 0 upon success.
582 */
583int clkdm_clear_all_wkdeps(struct clockdomain *clkdm)
584{
585 struct clkdm_dep *cd;
586 u32 mask = 0;
587
588 if (!clkdm)
589 return -EINVAL;
590
591 for (cd = clkdm->wkdep_srcs; cd && cd->clkdm_name; cd++) {
592 if (!omap_chip_is(cd->omap_chip))
593 continue;
594
595 /* PRM accesses are slow, so minimize them */
596 mask |= 1 << cd->clkdm->dep_bit;
597 atomic_set(&cd->wkdep_usecount, 0);
598 }
599
600 prm_clear_mod_reg_bits(mask, clkdm->pwrdm.ptr->prcm_offs, PM_WKDEP);
601
602 return 0;
603}
604
605/**
606 * clkdm_add_sleepdep - add a sleep dependency from clkdm2 to clkdm1
607 * @clkdm1: prevent this struct clockdomain * from sleeping (dependent)
608 * @clkdm2: when this struct clockdomain * is active (source)
609 *
610 * Prevent @clkdm1 from automatically going inactive (and then to
611 * retention or off) if @clkdm2 is active. Returns -EINVAL if
612 * presented with invalid clockdomain pointers or called on a machine
613 * that does not support software-configurable hardware sleep
614 * dependencies, -ENOENT if the specified dependency cannot be set in
615 * hardware, or 0 upon success.
616 */
617int clkdm_add_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2)
618{
619 struct clkdm_dep *cd;
620
621 if (!cpu_is_omap34xx())
622 return -EINVAL;
623
624 if (!clkdm1 || !clkdm2)
625 return -EINVAL;
626
627 cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs);
628 if (IS_ERR(cd)) {
629 pr_debug("clockdomain: hardware cannot set/clear sleep "
630 "dependency affecting %s from %s\n", clkdm1->name,
631 clkdm2->name);
632 return PTR_ERR(cd);
633 }
634
635 if (atomic_inc_return(&cd->sleepdep_usecount) == 1) {
636 pr_debug("clockdomain: will prevent %s from sleeping if %s "
637 "is active\n", clkdm1->name, clkdm2->name);
638
639 cm_set_mod_reg_bits((1 << clkdm2->dep_bit),
640 clkdm1->pwrdm.ptr->prcm_offs,
641 OMAP3430_CM_SLEEPDEP);
642 }
643
644 return 0;
645}
646
647/**
648 * clkdm_del_sleepdep - remove a sleep dependency from clkdm2 to clkdm1
649 * @clkdm1: prevent this struct clockdomain * from sleeping (dependent)
650 * @clkdm2: when this struct clockdomain * is active (source)
651 *
652 * Allow @clkdm1 to automatically go inactive (and then to retention or
653 * off), independent of the activity state of @clkdm2. Returns -EINVAL
654 * if presented with invalid clockdomain pointers or called on a machine
655 * that does not support software-configurable hardware sleep dependencies,
656 * -ENOENT if the specified dependency cannot be cleared in hardware, or
657 * 0 upon success.
658 */
659int clkdm_del_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2)
660{
661 struct clkdm_dep *cd;
662
663 if (!cpu_is_omap34xx())
664 return -EINVAL;
665
666 if (!clkdm1 || !clkdm2)
667 return -EINVAL;
668
669 cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs);
670 if (IS_ERR(cd)) {
671 pr_debug("clockdomain: hardware cannot set/clear sleep "
672 "dependency affecting %s from %s\n", clkdm1->name,
673 clkdm2->name);
674 return PTR_ERR(cd);
675 }
676
677 if (atomic_dec_return(&cd->sleepdep_usecount) == 0) {
678 pr_debug("clockdomain: will no longer prevent %s from "
679 "sleeping if %s is active\n", clkdm1->name,
680 clkdm2->name);
681
682 cm_clear_mod_reg_bits((1 << clkdm2->dep_bit),
683 clkdm1->pwrdm.ptr->prcm_offs,
684 OMAP3430_CM_SLEEPDEP);
685 }
686
687 return 0;
688}
689
690/**
691 * clkdm_read_sleepdep - read sleep dependency state from clkdm2 to clkdm1
692 * @clkdm1: prevent this struct clockdomain * from sleeping (dependent)
693 * @clkdm2: when this struct clockdomain * is active (source)
694 *
695 * Return 1 if a hardware sleep dependency exists wherein @clkdm1 will
696 * not be allowed to automatically go inactive if @clkdm2 is active;
697 * 0 if @clkdm1's automatic power state inactivity transition is independent
698 * of @clkdm2's; -EINVAL if either clockdomain pointer is invalid or called
699 * on a machine that does not support software-configurable hardware sleep
700 * dependencies; or -ENOENT if the hardware is incapable.
701 *
702 * REVISIT: Currently this function only represents software-controllable
703 * sleep dependencies. Sleep dependencies fixed in hardware are not
704 * yet handled here.
705 */
706int clkdm_read_sleepdep(struct clockdomain *clkdm1, struct clockdomain *clkdm2)
707{
708 struct clkdm_dep *cd;
709
710 if (!cpu_is_omap34xx())
711 return -EINVAL;
712
713 if (!clkdm1 || !clkdm2)
714 return -EINVAL;
715
716 cd = _clkdm_deps_lookup(clkdm2, clkdm1->sleepdep_srcs);
717 if (IS_ERR(cd)) {
718 pr_debug("clockdomain: hardware cannot set/clear sleep "
719 "dependency affecting %s from %s\n", clkdm1->name,
720 clkdm2->name);
721 return PTR_ERR(cd);
722 }
723
724 /* XXX It's faster to return the atomic sleepdep_usecount */
725 return prm_read_mod_bits_shift(clkdm1->pwrdm.ptr->prcm_offs,
726 OMAP3430_CM_SLEEPDEP,
727 (1 << clkdm2->dep_bit));
728}
729
730/**
731 * clkdm_clear_all_sleepdeps - remove all sleep dependencies from target clkdm
732 * @clkdm: struct clockdomain * to remove all sleep dependencies from
733 *
734 * Remove all inter-clockdomain sleep dependencies that could prevent
735 * @clkdm from idling. Intended to be used during boot to initialize the
736 * PRCM to a known state, after all clockdomains are put into swsup idle
737 * and woken up. Returns -EINVAL if @clkdm pointer is invalid, or
738 * 0 upon success.
739 */
740int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm)
741{
742 struct clkdm_dep *cd;
743 u32 mask = 0;
744
745 if (!cpu_is_omap34xx())
746 return -EINVAL;
747
748 if (!clkdm)
749 return -EINVAL;
750
751 for (cd = clkdm->sleepdep_srcs; cd && cd->clkdm_name; cd++) {
752 if (!omap_chip_is(cd->omap_chip))
753 continue;
754
755 /* PRM accesses are slow, so minimize them */
756 mask |= 1 << cd->clkdm->dep_bit;
757 atomic_set(&cd->sleepdep_usecount, 0);
758 }
759
760 prm_clear_mod_reg_bits(mask, clkdm->pwrdm.ptr->prcm_offs,
761 OMAP3430_CM_SLEEPDEP);
762
763 return 0;
764}
765
766/**
372 * omap2_clkdm_clktrctrl_read - read the clkdm's current state transition mode 767 * omap2_clkdm_clktrctrl_read - read the clkdm's current state transition mode
373 * @clk: struct clk * of a clockdomain 768 * @clkdm: struct clkdm * of a clockdomain
374 * 769 *
375 * Return the clockdomain's current state transition mode from the 770 * Return the clockdomain @clkdm current state transition mode from the
376 * corresponding domain CM_CLKSTCTRL register. Returns -EINVAL if clk 771 * corresponding domain CM_CLKSTCTRL register. Returns -EINVAL if @clkdm
377 * is NULL or the current mode upon success. 772 * is NULL or the current mode upon success.
378 */ 773 */
379static int omap2_clkdm_clktrctrl_read(struct clockdomain *clkdm) 774static int omap2_clkdm_clktrctrl_read(struct clockdomain *clkdm)
@@ -383,7 +778,7 @@ static int omap2_clkdm_clktrctrl_read(struct clockdomain *clkdm)
383 if (!clkdm) 778 if (!clkdm)
384 return -EINVAL; 779 return -EINVAL;
385 780
386 v = cm_read_mod_reg(clkdm->pwrdm.ptr->prcm_offs, CM_CLKSTCTRL); 781 v = __raw_readl(clkdm->clkstctrl_reg);
387 v &= clkdm->clktrctrl_mask; 782 v &= clkdm->clktrctrl_mask;
388 v >>= __ffs(clkdm->clktrctrl_mask); 783 v >>= __ffs(clkdm->clktrctrl_mask);
389 784
@@ -395,7 +790,7 @@ static int omap2_clkdm_clktrctrl_read(struct clockdomain *clkdm)
395 * @clkdm: struct clockdomain * 790 * @clkdm: struct clockdomain *
396 * 791 *
397 * Instruct the CM to force a sleep transition on the specified 792 * Instruct the CM to force a sleep transition on the specified
398 * clockdomain 'clkdm'. Returns -EINVAL if clk is NULL or if 793 * clockdomain @clkdm. Returns -EINVAL if @clkdm is NULL or if
399 * clockdomain does not support software-initiated sleep; 0 upon 794 * clockdomain does not support software-initiated sleep; 0 upon
400 * success. 795 * success.
401 */ 796 */
@@ -415,15 +810,17 @@ int omap2_clkdm_sleep(struct clockdomain *clkdm)
415 if (cpu_is_omap24xx()) { 810 if (cpu_is_omap24xx()) {
416 811
417 cm_set_mod_reg_bits(OMAP24XX_FORCESTATE, 812 cm_set_mod_reg_bits(OMAP24XX_FORCESTATE,
418 clkdm->pwrdm.ptr->prcm_offs, PM_PWSTCTRL); 813 clkdm->pwrdm.ptr->prcm_offs, OMAP2_PM_PWSTCTRL);
419 814
420 } else if (cpu_is_omap34xx()) { 815 } else if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
421 816
422 u32 v = (OMAP34XX_CLKSTCTRL_FORCE_SLEEP << 817 u32 bits = (OMAP34XX_CLKSTCTRL_FORCE_SLEEP <<
423 __ffs(clkdm->clktrctrl_mask)); 818 __ffs(clkdm->clktrctrl_mask));
424 819
425 cm_rmw_mod_reg_bits(clkdm->clktrctrl_mask, v, 820 u32 v = __raw_readl(clkdm->clkstctrl_reg);
426 clkdm->pwrdm.ptr->prcm_offs, CM_CLKSTCTRL); 821 v &= ~(clkdm->clktrctrl_mask);
822 v |= bits;
823 __raw_writel(v, clkdm->clkstctrl_reg);
427 824
428 } else { 825 } else {
429 BUG(); 826 BUG();
@@ -437,7 +834,7 @@ int omap2_clkdm_sleep(struct clockdomain *clkdm)
437 * @clkdm: struct clockdomain * 834 * @clkdm: struct clockdomain *
438 * 835 *
439 * Instruct the CM to force a wakeup transition on the specified 836 * Instruct the CM to force a wakeup transition on the specified
440 * clockdomain 'clkdm'. Returns -EINVAL if clkdm is NULL or if the 837 * clockdomain @clkdm. Returns -EINVAL if @clkdm is NULL or if the
441 * clockdomain does not support software-controlled wakeup; 0 upon 838 * clockdomain does not support software-controlled wakeup; 0 upon
442 * success. 839 * success.
443 */ 840 */
@@ -457,15 +854,17 @@ int omap2_clkdm_wakeup(struct clockdomain *clkdm)
457 if (cpu_is_omap24xx()) { 854 if (cpu_is_omap24xx()) {
458 855
459 cm_clear_mod_reg_bits(OMAP24XX_FORCESTATE, 856 cm_clear_mod_reg_bits(OMAP24XX_FORCESTATE,
460 clkdm->pwrdm.ptr->prcm_offs, PM_PWSTCTRL); 857 clkdm->pwrdm.ptr->prcm_offs, OMAP2_PM_PWSTCTRL);
461 858
462 } else if (cpu_is_omap34xx()) { 859 } else if (cpu_is_omap34xx() || cpu_is_omap44xx()) {
463 860
464 u32 v = (OMAP34XX_CLKSTCTRL_FORCE_WAKEUP << 861 u32 bits = (OMAP34XX_CLKSTCTRL_FORCE_WAKEUP <<
465 __ffs(clkdm->clktrctrl_mask)); 862 __ffs(clkdm->clktrctrl_mask));
466 863
467 cm_rmw_mod_reg_bits(clkdm->clktrctrl_mask, v, 864 u32 v = __raw_readl(clkdm->clkstctrl_reg);
468 clkdm->pwrdm.ptr->prcm_offs, CM_CLKSTCTRL); 865 v &= ~(clkdm->clktrctrl_mask);
866 v |= bits;
867 __raw_writel(v, clkdm->clkstctrl_reg);
469 868
470 } else { 869 } else {
471 BUG(); 870 BUG();
@@ -478,7 +877,7 @@ int omap2_clkdm_wakeup(struct clockdomain *clkdm)
478 * omap2_clkdm_allow_idle - enable hwsup idle transitions for clkdm 877 * omap2_clkdm_allow_idle - enable hwsup idle transitions for clkdm
479 * @clkdm: struct clockdomain * 878 * @clkdm: struct clockdomain *
480 * 879 *
481 * Allow the hardware to automatically switch the clockdomain into 880 * Allow the hardware to automatically switch the clockdomain @clkdm into
482 * active or idle states, as needed by downstream clocks. If the 881 * active or idle states, as needed by downstream clocks. If the
483 * clockdomain has any downstream clocks enabled in the clock 882 * clockdomain has any downstream clocks enabled in the clock
484 * framework, wkdep/sleepdep autodependencies are added; this is so 883 * framework, wkdep/sleepdep autodependencies are added; this is so
@@ -498,8 +897,17 @@ void omap2_clkdm_allow_idle(struct clockdomain *clkdm)
498 pr_debug("clockdomain: enabling automatic idle transitions for %s\n", 897 pr_debug("clockdomain: enabling automatic idle transitions for %s\n",
499 clkdm->name); 898 clkdm->name);
500 899
501 if (atomic_read(&clkdm->usecount) > 0) 900 /*
502 _clkdm_add_autodeps(clkdm); 901 * XXX This should be removed once TI adds wakeup/sleep
902 * dependency code and data for OMAP4.
903 */
904 if (cpu_is_omap44xx()) {
905 WARN_ONCE(1, "clockdomain: OMAP4 wakeup/sleep dependency "
906 "support is not yet implemented\n");
907 } else {
908 if (atomic_read(&clkdm->usecount) > 0)
909 _clkdm_add_autodeps(clkdm);
910 }
503 911
504 _omap2_clkdm_set_hwsup(clkdm, 1); 912 _omap2_clkdm_set_hwsup(clkdm, 1);
505 913
@@ -511,8 +919,8 @@ void omap2_clkdm_allow_idle(struct clockdomain *clkdm)
511 * @clkdm: struct clockdomain * 919 * @clkdm: struct clockdomain *
512 * 920 *
513 * Prevent the hardware from automatically switching the clockdomain 921 * Prevent the hardware from automatically switching the clockdomain
514 * into inactive or idle states. If the clockdomain has downstream 922 * @clkdm into inactive or idle states. If the clockdomain has
515 * clocks enabled in the clock framework, wkdep/sleepdep 923 * downstream clocks enabled in the clock framework, wkdep/sleepdep
516 * autodependencies are removed. No return value. 924 * autodependencies are removed. No return value.
517 */ 925 */
518void omap2_clkdm_deny_idle(struct clockdomain *clkdm) 926void omap2_clkdm_deny_idle(struct clockdomain *clkdm)
@@ -531,8 +939,17 @@ void omap2_clkdm_deny_idle(struct clockdomain *clkdm)
531 939
532 _omap2_clkdm_set_hwsup(clkdm, 0); 940 _omap2_clkdm_set_hwsup(clkdm, 0);
533 941
534 if (atomic_read(&clkdm->usecount) > 0) 942 /*
535 _clkdm_del_autodeps(clkdm); 943 * XXX This should be removed once TI adds wakeup/sleep
944 * dependency code and data for OMAP4.
945 */
946 if (cpu_is_omap44xx()) {
947 WARN_ONCE(1, "clockdomain: OMAP4 wakeup/sleep dependency "
948 "support is not yet implemented\n");
949 } else {
950 if (atomic_read(&clkdm->usecount) > 0)
951 _clkdm_del_autodeps(clkdm);
952 }
536} 953}
537 954
538 955
@@ -543,14 +960,14 @@ void omap2_clkdm_deny_idle(struct clockdomain *clkdm)
543 * @clkdm: struct clockdomain * 960 * @clkdm: struct clockdomain *
544 * @clk: struct clk * of the enabled downstream clock 961 * @clk: struct clk * of the enabled downstream clock
545 * 962 *
546 * Increment the usecount of this clockdomain 'clkdm' and ensure that 963 * Increment the usecount of the clockdomain @clkdm and ensure that it
547 * it is awake. Intended to be called by clk_enable() code. If the 964 * is awake before @clk is enabled. Intended to be called by
548 * clockdomain is in software-supervised idle mode, force the 965 * clk_enable() code. If the clockdomain is in software-supervised
549 * clockdomain to wake. If the clockdomain is in hardware-supervised 966 * idle mode, force the clockdomain to wake. If the clockdomain is in
550 * idle mode, add clkdm-pwrdm autodependencies, to ensure that devices 967 * hardware-supervised idle mode, add clkdm-pwrdm autodependencies, to
551 * in the clockdomain can be read from/written to by on-chip processors. 968 * ensure that devices in the clockdomain can be read from/written to
552 * Returns -EINVAL if passed null pointers; returns 0 upon success or 969 * by on-chip processors. Returns -EINVAL if passed null pointers;
553 * if the clockdomain is in hwsup idle mode. 970 * returns 0 upon success or if the clockdomain is in hwsup idle mode.
554 */ 971 */
555int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk) 972int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk)
556{ 973{
@@ -572,6 +989,9 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk)
572 pr_debug("clockdomain: clkdm %s: clk %s now enabled\n", clkdm->name, 989 pr_debug("clockdomain: clkdm %s: clk %s now enabled\n", clkdm->name,
573 clk->name); 990 clk->name);
574 991
992 if (!clkdm->clkstctrl_reg)
993 return 0;
994
575 v = omap2_clkdm_clktrctrl_read(clkdm); 995 v = omap2_clkdm_clktrctrl_read(clkdm);
576 996
577 if ((cpu_is_omap34xx() && v == OMAP34XX_CLKSTCTRL_ENABLE_AUTO) || 997 if ((cpu_is_omap34xx() && v == OMAP34XX_CLKSTCTRL_ENABLE_AUTO) ||
@@ -595,13 +1015,14 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk)
595 * @clkdm: struct clockdomain * 1015 * @clkdm: struct clockdomain *
596 * @clk: struct clk * of the disabled downstream clock 1016 * @clk: struct clk * of the disabled downstream clock
597 * 1017 *
598 * Decrement the usecount of this clockdomain 'clkdm'. Intended to be 1018 * Decrement the usecount of this clockdomain @clkdm when @clk is
599 * called by clk_disable() code. If the usecount goes to 0, put the 1019 * disabled. Intended to be called by clk_disable() code. If the
600 * clockdomain to sleep (software-supervised mode) or remove the 1020 * clockdomain usecount goes to 0, put the clockdomain to sleep
601 * clkdm-pwrdm autodependencies (hardware-supervised mode). Returns 1021 * (software-supervised mode) or remove the clkdm autodependencies
602 * -EINVAL if passed null pointers; -ERANGE if the clkdm usecount 1022 * (hardware-supervised mode). Returns -EINVAL if passed null
603 * underflows and debugging is enabled; or returns 0 upon success or 1023 * pointers; -ERANGE if the @clkdm usecount underflows and debugging
604 * if the clockdomain is in hwsup idle mode. 1024 * is enabled; or returns 0 upon success or if the clockdomain is in
1025 * hwsup idle mode.
605 */ 1026 */
606int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk) 1027int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk)
607{ 1028{
@@ -630,6 +1051,9 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk)
630 pr_debug("clockdomain: clkdm %s: clk %s now disabled\n", clkdm->name, 1051 pr_debug("clockdomain: clkdm %s: clk %s now disabled\n", clkdm->name,
631 clk->name); 1052 clk->name);
632 1053
1054 if (!clkdm->clkstctrl_reg)
1055 return 0;
1056
633 v = omap2_clkdm_clktrctrl_read(clkdm); 1057 v = omap2_clkdm_clktrctrl_read(clkdm);
634 1058
635 if ((cpu_is_omap34xx() && v == OMAP34XX_CLKSTCTRL_ENABLE_AUTO) || 1059 if ((cpu_is_omap34xx() && v == OMAP34XX_CLKSTCTRL_ENABLE_AUTO) ||
diff --git a/arch/arm/mach-omap2/clockdomains.h b/arch/arm/mach-omap2/clockdomains.h
index fe319ae4ca0a..8fc19ff2cd89 100644
--- a/arch/arm/mach-omap2/clockdomains.h
+++ b/arch/arm/mach-omap2/clockdomains.h
@@ -1,16 +1,420 @@
1/* 1/*
2 * OMAP2/3 clockdomains 2 * OMAP2/3 clockdomains
3 * 3 *
4 * Copyright (C) 2008 Texas Instruments, Inc. 4 * Copyright (C) 2008-2009 Texas Instruments, Inc.
5 * Copyright (C) 2008 Nokia Corporation 5 * Copyright (C) 2008-2010 Nokia Corporation
6 * 6 *
7 * Written by Paul Walmsley 7 * Written by Paul Walmsley and Jouni Högander
8 *
9 * This file contains clockdomains and clockdomain wakeup/sleep
10 * dependencies for the OMAP2/3 chips. Some notes:
11 *
12 * A useful validation rule for struct clockdomain: Any clockdomain
13 * referenced by a wkdep_srcs or sleepdep_srcs array must have a
14 * dep_bit assigned. So wkdep_srcs/sleepdep_srcs are really just
15 * software-controllable dependencies. Non-software-controllable
16 * dependencies do exist, but they are not encoded below (yet).
17 *
18 * 24xx does not support programmable sleep dependencies (SLEEPDEP)
19 *
20 * The overly-specific dep_bit names are due to a bit name collision
21 * with CM_FCLKEN_{DSP,IVA2}. The DSP/IVA2 PM_WKDEP and CM_SLEEPDEP shift
22 * value are the same for all powerdomains: 2
23 *
24 * XXX should dep_bit be a mask, so we can test to see if it is 0 as a
25 * sanity check?
26 * XXX encode hardware fixed wakeup dependencies -- esp. for 3430 CORE
27 */
28
29/*
30 * To-Do List
31 * -> Port the Sleep/Wakeup dependencies for the domains
32 * from the Power domain framework
8 */ 33 */
9 34
10#ifndef __ARCH_ARM_MACH_OMAP2_CLOCKDOMAINS_H 35#ifndef __ARCH_ARM_MACH_OMAP2_CLOCKDOMAINS_H
11#define __ARCH_ARM_MACH_OMAP2_CLOCKDOMAINS_H 36#define __ARCH_ARM_MACH_OMAP2_CLOCKDOMAINS_H
12 37
13#include <mach/clockdomain.h> 38#include <plat/clockdomain.h>
39#include "cm.h"
40#include "prm.h"
41
42/*
43 * Clockdomain dependencies for wkdeps/sleepdeps
44 *
45 * XXX Hardware dependencies (e.g., dependencies that cannot be
46 * changed in software) are not included here yet, but should be.
47 */
48
49/* OMAP2/3-common wakeup dependencies */
50
51/*
52 * 2420/2430 PM_WKDEP_GFX: CORE, MPU, WKUP
53 * 3430ES1 PM_WKDEP_GFX: adds IVA2, removes CORE
54 * 3430ES2 PM_WKDEP_SGX: adds IVA2, removes CORE
55 * These can share data since they will never be present simultaneously
56 * on the same device.
57 */
58static struct clkdm_dep gfx_sgx_wkdeps[] = {
59 {
60 .clkdm_name = "core_l3_clkdm",
61 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
62 },
63 {
64 .clkdm_name = "core_l4_clkdm",
65 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
66 },
67 {
68 .clkdm_name = "iva2_clkdm",
69 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
70 },
71 {
72 .clkdm_name = "mpu_clkdm",
73 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX |
74 CHIP_IS_OMAP3430)
75 },
76 {
77 .clkdm_name = "wkup_clkdm",
78 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX |
79 CHIP_IS_OMAP3430)
80 },
81 { NULL },
82};
83
84
85/* 24XX-specific possible dependencies */
86
87#ifdef CONFIG_ARCH_OMAP2
88
89/* Wakeup dependency source arrays */
90
91/* 2420/2430 PM_WKDEP_DSP: CORE, MPU, WKUP */
92static struct clkdm_dep dsp_24xx_wkdeps[] = {
93 {
94 .clkdm_name = "core_l3_clkdm",
95 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
96 },
97 {
98 .clkdm_name = "core_l4_clkdm",
99 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
100 },
101 {
102 .clkdm_name = "mpu_clkdm",
103 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
104 },
105 {
106 .clkdm_name = "wkup_clkdm",
107 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
108 },
109 { NULL },
110};
111
112/*
113 * 2420 PM_WKDEP_MPU: CORE, DSP, WKUP
114 * 2430 adds MDM
115 */
116static struct clkdm_dep mpu_24xx_wkdeps[] = {
117 {
118 .clkdm_name = "core_l3_clkdm",
119 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
120 },
121 {
122 .clkdm_name = "core_l4_clkdm",
123 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
124 },
125 {
126 .clkdm_name = "dsp_clkdm",
127 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
128 },
129 {
130 .clkdm_name = "wkup_clkdm",
131 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
132 },
133 {
134 .clkdm_name = "mdm_clkdm",
135 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
136 },
137 { NULL },
138};
139
140/*
141 * 2420 PM_WKDEP_CORE: DSP, GFX, MPU, WKUP
142 * 2430 adds MDM
143 */
144static struct clkdm_dep core_24xx_wkdeps[] = {
145 {
146 .clkdm_name = "dsp_clkdm",
147 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
148 },
149 {
150 .clkdm_name = "gfx_clkdm",
151 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
152 },
153 {
154 .clkdm_name = "mpu_clkdm",
155 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
156 },
157 {
158 .clkdm_name = "wkup_clkdm",
159 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
160 },
161 {
162 .clkdm_name = "mdm_clkdm",
163 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
164 },
165 { NULL },
166};
167
168#endif
169
170
171/* 2430-specific possible wakeup dependencies */
172
173#ifdef CONFIG_ARCH_OMAP2430
174
175/* 2430 PM_WKDEP_MDM: CORE, MPU, WKUP */
176static struct clkdm_dep mdm_2430_wkdeps[] = {
177 {
178 .clkdm_name = "core_l3_clkdm",
179 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
180 },
181 {
182 .clkdm_name = "core_l4_clkdm",
183 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
184 },
185 {
186 .clkdm_name = "mpu_clkdm",
187 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
188 },
189 {
190 .clkdm_name = "wkup_clkdm",
191 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
192 },
193 { NULL },
194};
195
196#endif /* CONFIG_ARCH_OMAP2430 */
197
198
199/* OMAP3-specific possible dependencies */
200
201#ifdef CONFIG_ARCH_OMAP3
202
203/* 3430: PM_WKDEP_PER: CORE, IVA2, MPU, WKUP */
204static struct clkdm_dep per_wkdeps[] = {
205 {
206 .clkdm_name = "core_l3_clkdm",
207 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
208 },
209 {
210 .clkdm_name = "core_l4_clkdm",
211 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
212 },
213 {
214 .clkdm_name = "iva2_clkdm",
215 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
216 },
217 {
218 .clkdm_name = "mpu_clkdm",
219 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
220 },
221 {
222 .clkdm_name = "wkup_clkdm",
223 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
224 },
225 { NULL },
226};
227
228/* 3430ES2: PM_WKDEP_USBHOST: CORE, IVA2, MPU, WKUP */
229static struct clkdm_dep usbhost_wkdeps[] = {
230 {
231 .clkdm_name = "core_l3_clkdm",
232 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
233 },
234 {
235 .clkdm_name = "core_l4_clkdm",
236 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
237 },
238 {
239 .clkdm_name = "iva2_clkdm",
240 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
241 },
242 {
243 .clkdm_name = "mpu_clkdm",
244 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
245 },
246 {
247 .clkdm_name = "wkup_clkdm",
248 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
249 },
250 { NULL },
251};
252
253/* 3430 PM_WKDEP_MPU: CORE, IVA2, DSS, PER */
254static struct clkdm_dep mpu_3xxx_wkdeps[] = {
255 {
256 .clkdm_name = "core_l3_clkdm",
257 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
258 },
259 {
260 .clkdm_name = "core_l4_clkdm",
261 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
262 },
263 {
264 .clkdm_name = "iva2_clkdm",
265 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
266 },
267 {
268 .clkdm_name = "dss_clkdm",
269 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
270 },
271 {
272 .clkdm_name = "per_clkdm",
273 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
274 },
275 { NULL },
276};
277
278/* 3430 PM_WKDEP_IVA2: CORE, MPU, WKUP, DSS, PER */
279static struct clkdm_dep iva2_wkdeps[] = {
280 {
281 .clkdm_name = "core_l3_clkdm",
282 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
283 },
284 {
285 .clkdm_name = "core_l4_clkdm",
286 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
287 },
288 {
289 .clkdm_name = "mpu_clkdm",
290 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
291 },
292 {
293 .clkdm_name = "wkup_clkdm",
294 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
295 },
296 {
297 .clkdm_name = "dss_clkdm",
298 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
299 },
300 {
301 .clkdm_name = "per_clkdm",
302 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
303 },
304 { NULL },
305};
306
307
308/* 3430 PM_WKDEP_CAM: IVA2, MPU, WKUP */
309static struct clkdm_dep cam_wkdeps[] = {
310 {
311 .clkdm_name = "iva2_clkdm",
312 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
313 },
314 {
315 .clkdm_name = "mpu_clkdm",
316 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
317 },
318 {
319 .clkdm_name = "wkup_clkdm",
320 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
321 },
322 { NULL },
323};
324
325/* 3430 PM_WKDEP_DSS: IVA2, MPU, WKUP */
326static struct clkdm_dep dss_wkdeps[] = {
327 {
328 .clkdm_name = "iva2_clkdm",
329 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
330 },
331 {
332 .clkdm_name = "mpu_clkdm",
333 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
334 },
335 {
336 .clkdm_name = "wkup_clkdm",
337 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
338 },
339 { NULL },
340};
341
342/* 3430: PM_WKDEP_NEON: MPU */
343static struct clkdm_dep neon_wkdeps[] = {
344 {
345 .clkdm_name = "mpu_clkdm",
346 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
347 },
348 { NULL },
349};
350
351
352/* Sleep dependency source arrays for OMAP3-specific clkdms */
353
354/* 3430: CM_SLEEPDEP_DSS: MPU, IVA */
355static struct clkdm_dep dss_sleepdeps[] = {
356 {
357 .clkdm_name = "mpu_clkdm",
358 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
359 },
360 {
361 .clkdm_name = "iva2_clkdm",
362 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
363 },
364 { NULL },
365};
366
367/* 3430: CM_SLEEPDEP_PER: MPU, IVA */
368static struct clkdm_dep per_sleepdeps[] = {
369 {
370 .clkdm_name = "mpu_clkdm",
371 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
372 },
373 {
374 .clkdm_name = "iva2_clkdm",
375 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
376 },
377 { NULL },
378};
379
380/* 3430ES2: CM_SLEEPDEP_USBHOST: MPU, IVA */
381static struct clkdm_dep usbhost_sleepdeps[] = {
382 {
383 .clkdm_name = "mpu_clkdm",
384 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
385 },
386 {
387 .clkdm_name = "iva2_clkdm",
388 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
389 },
390 { NULL },
391};
392
393/* 3430: CM_SLEEPDEP_CAM: MPU */
394static struct clkdm_dep cam_sleepdeps[] = {
395 {
396 .clkdm_name = "mpu_clkdm",
397 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
398 },
399 { NULL },
400};
401
402/*
403 * 3430ES1: CM_SLEEPDEP_GFX: MPU
404 * 3430ES2: CM_SLEEPDEP_SGX: MPU
405 * These can share data since they will never be present simultaneously
406 * on the same device.
407 */
408static struct clkdm_dep gfx_sgx_sleepdeps[] = {
409 {
410 .clkdm_name = "mpu_clkdm",
411 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
412 },
413 { NULL },
414};
415
416#endif /* CONFIG_ARCH_OMAP3 */
417
14 418
15/* 419/*
16 * OMAP2/3-common clockdomains 420 * OMAP2/3-common clockdomains
@@ -21,10 +425,13 @@
21 * sys_clkout/sys_clkout2. 425 * sys_clkout/sys_clkout2.
22 */ 426 */
23 427
428#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
429
24/* This is an implicit clockdomain - it is never defined as such in TRM */ 430/* This is an implicit clockdomain - it is never defined as such in TRM */
25static struct clockdomain wkup_clkdm = { 431static struct clockdomain wkup_clkdm = {
26 .name = "wkup_clkdm", 432 .name = "wkup_clkdm",
27 .pwrdm = { .name = "wkup_pwrdm" }, 433 .pwrdm = { .name = "wkup_pwrdm" },
434 .dep_bit = OMAP_EN_WKUP_SHIFT,
28 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430), 435 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
29}; 436};
30 437
@@ -40,6 +447,8 @@ static struct clockdomain cm_clkdm = {
40 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430), 447 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
41}; 448};
42 449
450#endif
451
43/* 452/*
44 * 2420-only clockdomains 453 * 2420-only clockdomains
45 */ 454 */
@@ -50,6 +459,8 @@ static struct clockdomain mpu_2420_clkdm = {
50 .name = "mpu_clkdm", 459 .name = "mpu_clkdm",
51 .pwrdm = { .name = "mpu_pwrdm" }, 460 .pwrdm = { .name = "mpu_pwrdm" },
52 .flags = CLKDM_CAN_HWSUP, 461 .flags = CLKDM_CAN_HWSUP,
462 .clkstctrl_reg = OMAP2420_CM_REGADDR(MPU_MOD, OMAP2_CM_CLKSTCTRL),
463 .wkdep_srcs = mpu_24xx_wkdeps,
53 .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK, 464 .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK,
54 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420), 465 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
55}; 466};
@@ -58,11 +469,64 @@ static struct clockdomain iva1_2420_clkdm = {
58 .name = "iva1_clkdm", 469 .name = "iva1_clkdm",
59 .pwrdm = { .name = "dsp_pwrdm" }, 470 .pwrdm = { .name = "dsp_pwrdm" },
60 .flags = CLKDM_CAN_HWSUP_SWSUP, 471 .flags = CLKDM_CAN_HWSUP_SWSUP,
472 .clkstctrl_reg = OMAP2420_CM_REGADDR(OMAP24XX_DSP_MOD,
473 OMAP2_CM_CLKSTCTRL),
474 .dep_bit = OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT,
475 .wkdep_srcs = dsp_24xx_wkdeps,
61 .clktrctrl_mask = OMAP2420_AUTOSTATE_IVA_MASK, 476 .clktrctrl_mask = OMAP2420_AUTOSTATE_IVA_MASK,
62 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420), 477 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
63}; 478};
64 479
65#endif /* CONFIG_ARCH_OMAP2420 */ 480static struct clockdomain dsp_2420_clkdm = {
481 .name = "dsp_clkdm",
482 .pwrdm = { .name = "dsp_pwrdm" },
483 .flags = CLKDM_CAN_HWSUP_SWSUP,
484 .clkstctrl_reg = OMAP2420_CM_REGADDR(OMAP24XX_DSP_MOD,
485 OMAP2_CM_CLKSTCTRL),
486 .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK,
487 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
488};
489
490static struct clockdomain gfx_2420_clkdm = {
491 .name = "gfx_clkdm",
492 .pwrdm = { .name = "gfx_pwrdm" },
493 .flags = CLKDM_CAN_HWSUP_SWSUP,
494 .clkstctrl_reg = OMAP2420_CM_REGADDR(GFX_MOD, OMAP2_CM_CLKSTCTRL),
495 .wkdep_srcs = gfx_sgx_wkdeps,
496 .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK,
497 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
498};
499
500static struct clockdomain core_l3_2420_clkdm = {
501 .name = "core_l3_clkdm",
502 .pwrdm = { .name = "core_pwrdm" },
503 .flags = CLKDM_CAN_HWSUP,
504 .clkstctrl_reg = OMAP2420_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
505 .wkdep_srcs = core_24xx_wkdeps,
506 .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK,
507 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
508};
509
510static struct clockdomain core_l4_2420_clkdm = {
511 .name = "core_l4_clkdm",
512 .pwrdm = { .name = "core_pwrdm" },
513 .flags = CLKDM_CAN_HWSUP,
514 .clkstctrl_reg = OMAP2420_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
515 .wkdep_srcs = core_24xx_wkdeps,
516 .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK,
517 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
518};
519
520static struct clockdomain dss_2420_clkdm = {
521 .name = "dss_clkdm",
522 .pwrdm = { .name = "core_pwrdm" },
523 .flags = CLKDM_CAN_HWSUP,
524 .clkstctrl_reg = OMAP2420_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
525 .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK,
526 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
527};
528
529#endif /* CONFIG_ARCH_OMAP2420 */
66 530
67 531
68/* 532/*
@@ -75,80 +539,105 @@ static struct clockdomain mpu_2430_clkdm = {
75 .name = "mpu_clkdm", 539 .name = "mpu_clkdm",
76 .pwrdm = { .name = "mpu_pwrdm" }, 540 .pwrdm = { .name = "mpu_pwrdm" },
77 .flags = CLKDM_CAN_HWSUP_SWSUP, 541 .flags = CLKDM_CAN_HWSUP_SWSUP,
542 .clkstctrl_reg = OMAP2430_CM_REGADDR(MPU_MOD,
543 OMAP2_CM_CLKSTCTRL),
544 .wkdep_srcs = mpu_24xx_wkdeps,
78 .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK, 545 .clktrctrl_mask = OMAP24XX_AUTOSTATE_MPU_MASK,
79 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430), 546 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
80}; 547};
81 548
549/* Another case of bit name collisions between several registers: EN_MDM */
82static struct clockdomain mdm_clkdm = { 550static struct clockdomain mdm_clkdm = {
83 .name = "mdm_clkdm", 551 .name = "mdm_clkdm",
84 .pwrdm = { .name = "mdm_pwrdm" }, 552 .pwrdm = { .name = "mdm_pwrdm" },
85 .flags = CLKDM_CAN_HWSUP_SWSUP, 553 .flags = CLKDM_CAN_HWSUP_SWSUP,
554 .clkstctrl_reg = OMAP2430_CM_REGADDR(OMAP2430_MDM_MOD,
555 OMAP2_CM_CLKSTCTRL),
556 .dep_bit = OMAP2430_PM_WKDEP_MPU_EN_MDM_SHIFT,
557 .wkdep_srcs = mdm_2430_wkdeps,
86 .clktrctrl_mask = OMAP2430_AUTOSTATE_MDM_MASK, 558 .clktrctrl_mask = OMAP2430_AUTOSTATE_MDM_MASK,
87 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430), 559 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
88}; 560};
89 561
90#endif /* CONFIG_ARCH_OMAP2430 */ 562static struct clockdomain dsp_2430_clkdm = {
91
92
93/*
94 * 24XX-only clockdomains
95 */
96
97#if defined(CONFIG_ARCH_OMAP24XX)
98
99static struct clockdomain dsp_clkdm = {
100 .name = "dsp_clkdm", 563 .name = "dsp_clkdm",
101 .pwrdm = { .name = "dsp_pwrdm" }, 564 .pwrdm = { .name = "dsp_pwrdm" },
102 .flags = CLKDM_CAN_HWSUP_SWSUP, 565 .flags = CLKDM_CAN_HWSUP_SWSUP,
566 .clkstctrl_reg = OMAP2430_CM_REGADDR(OMAP24XX_DSP_MOD,
567 OMAP2_CM_CLKSTCTRL),
568 .dep_bit = OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT,
569 .wkdep_srcs = dsp_24xx_wkdeps,
103 .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK, 570 .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSP_MASK,
104 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX), 571 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
105}; 572};
106 573
107static struct clockdomain gfx_24xx_clkdm = { 574static struct clockdomain gfx_2430_clkdm = {
108 .name = "gfx_clkdm", 575 .name = "gfx_clkdm",
109 .pwrdm = { .name = "gfx_pwrdm" }, 576 .pwrdm = { .name = "gfx_pwrdm" },
110 .flags = CLKDM_CAN_HWSUP_SWSUP, 577 .flags = CLKDM_CAN_HWSUP_SWSUP,
578 .clkstctrl_reg = OMAP2430_CM_REGADDR(GFX_MOD, OMAP2_CM_CLKSTCTRL),
579 .wkdep_srcs = gfx_sgx_wkdeps,
111 .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK, 580 .clktrctrl_mask = OMAP24XX_AUTOSTATE_GFX_MASK,
112 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX), 581 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
113}; 582};
114 583
115static struct clockdomain core_l3_24xx_clkdm = { 584/*
585 * XXX add usecounting for clkdm dependencies, otherwise the presence
586 * of a single dep bit for core_l3_24xx_clkdm and core_l4_24xx_clkdm
587 * could cause trouble
588 */
589static struct clockdomain core_l3_2430_clkdm = {
116 .name = "core_l3_clkdm", 590 .name = "core_l3_clkdm",
117 .pwrdm = { .name = "core_pwrdm" }, 591 .pwrdm = { .name = "core_pwrdm" },
118 .flags = CLKDM_CAN_HWSUP, 592 .flags = CLKDM_CAN_HWSUP,
593 .clkstctrl_reg = OMAP2430_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
594 .dep_bit = OMAP24XX_EN_CORE_SHIFT,
595 .wkdep_srcs = core_24xx_wkdeps,
119 .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK, 596 .clktrctrl_mask = OMAP24XX_AUTOSTATE_L3_MASK,
120 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX), 597 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
121}; 598};
122 599
123static struct clockdomain core_l4_24xx_clkdm = { 600/*
601 * XXX add usecounting for clkdm dependencies, otherwise the presence
602 * of a single dep bit for core_l3_24xx_clkdm and core_l4_24xx_clkdm
603 * could cause trouble
604 */
605static struct clockdomain core_l4_2430_clkdm = {
124 .name = "core_l4_clkdm", 606 .name = "core_l4_clkdm",
125 .pwrdm = { .name = "core_pwrdm" }, 607 .pwrdm = { .name = "core_pwrdm" },
126 .flags = CLKDM_CAN_HWSUP, 608 .flags = CLKDM_CAN_HWSUP,
609 .clkstctrl_reg = OMAP2430_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
610 .dep_bit = OMAP24XX_EN_CORE_SHIFT,
611 .wkdep_srcs = core_24xx_wkdeps,
127 .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK, 612 .clktrctrl_mask = OMAP24XX_AUTOSTATE_L4_MASK,
128 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX), 613 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
129}; 614};
130 615
131static struct clockdomain dss_24xx_clkdm = { 616static struct clockdomain dss_2430_clkdm = {
132 .name = "dss_clkdm", 617 .name = "dss_clkdm",
133 .pwrdm = { .name = "core_pwrdm" }, 618 .pwrdm = { .name = "core_pwrdm" },
134 .flags = CLKDM_CAN_HWSUP, 619 .flags = CLKDM_CAN_HWSUP,
620 .clkstctrl_reg = OMAP2430_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
135 .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK, 621 .clktrctrl_mask = OMAP24XX_AUTOSTATE_DSS_MASK,
136 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX), 622 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
137}; 623};
138 624
139#endif /* CONFIG_ARCH_OMAP24XX */ 625#endif /* CONFIG_ARCH_OMAP2430 */
140 626
141 627
142/* 628/*
143 * 34xx clockdomains 629 * OMAP3 clockdomains
144 */ 630 */
145 631
146#if defined(CONFIG_ARCH_OMAP34XX) 632#if defined(CONFIG_ARCH_OMAP3)
147 633
148static struct clockdomain mpu_34xx_clkdm = { 634static struct clockdomain mpu_3xxx_clkdm = {
149 .name = "mpu_clkdm", 635 .name = "mpu_clkdm",
150 .pwrdm = { .name = "mpu_pwrdm" }, 636 .pwrdm = { .name = "mpu_pwrdm" },
151 .flags = CLKDM_CAN_HWSUP | CLKDM_CAN_FORCE_WAKEUP, 637 .flags = CLKDM_CAN_HWSUP | CLKDM_CAN_FORCE_WAKEUP,
638 .clkstctrl_reg = OMAP34XX_CM_REGADDR(MPU_MOD, OMAP2_CM_CLKSTCTRL),
639 .dep_bit = OMAP3430_EN_MPU_SHIFT,
640 .wkdep_srcs = mpu_3xxx_wkdeps,
152 .clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK, 641 .clktrctrl_mask = OMAP3430_CLKTRCTRL_MPU_MASK,
153 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), 642 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
154}; 643};
@@ -157,6 +646,9 @@ static struct clockdomain neon_clkdm = {
157 .name = "neon_clkdm", 646 .name = "neon_clkdm",
158 .pwrdm = { .name = "neon_pwrdm" }, 647 .pwrdm = { .name = "neon_pwrdm" },
159 .flags = CLKDM_CAN_HWSUP_SWSUP, 648 .flags = CLKDM_CAN_HWSUP_SWSUP,
649 .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_NEON_MOD,
650 OMAP2_CM_CLKSTCTRL),
651 .wkdep_srcs = neon_wkdeps,
160 .clktrctrl_mask = OMAP3430_CLKTRCTRL_NEON_MASK, 652 .clktrctrl_mask = OMAP3430_CLKTRCTRL_NEON_MASK,
161 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), 653 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
162}; 654};
@@ -165,6 +657,10 @@ static struct clockdomain iva2_clkdm = {
165 .name = "iva2_clkdm", 657 .name = "iva2_clkdm",
166 .pwrdm = { .name = "iva2_pwrdm" }, 658 .pwrdm = { .name = "iva2_pwrdm" },
167 .flags = CLKDM_CAN_HWSUP_SWSUP, 659 .flags = CLKDM_CAN_HWSUP_SWSUP,
660 .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_IVA2_MOD,
661 OMAP2_CM_CLKSTCTRL),
662 .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_IVA2_SHIFT,
663 .wkdep_srcs = iva2_wkdeps,
168 .clktrctrl_mask = OMAP3430_CLKTRCTRL_IVA2_MASK, 664 .clktrctrl_mask = OMAP3430_CLKTRCTRL_IVA2_MASK,
169 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), 665 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
170}; 666};
@@ -173,6 +669,9 @@ static struct clockdomain gfx_3430es1_clkdm = {
173 .name = "gfx_clkdm", 669 .name = "gfx_clkdm",
174 .pwrdm = { .name = "gfx_pwrdm" }, 670 .pwrdm = { .name = "gfx_pwrdm" },
175 .flags = CLKDM_CAN_HWSUP_SWSUP, 671 .flags = CLKDM_CAN_HWSUP_SWSUP,
672 .clkstctrl_reg = OMAP34XX_CM_REGADDR(GFX_MOD, OMAP2_CM_CLKSTCTRL),
673 .wkdep_srcs = gfx_sgx_wkdeps,
674 .sleepdep_srcs = gfx_sgx_sleepdeps,
176 .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_GFX_MASK, 675 .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_GFX_MASK,
177 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES1), 676 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES1),
178}; 677};
@@ -181,6 +680,10 @@ static struct clockdomain sgx_clkdm = {
181 .name = "sgx_clkdm", 680 .name = "sgx_clkdm",
182 .pwrdm = { .name = "sgx_pwrdm" }, 681 .pwrdm = { .name = "sgx_pwrdm" },
183 .flags = CLKDM_CAN_HWSUP_SWSUP, 682 .flags = CLKDM_CAN_HWSUP_SWSUP,
683 .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430ES2_SGX_MOD,
684 OMAP2_CM_CLKSTCTRL),
685 .wkdep_srcs = gfx_sgx_wkdeps,
686 .sleepdep_srcs = gfx_sgx_sleepdeps,
184 .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK, 687 .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_SGX_MASK,
185 .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2), 688 .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
186}; 689};
@@ -196,30 +699,51 @@ static struct clockdomain d2d_clkdm = {
196 .name = "d2d_clkdm", 699 .name = "d2d_clkdm",
197 .pwrdm = { .name = "core_pwrdm" }, 700 .pwrdm = { .name = "core_pwrdm" },
198 .flags = CLKDM_CAN_HWSUP_SWSUP, 701 .flags = CLKDM_CAN_HWSUP_SWSUP,
702 .clkstctrl_reg = OMAP34XX_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
199 .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_D2D_MASK, 703 .clktrctrl_mask = OMAP3430ES1_CLKTRCTRL_D2D_MASK,
200 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), 704 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
201}; 705};
202 706
203static struct clockdomain core_l3_34xx_clkdm = { 707/*
708 * XXX add usecounting for clkdm dependencies, otherwise the presence
709 * of a single dep bit for core_l3_3xxx_clkdm and core_l4_3xxx_clkdm
710 * could cause trouble
711 */
712static struct clockdomain core_l3_3xxx_clkdm = {
204 .name = "core_l3_clkdm", 713 .name = "core_l3_clkdm",
205 .pwrdm = { .name = "core_pwrdm" }, 714 .pwrdm = { .name = "core_pwrdm" },
206 .flags = CLKDM_CAN_HWSUP, 715 .flags = CLKDM_CAN_HWSUP,
716 .clkstctrl_reg = OMAP34XX_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
717 .dep_bit = OMAP3430_EN_CORE_SHIFT,
207 .clktrctrl_mask = OMAP3430_CLKTRCTRL_L3_MASK, 718 .clktrctrl_mask = OMAP3430_CLKTRCTRL_L3_MASK,
208 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), 719 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
209}; 720};
210 721
211static struct clockdomain core_l4_34xx_clkdm = { 722/*
723 * XXX add usecounting for clkdm dependencies, otherwise the presence
724 * of a single dep bit for core_l3_3xxx_clkdm and core_l4_3xxx_clkdm
725 * could cause trouble
726 */
727static struct clockdomain core_l4_3xxx_clkdm = {
212 .name = "core_l4_clkdm", 728 .name = "core_l4_clkdm",
213 .pwrdm = { .name = "core_pwrdm" }, 729 .pwrdm = { .name = "core_pwrdm" },
214 .flags = CLKDM_CAN_HWSUP, 730 .flags = CLKDM_CAN_HWSUP,
731 .clkstctrl_reg = OMAP34XX_CM_REGADDR(CORE_MOD, OMAP2_CM_CLKSTCTRL),
732 .dep_bit = OMAP3430_EN_CORE_SHIFT,
215 .clktrctrl_mask = OMAP3430_CLKTRCTRL_L4_MASK, 733 .clktrctrl_mask = OMAP3430_CLKTRCTRL_L4_MASK,
216 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), 734 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
217}; 735};
218 736
219static struct clockdomain dss_34xx_clkdm = { 737/* Another case of bit name collisions between several registers: EN_DSS */
738static struct clockdomain dss_3xxx_clkdm = {
220 .name = "dss_clkdm", 739 .name = "dss_clkdm",
221 .pwrdm = { .name = "dss_pwrdm" }, 740 .pwrdm = { .name = "dss_pwrdm" },
222 .flags = CLKDM_CAN_HWSUP_SWSUP, 741 .flags = CLKDM_CAN_HWSUP_SWSUP,
742 .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_DSS_MOD,
743 OMAP2_CM_CLKSTCTRL),
744 .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT,
745 .wkdep_srcs = dss_wkdeps,
746 .sleepdep_srcs = dss_sleepdeps,
223 .clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK, 747 .clktrctrl_mask = OMAP3430_CLKTRCTRL_DSS_MASK,
224 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), 748 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
225}; 749};
@@ -228,6 +752,10 @@ static struct clockdomain cam_clkdm = {
228 .name = "cam_clkdm", 752 .name = "cam_clkdm",
229 .pwrdm = { .name = "cam_pwrdm" }, 753 .pwrdm = { .name = "cam_pwrdm" },
230 .flags = CLKDM_CAN_HWSUP_SWSUP, 754 .flags = CLKDM_CAN_HWSUP_SWSUP,
755 .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_CAM_MOD,
756 OMAP2_CM_CLKSTCTRL),
757 .wkdep_srcs = cam_wkdeps,
758 .sleepdep_srcs = cam_sleepdeps,
231 .clktrctrl_mask = OMAP3430_CLKTRCTRL_CAM_MASK, 759 .clktrctrl_mask = OMAP3430_CLKTRCTRL_CAM_MASK,
232 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), 760 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
233}; 761};
@@ -236,6 +764,10 @@ static struct clockdomain usbhost_clkdm = {
236 .name = "usbhost_clkdm", 764 .name = "usbhost_clkdm",
237 .pwrdm = { .name = "usbhost_pwrdm" }, 765 .pwrdm = { .name = "usbhost_pwrdm" },
238 .flags = CLKDM_CAN_HWSUP_SWSUP, 766 .flags = CLKDM_CAN_HWSUP_SWSUP,
767 .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430ES2_USBHOST_MOD,
768 OMAP2_CM_CLKSTCTRL),
769 .wkdep_srcs = usbhost_wkdeps,
770 .sleepdep_srcs = usbhost_sleepdeps,
239 .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK, 771 .clktrctrl_mask = OMAP3430ES2_CLKTRCTRL_USBHOST_MASK,
240 .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2), 772 .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
241}; 773};
@@ -244,6 +776,11 @@ static struct clockdomain per_clkdm = {
244 .name = "per_clkdm", 776 .name = "per_clkdm",
245 .pwrdm = { .name = "per_pwrdm" }, 777 .pwrdm = { .name = "per_pwrdm" },
246 .flags = CLKDM_CAN_HWSUP_SWSUP, 778 .flags = CLKDM_CAN_HWSUP_SWSUP,
779 .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_PER_MOD,
780 OMAP2_CM_CLKSTCTRL),
781 .dep_bit = OMAP3430_EN_PER_SHIFT,
782 .wkdep_srcs = per_wkdeps,
783 .sleepdep_srcs = per_sleepdeps,
247 .clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK, 784 .clktrctrl_mask = OMAP3430_CLKTRCTRL_PER_MASK,
248 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), 785 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
249}; 786};
@@ -256,6 +793,8 @@ static struct clockdomain emu_clkdm = {
256 .name = "emu_clkdm", 793 .name = "emu_clkdm",
257 .pwrdm = { .name = "emu_pwrdm" }, 794 .pwrdm = { .name = "emu_pwrdm" },
258 .flags = /* CLKDM_CAN_ENABLE_AUTO | */CLKDM_CAN_SWSUP, 795 .flags = /* CLKDM_CAN_ENABLE_AUTO | */CLKDM_CAN_SWSUP,
796 .clkstctrl_reg = OMAP34XX_CM_REGADDR(OMAP3430_EMU_MOD,
797 OMAP2_CM_CLKSTCTRL),
259 .clktrctrl_mask = OMAP3430_CLKTRCTRL_EMU_MASK, 798 .clktrctrl_mask = OMAP3430_CLKTRCTRL_EMU_MASK,
260 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), 799 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
261}; 800};
@@ -290,64 +829,70 @@ static struct clockdomain dpll5_clkdm = {
290 .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2), 829 .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
291}; 830};
292 831
293#endif /* CONFIG_ARCH_OMAP34XX */ 832#endif /* CONFIG_ARCH_OMAP3 */
833
834#include "clockdomains44xx.h"
294 835
295/* 836/*
296 * Clockdomain-powerdomain hwsup dependencies (34XX only) 837 * Clockdomain hwsup dependencies (OMAP3 only)
297 */ 838 */
298 839
299static struct clkdm_pwrdm_autodep clkdm_pwrdm_autodeps[] = { 840static struct clkdm_autodep clkdm_autodeps[] = {
300 { 841 {
301 .pwrdm = { .name = "mpu_pwrdm" }, 842 .clkdm = { .name = "mpu_clkdm" },
302 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430) 843 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
303 }, 844 },
304 { 845 {
305 .pwrdm = { .name = "iva2_pwrdm" }, 846 .clkdm = { .name = "iva2_clkdm" },
306 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430) 847 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
307 }, 848 },
308 { 849 {
309 .pwrdm = { .name = NULL }, 850 .clkdm = { .name = NULL },
310 } 851 }
311}; 852};
312 853
313/* 854/*
314 * 855 * List of clockdomain pointers per platform
315 */ 856 */
316 857
317static struct clockdomain *clockdomains_omap[] = { 858static struct clockdomain *clockdomains_omap[] = {
318 859
860#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
319 &wkup_clkdm, 861 &wkup_clkdm,
320 &cm_clkdm, 862 &cm_clkdm,
321 &prm_clkdm, 863 &prm_clkdm,
864#endif
322 865
323#ifdef CONFIG_ARCH_OMAP2420 866#ifdef CONFIG_ARCH_OMAP2420
324 &mpu_2420_clkdm, 867 &mpu_2420_clkdm,
325 &iva1_2420_clkdm, 868 &iva1_2420_clkdm,
869 &dsp_2420_clkdm,
870 &gfx_2420_clkdm,
871 &core_l3_2420_clkdm,
872 &core_l4_2420_clkdm,
873 &dss_2420_clkdm,
326#endif 874#endif
327 875
328#ifdef CONFIG_ARCH_OMAP2430 876#ifdef CONFIG_ARCH_OMAP2430
329 &mpu_2430_clkdm, 877 &mpu_2430_clkdm,
330 &mdm_clkdm, 878 &mdm_clkdm,
879 &dsp_2430_clkdm,
880 &gfx_2430_clkdm,
881 &core_l3_2430_clkdm,
882 &core_l4_2430_clkdm,
883 &dss_2430_clkdm,
331#endif 884#endif
332 885
333#ifdef CONFIG_ARCH_OMAP24XX 886#ifdef CONFIG_ARCH_OMAP3
334 &dsp_clkdm, 887 &mpu_3xxx_clkdm,
335 &gfx_24xx_clkdm,
336 &core_l3_24xx_clkdm,
337 &core_l4_24xx_clkdm,
338 &dss_24xx_clkdm,
339#endif
340
341#ifdef CONFIG_ARCH_OMAP34XX
342 &mpu_34xx_clkdm,
343 &neon_clkdm, 888 &neon_clkdm,
344 &iva2_clkdm, 889 &iva2_clkdm,
345 &gfx_3430es1_clkdm, 890 &gfx_3430es1_clkdm,
346 &sgx_clkdm, 891 &sgx_clkdm,
347 &d2d_clkdm, 892 &d2d_clkdm,
348 &core_l3_34xx_clkdm, 893 &core_l3_3xxx_clkdm,
349 &core_l4_34xx_clkdm, 894 &core_l4_3xxx_clkdm,
350 &dss_34xx_clkdm, 895 &dss_3xxx_clkdm,
351 &cam_clkdm, 896 &cam_clkdm,
352 &usbhost_clkdm, 897 &usbhost_clkdm,
353 &per_clkdm, 898 &per_clkdm,
@@ -359,6 +904,33 @@ static struct clockdomain *clockdomains_omap[] = {
359 &dpll5_clkdm, 904 &dpll5_clkdm,
360#endif 905#endif
361 906
907#ifdef CONFIG_ARCH_OMAP4
908 &l4_cefuse_44xx_clkdm,
909 &l4_cfg_44xx_clkdm,
910 &tesla_44xx_clkdm,
911 &l3_gfx_44xx_clkdm,
912 &ivahd_44xx_clkdm,
913 &l4_secure_44xx_clkdm,
914 &l4_per_44xx_clkdm,
915 &abe_44xx_clkdm,
916 &l3_instr_44xx_clkdm,
917 &l3_init_44xx_clkdm,
918 &mpuss_44xx_clkdm,
919 &mpu0_44xx_clkdm,
920 &mpu1_44xx_clkdm,
921 &l3_emif_44xx_clkdm,
922 &l4_ao_44xx_clkdm,
923 &ducati_44xx_clkdm,
924 &l3_2_44xx_clkdm,
925 &l3_1_44xx_clkdm,
926 &l3_d2d_44xx_clkdm,
927 &iss_44xx_clkdm,
928 &l3_dss_44xx_clkdm,
929 &l4_wkup_44xx_clkdm,
930 &emu_sys_44xx_clkdm,
931 &l3_dma_44xx_clkdm,
932#endif
933
362 NULL, 934 NULL,
363}; 935};
364 936
diff --git a/arch/arm/mach-omap2/clockdomains44xx.h b/arch/arm/mach-omap2/clockdomains44xx.h
new file mode 100644
index 000000000000..438aaee2e392
--- /dev/null
+++ b/arch/arm/mach-omap2/clockdomains44xx.h
@@ -0,0 +1,250 @@
1/*
2 * OMAP4 Clock domains framework
3 *
4 * Copyright (C) 2009 Texas Instruments, Inc.
5 * Copyright (C) 2009 Nokia Corporation
6 *
7 * Abhijit Pagare (abhijitpagare@ti.com)
8 * Benoit Cousson (b-cousson@ti.com)
9 *
10 * This file is automatically generated from the OMAP hardware databases.
11 * We respectfully ask that any modifications to this file be coordinated
12 * with the public linux-omap@vger.kernel.org mailing list and the
13 * authors above to ensure that the autogeneration scripts are kept
14 * up-to-date with the file contents.
15 *
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License version 2 as
18 * published by the Free Software Foundation.
19 */
20
21/*
22 * To-Do List
23 * -> Populate the Sleep/Wakeup dependencies for the domains
24 */
25
26#ifndef __ARCH_ARM_MACH_OMAP2_CLOCKDOMAINS44XX_H
27#define __ARCH_ARM_MACH_OMAP2_CLOCKDOMAINS44XX_H
28
29#include <plat/clockdomain.h>
30
31#if defined(CONFIG_ARCH_OMAP4)
32
33static struct clockdomain l4_cefuse_44xx_clkdm = {
34 .name = "l4_cefuse_clkdm",
35 .pwrdm = { .name = "cefuse_pwrdm" },
36 .clkstctrl_reg = OMAP4430_CM_CEFUSE_CLKSTCTRL,
37 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
38 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
39 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
40};
41
42static struct clockdomain l4_cfg_44xx_clkdm = {
43 .name = "l4_cfg_clkdm",
44 .pwrdm = { .name = "core_pwrdm" },
45 .clkstctrl_reg = OMAP4430_CM_L4CFG_CLKSTCTRL,
46 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
47 .flags = CLKDM_CAN_HWSUP,
48 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
49};
50
51static struct clockdomain tesla_44xx_clkdm = {
52 .name = "tesla_clkdm",
53 .pwrdm = { .name = "tesla_pwrdm" },
54 .clkstctrl_reg = OMAP4430_CM_TESLA_CLKSTCTRL,
55 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
56 .flags = CLKDM_CAN_HWSUP_SWSUP,
57 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
58};
59
60static struct clockdomain l3_gfx_44xx_clkdm = {
61 .name = "l3_gfx_clkdm",
62 .pwrdm = { .name = "gfx_pwrdm" },
63 .clkstctrl_reg = OMAP4430_CM_GFX_CLKSTCTRL,
64 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
65 .flags = CLKDM_CAN_HWSUP_SWSUP,
66 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
67};
68
69static struct clockdomain ivahd_44xx_clkdm = {
70 .name = "ivahd_clkdm",
71 .pwrdm = { .name = "ivahd_pwrdm" },
72 .clkstctrl_reg = OMAP4430_CM_IVAHD_CLKSTCTRL,
73 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
74 .flags = CLKDM_CAN_HWSUP_SWSUP,
75 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
76};
77
78static struct clockdomain l4_secure_44xx_clkdm = {
79 .name = "l4_secure_clkdm",
80 .pwrdm = { .name = "l4per_pwrdm" },
81 .clkstctrl_reg = OMAP4430_CM_L4SEC_CLKSTCTRL,
82 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
83 .flags = CLKDM_CAN_HWSUP_SWSUP,
84 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
85};
86
87static struct clockdomain l4_per_44xx_clkdm = {
88 .name = "l4_per_clkdm",
89 .pwrdm = { .name = "l4per_pwrdm" },
90 .clkstctrl_reg = OMAP4430_CM_L4PER_CLKSTCTRL,
91 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
92 .flags = CLKDM_CAN_HWSUP_SWSUP,
93 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
94};
95
96static struct clockdomain abe_44xx_clkdm = {
97 .name = "abe_clkdm",
98 .pwrdm = { .name = "abe_pwrdm" },
99 .clkstctrl_reg = OMAP4430_CM1_ABE_CLKSTCTRL,
100 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
101 .flags = CLKDM_CAN_HWSUP_SWSUP,
102 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
103};
104
105static struct clockdomain l3_instr_44xx_clkdm = {
106 .name = "l3_instr_clkdm",
107 .pwrdm = { .name = "core_pwrdm" },
108 .clkstctrl_reg = OMAP4430_CM_L3INSTR_CLKSTCTRL,
109 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
110 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
111};
112
113static struct clockdomain l3_init_44xx_clkdm = {
114 .name = "l3_init_clkdm",
115 .pwrdm = { .name = "l3init_pwrdm" },
116 .clkstctrl_reg = OMAP4430_CM_L3INIT_CLKSTCTRL,
117 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
118 .flags = CLKDM_CAN_HWSUP_SWSUP,
119 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
120};
121
122static struct clockdomain mpuss_44xx_clkdm = {
123 .name = "mpuss_clkdm",
124 .pwrdm = { .name = "mpu_pwrdm" },
125 .clkstctrl_reg = OMAP4430_CM_MPU_CLKSTCTRL,
126 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
127 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
128 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
129};
130
131static struct clockdomain mpu0_44xx_clkdm = {
132 .name = "mpu0_clkdm",
133 .pwrdm = { .name = "cpu0_pwrdm" },
134 .clkstctrl_reg = OMAP4430_CM_PDA_CPU0_CLKSTCTRL,
135 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
136 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
137 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
138};
139
140static struct clockdomain mpu1_44xx_clkdm = {
141 .name = "mpu1_clkdm",
142 .pwrdm = { .name = "cpu1_pwrdm" },
143 .clkstctrl_reg = OMAP4430_CM_PDA_CPU1_CLKSTCTRL,
144 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
145 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
146 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
147};
148
149static struct clockdomain l3_emif_44xx_clkdm = {
150 .name = "l3_emif_clkdm",
151 .pwrdm = { .name = "core_pwrdm" },
152 .clkstctrl_reg = OMAP4430_CM_MEMIF_CLKSTCTRL,
153 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
154 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
155 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
156};
157
158static struct clockdomain l4_ao_44xx_clkdm = {
159 .name = "l4_ao_clkdm",
160 .pwrdm = { .name = "always_on_core_pwrdm" },
161 .clkstctrl_reg = OMAP4430_CM_ALWON_CLKSTCTRL,
162 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
163 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
164 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
165};
166
167static struct clockdomain ducati_44xx_clkdm = {
168 .name = "ducati_clkdm",
169 .pwrdm = { .name = "core_pwrdm" },
170 .clkstctrl_reg = OMAP4430_CM_DUCATI_CLKSTCTRL,
171 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
172 .flags = CLKDM_CAN_HWSUP_SWSUP,
173 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
174};
175
176static struct clockdomain l3_2_44xx_clkdm = {
177 .name = "l3_2_clkdm",
178 .pwrdm = { .name = "core_pwrdm" },
179 .clkstctrl_reg = OMAP4430_CM_L3_2_CLKSTCTRL,
180 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
181 .flags = CLKDM_CAN_HWSUP,
182 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
183};
184
185static struct clockdomain l3_1_44xx_clkdm = {
186 .name = "l3_1_clkdm",
187 .pwrdm = { .name = "core_pwrdm" },
188 .clkstctrl_reg = OMAP4430_CM_L3_1_CLKSTCTRL,
189 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
190 .flags = CLKDM_CAN_HWSUP,
191 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
192};
193
194static struct clockdomain l3_d2d_44xx_clkdm = {
195 .name = "l3_d2d_clkdm",
196 .pwrdm = { .name = "core_pwrdm" },
197 .clkstctrl_reg = OMAP4430_CM_D2D_CLKSTCTRL,
198 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
199 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
200 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
201};
202
203static struct clockdomain iss_44xx_clkdm = {
204 .name = "iss_clkdm",
205 .pwrdm = { .name = "cam_pwrdm" },
206 .clkstctrl_reg = OMAP4430_CM_CAM_CLKSTCTRL,
207 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
208 .flags = CLKDM_CAN_HWSUP_SWSUP,
209 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
210};
211
212static struct clockdomain l3_dss_44xx_clkdm = {
213 .name = "l3_dss_clkdm",
214 .pwrdm = { .name = "dss_pwrdm" },
215 .clkstctrl_reg = OMAP4430_CM_DSS_CLKSTCTRL,
216 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
217 .flags = CLKDM_CAN_HWSUP_SWSUP,
218 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
219};
220
221static struct clockdomain l4_wkup_44xx_clkdm = {
222 .name = "l4_wkup_clkdm",
223 .pwrdm = { .name = "wkup_pwrdm" },
224 .clkstctrl_reg = OMAP4430_CM_WKUP_CLKSTCTRL,
225 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
226 .flags = CLKDM_CAN_HWSUP,
227 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
228};
229
230static struct clockdomain emu_sys_44xx_clkdm = {
231 .name = "emu_sys_clkdm",
232 .pwrdm = { .name = "emu_pwrdm" },
233 .clkstctrl_reg = OMAP4430_CM_EMU_CLKSTCTRL,
234 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
235 .flags = CLKDM_CAN_HWSUP,
236 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
237};
238
239static struct clockdomain l3_dma_44xx_clkdm = {
240 .name = "l3_dma_clkdm",
241 .pwrdm = { .name = "core_pwrdm" },
242 .clkstctrl_reg = OMAP4430_CM_SDMA_CLKSTCTRL,
243 .clktrctrl_mask = OMAP4430_CLKTRCTRL_MASK,
244 .flags = CLKDM_CAN_FORCE_WAKEUP | CLKDM_CAN_HWSUP,
245 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
246};
247
248#endif
249
250#endif
diff --git a/arch/arm/mach-omap2/cm-regbits-34xx.h b/arch/arm/mach-omap2/cm-regbits-34xx.h
index 6923deb98a28..a3a3ca07e383 100644
--- a/arch/arm/mach-omap2/cm-regbits-34xx.h
+++ b/arch/arm/mach-omap2/cm-regbits-34xx.h
@@ -55,7 +55,7 @@
55/* Bits specific to each register */ 55/* Bits specific to each register */
56 56
57/* CM_FCLKEN_IVA2 */ 57/* CM_FCLKEN_IVA2 */
58#define OMAP3430_CM_FCLKEN_IVA2_EN_IVA2 (1 << 0) 58#define OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_MASK (1 << 0)
59#define OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT 0 59#define OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT 0
60 60
61/* CM_CLKEN_PLL_IVA2 */ 61/* CM_CLKEN_PLL_IVA2 */
@@ -168,6 +168,12 @@
168#define OMAP3430_EN_SDRC (1 << 1) 168#define OMAP3430_EN_SDRC (1 << 1)
169#define OMAP3430_EN_SDRC_SHIFT 1 169#define OMAP3430_EN_SDRC_SHIFT 1
170 170
171/* AM35XX specific CM_ICLKEN1_CORE bits */
172#define AM35XX_EN_IPSS_MASK (1 << 4)
173#define AM35XX_EN_IPSS_SHIFT 4
174#define AM35XX_EN_UART4_MASK (1 << 23)
175#define AM35XX_EN_UART4_SHIFT 23
176
171/* CM_ICLKEN2_CORE */ 177/* CM_ICLKEN2_CORE */
172#define OMAP3430_EN_PKA (1 << 4) 178#define OMAP3430_EN_PKA (1 << 4)
173#define OMAP3430_EN_PKA_SHIFT 4 179#define OMAP3430_EN_PKA_SHIFT 4
@@ -220,6 +226,10 @@
220#define OMAP3430_ST_SSI_STDBY_SHIFT 0 226#define OMAP3430_ST_SSI_STDBY_SHIFT 0
221#define OMAP3430_ST_SSI_STDBY_MASK (1 << 0) 227#define OMAP3430_ST_SSI_STDBY_MASK (1 << 0)
222 228
229/* AM35xx specific CM_IDLEST1_CORE bits */
230#define AM35XX_ST_IPSS_SHIFT 5
231#define AM35XX_ST_IPSS_MASK (1 << 5)
232
223/* CM_IDLEST2_CORE */ 233/* CM_IDLEST2_CORE */
224#define OMAP3430_ST_PKA_SHIFT 4 234#define OMAP3430_ST_PKA_SHIFT 4
225#define OMAP3430_ST_PKA_MASK (1 << 4) 235#define OMAP3430_ST_PKA_MASK (1 << 4)
@@ -336,6 +346,8 @@
336#define OMAP3430_CLKSEL_L4_MASK (0x3 << 2) 346#define OMAP3430_CLKSEL_L4_MASK (0x3 << 2)
337#define OMAP3430_CLKSEL_L3_SHIFT 0 347#define OMAP3430_CLKSEL_L3_SHIFT 0
338#define OMAP3430_CLKSEL_L3_MASK (0x3 << 0) 348#define OMAP3430_CLKSEL_L3_MASK (0x3 << 0)
349#define OMAP3630_CLKSEL_96M_SHIFT 12
350#define OMAP3630_CLKSEL_96M_MASK (0x3 << 12)
339 351
340/* CM_CLKSTCTRL_CORE */ 352/* CM_CLKSTCTRL_CORE */
341#define OMAP3430ES1_CLKTRCTRL_D2D_SHIFT 4 353#define OMAP3430ES1_CLKTRCTRL_D2D_SHIFT 4
@@ -379,6 +391,10 @@
379#define OMAP3430ES2_CM_FCLKEN_SGX_EN_SGX_SHIFT 1 391#define OMAP3430ES2_CM_FCLKEN_SGX_EN_SGX_SHIFT 1
380#define OMAP3430ES2_CM_FCLKEN_SGX_EN_SGX_MASK (1 << 1) 392#define OMAP3430ES2_CM_FCLKEN_SGX_EN_SGX_MASK (1 << 1)
381 393
394/* CM_IDLEST_SGX */
395#define OMAP3430ES2_ST_SGX_SHIFT 1
396#define OMAP3430ES2_ST_SGX_MASK (1 << 1)
397
382/* CM_ICLKEN_SGX */ 398/* CM_ICLKEN_SGX */
383#define OMAP3430ES2_CM_ICLKEN_SGX_EN_SGX_SHIFT 0 399#define OMAP3430ES2_CM_ICLKEN_SGX_EN_SGX_SHIFT 0
384#define OMAP3430ES2_CM_ICLKEN_SGX_EN_SGX_MASK (1 << 0) 400#define OMAP3430ES2_CM_ICLKEN_SGX_EN_SGX_MASK (1 << 0)
@@ -517,12 +533,18 @@
517/* CM_CLKSEL2_PLL */ 533/* CM_CLKSEL2_PLL */
518#define OMAP3430_PERIPH_DPLL_MULT_SHIFT 8 534#define OMAP3430_PERIPH_DPLL_MULT_SHIFT 8
519#define OMAP3430_PERIPH_DPLL_MULT_MASK (0x7ff << 8) 535#define OMAP3430_PERIPH_DPLL_MULT_MASK (0x7ff << 8)
536#define OMAP3630_PERIPH_DPLL_MULT_MASK (0xfff << 8)
520#define OMAP3430_PERIPH_DPLL_DIV_SHIFT 0 537#define OMAP3430_PERIPH_DPLL_DIV_SHIFT 0
521#define OMAP3430_PERIPH_DPLL_DIV_MASK (0x7f << 0) 538#define OMAP3430_PERIPH_DPLL_DIV_MASK (0x7f << 0)
539#define OMAP3630_PERIPH_DPLL_DCO_SEL_SHIFT 21
540#define OMAP3630_PERIPH_DPLL_DCO_SEL_MASK (0x7 << 21)
541#define OMAP3630_PERIPH_DPLL_SD_DIV_SHIFT 24
542#define OMAP3630_PERIPH_DPLL_SD_DIV_MASK (0xff << 24)
522 543
523/* CM_CLKSEL3_PLL */ 544/* CM_CLKSEL3_PLL */
524#define OMAP3430_DIV_96M_SHIFT 0 545#define OMAP3430_DIV_96M_SHIFT 0
525#define OMAP3430_DIV_96M_MASK (0x1f << 0) 546#define OMAP3430_DIV_96M_MASK (0x1f << 0)
547#define OMAP3630_DIV_96M_MASK (0x3f << 0)
526 548
527/* CM_CLKSEL4_PLL */ 549/* CM_CLKSEL4_PLL */
528#define OMAP3430ES2_PERIPH2_DPLL_MULT_SHIFT 8 550#define OMAP3430ES2_PERIPH2_DPLL_MULT_SHIFT 8
@@ -569,8 +591,10 @@
569/* CM_CLKSEL_DSS */ 591/* CM_CLKSEL_DSS */
570#define OMAP3430_CLKSEL_TV_SHIFT 8 592#define OMAP3430_CLKSEL_TV_SHIFT 8
571#define OMAP3430_CLKSEL_TV_MASK (0x1f << 8) 593#define OMAP3430_CLKSEL_TV_MASK (0x1f << 8)
594#define OMAP3630_CLKSEL_TV_MASK (0x3f << 8)
572#define OMAP3430_CLKSEL_DSS1_SHIFT 0 595#define OMAP3430_CLKSEL_DSS1_SHIFT 0
573#define OMAP3430_CLKSEL_DSS1_MASK (0x1f << 0) 596#define OMAP3430_CLKSEL_DSS1_MASK (0x1f << 0)
597#define OMAP3630_CLKSEL_DSS1_MASK (0x3f << 0)
574 598
575/* CM_SLEEPDEP_DSS specific bits */ 599/* CM_SLEEPDEP_DSS specific bits */
576 600
@@ -598,6 +622,7 @@
598/* CM_CLKSEL_CAM */ 622/* CM_CLKSEL_CAM */
599#define OMAP3430_CLKSEL_CAM_SHIFT 0 623#define OMAP3430_CLKSEL_CAM_SHIFT 0
600#define OMAP3430_CLKSEL_CAM_MASK (0x1f << 0) 624#define OMAP3430_CLKSEL_CAM_MASK (0x1f << 0)
625#define OMAP3630_CLKSEL_CAM_MASK (0x3f << 0)
601 626
602/* CM_SLEEPDEP_CAM specific bits */ 627/* CM_SLEEPDEP_CAM specific bits */
603 628
@@ -693,6 +718,7 @@
693/* CM_CLKSEL1_EMU */ 718/* CM_CLKSEL1_EMU */
694#define OMAP3430_DIV_DPLL4_SHIFT 24 719#define OMAP3430_DIV_DPLL4_SHIFT 24
695#define OMAP3430_DIV_DPLL4_MASK (0x1f << 24) 720#define OMAP3430_DIV_DPLL4_MASK (0x1f << 24)
721#define OMAP3630_DIV_DPLL4_MASK (0x3f << 24)
696#define OMAP3430_DIV_DPLL3_SHIFT 16 722#define OMAP3430_DIV_DPLL3_SHIFT 16
697#define OMAP3430_DIV_DPLL3_MASK (0x1f << 16) 723#define OMAP3430_DIV_DPLL3_MASK (0x1f << 16)
698#define OMAP3430_CLKSEL_TRACECLK_SHIFT 11 724#define OMAP3430_CLKSEL_TRACECLK_SHIFT 11
diff --git a/arch/arm/mach-omap2/cm-regbits-44xx.h b/arch/arm/mach-omap2/cm-regbits-44xx.h
new file mode 100644
index 000000000000..ac8458e43252
--- /dev/null
+++ b/arch/arm/mach-omap2/cm-regbits-44xx.h
@@ -0,0 +1,1474 @@
1/*
2 * OMAP44xx Clock Management register bits
3 *
4 * Copyright (C) 2009 Texas Instruments, Inc.
5 * Copyright (C) 2009 Nokia Corporation
6 *
7 * Paul Walmsley (paul@pwsan.com)
8 * Rajendra Nayak (rnayak@ti.com)
9 * Benoit Cousson (b-cousson@ti.com)
10 *
11 * This file is automatically generated from the OMAP hardware databases.
12 * We respectfully ask that any modifications to this file be coordinated
13 * with the public linux-omap@vger.kernel.org mailing list and the
14 * authors above to ensure that the autogeneration scripts are kept
15 * up-to-date with the file contents.
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License version 2 as
19 * published by the Free Software Foundation.
20 */
21
22#ifndef __ARCH_ARM_MACH_OMAP2_CM_REGBITS_44XX_H
23#define __ARCH_ARM_MACH_OMAP2_CM_REGBITS_44XX_H
24
25#include "cm.h"
26
27
28/* Used by CM_L3_1_DYNAMICDEP, CM_MPU_DYNAMICDEP, CM_TESLA_DYNAMICDEP */
29#define OMAP4430_ABE_DYNDEP_SHIFT 3
30#define OMAP4430_ABE_DYNDEP_MASK BITFIELD(3, 3)
31
32/*
33 * Used by CM_D2D_STATICDEP, CM_DUCATI_STATICDEP, CM_SDMA_STATICDEP,
34 * CM_L3INIT_STATICDEP, CM_SDMA_STATICDEP_RESTORE, CM_MPU_STATICDEP,
35 * CM_TESLA_STATICDEP
36 */
37#define OMAP4430_ABE_STATDEP_SHIFT 3
38#define OMAP4430_ABE_STATDEP_MASK BITFIELD(3, 3)
39
40/* Used by CM_L4CFG_DYNAMICDEP */
41#define OMAP4430_ALWONCORE_DYNDEP_SHIFT 16
42#define OMAP4430_ALWONCORE_DYNDEP_MASK BITFIELD(16, 16)
43
44/* Used by CM_DUCATI_STATICDEP, CM_MPU_STATICDEP, CM_TESLA_STATICDEP */
45#define OMAP4430_ALWONCORE_STATDEP_SHIFT 16
46#define OMAP4430_ALWONCORE_STATDEP_MASK BITFIELD(16, 16)
47
48/*
49 * Used by CM_AUTOIDLE_DPLL_PER, CM_AUTOIDLE_DPLL_UNIPRO, CM_AUTOIDLE_DPLL_USB,
50 * CM_AUTOIDLE_DPLL_CORE_RESTORE, CM_AUTOIDLE_DPLL_ABE, CM_AUTOIDLE_DPLL_CORE,
51 * CM_AUTOIDLE_DPLL_DDRPHY, CM_AUTOIDLE_DPLL_IVA, CM_AUTOIDLE_DPLL_MPU
52 */
53#define OMAP4430_AUTO_DPLL_MODE_SHIFT 0
54#define OMAP4430_AUTO_DPLL_MODE_MASK BITFIELD(0, 2)
55
56/* Used by CM_L4CFG_DYNAMICDEP */
57#define OMAP4430_CEFUSE_DYNDEP_SHIFT 17
58#define OMAP4430_CEFUSE_DYNDEP_MASK BITFIELD(17, 17)
59
60/* Used by CM_DUCATI_STATICDEP, CM_MPU_STATICDEP, CM_TESLA_STATICDEP */
61#define OMAP4430_CEFUSE_STATDEP_SHIFT 17
62#define OMAP4430_CEFUSE_STATDEP_MASK BITFIELD(17, 17)
63
64/* Used by CM1_ABE_CLKSTCTRL */
65#define OMAP4430_CLKACTIVITY_ABE_24M_GFCLK_SHIFT 13
66#define OMAP4430_CLKACTIVITY_ABE_24M_GFCLK_MASK BITFIELD(13, 13)
67
68/* Used by CM1_ABE_CLKSTCTRL */
69#define OMAP4430_CLKACTIVITY_ABE_ALWON_32K_CLK_SHIFT 12
70#define OMAP4430_CLKACTIVITY_ABE_ALWON_32K_CLK_MASK BITFIELD(12, 12)
71
72/* Used by CM_WKUP_CLKSTCTRL */
73#define OMAP4430_CLKACTIVITY_ABE_LP_CLK_SHIFT 9
74#define OMAP4430_CLKACTIVITY_ABE_LP_CLK_MASK BITFIELD(9, 9)
75
76/* Used by CM1_ABE_CLKSTCTRL */
77#define OMAP4430_CLKACTIVITY_ABE_SYSCLK_SHIFT 11
78#define OMAP4430_CLKACTIVITY_ABE_SYSCLK_MASK BITFIELD(11, 11)
79
80/* Used by CM1_ABE_CLKSTCTRL */
81#define OMAP4430_CLKACTIVITY_ABE_X2_CLK_SHIFT 8
82#define OMAP4430_CLKACTIVITY_ABE_X2_CLK_MASK BITFIELD(8, 8)
83
84/* Used by CM_MEMIF_CLKSTCTRL, CM_MEMIF_CLKSTCTRL_RESTORE */
85#define OMAP4430_CLKACTIVITY_ASYNC_DLL_CLK_SHIFT 11
86#define OMAP4430_CLKACTIVITY_ASYNC_DLL_CLK_MASK BITFIELD(11, 11)
87
88/* Used by CM_MEMIF_CLKSTCTRL, CM_MEMIF_CLKSTCTRL_RESTORE */
89#define OMAP4430_CLKACTIVITY_ASYNC_PHY1_CLK_SHIFT 12
90#define OMAP4430_CLKACTIVITY_ASYNC_PHY1_CLK_MASK BITFIELD(12, 12)
91
92/* Used by CM_MEMIF_CLKSTCTRL, CM_MEMIF_CLKSTCTRL_RESTORE */
93#define OMAP4430_CLKACTIVITY_ASYNC_PHY2_CLK_SHIFT 13
94#define OMAP4430_CLKACTIVITY_ASYNC_PHY2_CLK_MASK BITFIELD(13, 13)
95
96/* Used by CM_CAM_CLKSTCTRL */
97#define OMAP4430_CLKACTIVITY_CAM_PHY_CTRL_GCLK_SHIFT 9
98#define OMAP4430_CLKACTIVITY_CAM_PHY_CTRL_GCLK_MASK BITFIELD(9, 9)
99
100/* Used by CM_EMU_CLKSTCTRL */
101#define OMAP4430_CLKACTIVITY_CORE_DPLL_EMU_CLK_SHIFT 9
102#define OMAP4430_CLKACTIVITY_CORE_DPLL_EMU_CLK_MASK BITFIELD(9, 9)
103
104/* Used by CM_CEFUSE_CLKSTCTRL */
105#define OMAP4430_CLKACTIVITY_CUST_EFUSE_SYS_CLK_SHIFT 9
106#define OMAP4430_CLKACTIVITY_CUST_EFUSE_SYS_CLK_MASK BITFIELD(9, 9)
107
108/* Used by CM_MEMIF_CLKSTCTRL, CM_MEMIF_CLKSTCTRL_RESTORE */
109#define OMAP4430_CLKACTIVITY_DLL_CLK_SHIFT 9
110#define OMAP4430_CLKACTIVITY_DLL_CLK_MASK BITFIELD(9, 9)
111
112/* Used by CM_L4PER_CLKSTCTRL, CM_L4PER_CLKSTCTRL_RESTORE */
113#define OMAP4430_CLKACTIVITY_DMT10_GFCLK_SHIFT 9
114#define OMAP4430_CLKACTIVITY_DMT10_GFCLK_MASK BITFIELD(9, 9)
115
116/* Used by CM_L4PER_CLKSTCTRL, CM_L4PER_CLKSTCTRL_RESTORE */
117#define OMAP4430_CLKACTIVITY_DMT11_GFCLK_SHIFT 10
118#define OMAP4430_CLKACTIVITY_DMT11_GFCLK_MASK BITFIELD(10, 10)
119
120/* Used by CM_L4PER_CLKSTCTRL, CM_L4PER_CLKSTCTRL_RESTORE */
121#define OMAP4430_CLKACTIVITY_DMT2_GFCLK_SHIFT 11
122#define OMAP4430_CLKACTIVITY_DMT2_GFCLK_MASK BITFIELD(11, 11)
123
124/* Used by CM_L4PER_CLKSTCTRL, CM_L4PER_CLKSTCTRL_RESTORE */
125#define OMAP4430_CLKACTIVITY_DMT3_GFCLK_SHIFT 12
126#define OMAP4430_CLKACTIVITY_DMT3_GFCLK_MASK BITFIELD(12, 12)
127
128/* Used by CM_L4PER_CLKSTCTRL, CM_L4PER_CLKSTCTRL_RESTORE */
129#define OMAP4430_CLKACTIVITY_DMT4_GFCLK_SHIFT 13
130#define OMAP4430_CLKACTIVITY_DMT4_GFCLK_MASK BITFIELD(13, 13)
131
132/* Used by CM_L4PER_CLKSTCTRL, CM_L4PER_CLKSTCTRL_RESTORE */
133#define OMAP4430_CLKACTIVITY_DMT9_GFCLK_SHIFT 14
134#define OMAP4430_CLKACTIVITY_DMT9_GFCLK_MASK BITFIELD(14, 14)
135
136/* Used by CM_DSS_CLKSTCTRL */
137#define OMAP4430_CLKACTIVITY_DSS_ALWON_SYS_CLK_SHIFT 10
138#define OMAP4430_CLKACTIVITY_DSS_ALWON_SYS_CLK_MASK BITFIELD(10, 10)
139
140/* Used by CM_DSS_CLKSTCTRL */
141#define OMAP4430_CLKACTIVITY_DSS_FCLK_SHIFT 9
142#define OMAP4430_CLKACTIVITY_DSS_FCLK_MASK BITFIELD(9, 9)
143
144/* Used by CM_DUCATI_CLKSTCTRL */
145#define OMAP4430_CLKACTIVITY_DUCATI_GCLK_SHIFT 8
146#define OMAP4430_CLKACTIVITY_DUCATI_GCLK_MASK BITFIELD(8, 8)
147
148/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
149#define OMAP4430_CLKACTIVITY_EMAC_50MHZ_CLK_SHIFT 10
150#define OMAP4430_CLKACTIVITY_EMAC_50MHZ_CLK_MASK BITFIELD(10, 10)
151
152/* Used by CM_EMU_CLKSTCTRL */
153#define OMAP4430_CLKACTIVITY_EMU_SYS_CLK_SHIFT 8
154#define OMAP4430_CLKACTIVITY_EMU_SYS_CLK_MASK BITFIELD(8, 8)
155
156/* Used by CM_CAM_CLKSTCTRL */
157#define OMAP4430_CLKACTIVITY_FDIF_GFCLK_SHIFT 10
158#define OMAP4430_CLKACTIVITY_FDIF_GFCLK_MASK BITFIELD(10, 10)
159
160/* Used by CM_L4PER_CLKSTCTRL, CM_L4PER_CLKSTCTRL_RESTORE */
161#define OMAP4430_CLKACTIVITY_FUNC_12M_GFCLK_SHIFT 15
162#define OMAP4430_CLKACTIVITY_FUNC_12M_GFCLK_MASK BITFIELD(15, 15)
163
164/* Used by CM1_ABE_CLKSTCTRL */
165#define OMAP4430_CLKACTIVITY_FUNC_24M_GFCLK_SHIFT 10
166#define OMAP4430_CLKACTIVITY_FUNC_24M_GFCLK_MASK BITFIELD(10, 10)
167
168/* Used by CM_DSS_CLKSTCTRL */
169#define OMAP4430_CLKACTIVITY_HDMI_PHY_48MHZ_GFCLK_SHIFT 11
170#define OMAP4430_CLKACTIVITY_HDMI_PHY_48MHZ_GFCLK_MASK BITFIELD(11, 11)
171
172/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
173#define OMAP4430_CLKACTIVITY_HSIC_P1_480M_GFCLK_SHIFT 20
174#define OMAP4430_CLKACTIVITY_HSIC_P1_480M_GFCLK_MASK BITFIELD(20, 20)
175
176/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
177#define OMAP4430_CLKACTIVITY_HSIC_P1_GFCLK_SHIFT 26
178#define OMAP4430_CLKACTIVITY_HSIC_P1_GFCLK_MASK BITFIELD(26, 26)
179
180/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
181#define OMAP4430_CLKACTIVITY_HSIC_P2_480M_GFCLK_SHIFT 21
182#define OMAP4430_CLKACTIVITY_HSIC_P2_480M_GFCLK_MASK BITFIELD(21, 21)
183
184/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
185#define OMAP4430_CLKACTIVITY_HSIC_P2_GFCLK_SHIFT 27
186#define OMAP4430_CLKACTIVITY_HSIC_P2_GFCLK_MASK BITFIELD(27, 27)
187
188/* Used by CM_L3INIT_CLKSTCTRL */
189#define OMAP4430_CLKACTIVITY_INIT_32K_GFCLK_SHIFT 31
190#define OMAP4430_CLKACTIVITY_INIT_32K_GFCLK_MASK BITFIELD(31, 31)
191
192/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
193#define OMAP4430_CLKACTIVITY_INIT_48MC_GFCLK_SHIFT 13
194#define OMAP4430_CLKACTIVITY_INIT_48MC_GFCLK_MASK BITFIELD(13, 13)
195
196/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
197#define OMAP4430_CLKACTIVITY_INIT_48M_GFCLK_SHIFT 12
198#define OMAP4430_CLKACTIVITY_INIT_48M_GFCLK_MASK BITFIELD(12, 12)
199
200/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
201#define OMAP4430_CLKACTIVITY_INIT_60M_P1_GFCLK_SHIFT 28
202#define OMAP4430_CLKACTIVITY_INIT_60M_P1_GFCLK_MASK BITFIELD(28, 28)
203
204/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
205#define OMAP4430_CLKACTIVITY_INIT_60M_P2_GFCLK_SHIFT 29
206#define OMAP4430_CLKACTIVITY_INIT_60M_P2_GFCLK_MASK BITFIELD(29, 29)
207
208/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
209#define OMAP4430_CLKACTIVITY_INIT_96M_GFCLK_SHIFT 11
210#define OMAP4430_CLKACTIVITY_INIT_96M_GFCLK_MASK BITFIELD(11, 11)
211
212/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
213#define OMAP4430_CLKACTIVITY_INIT_HSI_GFCLK_SHIFT 16
214#define OMAP4430_CLKACTIVITY_INIT_HSI_GFCLK_MASK BITFIELD(16, 16)
215
216/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
217#define OMAP4430_CLKACTIVITY_INIT_HSMMC1_GFCLK_SHIFT 17
218#define OMAP4430_CLKACTIVITY_INIT_HSMMC1_GFCLK_MASK BITFIELD(17, 17)
219
220/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
221#define OMAP4430_CLKACTIVITY_INIT_HSMMC2_GFCLK_SHIFT 18
222#define OMAP4430_CLKACTIVITY_INIT_HSMMC2_GFCLK_MASK BITFIELD(18, 18)
223
224/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
225#define OMAP4430_CLKACTIVITY_INIT_HSMMC6_GFCLK_SHIFT 19
226#define OMAP4430_CLKACTIVITY_INIT_HSMMC6_GFCLK_MASK BITFIELD(19, 19)
227
228/* Used by CM_CAM_CLKSTCTRL */
229#define OMAP4430_CLKACTIVITY_ISS_GCLK_SHIFT 8
230#define OMAP4430_CLKACTIVITY_ISS_GCLK_MASK BITFIELD(8, 8)
231
232/* Used by CM_IVAHD_CLKSTCTRL */
233#define OMAP4430_CLKACTIVITY_IVAHD_ROOT_CLK_SHIFT 8
234#define OMAP4430_CLKACTIVITY_IVAHD_ROOT_CLK_MASK BITFIELD(8, 8)
235
236/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
237#define OMAP4430_CLKACTIVITY_L3INIT_DPLL_ALWON_CLK_SHIFT 14
238#define OMAP4430_CLKACTIVITY_L3INIT_DPLL_ALWON_CLK_MASK BITFIELD(14, 14)
239
240/* Used by CM_L3_1_CLKSTCTRL, CM_L3_1_CLKSTCTRL_RESTORE */
241#define OMAP4430_CLKACTIVITY_L3_1_GICLK_SHIFT 8
242#define OMAP4430_CLKACTIVITY_L3_1_GICLK_MASK BITFIELD(8, 8)
243
244/* Used by CM_L3_2_CLKSTCTRL, CM_L3_2_CLKSTCTRL_RESTORE */
245#define OMAP4430_CLKACTIVITY_L3_2_GICLK_SHIFT 8
246#define OMAP4430_CLKACTIVITY_L3_2_GICLK_MASK BITFIELD(8, 8)
247
248/* Used by CM_D2D_CLKSTCTRL */
249#define OMAP4430_CLKACTIVITY_L3_D2D_GICLK_SHIFT 8
250#define OMAP4430_CLKACTIVITY_L3_D2D_GICLK_MASK BITFIELD(8, 8)
251
252/* Used by CM_SDMA_CLKSTCTRL */
253#define OMAP4430_CLKACTIVITY_L3_DMA_GICLK_SHIFT 8
254#define OMAP4430_CLKACTIVITY_L3_DMA_GICLK_MASK BITFIELD(8, 8)
255
256/* Used by CM_DSS_CLKSTCTRL */
257#define OMAP4430_CLKACTIVITY_L3_DSS_GICLK_SHIFT 8
258#define OMAP4430_CLKACTIVITY_L3_DSS_GICLK_MASK BITFIELD(8, 8)
259
260/* Used by CM_MEMIF_CLKSTCTRL, CM_MEMIF_CLKSTCTRL_RESTORE */
261#define OMAP4430_CLKACTIVITY_L3_EMIF_GICLK_SHIFT 8
262#define OMAP4430_CLKACTIVITY_L3_EMIF_GICLK_MASK BITFIELD(8, 8)
263
264/* Used by CM_GFX_CLKSTCTRL */
265#define OMAP4430_CLKACTIVITY_L3_GFX_GICLK_SHIFT 8
266#define OMAP4430_CLKACTIVITY_L3_GFX_GICLK_MASK BITFIELD(8, 8)
267
268/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
269#define OMAP4430_CLKACTIVITY_L3_INIT_GICLK_SHIFT 8
270#define OMAP4430_CLKACTIVITY_L3_INIT_GICLK_MASK BITFIELD(8, 8)
271
272/* Used by CM_L3INSTR_CLKSTCTRL */
273#define OMAP4430_CLKACTIVITY_L3_INSTR_GICLK_SHIFT 8
274#define OMAP4430_CLKACTIVITY_L3_INSTR_GICLK_MASK BITFIELD(8, 8)
275
276/* Used by CM_L4SEC_CLKSTCTRL */
277#define OMAP4430_CLKACTIVITY_L3_SECURE_GICLK_SHIFT 8
278#define OMAP4430_CLKACTIVITY_L3_SECURE_GICLK_MASK BITFIELD(8, 8)
279
280/* Used by CM_ALWON_CLKSTCTRL */
281#define OMAP4430_CLKACTIVITY_L4_AO_ICLK_SHIFT 8
282#define OMAP4430_CLKACTIVITY_L4_AO_ICLK_MASK BITFIELD(8, 8)
283
284/* Used by CM_CEFUSE_CLKSTCTRL */
285#define OMAP4430_CLKACTIVITY_L4_CEFUSE_GICLK_SHIFT 8
286#define OMAP4430_CLKACTIVITY_L4_CEFUSE_GICLK_MASK BITFIELD(8, 8)
287
288/* Used by CM_L4CFG_CLKSTCTRL, CM_L4CFG_CLKSTCTRL_RESTORE */
289#define OMAP4430_CLKACTIVITY_L4_CFG_GICLK_SHIFT 8
290#define OMAP4430_CLKACTIVITY_L4_CFG_GICLK_MASK BITFIELD(8, 8)
291
292/* Used by CM_D2D_CLKSTCTRL */
293#define OMAP4430_CLKACTIVITY_L4_D2D_GICLK_SHIFT 9
294#define OMAP4430_CLKACTIVITY_L4_D2D_GICLK_MASK BITFIELD(9, 9)
295
296/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
297#define OMAP4430_CLKACTIVITY_L4_INIT_GICLK_SHIFT 9
298#define OMAP4430_CLKACTIVITY_L4_INIT_GICLK_MASK BITFIELD(9, 9)
299
300/* Used by CM_L4PER_CLKSTCTRL, CM_L4PER_CLKSTCTRL_RESTORE */
301#define OMAP4430_CLKACTIVITY_L4_PER_GICLK_SHIFT 8
302#define OMAP4430_CLKACTIVITY_L4_PER_GICLK_MASK BITFIELD(8, 8)
303
304/* Used by CM_L4SEC_CLKSTCTRL */
305#define OMAP4430_CLKACTIVITY_L4_SECURE_GICLK_SHIFT 9
306#define OMAP4430_CLKACTIVITY_L4_SECURE_GICLK_MASK BITFIELD(9, 9)
307
308/* Used by CM_WKUP_CLKSTCTRL */
309#define OMAP4430_CLKACTIVITY_L4_WKUP_GICLK_SHIFT 12
310#define OMAP4430_CLKACTIVITY_L4_WKUP_GICLK_MASK BITFIELD(12, 12)
311
312/* Used by CM_MPU_CLKSTCTRL, CM_MPU_CLKSTCTRL_RESTORE */
313#define OMAP4430_CLKACTIVITY_MPU_DPLL_CLK_SHIFT 8
314#define OMAP4430_CLKACTIVITY_MPU_DPLL_CLK_MASK BITFIELD(8, 8)
315
316/* Used by CM1_ABE_CLKSTCTRL */
317#define OMAP4430_CLKACTIVITY_OCP_ABE_GICLK_SHIFT 9
318#define OMAP4430_CLKACTIVITY_OCP_ABE_GICLK_MASK BITFIELD(9, 9)
319
320/* Used by CM_L4PER_CLKSTCTRL, CM_L4PER_CLKSTCTRL_RESTORE */
321#define OMAP4430_CLKACTIVITY_PER_24MC_GFCLK_SHIFT 16
322#define OMAP4430_CLKACTIVITY_PER_24MC_GFCLK_MASK BITFIELD(16, 16)
323
324/* Used by CM_L4PER_CLKSTCTRL, CM_L4PER_CLKSTCTRL_RESTORE */
325#define OMAP4430_CLKACTIVITY_PER_32K_GFCLK_SHIFT 17
326#define OMAP4430_CLKACTIVITY_PER_32K_GFCLK_MASK BITFIELD(17, 17)
327
328/* Used by CM_L4PER_CLKSTCTRL, CM_L4PER_CLKSTCTRL_RESTORE */
329#define OMAP4430_CLKACTIVITY_PER_48M_GFCLK_SHIFT 18
330#define OMAP4430_CLKACTIVITY_PER_48M_GFCLK_MASK BITFIELD(18, 18)
331
332/* Used by CM_L4PER_CLKSTCTRL, CM_L4PER_CLKSTCTRL_RESTORE */
333#define OMAP4430_CLKACTIVITY_PER_96M_GFCLK_SHIFT 19
334#define OMAP4430_CLKACTIVITY_PER_96M_GFCLK_MASK BITFIELD(19, 19)
335
336/* Used by CM_L4PER_CLKSTCTRL, CM_L4PER_CLKSTCTRL_RESTORE */
337#define OMAP4430_CLKACTIVITY_PER_ABE_24M_GFCLK_SHIFT 25
338#define OMAP4430_CLKACTIVITY_PER_ABE_24M_GFCLK_MASK BITFIELD(25, 25)
339
340/* Used by CM_EMU_CLKSTCTRL */
341#define OMAP4430_CLKACTIVITY_PER_DPLL_EMU_CLK_SHIFT 10
342#define OMAP4430_CLKACTIVITY_PER_DPLL_EMU_CLK_MASK BITFIELD(10, 10)
343
344/* Used by CM_L4PER_CLKSTCTRL, CM_L4PER_CLKSTCTRL_RESTORE */
345#define OMAP4430_CLKACTIVITY_PER_MCASP2_GFCLK_SHIFT 20
346#define OMAP4430_CLKACTIVITY_PER_MCASP2_GFCLK_MASK BITFIELD(20, 20)
347
348/* Used by CM_L4PER_CLKSTCTRL, CM_L4PER_CLKSTCTRL_RESTORE */
349#define OMAP4430_CLKACTIVITY_PER_MCASP3_GFCLK_SHIFT 21
350#define OMAP4430_CLKACTIVITY_PER_MCASP3_GFCLK_MASK BITFIELD(21, 21)
351
352/* Used by CM_L4PER_CLKSTCTRL, CM_L4PER_CLKSTCTRL_RESTORE */
353#define OMAP4430_CLKACTIVITY_PER_MCBSP4_GFCLK_SHIFT 22
354#define OMAP4430_CLKACTIVITY_PER_MCBSP4_GFCLK_MASK BITFIELD(22, 22)
355
356/* Used by CM_L4PER_CLKSTCTRL, CM_L4PER_CLKSTCTRL_RESTORE */
357#define OMAP4430_CLKACTIVITY_PER_SYS_GFCLK_SHIFT 24
358#define OMAP4430_CLKACTIVITY_PER_SYS_GFCLK_MASK BITFIELD(24, 24)
359
360/* Used by CM_MEMIF_CLKSTCTRL, CM_MEMIF_CLKSTCTRL_RESTORE */
361#define OMAP4430_CLKACTIVITY_PHY_ROOT_CLK_SHIFT 10
362#define OMAP4430_CLKACTIVITY_PHY_ROOT_CLK_MASK BITFIELD(10, 10)
363
364/* Used by CM_GFX_CLKSTCTRL */
365#define OMAP4430_CLKACTIVITY_SGX_GFCLK_SHIFT 9
366#define OMAP4430_CLKACTIVITY_SGX_GFCLK_MASK BITFIELD(9, 9)
367
368/* Used by CM_ALWON_CLKSTCTRL */
369#define OMAP4430_CLKACTIVITY_SR_CORE_SYSCLK_SHIFT 11
370#define OMAP4430_CLKACTIVITY_SR_CORE_SYSCLK_MASK BITFIELD(11, 11)
371
372/* Used by CM_ALWON_CLKSTCTRL */
373#define OMAP4430_CLKACTIVITY_SR_IVA_SYSCLK_SHIFT 10
374#define OMAP4430_CLKACTIVITY_SR_IVA_SYSCLK_MASK BITFIELD(10, 10)
375
376/* Used by CM_ALWON_CLKSTCTRL */
377#define OMAP4430_CLKACTIVITY_SR_MPU_SYSCLK_SHIFT 9
378#define OMAP4430_CLKACTIVITY_SR_MPU_SYSCLK_MASK BITFIELD(9, 9)
379
380/* Used by CM_WKUP_CLKSTCTRL */
381#define OMAP4430_CLKACTIVITY_SYS_CLK_SHIFT 8
382#define OMAP4430_CLKACTIVITY_SYS_CLK_MASK BITFIELD(8, 8)
383
384/* Used by CM_TESLA_CLKSTCTRL */
385#define OMAP4430_CLKACTIVITY_TESLA_ROOT_CLK_SHIFT 8
386#define OMAP4430_CLKACTIVITY_TESLA_ROOT_CLK_MASK BITFIELD(8, 8)
387
388/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
389#define OMAP4430_CLKACTIVITY_TLL_CH0_GFCLK_SHIFT 22
390#define OMAP4430_CLKACTIVITY_TLL_CH0_GFCLK_MASK BITFIELD(22, 22)
391
392/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
393#define OMAP4430_CLKACTIVITY_TLL_CH1_GFCLK_SHIFT 23
394#define OMAP4430_CLKACTIVITY_TLL_CH1_GFCLK_MASK BITFIELD(23, 23)
395
396/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
397#define OMAP4430_CLKACTIVITY_TLL_CH2_GFCLK_SHIFT 24
398#define OMAP4430_CLKACTIVITY_TLL_CH2_GFCLK_MASK BITFIELD(24, 24)
399
400/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
401#define OMAP4430_CLKACTIVITY_USB_DPLL_HS_CLK_SHIFT 15
402#define OMAP4430_CLKACTIVITY_USB_DPLL_HS_CLK_MASK BITFIELD(15, 15)
403
404/* Used by CM_WKUP_CLKSTCTRL */
405#define OMAP4430_CLKACTIVITY_USIM_GFCLK_SHIFT 10
406#define OMAP4430_CLKACTIVITY_USIM_GFCLK_MASK BITFIELD(10, 10)
407
408/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
409#define OMAP4430_CLKACTIVITY_UTMI_P3_GFCLK_SHIFT 30
410#define OMAP4430_CLKACTIVITY_UTMI_P3_GFCLK_MASK BITFIELD(30, 30)
411
412/* Used by CM_L3INIT_CLKSTCTRL, CM_L3INIT_CLKSTCTRL_RESTORE */
413#define OMAP4430_CLKACTIVITY_UTMI_ROOT_GFCLK_SHIFT 25
414#define OMAP4430_CLKACTIVITY_UTMI_ROOT_GFCLK_MASK BITFIELD(25, 25)
415
416/* Used by CM_WKUP_CLKSTCTRL */
417#define OMAP4430_CLKACTIVITY_WKUP_32K_GFCLK_SHIFT 11
418#define OMAP4430_CLKACTIVITY_WKUP_32K_GFCLK_MASK BITFIELD(11, 11)
419
420/*
421 * Used by CM_WKUP_TIMER1_CLKCTRL, CM_L4PER_DMTIMER10_CLKCTRL,
422 * CM_L4PER_DMTIMER11_CLKCTRL, CM_L4PER_DMTIMER2_CLKCTRL,
423 * CM_L4PER_DMTIMER3_CLKCTRL, CM_L4PER_DMTIMER4_CLKCTRL,
424 * CM_L4PER_DMTIMER9_CLKCTRL, CM_L4PER_MCASP2_CLKCTRL, CM_L4PER_MCASP3_CLKCTRL,
425 * CM_L3INIT_MMC1_CLKCTRL, CM_L3INIT_MMC2_CLKCTRL, CM_L3INIT_MMC6_CLKCTRL,
426 * CM1_ABE_TIMER5_CLKCTRL, CM1_ABE_TIMER6_CLKCTRL, CM1_ABE_TIMER7_CLKCTRL,
427 * CM1_ABE_TIMER8_CLKCTRL
428 */
429#define OMAP4430_CLKSEL_SHIFT 24
430#define OMAP4430_CLKSEL_MASK BITFIELD(24, 24)
431
432/*
433 * Renamed from CLKSEL Used by CM_ABE_DSS_SYS_CLKSEL, CM_ABE_PLL_REF_CLKSEL,
434 * CM_DPLL_SYS_REF_CLKSEL, CM_L4_WKUP_CLKSEL, CM_CLKSEL_DUCATI_ISS_ROOT,
435 * CM_CLKSEL_USB_60MHZ
436 */
437#define OMAP4430_CLKSEL_0_0_SHIFT 0
438#define OMAP4430_CLKSEL_0_0_MASK BITFIELD(0, 0)
439
440/* Renamed from CLKSEL Used by CM_BYPCLK_DPLL_IVA, CM_BYPCLK_DPLL_MPU */
441#define OMAP4430_CLKSEL_0_1_SHIFT 0
442#define OMAP4430_CLKSEL_0_1_MASK BITFIELD(0, 1)
443
444/* Renamed from CLKSEL Used by CM_L3INIT_HSI_CLKCTRL */
445#define OMAP4430_CLKSEL_24_25_SHIFT 24
446#define OMAP4430_CLKSEL_24_25_MASK BITFIELD(24, 25)
447
448/* Used by CM_L3INIT_USB_OTG_CLKCTRL */
449#define OMAP4430_CLKSEL_60M_SHIFT 24
450#define OMAP4430_CLKSEL_60M_MASK BITFIELD(24, 24)
451
452/* Used by CM1_ABE_AESS_CLKCTRL */
453#define OMAP4430_CLKSEL_AESS_FCLK_SHIFT 24
454#define OMAP4430_CLKSEL_AESS_FCLK_MASK BITFIELD(24, 24)
455
456/* Used by CM_CLKSEL_CORE_RESTORE, CM_CLKSEL_CORE */
457#define OMAP4430_CLKSEL_CORE_SHIFT 0
458#define OMAP4430_CLKSEL_CORE_MASK BITFIELD(0, 0)
459
460/* Renamed from CLKSEL_CORE Used by CM_SHADOW_FREQ_CONFIG2 */
461#define OMAP4430_CLKSEL_CORE_1_1_SHIFT 1
462#define OMAP4430_CLKSEL_CORE_1_1_MASK BITFIELD(1, 1)
463
464/* Used by CM_WKUP_USIM_CLKCTRL */
465#define OMAP4430_CLKSEL_DIV_SHIFT 24
466#define OMAP4430_CLKSEL_DIV_MASK BITFIELD(24, 24)
467
468/* Used by CM_CAM_FDIF_CLKCTRL */
469#define OMAP4430_CLKSEL_FCLK_SHIFT 24
470#define OMAP4430_CLKSEL_FCLK_MASK BITFIELD(24, 25)
471
472/* Used by CM_L4PER_MCBSP4_CLKCTRL */
473#define OMAP4430_CLKSEL_INTERNAL_SOURCE_SHIFT 25
474#define OMAP4430_CLKSEL_INTERNAL_SOURCE_MASK BITFIELD(25, 25)
475
476/*
477 * Renamed from CLKSEL_INTERNAL_SOURCE Used by CM1_ABE_DMIC_CLKCTRL,
478 * CM1_ABE_MCASP_CLKCTRL, CM1_ABE_MCBSP1_CLKCTRL, CM1_ABE_MCBSP2_CLKCTRL,
479 * CM1_ABE_MCBSP3_CLKCTRL
480 */
481#define OMAP4430_CLKSEL_INTERNAL_SOURCE_CM1_ABE_DMIC_SHIFT 26
482#define OMAP4430_CLKSEL_INTERNAL_SOURCE_CM1_ABE_DMIC_MASK BITFIELD(26, 27)
483
484/* Used by CM_CLKSEL_CORE_RESTORE, CM_CLKSEL_CORE */
485#define OMAP4430_CLKSEL_L3_SHIFT 4
486#define OMAP4430_CLKSEL_L3_MASK BITFIELD(4, 4)
487
488/* Renamed from CLKSEL_L3 Used by CM_SHADOW_FREQ_CONFIG2 */
489#define OMAP4430_CLKSEL_L3_SHADOW_SHIFT 2
490#define OMAP4430_CLKSEL_L3_SHADOW_MASK BITFIELD(2, 2)
491
492/* Used by CM_CLKSEL_CORE_RESTORE, CM_CLKSEL_CORE */
493#define OMAP4430_CLKSEL_L4_SHIFT 8
494#define OMAP4430_CLKSEL_L4_MASK BITFIELD(8, 8)
495
496/* Used by CM_CLKSEL_ABE */
497#define OMAP4430_CLKSEL_OPP_SHIFT 0
498#define OMAP4430_CLKSEL_OPP_MASK BITFIELD(0, 1)
499
500/* Used by CM_GFX_GFX_CLKCTRL */
501#define OMAP4430_CLKSEL_PER_192M_SHIFT 25
502#define OMAP4430_CLKSEL_PER_192M_MASK BITFIELD(25, 26)
503
504/* Used by CM_EMU_DEBUGSS_CLKCTRL */
505#define OMAP4430_CLKSEL_PMD_STM_CLK_SHIFT 27
506#define OMAP4430_CLKSEL_PMD_STM_CLK_MASK BITFIELD(27, 29)
507
508/* Used by CM_EMU_DEBUGSS_CLKCTRL */
509#define OMAP4430_CLKSEL_PMD_TRACE_CLK_SHIFT 24
510#define OMAP4430_CLKSEL_PMD_TRACE_CLK_MASK BITFIELD(24, 26)
511
512/* Used by CM_GFX_GFX_CLKCTRL */
513#define OMAP4430_CLKSEL_SGX_FCLK_SHIFT 24
514#define OMAP4430_CLKSEL_SGX_FCLK_MASK BITFIELD(24, 24)
515
516/*
517 * Used by CM1_ABE_DMIC_CLKCTRL, CM1_ABE_MCASP_CLKCTRL, CM1_ABE_MCBSP1_CLKCTRL,
518 * CM1_ABE_MCBSP2_CLKCTRL, CM1_ABE_MCBSP3_CLKCTRL
519 */
520#define OMAP4430_CLKSEL_SOURCE_SHIFT 24
521#define OMAP4430_CLKSEL_SOURCE_MASK BITFIELD(24, 25)
522
523/* Renamed from CLKSEL_SOURCE Used by CM_L4PER_MCBSP4_CLKCTRL */
524#define OMAP4430_CLKSEL_SOURCE_24_24_SHIFT 24
525#define OMAP4430_CLKSEL_SOURCE_24_24_MASK BITFIELD(24, 24)
526
527/* Used by CM_L3INIT_USB_HOST_CLKCTRL, CM_L3INIT_USB_HOST_CLKCTRL_RESTORE */
528#define OMAP4430_CLKSEL_UTMI_P1_SHIFT 24
529#define OMAP4430_CLKSEL_UTMI_P1_MASK BITFIELD(24, 24)
530
531/* Used by CM_L3INIT_USB_HOST_CLKCTRL, CM_L3INIT_USB_HOST_CLKCTRL_RESTORE */
532#define OMAP4430_CLKSEL_UTMI_P2_SHIFT 25
533#define OMAP4430_CLKSEL_UTMI_P2_MASK BITFIELD(25, 25)
534
535/*
536 * Used by CM_WKUP_CLKSTCTRL, CM_EMU_CLKSTCTRL, CM_D2D_CLKSTCTRL,
537 * CM_DUCATI_CLKSTCTRL, CM_L3INSTR_CLKSTCTRL, CM_L3_1_CLKSTCTRL,
538 * CM_L3_2_CLKSTCTRL, CM_L4CFG_CLKSTCTRL, CM_MEMIF_CLKSTCTRL,
539 * CM_SDMA_CLKSTCTRL, CM_GFX_CLKSTCTRL, CM_L4PER_CLKSTCTRL, CM_L4SEC_CLKSTCTRL,
540 * CM_L3INIT_CLKSTCTRL, CM_CAM_CLKSTCTRL, CM_CEFUSE_CLKSTCTRL,
541 * CM_L3INIT_CLKSTCTRL_RESTORE, CM_L3_1_CLKSTCTRL_RESTORE,
542 * CM_L3_2_CLKSTCTRL_RESTORE, CM_L4CFG_CLKSTCTRL_RESTORE,
543 * CM_L4PER_CLKSTCTRL_RESTORE, CM_MEMIF_CLKSTCTRL_RESTORE, CM_ALWON_CLKSTCTRL,
544 * CM_IVAHD_CLKSTCTRL, CM_DSS_CLKSTCTRL, CM_MPU_CLKSTCTRL, CM_TESLA_CLKSTCTRL,
545 * CM1_ABE_CLKSTCTRL, CM_MPU_CLKSTCTRL_RESTORE
546 */
547#define OMAP4430_CLKTRCTRL_SHIFT 0
548#define OMAP4430_CLKTRCTRL_MASK BITFIELD(0, 1)
549
550/* Used by CM_EMU_OVERRIDE_DPLL_CORE */
551#define OMAP4430_CORE_DPLL_EMU_DIV_SHIFT 0
552#define OMAP4430_CORE_DPLL_EMU_DIV_MASK BITFIELD(0, 6)
553
554/* Used by CM_EMU_OVERRIDE_DPLL_CORE */
555#define OMAP4430_CORE_DPLL_EMU_MULT_SHIFT 8
556#define OMAP4430_CORE_DPLL_EMU_MULT_MASK BITFIELD(8, 18)
557
558/* Used by CM_L3_2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP */
559#define OMAP4430_D2D_DYNDEP_SHIFT 18
560#define OMAP4430_D2D_DYNDEP_MASK BITFIELD(18, 18)
561
562/* Used by CM_MPU_STATICDEP */
563#define OMAP4430_D2D_STATDEP_SHIFT 18
564#define OMAP4430_D2D_STATDEP_MASK BITFIELD(18, 18)
565
566/*
567 * Used by CM_SSC_DELTAMSTEP_DPLL_PER, CM_SSC_DELTAMSTEP_DPLL_UNIPRO,
568 * CM_SSC_DELTAMSTEP_DPLL_USB, CM_SSC_DELTAMSTEP_DPLL_CORE_RESTORE,
569 * CM_SSC_DELTAMSTEP_DPLL_ABE, CM_SSC_DELTAMSTEP_DPLL_CORE,
570 * CM_SSC_DELTAMSTEP_DPLL_DDRPHY, CM_SSC_DELTAMSTEP_DPLL_IVA,
571 * CM_SSC_DELTAMSTEP_DPLL_MPU
572 */
573#define OMAP4430_DELTAMSTEP_SHIFT 0
574#define OMAP4430_DELTAMSTEP_MASK BITFIELD(0, 19)
575
576/* Used by CM_SHADOW_FREQ_CONFIG1_RESTORE, CM_SHADOW_FREQ_CONFIG1 */
577#define OMAP4430_DLL_OVERRIDE_SHIFT 2
578#define OMAP4430_DLL_OVERRIDE_MASK BITFIELD(2, 2)
579
580/* Renamed from DLL_OVERRIDE Used by CM_DLL_CTRL */
581#define OMAP4430_DLL_OVERRIDE_0_0_SHIFT 0
582#define OMAP4430_DLL_OVERRIDE_0_0_MASK BITFIELD(0, 0)
583
584/* Used by CM_SHADOW_FREQ_CONFIG1_RESTORE, CM_SHADOW_FREQ_CONFIG1 */
585#define OMAP4430_DLL_RESET_SHIFT 3
586#define OMAP4430_DLL_RESET_MASK BITFIELD(3, 3)
587
588/*
589 * Used by CM_CLKSEL_DPLL_PER, CM_CLKSEL_DPLL_UNIPRO, CM_CLKSEL_DPLL_USB,
590 * CM_CLKSEL_DPLL_CORE_RESTORE, CM_CLKSEL_DPLL_ABE, CM_CLKSEL_DPLL_CORE,
591 * CM_CLKSEL_DPLL_DDRPHY, CM_CLKSEL_DPLL_IVA, CM_CLKSEL_DPLL_MPU
592 */
593#define OMAP4430_DPLL_BYP_CLKSEL_SHIFT 23
594#define OMAP4430_DPLL_BYP_CLKSEL_MASK BITFIELD(23, 23)
595
596/* Used by CM_CLKDCOLDO_DPLL_USB */
597#define OMAP4430_DPLL_CLKDCOLDO_GATE_CTRL_SHIFT 8
598#define OMAP4430_DPLL_CLKDCOLDO_GATE_CTRL_MASK BITFIELD(8, 8)
599
600/* Used by CM_CLKSEL_DPLL_CORE_RESTORE, CM_CLKSEL_DPLL_CORE */
601#define OMAP4430_DPLL_CLKOUTHIF_CLKSEL_SHIFT 20
602#define OMAP4430_DPLL_CLKOUTHIF_CLKSEL_MASK BITFIELD(20, 20)
603
604/*
605 * Used by CM_DIV_M3_DPLL_PER, CM_DIV_M3_DPLL_CORE_RESTORE, CM_DIV_M3_DPLL_ABE,
606 * CM_DIV_M3_DPLL_CORE
607 */
608#define OMAP4430_DPLL_CLKOUTHIF_DIV_SHIFT 0
609#define OMAP4430_DPLL_CLKOUTHIF_DIV_MASK BITFIELD(0, 4)
610
611/*
612 * Used by CM_DIV_M3_DPLL_PER, CM_DIV_M3_DPLL_CORE_RESTORE, CM_DIV_M3_DPLL_ABE,
613 * CM_DIV_M3_DPLL_CORE
614 */
615#define OMAP4430_DPLL_CLKOUTHIF_DIVCHACK_SHIFT 5
616#define OMAP4430_DPLL_CLKOUTHIF_DIVCHACK_MASK BITFIELD(5, 5)
617
618/*
619 * Used by CM_DIV_M3_DPLL_PER, CM_DIV_M3_DPLL_CORE_RESTORE, CM_DIV_M3_DPLL_ABE,
620 * CM_DIV_M3_DPLL_CORE
621 */
622#define OMAP4430_DPLL_CLKOUTHIF_GATE_CTRL_SHIFT 8
623#define OMAP4430_DPLL_CLKOUTHIF_GATE_CTRL_MASK BITFIELD(8, 8)
624
625/* Used by CM_DIV_M2_DPLL_PER, CM_DIV_M2_DPLL_UNIPRO, CM_DIV_M2_DPLL_ABE */
626#define OMAP4430_DPLL_CLKOUTX2_GATE_CTRL_SHIFT 10
627#define OMAP4430_DPLL_CLKOUTX2_GATE_CTRL_MASK BITFIELD(10, 10)
628
629/*
630 * Used by CM_DIV_M2_DPLL_PER, CM_DIV_M2_DPLL_UNIPRO,
631 * CM_DIV_M2_DPLL_CORE_RESTORE, CM_DIV_M2_DPLL_ABE, CM_DIV_M2_DPLL_CORE,
632 * CM_DIV_M2_DPLL_DDRPHY, CM_DIV_M2_DPLL_MPU
633 */
634#define OMAP4430_DPLL_CLKOUT_DIV_SHIFT 0
635#define OMAP4430_DPLL_CLKOUT_DIV_MASK BITFIELD(0, 4)
636
637/* Renamed from DPLL_CLKOUT_DIV Used by CM_DIV_M2_DPLL_USB */
638#define OMAP4430_DPLL_CLKOUT_DIV_0_6_SHIFT 0
639#define OMAP4430_DPLL_CLKOUT_DIV_0_6_MASK BITFIELD(0, 6)
640
641/*
642 * Used by CM_DIV_M2_DPLL_PER, CM_DIV_M2_DPLL_UNIPRO,
643 * CM_DIV_M2_DPLL_CORE_RESTORE, CM_DIV_M2_DPLL_ABE, CM_DIV_M2_DPLL_CORE,
644 * CM_DIV_M2_DPLL_DDRPHY, CM_DIV_M2_DPLL_MPU
645 */
646#define OMAP4430_DPLL_CLKOUT_DIVCHACK_SHIFT 5
647#define OMAP4430_DPLL_CLKOUT_DIVCHACK_MASK BITFIELD(5, 5)
648
649/* Renamed from DPLL_CLKOUT_DIVCHACK Used by CM_DIV_M2_DPLL_USB */
650#define OMAP4430_DPLL_CLKOUT_DIVCHACK_M2_USB_SHIFT 7
651#define OMAP4430_DPLL_CLKOUT_DIVCHACK_M2_USB_MASK BITFIELD(7, 7)
652
653/*
654 * Used by CM_DIV_M2_DPLL_PER, CM_DIV_M2_DPLL_USB, CM_DIV_M2_DPLL_CORE_RESTORE,
655 * CM_DIV_M2_DPLL_ABE, CM_DIV_M2_DPLL_CORE, CM_DIV_M2_DPLL_DDRPHY,
656 * CM_DIV_M2_DPLL_MPU
657 */
658#define OMAP4430_DPLL_CLKOUT_GATE_CTRL_SHIFT 8
659#define OMAP4430_DPLL_CLKOUT_GATE_CTRL_MASK BITFIELD(8, 8)
660
661/* Used by CM_SHADOW_FREQ_CONFIG1_RESTORE, CM_SHADOW_FREQ_CONFIG1 */
662#define OMAP4430_DPLL_CORE_DPLL_EN_SHIFT 8
663#define OMAP4430_DPLL_CORE_DPLL_EN_MASK BITFIELD(8, 10)
664
665/* Used by CM_SHADOW_FREQ_CONFIG1_RESTORE, CM_SHADOW_FREQ_CONFIG1 */
666#define OMAP4430_DPLL_CORE_M2_DIV_SHIFT 11
667#define OMAP4430_DPLL_CORE_M2_DIV_MASK BITFIELD(11, 15)
668
669/* Used by CM_SHADOW_FREQ_CONFIG2 */
670#define OMAP4430_DPLL_CORE_M5_DIV_SHIFT 3
671#define OMAP4430_DPLL_CORE_M5_DIV_MASK BITFIELD(3, 7)
672
673/* Used by CM_SHADOW_FREQ_CONFIG1_RESTORE, CM_SHADOW_FREQ_CONFIG1 */
674#define OMAP4430_DPLL_CORE_SYS_REF_CLKSEL_SHIFT 1
675#define OMAP4430_DPLL_CORE_SYS_REF_CLKSEL_MASK BITFIELD(1, 1)
676
677/*
678 * Used by CM_CLKSEL_DPLL_PER, CM_CLKSEL_DPLL_UNIPRO,
679 * CM_CLKSEL_DPLL_CORE_RESTORE, CM_CLKSEL_DPLL_ABE, CM_CLKSEL_DPLL_CORE,
680 * CM_CLKSEL_DPLL_DDRPHY, CM_CLKSEL_DPLL_IVA, CM_CLKSEL_DPLL_MPU
681 */
682#define OMAP4430_DPLL_DIV_SHIFT 0
683#define OMAP4430_DPLL_DIV_MASK BITFIELD(0, 6)
684
685/* Renamed from DPLL_DIV Used by CM_CLKSEL_DPLL_USB */
686#define OMAP4430_DPLL_DIV_0_7_SHIFT 0
687#define OMAP4430_DPLL_DIV_0_7_MASK BITFIELD(0, 7)
688
689/*
690 * Used by CM_CLKMODE_DPLL_PER, CM_CLKMODE_DPLL_USB,
691 * CM_CLKMODE_DPLL_CORE_RESTORE, CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE,
692 * CM_CLKMODE_DPLL_DDRPHY, CM_CLKMODE_DPLL_IVA, CM_CLKMODE_DPLL_MPU
693 */
694#define OMAP4430_DPLL_DRIFTGUARD_EN_SHIFT 8
695#define OMAP4430_DPLL_DRIFTGUARD_EN_MASK BITFIELD(8, 8)
696
697/* Renamed from DPLL_DRIFTGUARD_EN Used by CM_CLKMODE_DPLL_UNIPRO */
698#define OMAP4430_DPLL_DRIFTGUARD_EN_3_3_SHIFT 3
699#define OMAP4430_DPLL_DRIFTGUARD_EN_3_3_MASK BITFIELD(3, 3)
700
701/*
702 * Used by CM_CLKMODE_DPLL_PER, CM_CLKMODE_DPLL_UNIPRO, CM_CLKMODE_DPLL_USB,
703 * CM_CLKMODE_DPLL_CORE_RESTORE, CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE,
704 * CM_CLKMODE_DPLL_DDRPHY, CM_CLKMODE_DPLL_IVA, CM_CLKMODE_DPLL_MPU
705 */
706#define OMAP4430_DPLL_EN_SHIFT 0
707#define OMAP4430_DPLL_EN_MASK BITFIELD(0, 2)
708
709/*
710 * Used by CM_CLKMODE_DPLL_PER, CM_CLKMODE_DPLL_UNIPRO,
711 * CM_CLKMODE_DPLL_CORE_RESTORE, CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE,
712 * CM_CLKMODE_DPLL_DDRPHY, CM_CLKMODE_DPLL_IVA, CM_CLKMODE_DPLL_MPU
713 */
714#define OMAP4430_DPLL_LPMODE_EN_SHIFT 10
715#define OMAP4430_DPLL_LPMODE_EN_MASK BITFIELD(10, 10)
716
717/*
718 * Used by CM_CLKSEL_DPLL_PER, CM_CLKSEL_DPLL_UNIPRO,
719 * CM_CLKSEL_DPLL_CORE_RESTORE, CM_CLKSEL_DPLL_ABE, CM_CLKSEL_DPLL_CORE,
720 * CM_CLKSEL_DPLL_DDRPHY, CM_CLKSEL_DPLL_IVA, CM_CLKSEL_DPLL_MPU
721 */
722#define OMAP4430_DPLL_MULT_SHIFT 8
723#define OMAP4430_DPLL_MULT_MASK BITFIELD(8, 18)
724
725/* Renamed from DPLL_MULT Used by CM_CLKSEL_DPLL_USB */
726#define OMAP4430_DPLL_MULT_USB_SHIFT 8
727#define OMAP4430_DPLL_MULT_USB_MASK BITFIELD(8, 19)
728
729/*
730 * Used by CM_CLKMODE_DPLL_PER, CM_CLKMODE_DPLL_UNIPRO,
731 * CM_CLKMODE_DPLL_CORE_RESTORE, CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE,
732 * CM_CLKMODE_DPLL_DDRPHY, CM_CLKMODE_DPLL_IVA, CM_CLKMODE_DPLL_MPU
733 */
734#define OMAP4430_DPLL_REGM4XEN_SHIFT 11
735#define OMAP4430_DPLL_REGM4XEN_MASK BITFIELD(11, 11)
736
737/* Used by CM_CLKSEL_DPLL_USB */
738#define OMAP4430_DPLL_SD_DIV_SHIFT 24
739#define OMAP4430_DPLL_SD_DIV_MASK BITFIELD(24, 31)
740
741/*
742 * Used by CM_CLKMODE_DPLL_PER, CM_CLKMODE_DPLL_UNIPRO, CM_CLKMODE_DPLL_USB,
743 * CM_CLKMODE_DPLL_CORE_RESTORE, CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE,
744 * CM_CLKMODE_DPLL_DDRPHY, CM_CLKMODE_DPLL_IVA, CM_CLKMODE_DPLL_MPU
745 */
746#define OMAP4430_DPLL_SSC_ACK_SHIFT 13
747#define OMAP4430_DPLL_SSC_ACK_MASK BITFIELD(13, 13)
748
749/*
750 * Used by CM_CLKMODE_DPLL_PER, CM_CLKMODE_DPLL_UNIPRO, CM_CLKMODE_DPLL_USB,
751 * CM_CLKMODE_DPLL_CORE_RESTORE, CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE,
752 * CM_CLKMODE_DPLL_DDRPHY, CM_CLKMODE_DPLL_IVA, CM_CLKMODE_DPLL_MPU
753 */
754#define OMAP4430_DPLL_SSC_DOWNSPREAD_SHIFT 14
755#define OMAP4430_DPLL_SSC_DOWNSPREAD_MASK BITFIELD(14, 14)
756
757/*
758 * Used by CM_CLKMODE_DPLL_PER, CM_CLKMODE_DPLL_UNIPRO, CM_CLKMODE_DPLL_USB,
759 * CM_CLKMODE_DPLL_CORE_RESTORE, CM_CLKMODE_DPLL_ABE, CM_CLKMODE_DPLL_CORE,
760 * CM_CLKMODE_DPLL_DDRPHY, CM_CLKMODE_DPLL_IVA, CM_CLKMODE_DPLL_MPU
761 */
762#define OMAP4430_DPLL_SSC_EN_SHIFT 12
763#define OMAP4430_DPLL_SSC_EN_MASK BITFIELD(12, 12)
764
765/* Used by CM_L3_2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP, CM_L4PER_DYNAMICDEP */
766#define OMAP4430_DSS_DYNDEP_SHIFT 8
767#define OMAP4430_DSS_DYNDEP_MASK BITFIELD(8, 8)
768
769/*
770 * Used by CM_DUCATI_STATICDEP, CM_SDMA_STATICDEP, CM_SDMA_STATICDEP_RESTORE,
771 * CM_MPU_STATICDEP
772 */
773#define OMAP4430_DSS_STATDEP_SHIFT 8
774#define OMAP4430_DSS_STATDEP_MASK BITFIELD(8, 8)
775
776/* Used by CM_L3_2_DYNAMICDEP */
777#define OMAP4430_DUCATI_DYNDEP_SHIFT 0
778#define OMAP4430_DUCATI_DYNDEP_MASK BITFIELD(0, 0)
779
780/* Used by CM_SDMA_STATICDEP, CM_SDMA_STATICDEP_RESTORE, CM_MPU_STATICDEP */
781#define OMAP4430_DUCATI_STATDEP_SHIFT 0
782#define OMAP4430_DUCATI_STATDEP_MASK BITFIELD(0, 0)
783
784/* Used by CM_SHADOW_FREQ_CONFIG1_RESTORE, CM_SHADOW_FREQ_CONFIG1 */
785#define OMAP4430_FREQ_UPDATE_SHIFT 0
786#define OMAP4430_FREQ_UPDATE_MASK BITFIELD(0, 0)
787
788/* Used by CM_L3_2_DYNAMICDEP */
789#define OMAP4430_GFX_DYNDEP_SHIFT 10
790#define OMAP4430_GFX_DYNDEP_MASK BITFIELD(10, 10)
791
792/* Used by CM_DUCATI_STATICDEP, CM_MPU_STATICDEP */
793#define OMAP4430_GFX_STATDEP_SHIFT 10
794#define OMAP4430_GFX_STATDEP_MASK BITFIELD(10, 10)
795
796/* Used by CM_SHADOW_FREQ_CONFIG2 */
797#define OMAP4430_GPMC_FREQ_UPDATE_SHIFT 0
798#define OMAP4430_GPMC_FREQ_UPDATE_MASK BITFIELD(0, 0)
799
800/*
801 * Used by CM_DIV_M4_DPLL_PER, CM_DIV_M4_DPLL_CORE_RESTORE,
802 * CM_DIV_M4_DPLL_CORE, CM_DIV_M4_DPLL_DDRPHY, CM_DIV_M4_DPLL_IVA
803 */
804#define OMAP4430_HSDIVIDER_CLKOUT1_DIV_SHIFT 0
805#define OMAP4430_HSDIVIDER_CLKOUT1_DIV_MASK BITFIELD(0, 4)
806
807/*
808 * Used by CM_DIV_M4_DPLL_PER, CM_DIV_M4_DPLL_CORE_RESTORE,
809 * CM_DIV_M4_DPLL_CORE, CM_DIV_M4_DPLL_DDRPHY, CM_DIV_M4_DPLL_IVA
810 */
811#define OMAP4430_HSDIVIDER_CLKOUT1_DIVCHACK_SHIFT 5
812#define OMAP4430_HSDIVIDER_CLKOUT1_DIVCHACK_MASK BITFIELD(5, 5)
813
814/*
815 * Used by CM_DIV_M4_DPLL_PER, CM_DIV_M4_DPLL_CORE_RESTORE,
816 * CM_DIV_M4_DPLL_CORE, CM_DIV_M4_DPLL_DDRPHY, CM_DIV_M4_DPLL_IVA
817 */
818#define OMAP4430_HSDIVIDER_CLKOUT1_GATE_CTRL_SHIFT 8
819#define OMAP4430_HSDIVIDER_CLKOUT1_GATE_CTRL_MASK BITFIELD(8, 8)
820
821/*
822 * Used by CM_DIV_M4_DPLL_PER, CM_DIV_M4_DPLL_CORE_RESTORE,
823 * CM_DIV_M4_DPLL_CORE, CM_DIV_M4_DPLL_DDRPHY, CM_DIV_M4_DPLL_IVA
824 */
825#define OMAP4430_HSDIVIDER_CLKOUT1_PWDN_SHIFT 12
826#define OMAP4430_HSDIVIDER_CLKOUT1_PWDN_MASK BITFIELD(12, 12)
827
828/*
829 * Used by CM_DIV_M5_DPLL_PER, CM_DIV_M5_DPLL_CORE_RESTORE,
830 * CM_DIV_M5_DPLL_CORE, CM_DIV_M5_DPLL_DDRPHY, CM_DIV_M5_DPLL_IVA
831 */
832#define OMAP4430_HSDIVIDER_CLKOUT2_DIV_SHIFT 0
833#define OMAP4430_HSDIVIDER_CLKOUT2_DIV_MASK BITFIELD(0, 4)
834
835/*
836 * Used by CM_DIV_M5_DPLL_PER, CM_DIV_M5_DPLL_CORE_RESTORE,
837 * CM_DIV_M5_DPLL_CORE, CM_DIV_M5_DPLL_DDRPHY, CM_DIV_M5_DPLL_IVA
838 */
839#define OMAP4430_HSDIVIDER_CLKOUT2_DIVCHACK_SHIFT 5
840#define OMAP4430_HSDIVIDER_CLKOUT2_DIVCHACK_MASK BITFIELD(5, 5)
841
842/*
843 * Used by CM_DIV_M5_DPLL_PER, CM_DIV_M5_DPLL_CORE_RESTORE,
844 * CM_DIV_M5_DPLL_CORE, CM_DIV_M5_DPLL_DDRPHY, CM_DIV_M5_DPLL_IVA
845 */
846#define OMAP4430_HSDIVIDER_CLKOUT2_GATE_CTRL_SHIFT 8
847#define OMAP4430_HSDIVIDER_CLKOUT2_GATE_CTRL_MASK BITFIELD(8, 8)
848
849/*
850 * Used by CM_DIV_M5_DPLL_PER, CM_DIV_M5_DPLL_CORE_RESTORE,
851 * CM_DIV_M5_DPLL_CORE, CM_DIV_M5_DPLL_DDRPHY, CM_DIV_M5_DPLL_IVA
852 */
853#define OMAP4430_HSDIVIDER_CLKOUT2_PWDN_SHIFT 12
854#define OMAP4430_HSDIVIDER_CLKOUT2_PWDN_MASK BITFIELD(12, 12)
855
856/*
857 * Used by CM_DIV_M6_DPLL_PER, CM_DIV_M6_DPLL_CORE_RESTORE,
858 * CM_DIV_M6_DPLL_CORE, CM_DIV_M6_DPLL_DDRPHY
859 */
860#define OMAP4430_HSDIVIDER_CLKOUT3_DIV_SHIFT 0
861#define OMAP4430_HSDIVIDER_CLKOUT3_DIV_MASK BITFIELD(0, 4)
862
863/*
864 * Used by CM_DIV_M6_DPLL_PER, CM_DIV_M6_DPLL_CORE_RESTORE,
865 * CM_DIV_M6_DPLL_CORE, CM_DIV_M6_DPLL_DDRPHY
866 */
867#define OMAP4430_HSDIVIDER_CLKOUT3_DIVCHACK_SHIFT 5
868#define OMAP4430_HSDIVIDER_CLKOUT3_DIVCHACK_MASK BITFIELD(5, 5)
869
870/*
871 * Used by CM_DIV_M6_DPLL_PER, CM_DIV_M6_DPLL_CORE_RESTORE,
872 * CM_DIV_M6_DPLL_CORE, CM_DIV_M6_DPLL_DDRPHY
873 */
874#define OMAP4430_HSDIVIDER_CLKOUT3_GATE_CTRL_SHIFT 8
875#define OMAP4430_HSDIVIDER_CLKOUT3_GATE_CTRL_MASK BITFIELD(8, 8)
876
877/*
878 * Used by CM_DIV_M6_DPLL_PER, CM_DIV_M6_DPLL_CORE_RESTORE,
879 * CM_DIV_M6_DPLL_CORE, CM_DIV_M6_DPLL_DDRPHY
880 */
881#define OMAP4430_HSDIVIDER_CLKOUT3_PWDN_SHIFT 12
882#define OMAP4430_HSDIVIDER_CLKOUT3_PWDN_MASK BITFIELD(12, 12)
883
884/*
885 * Used by CM_DIV_M7_DPLL_PER, CM_DIV_M7_DPLL_CORE_RESTORE,
886 * CM_DIV_M7_DPLL_CORE
887 */
888#define OMAP4430_HSDIVIDER_CLKOUT4_DIV_SHIFT 0
889#define OMAP4430_HSDIVIDER_CLKOUT4_DIV_MASK BITFIELD(0, 4)
890
891/*
892 * Used by CM_DIV_M7_DPLL_PER, CM_DIV_M7_DPLL_CORE_RESTORE,
893 * CM_DIV_M7_DPLL_CORE
894 */
895#define OMAP4430_HSDIVIDER_CLKOUT4_DIVCHACK_SHIFT 5
896#define OMAP4430_HSDIVIDER_CLKOUT4_DIVCHACK_MASK BITFIELD(5, 5)
897
898/*
899 * Used by CM_DIV_M7_DPLL_PER, CM_DIV_M7_DPLL_CORE_RESTORE,
900 * CM_DIV_M7_DPLL_CORE
901 */
902#define OMAP4430_HSDIVIDER_CLKOUT4_GATE_CTRL_SHIFT 8
903#define OMAP4430_HSDIVIDER_CLKOUT4_GATE_CTRL_MASK BITFIELD(8, 8)
904
905/*
906 * Used by CM_DIV_M7_DPLL_PER, CM_DIV_M7_DPLL_CORE_RESTORE,
907 * CM_DIV_M7_DPLL_CORE
908 */
909#define OMAP4430_HSDIVIDER_CLKOUT4_PWDN_SHIFT 12
910#define OMAP4430_HSDIVIDER_CLKOUT4_PWDN_MASK BITFIELD(12, 12)
911
912/*
913 * Used by PRM_PRM_PROFILING_CLKCTRL, CM_WKUP_GPIO1_CLKCTRL,
914 * CM_WKUP_KEYBOARD_CLKCTRL, CM_WKUP_L4WKUP_CLKCTRL, CM_WKUP_RTC_CLKCTRL,
915 * CM_WKUP_SARRAM_CLKCTRL, CM_WKUP_SYNCTIMER_CLKCTRL, CM_WKUP_TIMER12_CLKCTRL,
916 * CM_WKUP_TIMER1_CLKCTRL, CM_WKUP_USIM_CLKCTRL, CM_WKUP_WDT1_CLKCTRL,
917 * CM_WKUP_WDT2_CLKCTRL, CM_EMU_DEBUGSS_CLKCTRL, CM_D2D_MODEM_ICR_CLKCTRL,
918 * CM_D2D_SAD2D_CLKCTRL, CM_D2D_SAD2D_FW_CLKCTRL, CM_DUCATI_DUCATI_CLKCTRL,
919 * CM_L3INSTR_L3_3_CLKCTRL, CM_L3INSTR_L3_INSTR_CLKCTRL,
920 * CM_L3INSTR_OCP_WP1_CLKCTRL, CM_L3_1_L3_1_CLKCTRL, CM_L3_2_GPMC_CLKCTRL,
921 * CM_L3_2_L3_2_CLKCTRL, CM_L3_2_OCMC_RAM_CLKCTRL, CM_L4CFG_HW_SEM_CLKCTRL,
922 * CM_L4CFG_L4_CFG_CLKCTRL, CM_L4CFG_MAILBOX_CLKCTRL, CM_L4CFG_SAR_ROM_CLKCTRL,
923 * CM_MEMIF_DMM_CLKCTRL, CM_MEMIF_EMIF_1_CLKCTRL, CM_MEMIF_EMIF_2_CLKCTRL,
924 * CM_MEMIF_EMIF_FW_CLKCTRL, CM_MEMIF_EMIF_H1_CLKCTRL,
925 * CM_MEMIF_EMIF_H2_CLKCTRL, CM_SDMA_SDMA_CLKCTRL, CM_GFX_GFX_CLKCTRL,
926 * CM_L4PER_ADC_CLKCTRL, CM_L4PER_DMTIMER10_CLKCTRL,
927 * CM_L4PER_DMTIMER11_CLKCTRL, CM_L4PER_DMTIMER2_CLKCTRL,
928 * CM_L4PER_DMTIMER3_CLKCTRL, CM_L4PER_DMTIMER4_CLKCTRL,
929 * CM_L4PER_DMTIMER9_CLKCTRL, CM_L4PER_ELM_CLKCTRL, CM_L4PER_GPIO2_CLKCTRL,
930 * CM_L4PER_GPIO3_CLKCTRL, CM_L4PER_GPIO4_CLKCTRL, CM_L4PER_GPIO5_CLKCTRL,
931 * CM_L4PER_GPIO6_CLKCTRL, CM_L4PER_HDQ1W_CLKCTRL, CM_L4PER_HECC1_CLKCTRL,
932 * CM_L4PER_HECC2_CLKCTRL, CM_L4PER_I2C1_CLKCTRL, CM_L4PER_I2C2_CLKCTRL,
933 * CM_L4PER_I2C3_CLKCTRL, CM_L4PER_I2C4_CLKCTRL, CM_L4PER_I2C5_CLKCTRL,
934 * CM_L4PER_L4PER_CLKCTRL, CM_L4PER_MCASP2_CLKCTRL, CM_L4PER_MCASP3_CLKCTRL,
935 * CM_L4PER_MCBSP4_CLKCTRL, CM_L4PER_MCSPI1_CLKCTRL, CM_L4PER_MCSPI2_CLKCTRL,
936 * CM_L4PER_MCSPI3_CLKCTRL, CM_L4PER_MCSPI4_CLKCTRL, CM_L4PER_MGATE_CLKCTRL,
937 * CM_L4PER_MMCSD3_CLKCTRL, CM_L4PER_MMCSD4_CLKCTRL, CM_L4PER_MMCSD5_CLKCTRL,
938 * CM_L4PER_MSPROHG_CLKCTRL, CM_L4PER_SLIMBUS2_CLKCTRL, CM_L4PER_UART1_CLKCTRL,
939 * CM_L4PER_UART2_CLKCTRL, CM_L4PER_UART3_CLKCTRL, CM_L4PER_UART4_CLKCTRL,
940 * CM_L4SEC_AES1_CLKCTRL, CM_L4SEC_AES2_CLKCTRL, CM_L4SEC_CRYPTODMA_CLKCTRL,
941 * CM_L4SEC_DES3DES_CLKCTRL, CM_L4SEC_PKAEIP29_CLKCTRL, CM_L4SEC_RNG_CLKCTRL,
942 * CM_L4SEC_SHA2MD51_CLKCTRL, CM_L3INIT_CCPTX_CLKCTRL, CM_L3INIT_EMAC_CLKCTRL,
943 * CM_L3INIT_HSI_CLKCTRL, CM_L3INIT_MMC1_CLKCTRL, CM_L3INIT_MMC2_CLKCTRL,
944 * CM_L3INIT_MMC6_CLKCTRL, CM_L3INIT_P1500_CLKCTRL, CM_L3INIT_PCIESS_CLKCTRL,
945 * CM_L3INIT_SATA_CLKCTRL, CM_L3INIT_TPPSS_CLKCTRL, CM_L3INIT_UNIPRO1_CLKCTRL,
946 * CM_L3INIT_USBPHYOCP2SCP_CLKCTRL, CM_L3INIT_USB_HOST_CLKCTRL,
947 * CM_L3INIT_USB_HOST_FS_CLKCTRL, CM_L3INIT_USB_OTG_CLKCTRL,
948 * CM_L3INIT_USB_TLL_CLKCTRL, CM_L3INIT_XHPI_CLKCTRL, CM_CAM_FDIF_CLKCTRL,
949 * CM_CAM_ISS_CLKCTRL, CM_CEFUSE_CEFUSE_CLKCTRL,
950 * CM_L3INIT_USB_HOST_CLKCTRL_RESTORE, CM_L3INIT_USB_TLL_CLKCTRL_RESTORE,
951 * CM_L3INSTR_L3_3_CLKCTRL_RESTORE, CM_L3INSTR_L3_INSTR_CLKCTRL_RESTORE,
952 * CM_L3INSTR_OCP_WP1_CLKCTRL_RESTORE, CM_L4PER_GPIO2_CLKCTRL_RESTORE,
953 * CM_L4PER_GPIO3_CLKCTRL_RESTORE, CM_L4PER_GPIO4_CLKCTRL_RESTORE,
954 * CM_L4PER_GPIO5_CLKCTRL_RESTORE, CM_L4PER_GPIO6_CLKCTRL_RESTORE,
955 * CM_ALWON_MDMINTC_CLKCTRL, CM_ALWON_SR_CORE_CLKCTRL, CM_ALWON_SR_IVA_CLKCTRL,
956 * CM_ALWON_SR_MPU_CLKCTRL, CM_IVAHD_IVAHD_CLKCTRL, CM_IVAHD_SL2_CLKCTRL,
957 * CM_DSS_DEISS_CLKCTRL, CM_DSS_DSS_CLKCTRL, CM_CM2_PROFILING_CLKCTRL,
958 * CM_MPU_MPU_CLKCTRL, CM_TESLA_TESLA_CLKCTRL, CM1_ABE_AESS_CLKCTRL,
959 * CM1_ABE_DMIC_CLKCTRL, CM1_ABE_L4ABE_CLKCTRL, CM1_ABE_MCASP_CLKCTRL,
960 * CM1_ABE_MCBSP1_CLKCTRL, CM1_ABE_MCBSP2_CLKCTRL, CM1_ABE_MCBSP3_CLKCTRL,
961 * CM1_ABE_PDM_CLKCTRL, CM1_ABE_SLIMBUS_CLKCTRL, CM1_ABE_TIMER5_CLKCTRL,
962 * CM1_ABE_TIMER6_CLKCTRL, CM1_ABE_TIMER7_CLKCTRL, CM1_ABE_TIMER8_CLKCTRL,
963 * CM1_ABE_WDT3_CLKCTRL, CM_CM1_PROFILING_CLKCTRL
964 */
965#define OMAP4430_IDLEST_SHIFT 16
966#define OMAP4430_IDLEST_MASK BITFIELD(16, 17)
967
968/* Used by CM_DUCATI_DYNAMICDEP, CM_L3_2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP */
969#define OMAP4430_ISS_DYNDEP_SHIFT 9
970#define OMAP4430_ISS_DYNDEP_MASK BITFIELD(9, 9)
971
972/*
973 * Used by CM_DUCATI_STATICDEP, CM_SDMA_STATICDEP, CM_SDMA_STATICDEP_RESTORE,
974 * CM_MPU_STATICDEP, CM_TESLA_STATICDEP
975 */
976#define OMAP4430_ISS_STATDEP_SHIFT 9
977#define OMAP4430_ISS_STATDEP_MASK BITFIELD(9, 9)
978
979/* Used by CM_L3_2_DYNAMICDEP, CM_TESLA_DYNAMICDEP */
980#define OMAP4430_IVAHD_DYNDEP_SHIFT 2
981#define OMAP4430_IVAHD_DYNDEP_MASK BITFIELD(2, 2)
982
983/*
984 * Used by CM_D2D_STATICDEP, CM_DUCATI_STATICDEP, CM_SDMA_STATICDEP,
985 * CM_GFX_STATICDEP, CM_L3INIT_STATICDEP, CM_CAM_STATICDEP,
986 * CM_SDMA_STATICDEP_RESTORE, CM_DSS_STATICDEP, CM_MPU_STATICDEP,
987 * CM_TESLA_STATICDEP
988 */
989#define OMAP4430_IVAHD_STATDEP_SHIFT 2
990#define OMAP4430_IVAHD_STATDEP_MASK BITFIELD(2, 2)
991
992/* Used by CM_L3_2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP, CM_L4PER_DYNAMICDEP */
993#define OMAP4430_L3INIT_DYNDEP_SHIFT 7
994#define OMAP4430_L3INIT_DYNDEP_MASK BITFIELD(7, 7)
995
996/*
997 * Used by CM_D2D_STATICDEP, CM_DUCATI_STATICDEP, CM_SDMA_STATICDEP,
998 * CM_SDMA_STATICDEP_RESTORE, CM_MPU_STATICDEP, CM_TESLA_STATICDEP
999 */
1000#define OMAP4430_L3INIT_STATDEP_SHIFT 7
1001#define OMAP4430_L3INIT_STATDEP_MASK BITFIELD(7, 7)
1002
1003/*
1004 * Used by CM_L3_2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP, CM_L3INIT_DYNAMICDEP,
1005 * CM_DSS_DYNAMICDEP, CM_MPU_DYNAMICDEP, CM_TESLA_DYNAMICDEP
1006 */
1007#define OMAP4430_L3_1_DYNDEP_SHIFT 5
1008#define OMAP4430_L3_1_DYNDEP_MASK BITFIELD(5, 5)
1009
1010/*
1011 * Used by CM_D2D_STATICDEP, CM_DUCATI_STATICDEP, CM_SDMA_STATICDEP,
1012 * CM_GFX_STATICDEP, CM_L4SEC_STATICDEP, CM_L3INIT_STATICDEP, CM_CAM_STATICDEP,
1013 * CM_SDMA_STATICDEP_RESTORE, CM_IVAHD_STATICDEP, CM_DSS_STATICDEP,
1014 * CM_MPU_STATICDEP, CM_TESLA_STATICDEP
1015 */
1016#define OMAP4430_L3_1_STATDEP_SHIFT 5
1017#define OMAP4430_L3_1_STATDEP_MASK BITFIELD(5, 5)
1018
1019/*
1020 * Used by CM_EMU_DYNAMICDEP, CM_D2D_DYNAMICDEP, CM_DUCATI_DYNAMICDEP,
1021 * CM_L3_1_DYNAMICDEP, CM_L4CFG_DYNAMICDEP, CM_SDMA_DYNAMICDEP,
1022 * CM_GFX_DYNAMICDEP, CM_L4SEC_DYNAMICDEP, CM_L3INIT_DYNAMICDEP,
1023 * CM_CAM_DYNAMICDEP, CM_IVAHD_DYNAMICDEP
1024 */
1025#define OMAP4430_L3_2_DYNDEP_SHIFT 6
1026#define OMAP4430_L3_2_DYNDEP_MASK BITFIELD(6, 6)
1027
1028/*
1029 * Used by CM_D2D_STATICDEP, CM_DUCATI_STATICDEP, CM_SDMA_STATICDEP,
1030 * CM_GFX_STATICDEP, CM_L4SEC_STATICDEP, CM_L3INIT_STATICDEP, CM_CAM_STATICDEP,
1031 * CM_SDMA_STATICDEP_RESTORE, CM_IVAHD_STATICDEP, CM_DSS_STATICDEP,
1032 * CM_MPU_STATICDEP, CM_TESLA_STATICDEP
1033 */
1034#define OMAP4430_L3_2_STATDEP_SHIFT 6
1035#define OMAP4430_L3_2_STATDEP_MASK BITFIELD(6, 6)
1036
1037/* Used by CM_L3_1_DYNAMICDEP */
1038#define OMAP4430_L4CFG_DYNDEP_SHIFT 12
1039#define OMAP4430_L4CFG_DYNDEP_MASK BITFIELD(12, 12)
1040
1041/*
1042 * Used by CM_D2D_STATICDEP, CM_DUCATI_STATICDEP, CM_SDMA_STATICDEP,
1043 * CM_L3INIT_STATICDEP, CM_SDMA_STATICDEP_RESTORE, CM_MPU_STATICDEP,
1044 * CM_TESLA_STATICDEP
1045 */
1046#define OMAP4430_L4CFG_STATDEP_SHIFT 12
1047#define OMAP4430_L4CFG_STATDEP_MASK BITFIELD(12, 12)
1048
1049/* Used by CM_L3_2_DYNAMICDEP */
1050#define OMAP4430_L4PER_DYNDEP_SHIFT 13
1051#define OMAP4430_L4PER_DYNDEP_MASK BITFIELD(13, 13)
1052
1053/*
1054 * Used by CM_D2D_STATICDEP, CM_DUCATI_STATICDEP, CM_SDMA_STATICDEP,
1055 * CM_L4SEC_STATICDEP, CM_L3INIT_STATICDEP, CM_SDMA_STATICDEP_RESTORE,
1056 * CM_MPU_STATICDEP, CM_TESLA_STATICDEP
1057 */
1058#define OMAP4430_L4PER_STATDEP_SHIFT 13
1059#define OMAP4430_L4PER_STATDEP_MASK BITFIELD(13, 13)
1060
1061/* Used by CM_L3_2_DYNAMICDEP, CM_L4PER_DYNAMICDEP */
1062#define OMAP4430_L4SEC_DYNDEP_SHIFT 14
1063#define OMAP4430_L4SEC_DYNDEP_MASK BITFIELD(14, 14)
1064
1065/*
1066 * Used by CM_DUCATI_STATICDEP, CM_SDMA_STATICDEP, CM_L3INIT_STATICDEP,
1067 * CM_SDMA_STATICDEP_RESTORE, CM_MPU_STATICDEP
1068 */
1069#define OMAP4430_L4SEC_STATDEP_SHIFT 14
1070#define OMAP4430_L4SEC_STATDEP_MASK BITFIELD(14, 14)
1071
1072/* Used by CM_L4CFG_DYNAMICDEP */
1073#define OMAP4430_L4WKUP_DYNDEP_SHIFT 15
1074#define OMAP4430_L4WKUP_DYNDEP_MASK BITFIELD(15, 15)
1075
1076/*
1077 * Used by CM_DUCATI_STATICDEP, CM_SDMA_STATICDEP, CM_L3INIT_STATICDEP,
1078 * CM_SDMA_STATICDEP_RESTORE, CM_MPU_STATICDEP, CM_TESLA_STATICDEP
1079 */
1080#define OMAP4430_L4WKUP_STATDEP_SHIFT 15
1081#define OMAP4430_L4WKUP_STATDEP_MASK BITFIELD(15, 15)
1082
1083/*
1084 * Used by CM_D2D_DYNAMICDEP, CM_L3_1_DYNAMICDEP, CM_L4CFG_DYNAMICDEP,
1085 * CM_MPU_DYNAMICDEP
1086 */
1087#define OMAP4430_MEMIF_DYNDEP_SHIFT 4
1088#define OMAP4430_MEMIF_DYNDEP_MASK BITFIELD(4, 4)
1089
1090/*
1091 * Used by CM_D2D_STATICDEP, CM_DUCATI_STATICDEP, CM_SDMA_STATICDEP,
1092 * CM_GFX_STATICDEP, CM_L4SEC_STATICDEP, CM_L3INIT_STATICDEP, CM_CAM_STATICDEP,
1093 * CM_SDMA_STATICDEP_RESTORE, CM_IVAHD_STATICDEP, CM_DSS_STATICDEP,
1094 * CM_MPU_STATICDEP, CM_TESLA_STATICDEP
1095 */
1096#define OMAP4430_MEMIF_STATDEP_SHIFT 4
1097#define OMAP4430_MEMIF_STATDEP_MASK BITFIELD(4, 4)
1098
1099/*
1100 * Used by CM_SSC_MODFREQDIV_DPLL_PER, CM_SSC_MODFREQDIV_DPLL_UNIPRO,
1101 * CM_SSC_MODFREQDIV_DPLL_USB, CM_SSC_MODFREQDIV_DPLL_CORE_RESTORE,
1102 * CM_SSC_MODFREQDIV_DPLL_ABE, CM_SSC_MODFREQDIV_DPLL_CORE,
1103 * CM_SSC_MODFREQDIV_DPLL_DDRPHY, CM_SSC_MODFREQDIV_DPLL_IVA,
1104 * CM_SSC_MODFREQDIV_DPLL_MPU
1105 */
1106#define OMAP4430_MODFREQDIV_EXPONENT_SHIFT 8
1107#define OMAP4430_MODFREQDIV_EXPONENT_MASK BITFIELD(8, 10)
1108
1109/*
1110 * Used by CM_SSC_MODFREQDIV_DPLL_PER, CM_SSC_MODFREQDIV_DPLL_UNIPRO,
1111 * CM_SSC_MODFREQDIV_DPLL_USB, CM_SSC_MODFREQDIV_DPLL_CORE_RESTORE,
1112 * CM_SSC_MODFREQDIV_DPLL_ABE, CM_SSC_MODFREQDIV_DPLL_CORE,
1113 * CM_SSC_MODFREQDIV_DPLL_DDRPHY, CM_SSC_MODFREQDIV_DPLL_IVA,
1114 * CM_SSC_MODFREQDIV_DPLL_MPU
1115 */
1116#define OMAP4430_MODFREQDIV_MANTISSA_SHIFT 0
1117#define OMAP4430_MODFREQDIV_MANTISSA_MASK BITFIELD(0, 6)
1118
1119/*
1120 * Used by PRM_PRM_PROFILING_CLKCTRL, CM_WKUP_GPIO1_CLKCTRL,
1121 * CM_WKUP_KEYBOARD_CLKCTRL, CM_WKUP_L4WKUP_CLKCTRL, CM_WKUP_RTC_CLKCTRL,
1122 * CM_WKUP_SARRAM_CLKCTRL, CM_WKUP_SYNCTIMER_CLKCTRL, CM_WKUP_TIMER12_CLKCTRL,
1123 * CM_WKUP_TIMER1_CLKCTRL, CM_WKUP_USIM_CLKCTRL, CM_WKUP_WDT1_CLKCTRL,
1124 * CM_WKUP_WDT2_CLKCTRL, CM_EMU_DEBUGSS_CLKCTRL, CM_D2D_MODEM_ICR_CLKCTRL,
1125 * CM_D2D_SAD2D_CLKCTRL, CM_D2D_SAD2D_FW_CLKCTRL, CM_DUCATI_DUCATI_CLKCTRL,
1126 * CM_L3INSTR_L3_3_CLKCTRL, CM_L3INSTR_L3_INSTR_CLKCTRL,
1127 * CM_L3INSTR_OCP_WP1_CLKCTRL, CM_L3_1_L3_1_CLKCTRL, CM_L3_2_GPMC_CLKCTRL,
1128 * CM_L3_2_L3_2_CLKCTRL, CM_L3_2_OCMC_RAM_CLKCTRL, CM_L4CFG_HW_SEM_CLKCTRL,
1129 * CM_L4CFG_L4_CFG_CLKCTRL, CM_L4CFG_MAILBOX_CLKCTRL, CM_L4CFG_SAR_ROM_CLKCTRL,
1130 * CM_MEMIF_DMM_CLKCTRL, CM_MEMIF_EMIF_1_CLKCTRL, CM_MEMIF_EMIF_2_CLKCTRL,
1131 * CM_MEMIF_EMIF_FW_CLKCTRL, CM_MEMIF_EMIF_H1_CLKCTRL,
1132 * CM_MEMIF_EMIF_H2_CLKCTRL, CM_SDMA_SDMA_CLKCTRL, CM_GFX_GFX_CLKCTRL,
1133 * CM_L4PER_ADC_CLKCTRL, CM_L4PER_DMTIMER10_CLKCTRL,
1134 * CM_L4PER_DMTIMER11_CLKCTRL, CM_L4PER_DMTIMER2_CLKCTRL,
1135 * CM_L4PER_DMTIMER3_CLKCTRL, CM_L4PER_DMTIMER4_CLKCTRL,
1136 * CM_L4PER_DMTIMER9_CLKCTRL, CM_L4PER_ELM_CLKCTRL, CM_L4PER_GPIO2_CLKCTRL,
1137 * CM_L4PER_GPIO3_CLKCTRL, CM_L4PER_GPIO4_CLKCTRL, CM_L4PER_GPIO5_CLKCTRL,
1138 * CM_L4PER_GPIO6_CLKCTRL, CM_L4PER_HDQ1W_CLKCTRL, CM_L4PER_HECC1_CLKCTRL,
1139 * CM_L4PER_HECC2_CLKCTRL, CM_L4PER_I2C1_CLKCTRL, CM_L4PER_I2C2_CLKCTRL,
1140 * CM_L4PER_I2C3_CLKCTRL, CM_L4PER_I2C4_CLKCTRL, CM_L4PER_I2C5_CLKCTRL,
1141 * CM_L4PER_L4PER_CLKCTRL, CM_L4PER_MCASP2_CLKCTRL, CM_L4PER_MCASP3_CLKCTRL,
1142 * CM_L4PER_MCBSP4_CLKCTRL, CM_L4PER_MCSPI1_CLKCTRL, CM_L4PER_MCSPI2_CLKCTRL,
1143 * CM_L4PER_MCSPI3_CLKCTRL, CM_L4PER_MCSPI4_CLKCTRL, CM_L4PER_MGATE_CLKCTRL,
1144 * CM_L4PER_MMCSD3_CLKCTRL, CM_L4PER_MMCSD4_CLKCTRL, CM_L4PER_MMCSD5_CLKCTRL,
1145 * CM_L4PER_MSPROHG_CLKCTRL, CM_L4PER_SLIMBUS2_CLKCTRL, CM_L4PER_UART1_CLKCTRL,
1146 * CM_L4PER_UART2_CLKCTRL, CM_L4PER_UART3_CLKCTRL, CM_L4PER_UART4_CLKCTRL,
1147 * CM_L4SEC_AES1_CLKCTRL, CM_L4SEC_AES2_CLKCTRL, CM_L4SEC_CRYPTODMA_CLKCTRL,
1148 * CM_L4SEC_DES3DES_CLKCTRL, CM_L4SEC_PKAEIP29_CLKCTRL, CM_L4SEC_RNG_CLKCTRL,
1149 * CM_L4SEC_SHA2MD51_CLKCTRL, CM_L3INIT_CCPTX_CLKCTRL, CM_L3INIT_EMAC_CLKCTRL,
1150 * CM_L3INIT_HSI_CLKCTRL, CM_L3INIT_MMC1_CLKCTRL, CM_L3INIT_MMC2_CLKCTRL,
1151 * CM_L3INIT_MMC6_CLKCTRL, CM_L3INIT_P1500_CLKCTRL, CM_L3INIT_PCIESS_CLKCTRL,
1152 * CM_L3INIT_SATA_CLKCTRL, CM_L3INIT_TPPSS_CLKCTRL, CM_L3INIT_UNIPRO1_CLKCTRL,
1153 * CM_L3INIT_USBPHYOCP2SCP_CLKCTRL, CM_L3INIT_USB_HOST_CLKCTRL,
1154 * CM_L3INIT_USB_HOST_FS_CLKCTRL, CM_L3INIT_USB_OTG_CLKCTRL,
1155 * CM_L3INIT_USB_TLL_CLKCTRL, CM_L3INIT_XHPI_CLKCTRL, CM_CAM_FDIF_CLKCTRL,
1156 * CM_CAM_ISS_CLKCTRL, CM_CEFUSE_CEFUSE_CLKCTRL,
1157 * CM_L3INIT_USB_HOST_CLKCTRL_RESTORE, CM_L3INIT_USB_TLL_CLKCTRL_RESTORE,
1158 * CM_L3INSTR_L3_3_CLKCTRL_RESTORE, CM_L3INSTR_L3_INSTR_CLKCTRL_RESTORE,
1159 * CM_L3INSTR_OCP_WP1_CLKCTRL_RESTORE, CM_L4PER_GPIO2_CLKCTRL_RESTORE,
1160 * CM_L4PER_GPIO3_CLKCTRL_RESTORE, CM_L4PER_GPIO4_CLKCTRL_RESTORE,
1161 * CM_L4PER_GPIO5_CLKCTRL_RESTORE, CM_L4PER_GPIO6_CLKCTRL_RESTORE,
1162 * CM_ALWON_MDMINTC_CLKCTRL, CM_ALWON_SR_CORE_CLKCTRL, CM_ALWON_SR_IVA_CLKCTRL,
1163 * CM_ALWON_SR_MPU_CLKCTRL, CM_IVAHD_IVAHD_CLKCTRL, CM_IVAHD_SL2_CLKCTRL,
1164 * CM_DSS_DEISS_CLKCTRL, CM_DSS_DSS_CLKCTRL, CM_CM2_PROFILING_CLKCTRL,
1165 * CM_MPU_MPU_CLKCTRL, CM_TESLA_TESLA_CLKCTRL, CM1_ABE_AESS_CLKCTRL,
1166 * CM1_ABE_DMIC_CLKCTRL, CM1_ABE_L4ABE_CLKCTRL, CM1_ABE_MCASP_CLKCTRL,
1167 * CM1_ABE_MCBSP1_CLKCTRL, CM1_ABE_MCBSP2_CLKCTRL, CM1_ABE_MCBSP3_CLKCTRL,
1168 * CM1_ABE_PDM_CLKCTRL, CM1_ABE_SLIMBUS_CLKCTRL, CM1_ABE_TIMER5_CLKCTRL,
1169 * CM1_ABE_TIMER6_CLKCTRL, CM1_ABE_TIMER7_CLKCTRL, CM1_ABE_TIMER8_CLKCTRL,
1170 * CM1_ABE_WDT3_CLKCTRL, CM_CM1_PROFILING_CLKCTRL
1171 */
1172#define OMAP4430_MODULEMODE_SHIFT 0
1173#define OMAP4430_MODULEMODE_MASK BITFIELD(0, 1)
1174
1175/* Used by CM_DSS_DSS_CLKCTRL */
1176#define OMAP4430_OPTFCLKEN_48MHZ_CLK_SHIFT 9
1177#define OMAP4430_OPTFCLKEN_48MHZ_CLK_MASK BITFIELD(9, 9)
1178
1179/* Used by CM_WKUP_BANDGAP_CLKCTRL */
1180#define OMAP4430_OPTFCLKEN_BGAP_32K_SHIFT 8
1181#define OMAP4430_OPTFCLKEN_BGAP_32K_MASK BITFIELD(8, 8)
1182
1183/* Used by CM_L3INIT_USBPHYOCP2SCP_CLKCTRL */
1184#define OMAP4430_OPTFCLKEN_CLK32K_SHIFT 9
1185#define OMAP4430_OPTFCLKEN_CLK32K_MASK BITFIELD(9, 9)
1186
1187/* Used by CM_CAM_ISS_CLKCTRL */
1188#define OMAP4430_OPTFCLKEN_CTRLCLK_SHIFT 8
1189#define OMAP4430_OPTFCLKEN_CTRLCLK_MASK BITFIELD(8, 8)
1190
1191/*
1192 * Used by CM_WKUP_GPIO1_CLKCTRL, CM_L4PER_GPIO2_CLKCTRL,
1193 * CM_L4PER_GPIO3_CLKCTRL, CM_L4PER_GPIO4_CLKCTRL, CM_L4PER_GPIO5_CLKCTRL,
1194 * CM_L4PER_GPIO6_CLKCTRL, CM_L4PER_GPIO2_CLKCTRL_RESTORE,
1195 * CM_L4PER_GPIO3_CLKCTRL_RESTORE, CM_L4PER_GPIO4_CLKCTRL_RESTORE,
1196 * CM_L4PER_GPIO5_CLKCTRL_RESTORE, CM_L4PER_GPIO6_CLKCTRL_RESTORE
1197 */
1198#define OMAP4430_OPTFCLKEN_DBCLK_SHIFT 8
1199#define OMAP4430_OPTFCLKEN_DBCLK_MASK BITFIELD(8, 8)
1200
1201/* Used by CM_MEMIF_DLL_CLKCTRL, CM_MEMIF_DLL_H_CLKCTRL */
1202#define OMAP4430_OPTFCLKEN_DLL_CLK_SHIFT 8
1203#define OMAP4430_OPTFCLKEN_DLL_CLK_MASK BITFIELD(8, 8)
1204
1205/* Used by CM_DSS_DSS_CLKCTRL */
1206#define OMAP4430_OPTFCLKEN_DSSCLK_SHIFT 8
1207#define OMAP4430_OPTFCLKEN_DSSCLK_MASK BITFIELD(8, 8)
1208
1209/* Used by CM1_ABE_SLIMBUS_CLKCTRL */
1210#define OMAP4430_OPTFCLKEN_FCLK0_SHIFT 8
1211#define OMAP4430_OPTFCLKEN_FCLK0_MASK BITFIELD(8, 8)
1212
1213/* Used by CM1_ABE_SLIMBUS_CLKCTRL */
1214#define OMAP4430_OPTFCLKEN_FCLK1_SHIFT 9
1215#define OMAP4430_OPTFCLKEN_FCLK1_MASK BITFIELD(9, 9)
1216
1217/* Used by CM1_ABE_SLIMBUS_CLKCTRL */
1218#define OMAP4430_OPTFCLKEN_FCLK2_SHIFT 10
1219#define OMAP4430_OPTFCLKEN_FCLK2_MASK BITFIELD(10, 10)
1220
1221/* Used by CM_L3INIT_USB_HOST_CLKCTRL, CM_L3INIT_USB_HOST_CLKCTRL_RESTORE */
1222#define OMAP4430_OPTFCLKEN_FUNC48MCLK_SHIFT 15
1223#define OMAP4430_OPTFCLKEN_FUNC48MCLK_MASK BITFIELD(15, 15)
1224
1225/* Used by CM_L3INIT_USB_HOST_CLKCTRL, CM_L3INIT_USB_HOST_CLKCTRL_RESTORE */
1226#define OMAP4430_OPTFCLKEN_HSIC480M_P1_CLK_SHIFT 13
1227#define OMAP4430_OPTFCLKEN_HSIC480M_P1_CLK_MASK BITFIELD(13, 13)
1228
1229/* Used by CM_L3INIT_USB_HOST_CLKCTRL, CM_L3INIT_USB_HOST_CLKCTRL_RESTORE */
1230#define OMAP4430_OPTFCLKEN_HSIC480M_P2_CLK_SHIFT 14
1231#define OMAP4430_OPTFCLKEN_HSIC480M_P2_CLK_MASK BITFIELD(14, 14)
1232
1233/* Used by CM_L3INIT_USB_HOST_CLKCTRL, CM_L3INIT_USB_HOST_CLKCTRL_RESTORE */
1234#define OMAP4430_OPTFCLKEN_HSIC60M_P1_CLK_SHIFT 11
1235#define OMAP4430_OPTFCLKEN_HSIC60M_P1_CLK_MASK BITFIELD(11, 11)
1236
1237/* Used by CM_L3INIT_USB_HOST_CLKCTRL, CM_L3INIT_USB_HOST_CLKCTRL_RESTORE */
1238#define OMAP4430_OPTFCLKEN_HSIC60M_P2_CLK_SHIFT 12
1239#define OMAP4430_OPTFCLKEN_HSIC60M_P2_CLK_MASK BITFIELD(12, 12)
1240
1241/* Used by CM_L4PER_SLIMBUS2_CLKCTRL */
1242#define OMAP4430_OPTFCLKEN_PER24MC_GFCLK_SHIFT 8
1243#define OMAP4430_OPTFCLKEN_PER24MC_GFCLK_MASK BITFIELD(8, 8)
1244
1245/* Used by CM_L4PER_SLIMBUS2_CLKCTRL */
1246#define OMAP4430_OPTFCLKEN_PERABE24M_GFCLK_SHIFT 9
1247#define OMAP4430_OPTFCLKEN_PERABE24M_GFCLK_MASK BITFIELD(9, 9)
1248
1249/* Used by CM_L3INIT_USBPHYOCP2SCP_CLKCTRL */
1250#define OMAP4430_OPTFCLKEN_PHY_48M_SHIFT 8
1251#define OMAP4430_OPTFCLKEN_PHY_48M_MASK BITFIELD(8, 8)
1252
1253/* Used by CM_L4PER_SLIMBUS2_CLKCTRL */
1254#define OMAP4430_OPTFCLKEN_SLIMBUS_CLK_SHIFT 10
1255#define OMAP4430_OPTFCLKEN_SLIMBUS_CLK_MASK BITFIELD(10, 10)
1256
1257/* Renamed from OPTFCLKEN_SLIMBUS_CLK Used by CM1_ABE_SLIMBUS_CLKCTRL */
1258#define OMAP4430_OPTFCLKEN_SLIMBUS_CLK_11_11_SHIFT 11
1259#define OMAP4430_OPTFCLKEN_SLIMBUS_CLK_11_11_MASK BITFIELD(11, 11)
1260
1261/* Used by CM_DSS_DSS_CLKCTRL */
1262#define OMAP4430_OPTFCLKEN_SYS_CLK_SHIFT 10
1263#define OMAP4430_OPTFCLKEN_SYS_CLK_MASK BITFIELD(10, 10)
1264
1265/* Used by CM_DSS_DSS_CLKCTRL */
1266#define OMAP4430_OPTFCLKEN_TV_CLK_SHIFT 11
1267#define OMAP4430_OPTFCLKEN_TV_CLK_MASK BITFIELD(11, 11)
1268
1269/* Used by CM_L3INIT_UNIPRO1_CLKCTRL */
1270#define OMAP4430_OPTFCLKEN_TXPHYCLK_SHIFT 8
1271#define OMAP4430_OPTFCLKEN_TXPHYCLK_MASK BITFIELD(8, 8)
1272
1273/* Used by CM_L3INIT_USB_TLL_CLKCTRL, CM_L3INIT_USB_TLL_CLKCTRL_RESTORE */
1274#define OMAP4430_OPTFCLKEN_USB_CH0_CLK_SHIFT 8
1275#define OMAP4430_OPTFCLKEN_USB_CH0_CLK_MASK BITFIELD(8, 8)
1276
1277/* Used by CM_L3INIT_USB_TLL_CLKCTRL, CM_L3INIT_USB_TLL_CLKCTRL_RESTORE */
1278#define OMAP4430_OPTFCLKEN_USB_CH1_CLK_SHIFT 9
1279#define OMAP4430_OPTFCLKEN_USB_CH1_CLK_MASK BITFIELD(9, 9)
1280
1281/* Used by CM_L3INIT_USB_TLL_CLKCTRL, CM_L3INIT_USB_TLL_CLKCTRL_RESTORE */
1282#define OMAP4430_OPTFCLKEN_USB_CH2_CLK_SHIFT 10
1283#define OMAP4430_OPTFCLKEN_USB_CH2_CLK_MASK BITFIELD(10, 10)
1284
1285/* Used by CM_L3INIT_USB_HOST_CLKCTRL, CM_L3INIT_USB_HOST_CLKCTRL_RESTORE */
1286#define OMAP4430_OPTFCLKEN_UTMI_P1_CLK_SHIFT 8
1287#define OMAP4430_OPTFCLKEN_UTMI_P1_CLK_MASK BITFIELD(8, 8)
1288
1289/* Used by CM_L3INIT_USB_HOST_CLKCTRL, CM_L3INIT_USB_HOST_CLKCTRL_RESTORE */
1290#define OMAP4430_OPTFCLKEN_UTMI_P2_CLK_SHIFT 9
1291#define OMAP4430_OPTFCLKEN_UTMI_P2_CLK_MASK BITFIELD(9, 9)
1292
1293/* Used by CM_L3INIT_USB_HOST_CLKCTRL, CM_L3INIT_USB_HOST_CLKCTRL_RESTORE */
1294#define OMAP4430_OPTFCLKEN_UTMI_P3_CLK_SHIFT 10
1295#define OMAP4430_OPTFCLKEN_UTMI_P3_CLK_MASK BITFIELD(10, 10)
1296
1297/* Used by CM_L3INIT_USB_OTG_CLKCTRL */
1298#define OMAP4430_OPTFCLKEN_XCLK_SHIFT 8
1299#define OMAP4430_OPTFCLKEN_XCLK_MASK BITFIELD(8, 8)
1300
1301/* Used by CM_EMU_OVERRIDE_DPLL_PER, CM_EMU_OVERRIDE_DPLL_CORE */
1302#define OMAP4430_OVERRIDE_ENABLE_SHIFT 19
1303#define OMAP4430_OVERRIDE_ENABLE_MASK BITFIELD(19, 19)
1304
1305/* Used by CM_CLKSEL_ABE */
1306#define OMAP4430_PAD_CLKS_GATE_SHIFT 8
1307#define OMAP4430_PAD_CLKS_GATE_MASK BITFIELD(8, 8)
1308
1309/* Used by CM_CORE_DVFS_CURRENT, CM_IVA_DVFS_CURRENT */
1310#define OMAP4430_PERF_CURRENT_SHIFT 0
1311#define OMAP4430_PERF_CURRENT_MASK BITFIELD(0, 7)
1312
1313/*
1314 * Used by CM_CORE_DVFS_PERF1, CM_CORE_DVFS_PERF2, CM_CORE_DVFS_PERF3,
1315 * CM_CORE_DVFS_PERF4, CM_IVA_DVFS_PERF_ABE, CM_IVA_DVFS_PERF_IVAHD,
1316 * CM_IVA_DVFS_PERF_TESLA
1317 */
1318#define OMAP4430_PERF_REQ_SHIFT 0
1319#define OMAP4430_PERF_REQ_MASK BITFIELD(0, 7)
1320
1321/* Used by CM_EMU_OVERRIDE_DPLL_PER */
1322#define OMAP4430_PER_DPLL_EMU_DIV_SHIFT 0
1323#define OMAP4430_PER_DPLL_EMU_DIV_MASK BITFIELD(0, 6)
1324
1325/* Used by CM_EMU_OVERRIDE_DPLL_PER */
1326#define OMAP4430_PER_DPLL_EMU_MULT_SHIFT 8
1327#define OMAP4430_PER_DPLL_EMU_MULT_MASK BITFIELD(8, 18)
1328
1329/* Used by CM_RESTORE_ST */
1330#define OMAP4430_PHASE1_COMPLETED_SHIFT 0
1331#define OMAP4430_PHASE1_COMPLETED_MASK BITFIELD(0, 0)
1332
1333/* Used by CM_RESTORE_ST */
1334#define OMAP4430_PHASE2A_COMPLETED_SHIFT 1
1335#define OMAP4430_PHASE2A_COMPLETED_MASK BITFIELD(1, 1)
1336
1337/* Used by CM_RESTORE_ST */
1338#define OMAP4430_PHASE2B_COMPLETED_SHIFT 2
1339#define OMAP4430_PHASE2B_COMPLETED_MASK BITFIELD(2, 2)
1340
1341/* Used by CM_EMU_DEBUGSS_CLKCTRL */
1342#define OMAP4430_PMD_STM_MUX_CTRL_SHIFT 20
1343#define OMAP4430_PMD_STM_MUX_CTRL_MASK BITFIELD(20, 21)
1344
1345/* Used by CM_EMU_DEBUGSS_CLKCTRL */
1346#define OMAP4430_PMD_TRACE_MUX_CTRL_SHIFT 22
1347#define OMAP4430_PMD_TRACE_MUX_CTRL_MASK BITFIELD(22, 23)
1348
1349/* Used by CM_DYN_DEP_PRESCAL */
1350#define OMAP4430_PRESCAL_SHIFT 0
1351#define OMAP4430_PRESCAL_MASK BITFIELD(0, 5)
1352
1353/* Used by REVISION_CM2, REVISION_CM1 */
1354#define OMAP4430_REV_SHIFT 0
1355#define OMAP4430_REV_MASK BITFIELD(0, 7)
1356
1357/*
1358 * Used by CM_L3INIT_USB_HOST_CLKCTRL, CM_L3INIT_USB_TLL_CLKCTRL,
1359 * CM_L3INIT_USB_HOST_CLKCTRL_RESTORE, CM_L3INIT_USB_TLL_CLKCTRL_RESTORE
1360 */
1361#define OMAP4430_SAR_MODE_SHIFT 4
1362#define OMAP4430_SAR_MODE_MASK BITFIELD(4, 4)
1363
1364/* Used by CM_SCALE_FCLK */
1365#define OMAP4430_SCALE_FCLK_SHIFT 0
1366#define OMAP4430_SCALE_FCLK_MASK BITFIELD(0, 0)
1367
1368/* Used by CM_L4CFG_DYNAMICDEP */
1369#define OMAP4430_SDMA_DYNDEP_SHIFT 11
1370#define OMAP4430_SDMA_DYNDEP_MASK BITFIELD(11, 11)
1371
1372/* Used by CM_DUCATI_STATICDEP, CM_MPU_STATICDEP */
1373#define OMAP4430_SDMA_STATDEP_SHIFT 11
1374#define OMAP4430_SDMA_STATDEP_MASK BITFIELD(11, 11)
1375
1376/* Used by CM_CLKSEL_ABE */
1377#define OMAP4430_SLIMBUS_CLK_GATE_SHIFT 10
1378#define OMAP4430_SLIMBUS_CLK_GATE_MASK BITFIELD(10, 10)
1379
1380/*
1381 * Used by CM_EMU_DEBUGSS_CLKCTRL, CM_D2D_SAD2D_CLKCTRL,
1382 * CM_DUCATI_DUCATI_CLKCTRL, CM_SDMA_SDMA_CLKCTRL, CM_GFX_GFX_CLKCTRL,
1383 * CM_L4SEC_CRYPTODMA_CLKCTRL, CM_L3INIT_CCPTX_CLKCTRL, CM_L3INIT_EMAC_CLKCTRL,
1384 * CM_L3INIT_HSI_CLKCTRL, CM_L3INIT_MMC1_CLKCTRL, CM_L3INIT_MMC2_CLKCTRL,
1385 * CM_L3INIT_MMC6_CLKCTRL, CM_L3INIT_P1500_CLKCTRL, CM_L3INIT_PCIESS_CLKCTRL,
1386 * CM_L3INIT_SATA_CLKCTRL, CM_L3INIT_TPPSS_CLKCTRL, CM_L3INIT_UNIPRO1_CLKCTRL,
1387 * CM_L3INIT_USB_HOST_CLKCTRL, CM_L3INIT_USB_HOST_FS_CLKCTRL,
1388 * CM_L3INIT_USB_OTG_CLKCTRL, CM_L3INIT_XHPI_CLKCTRL, CM_CAM_FDIF_CLKCTRL,
1389 * CM_CAM_ISS_CLKCTRL, CM_L3INIT_USB_HOST_CLKCTRL_RESTORE,
1390 * CM_IVAHD_IVAHD_CLKCTRL, CM_DSS_DEISS_CLKCTRL, CM_DSS_DSS_CLKCTRL,
1391 * CM_MPU_MPU_CLKCTRL, CM_TESLA_TESLA_CLKCTRL, CM1_ABE_AESS_CLKCTRL
1392 */
1393#define OMAP4430_STBYST_SHIFT 18
1394#define OMAP4430_STBYST_MASK BITFIELD(18, 18)
1395
1396/*
1397 * Used by CM_IDLEST_DPLL_PER, CM_IDLEST_DPLL_UNIPRO, CM_IDLEST_DPLL_USB,
1398 * CM_IDLEST_DPLL_ABE, CM_IDLEST_DPLL_CORE, CM_IDLEST_DPLL_DDRPHY,
1399 * CM_IDLEST_DPLL_IVA, CM_IDLEST_DPLL_MPU
1400 */
1401#define OMAP4430_ST_DPLL_CLK_SHIFT 0
1402#define OMAP4430_ST_DPLL_CLK_MASK BITFIELD(0, 0)
1403
1404/* Used by CM_CLKDCOLDO_DPLL_USB */
1405#define OMAP4430_ST_DPLL_CLKDCOLDO_SHIFT 9
1406#define OMAP4430_ST_DPLL_CLKDCOLDO_MASK BITFIELD(9, 9)
1407
1408/*
1409 * Used by CM_DIV_M2_DPLL_PER, CM_DIV_M2_DPLL_USB, CM_DIV_M2_DPLL_CORE_RESTORE,
1410 * CM_DIV_M2_DPLL_ABE, CM_DIV_M2_DPLL_CORE, CM_DIV_M2_DPLL_DDRPHY,
1411 * CM_DIV_M2_DPLL_MPU
1412 */
1413#define OMAP4430_ST_DPLL_CLKOUT_SHIFT 9
1414#define OMAP4430_ST_DPLL_CLKOUT_MASK BITFIELD(9, 9)
1415
1416/*
1417 * Used by CM_DIV_M3_DPLL_PER, CM_DIV_M3_DPLL_CORE_RESTORE, CM_DIV_M3_DPLL_ABE,
1418 * CM_DIV_M3_DPLL_CORE
1419 */
1420#define OMAP4430_ST_DPLL_CLKOUTHIF_SHIFT 9
1421#define OMAP4430_ST_DPLL_CLKOUTHIF_MASK BITFIELD(9, 9)
1422
1423/* Used by CM_DIV_M2_DPLL_PER, CM_DIV_M2_DPLL_UNIPRO, CM_DIV_M2_DPLL_ABE */
1424#define OMAP4430_ST_DPLL_CLKOUTX2_SHIFT 11
1425#define OMAP4430_ST_DPLL_CLKOUTX2_MASK BITFIELD(11, 11)
1426
1427/*
1428 * Used by CM_DIV_M4_DPLL_PER, CM_DIV_M4_DPLL_CORE_RESTORE,
1429 * CM_DIV_M4_DPLL_CORE, CM_DIV_M4_DPLL_DDRPHY, CM_DIV_M4_DPLL_IVA
1430 */
1431#define OMAP4430_ST_HSDIVIDER_CLKOUT1_SHIFT 9
1432#define OMAP4430_ST_HSDIVIDER_CLKOUT1_MASK BITFIELD(9, 9)
1433
1434/*
1435 * Used by CM_DIV_M5_DPLL_PER, CM_DIV_M5_DPLL_CORE_RESTORE,
1436 * CM_DIV_M5_DPLL_CORE, CM_DIV_M5_DPLL_DDRPHY, CM_DIV_M5_DPLL_IVA
1437 */
1438#define OMAP4430_ST_HSDIVIDER_CLKOUT2_SHIFT 9
1439#define OMAP4430_ST_HSDIVIDER_CLKOUT2_MASK BITFIELD(9, 9)
1440
1441/*
1442 * Used by CM_DIV_M6_DPLL_PER, CM_DIV_M6_DPLL_CORE_RESTORE,
1443 * CM_DIV_M6_DPLL_CORE, CM_DIV_M6_DPLL_DDRPHY
1444 */
1445#define OMAP4430_ST_HSDIVIDER_CLKOUT3_SHIFT 9
1446#define OMAP4430_ST_HSDIVIDER_CLKOUT3_MASK BITFIELD(9, 9)
1447
1448/*
1449 * Used by CM_DIV_M7_DPLL_PER, CM_DIV_M7_DPLL_CORE_RESTORE,
1450 * CM_DIV_M7_DPLL_CORE
1451 */
1452#define OMAP4430_ST_HSDIVIDER_CLKOUT4_SHIFT 9
1453#define OMAP4430_ST_HSDIVIDER_CLKOUT4_MASK BITFIELD(9, 9)
1454
1455/* Used by CM_SYS_CLKSEL */
1456#define OMAP4430_SYS_CLKSEL_SHIFT 0
1457#define OMAP4430_SYS_CLKSEL_MASK BITFIELD(0, 2)
1458
1459/* Used by CM_L4CFG_DYNAMICDEP */
1460#define OMAP4430_TESLA_DYNDEP_SHIFT 1
1461#define OMAP4430_TESLA_DYNDEP_MASK BITFIELD(1, 1)
1462
1463/* Used by CM_DUCATI_STATICDEP, CM_MPU_STATICDEP */
1464#define OMAP4430_TESLA_STATDEP_SHIFT 1
1465#define OMAP4430_TESLA_STATDEP_MASK BITFIELD(1, 1)
1466
1467/*
1468 * Used by CM_EMU_DYNAMICDEP, CM_D2D_DYNAMICDEP, CM_DUCATI_DYNAMICDEP,
1469 * CM_L3_1_DYNAMICDEP, CM_L3_2_DYNAMICDEP, CM_L4CFG_DYNAMICDEP,
1470 * CM_L4PER_DYNAMICDEP, CM_MPU_DYNAMICDEP, CM_TESLA_DYNAMICDEP
1471 */
1472#define OMAP4430_WINDOWSIZE_SHIFT 24
1473#define OMAP4430_WINDOWSIZE_MASK BITFIELD(24, 27)
1474#endif
diff --git a/arch/arm/mach-omap2/cm.c b/arch/arm/mach-omap2/cm.c
index 8eb2dab8c7db..58e4a1c557d8 100644
--- a/arch/arm/mach-omap2/cm.c
+++ b/arch/arm/mach-omap2/cm.c
@@ -21,6 +21,8 @@
21 21
22#include <asm/atomic.h> 22#include <asm/atomic.h>
23 23
24#include <plat/common.h>
25
24#include "cm.h" 26#include "cm.h"
25#include "cm-regbits-24xx.h" 27#include "cm-regbits-24xx.h"
26#include "cm-regbits-34xx.h" 28#include "cm-regbits-34xx.h"
@@ -61,9 +63,8 @@ int omap2_cm_wait_module_ready(s16 prcm_mod, u8 idlest_id, u8 idlest_shift)
61 mask = 1 << idlest_shift; 63 mask = 1 << idlest_shift;
62 64
63 /* XXX should be OMAP2 CM */ 65 /* XXX should be OMAP2 CM */
64 while (((cm_read_mod_reg(prcm_mod, cm_idlest_reg) & mask) != ena) && 66 omap_test_timeout(((cm_read_mod_reg(prcm_mod, cm_idlest_reg) & mask) == ena),
65 (i++ < MAX_MODULE_READY_TIME)) 67 MAX_MODULE_READY_TIME, i);
66 udelay(1);
67 68
68 return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY; 69 return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY;
69} 70}
diff --git a/arch/arm/mach-omap2/cm.h b/arch/arm/mach-omap2/cm.h
index cfd0b726ba44..94728b1ee3c4 100644
--- a/arch/arm/mach-omap2/cm.h
+++ b/arch/arm/mach-omap2/cm.h
@@ -4,8 +4,8 @@
4/* 4/*
5 * OMAP2/3 Clock Management (CM) register definitions 5 * OMAP2/3 Clock Management (CM) register definitions
6 * 6 *
7 * Copyright (C) 2007-2008 Texas Instruments, Inc. 7 * Copyright (C) 2007-2009 Texas Instruments, Inc.
8 * Copyright (C) 2007-2008 Nokia Corporation 8 * Copyright (C) 2007-2009 Nokia Corporation
9 * 9 *
10 * Written by Paul Walmsley 10 * Written by Paul Walmsley
11 * 11 *
@@ -17,11 +17,17 @@
17#include "prcm-common.h" 17#include "prcm-common.h"
18 18
19#define OMAP2420_CM_REGADDR(module, reg) \ 19#define OMAP2420_CM_REGADDR(module, reg) \
20 OMAP2_IO_ADDRESS(OMAP2420_CM_BASE + (module) + (reg)) 20 OMAP2_L4_IO_ADDRESS(OMAP2420_CM_BASE + (module) + (reg))
21#define OMAP2430_CM_REGADDR(module, reg) \ 21#define OMAP2430_CM_REGADDR(module, reg) \
22 OMAP2_IO_ADDRESS(OMAP2430_CM_BASE + (module) + (reg)) 22 OMAP2_L4_IO_ADDRESS(OMAP2430_CM_BASE + (module) + (reg))
23#define OMAP34XX_CM_REGADDR(module, reg) \ 23#define OMAP34XX_CM_REGADDR(module, reg) \
24 OMAP2_IO_ADDRESS(OMAP3430_CM_BASE + (module) + (reg)) 24 OMAP2_L4_IO_ADDRESS(OMAP3430_CM_BASE + (module) + (reg))
25#define OMAP44XX_CM1_REGADDR(module, reg) \
26 OMAP2_L4_IO_ADDRESS(OMAP4430_CM1_BASE + (module) + (reg))
27#define OMAP44XX_CM2_REGADDR(module, reg) \
28 OMAP2_L4_IO_ADDRESS(OMAP4430_CM2_BASE + (module) + (reg))
29
30#include "cm44xx.h"
25 31
26/* 32/*
27 * Architecture-specific global CM registers 33 * Architecture-specific global CM registers
@@ -61,7 +67,8 @@
61#define CM_CLKSEL 0x0040 67#define CM_CLKSEL 0x0040
62#define CM_CLKSEL1 CM_CLKSEL 68#define CM_CLKSEL1 CM_CLKSEL
63#define CM_CLKSEL2 0x0044 69#define CM_CLKSEL2 0x0044
64#define CM_CLKSTCTRL 0x0048 70#define OMAP2_CM_CLKSTCTRL 0x0048
71#define OMAP4_CM_CLKSTCTRL 0x0000
65 72
66 73
67/* Architecture-specific registers */ 74/* Architecture-specific registers */
@@ -82,13 +89,18 @@
82#define OMAP3430_CM_CLKSEL1_PLL CM_CLKSEL 89#define OMAP3430_CM_CLKSEL1_PLL CM_CLKSEL
83#define OMAP3430_CM_CLKSEL2_PLL CM_CLKSEL2 90#define OMAP3430_CM_CLKSEL2_PLL CM_CLKSEL2
84#define OMAP3430_CM_SLEEPDEP CM_CLKSEL2 91#define OMAP3430_CM_SLEEPDEP CM_CLKSEL2
85#define OMAP3430_CM_CLKSEL3 CM_CLKSTCTRL 92#define OMAP3430_CM_CLKSEL3 OMAP2_CM_CLKSTCTRL
86#define OMAP3430_CM_CLKSTST 0x004c 93#define OMAP3430_CM_CLKSTST 0x004c
87#define OMAP3430ES2_CM_CLKSEL4 0x004c 94#define OMAP3430ES2_CM_CLKSEL4 0x004c
88#define OMAP3430ES2_CM_CLKSEL5 0x0050 95#define OMAP3430ES2_CM_CLKSEL5 0x0050
89#define OMAP3430_CM_CLKSEL2_EMU 0x0050 96#define OMAP3430_CM_CLKSEL2_EMU 0x0050
90#define OMAP3430_CM_CLKSEL3_EMU 0x0054 97#define OMAP3430_CM_CLKSEL3_EMU 0x0054
91 98
99/* CM2.CEFUSE_CM2 register offsets */
100
101/* OMAP4 modulemode control */
102#define OMAP4430_MODULEMODE_HWCTRL 0
103#define OMAP4430_MODULEMODE_SWCTRL 1
92 104
93/* Clock management domain register get/set */ 105/* Clock management domain register get/set */
94 106
@@ -127,5 +139,8 @@ static inline u32 cm_clear_mod_reg_bits(u32 bits, s16 module, s16 idx)
127/* CM_IDLEST_GFX */ 139/* CM_IDLEST_GFX */
128#define OMAP_ST_GFX (1 << 0) 140#define OMAP_ST_GFX (1 << 0)
129 141
142/* CM_IDLEST indicator */
143#define OMAP24XX_CM_IDLEST_VAL 0
144#define OMAP34XX_CM_IDLEST_VAL 1
130 145
131#endif 146#endif
diff --git a/arch/arm/mach-omap2/cm44xx.h b/arch/arm/mach-omap2/cm44xx.h
new file mode 100644
index 000000000000..c575b9b0c041
--- /dev/null
+++ b/arch/arm/mach-omap2/cm44xx.h
@@ -0,0 +1,358 @@
1/*
2 * OMAP44xx CM1 & CM2 instance offset macros
3 *
4 * Copyright (C) 2009 Texas Instruments, Inc.
5 * Copyright (C) 2009 Nokia Corporation
6 *
7 * Paul Walmsley (paul@pwsan.com)
8 * Rajendra Nayak (rnayak@ti.com)
9 * Benoit Cousson (b-cousson@ti.com)
10 *
11 * This file is automatically generated from the OMAP hardware databases.
12 * We respectfully ask that any modifications to this file be coordinated
13 * with the public linux-omap@vger.kernel.org mailing list and the
14 * authors above to ensure that the autogeneration scripts are kept
15 * up-to-date with the file contents.
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License version 2 as
19 * published by the Free Software Foundation.
20 */
21
22#ifndef __ARCH_ARM_MACH_OMAP2_CM44XX_H
23#define __ARCH_ARM_MACH_OMAP2_CM44XX_H
24
25
26/* CM1 */
27
28
29/* CM1.OCP_SOCKET_CM1 register offsets */
30#define OMAP4430_REVISION_CM1 OMAP44XX_CM1_REGADDR(OMAP4430_CM1_OCP_SOCKET_MOD, 0x0000)
31#define OMAP4430_CM_CM1_PROFILING_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_OCP_SOCKET_MOD, 0x0040)
32
33/* CM1.CKGEN_CM1 register offsets */
34#define OMAP4430_CM_CLKSEL_CORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0000)
35#define OMAP4430_CM_CLKSEL_ABE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0008)
36#define OMAP4430_CM_DLL_CTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0010)
37#define OMAP4430_CM_CLKMODE_DPLL_CORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0020)
38#define OMAP4430_CM_IDLEST_DPLL_CORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0024)
39#define OMAP4430_CM_AUTOIDLE_DPLL_CORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0028)
40#define OMAP4430_CM_CLKSEL_DPLL_CORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x002c)
41#define OMAP4430_CM_DIV_M2_DPLL_CORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0030)
42#define OMAP4430_CM_DIV_M3_DPLL_CORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0034)
43#define OMAP4430_CM_DIV_M4_DPLL_CORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0038)
44#define OMAP4430_CM_DIV_M5_DPLL_CORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x003c)
45#define OMAP4430_CM_DIV_M6_DPLL_CORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0040)
46#define OMAP4430_CM_DIV_M7_DPLL_CORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0044)
47#define OMAP4430_CM_SSC_DELTAMSTEP_DPLL_CORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0048)
48#define OMAP4430_CM_SSC_MODFREQDIV_DPLL_CORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x004c)
49#define OMAP4430_CM_EMU_OVERRIDE_DPLL_CORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0050)
50#define OMAP4430_CM_CLKMODE_DPLL_MPU OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0060)
51#define OMAP4430_CM_IDLEST_DPLL_MPU OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0064)
52#define OMAP4430_CM_AUTOIDLE_DPLL_MPU OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0068)
53#define OMAP4430_CM_CLKSEL_DPLL_MPU OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x006c)
54#define OMAP4430_CM_DIV_M2_DPLL_MPU OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0070)
55#define OMAP4430_CM_SSC_DELTAMSTEP_DPLL_MPU OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0088)
56#define OMAP4430_CM_SSC_MODFREQDIV_DPLL_MPU OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x008c)
57#define OMAP4430_CM_BYPCLK_DPLL_MPU OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x009c)
58#define OMAP4430_CM_CLKMODE_DPLL_IVA OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x00a0)
59#define OMAP4430_CM_IDLEST_DPLL_IVA OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x00a4)
60#define OMAP4430_CM_AUTOIDLE_DPLL_IVA OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x00a8)
61#define OMAP4430_CM_CLKSEL_DPLL_IVA OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x00ac)
62#define OMAP4430_CM_DIV_M4_DPLL_IVA OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x00b8)
63#define OMAP4430_CM_DIV_M5_DPLL_IVA OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x00bc)
64#define OMAP4430_CM_SSC_DELTAMSTEP_DPLL_IVA OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x00c8)
65#define OMAP4430_CM_SSC_MODFREQDIV_DPLL_IVA OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x00cc)
66#define OMAP4430_CM_BYPCLK_DPLL_IVA OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x00dc)
67#define OMAP4430_CM_CLKMODE_DPLL_ABE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x00e0)
68#define OMAP4430_CM_IDLEST_DPLL_ABE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x00e4)
69#define OMAP4430_CM_AUTOIDLE_DPLL_ABE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x00e8)
70#define OMAP4430_CM_CLKSEL_DPLL_ABE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x00ec)
71#define OMAP4430_CM_DIV_M2_DPLL_ABE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x00f0)
72#define OMAP4430_CM_DIV_M3_DPLL_ABE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x00f4)
73#define OMAP4430_CM_SSC_DELTAMSTEP_DPLL_ABE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0108)
74#define OMAP4430_CM_SSC_MODFREQDIV_DPLL_ABE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x010c)
75#define OMAP4430_CM_CLKMODE_DPLL_DDRPHY OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0120)
76#define OMAP4430_CM_IDLEST_DPLL_DDRPHY OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0124)
77#define OMAP4430_CM_AUTOIDLE_DPLL_DDRPHY OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0128)
78#define OMAP4430_CM_CLKSEL_DPLL_DDRPHY OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x012c)
79#define OMAP4430_CM_DIV_M2_DPLL_DDRPHY OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0130)
80#define OMAP4430_CM_DIV_M4_DPLL_DDRPHY OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0138)
81#define OMAP4430_CM_DIV_M5_DPLL_DDRPHY OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x013c)
82#define OMAP4430_CM_DIV_M6_DPLL_DDRPHY OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0140)
83#define OMAP4430_CM_SSC_DELTAMSTEP_DPLL_DDRPHY OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0148)
84#define OMAP4430_CM_SSC_MODFREQDIV_DPLL_DDRPHY OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x014c)
85#define OMAP4430_CM_SHADOW_FREQ_CONFIG1 OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0160)
86#define OMAP4430_CM_SHADOW_FREQ_CONFIG2 OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0164)
87#define OMAP4430_CM_DYN_DEP_PRESCAL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0170)
88#define OMAP4430_CM_RESTORE_ST OMAP44XX_CM1_REGADDR(OMAP4430_CM1_CKGEN_MOD, 0x0180)
89
90/* CM1.MPU_CM1 register offsets */
91#define OMAP4430_CM_MPU_CLKSTCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_MPU_MOD, 0x0000)
92#define OMAP4430_CM_MPU_STATICDEP OMAP44XX_CM1_REGADDR(OMAP4430_CM1_MPU_MOD, 0x0004)
93#define OMAP4430_CM_MPU_DYNAMICDEP OMAP44XX_CM1_REGADDR(OMAP4430_CM1_MPU_MOD, 0x0008)
94#define OMAP4430_CM_MPU_MPU_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_MPU_MOD, 0x0020)
95
96/* CM1.TESLA_CM1 register offsets */
97#define OMAP4430_CM_TESLA_CLKSTCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_TESLA_MOD, 0x0000)
98#define OMAP4430_CM_TESLA_STATICDEP OMAP44XX_CM1_REGADDR(OMAP4430_CM1_TESLA_MOD, 0x0004)
99#define OMAP4430_CM_TESLA_DYNAMICDEP OMAP44XX_CM1_REGADDR(OMAP4430_CM1_TESLA_MOD, 0x0008)
100#define OMAP4430_CM_TESLA_TESLA_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_TESLA_MOD, 0x0020)
101
102/* CM1.ABE_CM1 register offsets */
103#define OMAP4430_CM1_ABE_CLKSTCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_ABE_MOD, 0x0000)
104#define OMAP4430_CM1_ABE_L4ABE_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_ABE_MOD, 0x0020)
105#define OMAP4430_CM1_ABE_AESS_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_ABE_MOD, 0x0028)
106#define OMAP4430_CM1_ABE_PDM_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_ABE_MOD, 0x0030)
107#define OMAP4430_CM1_ABE_DMIC_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_ABE_MOD, 0x0038)
108#define OMAP4430_CM1_ABE_MCASP_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_ABE_MOD, 0x0040)
109#define OMAP4430_CM1_ABE_MCBSP1_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_ABE_MOD, 0x0048)
110#define OMAP4430_CM1_ABE_MCBSP2_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_ABE_MOD, 0x0050)
111#define OMAP4430_CM1_ABE_MCBSP3_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_ABE_MOD, 0x0058)
112#define OMAP4430_CM1_ABE_SLIMBUS_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_ABE_MOD, 0x0060)
113#define OMAP4430_CM1_ABE_TIMER5_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_ABE_MOD, 0x0068)
114#define OMAP4430_CM1_ABE_TIMER6_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_ABE_MOD, 0x0070)
115#define OMAP4430_CM1_ABE_TIMER7_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_ABE_MOD, 0x0078)
116#define OMAP4430_CM1_ABE_TIMER8_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_ABE_MOD, 0x0080)
117#define OMAP4430_CM1_ABE_WDT3_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_ABE_MOD, 0x0088)
118
119/* CM1.RESTORE_CM1 register offsets */
120#define OMAP4430_CM_CLKSEL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0000)
121#define OMAP4430_CM_DIV_M2_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0004)
122#define OMAP4430_CM_DIV_M3_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0008)
123#define OMAP4430_CM_DIV_M4_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x000c)
124#define OMAP4430_CM_DIV_M5_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0010)
125#define OMAP4430_CM_DIV_M6_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0014)
126#define OMAP4430_CM_DIV_M7_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0018)
127#define OMAP4430_CM_CLKSEL_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x001c)
128#define OMAP4430_CM_SSC_DELTAMSTEP_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0020)
129#define OMAP4430_CM_SSC_MODFREQDIV_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0024)
130#define OMAP4430_CM_CLKMODE_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0028)
131#define OMAP4430_CM_SHADOW_FREQ_CONFIG1_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x002c)
132#define OMAP4430_CM_AUTOIDLE_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0030)
133#define OMAP4430_CM_MPU_CLKSTCTRL_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0034)
134
135/* CM2 */
136
137
138/* CM2.OCP_SOCKET_CM2 register offsets */
139#define OMAP4430_REVISION_CM2 OMAP44XX_CM2_REGADDR(OMAP4430_CM2_OCP_SOCKET_MOD, 0x0000)
140#define OMAP4430_CM_CM2_PROFILING_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_OCP_SOCKET_MOD, 0x0040)
141
142/* CM2.CKGEN_CM2 register offsets */
143#define OMAP4430_CM_CLKSEL_DUCATI_ISS_ROOT OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0000)
144#define OMAP4430_CM_CLKSEL_USB_60MHZ OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0004)
145#define OMAP4430_CM_SCALE_FCLK OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0008)
146#define OMAP4430_CM_CORE_DVFS_PERF1 OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0010)
147#define OMAP4430_CM_CORE_DVFS_PERF2 OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0014)
148#define OMAP4430_CM_CORE_DVFS_PERF3 OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0018)
149#define OMAP4430_CM_CORE_DVFS_PERF4 OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x001c)
150#define OMAP4430_CM_CORE_DVFS_CURRENT OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0024)
151#define OMAP4430_CM_IVA_DVFS_PERF_TESLA OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0028)
152#define OMAP4430_CM_IVA_DVFS_PERF_IVAHD OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x002c)
153#define OMAP4430_CM_IVA_DVFS_PERF_ABE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0030)
154#define OMAP4430_CM_IVA_DVFS_CURRENT OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0038)
155#define OMAP4430_CM_CLKMODE_DPLL_PER OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0040)
156#define OMAP4430_CM_IDLEST_DPLL_PER OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0044)
157#define OMAP4430_CM_AUTOIDLE_DPLL_PER OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0048)
158#define OMAP4430_CM_CLKSEL_DPLL_PER OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x004c)
159#define OMAP4430_CM_DIV_M2_DPLL_PER OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0050)
160#define OMAP4430_CM_DIV_M3_DPLL_PER OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0054)
161#define OMAP4430_CM_DIV_M4_DPLL_PER OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0058)
162#define OMAP4430_CM_DIV_M5_DPLL_PER OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x005c)
163#define OMAP4430_CM_DIV_M6_DPLL_PER OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0060)
164#define OMAP4430_CM_DIV_M7_DPLL_PER OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0064)
165#define OMAP4430_CM_SSC_DELTAMSTEP_DPLL_PER OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0068)
166#define OMAP4430_CM_SSC_MODFREQDIV_DPLL_PER OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x006c)
167#define OMAP4430_CM_EMU_OVERRIDE_DPLL_PER OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0070)
168#define OMAP4430_CM_CLKMODE_DPLL_USB OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0080)
169#define OMAP4430_CM_IDLEST_DPLL_USB OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0084)
170#define OMAP4430_CM_AUTOIDLE_DPLL_USB OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0088)
171#define OMAP4430_CM_CLKSEL_DPLL_USB OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x008c)
172#define OMAP4430_CM_DIV_M2_DPLL_USB OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0090)
173#define OMAP4430_CM_SSC_DELTAMSTEP_DPLL_USB OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x00a8)
174#define OMAP4430_CM_SSC_MODFREQDIV_DPLL_USB OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x00ac)
175#define OMAP4430_CM_CLKDCOLDO_DPLL_USB OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x00b4)
176#define OMAP4430_CM_CLKMODE_DPLL_UNIPRO OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x00c0)
177#define OMAP4430_CM_IDLEST_DPLL_UNIPRO OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x00c4)
178#define OMAP4430_CM_AUTOIDLE_DPLL_UNIPRO OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x00c8)
179#define OMAP4430_CM_CLKSEL_DPLL_UNIPRO OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x00cc)
180#define OMAP4430_CM_DIV_M2_DPLL_UNIPRO OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x00d0)
181#define OMAP4430_CM_SSC_DELTAMSTEP_DPLL_UNIPRO OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x00e8)
182#define OMAP4430_CM_SSC_MODFREQDIV_DPLL_UNIPRO OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x00ec)
183
184/* CM2.ALWAYS_ON_CM2 register offsets */
185#define OMAP4430_CM_ALWON_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_ALWAYS_ON_MOD, 0x0000)
186#define OMAP4430_CM_ALWON_MDMINTC_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_ALWAYS_ON_MOD, 0x0020)
187#define OMAP4430_CM_ALWON_SR_MPU_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_ALWAYS_ON_MOD, 0x0028)
188#define OMAP4430_CM_ALWON_SR_IVA_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_ALWAYS_ON_MOD, 0x0030)
189#define OMAP4430_CM_ALWON_SR_CORE_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_ALWAYS_ON_MOD, 0x0038)
190
191/* CM2.CORE_CM2 register offsets */
192#define OMAP4430_CM_L3_1_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0000)
193#define OMAP4430_CM_L3_1_DYNAMICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0008)
194#define OMAP4430_CM_L3_1_L3_1_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0020)
195#define OMAP4430_CM_L3_2_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0100)
196#define OMAP4430_CM_L3_2_DYNAMICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0108)
197#define OMAP4430_CM_L3_2_L3_2_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0120)
198#define OMAP4430_CM_L3_2_GPMC_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0128)
199#define OMAP4430_CM_L3_2_OCMC_RAM_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0130)
200#define OMAP4430_CM_DUCATI_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0200)
201#define OMAP4430_CM_DUCATI_STATICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0204)
202#define OMAP4430_CM_DUCATI_DYNAMICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0208)
203#define OMAP4430_CM_DUCATI_DUCATI_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0220)
204#define OMAP4430_CM_SDMA_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0300)
205#define OMAP4430_CM_SDMA_STATICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0304)
206#define OMAP4430_CM_SDMA_DYNAMICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0308)
207#define OMAP4430_CM_SDMA_SDMA_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0320)
208#define OMAP4430_CM_MEMIF_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0400)
209#define OMAP4430_CM_MEMIF_DMM_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0420)
210#define OMAP4430_CM_MEMIF_EMIF_FW_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0428)
211#define OMAP4430_CM_MEMIF_EMIF_1_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0430)
212#define OMAP4430_CM_MEMIF_EMIF_2_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0438)
213#define OMAP4430_CM_MEMIF_DLL_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0440)
214#define OMAP4430_CM_MEMIF_EMIF_H1_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0450)
215#define OMAP4430_CM_MEMIF_EMIF_H2_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0458)
216#define OMAP4430_CM_MEMIF_DLL_H_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0460)
217#define OMAP4430_CM_D2D_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0500)
218#define OMAP4430_CM_D2D_STATICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0504)
219#define OMAP4430_CM_D2D_DYNAMICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0508)
220#define OMAP4430_CM_D2D_SAD2D_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0520)
221#define OMAP4430_CM_D2D_MODEM_ICR_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0528)
222#define OMAP4430_CM_D2D_SAD2D_FW_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0530)
223#define OMAP4430_CM_L4CFG_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0600)
224#define OMAP4430_CM_L4CFG_DYNAMICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0608)
225#define OMAP4430_CM_L4CFG_L4_CFG_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0620)
226#define OMAP4430_CM_L4CFG_HW_SEM_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0628)
227#define OMAP4430_CM_L4CFG_MAILBOX_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0630)
228#define OMAP4430_CM_L4CFG_SAR_ROM_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0638)
229#define OMAP4430_CM_L3INSTR_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0700)
230#define OMAP4430_CM_L3INSTR_L3_3_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0720)
231#define OMAP4430_CM_L3INSTR_L3_INSTR_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0728)
232#define OMAP4430_CM_L3INSTR_OCP_WP1_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CORE_MOD, 0x0740)
233
234/* CM2.IVAHD_CM2 register offsets */
235#define OMAP4430_CM_IVAHD_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_IVAHD_MOD, 0x0000)
236#define OMAP4430_CM_IVAHD_STATICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_IVAHD_MOD, 0x0004)
237#define OMAP4430_CM_IVAHD_DYNAMICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_IVAHD_MOD, 0x0008)
238#define OMAP4430_CM_IVAHD_IVAHD_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_IVAHD_MOD, 0x0020)
239#define OMAP4430_CM_IVAHD_SL2_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_IVAHD_MOD, 0x0028)
240
241/* CM2.CAM_CM2 register offsets */
242#define OMAP4430_CM_CAM_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CAM_MOD, 0x0000)
243#define OMAP4430_CM_CAM_STATICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CAM_MOD, 0x0004)
244#define OMAP4430_CM_CAM_DYNAMICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CAM_MOD, 0x0008)
245#define OMAP4430_CM_CAM_ISS_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CAM_MOD, 0x0020)
246#define OMAP4430_CM_CAM_FDIF_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CAM_MOD, 0x0028)
247
248/* CM2.DSS_CM2 register offsets */
249#define OMAP4430_CM_DSS_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_DSS_MOD, 0x0000)
250#define OMAP4430_CM_DSS_STATICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_DSS_MOD, 0x0004)
251#define OMAP4430_CM_DSS_DYNAMICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_DSS_MOD, 0x0008)
252#define OMAP4430_CM_DSS_DSS_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_DSS_MOD, 0x0020)
253#define OMAP4430_CM_DSS_DEISS_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_DSS_MOD, 0x0028)
254
255/* CM2.GFX_CM2 register offsets */
256#define OMAP4430_CM_GFX_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_GFX_MOD, 0x0000)
257#define OMAP4430_CM_GFX_STATICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_GFX_MOD, 0x0004)
258#define OMAP4430_CM_GFX_DYNAMICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_GFX_MOD, 0x0008)
259#define OMAP4430_CM_GFX_GFX_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_GFX_MOD, 0x0020)
260
261/* CM2.L3INIT_CM2 register offsets */
262#define OMAP4430_CM_L3INIT_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x0000)
263#define OMAP4430_CM_L3INIT_STATICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x0004)
264#define OMAP4430_CM_L3INIT_DYNAMICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x0008)
265#define OMAP4430_CM_L3INIT_MMC1_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x0028)
266#define OMAP4430_CM_L3INIT_MMC2_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x0030)
267#define OMAP4430_CM_L3INIT_HSI_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x0038)
268#define OMAP4430_CM_L3INIT_UNIPRO1_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x0040)
269#define OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x0058)
270#define OMAP4430_CM_L3INIT_USB_OTG_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x0060)
271#define OMAP4430_CM_L3INIT_USB_TLL_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x0068)
272#define OMAP4430_CM_L3INIT_P1500_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x0078)
273#define OMAP4430_CM_L3INIT_EMAC_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x0080)
274#define OMAP4430_CM_L3INIT_SATA_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x0088)
275#define OMAP4430_CM_L3INIT_TPPSS_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x0090)
276#define OMAP4430_CM_L3INIT_PCIESS_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x0098)
277#define OMAP4430_CM_L3INIT_CCPTX_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x00a8)
278#define OMAP4430_CM_L3INIT_XHPI_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x00c0)
279#define OMAP4430_CM_L3INIT_MMC6_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x00c8)
280#define OMAP4430_CM_L3INIT_USB_HOST_FS_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x00d0)
281#define OMAP4430_CM_L3INIT_USBPHYOCP2SCP_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L3INIT_MOD, 0x00e0)
282
283/* CM2.L4PER_CM2 register offsets */
284#define OMAP4430_CM_L4PER_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0000)
285#define OMAP4430_CM_L4PER_DYNAMICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0008)
286#define OMAP4430_CM_L4PER_ADC_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0020)
287#define OMAP4430_CM_L4PER_DMTIMER10_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0028)
288#define OMAP4430_CM_L4PER_DMTIMER11_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0030)
289#define OMAP4430_CM_L4PER_DMTIMER2_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0038)
290#define OMAP4430_CM_L4PER_DMTIMER3_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0040)
291#define OMAP4430_CM_L4PER_DMTIMER4_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0048)
292#define OMAP4430_CM_L4PER_DMTIMER9_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0050)
293#define OMAP4430_CM_L4PER_ELM_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0058)
294#define OMAP4430_CM_L4PER_GPIO2_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0060)
295#define OMAP4430_CM_L4PER_GPIO3_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0068)
296#define OMAP4430_CM_L4PER_GPIO4_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0070)
297#define OMAP4430_CM_L4PER_GPIO5_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0078)
298#define OMAP4430_CM_L4PER_GPIO6_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0080)
299#define OMAP4430_CM_L4PER_HDQ1W_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0088)
300#define OMAP4430_CM_L4PER_HECC1_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0090)
301#define OMAP4430_CM_L4PER_HECC2_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0098)
302#define OMAP4430_CM_L4PER_I2C1_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x00a0)
303#define OMAP4430_CM_L4PER_I2C2_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x00a8)
304#define OMAP4430_CM_L4PER_I2C3_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x00b0)
305#define OMAP4430_CM_L4PER_I2C4_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x00b8)
306#define OMAP4430_CM_L4PER_L4PER_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x00c0)
307#define OMAP4430_CM_L4PER_MCASP2_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x00d0)
308#define OMAP4430_CM_L4PER_MCASP3_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x00d8)
309#define OMAP4430_CM_L4PER_MCBSP4_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x00e0)
310#define OMAP4430_CM_L4PER_MGATE_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x00e8)
311#define OMAP4430_CM_L4PER_MCSPI1_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x00f0)
312#define OMAP4430_CM_L4PER_MCSPI2_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x00f8)
313#define OMAP4430_CM_L4PER_MCSPI3_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0100)
314#define OMAP4430_CM_L4PER_MCSPI4_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0108)
315#define OMAP4430_CM_L4PER_MMCSD3_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0120)
316#define OMAP4430_CM_L4PER_MMCSD4_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0128)
317#define OMAP4430_CM_L4PER_MSPROHG_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0130)
318#define OMAP4430_CM_L4PER_SLIMBUS2_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0138)
319#define OMAP4430_CM_L4PER_UART1_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0140)
320#define OMAP4430_CM_L4PER_UART2_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0148)
321#define OMAP4430_CM_L4PER_UART3_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0150)
322#define OMAP4430_CM_L4PER_UART4_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0158)
323#define OMAP4430_CM_L4PER_MMCSD5_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0160)
324#define OMAP4430_CM_L4PER_I2C5_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0168)
325#define OMAP4430_CM_L4SEC_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0180)
326#define OMAP4430_CM_L4SEC_STATICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0184)
327#define OMAP4430_CM_L4SEC_DYNAMICDEP OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x0188)
328#define OMAP4430_CM_L4SEC_AES1_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x01a0)
329#define OMAP4430_CM_L4SEC_AES2_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x01a8)
330#define OMAP4430_CM_L4SEC_DES3DES_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x01b0)
331#define OMAP4430_CM_L4SEC_PKAEIP29_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x01b8)
332#define OMAP4430_CM_L4SEC_RNG_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x01c0)
333#define OMAP4430_CM_L4SEC_SHA2MD51_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x01c8)
334#define OMAP4430_CM_L4SEC_CRYPTODMA_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_L4PER_MOD, 0x01d8)
335
336/* CM2.CEFUSE_CM2 register offsets */
337#define OMAP4430_CM_CEFUSE_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CEFUSE_MOD, 0x0000)
338#define OMAP4430_CM_CEFUSE_CEFUSE_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CEFUSE_MOD, 0x0020)
339
340/* CM2.RESTORE_CM2 register offsets */
341#define OMAP4430_CM_L3_1_CLKSTCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0000)
342#define OMAP4430_CM_L3_2_CLKSTCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0004)
343#define OMAP4430_CM_L4CFG_CLKSTCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0008)
344#define OMAP4430_CM_MEMIF_CLKSTCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x000c)
345#define OMAP4430_CM_L4PER_CLKSTCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0010)
346#define OMAP4430_CM_L3INIT_CLKSTCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0014)
347#define OMAP4430_CM_L3INSTR_L3_3_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0018)
348#define OMAP4430_CM_L3INSTR_L3_INSTR_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x001c)
349#define OMAP4430_CM_L3INSTR_OCP_WP1_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0020)
350#define OMAP4430_CM_L4PER_GPIO2_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0024)
351#define OMAP4430_CM_L4PER_GPIO3_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0028)
352#define OMAP4430_CM_L4PER_GPIO4_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x002c)
353#define OMAP4430_CM_L4PER_GPIO5_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0030)
354#define OMAP4430_CM_L4PER_GPIO6_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0034)
355#define OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0038)
356#define OMAP4430_CM_L3INIT_USB_TLL_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x003c)
357#define OMAP4430_CM_SDMA_STATICDEP_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0040)
358#endif
diff --git a/arch/arm/mach-omap2/control.c b/arch/arm/mach-omap2/control.c
index 5f3aad977842..43f8a33655d4 100644
--- a/arch/arm/mach-omap2/control.c
+++ b/arch/arm/mach-omap2/control.c
@@ -15,16 +15,136 @@
15#include <linux/kernel.h> 15#include <linux/kernel.h>
16#include <linux/io.h> 16#include <linux/io.h>
17 17
18#include <mach/common.h> 18#include <plat/common.h>
19#include <mach/control.h> 19#include <plat/control.h>
20#include <plat/sdrc.h>
21#include "cm-regbits-34xx.h"
22#include "prm-regbits-34xx.h"
23#include "cm.h"
24#include "prm.h"
25#include "sdrc.h"
20 26
21static void __iomem *omap2_ctrl_base; 27static void __iomem *omap2_ctrl_base;
22 28
29#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
30struct omap3_scratchpad {
31 u32 boot_config_ptr;
32 u32 public_restore_ptr;
33 u32 secure_ram_restore_ptr;
34 u32 sdrc_module_semaphore;
35 u32 prcm_block_offset;
36 u32 sdrc_block_offset;
37};
38
39struct omap3_scratchpad_prcm_block {
40 u32 prm_clksrc_ctrl;
41 u32 prm_clksel;
42 u32 cm_clksel_core;
43 u32 cm_clksel_wkup;
44 u32 cm_clken_pll;
45 u32 cm_autoidle_pll;
46 u32 cm_clksel1_pll;
47 u32 cm_clksel2_pll;
48 u32 cm_clksel3_pll;
49 u32 cm_clken_pll_mpu;
50 u32 cm_autoidle_pll_mpu;
51 u32 cm_clksel1_pll_mpu;
52 u32 cm_clksel2_pll_mpu;
53 u32 prcm_block_size;
54};
55
56struct omap3_scratchpad_sdrc_block {
57 u16 sysconfig;
58 u16 cs_cfg;
59 u16 sharing;
60 u16 err_type;
61 u32 dll_a_ctrl;
62 u32 dll_b_ctrl;
63 u32 power;
64 u32 cs_0;
65 u32 mcfg_0;
66 u16 mr_0;
67 u16 emr_1_0;
68 u16 emr_2_0;
69 u16 emr_3_0;
70 u32 actim_ctrla_0;
71 u32 actim_ctrlb_0;
72 u32 rfr_ctrl_0;
73 u32 cs_1;
74 u32 mcfg_1;
75 u16 mr_1;
76 u16 emr_1_1;
77 u16 emr_2_1;
78 u16 emr_3_1;
79 u32 actim_ctrla_1;
80 u32 actim_ctrlb_1;
81 u32 rfr_ctrl_1;
82 u16 dcdl_1_ctrl;
83 u16 dcdl_2_ctrl;
84 u32 flags;
85 u32 block_size;
86};
87
88void *omap3_secure_ram_storage;
89
90/*
91 * This is used to store ARM registers in SDRAM before attempting
92 * an MPU OFF. The save and restore happens from the SRAM sleep code.
93 * The address is stored in scratchpad, so that it can be used
94 * during the restore path.
95 */
96u32 omap3_arm_context[128];
97
98struct omap3_control_regs {
99 u32 sysconfig;
100 u32 devconf0;
101 u32 mem_dftrw0;
102 u32 mem_dftrw1;
103 u32 msuspendmux_0;
104 u32 msuspendmux_1;
105 u32 msuspendmux_2;
106 u32 msuspendmux_3;
107 u32 msuspendmux_4;
108 u32 msuspendmux_5;
109 u32 sec_ctrl;
110 u32 devconf1;
111 u32 csirxfe;
112 u32 iva2_bootaddr;
113 u32 iva2_bootmod;
114 u32 debobs_0;
115 u32 debobs_1;
116 u32 debobs_2;
117 u32 debobs_3;
118 u32 debobs_4;
119 u32 debobs_5;
120 u32 debobs_6;
121 u32 debobs_7;
122 u32 debobs_8;
123 u32 prog_io0;
124 u32 prog_io1;
125 u32 dss_dpll_spreading;
126 u32 core_dpll_spreading;
127 u32 per_dpll_spreading;
128 u32 usbhost_dpll_spreading;
129 u32 pbias_lite;
130 u32 temp_sensor;
131 u32 sramldo4;
132 u32 sramldo5;
133 u32 csi;
134};
135
136static struct omap3_control_regs control_context;
137#endif /* CONFIG_ARCH_OMAP3 && CONFIG_PM */
138
23#define OMAP_CTRL_REGADDR(reg) (omap2_ctrl_base + (reg)) 139#define OMAP_CTRL_REGADDR(reg) (omap2_ctrl_base + (reg))
24 140
25void __init omap2_set_globals_control(struct omap_globals *omap2_globals) 141void __init omap2_set_globals_control(struct omap_globals *omap2_globals)
26{ 142{
27 omap2_ctrl_base = omap2_globals->ctrl; 143 /* Static mapping, never released */
144 if (omap2_globals->ctrl) {
145 omap2_ctrl_base = ioremap(omap2_globals->ctrl, SZ_4K);
146 WARN_ON(!omap2_ctrl_base);
147 }
28} 148}
29 149
30void __iomem *omap_ctrl_base_get(void) 150void __iomem *omap_ctrl_base_get(void)
@@ -62,3 +182,268 @@ void omap_ctrl_writel(u32 val, u16 offset)
62 __raw_writel(val, OMAP_CTRL_REGADDR(offset)); 182 __raw_writel(val, OMAP_CTRL_REGADDR(offset));
63} 183}
64 184
185#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
186/*
187 * Clears the scratchpad contents in case of cold boot-
188 * called during bootup
189 */
190void omap3_clear_scratchpad_contents(void)
191{
192 u32 max_offset = OMAP343X_SCRATCHPAD_ROM_OFFSET;
193 u32 *v_addr;
194 u32 offset = 0;
195 v_addr = OMAP2_L4_IO_ADDRESS(OMAP343X_SCRATCHPAD_ROM);
196 if (prm_read_mod_reg(OMAP3430_GR_MOD, OMAP3_PRM_RSTST_OFFSET) &
197 OMAP3430_GLOBAL_COLD_RST) {
198 for ( ; offset <= max_offset; offset += 0x4)
199 __raw_writel(0x0, (v_addr + offset));
200 prm_set_mod_reg_bits(OMAP3430_GLOBAL_COLD_RST, OMAP3430_GR_MOD,
201 OMAP3_PRM_RSTST_OFFSET);
202 }
203}
204
205/* Populate the scratchpad structure with restore structure */
206void omap3_save_scratchpad_contents(void)
207{
208 void * __iomem scratchpad_address;
209 u32 arm_context_addr;
210 struct omap3_scratchpad scratchpad_contents;
211 struct omap3_scratchpad_prcm_block prcm_block_contents;
212 struct omap3_scratchpad_sdrc_block sdrc_block_contents;
213
214 /* Populate the Scratchpad contents */
215 scratchpad_contents.boot_config_ptr = 0x0;
216 if (omap_rev() != OMAP3430_REV_ES3_0 &&
217 omap_rev() != OMAP3430_REV_ES3_1)
218 scratchpad_contents.public_restore_ptr =
219 virt_to_phys(get_restore_pointer());
220 else
221 scratchpad_contents.public_restore_ptr =
222 virt_to_phys(get_es3_restore_pointer());
223 if (omap_type() == OMAP2_DEVICE_TYPE_GP)
224 scratchpad_contents.secure_ram_restore_ptr = 0x0;
225 else
226 scratchpad_contents.secure_ram_restore_ptr =
227 (u32) __pa(omap3_secure_ram_storage);
228 scratchpad_contents.sdrc_module_semaphore = 0x0;
229 scratchpad_contents.prcm_block_offset = 0x2C;
230 scratchpad_contents.sdrc_block_offset = 0x64;
231
232 /* Populate the PRCM block contents */
233 prcm_block_contents.prm_clksrc_ctrl = prm_read_mod_reg(OMAP3430_GR_MOD,
234 OMAP3_PRM_CLKSRC_CTRL_OFFSET);
235 prcm_block_contents.prm_clksel = prm_read_mod_reg(OMAP3430_CCR_MOD,
236 OMAP3_PRM_CLKSEL_OFFSET);
237 prcm_block_contents.cm_clksel_core =
238 cm_read_mod_reg(CORE_MOD, CM_CLKSEL);
239 prcm_block_contents.cm_clksel_wkup =
240 cm_read_mod_reg(WKUP_MOD, CM_CLKSEL);
241 prcm_block_contents.cm_clken_pll =
242 cm_read_mod_reg(PLL_MOD, CM_CLKEN);
243 prcm_block_contents.cm_autoidle_pll =
244 cm_read_mod_reg(PLL_MOD, OMAP3430_CM_AUTOIDLE_PLL);
245 prcm_block_contents.cm_clksel1_pll =
246 cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL1_PLL);
247 prcm_block_contents.cm_clksel2_pll =
248 cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL2_PLL);
249 prcm_block_contents.cm_clksel3_pll =
250 cm_read_mod_reg(PLL_MOD, OMAP3430_CM_CLKSEL3);
251 prcm_block_contents.cm_clken_pll_mpu =
252 cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKEN_PLL);
253 prcm_block_contents.cm_autoidle_pll_mpu =
254 cm_read_mod_reg(MPU_MOD, OMAP3430_CM_AUTOIDLE_PLL);
255 prcm_block_contents.cm_clksel1_pll_mpu =
256 cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKSEL1_PLL);
257 prcm_block_contents.cm_clksel2_pll_mpu =
258 cm_read_mod_reg(MPU_MOD, OMAP3430_CM_CLKSEL2_PLL);
259 prcm_block_contents.prcm_block_size = 0x0;
260
261 /* Populate the SDRC block contents */
262 sdrc_block_contents.sysconfig =
263 (sdrc_read_reg(SDRC_SYSCONFIG) & 0xFFFF);
264 sdrc_block_contents.cs_cfg =
265 (sdrc_read_reg(SDRC_CS_CFG) & 0xFFFF);
266 sdrc_block_contents.sharing =
267 (sdrc_read_reg(SDRC_SHARING) & 0xFFFF);
268 sdrc_block_contents.err_type =
269 (sdrc_read_reg(SDRC_ERR_TYPE) & 0xFFFF);
270 sdrc_block_contents.dll_a_ctrl = sdrc_read_reg(SDRC_DLLA_CTRL);
271 sdrc_block_contents.dll_b_ctrl = 0x0;
272 /*
273 * Due to a OMAP3 errata (1.142), on EMU/HS devices SRDC should
274 * be programed to issue automatic self refresh on timeout
275 * of AUTO_CNT = 1 prior to any transition to OFF mode.
276 */
277 if ((omap_type() != OMAP2_DEVICE_TYPE_GP)
278 && (omap_rev() >= OMAP3430_REV_ES3_0))
279 sdrc_block_contents.power = (sdrc_read_reg(SDRC_POWER) &
280 ~(SDRC_POWER_AUTOCOUNT_MASK|
281 SDRC_POWER_CLKCTRL_MASK)) |
282 (1 << SDRC_POWER_AUTOCOUNT_SHIFT) |
283 SDRC_SELF_REFRESH_ON_AUTOCOUNT;
284 else
285 sdrc_block_contents.power = sdrc_read_reg(SDRC_POWER);
286
287 sdrc_block_contents.cs_0 = 0x0;
288 sdrc_block_contents.mcfg_0 = sdrc_read_reg(SDRC_MCFG_0);
289 sdrc_block_contents.mr_0 = (sdrc_read_reg(SDRC_MR_0) & 0xFFFF);
290 sdrc_block_contents.emr_1_0 = 0x0;
291 sdrc_block_contents.emr_2_0 = 0x0;
292 sdrc_block_contents.emr_3_0 = 0x0;
293 sdrc_block_contents.actim_ctrla_0 =
294 sdrc_read_reg(SDRC_ACTIM_CTRL_A_0);
295 sdrc_block_contents.actim_ctrlb_0 =
296 sdrc_read_reg(SDRC_ACTIM_CTRL_B_0);
297 sdrc_block_contents.rfr_ctrl_0 =
298 sdrc_read_reg(SDRC_RFR_CTRL_0);
299 sdrc_block_contents.cs_1 = 0x0;
300 sdrc_block_contents.mcfg_1 = sdrc_read_reg(SDRC_MCFG_1);
301 sdrc_block_contents.mr_1 = sdrc_read_reg(SDRC_MR_1) & 0xFFFF;
302 sdrc_block_contents.emr_1_1 = 0x0;
303 sdrc_block_contents.emr_2_1 = 0x0;
304 sdrc_block_contents.emr_3_1 = 0x0;
305 sdrc_block_contents.actim_ctrla_1 =
306 sdrc_read_reg(SDRC_ACTIM_CTRL_A_1);
307 sdrc_block_contents.actim_ctrlb_1 =
308 sdrc_read_reg(SDRC_ACTIM_CTRL_B_1);
309 sdrc_block_contents.rfr_ctrl_1 =
310 sdrc_read_reg(SDRC_RFR_CTRL_1);
311 sdrc_block_contents.dcdl_1_ctrl = 0x0;
312 sdrc_block_contents.dcdl_2_ctrl = 0x0;
313 sdrc_block_contents.flags = 0x0;
314 sdrc_block_contents.block_size = 0x0;
315
316 arm_context_addr = virt_to_phys(omap3_arm_context);
317
318 /* Copy all the contents to the scratchpad location */
319 scratchpad_address = OMAP2_L4_IO_ADDRESS(OMAP343X_SCRATCHPAD);
320 memcpy_toio(scratchpad_address, &scratchpad_contents,
321 sizeof(scratchpad_contents));
322 /* Scratchpad contents being 32 bits, a divide by 4 done here */
323 memcpy_toio(scratchpad_address +
324 scratchpad_contents.prcm_block_offset,
325 &prcm_block_contents, sizeof(prcm_block_contents));
326 memcpy_toio(scratchpad_address +
327 scratchpad_contents.sdrc_block_offset,
328 &sdrc_block_contents, sizeof(sdrc_block_contents));
329 /*
330 * Copies the address of the location in SDRAM where ARM
331 * registers get saved during a MPU OFF transition.
332 */
333 memcpy_toio(scratchpad_address +
334 scratchpad_contents.sdrc_block_offset +
335 sizeof(sdrc_block_contents), &arm_context_addr, 4);
336}
337
338void omap3_control_save_context(void)
339{
340 control_context.sysconfig = omap_ctrl_readl(OMAP2_CONTROL_SYSCONFIG);
341 control_context.devconf0 = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
342 control_context.mem_dftrw0 =
343 omap_ctrl_readl(OMAP343X_CONTROL_MEM_DFTRW0);
344 control_context.mem_dftrw1 =
345 omap_ctrl_readl(OMAP343X_CONTROL_MEM_DFTRW1);
346 control_context.msuspendmux_0 =
347 omap_ctrl_readl(OMAP2_CONTROL_MSUSPENDMUX_0);
348 control_context.msuspendmux_1 =
349 omap_ctrl_readl(OMAP2_CONTROL_MSUSPENDMUX_1);
350 control_context.msuspendmux_2 =
351 omap_ctrl_readl(OMAP2_CONTROL_MSUSPENDMUX_2);
352 control_context.msuspendmux_3 =
353 omap_ctrl_readl(OMAP2_CONTROL_MSUSPENDMUX_3);
354 control_context.msuspendmux_4 =
355 omap_ctrl_readl(OMAP2_CONTROL_MSUSPENDMUX_4);
356 control_context.msuspendmux_5 =
357 omap_ctrl_readl(OMAP2_CONTROL_MSUSPENDMUX_5);
358 control_context.sec_ctrl = omap_ctrl_readl(OMAP2_CONTROL_SEC_CTRL);
359 control_context.devconf1 = omap_ctrl_readl(OMAP343X_CONTROL_DEVCONF1);
360 control_context.csirxfe = omap_ctrl_readl(OMAP343X_CONTROL_CSIRXFE);
361 control_context.iva2_bootaddr =
362 omap_ctrl_readl(OMAP343X_CONTROL_IVA2_BOOTADDR);
363 control_context.iva2_bootmod =
364 omap_ctrl_readl(OMAP343X_CONTROL_IVA2_BOOTMOD);
365 control_context.debobs_0 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(0));
366 control_context.debobs_1 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(1));
367 control_context.debobs_2 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(2));
368 control_context.debobs_3 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(3));
369 control_context.debobs_4 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(4));
370 control_context.debobs_5 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(5));
371 control_context.debobs_6 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(6));
372 control_context.debobs_7 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(7));
373 control_context.debobs_8 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(8));
374 control_context.prog_io0 = omap_ctrl_readl(OMAP343X_CONTROL_PROG_IO0);
375 control_context.prog_io1 = omap_ctrl_readl(OMAP343X_CONTROL_PROG_IO1);
376 control_context.dss_dpll_spreading =
377 omap_ctrl_readl(OMAP343X_CONTROL_DSS_DPLL_SPREADING);
378 control_context.core_dpll_spreading =
379 omap_ctrl_readl(OMAP343X_CONTROL_CORE_DPLL_SPREADING);
380 control_context.per_dpll_spreading =
381 omap_ctrl_readl(OMAP343X_CONTROL_PER_DPLL_SPREADING);
382 control_context.usbhost_dpll_spreading =
383 omap_ctrl_readl(OMAP343X_CONTROL_USBHOST_DPLL_SPREADING);
384 control_context.pbias_lite =
385 omap_ctrl_readl(OMAP343X_CONTROL_PBIAS_LITE);
386 control_context.temp_sensor =
387 omap_ctrl_readl(OMAP343X_CONTROL_TEMP_SENSOR);
388 control_context.sramldo4 = omap_ctrl_readl(OMAP343X_CONTROL_SRAMLDO4);
389 control_context.sramldo5 = omap_ctrl_readl(OMAP343X_CONTROL_SRAMLDO5);
390 control_context.csi = omap_ctrl_readl(OMAP343X_CONTROL_CSI);
391 return;
392}
393
394void omap3_control_restore_context(void)
395{
396 omap_ctrl_writel(control_context.sysconfig, OMAP2_CONTROL_SYSCONFIG);
397 omap_ctrl_writel(control_context.devconf0, OMAP2_CONTROL_DEVCONF0);
398 omap_ctrl_writel(control_context.mem_dftrw0,
399 OMAP343X_CONTROL_MEM_DFTRW0);
400 omap_ctrl_writel(control_context.mem_dftrw1,
401 OMAP343X_CONTROL_MEM_DFTRW1);
402 omap_ctrl_writel(control_context.msuspendmux_0,
403 OMAP2_CONTROL_MSUSPENDMUX_0);
404 omap_ctrl_writel(control_context.msuspendmux_1,
405 OMAP2_CONTROL_MSUSPENDMUX_1);
406 omap_ctrl_writel(control_context.msuspendmux_2,
407 OMAP2_CONTROL_MSUSPENDMUX_2);
408 omap_ctrl_writel(control_context.msuspendmux_3,
409 OMAP2_CONTROL_MSUSPENDMUX_3);
410 omap_ctrl_writel(control_context.msuspendmux_4,
411 OMAP2_CONTROL_MSUSPENDMUX_4);
412 omap_ctrl_writel(control_context.msuspendmux_5,
413 OMAP2_CONTROL_MSUSPENDMUX_5);
414 omap_ctrl_writel(control_context.sec_ctrl, OMAP2_CONTROL_SEC_CTRL);
415 omap_ctrl_writel(control_context.devconf1, OMAP343X_CONTROL_DEVCONF1);
416 omap_ctrl_writel(control_context.csirxfe, OMAP343X_CONTROL_CSIRXFE);
417 omap_ctrl_writel(control_context.iva2_bootaddr,
418 OMAP343X_CONTROL_IVA2_BOOTADDR);
419 omap_ctrl_writel(control_context.iva2_bootmod,
420 OMAP343X_CONTROL_IVA2_BOOTMOD);
421 omap_ctrl_writel(control_context.debobs_0, OMAP343X_CONTROL_DEBOBS(0));
422 omap_ctrl_writel(control_context.debobs_1, OMAP343X_CONTROL_DEBOBS(1));
423 omap_ctrl_writel(control_context.debobs_2, OMAP343X_CONTROL_DEBOBS(2));
424 omap_ctrl_writel(control_context.debobs_3, OMAP343X_CONTROL_DEBOBS(3));
425 omap_ctrl_writel(control_context.debobs_4, OMAP343X_CONTROL_DEBOBS(4));
426 omap_ctrl_writel(control_context.debobs_5, OMAP343X_CONTROL_DEBOBS(5));
427 omap_ctrl_writel(control_context.debobs_6, OMAP343X_CONTROL_DEBOBS(6));
428 omap_ctrl_writel(control_context.debobs_7, OMAP343X_CONTROL_DEBOBS(7));
429 omap_ctrl_writel(control_context.debobs_8, OMAP343X_CONTROL_DEBOBS(8));
430 omap_ctrl_writel(control_context.prog_io0, OMAP343X_CONTROL_PROG_IO0);
431 omap_ctrl_writel(control_context.prog_io1, OMAP343X_CONTROL_PROG_IO1);
432 omap_ctrl_writel(control_context.dss_dpll_spreading,
433 OMAP343X_CONTROL_DSS_DPLL_SPREADING);
434 omap_ctrl_writel(control_context.core_dpll_spreading,
435 OMAP343X_CONTROL_CORE_DPLL_SPREADING);
436 omap_ctrl_writel(control_context.per_dpll_spreading,
437 OMAP343X_CONTROL_PER_DPLL_SPREADING);
438 omap_ctrl_writel(control_context.usbhost_dpll_spreading,
439 OMAP343X_CONTROL_USBHOST_DPLL_SPREADING);
440 omap_ctrl_writel(control_context.pbias_lite,
441 OMAP343X_CONTROL_PBIAS_LITE);
442 omap_ctrl_writel(control_context.temp_sensor,
443 OMAP343X_CONTROL_TEMP_SENSOR);
444 omap_ctrl_writel(control_context.sramldo4, OMAP343X_CONTROL_SRAMLDO4);
445 omap_ctrl_writel(control_context.sramldo5, OMAP343X_CONTROL_SRAMLDO5);
446 omap_ctrl_writel(control_context.csi, OMAP343X_CONTROL_CSI);
447 return;
448}
449#endif /* CONFIG_ARCH_OMAP3 && CONFIG_PM */
diff --git a/arch/arm/mach-omap2/cpuidle34xx.c b/arch/arm/mach-omap2/cpuidle34xx.c
new file mode 100644
index 000000000000..3d3d035db9af
--- /dev/null
+++ b/arch/arm/mach-omap2/cpuidle34xx.c
@@ -0,0 +1,472 @@
1/*
2 * linux/arch/arm/mach-omap2/cpuidle34xx.c
3 *
4 * OMAP3 CPU IDLE Routines
5 *
6 * Copyright (C) 2008 Texas Instruments, Inc.
7 * Rajendra Nayak <rnayak@ti.com>
8 *
9 * Copyright (C) 2007 Texas Instruments, Inc.
10 * Karthik Dasu <karthik-dp@ti.com>
11 *
12 * Copyright (C) 2006 Nokia Corporation
13 * Tony Lindgren <tony@atomide.com>
14 *
15 * Copyright (C) 2005 Texas Instruments, Inc.
16 * Richard Woodruff <r-woodruff2@ti.com>
17 *
18 * Based on pm.c for omap2
19 *
20 * This program is free software; you can redistribute it and/or modify
21 * it under the terms of the GNU General Public License version 2 as
22 * published by the Free Software Foundation.
23 */
24
25#include <linux/sched.h>
26#include <linux/cpuidle.h>
27
28#include <plat/prcm.h>
29#include <plat/irqs.h>
30#include <plat/powerdomain.h>
31#include <plat/clockdomain.h>
32#include <plat/control.h>
33#include <plat/serial.h>
34
35#include "pm.h"
36
37#ifdef CONFIG_CPU_IDLE
38
39#define OMAP3_MAX_STATES 7
40#define OMAP3_STATE_C1 0 /* C1 - MPU WFI + Core active */
41#define OMAP3_STATE_C2 1 /* C2 - MPU WFI + Core inactive */
42#define OMAP3_STATE_C3 2 /* C3 - MPU CSWR + Core inactive */
43#define OMAP3_STATE_C4 3 /* C4 - MPU OFF + Core iactive */
44#define OMAP3_STATE_C5 4 /* C5 - MPU RET + Core RET */
45#define OMAP3_STATE_C6 5 /* C6 - MPU OFF + Core RET */
46#define OMAP3_STATE_C7 6 /* C7 - MPU OFF + Core OFF */
47
48#define OMAP3_STATE_MAX OMAP3_STATE_C7
49
50struct omap3_processor_cx {
51 u8 valid;
52 u8 type;
53 u32 sleep_latency;
54 u32 wakeup_latency;
55 u32 mpu_state;
56 u32 core_state;
57 u32 threshold;
58 u32 flags;
59};
60
61struct omap3_processor_cx omap3_power_states[OMAP3_MAX_STATES];
62struct omap3_processor_cx current_cx_state;
63struct powerdomain *mpu_pd, *core_pd;
64
65/*
66 * The latencies/thresholds for various C states have
67 * to be configured from the respective board files.
68 * These are some default values (which might not provide
69 * the best power savings) used on boards which do not
70 * pass these details from the board file.
71 */
72static struct cpuidle_params cpuidle_params_table[] = {
73 /* C1 */
74 {1, 2, 2, 5},
75 /* C2 */
76 {1, 10, 10, 30},
77 /* C3 */
78 {1, 50, 50, 300},
79 /* C4 */
80 {1, 1500, 1800, 4000},
81 /* C5 */
82 {1, 2500, 7500, 12000},
83 /* C6 */
84 {1, 3000, 8500, 15000},
85 /* C7 */
86 {1, 10000, 30000, 300000},
87};
88
89static int omap3_idle_bm_check(void)
90{
91 if (!omap3_can_sleep())
92 return 1;
93 return 0;
94}
95
96static int _cpuidle_allow_idle(struct powerdomain *pwrdm,
97 struct clockdomain *clkdm)
98{
99 omap2_clkdm_allow_idle(clkdm);
100 return 0;
101}
102
103static int _cpuidle_deny_idle(struct powerdomain *pwrdm,
104 struct clockdomain *clkdm)
105{
106 omap2_clkdm_deny_idle(clkdm);
107 return 0;
108}
109
110/**
111 * omap3_enter_idle - Programs OMAP3 to enter the specified state
112 * @dev: cpuidle device
113 * @state: The target state to be programmed
114 *
115 * Called from the CPUidle framework to program the device to the
116 * specified target state selected by the governor.
117 */
118static int omap3_enter_idle(struct cpuidle_device *dev,
119 struct cpuidle_state *state)
120{
121 struct omap3_processor_cx *cx = cpuidle_get_statedata(state);
122 struct timespec ts_preidle, ts_postidle, ts_idle;
123 u32 mpu_state = cx->mpu_state, core_state = cx->core_state;
124
125 current_cx_state = *cx;
126
127 /* Used to keep track of the total time in idle */
128 getnstimeofday(&ts_preidle);
129
130 local_irq_disable();
131 local_fiq_disable();
132
133 pwrdm_set_next_pwrst(mpu_pd, mpu_state);
134 pwrdm_set_next_pwrst(core_pd, core_state);
135
136 if (omap_irq_pending() || need_resched())
137 goto return_sleep_time;
138
139 if (cx->type == OMAP3_STATE_C1) {
140 pwrdm_for_each_clkdm(mpu_pd, _cpuidle_deny_idle);
141 pwrdm_for_each_clkdm(core_pd, _cpuidle_deny_idle);
142 }
143
144 /* Execute ARM wfi */
145 omap_sram_idle();
146
147 if (cx->type == OMAP3_STATE_C1) {
148 pwrdm_for_each_clkdm(mpu_pd, _cpuidle_allow_idle);
149 pwrdm_for_each_clkdm(core_pd, _cpuidle_allow_idle);
150 }
151
152return_sleep_time:
153 getnstimeofday(&ts_postidle);
154 ts_idle = timespec_sub(ts_postidle, ts_preidle);
155
156 local_irq_enable();
157 local_fiq_enable();
158
159 return ts_idle.tv_nsec / NSEC_PER_USEC + ts_idle.tv_sec * USEC_PER_SEC;
160}
161
162/**
163 * next_valid_state - Find next valid c-state
164 * @dev: cpuidle device
165 * @state: Currently selected c-state
166 *
167 * If the current state is valid, it is returned back to the caller.
168 * Else, this function searches for a lower c-state which is still
169 * valid (as defined in omap3_power_states[]).
170 */
171static struct cpuidle_state *next_valid_state(struct cpuidle_device *dev,
172 struct cpuidle_state *curr)
173{
174 struct cpuidle_state *next = NULL;
175 struct omap3_processor_cx *cx;
176
177 cx = (struct omap3_processor_cx *)cpuidle_get_statedata(curr);
178
179 /* Check if current state is valid */
180 if (cx->valid) {
181 return curr;
182 } else {
183 u8 idx = OMAP3_STATE_MAX;
184
185 /*
186 * Reach the current state starting at highest C-state
187 */
188 for (; idx >= OMAP3_STATE_C1; idx--) {
189 if (&dev->states[idx] == curr) {
190 next = &dev->states[idx];
191 break;
192 }
193 }
194
195 /*
196 * Should never hit this condition.
197 */
198 WARN_ON(next == NULL);
199
200 /*
201 * Drop to next valid state.
202 * Start search from the next (lower) state.
203 */
204 idx--;
205 for (; idx >= OMAP3_STATE_C1; idx--) {
206 struct omap3_processor_cx *cx;
207
208 cx = cpuidle_get_statedata(&dev->states[idx]);
209 if (cx->valid) {
210 next = &dev->states[idx];
211 break;
212 }
213 }
214 /*
215 * C1 and C2 are always valid.
216 * So, no need to check for 'next==NULL' outside this loop.
217 */
218 }
219
220 return next;
221}
222
223/**
224 * omap3_enter_idle_bm - Checks for any bus activity
225 * @dev: cpuidle device
226 * @state: The target state to be programmed
227 *
228 * Used for C states with CPUIDLE_FLAG_CHECK_BM flag set. This
229 * function checks for any pending activity and then programs the
230 * device to the specified or a safer state.
231 */
232static int omap3_enter_idle_bm(struct cpuidle_device *dev,
233 struct cpuidle_state *state)
234{
235 struct cpuidle_state *new_state = next_valid_state(dev, state);
236
237 if ((state->flags & CPUIDLE_FLAG_CHECK_BM) && omap3_idle_bm_check()) {
238 BUG_ON(!dev->safe_state);
239 new_state = dev->safe_state;
240 }
241
242 dev->last_state = new_state;
243 return omap3_enter_idle(dev, new_state);
244}
245
246DEFINE_PER_CPU(struct cpuidle_device, omap3_idle_dev);
247
248/**
249 * omap3_cpuidle_update_states - Update the cpuidle states.
250 *
251 * Currently, this function toggles the validity of idle states based upon
252 * the flag 'enable_off_mode'. When the flag is set all states are valid.
253 * Else, states leading to OFF state set to be invalid.
254 */
255void omap3_cpuidle_update_states(void)
256{
257 int i;
258
259 for (i = OMAP3_STATE_C1; i < OMAP3_MAX_STATES; i++) {
260 struct omap3_processor_cx *cx = &omap3_power_states[i];
261
262 if (enable_off_mode) {
263 cx->valid = 1;
264 } else {
265 if ((cx->mpu_state == PWRDM_POWER_OFF) ||
266 (cx->core_state == PWRDM_POWER_OFF))
267 cx->valid = 0;
268 }
269 }
270}
271
272void omap3_pm_init_cpuidle(struct cpuidle_params *cpuidle_board_params)
273{
274 int i;
275
276 if (!cpuidle_board_params)
277 return;
278
279 for (i = OMAP3_STATE_C1; i < OMAP3_MAX_STATES; i++) {
280 cpuidle_params_table[i].valid =
281 cpuidle_board_params[i].valid;
282 cpuidle_params_table[i].sleep_latency =
283 cpuidle_board_params[i].sleep_latency;
284 cpuidle_params_table[i].wake_latency =
285 cpuidle_board_params[i].wake_latency;
286 cpuidle_params_table[i].threshold =
287 cpuidle_board_params[i].threshold;
288 }
289 return;
290}
291
292/* omap3_init_power_states - Initialises the OMAP3 specific C states.
293 *
294 * Below is the desciption of each C state.
295 * C1 . MPU WFI + Core active
296 * C2 . MPU WFI + Core inactive
297 * C3 . MPU CSWR + Core inactive
298 * C4 . MPU OFF + Core inactive
299 * C5 . MPU CSWR + Core CSWR
300 * C6 . MPU OFF + Core CSWR
301 * C7 . MPU OFF + Core OFF
302 */
303void omap_init_power_states(void)
304{
305 /* C1 . MPU WFI + Core active */
306 omap3_power_states[OMAP3_STATE_C1].valid =
307 cpuidle_params_table[OMAP3_STATE_C1].valid;
308 omap3_power_states[OMAP3_STATE_C1].type = OMAP3_STATE_C1;
309 omap3_power_states[OMAP3_STATE_C1].sleep_latency =
310 cpuidle_params_table[OMAP3_STATE_C1].sleep_latency;
311 omap3_power_states[OMAP3_STATE_C1].wakeup_latency =
312 cpuidle_params_table[OMAP3_STATE_C1].wake_latency;
313 omap3_power_states[OMAP3_STATE_C1].threshold =
314 cpuidle_params_table[OMAP3_STATE_C1].threshold;
315 omap3_power_states[OMAP3_STATE_C1].mpu_state = PWRDM_POWER_ON;
316 omap3_power_states[OMAP3_STATE_C1].core_state = PWRDM_POWER_ON;
317 omap3_power_states[OMAP3_STATE_C1].flags = CPUIDLE_FLAG_TIME_VALID;
318
319 /* C2 . MPU WFI + Core inactive */
320 omap3_power_states[OMAP3_STATE_C2].valid =
321 cpuidle_params_table[OMAP3_STATE_C2].valid;
322 omap3_power_states[OMAP3_STATE_C2].type = OMAP3_STATE_C2;
323 omap3_power_states[OMAP3_STATE_C2].sleep_latency =
324 cpuidle_params_table[OMAP3_STATE_C2].sleep_latency;
325 omap3_power_states[OMAP3_STATE_C2].wakeup_latency =
326 cpuidle_params_table[OMAP3_STATE_C2].wake_latency;
327 omap3_power_states[OMAP3_STATE_C2].threshold =
328 cpuidle_params_table[OMAP3_STATE_C2].threshold;
329 omap3_power_states[OMAP3_STATE_C2].mpu_state = PWRDM_POWER_ON;
330 omap3_power_states[OMAP3_STATE_C2].core_state = PWRDM_POWER_ON;
331 omap3_power_states[OMAP3_STATE_C2].flags = CPUIDLE_FLAG_TIME_VALID;
332
333 /* C3 . MPU CSWR + Core inactive */
334 omap3_power_states[OMAP3_STATE_C3].valid =
335 cpuidle_params_table[OMAP3_STATE_C3].valid;
336 omap3_power_states[OMAP3_STATE_C3].type = OMAP3_STATE_C3;
337 omap3_power_states[OMAP3_STATE_C3].sleep_latency =
338 cpuidle_params_table[OMAP3_STATE_C3].sleep_latency;
339 omap3_power_states[OMAP3_STATE_C3].wakeup_latency =
340 cpuidle_params_table[OMAP3_STATE_C3].wake_latency;
341 omap3_power_states[OMAP3_STATE_C3].threshold =
342 cpuidle_params_table[OMAP3_STATE_C3].threshold;
343 omap3_power_states[OMAP3_STATE_C3].mpu_state = PWRDM_POWER_RET;
344 omap3_power_states[OMAP3_STATE_C3].core_state = PWRDM_POWER_ON;
345 omap3_power_states[OMAP3_STATE_C3].flags = CPUIDLE_FLAG_TIME_VALID |
346 CPUIDLE_FLAG_CHECK_BM;
347
348 /* C4 . MPU OFF + Core inactive */
349 omap3_power_states[OMAP3_STATE_C4].valid =
350 cpuidle_params_table[OMAP3_STATE_C4].valid;
351 omap3_power_states[OMAP3_STATE_C4].type = OMAP3_STATE_C4;
352 omap3_power_states[OMAP3_STATE_C4].sleep_latency =
353 cpuidle_params_table[OMAP3_STATE_C4].sleep_latency;
354 omap3_power_states[OMAP3_STATE_C4].wakeup_latency =
355 cpuidle_params_table[OMAP3_STATE_C4].wake_latency;
356 omap3_power_states[OMAP3_STATE_C4].threshold =
357 cpuidle_params_table[OMAP3_STATE_C4].threshold;
358 omap3_power_states[OMAP3_STATE_C4].mpu_state = PWRDM_POWER_OFF;
359 omap3_power_states[OMAP3_STATE_C4].core_state = PWRDM_POWER_ON;
360 omap3_power_states[OMAP3_STATE_C4].flags = CPUIDLE_FLAG_TIME_VALID |
361 CPUIDLE_FLAG_CHECK_BM;
362
363 /* C5 . MPU CSWR + Core CSWR*/
364 omap3_power_states[OMAP3_STATE_C5].valid =
365 cpuidle_params_table[OMAP3_STATE_C5].valid;
366 omap3_power_states[OMAP3_STATE_C5].type = OMAP3_STATE_C5;
367 omap3_power_states[OMAP3_STATE_C5].sleep_latency =
368 cpuidle_params_table[OMAP3_STATE_C5].sleep_latency;
369 omap3_power_states[OMAP3_STATE_C5].wakeup_latency =
370 cpuidle_params_table[OMAP3_STATE_C5].wake_latency;
371 omap3_power_states[OMAP3_STATE_C5].threshold =
372 cpuidle_params_table[OMAP3_STATE_C5].threshold;
373 omap3_power_states[OMAP3_STATE_C5].mpu_state = PWRDM_POWER_RET;
374 omap3_power_states[OMAP3_STATE_C5].core_state = PWRDM_POWER_RET;
375 omap3_power_states[OMAP3_STATE_C5].flags = CPUIDLE_FLAG_TIME_VALID |
376 CPUIDLE_FLAG_CHECK_BM;
377
378 /* C6 . MPU OFF + Core CSWR */
379 omap3_power_states[OMAP3_STATE_C6].valid =
380 cpuidle_params_table[OMAP3_STATE_C6].valid;
381 omap3_power_states[OMAP3_STATE_C6].type = OMAP3_STATE_C6;
382 omap3_power_states[OMAP3_STATE_C6].sleep_latency =
383 cpuidle_params_table[OMAP3_STATE_C6].sleep_latency;
384 omap3_power_states[OMAP3_STATE_C6].wakeup_latency =
385 cpuidle_params_table[OMAP3_STATE_C6].wake_latency;
386 omap3_power_states[OMAP3_STATE_C6].threshold =
387 cpuidle_params_table[OMAP3_STATE_C6].threshold;
388 omap3_power_states[OMAP3_STATE_C6].mpu_state = PWRDM_POWER_OFF;
389 omap3_power_states[OMAP3_STATE_C6].core_state = PWRDM_POWER_RET;
390 omap3_power_states[OMAP3_STATE_C6].flags = CPUIDLE_FLAG_TIME_VALID |
391 CPUIDLE_FLAG_CHECK_BM;
392
393 /* C7 . MPU OFF + Core OFF */
394 omap3_power_states[OMAP3_STATE_C7].valid =
395 cpuidle_params_table[OMAP3_STATE_C7].valid;
396 omap3_power_states[OMAP3_STATE_C7].type = OMAP3_STATE_C7;
397 omap3_power_states[OMAP3_STATE_C7].sleep_latency =
398 cpuidle_params_table[OMAP3_STATE_C7].sleep_latency;
399 omap3_power_states[OMAP3_STATE_C7].wakeup_latency =
400 cpuidle_params_table[OMAP3_STATE_C7].wake_latency;
401 omap3_power_states[OMAP3_STATE_C7].threshold =
402 cpuidle_params_table[OMAP3_STATE_C7].threshold;
403 omap3_power_states[OMAP3_STATE_C7].mpu_state = PWRDM_POWER_OFF;
404 omap3_power_states[OMAP3_STATE_C7].core_state = PWRDM_POWER_OFF;
405 omap3_power_states[OMAP3_STATE_C7].flags = CPUIDLE_FLAG_TIME_VALID |
406 CPUIDLE_FLAG_CHECK_BM;
407}
408
409struct cpuidle_driver omap3_idle_driver = {
410 .name = "omap3_idle",
411 .owner = THIS_MODULE,
412};
413
414/**
415 * omap3_idle_init - Init routine for OMAP3 idle
416 *
417 * Registers the OMAP3 specific cpuidle driver with the cpuidle
418 * framework with the valid set of states.
419 */
420int __init omap3_idle_init(void)
421{
422 int i, count = 0;
423 struct omap3_processor_cx *cx;
424 struct cpuidle_state *state;
425 struct cpuidle_device *dev;
426
427 mpu_pd = pwrdm_lookup("mpu_pwrdm");
428 core_pd = pwrdm_lookup("core_pwrdm");
429
430 omap_init_power_states();
431 cpuidle_register_driver(&omap3_idle_driver);
432
433 dev = &per_cpu(omap3_idle_dev, smp_processor_id());
434
435 for (i = OMAP3_STATE_C1; i < OMAP3_MAX_STATES; i++) {
436 cx = &omap3_power_states[i];
437 state = &dev->states[count];
438
439 if (!cx->valid)
440 continue;
441 cpuidle_set_statedata(state, cx);
442 state->exit_latency = cx->sleep_latency + cx->wakeup_latency;
443 state->target_residency = cx->threshold;
444 state->flags = cx->flags;
445 state->enter = (state->flags & CPUIDLE_FLAG_CHECK_BM) ?
446 omap3_enter_idle_bm : omap3_enter_idle;
447 if (cx->type == OMAP3_STATE_C1)
448 dev->safe_state = state;
449 sprintf(state->name, "C%d", count+1);
450 count++;
451 }
452
453 if (!count)
454 return -EINVAL;
455 dev->state_count = count;
456
457 omap3_cpuidle_update_states();
458
459 if (cpuidle_register_device(dev)) {
460 printk(KERN_ERR "%s: CPUidle register device failed\n",
461 __func__);
462 return -EIO;
463 }
464
465 return 0;
466}
467#else
468int __init omap3_idle_init(void)
469{
470 return 0;
471}
472#endif /* CONFIG_CPU_IDLE */
diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c
index faf7a1e0c525..2271b9bd1f50 100644
--- a/arch/arm/mach-omap2/devices.c
+++ b/arch/arm/mach-omap2/devices.c
@@ -20,12 +20,14 @@
20#include <asm/mach-types.h> 20#include <asm/mach-types.h>
21#include <asm/mach/map.h> 21#include <asm/mach/map.h>
22 22
23#include <mach/control.h> 23#include <plat/control.h>
24#include <mach/tc.h> 24#include <plat/tc.h>
25#include <mach/board.h> 25#include <plat/board.h>
26#include <mach/mux.h> 26#include <plat/mux.h>
27#include <mach/gpio.h> 27#include <mach/gpio.h>
28#include <mach/mmc.h> 28#include <plat/mmc.h>
29
30#include "mux.h"
29 31
30#if defined(CONFIG_VIDEO_OMAP2) || defined(CONFIG_VIDEO_OMAP2_MODULE) 32#if defined(CONFIG_VIDEO_OMAP2) || defined(CONFIG_VIDEO_OMAP2_MODULE)
31 33
@@ -136,8 +138,9 @@ static inline void omap_init_camera(void)
136 138
137#if defined(CONFIG_OMAP_MBOX_FWK) || defined(CONFIG_OMAP_MBOX_FWK_MODULE) 139#if defined(CONFIG_OMAP_MBOX_FWK) || defined(CONFIG_OMAP_MBOX_FWK_MODULE)
138 140
139#define MBOX_REG_SIZE 0x120 141#define MBOX_REG_SIZE 0x120
140 142
143#ifdef CONFIG_ARCH_OMAP2
141static struct resource omap2_mbox_resources[] = { 144static struct resource omap2_mbox_resources[] = {
142 { 145 {
143 .start = OMAP24XX_MAILBOX_BASE, 146 .start = OMAP24XX_MAILBOX_BASE,
@@ -153,7 +156,13 @@ static struct resource omap2_mbox_resources[] = {
153 .flags = IORESOURCE_IRQ, 156 .flags = IORESOURCE_IRQ,
154 }, 157 },
155}; 158};
159static int omap2_mbox_resources_sz = ARRAY_SIZE(omap2_mbox_resources);
160#else
161#define omap2_mbox_resources NULL
162#define omap2_mbox_resources_sz 0
163#endif
156 164
165#ifdef CONFIG_ARCH_OMAP3
157static struct resource omap3_mbox_resources[] = { 166static struct resource omap3_mbox_resources[] = {
158 { 167 {
159 .start = OMAP34XX_MAILBOX_BASE, 168 .start = OMAP34XX_MAILBOX_BASE,
@@ -165,6 +174,32 @@ static struct resource omap3_mbox_resources[] = {
165 .flags = IORESOURCE_IRQ, 174 .flags = IORESOURCE_IRQ,
166 }, 175 },
167}; 176};
177static int omap3_mbox_resources_sz = ARRAY_SIZE(omap3_mbox_resources);
178#else
179#define omap3_mbox_resources NULL
180#define omap3_mbox_resources_sz 0
181#endif
182
183#ifdef CONFIG_ARCH_OMAP4
184
185#define OMAP4_MBOX_REG_SIZE 0x130
186static struct resource omap4_mbox_resources[] = {
187 {
188 .start = OMAP44XX_MAILBOX_BASE,
189 .end = OMAP44XX_MAILBOX_BASE +
190 OMAP4_MBOX_REG_SIZE - 1,
191 .flags = IORESOURCE_MEM,
192 },
193 {
194 .start = OMAP44XX_IRQ_MAIL_U0,
195 .flags = IORESOURCE_IRQ,
196 },
197};
198static int omap4_mbox_resources_sz = ARRAY_SIZE(omap4_mbox_resources);
199#else
200#define omap4_mbox_resources NULL
201#define omap4_mbox_resources_sz 0
202#endif
168 203
169static struct platform_device mbox_device = { 204static struct platform_device mbox_device = {
170 .name = "omap2-mailbox", 205 .name = "omap2-mailbox",
@@ -173,12 +208,15 @@ static struct platform_device mbox_device = {
173 208
174static inline void omap_init_mbox(void) 209static inline void omap_init_mbox(void)
175{ 210{
176 if (cpu_is_omap2420()) { 211 if (cpu_is_omap24xx()) {
177 mbox_device.num_resources = ARRAY_SIZE(omap2_mbox_resources);
178 mbox_device.resource = omap2_mbox_resources; 212 mbox_device.resource = omap2_mbox_resources;
179 } else if (cpu_is_omap3430()) { 213 mbox_device.num_resources = omap2_mbox_resources_sz;
180 mbox_device.num_resources = ARRAY_SIZE(omap3_mbox_resources); 214 } else if (cpu_is_omap34xx()) {
181 mbox_device.resource = omap3_mbox_resources; 215 mbox_device.resource = omap3_mbox_resources;
216 mbox_device.num_resources = omap3_mbox_resources_sz;
217 } else if (cpu_is_omap44xx()) {
218 mbox_device.resource = omap4_mbox_resources;
219 mbox_device.num_resources = omap4_mbox_resources_sz;
182 } else { 220 } else {
183 pr_err("%s: platform not supported\n", __func__); 221 pr_err("%s: platform not supported\n", __func__);
184 return; 222 return;
@@ -250,7 +288,7 @@ static inline void omap_init_sti(void) {}
250 288
251#if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE) 289#if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE)
252 290
253#include <mach/mcspi.h> 291#include <plat/mcspi.h>
254 292
255#define OMAP2_MCSPI1_BASE 0x48098000 293#define OMAP2_MCSPI1_BASE 0x48098000
256#define OMAP2_MCSPI2_BASE 0x4809a000 294#define OMAP2_MCSPI2_BASE 0x4809a000
@@ -472,7 +510,12 @@ static struct platform_device dummy_pdev = {
472 **/ 510 **/
473static void __init omap_hsmmc_reset(void) 511static void __init omap_hsmmc_reset(void)
474{ 512{
475 u32 i, nr_controllers = cpu_is_omap44xx() ? OMAP44XX_NR_MMC : 513 u32 i, nr_controllers;
514
515 if (cpu_is_omap242x())
516 return;
517
518 nr_controllers = cpu_is_omap44xx() ? OMAP44XX_NR_MMC :
476 (cpu_is_omap34xx() ? OMAP34XX_NR_MMC : OMAP24XX_NR_MMC); 519 (cpu_is_omap34xx() ? OMAP34XX_NR_MMC : OMAP24XX_NR_MMC);
477 520
478 for (i = 0; i < nr_controllers; i++) { 521 for (i = 0; i < nr_controllers; i++) {
@@ -575,29 +618,42 @@ static inline void omap2_mmc_mux(struct omap_mmc_platform_data *mmc_controller,
575 } 618 }
576 } 619 }
577 620
578 if (cpu_is_omap3430()) { 621 if (cpu_is_omap34xx()) {
579 if (controller_nr == 0) { 622 if (controller_nr == 0) {
580 omap_cfg_reg(N28_3430_MMC1_CLK); 623 omap_mux_init_signal("sdmmc1_clk",
581 omap_cfg_reg(M27_3430_MMC1_CMD); 624 OMAP_PIN_INPUT_PULLUP);
582 omap_cfg_reg(N27_3430_MMC1_DAT0); 625 omap_mux_init_signal("sdmmc1_cmd",
626 OMAP_PIN_INPUT_PULLUP);
627 omap_mux_init_signal("sdmmc1_dat0",
628 OMAP_PIN_INPUT_PULLUP);
583 if (mmc_controller->slots[0].wires == 4 || 629 if (mmc_controller->slots[0].wires == 4 ||
584 mmc_controller->slots[0].wires == 8) { 630 mmc_controller->slots[0].wires == 8) {
585 omap_cfg_reg(N26_3430_MMC1_DAT1); 631 omap_mux_init_signal("sdmmc1_dat1",
586 omap_cfg_reg(N25_3430_MMC1_DAT2); 632 OMAP_PIN_INPUT_PULLUP);
587 omap_cfg_reg(P28_3430_MMC1_DAT3); 633 omap_mux_init_signal("sdmmc1_dat2",
634 OMAP_PIN_INPUT_PULLUP);
635 omap_mux_init_signal("sdmmc1_dat3",
636 OMAP_PIN_INPUT_PULLUP);
588 } 637 }
589 if (mmc_controller->slots[0].wires == 8) { 638 if (mmc_controller->slots[0].wires == 8) {
590 omap_cfg_reg(P27_3430_MMC1_DAT4); 639 omap_mux_init_signal("sdmmc1_dat4",
591 omap_cfg_reg(P26_3430_MMC1_DAT5); 640 OMAP_PIN_INPUT_PULLUP);
592 omap_cfg_reg(R27_3430_MMC1_DAT6); 641 omap_mux_init_signal("sdmmc1_dat5",
593 omap_cfg_reg(R25_3430_MMC1_DAT7); 642 OMAP_PIN_INPUT_PULLUP);
643 omap_mux_init_signal("sdmmc1_dat6",
644 OMAP_PIN_INPUT_PULLUP);
645 omap_mux_init_signal("sdmmc1_dat7",
646 OMAP_PIN_INPUT_PULLUP);
594 } 647 }
595 } 648 }
596 if (controller_nr == 1) { 649 if (controller_nr == 1) {
597 /* MMC2 */ 650 /* MMC2 */
598 omap_cfg_reg(AE2_3430_MMC2_CLK); 651 omap_mux_init_signal("sdmmc2_clk",
599 omap_cfg_reg(AG5_3430_MMC2_CMD); 652 OMAP_PIN_INPUT_PULLUP);
600 omap_cfg_reg(AH5_3430_MMC2_DAT0); 653 omap_mux_init_signal("sdmmc2_cmd",
654 OMAP_PIN_INPUT_PULLUP);
655 omap_mux_init_signal("sdmmc2_dat0",
656 OMAP_PIN_INPUT_PULLUP);
601 657
602 /* 658 /*
603 * For 8 wire configurations, Lines DAT4, 5, 6 and 7 need to be muxed 659 * For 8 wire configurations, Lines DAT4, 5, 6 and 7 need to be muxed
@@ -605,9 +661,22 @@ static inline void omap2_mmc_mux(struct omap_mmc_platform_data *mmc_controller,
605 */ 661 */
606 if (mmc_controller->slots[0].wires == 4 || 662 if (mmc_controller->slots[0].wires == 4 ||
607 mmc_controller->slots[0].wires == 8) { 663 mmc_controller->slots[0].wires == 8) {
608 omap_cfg_reg(AH4_3430_MMC2_DAT1); 664 omap_mux_init_signal("sdmmc2_dat1",
609 omap_cfg_reg(AG4_3430_MMC2_DAT2); 665 OMAP_PIN_INPUT_PULLUP);
610 omap_cfg_reg(AF4_3430_MMC2_DAT3); 666 omap_mux_init_signal("sdmmc2_dat2",
667 OMAP_PIN_INPUT_PULLUP);
668 omap_mux_init_signal("sdmmc2_dat3",
669 OMAP_PIN_INPUT_PULLUP);
670 }
671 if (mmc_controller->slots[0].wires == 8) {
672 omap_mux_init_signal("sdmmc2_dat4.sdmmc2_dat4",
673 OMAP_PIN_INPUT_PULLUP);
674 omap_mux_init_signal("sdmmc2_dat5.sdmmc2_dat5",
675 OMAP_PIN_INPUT_PULLUP);
676 omap_mux_init_signal("sdmmc2_dat6.sdmmc2_dat6",
677 OMAP_PIN_INPUT_PULLUP);
678 omap_mux_init_signal("sdmmc2_dat7.sdmmc2_dat7",
679 OMAP_PIN_INPUT_PULLUP);
611 } 680 }
612 } 681 }
613 682
@@ -651,13 +720,13 @@ void __init omap2_init_mmc(struct omap_mmc_platform_data **mmc_data,
651 if (!cpu_is_omap44xx()) 720 if (!cpu_is_omap44xx())
652 return; 721 return;
653 base = OMAP4_MMC4_BASE + OMAP4_MMC_REG_OFFSET; 722 base = OMAP4_MMC4_BASE + OMAP4_MMC_REG_OFFSET;
654 irq = INT_44XX_MMC4_IRQ; 723 irq = OMAP44XX_IRQ_MMC4;
655 break; 724 break;
656 case 4: 725 case 4:
657 if (!cpu_is_omap44xx()) 726 if (!cpu_is_omap44xx())
658 return; 727 return;
659 base = OMAP4_MMC5_BASE + OMAP4_MMC_REG_OFFSET; 728 base = OMAP4_MMC5_BASE + OMAP4_MMC_REG_OFFSET;
660 irq = INT_44XX_MMC5_IRQ; 729 irq = OMAP44XX_IRQ_MMC5;
661 break; 730 break;
662 default: 731 default:
663 continue; 732 continue;
@@ -669,7 +738,7 @@ void __init omap2_init_mmc(struct omap_mmc_platform_data **mmc_data,
669 } else if (cpu_is_omap44xx()) { 738 } else if (cpu_is_omap44xx()) {
670 if (i < 3) { 739 if (i < 3) {
671 base += OMAP4_MMC_REG_OFFSET; 740 base += OMAP4_MMC_REG_OFFSET;
672 irq += IRQ_GIC_START; 741 irq += OMAP44XX_IRQ_GIC_START;
673 } 742 }
674 size = OMAP4_HSMMC_SIZE; 743 size = OMAP4_HSMMC_SIZE;
675 name = "mmci-omap-hs"; 744 name = "mmci-omap-hs";
diff --git a/arch/arm/mach-omap2/dpll3xxx.c b/arch/arm/mach-omap2/dpll3xxx.c
new file mode 100644
index 000000000000..b32ccd954a1b
--- /dev/null
+++ b/arch/arm/mach-omap2/dpll3xxx.c
@@ -0,0 +1,599 @@
1/*
2 * OMAP3/4 - specific DPLL control functions
3 *
4 * Copyright (C) 2009-2010 Texas Instruments, Inc.
5 * Copyright (C) 2009-2010 Nokia Corporation
6 *
7 * Written by Paul Walmsley
8 * Testing and integration fixes by Jouni Högander
9 *
10 * 36xx support added by Vishwanath BS, Richard Woodruff, and Nishanth
11 * Menon
12 *
13 * Parts of this code are based on code written by
14 * Richard Woodruff, Tony Lindgren, Tuukka Tikkanen, Karthik Dasu
15 *
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License version 2 as
18 * published by the Free Software Foundation.
19 */
20
21#include <linux/kernel.h>
22#include <linux/device.h>
23#include <linux/list.h>
24#include <linux/errno.h>
25#include <linux/delay.h>
26#include <linux/clk.h>
27#include <linux/io.h>
28#include <linux/bitops.h>
29
30#include <plat/cpu.h>
31#include <plat/clock.h>
32#include <asm/clkdev.h>
33
34#include "clock.h"
35#include "prm.h"
36#include "prm-regbits-34xx.h"
37#include "cm.h"
38#include "cm-regbits-34xx.h"
39
40/* CM_AUTOIDLE_PLL*.AUTO_* bit values */
41#define DPLL_AUTOIDLE_DISABLE 0x0
42#define DPLL_AUTOIDLE_LOW_POWER_STOP 0x1
43
44#define MAX_DPLL_WAIT_TRIES 1000000
45
46/* Private functions */
47
48/* _omap3_dpll_write_clken - write clken_bits arg to a DPLL's enable bits */
49static void _omap3_dpll_write_clken(struct clk *clk, u8 clken_bits)
50{
51 const struct dpll_data *dd;
52 u32 v;
53
54 dd = clk->dpll_data;
55
56 v = __raw_readl(dd->control_reg);
57 v &= ~dd->enable_mask;
58 v |= clken_bits << __ffs(dd->enable_mask);
59 __raw_writel(v, dd->control_reg);
60}
61
62/* _omap3_wait_dpll_status: wait for a DPLL to enter a specific state */
63static int _omap3_wait_dpll_status(struct clk *clk, u8 state)
64{
65 const struct dpll_data *dd;
66 int i = 0;
67 int ret = -EINVAL;
68
69 dd = clk->dpll_data;
70
71 state <<= __ffs(dd->idlest_mask);
72
73 while (((__raw_readl(dd->idlest_reg) & dd->idlest_mask) != state) &&
74 i < MAX_DPLL_WAIT_TRIES) {
75 i++;
76 udelay(1);
77 }
78
79 if (i == MAX_DPLL_WAIT_TRIES) {
80 printk(KERN_ERR "clock: %s failed transition to '%s'\n",
81 clk->name, (state) ? "locked" : "bypassed");
82 } else {
83 pr_debug("clock: %s transition to '%s' in %d loops\n",
84 clk->name, (state) ? "locked" : "bypassed", i);
85
86 ret = 0;
87 }
88
89 return ret;
90}
91
92/* From 3430 TRM ES2 4.7.6.2 */
93static u16 _omap3_dpll_compute_freqsel(struct clk *clk, u8 n)
94{
95 unsigned long fint;
96 u16 f = 0;
97
98 fint = clk->dpll_data->clk_ref->rate / n;
99
100 pr_debug("clock: fint is %lu\n", fint);
101
102 if (fint >= 750000 && fint <= 1000000)
103 f = 0x3;
104 else if (fint > 1000000 && fint <= 1250000)
105 f = 0x4;
106 else if (fint > 1250000 && fint <= 1500000)
107 f = 0x5;
108 else if (fint > 1500000 && fint <= 1750000)
109 f = 0x6;
110 else if (fint > 1750000 && fint <= 2100000)
111 f = 0x7;
112 else if (fint > 7500000 && fint <= 10000000)
113 f = 0xB;
114 else if (fint > 10000000 && fint <= 12500000)
115 f = 0xC;
116 else if (fint > 12500000 && fint <= 15000000)
117 f = 0xD;
118 else if (fint > 15000000 && fint <= 17500000)
119 f = 0xE;
120 else if (fint > 17500000 && fint <= 21000000)
121 f = 0xF;
122 else
123 pr_debug("clock: unknown freqsel setting for %d\n", n);
124
125 return f;
126}
127
128/*
129 * _omap3_noncore_dpll_lock - instruct a DPLL to lock and wait for readiness
130 * @clk: pointer to a DPLL struct clk
131 *
132 * Instructs a non-CORE DPLL to lock. Waits for the DPLL to report
133 * readiness before returning. Will save and restore the DPLL's
134 * autoidle state across the enable, per the CDP code. If the DPLL
135 * locked successfully, return 0; if the DPLL did not lock in the time
136 * allotted, or DPLL3 was passed in, return -EINVAL.
137 */
138static int _omap3_noncore_dpll_lock(struct clk *clk)
139{
140 u8 ai;
141 int r;
142
143 pr_debug("clock: locking DPLL %s\n", clk->name);
144
145 ai = omap3_dpll_autoidle_read(clk);
146
147 omap3_dpll_deny_idle(clk);
148
149 _omap3_dpll_write_clken(clk, DPLL_LOCKED);
150
151 r = _omap3_wait_dpll_status(clk, 1);
152
153 if (ai)
154 omap3_dpll_allow_idle(clk);
155
156 return r;
157}
158
159/*
160 * _omap3_noncore_dpll_bypass - instruct a DPLL to bypass and wait for readiness
161 * @clk: pointer to a DPLL struct clk
162 *
163 * Instructs a non-CORE DPLL to enter low-power bypass mode. In
164 * bypass mode, the DPLL's rate is set equal to its parent clock's
165 * rate. Waits for the DPLL to report readiness before returning.
166 * Will save and restore the DPLL's autoidle state across the enable,
167 * per the CDP code. If the DPLL entered bypass mode successfully,
168 * return 0; if the DPLL did not enter bypass in the time allotted, or
169 * DPLL3 was passed in, or the DPLL does not support low-power bypass,
170 * return -EINVAL.
171 */
172static int _omap3_noncore_dpll_bypass(struct clk *clk)
173{
174 int r;
175 u8 ai;
176
177 if (!(clk->dpll_data->modes & (1 << DPLL_LOW_POWER_BYPASS)))
178 return -EINVAL;
179
180 pr_debug("clock: configuring DPLL %s for low-power bypass\n",
181 clk->name);
182
183 ai = omap3_dpll_autoidle_read(clk);
184
185 _omap3_dpll_write_clken(clk, DPLL_LOW_POWER_BYPASS);
186
187 r = _omap3_wait_dpll_status(clk, 0);
188
189 if (ai)
190 omap3_dpll_allow_idle(clk);
191 else
192 omap3_dpll_deny_idle(clk);
193
194 return r;
195}
196
197/*
198 * _omap3_noncore_dpll_stop - instruct a DPLL to stop
199 * @clk: pointer to a DPLL struct clk
200 *
201 * Instructs a non-CORE DPLL to enter low-power stop. Will save and
202 * restore the DPLL's autoidle state across the stop, per the CDP
203 * code. If DPLL3 was passed in, or the DPLL does not support
204 * low-power stop, return -EINVAL; otherwise, return 0.
205 */
206static int _omap3_noncore_dpll_stop(struct clk *clk)
207{
208 u8 ai;
209
210 if (!(clk->dpll_data->modes & (1 << DPLL_LOW_POWER_STOP)))
211 return -EINVAL;
212
213 pr_debug("clock: stopping DPLL %s\n", clk->name);
214
215 ai = omap3_dpll_autoidle_read(clk);
216
217 _omap3_dpll_write_clken(clk, DPLL_LOW_POWER_STOP);
218
219 if (ai)
220 omap3_dpll_allow_idle(clk);
221 else
222 omap3_dpll_deny_idle(clk);
223
224 return 0;
225}
226
227/**
228 * lookup_dco_sddiv - Set j-type DPLL4 compensation variables
229 * @clk: pointer to a DPLL struct clk
230 * @dco: digital control oscillator selector
231 * @sd_div: target sigma-delta divider
232 * @m: DPLL multiplier to set
233 * @n: DPLL divider to set
234 *
235 * See 36xx TRM section 3.5.3.3.3.2 "Type B DPLL (Low-Jitter)"
236 *
237 * XXX This code is not needed for 3430/AM35xx; can it be optimized
238 * out in non-multi-OMAP builds for those chips?
239 */
240static void lookup_dco_sddiv(struct clk *clk, u8 *dco, u8 *sd_div, u16 m,
241 u8 n)
242{
243 unsigned long fint, clkinp, sd; /* watch out for overflow */
244 int mod1, mod2;
245
246 clkinp = clk->parent->rate;
247 fint = (clkinp / n) * m;
248
249 if (fint < 1000000000)
250 *dco = 2;
251 else
252 *dco = 4;
253 /*
254 * target sigma-delta to near 250MHz
255 * sd = ceil[(m/(n+1)) * (clkinp_MHz / 250)]
256 */
257 clkinp /= 100000; /* shift from MHz to 10*Hz for 38.4 and 19.2 */
258 mod1 = (clkinp * m) % (250 * n);
259 sd = (clkinp * m) / (250 * n);
260 mod2 = sd % 10;
261 sd /= 10;
262
263 if (mod1 || mod2)
264 sd++;
265 *sd_div = sd;
266}
267
268/*
269 * _omap3_noncore_dpll_program - set non-core DPLL M,N values directly
270 * @clk: struct clk * of DPLL to set
271 * @m: DPLL multiplier to set
272 * @n: DPLL divider to set
273 * @freqsel: FREQSEL value to set
274 *
275 * Program the DPLL with the supplied M, N values, and wait for the DPLL to
276 * lock.. Returns -EINVAL upon error, or 0 upon success.
277 */
278static int omap3_noncore_dpll_program(struct clk *clk, u16 m, u8 n, u16 freqsel)
279{
280 struct dpll_data *dd = clk->dpll_data;
281 u32 v;
282
283 /* 3430 ES2 TRM: 4.7.6.9 DPLL Programming Sequence */
284 _omap3_noncore_dpll_bypass(clk);
285
286 /*
287 * Set jitter correction. No jitter correction for OMAP4 and 3630
288 * since freqsel field is no longer present
289 */
290 if (!cpu_is_omap44xx() && !cpu_is_omap3630()) {
291 v = __raw_readl(dd->control_reg);
292 v &= ~dd->freqsel_mask;
293 v |= freqsel << __ffs(dd->freqsel_mask);
294 __raw_writel(v, dd->control_reg);
295 }
296
297 /* Set DPLL multiplier, divider */
298 v = __raw_readl(dd->mult_div1_reg);
299 v &= ~(dd->mult_mask | dd->div1_mask);
300 v |= m << __ffs(dd->mult_mask);
301 v |= (n - 1) << __ffs(dd->div1_mask);
302
303 /*
304 * XXX This code is not needed for 3430/AM35XX; can it be optimized
305 * out in non-multi-OMAP builds for those chips?
306 */
307 if ((dd->flags & DPLL_J_TYPE) && !(dd->flags & DPLL_NO_DCO_SEL)) {
308 u8 dco, sd_div;
309 lookup_dco_sddiv(clk, &dco, &sd_div, m, n);
310 /* XXX This probably will need revision for OMAP4 */
311 v &= ~(OMAP3630_PERIPH_DPLL_DCO_SEL_MASK
312 | OMAP3630_PERIPH_DPLL_SD_DIV_MASK);
313 v |= dco << __ffs(OMAP3630_PERIPH_DPLL_DCO_SEL_MASK);
314 v |= sd_div << __ffs(OMAP3630_PERIPH_DPLL_SD_DIV_MASK);
315 }
316
317 __raw_writel(v, dd->mult_div1_reg);
318
319 /* We let the clock framework set the other output dividers later */
320
321 /* REVISIT: Set ramp-up delay? */
322
323 _omap3_noncore_dpll_lock(clk);
324
325 return 0;
326}
327
328/* Public functions */
329
330/**
331 * omap3_dpll_recalc - recalculate DPLL rate
332 * @clk: DPLL struct clk
333 *
334 * Recalculate and propagate the DPLL rate.
335 */
336unsigned long omap3_dpll_recalc(struct clk *clk)
337{
338 return omap2_get_dpll_rate(clk);
339}
340
341/* Non-CORE DPLL (e.g., DPLLs that do not control SDRC) clock functions */
342
343/**
344 * omap3_noncore_dpll_enable - instruct a DPLL to enter bypass or lock mode
345 * @clk: pointer to a DPLL struct clk
346 *
347 * Instructs a non-CORE DPLL to enable, e.g., to enter bypass or lock.
348 * The choice of modes depends on the DPLL's programmed rate: if it is
349 * the same as the DPLL's parent clock, it will enter bypass;
350 * otherwise, it will enter lock. This code will wait for the DPLL to
351 * indicate readiness before returning, unless the DPLL takes too long
352 * to enter the target state. Intended to be used as the struct clk's
353 * enable function. If DPLL3 was passed in, or the DPLL does not
354 * support low-power stop, or if the DPLL took too long to enter
355 * bypass or lock, return -EINVAL; otherwise, return 0.
356 */
357int omap3_noncore_dpll_enable(struct clk *clk)
358{
359 int r;
360 struct dpll_data *dd;
361
362 dd = clk->dpll_data;
363 if (!dd)
364 return -EINVAL;
365
366 if (clk->rate == dd->clk_bypass->rate) {
367 WARN_ON(clk->parent != dd->clk_bypass);
368 r = _omap3_noncore_dpll_bypass(clk);
369 } else {
370 WARN_ON(clk->parent != dd->clk_ref);
371 r = _omap3_noncore_dpll_lock(clk);
372 }
373 /*
374 *FIXME: this is dubious - if clk->rate has changed, what about
375 * propagating?
376 */
377 if (!r)
378 clk->rate = omap2_get_dpll_rate(clk);
379
380 return r;
381}
382
383/**
384 * omap3_noncore_dpll_disable - instruct a DPLL to enter low-power stop
385 * @clk: pointer to a DPLL struct clk
386 *
387 * Instructs a non-CORE DPLL to enter low-power stop. This function is
388 * intended for use in struct clkops. No return value.
389 */
390void omap3_noncore_dpll_disable(struct clk *clk)
391{
392 _omap3_noncore_dpll_stop(clk);
393}
394
395
396/* Non-CORE DPLL rate set code */
397
398/**
399 * omap3_noncore_dpll_set_rate - set non-core DPLL rate
400 * @clk: struct clk * of DPLL to set
401 * @rate: rounded target rate
402 *
403 * Set the DPLL CLKOUT to the target rate. If the DPLL can enter
404 * low-power bypass, and the target rate is the bypass source clock
405 * rate, then configure the DPLL for bypass. Otherwise, round the
406 * target rate if it hasn't been done already, then program and lock
407 * the DPLL. Returns -EINVAL upon error, or 0 upon success.
408 */
409int omap3_noncore_dpll_set_rate(struct clk *clk, unsigned long rate)
410{
411 struct clk *new_parent = NULL;
412 u16 freqsel = 0;
413 struct dpll_data *dd;
414 int ret;
415
416 if (!clk || !rate)
417 return -EINVAL;
418
419 dd = clk->dpll_data;
420 if (!dd)
421 return -EINVAL;
422
423 if (rate == omap2_get_dpll_rate(clk))
424 return 0;
425
426 /*
427 * Ensure both the bypass and ref clocks are enabled prior to
428 * doing anything; we need the bypass clock running to reprogram
429 * the DPLL.
430 */
431 omap2_clk_enable(dd->clk_bypass);
432 omap2_clk_enable(dd->clk_ref);
433
434 if (dd->clk_bypass->rate == rate &&
435 (clk->dpll_data->modes & (1 << DPLL_LOW_POWER_BYPASS))) {
436 pr_debug("clock: %s: set rate: entering bypass.\n", clk->name);
437
438 ret = _omap3_noncore_dpll_bypass(clk);
439 if (!ret)
440 new_parent = dd->clk_bypass;
441 } else {
442 if (dd->last_rounded_rate != rate)
443 omap2_dpll_round_rate(clk, rate);
444
445 if (dd->last_rounded_rate == 0)
446 return -EINVAL;
447
448 /* No freqsel on OMAP4 and OMAP3630 */
449 if (!cpu_is_omap44xx() && !cpu_is_omap3630()) {
450 freqsel = _omap3_dpll_compute_freqsel(clk,
451 dd->last_rounded_n);
452 if (!freqsel)
453 WARN_ON(1);
454 }
455
456 pr_debug("clock: %s: set rate: locking rate to %lu.\n",
457 clk->name, rate);
458
459 ret = omap3_noncore_dpll_program(clk, dd->last_rounded_m,
460 dd->last_rounded_n, freqsel);
461 if (!ret)
462 new_parent = dd->clk_ref;
463 }
464 if (!ret) {
465 /*
466 * Switch the parent clock in the heirarchy, and make sure
467 * that the new parent's usecount is correct. Note: we
468 * enable the new parent before disabling the old to avoid
469 * any unnecessary hardware disable->enable transitions.
470 */
471 if (clk->usecount) {
472 omap2_clk_enable(new_parent);
473 omap2_clk_disable(clk->parent);
474 }
475 clk_reparent(clk, new_parent);
476 clk->rate = rate;
477 }
478 omap2_clk_disable(dd->clk_ref);
479 omap2_clk_disable(dd->clk_bypass);
480
481 return 0;
482}
483
484/* DPLL autoidle read/set code */
485
486/**
487 * omap3_dpll_autoidle_read - read a DPLL's autoidle bits
488 * @clk: struct clk * of the DPLL to read
489 *
490 * Return the DPLL's autoidle bits, shifted down to bit 0. Returns
491 * -EINVAL if passed a null pointer or if the struct clk does not
492 * appear to refer to a DPLL.
493 */
494u32 omap3_dpll_autoidle_read(struct clk *clk)
495{
496 const struct dpll_data *dd;
497 u32 v;
498
499 if (!clk || !clk->dpll_data)
500 return -EINVAL;
501
502 dd = clk->dpll_data;
503
504 v = __raw_readl(dd->autoidle_reg);
505 v &= dd->autoidle_mask;
506 v >>= __ffs(dd->autoidle_mask);
507
508 return v;
509}
510
511/**
512 * omap3_dpll_allow_idle - enable DPLL autoidle bits
513 * @clk: struct clk * of the DPLL to operate on
514 *
515 * Enable DPLL automatic idle control. This automatic idle mode
516 * switching takes effect only when the DPLL is locked, at least on
517 * OMAP3430. The DPLL will enter low-power stop when its downstream
518 * clocks are gated. No return value.
519 */
520void omap3_dpll_allow_idle(struct clk *clk)
521{
522 const struct dpll_data *dd;
523 u32 v;
524
525 if (!clk || !clk->dpll_data)
526 return;
527
528 dd = clk->dpll_data;
529
530 /*
531 * REVISIT: CORE DPLL can optionally enter low-power bypass
532 * by writing 0x5 instead of 0x1. Add some mechanism to
533 * optionally enter this mode.
534 */
535 v = __raw_readl(dd->autoidle_reg);
536 v &= ~dd->autoidle_mask;
537 v |= DPLL_AUTOIDLE_LOW_POWER_STOP << __ffs(dd->autoidle_mask);
538 __raw_writel(v, dd->autoidle_reg);
539}
540
541/**
542 * omap3_dpll_deny_idle - prevent DPLL from automatically idling
543 * @clk: struct clk * of the DPLL to operate on
544 *
545 * Disable DPLL automatic idle control. No return value.
546 */
547void omap3_dpll_deny_idle(struct clk *clk)
548{
549 const struct dpll_data *dd;
550 u32 v;
551
552 if (!clk || !clk->dpll_data)
553 return;
554
555 dd = clk->dpll_data;
556
557 v = __raw_readl(dd->autoidle_reg);
558 v &= ~dd->autoidle_mask;
559 v |= DPLL_AUTOIDLE_DISABLE << __ffs(dd->autoidle_mask);
560 __raw_writel(v, dd->autoidle_reg);
561
562}
563
564/* Clock control for DPLL outputs */
565
566/**
567 * omap3_clkoutx2_recalc - recalculate DPLL X2 output virtual clock rate
568 * @clk: DPLL output struct clk
569 *
570 * Using parent clock DPLL data, look up DPLL state. If locked, set our
571 * rate to the dpll_clk * 2; otherwise, just use dpll_clk.
572 */
573unsigned long omap3_clkoutx2_recalc(struct clk *clk)
574{
575 const struct dpll_data *dd;
576 unsigned long rate;
577 u32 v;
578 struct clk *pclk;
579
580 /* Walk up the parents of clk, looking for a DPLL */
581 pclk = clk->parent;
582 while (pclk && !pclk->dpll_data)
583 pclk = pclk->parent;
584
585 /* clk does not have a DPLL as a parent? */
586 WARN_ON(!pclk);
587
588 dd = pclk->dpll_data;
589
590 WARN_ON(!dd->enable_mask);
591
592 v = __raw_readl(dd->control_reg) & dd->enable_mask;
593 v >>= __ffs(dd->enable_mask);
594 if ((v != OMAP3XXX_EN_DPLL_LOCKED) || (dd->flags & DPLL_J_TYPE))
595 rate = clk->parent->rate;
596 else
597 rate = clk->parent->rate * 2;
598 return rate;
599}
diff --git a/arch/arm/mach-omap2/emu.c b/arch/arm/mach-omap2/emu.c
new file mode 100644
index 000000000000..9c442e290ccb
--- /dev/null
+++ b/arch/arm/mach-omap2/emu.c
@@ -0,0 +1,69 @@
1/*
2 * emu.c
3 *
4 * ETM and ETB CoreSight components' resources as found in OMAP3xxx.
5 *
6 * Copyright (C) 2009 Nokia Corporation.
7 * Alexander Shishkin
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 */
13
14#include <linux/kernel.h>
15#include <linux/init.h>
16#include <linux/types.h>
17#include <linux/module.h>
18#include <linux/device.h>
19#include <linux/amba/bus.h>
20#include <linux/io.h>
21#include <linux/clk.h>
22#include <linux/err.h>
23
24MODULE_LICENSE("GPL");
25MODULE_AUTHOR("Alexander Shishkin");
26
27/* Cortex CoreSight components within omap3xxx EMU */
28#define ETM_BASE (L4_EMU_34XX_PHYS + 0x10000)
29#define DBG_BASE (L4_EMU_34XX_PHYS + 0x11000)
30#define ETB_BASE (L4_EMU_34XX_PHYS + 0x1b000)
31#define DAPCTL (L4_EMU_34XX_PHYS + 0x1d000)
32
33static struct amba_device omap3_etb_device = {
34 .dev = {
35 .init_name = "etb",
36 },
37 .res = {
38 .start = ETB_BASE,
39 .end = ETB_BASE + SZ_4K - 1,
40 .flags = IORESOURCE_MEM,
41 },
42 .periphid = 0x000bb907,
43};
44
45static struct amba_device omap3_etm_device = {
46 .dev = {
47 .init_name = "etm",
48 },
49 .res = {
50 .start = ETM_BASE,
51 .end = ETM_BASE + SZ_4K - 1,
52 .flags = IORESOURCE_MEM,
53 },
54 .periphid = 0x102bb921,
55};
56
57static int __init emu_init(void)
58{
59 if (!cpu_is_omap34xx())
60 return -ENODEV;
61
62 amba_device_register(&omap3_etb_device, &iomem_resource);
63 amba_device_register(&omap3_etm_device, &iomem_resource);
64
65 return 0;
66}
67
68subsys_initcall(emu_init);
69
diff --git a/arch/arm/mach-omap2/gpmc-nand.c b/arch/arm/mach-omap2/gpmc-nand.c
new file mode 100644
index 000000000000..e57fb29ff855
--- /dev/null
+++ b/arch/arm/mach-omap2/gpmc-nand.c
@@ -0,0 +1,142 @@
1/*
2 * gpmc-nand.c
3 *
4 * Copyright (C) 2009 Texas Instruments
5 * Vimal Singh <vimalsingh@ti.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#include <linux/kernel.h>
13#include <linux/platform_device.h>
14#include <linux/io.h>
15
16#include <asm/mach/flash.h>
17
18#include <plat/nand.h>
19#include <plat/board.h>
20#include <plat/gpmc.h>
21
22#define WR_RD_PIN_MONITORING 0x00600000
23
24static struct omap_nand_platform_data *gpmc_nand_data;
25
26static struct resource gpmc_nand_resource = {
27 .flags = IORESOURCE_MEM,
28};
29
30static struct platform_device gpmc_nand_device = {
31 .name = "omap2-nand",
32 .id = 0,
33 .num_resources = 1,
34 .resource = &gpmc_nand_resource,
35};
36
37static int omap2_nand_gpmc_retime(void)
38{
39 struct gpmc_timings t;
40 int err;
41
42 if (!gpmc_nand_data->gpmc_t)
43 return 0;
44
45 memset(&t, 0, sizeof(t));
46 t.sync_clk = gpmc_round_ns_to_ticks(gpmc_nand_data->gpmc_t->sync_clk);
47 t.cs_on = gpmc_round_ns_to_ticks(gpmc_nand_data->gpmc_t->cs_on);
48 t.adv_on = gpmc_round_ns_to_ticks(gpmc_nand_data->gpmc_t->adv_on);
49
50 /* Read */
51 t.adv_rd_off = gpmc_round_ns_to_ticks(
52 gpmc_nand_data->gpmc_t->adv_rd_off);
53 t.oe_on = t.adv_on;
54 t.access = gpmc_round_ns_to_ticks(gpmc_nand_data->gpmc_t->access);
55 t.oe_off = gpmc_round_ns_to_ticks(gpmc_nand_data->gpmc_t->oe_off);
56 t.cs_rd_off = gpmc_round_ns_to_ticks(gpmc_nand_data->gpmc_t->cs_rd_off);
57 t.rd_cycle = gpmc_round_ns_to_ticks(gpmc_nand_data->gpmc_t->rd_cycle);
58
59 /* Write */
60 t.adv_wr_off = gpmc_round_ns_to_ticks(
61 gpmc_nand_data->gpmc_t->adv_wr_off);
62 t.we_on = t.oe_on;
63 if (cpu_is_omap34xx()) {
64 t.wr_data_mux_bus = gpmc_round_ns_to_ticks(
65 gpmc_nand_data->gpmc_t->wr_data_mux_bus);
66 t.wr_access = gpmc_round_ns_to_ticks(
67 gpmc_nand_data->gpmc_t->wr_access);
68 }
69 t.we_off = gpmc_round_ns_to_ticks(gpmc_nand_data->gpmc_t->we_off);
70 t.cs_wr_off = gpmc_round_ns_to_ticks(gpmc_nand_data->gpmc_t->cs_wr_off);
71 t.wr_cycle = gpmc_round_ns_to_ticks(gpmc_nand_data->gpmc_t->wr_cycle);
72
73 /* Configure GPMC */
74 gpmc_cs_write_reg(gpmc_nand_data->cs, GPMC_CS_CONFIG1,
75 GPMC_CONFIG1_DEVICESIZE(gpmc_nand_data->devsize) |
76 GPMC_CONFIG1_DEVICETYPE_NAND);
77
78 err = gpmc_cs_set_timings(gpmc_nand_data->cs, &t);
79 if (err)
80 return err;
81
82 return 0;
83}
84
85static int gpmc_nand_setup(void)
86{
87 struct device *dev = &gpmc_nand_device.dev;
88
89 /* Set timings in GPMC */
90 if (omap2_nand_gpmc_retime() < 0) {
91 dev_err(dev, "Unable to set gpmc timings\n");
92 return -EINVAL;
93 }
94
95 return 0;
96}
97
98int __init gpmc_nand_init(struct omap_nand_platform_data *_nand_data)
99{
100 unsigned int val;
101 int err = 0;
102 struct device *dev = &gpmc_nand_device.dev;
103
104 gpmc_nand_data = _nand_data;
105 gpmc_nand_data->nand_setup = gpmc_nand_setup;
106 gpmc_nand_device.dev.platform_data = gpmc_nand_data;
107
108 err = gpmc_cs_request(gpmc_nand_data->cs, NAND_IO_SIZE,
109 &gpmc_nand_data->phys_base);
110 if (err < 0) {
111 dev_err(dev, "Cannot request GPMC CS\n");
112 return err;
113 }
114
115 err = gpmc_nand_setup();
116 if (err < 0) {
117 dev_err(dev, "NAND platform setup failed: %d\n", err);
118 return err;
119 }
120
121 /* Enable RD PIN Monitoring Reg */
122 if (gpmc_nand_data->dev_ready) {
123 val = gpmc_cs_read_reg(gpmc_nand_data->cs,
124 GPMC_CS_CONFIG1);
125 val |= WR_RD_PIN_MONITORING;
126 gpmc_cs_write_reg(gpmc_nand_data->cs,
127 GPMC_CS_CONFIG1, val);
128 }
129
130 err = platform_device_register(&gpmc_nand_device);
131 if (err < 0) {
132 dev_err(dev, "Unable to register NAND device\n");
133 goto out_free_cs;
134 }
135
136 return 0;
137
138out_free_cs:
139 gpmc_cs_free(gpmc_nand_data->cs);
140
141 return err;
142}
diff --git a/arch/arm/mach-omap2/gpmc-onenand.c b/arch/arm/mach-omap2/gpmc-onenand.c
index 54fec53a48e7..7bb69220adfa 100644
--- a/arch/arm/mach-omap2/gpmc-onenand.c
+++ b/arch/arm/mach-omap2/gpmc-onenand.c
@@ -17,9 +17,9 @@
17 17
18#include <asm/mach/flash.h> 18#include <asm/mach/flash.h>
19 19
20#include <mach/onenand.h> 20#include <plat/onenand.h>
21#include <mach/board.h> 21#include <plat/board.h>
22#include <mach/gpmc.h> 22#include <plat/gpmc.h>
23 23
24static struct omap_onenand_platform_data *gpmc_onenand_data; 24static struct omap_onenand_platform_data *gpmc_onenand_data;
25 25
diff --git a/arch/arm/mach-omap2/gpmc-smc91x.c b/arch/arm/mach-omap2/gpmc-smc91x.c
index df99d31d8b64..877c6f5807b7 100644
--- a/arch/arm/mach-omap2/gpmc-smc91x.c
+++ b/arch/arm/mach-omap2/gpmc-smc91x.c
@@ -17,9 +17,9 @@
17#include <linux/io.h> 17#include <linux/io.h>
18#include <linux/smc91x.h> 18#include <linux/smc91x.h>
19 19
20#include <mach/board.h> 20#include <plat/board.h>
21#include <mach/gpmc.h> 21#include <plat/gpmc.h>
22#include <mach/gpmc-smc91x.h> 22#include <plat/gpmc-smc91x.h>
23 23
24static struct omap_smc91x_platform_data *gpmc_cfg; 24static struct omap_smc91x_platform_data *gpmc_cfg;
25 25
@@ -33,17 +33,19 @@ static struct resource gpmc_smc91x_resources[] = {
33}; 33};
34 34
35static struct smc91x_platdata gpmc_smc91x_info = { 35static struct smc91x_platdata gpmc_smc91x_info = {
36 .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT | SMC91X_IO_SHIFT_0, 36 .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT | SMC91X_IO_SHIFT_0,
37 .leda = RPC_LED_100_10,
38 .ledb = RPC_LED_TX_RX,
37}; 39};
38 40
39static struct platform_device gpmc_smc91x_device = { 41static struct platform_device gpmc_smc91x_device = {
40 .name = "smc91x", 42 .name = "smc91x",
41 .id = -1, 43 .id = -1,
42 .num_resources = ARRAY_SIZE(gpmc_smc91x_resources),
43 .resource = gpmc_smc91x_resources,
44 .dev = { 44 .dev = {
45 .platform_data = &gpmc_smc91x_info, 45 .platform_data = &gpmc_smc91x_info,
46 }, 46 },
47 .num_resources = ARRAY_SIZE(gpmc_smc91x_resources),
48 .resource = gpmc_smc91x_resources,
47}; 49};
48 50
49/* 51/*
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c
index f3c992e29651..5bc3ca03551c 100644
--- a/arch/arm/mach-omap2/gpmc.c
+++ b/arch/arm/mach-omap2/gpmc.c
@@ -24,9 +24,9 @@
24#include <linux/module.h> 24#include <linux/module.h>
25 25
26#include <asm/mach-types.h> 26#include <asm/mach-types.h>
27#include <mach/gpmc.h> 27#include <plat/gpmc.h>
28 28
29#include <mach/sdrc.h> 29#include <plat/sdrc.h>
30 30
31/* GPMC register offsets */ 31/* GPMC register offsets */
32#define GPMC_REVISION 0x00 32#define GPMC_REVISION 0x00
@@ -62,6 +62,33 @@
62#define ENABLE_PREFETCH (0x1 << 7) 62#define ENABLE_PREFETCH (0x1 << 7)
63#define DMA_MPU_MODE 2 63#define DMA_MPU_MODE 2
64 64
65/* Structure to save gpmc cs context */
66struct gpmc_cs_config {
67 u32 config1;
68 u32 config2;
69 u32 config3;
70 u32 config4;
71 u32 config5;
72 u32 config6;
73 u32 config7;
74 int is_valid;
75};
76
77/*
78 * Structure to save/restore gpmc context
79 * to support core off on OMAP3
80 */
81struct omap3_gpmc_regs {
82 u32 sysconfig;
83 u32 irqenable;
84 u32 timeout_ctrl;
85 u32 config;
86 u32 prefetch_config1;
87 u32 prefetch_config2;
88 u32 prefetch_control;
89 struct gpmc_cs_config cs_context[GPMC_CS_NUM];
90};
91
65static struct resource gpmc_mem_root; 92static struct resource gpmc_mem_root;
66static struct resource gpmc_cs_mem[GPMC_CS_NUM]; 93static struct resource gpmc_cs_mem[GPMC_CS_NUM];
67static DEFINE_SPINLOCK(gpmc_mem_lock); 94static DEFINE_SPINLOCK(gpmc_mem_lock);
@@ -261,7 +288,7 @@ static void gpmc_cs_enable_mem(int cs, u32 base, u32 size)
261 l = (base >> GPMC_CHUNK_SHIFT) & 0x3f; 288 l = (base >> GPMC_CHUNK_SHIFT) & 0x3f;
262 l &= ~(0x0f << 8); 289 l &= ~(0x0f << 8);
263 l |= ((mask >> GPMC_CHUNK_SHIFT) & 0x0f) << 8; 290 l |= ((mask >> GPMC_CHUNK_SHIFT) & 0x0f) << 8;
264 l |= 1 << 6; /* CSVALID */ 291 l |= GPMC_CONFIG7_CSVALID;
265 gpmc_cs_write_reg(cs, GPMC_CS_CONFIG7, l); 292 gpmc_cs_write_reg(cs, GPMC_CS_CONFIG7, l);
266} 293}
267 294
@@ -270,7 +297,7 @@ static void gpmc_cs_disable_mem(int cs)
270 u32 l; 297 u32 l;
271 298
272 l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7); 299 l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7);
273 l &= ~(1 << 6); /* CSVALID */ 300 l &= ~GPMC_CONFIG7_CSVALID;
274 gpmc_cs_write_reg(cs, GPMC_CS_CONFIG7, l); 301 gpmc_cs_write_reg(cs, GPMC_CS_CONFIG7, l);
275} 302}
276 303
@@ -290,7 +317,7 @@ static int gpmc_cs_mem_enabled(int cs)
290 u32 l; 317 u32 l;
291 318
292 l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7); 319 l = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7);
293 return l & (1 << 6); 320 return l & GPMC_CONFIG7_CSVALID;
294} 321}
295 322
296int gpmc_cs_set_reserved(int cs, int reserved) 323int gpmc_cs_set_reserved(int cs, int reserved)
@@ -478,7 +505,7 @@ static void __init gpmc_mem_init(void)
478void __init gpmc_init(void) 505void __init gpmc_init(void)
479{ 506{
480 u32 l; 507 u32 l;
481 char *ck; 508 char *ck = NULL;
482 509
483 if (cpu_is_omap24xx()) { 510 if (cpu_is_omap24xx()) {
484 ck = "core_l3_ck"; 511 ck = "core_l3_ck";
@@ -490,10 +517,13 @@ void __init gpmc_init(void)
490 ck = "gpmc_fck"; 517 ck = "gpmc_fck";
491 l = OMAP34XX_GPMC_BASE; 518 l = OMAP34XX_GPMC_BASE;
492 } else if (cpu_is_omap44xx()) { 519 } else if (cpu_is_omap44xx()) {
493 ck = "gpmc_fck"; 520 ck = "gpmc_ck";
494 l = OMAP44XX_GPMC_BASE; 521 l = OMAP44XX_GPMC_BASE;
495 } 522 }
496 523
524 if (WARN_ON(!ck))
525 return;
526
497 gpmc_l3_clk = clk_get(NULL, ck); 527 gpmc_l3_clk = clk_get(NULL, ck);
498 if (IS_ERR(gpmc_l3_clk)) { 528 if (IS_ERR(gpmc_l3_clk)) {
499 printk(KERN_ERR "Could not get GPMC clock %s\n", ck); 529 printk(KERN_ERR "Could not get GPMC clock %s\n", ck);
@@ -507,6 +537,8 @@ void __init gpmc_init(void)
507 BUG(); 537 BUG();
508 } 538 }
509 539
540 clk_enable(gpmc_l3_clk);
541
510 l = gpmc_read_reg(GPMC_REVISION); 542 l = gpmc_read_reg(GPMC_REVISION);
511 printk(KERN_INFO "GPMC revision %d.%d\n", (l >> 4) & 0x0f, l & 0x0f); 543 printk(KERN_INFO "GPMC revision %d.%d\n", (l >> 4) & 0x0f, l & 0x0f);
512 /* Set smart idle mode and automatic L3 clock gating */ 544 /* Set smart idle mode and automatic L3 clock gating */
@@ -516,3 +548,70 @@ void __init gpmc_init(void)
516 gpmc_write_reg(GPMC_SYSCONFIG, l); 548 gpmc_write_reg(GPMC_SYSCONFIG, l);
517 gpmc_mem_init(); 549 gpmc_mem_init();
518} 550}
551
552#ifdef CONFIG_ARCH_OMAP3
553static struct omap3_gpmc_regs gpmc_context;
554
555void omap3_gpmc_save_context(void)
556{
557 int i;
558
559 gpmc_context.sysconfig = gpmc_read_reg(GPMC_SYSCONFIG);
560 gpmc_context.irqenable = gpmc_read_reg(GPMC_IRQENABLE);
561 gpmc_context.timeout_ctrl = gpmc_read_reg(GPMC_TIMEOUT_CONTROL);
562 gpmc_context.config = gpmc_read_reg(GPMC_CONFIG);
563 gpmc_context.prefetch_config1 = gpmc_read_reg(GPMC_PREFETCH_CONFIG1);
564 gpmc_context.prefetch_config2 = gpmc_read_reg(GPMC_PREFETCH_CONFIG2);
565 gpmc_context.prefetch_control = gpmc_read_reg(GPMC_PREFETCH_CONTROL);
566 for (i = 0; i < GPMC_CS_NUM; i++) {
567 gpmc_context.cs_context[i].is_valid = gpmc_cs_mem_enabled(i);
568 if (gpmc_context.cs_context[i].is_valid) {
569 gpmc_context.cs_context[i].config1 =
570 gpmc_cs_read_reg(i, GPMC_CS_CONFIG1);
571 gpmc_context.cs_context[i].config2 =
572 gpmc_cs_read_reg(i, GPMC_CS_CONFIG2);
573 gpmc_context.cs_context[i].config3 =
574 gpmc_cs_read_reg(i, GPMC_CS_CONFIG3);
575 gpmc_context.cs_context[i].config4 =
576 gpmc_cs_read_reg(i, GPMC_CS_CONFIG4);
577 gpmc_context.cs_context[i].config5 =
578 gpmc_cs_read_reg(i, GPMC_CS_CONFIG5);
579 gpmc_context.cs_context[i].config6 =
580 gpmc_cs_read_reg(i, GPMC_CS_CONFIG6);
581 gpmc_context.cs_context[i].config7 =
582 gpmc_cs_read_reg(i, GPMC_CS_CONFIG7);
583 }
584 }
585}
586
587void omap3_gpmc_restore_context(void)
588{
589 int i;
590
591 gpmc_write_reg(GPMC_SYSCONFIG, gpmc_context.sysconfig);
592 gpmc_write_reg(GPMC_IRQENABLE, gpmc_context.irqenable);
593 gpmc_write_reg(GPMC_TIMEOUT_CONTROL, gpmc_context.timeout_ctrl);
594 gpmc_write_reg(GPMC_CONFIG, gpmc_context.config);
595 gpmc_write_reg(GPMC_PREFETCH_CONFIG1, gpmc_context.prefetch_config1);
596 gpmc_write_reg(GPMC_PREFETCH_CONFIG2, gpmc_context.prefetch_config2);
597 gpmc_write_reg(GPMC_PREFETCH_CONTROL, gpmc_context.prefetch_control);
598 for (i = 0; i < GPMC_CS_NUM; i++) {
599 if (gpmc_context.cs_context[i].is_valid) {
600 gpmc_cs_write_reg(i, GPMC_CS_CONFIG1,
601 gpmc_context.cs_context[i].config1);
602 gpmc_cs_write_reg(i, GPMC_CS_CONFIG2,
603 gpmc_context.cs_context[i].config2);
604 gpmc_cs_write_reg(i, GPMC_CS_CONFIG3,
605 gpmc_context.cs_context[i].config3);
606 gpmc_cs_write_reg(i, GPMC_CS_CONFIG4,
607 gpmc_context.cs_context[i].config4);
608 gpmc_cs_write_reg(i, GPMC_CS_CONFIG5,
609 gpmc_context.cs_context[i].config5);
610 gpmc_cs_write_reg(i, GPMC_CS_CONFIG6,
611 gpmc_context.cs_context[i].config6);
612 gpmc_cs_write_reg(i, GPMC_CS_CONFIG7,
613 gpmc_context.cs_context[i].config7);
614 }
615 }
616}
617#endif /* CONFIG_ARCH_OMAP3 */
diff --git a/arch/arm/mach-omap2/hsmmc.c b/arch/arm/mach-omap2/hsmmc.c
new file mode 100644
index 000000000000..9ad229594b46
--- /dev/null
+++ b/arch/arm/mach-omap2/hsmmc.c
@@ -0,0 +1,266 @@
1/*
2 * linux/arch/arm/mach-omap2/hsmmc.c
3 *
4 * Copyright (C) 2007-2008 Texas Instruments
5 * Copyright (C) 2008 Nokia Corporation
6 * Author: Texas Instruments
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#include <linux/kernel.h>
13#include <linux/slab.h>
14#include <linux/string.h>
15#include <linux/delay.h>
16#include <mach/hardware.h>
17#include <plat/control.h>
18#include <plat/mmc.h>
19#include <plat/omap-pm.h>
20
21#include "hsmmc.h"
22
23#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
24
25static u16 control_pbias_offset;
26static u16 control_devconf1_offset;
27
28#define HSMMC_NAME_LEN 9
29
30static struct hsmmc_controller {
31 char name[HSMMC_NAME_LEN + 1];
32} hsmmc[OMAP34XX_NR_MMC];
33
34#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
35
36static int hsmmc_get_context_loss(struct device *dev)
37{
38 return omap_pm_get_dev_context_loss_count(dev);
39}
40
41#else
42#define hsmmc_get_context_loss NULL
43#endif
44
45static void hsmmc1_before_set_reg(struct device *dev, int slot,
46 int power_on, int vdd)
47{
48 u32 reg, prog_io;
49 struct omap_mmc_platform_data *mmc = dev->platform_data;
50
51 if (mmc->slots[0].remux)
52 mmc->slots[0].remux(dev, slot, power_on);
53
54 /*
55 * Assume we power both OMAP VMMC1 (for CMD, CLK, DAT0..3) and the
56 * card with Vcc regulator (from twl4030 or whatever). OMAP has both
57 * 1.8V and 3.0V modes, controlled by the PBIAS register.
58 *
59 * In 8-bit modes, OMAP VMMC1A (for DAT4..7) needs a supply, which
60 * is most naturally TWL VSIM; those pins also use PBIAS.
61 *
62 * FIXME handle VMMC1A as needed ...
63 */
64 if (power_on) {
65 if (cpu_is_omap2430()) {
66 reg = omap_ctrl_readl(OMAP243X_CONTROL_DEVCONF1);
67 if ((1 << vdd) >= MMC_VDD_30_31)
68 reg |= OMAP243X_MMC1_ACTIVE_OVERWRITE;
69 else
70 reg &= ~OMAP243X_MMC1_ACTIVE_OVERWRITE;
71 omap_ctrl_writel(reg, OMAP243X_CONTROL_DEVCONF1);
72 }
73
74 if (mmc->slots[0].internal_clock) {
75 reg = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
76 reg |= OMAP2_MMCSDIO1ADPCLKISEL;
77 omap_ctrl_writel(reg, OMAP2_CONTROL_DEVCONF0);
78 }
79
80 reg = omap_ctrl_readl(control_pbias_offset);
81 if (cpu_is_omap3630()) {
82 /* Set MMC I/O to 52Mhz */
83 prog_io = omap_ctrl_readl(OMAP343X_CONTROL_PROG_IO1);
84 prog_io |= OMAP3630_PRG_SDMMC1_SPEEDCTRL;
85 omap_ctrl_writel(prog_io, OMAP343X_CONTROL_PROG_IO1);
86 } else {
87 reg |= OMAP2_PBIASSPEEDCTRL0;
88 }
89 reg &= ~OMAP2_PBIASLITEPWRDNZ0;
90 omap_ctrl_writel(reg, control_pbias_offset);
91 } else {
92 reg = omap_ctrl_readl(control_pbias_offset);
93 reg &= ~OMAP2_PBIASLITEPWRDNZ0;
94 omap_ctrl_writel(reg, control_pbias_offset);
95 }
96}
97
98static void hsmmc1_after_set_reg(struct device *dev, int slot,
99 int power_on, int vdd)
100{
101 u32 reg;
102
103 /* 100ms delay required for PBIAS configuration */
104 msleep(100);
105
106 if (power_on) {
107 reg = omap_ctrl_readl(control_pbias_offset);
108 reg |= (OMAP2_PBIASLITEPWRDNZ0 | OMAP2_PBIASSPEEDCTRL0);
109 if ((1 << vdd) <= MMC_VDD_165_195)
110 reg &= ~OMAP2_PBIASLITEVMODE0;
111 else
112 reg |= OMAP2_PBIASLITEVMODE0;
113 omap_ctrl_writel(reg, control_pbias_offset);
114 } else {
115 reg = omap_ctrl_readl(control_pbias_offset);
116 reg |= (OMAP2_PBIASSPEEDCTRL0 | OMAP2_PBIASLITEPWRDNZ0 |
117 OMAP2_PBIASLITEVMODE0);
118 omap_ctrl_writel(reg, control_pbias_offset);
119 }
120}
121
122static void hsmmc23_before_set_reg(struct device *dev, int slot,
123 int power_on, int vdd)
124{
125 struct omap_mmc_platform_data *mmc = dev->platform_data;
126
127 if (mmc->slots[0].remux)
128 mmc->slots[0].remux(dev, slot, power_on);
129
130 if (power_on) {
131 /* Only MMC2 supports a CLKIN */
132 if (mmc->slots[0].internal_clock) {
133 u32 reg;
134
135 reg = omap_ctrl_readl(control_devconf1_offset);
136 reg |= OMAP2_MMCSDIO2ADPCLKISEL;
137 omap_ctrl_writel(reg, control_devconf1_offset);
138 }
139 }
140}
141
142static struct omap_mmc_platform_data *hsmmc_data[OMAP34XX_NR_MMC] __initdata;
143
144void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
145{
146 struct omap2_hsmmc_info *c;
147 int nr_hsmmc = ARRAY_SIZE(hsmmc_data);
148 int i;
149
150 if (cpu_is_omap2430()) {
151 control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE;
152 control_devconf1_offset = OMAP243X_CONTROL_DEVCONF1;
153 } else {
154 control_pbias_offset = OMAP343X_CONTROL_PBIAS_LITE;
155 control_devconf1_offset = OMAP343X_CONTROL_DEVCONF1;
156 }
157
158 for (c = controllers; c->mmc; c++) {
159 struct hsmmc_controller *hc = hsmmc + c->mmc - 1;
160 struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
161
162 if (!c->mmc || c->mmc > nr_hsmmc) {
163 pr_debug("MMC%d: no such controller\n", c->mmc);
164 continue;
165 }
166 if (mmc) {
167 pr_debug("MMC%d: already configured\n", c->mmc);
168 continue;
169 }
170
171 mmc = kzalloc(sizeof(struct omap_mmc_platform_data),
172 GFP_KERNEL);
173 if (!mmc) {
174 pr_err("Cannot allocate memory for mmc device!\n");
175 goto done;
176 }
177
178 if (c->name)
179 strncpy(hc->name, c->name, HSMMC_NAME_LEN);
180 else
181 snprintf(hc->name, ARRAY_SIZE(hc->name),
182 "mmc%islot%i", c->mmc, 1);
183 mmc->slots[0].name = hc->name;
184 mmc->nr_slots = 1;
185 mmc->slots[0].wires = c->wires;
186 mmc->slots[0].internal_clock = !c->ext_clock;
187 mmc->dma_mask = 0xffffffff;
188
189 mmc->get_context_loss_count = hsmmc_get_context_loss;
190
191 mmc->slots[0].switch_pin = c->gpio_cd;
192 mmc->slots[0].gpio_wp = c->gpio_wp;
193
194 mmc->slots[0].remux = c->remux;
195
196 if (c->cover_only)
197 mmc->slots[0].cover = 1;
198
199 if (c->nonremovable)
200 mmc->slots[0].nonremovable = 1;
201
202 if (c->power_saving)
203 mmc->slots[0].power_saving = 1;
204
205 if (c->no_off)
206 mmc->slots[0].no_off = 1;
207
208 if (c->vcc_aux_disable_is_sleep)
209 mmc->slots[0].vcc_aux_disable_is_sleep = 1;
210
211 /* NOTE: MMC slots should have a Vcc regulator set up.
212 * This may be from a TWL4030-family chip, another
213 * controllable regulator, or a fixed supply.
214 *
215 * temporary HACK: ocr_mask instead of fixed supply
216 */
217 mmc->slots[0].ocr_mask = c->ocr_mask;
218
219 switch (c->mmc) {
220 case 1:
221 /* on-chip level shifting via PBIAS0/PBIAS1 */
222 mmc->slots[0].before_set_reg = hsmmc1_before_set_reg;
223 mmc->slots[0].after_set_reg = hsmmc1_after_set_reg;
224
225 /* Omap3630 HSMMC1 supports only 4-bit */
226 if (cpu_is_omap3630() && c->wires > 4) {
227 c->wires = 4;
228 mmc->slots[0].wires = c->wires;
229 }
230 break;
231 case 2:
232 if (c->ext_clock)
233 c->transceiver = 1;
234 if (c->transceiver && c->wires > 4)
235 c->wires = 4;
236 /* FALLTHROUGH */
237 case 3:
238 /* off-chip level shifting, or none */
239 mmc->slots[0].before_set_reg = hsmmc23_before_set_reg;
240 mmc->slots[0].after_set_reg = NULL;
241 break;
242 default:
243 pr_err("MMC%d configuration not supported!\n", c->mmc);
244 kfree(mmc);
245 continue;
246 }
247 hsmmc_data[c->mmc - 1] = mmc;
248 }
249
250 omap2_init_mmc(hsmmc_data, OMAP34XX_NR_MMC);
251
252 /* pass the device nodes back to board setup code */
253 for (c = controllers; c->mmc; c++) {
254 struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
255
256 if (!c->mmc || c->mmc > nr_hsmmc)
257 continue;
258 c->dev = mmc->dev;
259 }
260
261done:
262 for (i = 0; i < nr_hsmmc; i++)
263 kfree(hsmmc_data[i]);
264}
265
266#endif
diff --git a/arch/arm/mach-omap2/mmc-twl4030.h b/arch/arm/mach-omap2/hsmmc.h
index a47e68563fb6..36f0ba8d89e2 100644
--- a/arch/arm/mach-omap2/mmc-twl4030.h
+++ b/arch/arm/mach-omap2/hsmmc.h
@@ -6,7 +6,7 @@
6 * published by the Free Software Foundation. 6 * published by the Free Software Foundation.
7 */ 7 */
8 8
9struct twl4030_hsmmc_info { 9struct omap2_hsmmc_info {
10 u8 mmc; /* controller 1/2/3 */ 10 u8 mmc; /* controller 1/2/3 */
11 u8 wires; /* 1/4/8 wires */ 11 u8 wires; /* 1/4/8 wires */
12 bool transceiver; /* MMC-2 option */ 12 bool transceiver; /* MMC-2 option */
@@ -14,22 +14,24 @@ struct twl4030_hsmmc_info {
14 bool cover_only; /* No card detect - just cover switch */ 14 bool cover_only; /* No card detect - just cover switch */
15 bool nonremovable; /* Nonremovable e.g. eMMC */ 15 bool nonremovable; /* Nonremovable e.g. eMMC */
16 bool power_saving; /* Try to sleep or power off when possible */ 16 bool power_saving; /* Try to sleep or power off when possible */
17 bool no_off; /* power_saving and power is not to go off */
18 bool vcc_aux_disable_is_sleep; /* Regulator off remapped to sleep */
17 int gpio_cd; /* or -EINVAL */ 19 int gpio_cd; /* or -EINVAL */
18 int gpio_wp; /* or -EINVAL */ 20 int gpio_wp; /* or -EINVAL */
19 char *name; /* or NULL for default */ 21 char *name; /* or NULL for default */
20 struct device *dev; /* returned: pointer to mmc adapter */ 22 struct device *dev; /* returned: pointer to mmc adapter */
21 int ocr_mask; /* temporary HACK */ 23 int ocr_mask; /* temporary HACK */
24 /* Remux (pad configuation) when powering on/off */
25 void (*remux)(struct device *dev, int slot, int power_on);
22}; 26};
23 27
24#if defined(CONFIG_REGULATOR) && \ 28#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
25 (defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \
26 defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE))
27 29
28void twl4030_mmc_init(struct twl4030_hsmmc_info *); 30void omap2_hsmmc_init(struct omap2_hsmmc_info *);
29 31
30#else 32#else
31 33
32static inline void twl4030_mmc_init(struct twl4030_hsmmc_info *info) 34static inline void omap2_hsmmc_init(struct omap2_hsmmc_info *info)
33{ 35{
34} 36}
35 37
diff --git a/arch/arm/mach-omap2/i2c.c b/arch/arm/mach-omap2/i2c.c
new file mode 100644
index 000000000000..7951ae1447ee
--- /dev/null
+++ b/arch/arm/mach-omap2/i2c.c
@@ -0,0 +1,52 @@
1/*
2 * Helper module for board specific I2C bus registration
3 *
4 * Copyright (C) 2009 Nokia Corporation.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * version 2 as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18 * 02110-1301 USA
19 *
20 */
21
22#include <plat/cpu.h>
23#include <plat/i2c.h>
24#include <plat/mux.h>
25
26#include "mux.h"
27
28void __init omap2_i2c_mux_pins(int bus_id)
29{
30 if (cpu_is_omap24xx()) {
31 const int omap24xx_pins[][2] = {
32 { M19_24XX_I2C1_SCL, L15_24XX_I2C1_SDA },
33 { J15_24XX_I2C2_SCL, H19_24XX_I2C2_SDA },
34 };
35 int scl, sda;
36
37 scl = omap24xx_pins[bus_id - 1][0];
38 sda = omap24xx_pins[bus_id - 1][1];
39 omap_cfg_reg(sda);
40 omap_cfg_reg(scl);
41 }
42
43 /* First I2C bus is not muxable */
44 if (cpu_is_omap34xx() && bus_id > 1) {
45 char mux_name[sizeof("i2c2_scl.i2c2_scl")];
46
47 sprintf(mux_name, "i2c%i_scl.i2c%i_scl", bus_id, bus_id);
48 omap_mux_init_signal(mux_name, OMAP_PIN_INPUT);
49 sprintf(mux_name, "i2c%i_sda.i2c%i_sda", bus_id, bus_id);
50 omap_mux_init_signal(mux_name, OMAP_PIN_INPUT);
51 }
52}
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c
index a98201cc265c..37b8a1a4adf8 100644
--- a/arch/arm/mach-omap2/id.c
+++ b/arch/arm/mach-omap2/id.c
@@ -21,13 +21,14 @@
21 21
22#include <asm/cputype.h> 22#include <asm/cputype.h>
23 23
24#include <mach/common.h> 24#include <plat/common.h>
25#include <mach/control.h> 25#include <plat/control.h>
26#include <mach/cpu.h> 26#include <plat/cpu.h>
27 27
28static struct omap_chip_id omap_chip; 28static struct omap_chip_id omap_chip;
29static unsigned int omap_revision; 29static unsigned int omap_revision;
30 30
31u32 omap3_features;
31 32
32unsigned int omap_rev(void) 33unsigned int omap_rev(void)
33{ 34{
@@ -52,11 +53,13 @@ int omap_type(void)
52{ 53{
53 u32 val = 0; 54 u32 val = 0;
54 55
55 if (cpu_is_omap24xx()) 56 if (cpu_is_omap24xx()) {
56 val = omap_ctrl_readl(OMAP24XX_CONTROL_STATUS); 57 val = omap_ctrl_readl(OMAP24XX_CONTROL_STATUS);
57 else if (cpu_is_omap34xx()) 58 } else if (cpu_is_omap34xx()) {
58 val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS); 59 val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS);
59 else { 60 } else if (cpu_is_omap44xx()) {
61 val = omap_ctrl_readl(OMAP44XX_CONTROL_STATUS);
62 } else {
60 pr_err("Cannot detect omap type!\n"); 63 pr_err("Cannot detect omap type!\n");
61 goto out; 64 goto out;
62 } 65 }
@@ -155,12 +158,41 @@ void __init omap24xx_check_revision(void)
155 pr_info("\n"); 158 pr_info("\n");
156} 159}
157 160
158void __init omap34xx_check_revision(void) 161#define OMAP3_CHECK_FEATURE(status,feat) \
162 if (((status & OMAP3_ ##feat## _MASK) \
163 >> OMAP3_ ##feat## _SHIFT) != FEAT_ ##feat## _NONE) { \
164 omap3_features |= OMAP3_HAS_ ##feat; \
165 }
166
167void __init omap3_check_features(void)
168{
169 u32 status;
170
171 omap3_features = 0;
172
173 status = omap_ctrl_readl(OMAP3_CONTROL_OMAP_STATUS);
174
175 OMAP3_CHECK_FEATURE(status, L2CACHE);
176 OMAP3_CHECK_FEATURE(status, IVA);
177 OMAP3_CHECK_FEATURE(status, SGX);
178 OMAP3_CHECK_FEATURE(status, NEON);
179 OMAP3_CHECK_FEATURE(status, ISP);
180 if (cpu_is_omap3630())
181 omap3_features |= OMAP3_HAS_192MHZ_CLK;
182
183 /*
184 * TODO: Get additional info (where applicable)
185 * e.g. Size of L2 cache.
186 */
187}
188
189void __init omap3_check_revision(void)
159{ 190{
160 u32 cpuid, idcode; 191 u32 cpuid, idcode;
161 u16 hawkeye; 192 u16 hawkeye;
162 u8 rev; 193 u8 rev;
163 char *rev_name = "ES1.0"; 194
195 omap_chip.oc = CHIP_IS_OMAP3430;
164 196
165 /* 197 /*
166 * We cannot access revision registers on ES1.0. 198 * We cannot access revision registers on ES1.0.
@@ -170,7 +202,8 @@ void __init omap34xx_check_revision(void)
170 cpuid = read_cpuid(CPUID_ID); 202 cpuid = read_cpuid(CPUID_ID);
171 if ((((cpuid >> 4) & 0xfff) == 0xc08) && ((cpuid & 0xf) == 0x0)) { 203 if ((((cpuid >> 4) & 0xfff) == 0xc08) && ((cpuid & 0xf) == 0x0)) {
172 omap_revision = OMAP3430_REV_ES1_0; 204 omap_revision = OMAP3430_REV_ES1_0;
173 goto out; 205 omap_chip.oc |= CHIP_IS_OMAP3430ES1;
206 return;
174 } 207 }
175 208
176 /* 209 /*
@@ -183,33 +216,156 @@ void __init omap34xx_check_revision(void)
183 hawkeye = (idcode >> 12) & 0xffff; 216 hawkeye = (idcode >> 12) & 0xffff;
184 rev = (idcode >> 28) & 0xff; 217 rev = (idcode >> 28) & 0xff;
185 218
186 if (hawkeye == 0xb7ae) { 219 switch (hawkeye) {
220 case 0xb7ae:
221 /* Handle 34xx/35xx devices */
187 switch (rev) { 222 switch (rev) {
188 case 0: 223 case 0: /* Take care of early samples */
224 case 1:
189 omap_revision = OMAP3430_REV_ES2_0; 225 omap_revision = OMAP3430_REV_ES2_0;
190 rev_name = "ES2.0"; 226 omap_chip.oc |= CHIP_IS_OMAP3430ES2;
191 break; 227 break;
192 case 2: 228 case 2:
193 omap_revision = OMAP3430_REV_ES2_1; 229 omap_revision = OMAP3430_REV_ES2_1;
194 rev_name = "ES2.1"; 230 omap_chip.oc |= CHIP_IS_OMAP3430ES2;
195 break; 231 break;
196 case 3: 232 case 3:
197 omap_revision = OMAP3430_REV_ES3_0; 233 omap_revision = OMAP3430_REV_ES3_0;
198 rev_name = "ES3.0"; 234 omap_chip.oc |= CHIP_IS_OMAP3430ES3_0;
199 break; 235 break;
200 case 4: 236 case 4:
201 omap_revision = OMAP3430_REV_ES3_1; 237 omap_revision = OMAP3430_REV_ES3_1;
202 rev_name = "ES3.1"; 238 omap_chip.oc |= CHIP_IS_OMAP3430ES3_1;
203 break; 239 break;
240 case 7:
241 /* FALLTHROUGH */
204 default: 242 default:
205 /* Use the latest known revision as default */ 243 /* Use the latest known revision as default */
206 omap_revision = OMAP3430_REV_ES3_1; 244 omap_revision = OMAP3430_REV_ES3_1_2;
207 rev_name = "Unknown revision\n"; 245
246 /* REVISIT: Add CHIP_IS_OMAP3430ES3_1_2? */
247 omap_chip.oc |= CHIP_IS_OMAP3430ES3_1;
208 } 248 }
249 break;
250 case 0xb868:
251 /* Handle OMAP35xx/AM35xx devices
252 *
253 * Set the device to be OMAP3505 here. Actual device
254 * is identified later based on the features.
255 *
256 * REVISIT: AM3505/AM3517 should have their own CHIP_IS
257 */
258 omap_revision = OMAP3505_REV(rev);
259 omap_chip.oc |= CHIP_IS_OMAP3430ES3_1;
260 break;
261 case 0xb891:
262 /* FALLTHROUGH */
263 default:
264 /* Unknown default to latest silicon rev as default*/
265 omap_revision = OMAP3630_REV_ES1_0;
266 omap_chip.oc |= CHIP_IS_OMAP3630ES1;
209 } 267 }
268}
210 269
211out: 270void __init omap4_check_revision(void)
212 pr_info("OMAP%04x %s\n", omap_rev() >> 16, rev_name); 271{
272 u32 idcode;
273 u16 hawkeye;
274 u8 rev;
275 char *rev_name = "ES1.0";
276
277 /*
278 * The IC rev detection is done with hawkeye and rev.
279 * Note that rev does not map directly to defined processor
280 * revision numbers as ES1.0 uses value 0.
281 */
282 idcode = read_tap_reg(OMAP_TAP_IDCODE);
283 hawkeye = (idcode >> 12) & 0xffff;
284 rev = (idcode >> 28) & 0xff;
285
286 if ((hawkeye == 0xb852) && (rev == 0x0)) {
287 omap_revision = OMAP4430_REV_ES1_0;
288 omap_chip.oc |= CHIP_IS_OMAP4430ES1;
289 pr_info("OMAP%04x %s\n", omap_rev() >> 16, rev_name);
290 return;
291 }
292
293 pr_err("Unknown OMAP4 CPU id\n");
294}
295
296#define OMAP3_SHOW_FEATURE(feat) \
297 if (omap3_has_ ##feat()) \
298 printk(#feat" ");
299
300void __init omap3_cpuinfo(void)
301{
302 u8 rev = GET_OMAP_REVISION();
303 char cpu_name[16], cpu_rev[16];
304
305 /* OMAP3430 and OMAP3530 are assumed to be same.
306 *
307 * OMAP3525, OMAP3515 and OMAP3503 can be detected only based
308 * on available features. Upon detection, update the CPU id
309 * and CPU class bits.
310 */
311 if (cpu_is_omap3630()) {
312 strcpy(cpu_name, "OMAP3630");
313 } else if (cpu_is_omap3505()) {
314 /*
315 * AM35xx devices
316 */
317 if (omap3_has_sgx()) {
318 omap_revision = OMAP3517_REV(rev);
319 strcpy(cpu_name, "AM3517");
320 } else {
321 /* Already set in omap3_check_revision() */
322 strcpy(cpu_name, "AM3505");
323 }
324 } else if (omap3_has_iva() && omap3_has_sgx()) {
325 /* OMAP3430, OMAP3525, OMAP3515, OMAP3503 devices */
326 strcpy(cpu_name, "OMAP3430/3530");
327 } else if (omap3_has_iva()) {
328 omap_revision = OMAP3525_REV(rev);
329 strcpy(cpu_name, "OMAP3525");
330 } else if (omap3_has_sgx()) {
331 omap_revision = OMAP3515_REV(rev);
332 strcpy(cpu_name, "OMAP3515");
333 } else {
334 omap_revision = OMAP3503_REV(rev);
335 strcpy(cpu_name, "OMAP3503");
336 }
337
338 switch (rev) {
339 case OMAP_REVBITS_00:
340 strcpy(cpu_rev, "1.0");
341 break;
342 case OMAP_REVBITS_10:
343 strcpy(cpu_rev, "2.0");
344 break;
345 case OMAP_REVBITS_20:
346 strcpy(cpu_rev, "2.1");
347 break;
348 case OMAP_REVBITS_30:
349 strcpy(cpu_rev, "3.0");
350 break;
351 case OMAP_REVBITS_40:
352 /* FALLTHROUGH */
353 default:
354 /* Use the latest known revision as default */
355 strcpy(cpu_rev, "3.1");
356 }
357
358 /* Print verbose information */
359 pr_info("%s ES%s (", cpu_name, cpu_rev);
360
361 OMAP3_SHOW_FEATURE(l2cache);
362 OMAP3_SHOW_FEATURE(iva);
363 OMAP3_SHOW_FEATURE(sgx);
364 OMAP3_SHOW_FEATURE(neon);
365 OMAP3_SHOW_FEATURE(isp);
366 OMAP3_SHOW_FEATURE(192mhz_clk);
367
368 printk(")\n");
213} 369}
214 370
215/* 371/*
@@ -221,15 +377,19 @@ void __init omap2_check_revision(void)
221 * At this point we have an idea about the processor revision set 377 * At this point we have an idea about the processor revision set
222 * earlier with omap2_set_globals_tap(). 378 * earlier with omap2_set_globals_tap().
223 */ 379 */
224 if (cpu_is_omap24xx()) 380 if (cpu_is_omap24xx()) {
225 omap24xx_check_revision(); 381 omap24xx_check_revision();
226 else if (cpu_is_omap34xx()) 382 } else if (cpu_is_omap34xx()) {
227 omap34xx_check_revision(); 383 omap3_check_revision();
228 else if (cpu_is_omap44xx()) { 384 omap3_check_features();
229 printk(KERN_INFO "FIXME: CPU revision = OMAP4430\n"); 385 omap3_cpuinfo();
386 return;
387 } else if (cpu_is_omap44xx()) {
388 omap4_check_revision();
230 return; 389 return;
231 } else 390 } else {
232 pr_err("OMAP revision unknown, please fix!\n"); 391 pr_err("OMAP revision unknown, please fix!\n");
392 }
233 393
234 /* 394 /*
235 * OK, now we know the exact revision. Initialize omap_chip bits 395 * OK, now we know the exact revision. Initialize omap_chip bits
@@ -238,23 +398,14 @@ void __init omap2_check_revision(void)
238 if (cpu_is_omap243x()) { 398 if (cpu_is_omap243x()) {
239 /* Currently only supports 2430ES2.1 and 2430-all */ 399 /* Currently only supports 2430ES2.1 and 2430-all */
240 omap_chip.oc |= CHIP_IS_OMAP2430; 400 omap_chip.oc |= CHIP_IS_OMAP2430;
401 return;
241 } else if (cpu_is_omap242x()) { 402 } else if (cpu_is_omap242x()) {
242 /* Currently only supports 2420ES2.1.1 and 2420-all */ 403 /* Currently only supports 2420ES2.1.1 and 2420-all */
243 omap_chip.oc |= CHIP_IS_OMAP2420; 404 omap_chip.oc |= CHIP_IS_OMAP2420;
244 } else if (cpu_is_omap343x()) { 405 return;
245 omap_chip.oc = CHIP_IS_OMAP3430;
246 if (omap_rev() == OMAP3430_REV_ES1_0)
247 omap_chip.oc |= CHIP_IS_OMAP3430ES1;
248 else if (omap_rev() >= OMAP3430_REV_ES2_0 &&
249 omap_rev() <= OMAP3430_REV_ES2_1)
250 omap_chip.oc |= CHIP_IS_OMAP3430ES2;
251 else if (omap_rev() == OMAP3430_REV_ES3_0)
252 omap_chip.oc |= CHIP_IS_OMAP3430ES3_0;
253 else if (omap_rev() == OMAP3430_REV_ES3_1)
254 omap_chip.oc |= CHIP_IS_OMAP3430ES3_1;
255 } else {
256 pr_err("Uninitialized omap_chip, please fix!\n");
257 } 406 }
407
408 pr_err("Uninitialized omap_chip, please fix!\n");
258} 409}
259 410
260/* 411/*
diff --git a/arch/arm/mach-omap2/include/mach/am35xx.h b/arch/arm/mach-omap2/include/mach/am35xx.h
new file mode 100644
index 000000000000..a705f946fc46
--- /dev/null
+++ b/arch/arm/mach-omap2/include/mach/am35xx.h
@@ -0,0 +1,26 @@
1/*:
2 * Address mappings and base address for AM35XX specific interconnects
3 * and peripherals.
4 *
5 * Copyright (C) 2009 Texas Instruments
6 *
7 * Author: Sriramakrishnan <srk@ti.com>
8 * Vaibhav Hiremath <hvaibhav@ti.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 */
14#ifndef __ASM_ARCH_AM35XX_H
15#define __ASM_ARCH_AM35XX_H
16
17/*
18 * Base addresses
19 * Note: OMAP3430 IVA2 memory space is being used for AM35xx IPSS modules
20 */
21#define AM35XX_IPSS_EMAC_BASE 0x5C000000
22#define AM35XX_IPSS_USBOTGSS_BASE 0x5C040000
23#define AM35XX_IPSS_HECC_BASE 0x5C050000
24#define AM35XX_IPSS_VPFE_BASE 0x5C060000
25
26#endif /* __ASM_ARCH_AM35XX_H */
diff --git a/arch/arm/mach-omap2/include/mach/board-sdp.h b/arch/arm/mach-omap2/include/mach/board-sdp.h
new file mode 100644
index 000000000000..465169c0908a
--- /dev/null
+++ b/arch/arm/mach-omap2/include/mach/board-sdp.h
@@ -0,0 +1,21 @@
1/*
2 * board-sdp.h
3 *
4 * Information structures for SDP-specific board config data
5 *
6 * Copyright (C) 2009 Nokia Corporation
7 * Copyright (C) 2009 Texas Instruments
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 */
13#include <linux/mtd/mtd.h>
14#include <linux/mtd/partitions.h>
15
16struct flash_partitions {
17 struct mtd_partition *parts;
18 int nr_parts;
19};
20
21extern void sdp_flash_init(struct flash_partitions []);
diff --git a/arch/arm/mach-omap2/include/mach/board-zoom.h b/arch/arm/mach-omap2/include/mach/board-zoom.h
new file mode 100644
index 000000000000..c93b29e21b78
--- /dev/null
+++ b/arch/arm/mach-omap2/include/mach/board-zoom.h
@@ -0,0 +1,5 @@
1/*
2 * Defines for zoom boards
3 */
4extern int __init zoom_debugboard_init(void);
5extern void __init zoom_peripherals_init(void);
diff --git a/arch/arm/mach-omap2/include/mach/clkdev.h b/arch/arm/mach-omap2/include/mach/clkdev.h
new file mode 100644
index 000000000000..53b027441c56
--- /dev/null
+++ b/arch/arm/mach-omap2/include/mach/clkdev.h
@@ -0,0 +1,5 @@
1/*
2 * arch/arm/mach-omap2/include/mach/clkdev.h
3 */
4
5#include <plat/clkdev.h>
diff --git a/arch/arm/mach-omap2/include/mach/debug-macro.S b/arch/arm/mach-omap2/include/mach/debug-macro.S
new file mode 100644
index 000000000000..4a63a2ea484d
--- /dev/null
+++ b/arch/arm/mach-omap2/include/mach/debug-macro.S
@@ -0,0 +1,131 @@
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 <plat/serial.h>
17
18#define UART_OFFSET(addr) ((addr) & 0x00ffffff)
19
20 .pushsection .data
21omap_uart_phys: .word 0
22omap_uart_virt: .word 0
23omap_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, rx, tmp
33
34 /* Use omap_uart_phys/virt if already configured */
3510: mrc p15, 0, \rx, c1, c0
36 tst \rx, #1 @ MMU enabled?
37 ldreq \rx, =omap_uart_phys @ physical base address
38 ldrne \rx, =omap_uart_virt @ virtual base address
39 ldr \rx, [\rx, #0]
40 cmp \rx, #0 @ is port configured?
41 bne 99f @ already configured
42
43 /* Check UART1 scratchpad register for uart to use */
44 mrc p15, 0, \rx, c1, c0
45 tst \rx, #1 @ MMU enabled?
46 moveq \rx, #0x48000000 @ physical base address
47 movne \rx, #0xfa000000 @ virtual base
48 orr \rx, \rx, #0x0006a000 @ uart1 on omap2/3/4
49 ldrb \rx, [\rx, #(UART_SCR << OMAP_PORT_SHIFT)] @ scratchpad
50
51 /* Select the UART to use based on the UART1 scratchpad value */
52 cmp \rx, #0 @ no port configured?
53 beq 21f @ if none, try to use UART1
54 cmp \rx, #OMAP2UART1 @ OMAP2/3/4UART1
55 beq 21f @ configure OMAP2/3/4UART1
56 cmp \rx, #OMAP2UART2 @ OMAP2/3/4UART2
57 beq 22f @ configure OMAP2/3/4UART2
58 cmp \rx, #OMAP2UART3 @ only on 24xx
59 beq 23f @ configure OMAP2UART3
60 cmp \rx, #OMAP3UART3 @ only on 34xx
61 beq 33f @ configure OMAP3UART3
62 cmp \rx, #OMAP4UART3 @ only on 44xx
63 beq 43f @ configure OMAP4UART3
64 cmp \rx, #OMAP3UART4 @ only on 36xx
65 beq 34f @ configure OMAP3UART4
66 cmp \rx, #OMAP4UART4 @ only on 44xx
67 beq 44f @ configure OMAP4UART4
68 cmp \rx, #ZOOM_UART @ only on zoom2/3
69 beq 95f @ configure ZOOM_UART
70
71 /* Configure the UART offset from the phys/virt base */
7221: mov \rx, #UART_OFFSET(OMAP2_UART1_BASE) @ omap2/3/4
73 b 98f
7422: mov \rx, #UART_OFFSET(OMAP2_UART2_BASE) @ omap2/3/4
75 b 98f
7623: mov \rx, #UART_OFFSET(OMAP2_UART3_BASE)
77 b 98f
7833: mov \rx, #UART_OFFSET(OMAP3_UART1_BASE)
79 add \rx, \rx, #0x00fb0000
80 add \rx, \rx, #0x00006000 @ OMAP3_UART3_BASE
81 b 98f
8234: mov \rx, #UART_OFFSET(OMAP3_UART1_BASE)
83 add \rx, \rx, #0x00fb0000
84 add \rx, \rx, #0x00028000 @ OMAP3_UART4_BASE
85 b 98f
8643: mov \rx, #UART_OFFSET(OMAP4_UART3_BASE)
87 b 98f
8844: mov \rx, #UART_OFFSET(OMAP4_UART4_BASE)
89 b 98f
9095: mov \rx, #ZOOM_UART_BASE
91 ldr \tmp, =omap_uart_phys
92 str \rx, [\tmp, #0]
93 mov \rx, #ZOOM_UART_VIRT
94 ldr \tmp, =omap_uart_virt
95 str \rx, [\tmp, #0]
96 mov \rx, #(UART_LSR << ZOOM_PORT_SHIFT)
97 ldr \tmp, =omap_uart_lsr
98 str \rx, [\tmp, #0]
99 b 10b
100
101 /* Store both phys and virt address for the uart */
10298: add \rx, \rx, #0x48000000 @ phys base
103 ldr \tmp, =omap_uart_phys
104 str \rx, [\tmp, #0]
105 sub \rx, \rx, #0x48000000 @ phys base
106 add \rx, \rx, #0xfa000000 @ virt base
107 ldr \tmp, =omap_uart_virt
108 str \rx, [\tmp, #0]
109 mov \rx, #(UART_LSR << OMAP_PORT_SHIFT)
110 ldr \tmp, =omap_uart_lsr
111 str \rx, [\tmp, #0]
112
113 b 10b
11499:
115 .endm
116
117 .macro senduart,rd,rx
118 strb \rd, [\rx]
119 .endm
120
121 .macro busyuart,rd,rx
1221001: ldr \rd, =omap_uart_lsr
123 ldr \rd, [\rd, #0]
124 ldrb \rd, [\rx, \rd]
125 and \rd, \rd, #(UART_LSR_TEMT | UART_LSR_THRE)
126 teq \rd, #(UART_LSR_TEMT | UART_LSR_THRE)
127 bne 1001b
128 .endm
129
130 .macro waituart,rd,rx
131 .endm
diff --git a/arch/arm/mach-omap2/include/mach/entry-macro.S b/arch/arm/mach-omap2/include/mach/entry-macro.S
new file mode 100644
index 000000000000..50fd74916643
--- /dev/null
+++ b/arch/arm/mach-omap2/include/mach/entry-macro.S
@@ -0,0 +1,212 @@
1/*
2 * arch/arm/plat-omap/include/mach/entry-macro.S
3 *
4 * Low-level IRQ helper macros for OMAP-based platforms
5 *
6 * Copyright (C) 2009 Texas Instruments
7 * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
8 *
9 * This file is licensed under the terms of the GNU General Public
10 * License version 2. This program is licensed "as is" without any
11 * warranty of any kind, whether express or implied.
12 */
13#include <mach/hardware.h>
14#include <mach/io.h>
15#include <mach/irqs.h>
16#include <asm/hardware/gic.h>
17
18#include <plat/omap24xx.h>
19#include <plat/omap34xx.h>
20#include <plat/omap44xx.h>
21
22#include <plat/multi.h>
23
24#define OMAP2_IRQ_BASE OMAP2_L4_IO_ADDRESS(OMAP24XX_IC_BASE)
25#define OMAP3_IRQ_BASE OMAP2_L4_IO_ADDRESS(OMAP34XX_IC_BASE)
26#define OMAP4_IRQ_BASE OMAP2_L4_IO_ADDRESS(OMAP44XX_GIC_CPU_BASE)
27#define INTCPS_SIR_IRQ_OFFSET 0x0040 /* omap2/3 active interrupt offset */
28#define ACTIVEIRQ_MASK 0x7f /* omap2/3 active interrupt bits */
29
30 .macro disable_fiq
31 .endm
32
33 .macro arch_ret_to_user, tmp1, tmp2
34 .endm
35
36/*
37 * Unoptimized irq functions for multi-omap2, 3 and 4
38 */
39
40#ifdef MULTI_OMAP2
41 .pushsection .data
42omap_irq_base: .word 0
43 .popsection
44
45 /* Configure the interrupt base on the first interrupt */
46 .macro get_irqnr_preamble, base, tmp
479:
48 ldr \base, =omap_irq_base @ irq base address
49 ldr \base, [\base, #0] @ irq base value
50 cmp \base, #0 @ already configured?
51 bne 9997f @ nothing to do
52
53 mrc p15, 0, \tmp, c0, c0, 0 @ get processor revision
54 and \tmp, \tmp, #0x000f0000 @ only check architecture
55 cmp \tmp, #0x00070000 @ is v6?
56 beq 2400f @ found v6 so it's omap24xx
57 mrc p15, 0, \tmp, c0, c0, 0 @ get processor revision
58 and \tmp, \tmp, #0x000000f0 @ check cortex 8 or 9
59 cmp \tmp, #0x00000080 @ cortex A-8?
60 beq 3400f @ found A-8 so it's omap34xx
61 cmp \tmp, #0x00000090 @ cortex A-9?
62 beq 4400f @ found A-9 so it's omap44xx
632400: ldr \base, =OMAP2_IRQ_BASE
64 ldr \tmp, =omap_irq_base
65 str \base, [\tmp, #0]
66 b 9b
673400: ldr \base, =OMAP3_IRQ_BASE
68 ldr \tmp, =omap_irq_base
69 str \base, [\tmp, #0]
70 b 9b
714400: ldr \base, =OMAP4_IRQ_BASE
72 ldr \tmp, =omap_irq_base
73 str \base, [\tmp, #0]
74 b 9b
759997:
76 .endm
77
78 /* Check the pending interrupts. Note that base already set */
79 .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
80 tst \base, #0x100 @ gic address?
81 bne 4401f @ found gic
82
83 /* Handle omap2 and omap3 */
84 ldr \irqnr, [\base, #0x98] /* IRQ pending reg 1 */
85 cmp \irqnr, #0x0
86 bne 9998f
87 ldr \irqnr, [\base, #0xb8] /* IRQ pending reg 2 */
88 cmp \irqnr, #0x0
89 bne 9998f
90 ldr \irqnr, [\base, #0xd8] /* IRQ pending reg 3 */
91 cmp \irqnr, #0x0
929998:
93 ldrne \irqnr, [\base, #INTCPS_SIR_IRQ_OFFSET]
94 and \irqnr, \irqnr, #ACTIVEIRQ_MASK /* Clear spurious bits */
95 b 9999f
96
97 /* Handle omap4 */
984401: ldr \irqstat, [\base, #GIC_CPU_INTACK]
99 ldr \tmp, =1021
100 bic \irqnr, \irqstat, #0x1c00
101 cmp \irqnr, #29
102 cmpcc \irqnr, \irqnr
103 cmpne \irqnr, \tmp
104 cmpcs \irqnr, \irqnr
1059999:
106 .endm
107
108
109#else /* MULTI_OMAP2 */
110
111
112/*
113 * Optimized irq functions for omap2, 3 and 4
114 */
115
116#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
117 .macro get_irqnr_preamble, base, tmp
118#ifdef CONFIG_ARCH_OMAP2
119 ldr \base, =OMAP2_IRQ_BASE
120#else
121 ldr \base, =OMAP3_IRQ_BASE
122#endif
123 .endm
124
125 /* Check the pending interrupts. Note that base already set */
126 .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
127 ldr \irqnr, [\base, #0x98] /* IRQ pending reg 1 */
128 cmp \irqnr, #0x0
129 bne 9999f
130 ldr \irqnr, [\base, #0xb8] /* IRQ pending reg 2 */
131 cmp \irqnr, #0x0
132 bne 9999f
133 ldr \irqnr, [\base, #0xd8] /* IRQ pending reg 3 */
134 cmp \irqnr, #0x0
1359999:
136 ldrne \irqnr, [\base, #INTCPS_SIR_IRQ_OFFSET]
137 and \irqnr, \irqnr, #ACTIVEIRQ_MASK /* Clear spurious bits */
138
139 .endm
140#endif
141
142
143#ifdef CONFIG_ARCH_OMAP4
144
145 .macro get_irqnr_preamble, base, tmp
146 ldr \base, =OMAP4_IRQ_BASE
147 .endm
148
149 /*
150 * The interrupt numbering scheme is defined in the
151 * interrupt controller spec. To wit:
152 *
153 * Interrupts 0-15 are IPI
154 * 16-28 are reserved
155 * 29-31 are local. We allow 30 to be used for the watchdog.
156 * 32-1020 are global
157 * 1021-1022 are reserved
158 * 1023 is "spurious" (no interrupt)
159 *
160 * For now, we ignore all local interrupts so only return an
161 * interrupt if it's between 30 and 1020. The test_for_ipi
162 * routine below will pick up on IPIs.
163 * A simple read from the controller will tell us the number
164 * of the highest priority enabled interrupt.
165 * We then just need to check whether it is in the
166 * valid range for an IRQ (30-1020 inclusive).
167 */
168 .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
169 ldr \irqstat, [\base, #GIC_CPU_INTACK]
170
171 ldr \tmp, =1021
172
173 bic \irqnr, \irqstat, #0x1c00
174
175 cmp \irqnr, #29
176 cmpcc \irqnr, \irqnr
177 cmpne \irqnr, \tmp
178 cmpcs \irqnr, \irqnr
179 .endm
180
181 /* We assume that irqstat (the raw value of the IRQ acknowledge
182 * register) is preserved from the macro above.
183 * If there is an IPI, we immediately signal end of interrupt
184 * on the controller, since this requires the original irqstat
185 * value which we won't easily be able to recreate later.
186 */
187
188 .macro test_for_ipi, irqnr, irqstat, base, tmp
189 bic \irqnr, \irqstat, #0x1c00
190 cmp \irqnr, #16
191 it cc
192 strcc \irqstat, [\base, #GIC_CPU_EOI]
193 it cs
194 cmpcs \irqnr, \irqnr
195 .endm
196
197 /* As above, this assumes that irqstat and base are preserved */
198
199 .macro test_for_ltirq, irqnr, irqstat, base, tmp
200 bic \irqnr, \irqstat, #0x1c00
201 mov \tmp, #0
202 cmp \irqnr, #29
203 itt eq
204 moveq \tmp, #1
205 streq \irqstat, [\base, #GIC_CPU_EOI]
206 cmp \tmp, #0
207 .endm
208#endif
209#endif /* MULTI_OMAP2 */
210
211 .macro irq_prio_table
212 .endm
diff --git a/arch/arm/mach-omap2/include/mach/gpio.h b/arch/arm/mach-omap2/include/mach/gpio.h
new file mode 100644
index 000000000000..be4d290d57ee
--- /dev/null
+++ b/arch/arm/mach-omap2/include/mach/gpio.h
@@ -0,0 +1,5 @@
1/*
2 * arch/arm/mach-omap2/include/mach/gpio.h
3 */
4
5#include <plat/gpio.h>
diff --git a/arch/arm/mach-omap2/include/mach/hardware.h b/arch/arm/mach-omap2/include/mach/hardware.h
new file mode 100644
index 000000000000..78edf9d33f71
--- /dev/null
+++ b/arch/arm/mach-omap2/include/mach/hardware.h
@@ -0,0 +1,5 @@
1/*
2 * arch/arm/mach-omap2/include/mach/hardware.h
3 */
4
5#include <plat/hardware.h>
diff --git a/arch/arm/mach-omap2/include/mach/io.h b/arch/arm/mach-omap2/include/mach/io.h
new file mode 100644
index 000000000000..fd78f31aa1ad
--- /dev/null
+++ b/arch/arm/mach-omap2/include/mach/io.h
@@ -0,0 +1,5 @@
1/*
2 * arch/arm/mach-omap2/include/mach/io.h
3 */
4
5#include <plat/io.h>
diff --git a/arch/arm/mach-omap2/include/mach/irqs.h b/arch/arm/mach-omap2/include/mach/irqs.h
new file mode 100644
index 000000000000..44dab7725696
--- /dev/null
+++ b/arch/arm/mach-omap2/include/mach/irqs.h
@@ -0,0 +1,5 @@
1/*
2 * arch/arm/mach-omap2/include/mach/irqs.h
3 */
4
5#include <plat/irqs.h>
diff --git a/arch/arm/mach-omap2/include/mach/memory.h b/arch/arm/mach-omap2/include/mach/memory.h
new file mode 100644
index 000000000000..ca6d32a917dd
--- /dev/null
+++ b/arch/arm/mach-omap2/include/mach/memory.h
@@ -0,0 +1,5 @@
1/*
2 * arch/arm/mach-omap2/include/mach/memory.h
3 */
4
5#include <plat/memory.h>
diff --git a/arch/arm/mach-omap2/include/mach/smp.h b/arch/arm/mach-omap2/include/mach/smp.h
new file mode 100644
index 000000000000..323675f21b69
--- /dev/null
+++ b/arch/arm/mach-omap2/include/mach/smp.h
@@ -0,0 +1,5 @@
1/*
2 * arch/arm/mach-omap2/include/mach/smp.h
3 */
4
5#include <plat/smp.h>
diff --git a/arch/arm/mach-omap2/include/mach/system.h b/arch/arm/mach-omap2/include/mach/system.h
new file mode 100644
index 000000000000..d488721ab90b
--- /dev/null
+++ b/arch/arm/mach-omap2/include/mach/system.h
@@ -0,0 +1,5 @@
1/*
2 * arch/arm/mach-omap2/include/mach/system.h
3 */
4
5#include <plat/system.h>
diff --git a/arch/arm/mach-omap2/include/mach/timex.h b/arch/arm/mach-omap2/include/mach/timex.h
new file mode 100644
index 000000000000..de9f8fc40e7c
--- /dev/null
+++ b/arch/arm/mach-omap2/include/mach/timex.h
@@ -0,0 +1,5 @@
1/*
2 * arch/arm/mach-omap2/include/mach/timex.h
3 */
4
5#include <plat/timex.h>
diff --git a/arch/arm/mach-omap2/include/mach/uncompress.h b/arch/arm/mach-omap2/include/mach/uncompress.h
new file mode 100644
index 000000000000..78e0557bfd4e
--- /dev/null
+++ b/arch/arm/mach-omap2/include/mach/uncompress.h
@@ -0,0 +1,5 @@
1/*
2 * arch/arm/mach-omap2/include/mach/uncompress.h
3 */
4
5#include <plat/uncompress.h>
diff --git a/arch/arm/mach-omap2/include/mach/vmalloc.h b/arch/arm/mach-omap2/include/mach/vmalloc.h
new file mode 100644
index 000000000000..9ce9b6e8ad23
--- /dev/null
+++ b/arch/arm/mach-omap2/include/mach/vmalloc.h
@@ -0,0 +1,20 @@
1/*
2 * arch/arm/plat-omap/include/mach/vmalloc.h
3 *
4 * Copyright (C) 2000 Russell King.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20#define VMALLOC_END (PAGE_OFFSET + 0x38000000)
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c
index 56be87d13edb..87f676acf61d 100644
--- a/arch/arm/mach-omap2/io.c
+++ b/arch/arm/mach-omap2/io.c
@@ -22,39 +22,37 @@
22#include <linux/init.h> 22#include <linux/init.h>
23#include <linux/io.h> 23#include <linux/io.h>
24#include <linux/clk.h> 24#include <linux/clk.h>
25#include <linux/omapfb.h>
25 26
26#include <asm/tlb.h> 27#include <asm/tlb.h>
27 28
28#include <asm/mach/map.h> 29#include <asm/mach/map.h>
29 30
30#include <mach/mux.h> 31#include <plat/mux.h>
31#include <mach/omapfb.h> 32#include <plat/sram.h>
32#include <mach/sram.h> 33#include <plat/sdrc.h>
33#include <mach/sdrc.h> 34#include <plat/gpmc.h>
34#include <mach/gpmc.h> 35#include <plat/serial.h>
35#include <mach/serial.h> 36#include <plat/vram.h>
36 37
37#ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once clkdev is ready */ 38#include "clock2xxx.h"
38#include "clock.h" 39#include "clock3xxx.h"
40#include "clock44xx.h"
39 41
40#include <mach/omap-pm.h> 42#include <plat/omap-pm.h>
41#include <mach/powerdomain.h> 43#include <plat/powerdomain.h>
42#include "powerdomains.h" 44#include "powerdomains.h"
43 45
44#include <mach/clockdomain.h> 46#include <plat/clockdomain.h>
45#include "clockdomains.h" 47#include "clockdomains.h"
46#endif 48#include <plat/omap_hwmod.h>
47#include <mach/omap_hwmod.h>
48#include "omap_hwmod_2420.h"
49#include "omap_hwmod_2430.h"
50#include "omap_hwmod_34xx.h"
51 49
52/* 50/*
53 * The machine specific code may provide the extra mapping besides the 51 * The machine specific code may provide the extra mapping besides the
54 * default mapping provided here. 52 * default mapping provided here.
55 */ 53 */
56 54
57#ifdef CONFIG_ARCH_OMAP24XX 55#ifdef CONFIG_ARCH_OMAP2
58static struct map_desc omap24xx_io_desc[] __initdata = { 56static struct map_desc omap24xx_io_desc[] __initdata = {
59 { 57 {
60 .virtual = L3_24XX_VIRT, 58 .virtual = L3_24XX_VIRT,
@@ -73,21 +71,21 @@ static struct map_desc omap24xx_io_desc[] __initdata = {
73#ifdef CONFIG_ARCH_OMAP2420 71#ifdef CONFIG_ARCH_OMAP2420
74static struct map_desc omap242x_io_desc[] __initdata = { 72static struct map_desc omap242x_io_desc[] __initdata = {
75 { 73 {
76 .virtual = DSP_MEM_24XX_VIRT, 74 .virtual = DSP_MEM_2420_VIRT,
77 .pfn = __phys_to_pfn(DSP_MEM_24XX_PHYS), 75 .pfn = __phys_to_pfn(DSP_MEM_2420_PHYS),
78 .length = DSP_MEM_24XX_SIZE, 76 .length = DSP_MEM_2420_SIZE,
79 .type = MT_DEVICE 77 .type = MT_DEVICE
80 }, 78 },
81 { 79 {
82 .virtual = DSP_IPI_24XX_VIRT, 80 .virtual = DSP_IPI_2420_VIRT,
83 .pfn = __phys_to_pfn(DSP_IPI_24XX_PHYS), 81 .pfn = __phys_to_pfn(DSP_IPI_2420_PHYS),
84 .length = DSP_IPI_24XX_SIZE, 82 .length = DSP_IPI_2420_SIZE,
85 .type = MT_DEVICE 83 .type = MT_DEVICE
86 }, 84 },
87 { 85 {
88 .virtual = DSP_MMU_24XX_VIRT, 86 .virtual = DSP_MMU_2420_VIRT,
89 .pfn = __phys_to_pfn(DSP_MMU_24XX_PHYS), 87 .pfn = __phys_to_pfn(DSP_MMU_2420_PHYS),
90 .length = DSP_MMU_24XX_SIZE, 88 .length = DSP_MMU_2420_SIZE,
91 .type = MT_DEVICE 89 .type = MT_DEVICE
92 }, 90 },
93}; 91};
@@ -124,7 +122,7 @@ static struct map_desc omap243x_io_desc[] __initdata = {
124#endif 122#endif
125#endif 123#endif
126 124
127#ifdef CONFIG_ARCH_OMAP34XX 125#ifdef CONFIG_ARCH_OMAP3
128static struct map_desc omap34xx_io_desc[] __initdata = { 126static struct map_desc omap34xx_io_desc[] __initdata = {
129 { 127 {
130 .virtual = L3_34XX_VIRT, 128 .virtual = L3_34XX_VIRT,
@@ -139,12 +137,6 @@ static struct map_desc omap34xx_io_desc[] __initdata = {
139 .type = MT_DEVICE 137 .type = MT_DEVICE
140 }, 138 },
141 { 139 {
142 .virtual = L4_WK_34XX_VIRT,
143 .pfn = __phys_to_pfn(L4_WK_34XX_PHYS),
144 .length = L4_WK_34XX_SIZE,
145 .type = MT_DEVICE
146 },
147 {
148 .virtual = OMAP34XX_GPMC_VIRT, 140 .virtual = OMAP34XX_GPMC_VIRT,
149 .pfn = __phys_to_pfn(OMAP34XX_GPMC_PHYS), 141 .pfn = __phys_to_pfn(OMAP34XX_GPMC_PHYS),
150 .length = OMAP34XX_GPMC_SIZE, 142 .length = OMAP34XX_GPMC_SIZE,
@@ -191,18 +183,30 @@ static struct map_desc omap44xx_io_desc[] __initdata = {
191 .type = MT_DEVICE, 183 .type = MT_DEVICE,
192 }, 184 },
193 { 185 {
194 .virtual = L4_WK_44XX_VIRT,
195 .pfn = __phys_to_pfn(L4_WK_44XX_PHYS),
196 .length = L4_WK_44XX_SIZE,
197 .type = MT_DEVICE,
198 },
199 {
200 .virtual = OMAP44XX_GPMC_VIRT, 186 .virtual = OMAP44XX_GPMC_VIRT,
201 .pfn = __phys_to_pfn(OMAP44XX_GPMC_PHYS), 187 .pfn = __phys_to_pfn(OMAP44XX_GPMC_PHYS),
202 .length = OMAP44XX_GPMC_SIZE, 188 .length = OMAP44XX_GPMC_SIZE,
203 .type = MT_DEVICE, 189 .type = MT_DEVICE,
204 }, 190 },
205 { 191 {
192 .virtual = OMAP44XX_EMIF1_VIRT,
193 .pfn = __phys_to_pfn(OMAP44XX_EMIF1_PHYS),
194 .length = OMAP44XX_EMIF1_SIZE,
195 .type = MT_DEVICE,
196 },
197 {
198 .virtual = OMAP44XX_EMIF2_VIRT,
199 .pfn = __phys_to_pfn(OMAP44XX_EMIF2_PHYS),
200 .length = OMAP44XX_EMIF2_SIZE,
201 .type = MT_DEVICE,
202 },
203 {
204 .virtual = OMAP44XX_DMM_VIRT,
205 .pfn = __phys_to_pfn(OMAP44XX_DMM_PHYS),
206 .length = OMAP44XX_DMM_SIZE,
207 .type = MT_DEVICE,
208 },
209 {
206 .virtual = L4_PER_44XX_VIRT, 210 .virtual = L4_PER_44XX_VIRT,
207 .pfn = __phys_to_pfn(L4_PER_44XX_PHYS), 211 .pfn = __phys_to_pfn(L4_PER_44XX_PHYS),
208 .length = L4_PER_44XX_SIZE, 212 .length = L4_PER_44XX_SIZE,
@@ -217,36 +221,54 @@ static struct map_desc omap44xx_io_desc[] __initdata = {
217}; 221};
218#endif 222#endif
219 223
220void __init omap2_map_common_io(void) 224static void __init _omap2_map_common_io(void)
225{
226 /* Normally devicemaps_init() would flush caches and tlb after
227 * mdesc->map_io(), but we must also do it here because of the CPU
228 * revision check below.
229 */
230 local_flush_tlb_all();
231 flush_cache_all();
232
233 omap2_check_revision();
234 omap_sram_init();
235 omapfb_reserve_sdram();
236 omap_vram_reserve_sdram();
237}
238
239#ifdef CONFIG_ARCH_OMAP2420
240void __init omap242x_map_common_io(void)
221{ 241{
222#if defined(CONFIG_ARCH_OMAP2420)
223 iotable_init(omap24xx_io_desc, ARRAY_SIZE(omap24xx_io_desc)); 242 iotable_init(omap24xx_io_desc, ARRAY_SIZE(omap24xx_io_desc));
224 iotable_init(omap242x_io_desc, ARRAY_SIZE(omap242x_io_desc)); 243 iotable_init(omap242x_io_desc, ARRAY_SIZE(omap242x_io_desc));
244 _omap2_map_common_io();
245}
225#endif 246#endif
226 247
227#if defined(CONFIG_ARCH_OMAP2430) 248#ifdef CONFIG_ARCH_OMAP2430
249void __init omap243x_map_common_io(void)
250{
228 iotable_init(omap24xx_io_desc, ARRAY_SIZE(omap24xx_io_desc)); 251 iotable_init(omap24xx_io_desc, ARRAY_SIZE(omap24xx_io_desc));
229 iotable_init(omap243x_io_desc, ARRAY_SIZE(omap243x_io_desc)); 252 iotable_init(omap243x_io_desc, ARRAY_SIZE(omap243x_io_desc));
253 _omap2_map_common_io();
254}
230#endif 255#endif
231 256
232#if defined(CONFIG_ARCH_OMAP34XX) 257#ifdef CONFIG_ARCH_OMAP3
258void __init omap34xx_map_common_io(void)
259{
233 iotable_init(omap34xx_io_desc, ARRAY_SIZE(omap34xx_io_desc)); 260 iotable_init(omap34xx_io_desc, ARRAY_SIZE(omap34xx_io_desc));
261 _omap2_map_common_io();
262}
234#endif 263#endif
235 264
236#if defined(CONFIG_ARCH_OMAP4) 265#ifdef CONFIG_ARCH_OMAP4
266void __init omap44xx_map_common_io(void)
267{
237 iotable_init(omap44xx_io_desc, ARRAY_SIZE(omap44xx_io_desc)); 268 iotable_init(omap44xx_io_desc, ARRAY_SIZE(omap44xx_io_desc));
238#endif 269 _omap2_map_common_io();
239 /* Normally devicemaps_init() would flush caches and tlb after
240 * mdesc->map_io(), but we must also do it here because of the CPU
241 * revision check below.
242 */
243 local_flush_tlb_all();
244 flush_cache_all();
245
246 omap2_check_revision();
247 omap_sram_init();
248 omapfb_reserve_sdram();
249} 270}
271#endif
250 272
251/* 273/*
252 * omap2_init_reprogram_sdrc - reprogram SDRC timing parameters 274 * omap2_init_reprogram_sdrc - reprogram SDRC timing parameters
@@ -285,30 +307,36 @@ static int __init _omap2_init_reprogram_sdrc(void)
285void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0, 307void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0,
286 struct omap_sdrc_params *sdrc_cs1) 308 struct omap_sdrc_params *sdrc_cs1)
287{ 309{
288 struct omap_hwmod **hwmods = NULL; 310 pwrdm_init(powerdomains_omap);
311 clkdm_init(clockdomains_omap, clkdm_autodeps);
312 if (cpu_is_omap242x())
313 omap2420_hwmod_init();
314 else if (cpu_is_omap243x())
315 omap2430_hwmod_init();
316 else if (cpu_is_omap34xx())
317 omap3xxx_hwmod_init();
318 omap2_mux_init();
319 /* The OPP tables have to be registered before a clk init */
320 omap_pm_if_early_init(mpu_opps, dsp_opps, l3_opps);
289 321
290 if (cpu_is_omap2420()) 322 if (cpu_is_omap2420())
291 hwmods = omap2420_hwmods; 323 omap2420_clk_init();
292 else if (cpu_is_omap2430()) 324 else if (cpu_is_omap2430())
293 hwmods = omap2430_hwmods; 325 omap2430_clk_init();
294 else if (cpu_is_omap34xx()) 326 else if (cpu_is_omap34xx())
295 hwmods = omap34xx_hwmods; 327 omap3xxx_clk_init();
328 else if (cpu_is_omap44xx())
329 omap4xxx_clk_init();
330 else
331 pr_err("Could not init clock framework - unknown CPU\n");
296 332
297#ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once the clkdev is ready */
298 /* The OPP tables have to be registered before a clk init */
299 omap_hwmod_init(hwmods);
300 omap2_mux_init();
301 omap_pm_if_early_init(mpu_opps, dsp_opps, l3_opps);
302 pwrdm_init(powerdomains_omap);
303 clkdm_init(clockdomains_omap, clkdm_pwrdm_autodeps);
304 omap2_clk_init();
305#endif
306 omap_serial_early_init(); 333 omap_serial_early_init();
307#ifndef CONFIG_ARCH_OMAP4 334 if (cpu_is_omap24xx() || cpu_is_omap34xx()) /* FIXME: OMAP4 */
308 omap_hwmod_late_init(); 335 omap_hwmod_late_init();
309 omap_pm_if_init(); 336 omap_pm_if_init();
310 omap2_sdrc_init(sdrc_cs0, sdrc_cs1); 337 if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
311 _omap2_init_reprogram_sdrc(); 338 omap2_sdrc_init(sdrc_cs0, sdrc_cs1);
312#endif 339 _omap2_init_reprogram_sdrc();
340 }
313 gpmc_init(); 341 gpmc_init();
314} 342}
diff --git a/arch/arm/mach-omap2/iommu2.c b/arch/arm/mach-omap2/iommu2.c
index 4a0e1cd5c1f4..4f63dc6859a4 100644
--- a/arch/arm/mach-omap2/iommu2.c
+++ b/arch/arm/mach-omap2/iommu2.c
@@ -15,9 +15,10 @@
15#include <linux/device.h> 15#include <linux/device.h>
16#include <linux/jiffies.h> 16#include <linux/jiffies.h>
17#include <linux/module.h> 17#include <linux/module.h>
18#include <linux/slab.h>
18#include <linux/stringify.h> 19#include <linux/stringify.h>
19 20
20#include <mach/iommu.h> 21#include <plat/iommu.h>
21 22
22/* 23/*
23 * omap2 architecture specific register bit definitions 24 * omap2 architecture specific register bit definitions
diff --git a/arch/arm/mach-omap2/irq.c b/arch/arm/mach-omap2/irq.c
index b82863887f10..26aeef560aa3 100644
--- a/arch/arm/mach-omap2/irq.c
+++ b/arch/arm/mach-omap2/irq.c
@@ -25,6 +25,10 @@
25#define INTC_SYSSTATUS 0x0014 25#define INTC_SYSSTATUS 0x0014
26#define INTC_SIR 0x0040 26#define INTC_SIR 0x0040
27#define INTC_CONTROL 0x0048 27#define INTC_CONTROL 0x0048
28#define INTC_PROTECTION 0x004C
29#define INTC_IDLE 0x0050
30#define INTC_THRESHOLD 0x0068
31#define INTC_MIR0 0x0084
28#define INTC_MIR_CLEAR0 0x0088 32#define INTC_MIR_CLEAR0 0x0088
29#define INTC_MIR_SET0 0x008c 33#define INTC_MIR_SET0 0x008c
30#define INTC_PENDING_IRQ0 0x0098 34#define INTC_PENDING_IRQ0 0x0098
@@ -48,6 +52,18 @@ static struct omap_irq_bank {
48 }, 52 },
49}; 53};
50 54
55/* Structure to save interrupt controller context */
56struct omap3_intc_regs {
57 u32 sysconfig;
58 u32 protection;
59 u32 idle;
60 u32 threshold;
61 u32 ilr[INTCPS_NR_IRQS];
62 u32 mir[INTCPS_NR_MIR_REGS];
63};
64
65static struct omap3_intc_regs intc_context[ARRAY_SIZE(irq_banks)];
66
51/* INTC bank register get/set */ 67/* INTC bank register get/set */
52 68
53static void intc_bank_write_reg(u32 val, struct omap_irq_bank *bank, u16 reg) 69static void intc_bank_write_reg(u32 val, struct omap_irq_bank *bank, u16 reg)
@@ -178,12 +194,22 @@ void __init omap_init_irq(void)
178 int i; 194 int i;
179 195
180 for (i = 0; i < ARRAY_SIZE(irq_banks); i++) { 196 for (i = 0; i < ARRAY_SIZE(irq_banks); i++) {
197 unsigned long base = 0;
181 struct omap_irq_bank *bank = irq_banks + i; 198 struct omap_irq_bank *bank = irq_banks + i;
182 199
183 if (cpu_is_omap24xx()) 200 if (cpu_is_omap24xx())
184 bank->base_reg = OMAP2_IO_ADDRESS(OMAP24XX_IC_BASE); 201 base = OMAP24XX_IC_BASE;
185 else if (cpu_is_omap34xx()) 202 else if (cpu_is_omap34xx())
186 bank->base_reg = OMAP2_IO_ADDRESS(OMAP34XX_IC_BASE); 203 base = OMAP34XX_IC_BASE;
204
205 BUG_ON(!base);
206
207 /* Static mapping, never released */
208 bank->base_reg = ioremap(base, SZ_4K);
209 if (!bank->base_reg) {
210 printk(KERN_ERR "Could not ioremap irq bank%i\n", i);
211 continue;
212 }
187 213
188 omap_irq_bank_init_one(bank); 214 omap_irq_bank_init_one(bank);
189 215
@@ -201,3 +227,71 @@ void __init omap_init_irq(void)
201 } 227 }
202} 228}
203 229
230#ifdef CONFIG_ARCH_OMAP3
231void omap_intc_save_context(void)
232{
233 int ind = 0, i = 0;
234 for (ind = 0; ind < ARRAY_SIZE(irq_banks); ind++) {
235 struct omap_irq_bank *bank = irq_banks + ind;
236 intc_context[ind].sysconfig =
237 intc_bank_read_reg(bank, INTC_SYSCONFIG);
238 intc_context[ind].protection =
239 intc_bank_read_reg(bank, INTC_PROTECTION);
240 intc_context[ind].idle =
241 intc_bank_read_reg(bank, INTC_IDLE);
242 intc_context[ind].threshold =
243 intc_bank_read_reg(bank, INTC_THRESHOLD);
244 for (i = 0; i < INTCPS_NR_IRQS; i++)
245 intc_context[ind].ilr[i] =
246 intc_bank_read_reg(bank, (0x100 + 0x4*i));
247 for (i = 0; i < INTCPS_NR_MIR_REGS; i++)
248 intc_context[ind].mir[i] =
249 intc_bank_read_reg(&irq_banks[0], INTC_MIR0 +
250 (0x20 * i));
251 }
252}
253
254void omap_intc_restore_context(void)
255{
256 int ind = 0, i = 0;
257
258 for (ind = 0; ind < ARRAY_SIZE(irq_banks); ind++) {
259 struct omap_irq_bank *bank = irq_banks + ind;
260 intc_bank_write_reg(intc_context[ind].sysconfig,
261 bank, INTC_SYSCONFIG);
262 intc_bank_write_reg(intc_context[ind].sysconfig,
263 bank, INTC_SYSCONFIG);
264 intc_bank_write_reg(intc_context[ind].protection,
265 bank, INTC_PROTECTION);
266 intc_bank_write_reg(intc_context[ind].idle,
267 bank, INTC_IDLE);
268 intc_bank_write_reg(intc_context[ind].threshold,
269 bank, INTC_THRESHOLD);
270 for (i = 0; i < INTCPS_NR_IRQS; i++)
271 intc_bank_write_reg(intc_context[ind].ilr[i],
272 bank, (0x100 + 0x4*i));
273 for (i = 0; i < INTCPS_NR_MIR_REGS; i++)
274 intc_bank_write_reg(intc_context[ind].mir[i],
275 &irq_banks[0], INTC_MIR0 + (0x20 * i));
276 }
277 /* MIRs are saved and restore with other PRCM registers */
278}
279
280void omap3_intc_suspend(void)
281{
282 /* A pending interrupt would prevent OMAP from entering suspend */
283 omap_ack_irq(0);
284}
285
286void omap3_intc_prepare_idle(void)
287{
288 /* Disable autoidle as it can stall interrupt controller */
289 intc_bank_write_reg(0, &irq_banks[0], INTC_SYSCONFIG);
290}
291
292void omap3_intc_resume_idle(void)
293{
294 /* Re-enable autoidle */
295 intc_bank_write_reg(1, &irq_banks[0], INTC_SYSCONFIG);
296}
297#endif /* CONFIG_ARCH_OMAP3 */
diff --git a/arch/arm/mach-omap2/mailbox.c b/arch/arm/mach-omap2/mailbox.c
index ef57b38a56a4..318f3638653c 100644
--- a/arch/arm/mach-omap2/mailbox.c
+++ b/arch/arm/mach-omap2/mailbox.c
@@ -15,9 +15,11 @@
15#include <linux/err.h> 15#include <linux/err.h>
16#include <linux/platform_device.h> 16#include <linux/platform_device.h>
17#include <linux/io.h> 17#include <linux/io.h>
18#include <mach/mailbox.h> 18#include <plat/mailbox.h>
19#include <mach/irqs.h> 19#include <mach/irqs.h>
20 20
21#define DRV_NAME "omap2-mailbox"
22
21#define MAILBOX_REVISION 0x000 23#define MAILBOX_REVISION 0x000
22#define MAILBOX_SYSCONFIG 0x010 24#define MAILBOX_SYSCONFIG 0x010
23#define MAILBOX_SYSSTATUS 0x014 25#define MAILBOX_SYSSTATUS 0x014
@@ -27,19 +29,30 @@
27#define MAILBOX_IRQSTATUS(u) (0x100 + 8 * (u)) 29#define MAILBOX_IRQSTATUS(u) (0x100 + 8 * (u))
28#define MAILBOX_IRQENABLE(u) (0x104 + 8 * (u)) 30#define MAILBOX_IRQENABLE(u) (0x104 + 8 * (u))
29 31
30#define MAILBOX_IRQ_NEWMSG(u) (1 << (2 * (u))) 32#define OMAP4_MAILBOX_IRQSTATUS(u) (0x104 + 10 * (u))
31#define MAILBOX_IRQ_NOTFULL(u) (1 << (2 * (u) + 1)) 33#define OMAP4_MAILBOX_IRQENABLE(u) (0x108 + 10 * (u))
34#define OMAP4_MAILBOX_IRQENABLE_CLR(u) (0x10c + 10 * (u))
35
36#define MAILBOX_IRQ_NEWMSG(m) (1 << (2 * (m)))
37#define MAILBOX_IRQ_NOTFULL(m) (1 << (2 * (m) + 1))
32 38
33/* SYSCONFIG: register bit definition */ 39/* SYSCONFIG: register bit definition */
34#define AUTOIDLE (1 << 0) 40#define AUTOIDLE (1 << 0)
35#define SOFTRESET (1 << 1) 41#define SOFTRESET (1 << 1)
36#define SMARTIDLE (2 << 3) 42#define SMARTIDLE (2 << 3)
43#define OMAP4_SOFTRESET (1 << 0)
44#define OMAP4_NOIDLE (1 << 2)
45#define OMAP4_SMARTIDLE (2 << 2)
37 46
38/* SYSSTATUS: register bit definition */ 47/* SYSSTATUS: register bit definition */
39#define RESETDONE (1 << 0) 48#define RESETDONE (1 << 0)
40 49
41#define MBOX_REG_SIZE 0x120 50#define MBOX_REG_SIZE 0x120
51
52#define OMAP4_MBOX_REG_SIZE 0x130
53
42#define MBOX_NR_REGS (MBOX_REG_SIZE / sizeof(u32)) 54#define MBOX_NR_REGS (MBOX_REG_SIZE / sizeof(u32))
55#define OMAP4_MBOX_NR_REGS (OMAP4_MBOX_REG_SIZE / sizeof(u32))
43 56
44static void __iomem *mbox_base; 57static void __iomem *mbox_base;
45 58
@@ -56,7 +69,8 @@ struct omap_mbox2_priv {
56 unsigned long irqstatus; 69 unsigned long irqstatus;
57 u32 newmsg_bit; 70 u32 newmsg_bit;
58 u32 notfull_bit; 71 u32 notfull_bit;
59 u32 ctx[MBOX_NR_REGS]; 72 u32 ctx[OMAP4_MBOX_NR_REGS];
73 unsigned long irqdisable;
60}; 74};
61 75
62static struct clk *mbox_ick_handle; 76static struct clk *mbox_ick_handle;
@@ -82,28 +96,47 @@ static int omap2_mbox_startup(struct omap_mbox *mbox)
82 96
83 mbox_ick_handle = clk_get(NULL, "mailboxes_ick"); 97 mbox_ick_handle = clk_get(NULL, "mailboxes_ick");
84 if (IS_ERR(mbox_ick_handle)) { 98 if (IS_ERR(mbox_ick_handle)) {
85 pr_err("Can't get mailboxes_ick\n"); 99 printk(KERN_ERR "Could not get mailboxes_ick: %ld\n",
86 return -ENODEV; 100 PTR_ERR(mbox_ick_handle));
101 return PTR_ERR(mbox_ick_handle);
87 } 102 }
88 clk_enable(mbox_ick_handle); 103 clk_enable(mbox_ick_handle);
89 104
90 mbox_write_reg(SOFTRESET, MAILBOX_SYSCONFIG); 105 if (cpu_is_omap44xx()) {
91 timeout = jiffies + msecs_to_jiffies(20); 106 mbox_write_reg(OMAP4_SOFTRESET, MAILBOX_SYSCONFIG);
92 do { 107 timeout = jiffies + msecs_to_jiffies(20);
93 l = mbox_read_reg(MAILBOX_SYSSTATUS); 108 do {
94 if (l & RESETDONE) 109 l = mbox_read_reg(MAILBOX_SYSCONFIG);
95 break; 110 if (!(l & OMAP4_SOFTRESET))
96 } while (!time_after(jiffies, timeout)); 111 break;
97 112 } while (!time_after(jiffies, timeout));
98 if (!(l & RESETDONE)) { 113
99 pr_err("Can't take mmu out of reset\n"); 114 if (l & OMAP4_SOFTRESET) {
100 return -ENODEV; 115 pr_err("Can't take mailbox out of reset\n");
116 return -ENODEV;
117 }
118 } else {
119 mbox_write_reg(SOFTRESET, MAILBOX_SYSCONFIG);
120 timeout = jiffies + msecs_to_jiffies(20);
121 do {
122 l = mbox_read_reg(MAILBOX_SYSSTATUS);
123 if (l & RESETDONE)
124 break;
125 } while (!time_after(jiffies, timeout));
126
127 if (!(l & RESETDONE)) {
128 pr_err("Can't take mailbox out of reset\n");
129 return -ENODEV;
130 }
101 } 131 }
102 132
103 l = mbox_read_reg(MAILBOX_REVISION); 133 l = mbox_read_reg(MAILBOX_REVISION);
104 pr_info("omap mailbox rev %d.%d\n", (l & 0xf0) >> 4, (l & 0x0f)); 134 pr_info("omap mailbox rev %d.%d\n", (l & 0xf0) >> 4, (l & 0x0f));
105 135
106 l = SMARTIDLE | AUTOIDLE; 136 if (cpu_is_omap44xx())
137 l = OMAP4_SMARTIDLE;
138 else
139 l = SMARTIDLE | AUTOIDLE;
107 mbox_write_reg(l, MAILBOX_SYSCONFIG); 140 mbox_write_reg(l, MAILBOX_SYSCONFIG);
108 141
109 omap2_mbox_enable_irq(mbox, IRQ_RX); 142 omap2_mbox_enable_irq(mbox, IRQ_RX);
@@ -115,6 +148,7 @@ static void omap2_mbox_shutdown(struct omap_mbox *mbox)
115{ 148{
116 clk_disable(mbox_ick_handle); 149 clk_disable(mbox_ick_handle);
117 clk_put(mbox_ick_handle); 150 clk_put(mbox_ick_handle);
151 mbox_ick_handle = NULL;
118} 152}
119 153
120/* Mailbox FIFO handle functions */ 154/* Mailbox FIFO handle functions */
@@ -143,7 +177,7 @@ static int omap2_mbox_fifo_full(struct omap_mbox *mbox)
143{ 177{
144 struct omap_mbox2_fifo *fifo = 178 struct omap_mbox2_fifo *fifo =
145 &((struct omap_mbox2_priv *)mbox->priv)->tx_fifo; 179 &((struct omap_mbox2_priv *)mbox->priv)->tx_fifo;
146 return (mbox_read_reg(fifo->fifo_stat)); 180 return mbox_read_reg(fifo->fifo_stat);
147} 181}
148 182
149/* Mailbox IRQ handle functions */ 183/* Mailbox IRQ handle functions */
@@ -163,10 +197,9 @@ static void omap2_mbox_disable_irq(struct omap_mbox *mbox,
163{ 197{
164 struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv; 198 struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv;
165 u32 l, bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit; 199 u32 l, bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit;
166 200 l = mbox_read_reg(p->irqdisable);
167 l = mbox_read_reg(p->irqenable);
168 l &= ~bit; 201 l &= ~bit;
169 mbox_write_reg(l, p->irqenable); 202 mbox_write_reg(l, p->irqdisable);
170} 203}
171 204
172static void omap2_mbox_ack_irq(struct omap_mbox *mbox, 205static void omap2_mbox_ack_irq(struct omap_mbox *mbox,
@@ -189,15 +222,19 @@ static int omap2_mbox_is_irq(struct omap_mbox *mbox,
189 u32 enable = mbox_read_reg(p->irqenable); 222 u32 enable = mbox_read_reg(p->irqenable);
190 u32 status = mbox_read_reg(p->irqstatus); 223 u32 status = mbox_read_reg(p->irqstatus);
191 224
192 return (enable & status & bit); 225 return (int)(enable & status & bit);
193} 226}
194 227
195static void omap2_mbox_save_ctx(struct omap_mbox *mbox) 228static void omap2_mbox_save_ctx(struct omap_mbox *mbox)
196{ 229{
197 int i; 230 int i;
198 struct omap_mbox2_priv *p = mbox->priv; 231 struct omap_mbox2_priv *p = mbox->priv;
199 232 int nr_regs;
200 for (i = 0; i < MBOX_NR_REGS; i++) { 233 if (cpu_is_omap44xx())
234 nr_regs = OMAP4_MBOX_NR_REGS;
235 else
236 nr_regs = MBOX_NR_REGS;
237 for (i = 0; i < nr_regs; i++) {
201 p->ctx[i] = mbox_read_reg(i * sizeof(u32)); 238 p->ctx[i] = mbox_read_reg(i * sizeof(u32));
202 239
203 dev_dbg(mbox->dev, "%s: [%02x] %08x\n", __func__, 240 dev_dbg(mbox->dev, "%s: [%02x] %08x\n", __func__,
@@ -209,8 +246,12 @@ static void omap2_mbox_restore_ctx(struct omap_mbox *mbox)
209{ 246{
210 int i; 247 int i;
211 struct omap_mbox2_priv *p = mbox->priv; 248 struct omap_mbox2_priv *p = mbox->priv;
212 249 int nr_regs;
213 for (i = 0; i < MBOX_NR_REGS; i++) { 250 if (cpu_is_omap44xx())
251 nr_regs = OMAP4_MBOX_NR_REGS;
252 else
253 nr_regs = MBOX_NR_REGS;
254 for (i = 0; i < nr_regs; i++) {
214 mbox_write_reg(p->ctx[i], i * sizeof(u32)); 255 mbox_write_reg(p->ctx[i], i * sizeof(u32));
215 256
216 dev_dbg(mbox->dev, "%s: [%02x] %08x\n", __func__, 257 dev_dbg(mbox->dev, "%s: [%02x] %08x\n", __func__,
@@ -242,7 +283,6 @@ static struct omap_mbox_ops omap2_mbox_ops = {
242 */ 283 */
243 284
244/* FIXME: the following structs should be filled automatically by the user id */ 285/* FIXME: the following structs should be filled automatically by the user id */
245
246/* DSP */ 286/* DSP */
247static struct omap_mbox2_priv omap2_mbox_dsp_priv = { 287static struct omap_mbox2_priv omap2_mbox_dsp_priv = {
248 .tx_fifo = { 288 .tx_fifo = {
@@ -257,8 +297,36 @@ static struct omap_mbox2_priv omap2_mbox_dsp_priv = {
257 .irqstatus = MAILBOX_IRQSTATUS(0), 297 .irqstatus = MAILBOX_IRQSTATUS(0),
258 .notfull_bit = MAILBOX_IRQ_NOTFULL(0), 298 .notfull_bit = MAILBOX_IRQ_NOTFULL(0),
259 .newmsg_bit = MAILBOX_IRQ_NEWMSG(1), 299 .newmsg_bit = MAILBOX_IRQ_NEWMSG(1),
300 .irqdisable = MAILBOX_IRQENABLE(0),
301};
302
303
304
305/* OMAP4 specific data structure. Use the cpu_is_omap4xxx()
306to use this*/
307static struct omap_mbox2_priv omap2_mbox_1_priv = {
308 .tx_fifo = {
309 .msg = MAILBOX_MESSAGE(0),
310 .fifo_stat = MAILBOX_FIFOSTATUS(0),
311 },
312 .rx_fifo = {
313 .msg = MAILBOX_MESSAGE(1),
314 .msg_stat = MAILBOX_MSGSTATUS(1),
315 },
316 .irqenable = OMAP4_MAILBOX_IRQENABLE(0),
317 .irqstatus = OMAP4_MAILBOX_IRQSTATUS(0),
318 .notfull_bit = MAILBOX_IRQ_NOTFULL(0),
319 .newmsg_bit = MAILBOX_IRQ_NEWMSG(1),
320 .irqdisable = OMAP4_MAILBOX_IRQENABLE_CLR(0),
260}; 321};
261 322
323struct omap_mbox mbox_1_info = {
324 .name = "mailbox-1",
325 .ops = &omap2_mbox_ops,
326 .priv = &omap2_mbox_1_priv,
327};
328EXPORT_SYMBOL(mbox_1_info);
329
262struct omap_mbox mbox_dsp_info = { 330struct omap_mbox mbox_dsp_info = {
263 .name = "dsp", 331 .name = "dsp",
264 .ops = &omap2_mbox_ops, 332 .ops = &omap2_mbox_ops,
@@ -266,6 +334,30 @@ struct omap_mbox mbox_dsp_info = {
266}; 334};
267EXPORT_SYMBOL(mbox_dsp_info); 335EXPORT_SYMBOL(mbox_dsp_info);
268 336
337static struct omap_mbox2_priv omap2_mbox_2_priv = {
338 .tx_fifo = {
339 .msg = MAILBOX_MESSAGE(3),
340 .fifo_stat = MAILBOX_FIFOSTATUS(3),
341 },
342 .rx_fifo = {
343 .msg = MAILBOX_MESSAGE(2),
344 .msg_stat = MAILBOX_MSGSTATUS(2),
345 },
346 .irqenable = OMAP4_MAILBOX_IRQENABLE(0),
347 .irqstatus = OMAP4_MAILBOX_IRQSTATUS(0),
348 .notfull_bit = MAILBOX_IRQ_NOTFULL(3),
349 .newmsg_bit = MAILBOX_IRQ_NEWMSG(2),
350 .irqdisable = OMAP4_MAILBOX_IRQENABLE_CLR(0),
351};
352
353struct omap_mbox mbox_2_info = {
354 .name = "mailbox-2",
355 .ops = &omap2_mbox_ops,
356 .priv = &omap2_mbox_2_priv,
357};
358EXPORT_SYMBOL(mbox_2_info);
359
360
269#if defined(CONFIG_ARCH_OMAP2420) /* IVA */ 361#if defined(CONFIG_ARCH_OMAP2420) /* IVA */
270static struct omap_mbox2_priv omap2_mbox_iva_priv = { 362static struct omap_mbox2_priv omap2_mbox_iva_priv = {
271 .tx_fifo = { 363 .tx_fifo = {
@@ -280,6 +372,7 @@ static struct omap_mbox2_priv omap2_mbox_iva_priv = {
280 .irqstatus = MAILBOX_IRQSTATUS(3), 372 .irqstatus = MAILBOX_IRQSTATUS(3),
281 .notfull_bit = MAILBOX_IRQ_NOTFULL(2), 373 .notfull_bit = MAILBOX_IRQ_NOTFULL(2),
282 .newmsg_bit = MAILBOX_IRQ_NEWMSG(3), 374 .newmsg_bit = MAILBOX_IRQ_NEWMSG(3),
375 .irqdisable = MAILBOX_IRQENABLE(3),
283}; 376};
284 377
285static struct omap_mbox mbox_iva_info = { 378static struct omap_mbox mbox_iva_info = {
@@ -305,17 +398,31 @@ static int __devinit omap2_mbox_probe(struct platform_device *pdev)
305 return -ENOMEM; 398 return -ENOMEM;
306 399
307 /* DSP or IVA2 IRQ */ 400 /* DSP or IVA2 IRQ */
308 ret = platform_get_irq(pdev, 0); 401 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
309 if (ret < 0) { 402
403 if (unlikely(!res)) {
310 dev_err(&pdev->dev, "invalid irq resource\n"); 404 dev_err(&pdev->dev, "invalid irq resource\n");
405 ret = -ENODEV;
311 goto err_dsp; 406 goto err_dsp;
312 } 407 }
313 mbox_dsp_info.irq = ret; 408 if (cpu_is_omap44xx()) {
314 409 mbox_1_info.irq = res->start;
315 ret = omap_mbox_register(&pdev->dev, &mbox_dsp_info); 410 ret = omap_mbox_register(&pdev->dev, &mbox_1_info);
411 } else {
412 mbox_dsp_info.irq = res->start;
413 ret = omap_mbox_register(&pdev->dev, &mbox_dsp_info);
414 }
316 if (ret) 415 if (ret)
317 goto err_dsp; 416 goto err_dsp;
318 417
418 if (cpu_is_omap44xx()) {
419 mbox_2_info.irq = res->start;
420 ret = omap_mbox_register(&pdev->dev, &mbox_2_info);
421 if (ret) {
422 omap_mbox_unregister(&mbox_1_info);
423 goto err_dsp;
424 }
425 }
319#if defined(CONFIG_ARCH_OMAP2420) /* IVA */ 426#if defined(CONFIG_ARCH_OMAP2420) /* IVA */
320 if (cpu_is_omap2420()) { 427 if (cpu_is_omap2420()) {
321 /* IVA IRQ */ 428 /* IVA IRQ */
@@ -323,18 +430,19 @@ static int __devinit omap2_mbox_probe(struct platform_device *pdev)
323 if (unlikely(!res)) { 430 if (unlikely(!res)) {
324 dev_err(&pdev->dev, "invalid irq resource\n"); 431 dev_err(&pdev->dev, "invalid irq resource\n");
325 ret = -ENODEV; 432 ret = -ENODEV;
326 goto err_iva1; 433 omap_mbox_unregister(&mbox_dsp_info);
434 goto err_dsp;
327 } 435 }
328 mbox_iva_info.irq = res->start; 436 mbox_iva_info.irq = res->start;
329 ret = omap_mbox_register(&pdev->dev, &mbox_iva_info); 437 ret = omap_mbox_register(&pdev->dev, &mbox_iva_info);
330 if (ret) 438 if (ret) {
331 goto err_iva1; 439 omap_mbox_unregister(&mbox_dsp_info);
440 goto err_dsp;
441 }
332 } 442 }
333#endif 443#endif
334 return 0; 444 return 0;
335 445
336err_iva1:
337 omap_mbox_unregister(&mbox_dsp_info);
338err_dsp: 446err_dsp:
339 iounmap(mbox_base); 447 iounmap(mbox_base);
340 return ret; 448 return ret;
@@ -345,7 +453,12 @@ static int __devexit omap2_mbox_remove(struct platform_device *pdev)
345#if defined(CONFIG_ARCH_OMAP2420) 453#if defined(CONFIG_ARCH_OMAP2420)
346 omap_mbox_unregister(&mbox_iva_info); 454 omap_mbox_unregister(&mbox_iva_info);
347#endif 455#endif
348 omap_mbox_unregister(&mbox_dsp_info); 456
457 if (cpu_is_omap44xx()) {
458 omap_mbox_unregister(&mbox_2_info);
459 omap_mbox_unregister(&mbox_1_info);
460 } else
461 omap_mbox_unregister(&mbox_dsp_info);
349 iounmap(mbox_base); 462 iounmap(mbox_base);
350 return 0; 463 return 0;
351} 464}
@@ -354,7 +467,7 @@ static struct platform_driver omap2_mbox_driver = {
354 .probe = omap2_mbox_probe, 467 .probe = omap2_mbox_probe,
355 .remove = __devexit_p(omap2_mbox_remove), 468 .remove = __devexit_p(omap2_mbox_remove),
356 .driver = { 469 .driver = {
357 .name = "omap2-mailbox", 470 .name = DRV_NAME,
358 }, 471 },
359}; 472};
360 473
@@ -372,6 +485,6 @@ module_init(omap2_mbox_init);
372module_exit(omap2_mbox_exit); 485module_exit(omap2_mbox_exit);
373 486
374MODULE_LICENSE("GPL v2"); 487MODULE_LICENSE("GPL v2");
375MODULE_DESCRIPTION("omap mailbox: omap2/3 architecture specific functions"); 488MODULE_DESCRIPTION("omap mailbox: omap2/3/4 architecture specific functions");
376MODULE_AUTHOR("Hiroshi DOYU <Hiroshi.DOYU@nokia.com>, Paul Mundt"); 489MODULE_AUTHOR("Hiroshi DOYU <Hiroshi.DOYU@nokia.com>, Paul Mundt");
377MODULE_ALIAS("platform:omap2-mailbox"); 490MODULE_ALIAS("platform:"DRV_NAME);
diff --git a/arch/arm/mach-omap2/mcbsp.c b/arch/arm/mach-omap2/mcbsp.c
index a846aa1ebb4d..2f3cad6f9402 100644
--- a/arch/arm/mach-omap2/mcbsp.c
+++ b/arch/arm/mach-omap2/mcbsp.c
@@ -16,12 +16,13 @@
16#include <linux/err.h> 16#include <linux/err.h>
17#include <linux/io.h> 17#include <linux/io.h>
18#include <linux/platform_device.h> 18#include <linux/platform_device.h>
19#include <linux/slab.h>
19 20
20#include <mach/irqs.h> 21#include <mach/irqs.h>
21#include <mach/dma.h> 22#include <plat/dma.h>
22#include <mach/mux.h> 23#include <plat/mux.h>
23#include <mach/cpu.h> 24#include <plat/cpu.h>
24#include <mach/mcbsp.h> 25#include <plat/mcbsp.h>
25 26
26static void omap2_mcbsp2_mux_setup(void) 27static void omap2_mcbsp2_mux_setup(void)
27{ 28{
@@ -65,9 +66,11 @@ static struct omap_mcbsp_platform_data omap2420_mcbsp_pdata[] = {
65 }, 66 },
66}; 67};
67#define OMAP2420_MCBSP_PDATA_SZ ARRAY_SIZE(omap2420_mcbsp_pdata) 68#define OMAP2420_MCBSP_PDATA_SZ ARRAY_SIZE(omap2420_mcbsp_pdata)
69#define OMAP2420_MCBSP_REG_NUM (OMAP_MCBSP_REG_RCCR / sizeof(u32) + 1)
68#else 70#else
69#define omap2420_mcbsp_pdata NULL 71#define omap2420_mcbsp_pdata NULL
70#define OMAP2420_MCBSP_PDATA_SZ 0 72#define OMAP2420_MCBSP_PDATA_SZ 0
73#define OMAP2420_MCBSP_REG_NUM 0
71#endif 74#endif
72 75
73#ifdef CONFIG_ARCH_OMAP2430 76#ifdef CONFIG_ARCH_OMAP2430
@@ -114,12 +117,14 @@ static struct omap_mcbsp_platform_data omap2430_mcbsp_pdata[] = {
114 }, 117 },
115}; 118};
116#define OMAP2430_MCBSP_PDATA_SZ ARRAY_SIZE(omap2430_mcbsp_pdata) 119#define OMAP2430_MCBSP_PDATA_SZ ARRAY_SIZE(omap2430_mcbsp_pdata)
120#define OMAP2430_MCBSP_REG_NUM (OMAP_MCBSP_REG_RCCR / sizeof(u32) + 1)
117#else 121#else
118#define omap2430_mcbsp_pdata NULL 122#define omap2430_mcbsp_pdata NULL
119#define OMAP2430_MCBSP_PDATA_SZ 0 123#define OMAP2430_MCBSP_PDATA_SZ 0
124#define OMAP2430_MCBSP_REG_NUM 0
120#endif 125#endif
121 126
122#ifdef CONFIG_ARCH_OMAP34XX 127#ifdef CONFIG_ARCH_OMAP3
123static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = { 128static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
124 { 129 {
125 .phys_base = OMAP34XX_MCBSP1_BASE, 130 .phys_base = OMAP34XX_MCBSP1_BASE,
@@ -132,6 +137,7 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
132 }, 137 },
133 { 138 {
134 .phys_base = OMAP34XX_MCBSP2_BASE, 139 .phys_base = OMAP34XX_MCBSP2_BASE,
140 .phys_base_st = OMAP34XX_MCBSP2_ST_BASE,
135 .dma_rx_sync = OMAP24XX_DMA_MCBSP2_RX, 141 .dma_rx_sync = OMAP24XX_DMA_MCBSP2_RX,
136 .dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX, 142 .dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX,
137 .rx_irq = INT_24XX_MCBSP2_IRQ_RX, 143 .rx_irq = INT_24XX_MCBSP2_IRQ_RX,
@@ -141,6 +147,7 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
141 }, 147 },
142 { 148 {
143 .phys_base = OMAP34XX_MCBSP3_BASE, 149 .phys_base = OMAP34XX_MCBSP3_BASE,
150 .phys_base_st = OMAP34XX_MCBSP3_ST_BASE,
144 .dma_rx_sync = OMAP24XX_DMA_MCBSP3_RX, 151 .dma_rx_sync = OMAP24XX_DMA_MCBSP3_RX,
145 .dma_tx_sync = OMAP24XX_DMA_MCBSP3_TX, 152 .dma_tx_sync = OMAP24XX_DMA_MCBSP3_TX,
146 .rx_irq = INT_24XX_MCBSP3_IRQ_RX, 153 .rx_irq = INT_24XX_MCBSP3_IRQ_RX,
@@ -168,9 +175,11 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
168 }, 175 },
169}; 176};
170#define OMAP34XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap34xx_mcbsp_pdata) 177#define OMAP34XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap34xx_mcbsp_pdata)
178#define OMAP34XX_MCBSP_REG_NUM (OMAP_MCBSP_REG_RCCR / sizeof(u32) + 1)
171#else 179#else
172#define omap34xx_mcbsp_pdata NULL 180#define omap34xx_mcbsp_pdata NULL
173#define OMAP34XX_MCBSP_PDATA_SZ 0 181#define OMAP34XX_MCBSP_PDATA_SZ 0
182#define OMAP34XX_MCBSP_REG_NUM 0
174#endif 183#endif
175 184
176static struct omap_mcbsp_platform_data omap44xx_mcbsp_pdata[] = { 185static struct omap_mcbsp_platform_data omap44xx_mcbsp_pdata[] = {
@@ -208,17 +217,23 @@ static struct omap_mcbsp_platform_data omap44xx_mcbsp_pdata[] = {
208 }, 217 },
209}; 218};
210#define OMAP44XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap44xx_mcbsp_pdata) 219#define OMAP44XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap44xx_mcbsp_pdata)
220#define OMAP44XX_MCBSP_REG_NUM (OMAP_MCBSP_REG_RCCR / sizeof(u32) + 1)
211 221
212static int __init omap2_mcbsp_init(void) 222static int __init omap2_mcbsp_init(void)
213{ 223{
214 if (cpu_is_omap2420()) 224 if (cpu_is_omap2420()) {
215 omap_mcbsp_count = OMAP2420_MCBSP_PDATA_SZ; 225 omap_mcbsp_count = OMAP2420_MCBSP_PDATA_SZ;
216 if (cpu_is_omap2430()) 226 omap_mcbsp_cache_size = OMAP2420_MCBSP_REG_NUM * sizeof(u16);
227 } else if (cpu_is_omap2430()) {
217 omap_mcbsp_count = OMAP2430_MCBSP_PDATA_SZ; 228 omap_mcbsp_count = OMAP2430_MCBSP_PDATA_SZ;
218 if (cpu_is_omap34xx()) 229 omap_mcbsp_cache_size = OMAP2430_MCBSP_REG_NUM * sizeof(u32);
230 } else if (cpu_is_omap34xx()) {
219 omap_mcbsp_count = OMAP34XX_MCBSP_PDATA_SZ; 231 omap_mcbsp_count = OMAP34XX_MCBSP_PDATA_SZ;
220 if (cpu_is_omap44xx()) 232 omap_mcbsp_cache_size = OMAP34XX_MCBSP_REG_NUM * sizeof(u32);
233 } else if (cpu_is_omap44xx()) {
221 omap_mcbsp_count = OMAP44XX_MCBSP_PDATA_SZ; 234 omap_mcbsp_count = OMAP44XX_MCBSP_PDATA_SZ;
235 omap_mcbsp_cache_size = OMAP44XX_MCBSP_REG_NUM * sizeof(u32);
236 }
222 237
223 mcbsp_ptr = kzalloc(omap_mcbsp_count * sizeof(struct omap_mcbsp *), 238 mcbsp_ptr = kzalloc(omap_mcbsp_count * sizeof(struct omap_mcbsp *),
224 GFP_KERNEL); 239 GFP_KERNEL);
diff --git a/arch/arm/mach-omap2/mmc-twl4030.c b/arch/arm/mach-omap2/mmc-twl4030.c
deleted file mode 100644
index c9c59a2db4e2..000000000000
--- a/arch/arm/mach-omap2/mmc-twl4030.c
+++ /dev/null
@@ -1,524 +0,0 @@
1/*
2 * linux/arch/arm/mach-omap2/mmc-twl4030.c
3 *
4 * Copyright (C) 2007-2008 Texas Instruments
5 * Copyright (C) 2008 Nokia Corporation
6 * Author: Texas Instruments
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#include <linux/err.h>
13#include <linux/io.h>
14#include <linux/module.h>
15#include <linux/platform_device.h>
16#include <linux/interrupt.h>
17#include <linux/delay.h>
18#include <linux/gpio.h>
19#include <linux/mmc/host.h>
20#include <linux/regulator/consumer.h>
21
22#include <mach/hardware.h>
23#include <mach/control.h>
24#include <mach/mmc.h>
25#include <mach/board.h>
26
27#include "mmc-twl4030.h"
28
29
30#if defined(CONFIG_REGULATOR) && \
31 (defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE))
32
33static u16 control_pbias_offset;
34static u16 control_devconf1_offset;
35
36#define HSMMC_NAME_LEN 9
37
38static struct twl_mmc_controller {
39 struct omap_mmc_platform_data *mmc;
40 /* Vcc == configured supply
41 * Vcc_alt == optional
42 * - MMC1, supply for DAT4..DAT7
43 * - MMC2/MMC2, external level shifter voltage supply, for
44 * chip (SDIO, eMMC, etc) or transceiver (MMC2 only)
45 */
46 struct regulator *vcc;
47 struct regulator *vcc_aux;
48 char name[HSMMC_NAME_LEN + 1];
49} hsmmc[OMAP34XX_NR_MMC];
50
51static int twl_mmc_card_detect(int irq)
52{
53 unsigned i;
54
55 for (i = 0; i < ARRAY_SIZE(hsmmc); i++) {
56 struct omap_mmc_platform_data *mmc;
57
58 mmc = hsmmc[i].mmc;
59 if (!mmc)
60 continue;
61 if (irq != mmc->slots[0].card_detect_irq)
62 continue;
63
64 /* NOTE: assumes card detect signal is active-low */
65 return !gpio_get_value_cansleep(mmc->slots[0].switch_pin);
66 }
67 return -ENOSYS;
68}
69
70static int twl_mmc_get_ro(struct device *dev, int slot)
71{
72 struct omap_mmc_platform_data *mmc = dev->platform_data;
73
74 /* NOTE: assumes write protect signal is active-high */
75 return gpio_get_value_cansleep(mmc->slots[0].gpio_wp);
76}
77
78static int twl_mmc_get_cover_state(struct device *dev, int slot)
79{
80 struct omap_mmc_platform_data *mmc = dev->platform_data;
81
82 /* NOTE: assumes card detect signal is active-low */
83 return !gpio_get_value_cansleep(mmc->slots[0].switch_pin);
84}
85
86/*
87 * MMC Slot Initialization.
88 */
89static int twl_mmc_late_init(struct device *dev)
90{
91 struct omap_mmc_platform_data *mmc = dev->platform_data;
92 int ret = 0;
93 int i;
94
95 /* MMC/SD/SDIO doesn't require a card detect switch */
96 if (gpio_is_valid(mmc->slots[0].switch_pin)) {
97 ret = gpio_request(mmc->slots[0].switch_pin, "mmc_cd");
98 if (ret)
99 goto done;
100 ret = gpio_direction_input(mmc->slots[0].switch_pin);
101 if (ret)
102 goto err;
103 }
104
105 /* require at least main regulator */
106 for (i = 0; i < ARRAY_SIZE(hsmmc); i++) {
107 if (hsmmc[i].name == mmc->slots[0].name) {
108 struct regulator *reg;
109
110 hsmmc[i].mmc = mmc;
111
112 reg = regulator_get(dev, "vmmc");
113 if (IS_ERR(reg)) {
114 dev_dbg(dev, "vmmc regulator missing\n");
115 /* HACK: until fixed.c regulator is usable,
116 * we don't require a main regulator
117 * for MMC2 or MMC3
118 */
119 if (i != 0)
120 break;
121 ret = PTR_ERR(reg);
122 hsmmc[i].vcc = NULL;
123 goto err;
124 }
125 hsmmc[i].vcc = reg;
126 mmc->slots[0].ocr_mask = mmc_regulator_get_ocrmask(reg);
127
128 /* allow an aux regulator */
129 reg = regulator_get(dev, "vmmc_aux");
130 hsmmc[i].vcc_aux = IS_ERR(reg) ? NULL : reg;
131
132 /* UGLY HACK: workaround regulator framework bugs.
133 * When the bootloader leaves a supply active, it's
134 * initialized with zero usecount ... and we can't
135 * disable it without first enabling it. Until the
136 * framework is fixed, we need a workaround like this
137 * (which is safe for MMC, but not in general).
138 */
139 if (regulator_is_enabled(hsmmc[i].vcc) > 0) {
140 regulator_enable(hsmmc[i].vcc);
141 regulator_disable(hsmmc[i].vcc);
142 }
143 if (hsmmc[i].vcc_aux) {
144 if (regulator_is_enabled(reg) > 0) {
145 regulator_enable(reg);
146 regulator_disable(reg);
147 }
148 }
149
150 break;
151 }
152 }
153
154 return 0;
155
156err:
157 gpio_free(mmc->slots[0].switch_pin);
158done:
159 mmc->slots[0].card_detect_irq = 0;
160 mmc->slots[0].card_detect = NULL;
161
162 dev_err(dev, "err %d configuring card detect\n", ret);
163 return ret;
164}
165
166static void twl_mmc_cleanup(struct device *dev)
167{
168 struct omap_mmc_platform_data *mmc = dev->platform_data;
169 int i;
170
171 gpio_free(mmc->slots[0].switch_pin);
172 for(i = 0; i < ARRAY_SIZE(hsmmc); i++) {
173 regulator_put(hsmmc[i].vcc);
174 regulator_put(hsmmc[i].vcc_aux);
175 }
176}
177
178#ifdef CONFIG_PM
179
180static int twl_mmc_suspend(struct device *dev, int slot)
181{
182 struct omap_mmc_platform_data *mmc = dev->platform_data;
183
184 disable_irq(mmc->slots[0].card_detect_irq);
185 return 0;
186}
187
188static int twl_mmc_resume(struct device *dev, int slot)
189{
190 struct omap_mmc_platform_data *mmc = dev->platform_data;
191
192 enable_irq(mmc->slots[0].card_detect_irq);
193 return 0;
194}
195
196#else
197#define twl_mmc_suspend NULL
198#define twl_mmc_resume NULL
199#endif
200
201#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
202
203static int twl4030_mmc_get_context_loss(struct device *dev)
204{
205 /* FIXME: PM DPS not implemented yet */
206 return 0;
207}
208
209#else
210#define twl4030_mmc_get_context_loss NULL
211#endif
212
213static int twl_mmc1_set_power(struct device *dev, int slot, int power_on,
214 int vdd)
215{
216 u32 reg;
217 int ret = 0;
218 struct twl_mmc_controller *c = &hsmmc[0];
219 struct omap_mmc_platform_data *mmc = dev->platform_data;
220
221 /*
222 * Assume we power both OMAP VMMC1 (for CMD, CLK, DAT0..3) and the
223 * card with Vcc regulator (from twl4030 or whatever). OMAP has both
224 * 1.8V and 3.0V modes, controlled by the PBIAS register.
225 *
226 * In 8-bit modes, OMAP VMMC1A (for DAT4..7) needs a supply, which
227 * is most naturally TWL VSIM; those pins also use PBIAS.
228 *
229 * FIXME handle VMMC1A as needed ...
230 */
231 if (power_on) {
232 if (cpu_is_omap2430()) {
233 reg = omap_ctrl_readl(OMAP243X_CONTROL_DEVCONF1);
234 if ((1 << vdd) >= MMC_VDD_30_31)
235 reg |= OMAP243X_MMC1_ACTIVE_OVERWRITE;
236 else
237 reg &= ~OMAP243X_MMC1_ACTIVE_OVERWRITE;
238 omap_ctrl_writel(reg, OMAP243X_CONTROL_DEVCONF1);
239 }
240
241 if (mmc->slots[0].internal_clock) {
242 reg = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
243 reg |= OMAP2_MMCSDIO1ADPCLKISEL;
244 omap_ctrl_writel(reg, OMAP2_CONTROL_DEVCONF0);
245 }
246
247 reg = omap_ctrl_readl(control_pbias_offset);
248 reg |= OMAP2_PBIASSPEEDCTRL0;
249 reg &= ~OMAP2_PBIASLITEPWRDNZ0;
250 omap_ctrl_writel(reg, control_pbias_offset);
251
252 ret = mmc_regulator_set_ocr(c->vcc, vdd);
253
254 /* 100ms delay required for PBIAS configuration */
255 msleep(100);
256 reg = omap_ctrl_readl(control_pbias_offset);
257 reg |= (OMAP2_PBIASLITEPWRDNZ0 | OMAP2_PBIASSPEEDCTRL0);
258 if ((1 << vdd) <= MMC_VDD_165_195)
259 reg &= ~OMAP2_PBIASLITEVMODE0;
260 else
261 reg |= OMAP2_PBIASLITEVMODE0;
262 omap_ctrl_writel(reg, control_pbias_offset);
263 } else {
264 reg = omap_ctrl_readl(control_pbias_offset);
265 reg &= ~OMAP2_PBIASLITEPWRDNZ0;
266 omap_ctrl_writel(reg, control_pbias_offset);
267
268 ret = mmc_regulator_set_ocr(c->vcc, 0);
269
270 /* 100ms delay required for PBIAS configuration */
271 msleep(100);
272 reg = omap_ctrl_readl(control_pbias_offset);
273 reg |= (OMAP2_PBIASSPEEDCTRL0 | OMAP2_PBIASLITEPWRDNZ0 |
274 OMAP2_PBIASLITEVMODE0);
275 omap_ctrl_writel(reg, control_pbias_offset);
276 }
277
278 return ret;
279}
280
281static int twl_mmc23_set_power(struct device *dev, int slot, int power_on, int vdd)
282{
283 int ret = 0;
284 struct twl_mmc_controller *c = NULL;
285 struct omap_mmc_platform_data *mmc = dev->platform_data;
286 int i;
287
288 for (i = 1; i < ARRAY_SIZE(hsmmc); i++) {
289 if (mmc == hsmmc[i].mmc) {
290 c = &hsmmc[i];
291 break;
292 }
293 }
294
295 if (c == NULL)
296 return -ENODEV;
297
298 /* If we don't see a Vcc regulator, assume it's a fixed
299 * voltage always-on regulator.
300 */
301 if (!c->vcc)
302 return 0;
303
304 /*
305 * Assume Vcc regulator is used only to power the card ... OMAP
306 * VDDS is used to power the pins, optionally with a transceiver to
307 * support cards using voltages other than VDDS (1.8V nominal). When a
308 * transceiver is used, DAT3..7 are muxed as transceiver control pins.
309 *
310 * In some cases this regulator won't support enable/disable;
311 * e.g. it's a fixed rail for a WLAN chip.
312 *
313 * In other cases vcc_aux switches interface power. Example, for
314 * eMMC cards it represents VccQ. Sometimes transceivers or SDIO
315 * chips/cards need an interface voltage rail too.
316 */
317 if (power_on) {
318 /* only MMC2 supports a CLKIN */
319 if (mmc->slots[0].internal_clock) {
320 u32 reg;
321
322 reg = omap_ctrl_readl(control_devconf1_offset);
323 reg |= OMAP2_MMCSDIO2ADPCLKISEL;
324 omap_ctrl_writel(reg, control_devconf1_offset);
325 }
326 ret = mmc_regulator_set_ocr(c->vcc, vdd);
327 /* enable interface voltage rail, if needed */
328 if (ret == 0 && c->vcc_aux) {
329 ret = regulator_enable(c->vcc_aux);
330 if (ret < 0)
331 ret = mmc_regulator_set_ocr(c->vcc, 0);
332 }
333 } else {
334 if (c->vcc_aux && (ret = regulator_is_enabled(c->vcc_aux)) > 0)
335 ret = regulator_disable(c->vcc_aux);
336 if (ret == 0)
337 ret = mmc_regulator_set_ocr(c->vcc, 0);
338 }
339
340 return ret;
341}
342
343static int twl_mmc1_set_sleep(struct device *dev, int slot, int sleep, int vdd,
344 int cardsleep)
345{
346 struct twl_mmc_controller *c = &hsmmc[0];
347 int mode = sleep ? REGULATOR_MODE_STANDBY : REGULATOR_MODE_NORMAL;
348
349 return regulator_set_mode(c->vcc, mode);
350}
351
352static int twl_mmc23_set_sleep(struct device *dev, int slot, int sleep, int vdd,
353 int cardsleep)
354{
355 struct twl_mmc_controller *c = NULL;
356 struct omap_mmc_platform_data *mmc = dev->platform_data;
357 int i, err, mode;
358
359 for (i = 1; i < ARRAY_SIZE(hsmmc); i++) {
360 if (mmc == hsmmc[i].mmc) {
361 c = &hsmmc[i];
362 break;
363 }
364 }
365
366 if (c == NULL)
367 return -ENODEV;
368
369 /*
370 * If we don't see a Vcc regulator, assume it's a fixed
371 * voltage always-on regulator.
372 */
373 if (!c->vcc)
374 return 0;
375
376 mode = sleep ? REGULATOR_MODE_STANDBY : REGULATOR_MODE_NORMAL;
377
378 if (!c->vcc_aux)
379 return regulator_set_mode(c->vcc, mode);
380
381 if (cardsleep) {
382 /* VCC can be turned off if card is asleep */
383 struct regulator *vcc_aux = c->vcc_aux;
384
385 c->vcc_aux = NULL;
386 if (sleep)
387 err = twl_mmc23_set_power(dev, slot, 0, 0);
388 else
389 err = twl_mmc23_set_power(dev, slot, 1, vdd);
390 c->vcc_aux = vcc_aux;
391 } else
392 err = regulator_set_mode(c->vcc, mode);
393 if (err)
394 return err;
395 return regulator_set_mode(c->vcc_aux, mode);
396}
397
398static struct omap_mmc_platform_data *hsmmc_data[OMAP34XX_NR_MMC] __initdata;
399
400void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
401{
402 struct twl4030_hsmmc_info *c;
403 int nr_hsmmc = ARRAY_SIZE(hsmmc_data);
404
405 if (cpu_is_omap2430()) {
406 control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE;
407 control_devconf1_offset = OMAP243X_CONTROL_DEVCONF1;
408 nr_hsmmc = 2;
409 } else {
410 control_pbias_offset = OMAP343X_CONTROL_PBIAS_LITE;
411 control_devconf1_offset = OMAP343X_CONTROL_DEVCONF1;
412 }
413
414 for (c = controllers; c->mmc; c++) {
415 struct twl_mmc_controller *twl = hsmmc + c->mmc - 1;
416 struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
417
418 if (!c->mmc || c->mmc > nr_hsmmc) {
419 pr_debug("MMC%d: no such controller\n", c->mmc);
420 continue;
421 }
422 if (mmc) {
423 pr_debug("MMC%d: already configured\n", c->mmc);
424 continue;
425 }
426
427 mmc = kzalloc(sizeof(struct omap_mmc_platform_data), GFP_KERNEL);
428 if (!mmc) {
429 pr_err("Cannot allocate memory for mmc device!\n");
430 return;
431 }
432
433 if (c->name)
434 strncpy(twl->name, c->name, HSMMC_NAME_LEN);
435 else
436 snprintf(twl->name, ARRAY_SIZE(twl->name),
437 "mmc%islot%i", c->mmc, 1);
438 mmc->slots[0].name = twl->name;
439 mmc->nr_slots = 1;
440 mmc->slots[0].wires = c->wires;
441 mmc->slots[0].internal_clock = !c->ext_clock;
442 mmc->dma_mask = 0xffffffff;
443 mmc->init = twl_mmc_late_init;
444
445 /* note: twl4030 card detect GPIOs can disable VMMCx ... */
446 if (gpio_is_valid(c->gpio_cd)) {
447 mmc->cleanup = twl_mmc_cleanup;
448 mmc->suspend = twl_mmc_suspend;
449 mmc->resume = twl_mmc_resume;
450
451 mmc->slots[0].switch_pin = c->gpio_cd;
452 mmc->slots[0].card_detect_irq = gpio_to_irq(c->gpio_cd);
453 if (c->cover_only)
454 mmc->slots[0].get_cover_state = twl_mmc_get_cover_state;
455 else
456 mmc->slots[0].card_detect = twl_mmc_card_detect;
457 } else
458 mmc->slots[0].switch_pin = -EINVAL;
459
460 mmc->get_context_loss_count =
461 twl4030_mmc_get_context_loss;
462
463 /* write protect normally uses an OMAP gpio */
464 if (gpio_is_valid(c->gpio_wp)) {
465 gpio_request(c->gpio_wp, "mmc_wp");
466 gpio_direction_input(c->gpio_wp);
467
468 mmc->slots[0].gpio_wp = c->gpio_wp;
469 mmc->slots[0].get_ro = twl_mmc_get_ro;
470 } else
471 mmc->slots[0].gpio_wp = -EINVAL;
472
473 if (c->nonremovable)
474 mmc->slots[0].nonremovable = 1;
475
476 if (c->power_saving)
477 mmc->slots[0].power_saving = 1;
478
479 /* NOTE: MMC slots should have a Vcc regulator set up.
480 * This may be from a TWL4030-family chip, another
481 * controllable regulator, or a fixed supply.
482 *
483 * temporary HACK: ocr_mask instead of fixed supply
484 */
485 mmc->slots[0].ocr_mask = c->ocr_mask;
486
487 switch (c->mmc) {
488 case 1:
489 /* on-chip level shifting via PBIAS0/PBIAS1 */
490 mmc->slots[0].set_power = twl_mmc1_set_power;
491 mmc->slots[0].set_sleep = twl_mmc1_set_sleep;
492 break;
493 case 2:
494 if (c->ext_clock)
495 c->transceiver = 1;
496 if (c->transceiver && c->wires > 4)
497 c->wires = 4;
498 /* FALLTHROUGH */
499 case 3:
500 /* off-chip level shifting, or none */
501 mmc->slots[0].set_power = twl_mmc23_set_power;
502 mmc->slots[0].set_sleep = twl_mmc23_set_sleep;
503 break;
504 default:
505 pr_err("MMC%d configuration not supported!\n", c->mmc);
506 kfree(mmc);
507 continue;
508 }
509 hsmmc_data[c->mmc - 1] = mmc;
510 }
511
512 omap2_init_mmc(hsmmc_data, OMAP34XX_NR_MMC);
513
514 /* pass the device nodes back to board setup code */
515 for (c = controllers; c->mmc; c++) {
516 struct omap_mmc_platform_data *mmc = hsmmc_data[c->mmc - 1];
517
518 if (!c->mmc || c->mmc > nr_hsmmc)
519 continue;
520 c->dev = mmc->dev;
521 }
522}
523
524#endif
diff --git a/arch/arm/mach-omap2/mux.c b/arch/arm/mach-omap2/mux.c
index b5fac32aae70..8b3d26935a39 100644
--- a/arch/arm/mach-omap2/mux.c
+++ b/arch/arm/mach-omap2/mux.c
@@ -26,20 +26,62 @@
26#include <linux/module.h> 26#include <linux/module.h>
27#include <linux/init.h> 27#include <linux/init.h>
28#include <linux/io.h> 28#include <linux/io.h>
29#include <linux/slab.h>
29#include <linux/spinlock.h> 30#include <linux/spinlock.h>
31#include <linux/list.h>
32#include <linux/ctype.h>
33#include <linux/debugfs.h>
34#include <linux/seq_file.h>
35#include <linux/uaccess.h>
30 36
31#include <asm/system.h> 37#include <asm/system.h>
32 38
33#include <mach/control.h> 39#include <plat/control.h>
34#include <mach/mux.h> 40#include <plat/mux.h>
35 41
36#ifdef CONFIG_OMAP_MUX 42#include "mux.h"
43
44#define OMAP_MUX_BASE_OFFSET 0x30 /* Offset from CTRL_BASE */
45#define OMAP_MUX_BASE_SZ 0x5ca
46
47struct omap_mux_entry {
48 struct omap_mux mux;
49 struct list_head node;
50};
51
52static unsigned long mux_phys;
53static void __iomem *mux_base;
54
55u16 omap_mux_read(u16 reg)
56{
57 if (cpu_is_omap24xx())
58 return __raw_readb(mux_base + reg);
59 else
60 return __raw_readw(mux_base + reg);
61}
62
63void omap_mux_write(u16 val, u16 reg)
64{
65 if (cpu_is_omap24xx())
66 __raw_writeb(val, mux_base + reg);
67 else
68 __raw_writew(val, mux_base + reg);
69}
70
71void omap_mux_write_array(struct omap_board_mux *board_mux)
72{
73 while (board_mux->reg_offset != OMAP_MUX_TERMINATOR) {
74 omap_mux_write(board_mux->value, board_mux->reg_offset);
75 board_mux++;
76 }
77}
78
79#if defined(CONFIG_ARCH_OMAP2) && defined(CONFIG_OMAP_MUX)
37 80
38static struct omap_mux_cfg arch_mux_cfg; 81static struct omap_mux_cfg arch_mux_cfg;
39 82
40/* NOTE: See mux.h for the enumeration */ 83/* NOTE: See mux.h for the enumeration */
41 84
42#ifdef CONFIG_ARCH_OMAP24XX
43static struct pin_config __initdata_or_module omap24xx_pins[] = { 85static struct pin_config __initdata_or_module omap24xx_pins[] = {
44/* 86/*
45 * description mux mux pull pull debug 87 * description mux mux pull pull debug
@@ -249,327 +291,14 @@ MUX_CFG_24XX("AF19_2430_GPIO_85", 0x0113, 3, 0, 0, 1)
249 291
250#define OMAP24XX_PINS_SZ ARRAY_SIZE(omap24xx_pins) 292#define OMAP24XX_PINS_SZ ARRAY_SIZE(omap24xx_pins)
251 293
252#else
253#define omap24xx_pins NULL
254#define OMAP24XX_PINS_SZ 0
255#endif /* CONFIG_ARCH_OMAP24XX */
256
257#ifdef CONFIG_ARCH_OMAP34XX
258static struct pin_config __initdata_or_module omap34xx_pins[] = {
259/*
260 * Name, reg-offset,
261 * mux-mode | [active-mode | off-mode]
262 */
263
264/* 34xx I2C */
265MUX_CFG_34XX("K21_34XX_I2C1_SCL", 0x1ba,
266 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
267MUX_CFG_34XX("J21_34XX_I2C1_SDA", 0x1bc,
268 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
269MUX_CFG_34XX("AF15_34XX_I2C2_SCL", 0x1be,
270 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
271MUX_CFG_34XX("AE15_34XX_I2C2_SDA", 0x1c0,
272 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
273MUX_CFG_34XX("AF14_34XX_I2C3_SCL", 0x1c2,
274 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
275MUX_CFG_34XX("AG14_34XX_I2C3_SDA", 0x1c4,
276 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
277MUX_CFG_34XX("AD26_34XX_I2C4_SCL", 0xa00,
278 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
279MUX_CFG_34XX("AE26_34XX_I2C4_SDA", 0xa02,
280 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
281
282/* PHY - HSUSB: 12-pin ULPI PHY: Port 1*/
283MUX_CFG_34XX("Y8_3430_USB1HS_PHY_CLK", 0x5da,
284 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_OUTPUT)
285MUX_CFG_34XX("Y9_3430_USB1HS_PHY_STP", 0x5d8,
286 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_OUTPUT)
287MUX_CFG_34XX("AA14_3430_USB1HS_PHY_DIR", 0x5ec,
288 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
289MUX_CFG_34XX("AA11_3430_USB1HS_PHY_NXT", 0x5ee,
290 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
291MUX_CFG_34XX("W13_3430_USB1HS_PHY_D0", 0x5dc,
292 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
293MUX_CFG_34XX("W12_3430_USB1HS_PHY_D1", 0x5de,
294 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
295MUX_CFG_34XX("W11_3430_USB1HS_PHY_D2", 0x5e0,
296 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
297MUX_CFG_34XX("Y11_3430_USB1HS_PHY_D3", 0x5ea,
298 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
299MUX_CFG_34XX("W9_3430_USB1HS_PHY_D4", 0x5e4,
300 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
301MUX_CFG_34XX("Y12_3430_USB1HS_PHY_D5", 0x5e6,
302 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
303MUX_CFG_34XX("W8_3430_USB1HS_PHY_D6", 0x5e8,
304 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
305MUX_CFG_34XX("Y13_3430_USB1HS_PHY_D7", 0x5e2,
306 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
307
308/* PHY - HSUSB: 12-pin ULPI PHY: Port 2*/
309MUX_CFG_34XX("AA8_3430_USB2HS_PHY_CLK", 0x5f0,
310 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_OUTPUT)
311MUX_CFG_34XX("AA10_3430_USB2HS_PHY_STP", 0x5f2,
312 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_OUTPUT)
313MUX_CFG_34XX("AA9_3430_USB2HS_PHY_DIR", 0x5f4,
314 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
315MUX_CFG_34XX("AB11_3430_USB2HS_PHY_NXT", 0x5f6,
316 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
317MUX_CFG_34XX("AB10_3430_USB2HS_PHY_D0", 0x5f8,
318 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
319MUX_CFG_34XX("AB9_3430_USB2HS_PHY_D1", 0x5fa,
320 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
321MUX_CFG_34XX("W3_3430_USB2HS_PHY_D2", 0x1d4,
322 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
323MUX_CFG_34XX("T4_3430_USB2HS_PHY_D3", 0x1de,
324 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
325MUX_CFG_34XX("T3_3430_USB2HS_PHY_D4", 0x1d8,
326 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
327MUX_CFG_34XX("R3_3430_USB2HS_PHY_D5", 0x1da,
328 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
329MUX_CFG_34XX("R4_3430_USB2HS_PHY_D6", 0x1dc,
330 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
331MUX_CFG_34XX("T2_3430_USB2HS_PHY_D7", 0x1d6,
332 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLDOWN)
333
334/* TLL - HSUSB: 12-pin TLL Port 1*/
335MUX_CFG_34XX("Y8_3430_USB1HS_TLL_CLK", 0x5da,
336 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
337MUX_CFG_34XX("Y9_3430_USB1HS_TLL_STP", 0x5d8,
338 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLUP)
339MUX_CFG_34XX("AA14_3430_USB1HS_TLL_DIR", 0x5ec,
340 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
341MUX_CFG_34XX("AA11_3430_USB1HS_TLL_NXT", 0x5ee,
342 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
343MUX_CFG_34XX("W13_3430_USB1HS_TLL_D0", 0x5dc,
344 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
345MUX_CFG_34XX("W12_3430_USB1HS_TLL_D1", 0x5de,
346 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
347MUX_CFG_34XX("W11_3430_USB1HS_TLL_D2", 0x5e0,
348 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
349MUX_CFG_34XX("Y11_3430_USB1HS_TLL_D3", 0x5ea,
350 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
351MUX_CFG_34XX("W9_3430_USB1HS_TLL_D4", 0x5e4,
352 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
353MUX_CFG_34XX("Y12_3430_USB1HS_TLL_D5", 0x5e6,
354 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
355MUX_CFG_34XX("W8_3430_USB1HS_TLL_D6", 0x5e8,
356 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
357MUX_CFG_34XX("Y13_3430_USB1HS_TLL_D7", 0x5e2,
358 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
359
360/* TLL - HSUSB: 12-pin TLL Port 2*/
361MUX_CFG_34XX("AA8_3430_USB2HS_TLL_CLK", 0x5f0,
362 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
363MUX_CFG_34XX("AA10_3430_USB2HS_TLL_STP", 0x5f2,
364 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLUP)
365MUX_CFG_34XX("AA9_3430_USB2HS_TLL_DIR", 0x5f4,
366 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
367MUX_CFG_34XX("AB11_3430_USB2HS_TLL_NXT", 0x5f6,
368 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
369MUX_CFG_34XX("AB10_3430_USB2HS_TLL_D0", 0x5f8,
370 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
371MUX_CFG_34XX("AB9_3430_USB2HS_TLL_D1", 0x5fa,
372 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
373MUX_CFG_34XX("W3_3430_USB2HS_TLL_D2", 0x1d4,
374 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
375MUX_CFG_34XX("T4_3430_USB2HS_TLL_D3", 0x1de,
376 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
377MUX_CFG_34XX("T3_3430_USB2HS_TLL_D4", 0x1d8,
378 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
379MUX_CFG_34XX("R3_3430_USB2HS_TLL_D5", 0x1da,
380 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
381MUX_CFG_34XX("R4_3430_USB2HS_TLL_D6", 0x1dc,
382 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
383MUX_CFG_34XX("T2_3430_USB2HS_TLL_D7", 0x1d6,
384 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLDOWN)
385
386/* TLL - HSUSB: 12-pin TLL Port 3*/
387MUX_CFG_34XX("AA6_3430_USB3HS_TLL_CLK", 0x180,
388 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
389MUX_CFG_34XX("AB3_3430_USB3HS_TLL_STP", 0x166,
390 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLUP)
391MUX_CFG_34XX("AA3_3430_USB3HS_TLL_DIR", 0x168,
392 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
393MUX_CFG_34XX("Y3_3430_USB3HS_TLL_NXT", 0x16a,
394 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
395MUX_CFG_34XX("AA5_3430_USB3HS_TLL_D0", 0x186,
396 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
397MUX_CFG_34XX("Y4_3430_USB3HS_TLL_D1", 0x184,
398 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
399MUX_CFG_34XX("Y5_3430_USB3HS_TLL_D2", 0x188,
400 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
401MUX_CFG_34XX("W5_3430_USB3HS_TLL_D3", 0x18a,
402 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
403MUX_CFG_34XX("AB12_3430_USB3HS_TLL_D4", 0x16c,
404 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
405MUX_CFG_34XX("AB13_3430_USB3HS_TLL_D5", 0x16e,
406 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
407MUX_CFG_34XX("AA13_3430_USB3HS_TLL_D6", 0x170,
408 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
409MUX_CFG_34XX("AA12_3430_USB3HS_TLL_D7", 0x172,
410 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
411
412/* PHY FSUSB: FS Serial for Port 1 (multiple PHY modes supported) */
413MUX_CFG_34XX("AF10_3430_USB1FS_PHY_MM1_RXDP", 0x5d8,
414 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
415MUX_CFG_34XX("AG9_3430_USB1FS_PHY_MM1_RXDM", 0x5ee,
416 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
417MUX_CFG_34XX("W13_3430_USB1FS_PHY_MM1_RXRCV", 0x5dc,
418 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
419MUX_CFG_34XX("W12_3430_USB1FS_PHY_MM1_TXSE0", 0x5de,
420 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
421MUX_CFG_34XX("W11_3430_USB1FS_PHY_MM1_TXDAT", 0x5e0,
422 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
423MUX_CFG_34XX("Y11_3430_USB1FS_PHY_MM1_TXEN_N", 0x5ea,
424 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_OUTPUT)
425
426/* PHY FSUSB: FS Serial for Port 2 (multiple PHY modes supported) */
427MUX_CFG_34XX("AF7_3430_USB2FS_PHY_MM2_RXDP", 0x5f2,
428 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
429MUX_CFG_34XX("AH7_3430_USB2FS_PHY_MM2_RXDM", 0x5f6,
430 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
431MUX_CFG_34XX("AB10_3430_USB2FS_PHY_MM2_RXRCV", 0x5f8,
432 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
433MUX_CFG_34XX("AB9_3430_USB2FS_PHY_MM2_TXSE0", 0x5fa,
434 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
435MUX_CFG_34XX("W3_3430_USB2FS_PHY_MM2_TXDAT", 0x1d4,
436 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_INPUT_PULLDOWN)
437MUX_CFG_34XX("T4_3430_USB2FS_PHY_MM2_TXEN_N", 0x1de,
438 OMAP34XX_MUX_MODE5 | OMAP34XX_PIN_OUTPUT)
439
440/* PHY FSUSB: FS Serial for Port 3 (multiple PHY modes supported) */
441MUX_CFG_34XX("AH3_3430_USB3FS_PHY_MM3_RXDP", 0x166,
442 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
443MUX_CFG_34XX("AE3_3430_USB3FS_PHY_MM3_RXDM", 0x16a,
444 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
445MUX_CFG_34XX("AD1_3430_USB3FS_PHY_MM3_RXRCV", 0x186,
446 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
447MUX_CFG_34XX("AE1_3430_USB3FS_PHY_MM3_TXSE0", 0x184,
448 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
449MUX_CFG_34XX("AD2_3430_USB3FS_PHY_MM3_TXDAT", 0x188,
450 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_INPUT_PULLDOWN)
451MUX_CFG_34XX("AC1_3430_USB3FS_PHY_MM3_TXEN_N", 0x18a,
452 OMAP34XX_MUX_MODE6 | OMAP34XX_PIN_OUTPUT)
453
454
455/* 34XX GPIO - bidirectional, unless the name has an "_OUT" suffix.
456 * (Always specify PIN_INPUT, except for names suffixed by "_OUT".)
457 * No internal pullup/pulldown without "_UP" or "_DOWN" suffix.
458 */
459MUX_CFG_34XX("AF26_34XX_GPIO0", 0x1e0,
460 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
461MUX_CFG_34XX("AF22_34XX_GPIO9", 0xa18,
462 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
463MUX_CFG_34XX("AG9_34XX_GPIO23", 0x5ee,
464 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
465MUX_CFG_34XX("AH8_34XX_GPIO29", 0x5fa,
466 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
467MUX_CFG_34XX("U8_34XX_GPIO54_OUT", 0x0b4,
468 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
469MUX_CFG_34XX("U8_34XX_GPIO54_DOWN", 0x0b4,
470 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT_PULLDOWN)
471MUX_CFG_34XX("L8_34XX_GPIO63", 0x0ce,
472 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
473MUX_CFG_34XX("G25_34XX_GPIO86_OUT", 0x0fc,
474 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
475MUX_CFG_34XX("AG4_34XX_GPIO134_OUT", 0x160,
476 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
477MUX_CFG_34XX("AF4_34XX_GPIO135_OUT", 0x162,
478 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
479MUX_CFG_34XX("AE4_34XX_GPIO136_OUT", 0x164,
480 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
481MUX_CFG_34XX("AF6_34XX_GPIO140_UP", 0x16c,
482 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT_PULLUP)
483MUX_CFG_34XX("AE6_34XX_GPIO141", 0x16e,
484 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
485MUX_CFG_34XX("AF5_34XX_GPIO142", 0x170,
486 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
487MUX_CFG_34XX("AE5_34XX_GPIO143", 0x172,
488 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
489MUX_CFG_34XX("H19_34XX_GPIO164_OUT", 0x19c,
490 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_OUTPUT)
491MUX_CFG_34XX("J25_34XX_GPIO170", 0x1c6,
492 OMAP34XX_MUX_MODE4 | OMAP34XX_PIN_INPUT)
493
494/* OMAP3 SDRC CKE signals to SDR/DDR ram chips */
495MUX_CFG_34XX("H16_34XX_SDRC_CKE0", 0x262,
496 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_OUTPUT)
497MUX_CFG_34XX("H17_34XX_SDRC_CKE1", 0x264,
498 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_OUTPUT)
499
500/* MMC1 */
501MUX_CFG_34XX("N28_3430_MMC1_CLK", 0x144,
502 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
503MUX_CFG_34XX("M27_3430_MMC1_CMD", 0x146,
504 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
505MUX_CFG_34XX("N27_3430_MMC1_DAT0", 0x148,
506 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
507MUX_CFG_34XX("N26_3430_MMC1_DAT1", 0x14a,
508 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
509MUX_CFG_34XX("N25_3430_MMC1_DAT2", 0x14c,
510 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
511MUX_CFG_34XX("P28_3430_MMC1_DAT3", 0x14e,
512 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
513MUX_CFG_34XX("P27_3430_MMC1_DAT4", 0x150,
514 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
515MUX_CFG_34XX("P26_3430_MMC1_DAT5", 0x152,
516 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
517MUX_CFG_34XX("R27_3430_MMC1_DAT6", 0x154,
518 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
519MUX_CFG_34XX("R25_3430_MMC1_DAT7", 0x156,
520 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
521
522/* MMC2 */
523MUX_CFG_34XX("AE2_3430_MMC2_CLK", 0x158,
524 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
525MUX_CFG_34XX("AG5_3430_MMC2_CMD", 0x15A,
526 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
527MUX_CFG_34XX("AH5_3430_MMC2_DAT0", 0x15c,
528 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
529MUX_CFG_34XX("AH4_3430_MMC2_DAT1", 0x15e,
530 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
531MUX_CFG_34XX("AG4_3430_MMC2_DAT2", 0x160,
532 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
533MUX_CFG_34XX("AF4_3430_MMC2_DAT3", 0x162,
534 OMAP34XX_MUX_MODE0 | OMAP34XX_PIN_INPUT_PULLUP)
535
536/* MMC3 */
537MUX_CFG_34XX("AF10_3430_MMC3_CLK", 0x5d8,
538 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLUP)
539MUX_CFG_34XX("AC3_3430_MMC3_CMD", 0x1d0,
540 OMAP34XX_MUX_MODE3 | OMAP34XX_PIN_INPUT_PULLUP)
541MUX_CFG_34XX("AE11_3430_MMC3_DAT0", 0x5e4,
542 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLUP)
543MUX_CFG_34XX("AH9_3430_MMC3_DAT1", 0x5e6,
544 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLUP)
545MUX_CFG_34XX("AF13_3430_MMC3_DAT2", 0x5e8,
546 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLUP)
547MUX_CFG_34XX("AF13_3430_MMC3_DAT3", 0x5e2,
548 OMAP34XX_MUX_MODE2 | OMAP34XX_PIN_INPUT_PULLUP)
549
550/* SYS_NIRQ T2 INT1 */
551MUX_CFG_34XX("AF26_34XX_SYS_NIRQ", 0x1E0,
552 OMAP3_WAKEUP_EN | OMAP34XX_PIN_INPUT_PULLUP |
553 OMAP34XX_MUX_MODE0)
554};
555
556#define OMAP34XX_PINS_SZ ARRAY_SIZE(omap34xx_pins)
557
558#else
559#define omap34xx_pins NULL
560#define OMAP34XX_PINS_SZ 0
561#endif /* CONFIG_ARCH_OMAP34XX */
562
563#if defined(CONFIG_OMAP_MUX_DEBUG) || defined(CONFIG_OMAP_MUX_WARNINGS) 294#if defined(CONFIG_OMAP_MUX_DEBUG) || defined(CONFIG_OMAP_MUX_WARNINGS)
295
564static void __init_or_module omap2_cfg_debug(const struct pin_config *cfg, u16 reg) 296static void __init_or_module omap2_cfg_debug(const struct pin_config *cfg, u16 reg)
565{ 297{
566 u16 orig; 298 u16 orig;
567 u8 warn = 0, debug = 0; 299 u8 warn = 0, debug = 0;
568 300
569 if (cpu_is_omap24xx()) 301 orig = omap_mux_read(cfg->mux_reg - OMAP_MUX_BASE_OFFSET);
570 orig = omap_ctrl_readb(cfg->mux_reg);
571 else
572 orig = omap_ctrl_readw(cfg->mux_reg);
573 302
574#ifdef CONFIG_OMAP_MUX_DEBUG 303#ifdef CONFIG_OMAP_MUX_DEBUG
575 debug = cfg->debug; 304 debug = cfg->debug;
@@ -585,7 +314,6 @@ static void __init_or_module omap2_cfg_debug(const struct pin_config *cfg, u16 r
585#define omap2_cfg_debug(x, y) do {} while (0) 314#define omap2_cfg_debug(x, y) do {} while (0)
586#endif 315#endif
587 316
588#ifdef CONFIG_ARCH_OMAP24XX
589static int __init_or_module omap24xx_cfg_reg(const struct pin_config *cfg) 317static int __init_or_module omap24xx_cfg_reg(const struct pin_config *cfg)
590{ 318{
591 static DEFINE_SPINLOCK(mux_spin_lock); 319 static DEFINE_SPINLOCK(mux_spin_lock);
@@ -599,47 +327,717 @@ static int __init_or_module omap24xx_cfg_reg(const struct pin_config *cfg)
599 if (cfg->pu_pd_val) 327 if (cfg->pu_pd_val)
600 reg |= OMAP2_PULL_UP; 328 reg |= OMAP2_PULL_UP;
601 omap2_cfg_debug(cfg, reg); 329 omap2_cfg_debug(cfg, reg);
602 omap_ctrl_writeb(reg, cfg->mux_reg); 330 omap_mux_write(reg, cfg->mux_reg - OMAP_MUX_BASE_OFFSET);
603 spin_unlock_irqrestore(&mux_spin_lock, flags); 331 spin_unlock_irqrestore(&mux_spin_lock, flags);
604 332
605 return 0; 333 return 0;
606} 334}
335
336int __init omap2_mux_init(void)
337{
338 u32 mux_pbase;
339
340 if (cpu_is_omap2420())
341 mux_pbase = OMAP2420_CTRL_BASE + OMAP_MUX_BASE_OFFSET;
342 else if (cpu_is_omap2430())
343 mux_pbase = OMAP243X_CTRL_BASE + OMAP_MUX_BASE_OFFSET;
344 else
345 return -ENODEV;
346
347 mux_base = ioremap(mux_pbase, OMAP_MUX_BASE_SZ);
348 if (!mux_base) {
349 printk(KERN_ERR "mux: Could not ioremap\n");
350 return -ENODEV;
351 }
352
353 if (cpu_is_omap24xx()) {
354 arch_mux_cfg.pins = omap24xx_pins;
355 arch_mux_cfg.size = OMAP24XX_PINS_SZ;
356 arch_mux_cfg.cfg_reg = omap24xx_cfg_reg;
357
358 return omap_mux_register(&arch_mux_cfg);
359 }
360
361 return 0;
362}
363
607#else 364#else
608#define omap24xx_cfg_reg NULL 365int __init omap2_mux_init(void)
609#endif 366{
367 return 0;
368}
369#endif /* CONFIG_OMAP_MUX */
370
371/*----------------------------------------------------------------------------*/
610 372
611#ifdef CONFIG_ARCH_OMAP34XX 373#ifdef CONFIG_ARCH_OMAP3
612static int __init_or_module omap34xx_cfg_reg(const struct pin_config *cfg) 374static LIST_HEAD(muxmodes);
375static DEFINE_MUTEX(muxmode_mutex);
376
377#ifdef CONFIG_OMAP_MUX
378
379static char *omap_mux_options;
380
381int __init omap_mux_init_gpio(int gpio, int val)
613{ 382{
614 static DEFINE_SPINLOCK(mux_spin_lock); 383 struct omap_mux_entry *e;
615 unsigned long flags; 384 int found = 0;
616 u16 reg = 0; 385
386 if (!gpio)
387 return -EINVAL;
388
389 list_for_each_entry(e, &muxmodes, node) {
390 struct omap_mux *m = &e->mux;
391 if (gpio == m->gpio) {
392 u16 old_mode;
393 u16 mux_mode;
394
395 old_mode = omap_mux_read(m->reg_offset);
396 mux_mode = val & ~(OMAP_MUX_NR_MODES - 1);
397 mux_mode |= OMAP_MUX_MODE4;
398 printk(KERN_DEBUG "mux: Setting signal "
399 "%s.gpio%i 0x%04x -> 0x%04x\n",
400 m->muxnames[0], gpio, old_mode, mux_mode);
401 omap_mux_write(mux_mode, m->reg_offset);
402 found++;
403 }
404 }
617 405
618 spin_lock_irqsave(&mux_spin_lock, flags); 406 if (found == 1)
619 reg |= cfg->mux_val; 407 return 0;
620 omap2_cfg_debug(cfg, reg); 408
621 omap_ctrl_writew(reg, cfg->mux_reg); 409 if (found > 1) {
622 spin_unlock_irqrestore(&mux_spin_lock, flags); 410 printk(KERN_ERR "mux: Multiple gpio paths for gpio%i\n", gpio);
411 return -EINVAL;
412 }
413
414 printk(KERN_ERR "mux: Could not set gpio%i\n", gpio);
415
416 return -ENODEV;
417}
418
419int __init omap_mux_init_signal(char *muxname, int val)
420{
421 struct omap_mux_entry *e;
422 char *m0_name = NULL, *mode_name = NULL;
423 int found = 0;
424
425 mode_name = strchr(muxname, '.');
426 if (mode_name) {
427 *mode_name = '\0';
428 mode_name++;
429 m0_name = muxname;
430 } else {
431 mode_name = muxname;
432 }
433
434 list_for_each_entry(e, &muxmodes, node) {
435 struct omap_mux *m = &e->mux;
436 char *m0_entry = m->muxnames[0];
437 int i;
438
439 if (m0_name && strcmp(m0_name, m0_entry))
440 continue;
441
442 for (i = 0; i < OMAP_MUX_NR_MODES; i++) {
443 char *mode_cur = m->muxnames[i];
444
445 if (!mode_cur)
446 continue;
447
448 if (!strcmp(mode_name, mode_cur)) {
449 u16 old_mode;
450 u16 mux_mode;
451
452 old_mode = omap_mux_read(m->reg_offset);
453 mux_mode = val | i;
454 printk(KERN_DEBUG "mux: Setting signal "
455 "%s.%s 0x%04x -> 0x%04x\n",
456 m0_entry, muxname, old_mode, mux_mode);
457 omap_mux_write(mux_mode, m->reg_offset);
458 found++;
459 }
460 }
461 }
462
463 if (found == 1)
464 return 0;
465
466 if (found > 1) {
467 printk(KERN_ERR "mux: Multiple signal paths (%i) for %s\n",
468 found, muxname);
469 return -EINVAL;
470 }
471
472 printk(KERN_ERR "mux: Could not set signal %s\n", muxname);
473
474 return -ENODEV;
475}
476
477#ifdef CONFIG_DEBUG_FS
478
479#define OMAP_MUX_MAX_NR_FLAGS 10
480#define OMAP_MUX_TEST_FLAG(val, mask) \
481 if (((val) & (mask)) == (mask)) { \
482 i++; \
483 flags[i] = #mask; \
484 }
485
486/* REVISIT: Add checking for non-optimal mux settings */
487static inline void omap_mux_decode(struct seq_file *s, u16 val)
488{
489 char *flags[OMAP_MUX_MAX_NR_FLAGS];
490 char mode[sizeof("OMAP_MUX_MODE") + 1];
491 int i = -1;
492
493 sprintf(mode, "OMAP_MUX_MODE%d", val & 0x7);
494 i++;
495 flags[i] = mode;
496
497 OMAP_MUX_TEST_FLAG(val, OMAP_PIN_OFF_WAKEUPENABLE);
498 if (val & OMAP_OFF_EN) {
499 if (!(val & OMAP_OFFOUT_EN)) {
500 if (!(val & OMAP_OFF_PULL_UP)) {
501 OMAP_MUX_TEST_FLAG(val,
502 OMAP_PIN_OFF_INPUT_PULLDOWN);
503 } else {
504 OMAP_MUX_TEST_FLAG(val,
505 OMAP_PIN_OFF_INPUT_PULLUP);
506 }
507 } else {
508 if (!(val & OMAP_OFFOUT_VAL)) {
509 OMAP_MUX_TEST_FLAG(val,
510 OMAP_PIN_OFF_OUTPUT_LOW);
511 } else {
512 OMAP_MUX_TEST_FLAG(val,
513 OMAP_PIN_OFF_OUTPUT_HIGH);
514 }
515 }
516 }
517
518 if (val & OMAP_INPUT_EN) {
519 if (val & OMAP_PULL_ENA) {
520 if (!(val & OMAP_PULL_UP)) {
521 OMAP_MUX_TEST_FLAG(val,
522 OMAP_PIN_INPUT_PULLDOWN);
523 } else {
524 OMAP_MUX_TEST_FLAG(val, OMAP_PIN_INPUT_PULLUP);
525 }
526 } else {
527 OMAP_MUX_TEST_FLAG(val, OMAP_PIN_INPUT);
528 }
529 } else {
530 i++;
531 flags[i] = "OMAP_PIN_OUTPUT";
532 }
533
534 do {
535 seq_printf(s, "%s", flags[i]);
536 if (i > 0)
537 seq_printf(s, " | ");
538 } while (i-- > 0);
539}
540
541#define OMAP_MUX_DEFNAME_LEN 16
542
543static int omap_mux_dbg_board_show(struct seq_file *s, void *unused)
544{
545 struct omap_mux_entry *e;
546
547 list_for_each_entry(e, &muxmodes, node) {
548 struct omap_mux *m = &e->mux;
549 char m0_def[OMAP_MUX_DEFNAME_LEN];
550 char *m0_name = m->muxnames[0];
551 u16 val;
552 int i, mode;
553
554 if (!m0_name)
555 continue;
556
557 /* REVISIT: Needs to be updated if mode0 names get longer */
558 for (i = 0; i < OMAP_MUX_DEFNAME_LEN; i++) {
559 if (m0_name[i] == '\0') {
560 m0_def[i] = m0_name[i];
561 break;
562 }
563 m0_def[i] = toupper(m0_name[i]);
564 }
565 val = omap_mux_read(m->reg_offset);
566 mode = val & OMAP_MUX_MODE7;
567
568 seq_printf(s, "OMAP%i_MUX(%s, ",
569 cpu_is_omap34xx() ? 3 : 0, m0_def);
570 omap_mux_decode(s, val);
571 seq_printf(s, "),\n");
572 }
573
574 return 0;
575}
576
577static int omap_mux_dbg_board_open(struct inode *inode, struct file *file)
578{
579 return single_open(file, omap_mux_dbg_board_show, &inode->i_private);
580}
581
582static const struct file_operations omap_mux_dbg_board_fops = {
583 .open = omap_mux_dbg_board_open,
584 .read = seq_read,
585 .llseek = seq_lseek,
586 .release = single_release,
587};
588
589static int omap_mux_dbg_signal_show(struct seq_file *s, void *unused)
590{
591 struct omap_mux *m = s->private;
592 const char *none = "NA";
593 u16 val;
594 int mode;
595
596 val = omap_mux_read(m->reg_offset);
597 mode = val & OMAP_MUX_MODE7;
598
599 seq_printf(s, "name: %s.%s (0x%08lx/0x%03x = 0x%04x), b %s, t %s\n",
600 m->muxnames[0], m->muxnames[mode],
601 mux_phys + m->reg_offset, m->reg_offset, val,
602 m->balls[0] ? m->balls[0] : none,
603 m->balls[1] ? m->balls[1] : none);
604 seq_printf(s, "mode: ");
605 omap_mux_decode(s, val);
606 seq_printf(s, "\n");
607 seq_printf(s, "signals: %s | %s | %s | %s | %s | %s | %s | %s\n",
608 m->muxnames[0] ? m->muxnames[0] : none,
609 m->muxnames[1] ? m->muxnames[1] : none,
610 m->muxnames[2] ? m->muxnames[2] : none,
611 m->muxnames[3] ? m->muxnames[3] : none,
612 m->muxnames[4] ? m->muxnames[4] : none,
613 m->muxnames[5] ? m->muxnames[5] : none,
614 m->muxnames[6] ? m->muxnames[6] : none,
615 m->muxnames[7] ? m->muxnames[7] : none);
623 616
624 return 0; 617 return 0;
625} 618}
619
620#define OMAP_MUX_MAX_ARG_CHAR 7
621
622static ssize_t omap_mux_dbg_signal_write(struct file *file,
623 const char __user *user_buf,
624 size_t count, loff_t *ppos)
625{
626 char buf[OMAP_MUX_MAX_ARG_CHAR];
627 struct seq_file *seqf;
628 struct omap_mux *m;
629 unsigned long val;
630 int buf_size, ret;
631
632 if (count > OMAP_MUX_MAX_ARG_CHAR)
633 return -EINVAL;
634
635 memset(buf, 0, sizeof(buf));
636 buf_size = min(count, sizeof(buf) - 1);
637
638 if (copy_from_user(buf, user_buf, buf_size))
639 return -EFAULT;
640
641 ret = strict_strtoul(buf, 0x10, &val);
642 if (ret < 0)
643 return ret;
644
645 if (val > 0xffff)
646 return -EINVAL;
647
648 seqf = file->private_data;
649 m = seqf->private;
650
651 omap_mux_write((u16)val, m->reg_offset);
652 *ppos += count;
653
654 return count;
655}
656
657static int omap_mux_dbg_signal_open(struct inode *inode, struct file *file)
658{
659 return single_open(file, omap_mux_dbg_signal_show, inode->i_private);
660}
661
662static const struct file_operations omap_mux_dbg_signal_fops = {
663 .open = omap_mux_dbg_signal_open,
664 .read = seq_read,
665 .write = omap_mux_dbg_signal_write,
666 .llseek = seq_lseek,
667 .release = single_release,
668};
669
670static struct dentry *mux_dbg_dir;
671
672static void __init omap_mux_dbg_init(void)
673{
674 struct omap_mux_entry *e;
675
676 mux_dbg_dir = debugfs_create_dir("omap_mux", NULL);
677 if (!mux_dbg_dir)
678 return;
679
680 (void)debugfs_create_file("board", S_IRUGO, mux_dbg_dir,
681 NULL, &omap_mux_dbg_board_fops);
682
683 list_for_each_entry(e, &muxmodes, node) {
684 struct omap_mux *m = &e->mux;
685
686 (void)debugfs_create_file(m->muxnames[0], S_IWUGO, mux_dbg_dir,
687 m, &omap_mux_dbg_signal_fops);
688 }
689}
690
626#else 691#else
627#define omap34xx_cfg_reg NULL 692static inline void omap_mux_dbg_init(void)
693{
694}
695#endif /* CONFIG_DEBUG_FS */
696
697static void __init omap_mux_free_names(struct omap_mux *m)
698{
699 int i;
700
701 for (i = 0; i < OMAP_MUX_NR_MODES; i++)
702 kfree(m->muxnames[i]);
703
704#ifdef CONFIG_DEBUG_FS
705 for (i = 0; i < OMAP_MUX_NR_SIDES; i++)
706 kfree(m->balls[i]);
628#endif 707#endif
629 708
630int __init omap2_mux_init(void) 709}
710
711/* Free all data except for GPIO pins unless CONFIG_DEBUG_FS is set */
712static int __init omap_mux_late_init(void)
631{ 713{
632 if (cpu_is_omap24xx()) { 714 struct omap_mux_entry *e, *tmp;
633 arch_mux_cfg.pins = omap24xx_pins; 715
634 arch_mux_cfg.size = OMAP24XX_PINS_SZ; 716 list_for_each_entry_safe(e, tmp, &muxmodes, node) {
635 arch_mux_cfg.cfg_reg = omap24xx_cfg_reg; 717 struct omap_mux *m = &e->mux;
636 } else if (cpu_is_omap34xx()) { 718 u16 mode = omap_mux_read(m->reg_offset);
637 arch_mux_cfg.pins = omap34xx_pins; 719
638 arch_mux_cfg.size = OMAP34XX_PINS_SZ; 720 if (OMAP_MODE_GPIO(mode))
639 arch_mux_cfg.cfg_reg = omap34xx_cfg_reg; 721 continue;
722
723#ifndef CONFIG_DEBUG_FS
724 mutex_lock(&muxmode_mutex);
725 list_del(&e->node);
726 mutex_unlock(&muxmode_mutex);
727 omap_mux_free_names(m);
728 kfree(m);
729#endif
730
731 }
732
733 omap_mux_dbg_init();
734
735 return 0;
736}
737late_initcall(omap_mux_late_init);
738
739static void __init omap_mux_package_fixup(struct omap_mux *p,
740 struct omap_mux *superset)
741{
742 while (p->reg_offset != OMAP_MUX_TERMINATOR) {
743 struct omap_mux *s = superset;
744 int found = 0;
745
746 while (s->reg_offset != OMAP_MUX_TERMINATOR) {
747 if (s->reg_offset == p->reg_offset) {
748 *s = *p;
749 found++;
750 break;
751 }
752 s++;
753 }
754 if (!found)
755 printk(KERN_ERR "mux: Unknown entry offset 0x%x\n",
756 p->reg_offset);
757 p++;
758 }
759}
760
761#ifdef CONFIG_DEBUG_FS
762
763static void __init omap_mux_package_init_balls(struct omap_ball *b,
764 struct omap_mux *superset)
765{
766 while (b->reg_offset != OMAP_MUX_TERMINATOR) {
767 struct omap_mux *s = superset;
768 int found = 0;
769
770 while (s->reg_offset != OMAP_MUX_TERMINATOR) {
771 if (s->reg_offset == b->reg_offset) {
772 s->balls[0] = b->balls[0];
773 s->balls[1] = b->balls[1];
774 found++;
775 break;
776 }
777 s++;
778 }
779 if (!found)
780 printk(KERN_ERR "mux: Unknown ball offset 0x%x\n",
781 b->reg_offset);
782 b++;
783 }
784}
785
786#else /* CONFIG_DEBUG_FS */
787
788static inline void omap_mux_package_init_balls(struct omap_ball *b,
789 struct omap_mux *superset)
790{
791}
792
793#endif /* CONFIG_DEBUG_FS */
794
795static int __init omap_mux_setup(char *options)
796{
797 if (!options)
798 return 0;
799
800 omap_mux_options = options;
801
802 return 1;
803}
804__setup("omap_mux=", omap_mux_setup);
805
806/*
807 * Note that the omap_mux=some.signal1=0x1234,some.signal2=0x1234
808 * cmdline options only override the bootloader values.
809 * During development, please enable CONFIG_DEBUG_FS, and use the
810 * signal specific entries under debugfs.
811 */
812static void __init omap_mux_set_cmdline_signals(void)
813{
814 char *options, *next_opt, *token;
815
816 if (!omap_mux_options)
817 return;
818
819 options = kmalloc(strlen(omap_mux_options) + 1, GFP_KERNEL);
820 if (!options)
821 return;
822
823 strcpy(options, omap_mux_options);
824 next_opt = options;
825
826 while ((token = strsep(&next_opt, ",")) != NULL) {
827 char *keyval, *name;
828 unsigned long val;
829
830 keyval = token;
831 name = strsep(&keyval, "=");
832 if (name) {
833 int res;
834
835 res = strict_strtoul(keyval, 0x10, &val);
836 if (res < 0)
837 continue;
838
839 omap_mux_init_signal(name, (u16)val);
840 }
841 }
842
843 kfree(options);
844}
845
846static int __init omap_mux_copy_names(struct omap_mux *src,
847 struct omap_mux *dst)
848{
849 int i;
850
851 for (i = 0; i < OMAP_MUX_NR_MODES; i++) {
852 if (src->muxnames[i]) {
853 dst->muxnames[i] =
854 kmalloc(strlen(src->muxnames[i]) + 1,
855 GFP_KERNEL);
856 if (!dst->muxnames[i])
857 goto free;
858 strcpy(dst->muxnames[i], src->muxnames[i]);
859 }
860 }
861
862#ifdef CONFIG_DEBUG_FS
863 for (i = 0; i < OMAP_MUX_NR_SIDES; i++) {
864 if (src->balls[i]) {
865 dst->balls[i] =
866 kmalloc(strlen(src->balls[i]) + 1,
867 GFP_KERNEL);
868 if (!dst->balls[i])
869 goto free;
870 strcpy(dst->balls[i], src->balls[i]);
871 }
872 }
873#endif
874
875 return 0;
876
877free:
878 omap_mux_free_names(dst);
879 return -ENOMEM;
880
881}
882
883#endif /* CONFIG_OMAP_MUX */
884
885static u16 omap_mux_get_by_gpio(int gpio)
886{
887 struct omap_mux_entry *e;
888 u16 offset = OMAP_MUX_TERMINATOR;
889
890 list_for_each_entry(e, &muxmodes, node) {
891 struct omap_mux *m = &e->mux;
892 if (m->gpio == gpio) {
893 offset = m->reg_offset;
894 break;
895 }
896 }
897
898 return offset;
899}
900
901/* Needed for dynamic muxing of GPIO pins for off-idle */
902u16 omap_mux_get_gpio(int gpio)
903{
904 u16 offset;
905
906 offset = omap_mux_get_by_gpio(gpio);
907 if (offset == OMAP_MUX_TERMINATOR) {
908 printk(KERN_ERR "mux: Could not get gpio%i\n", gpio);
909 return offset;
910 }
911
912 return omap_mux_read(offset);
913}
914
915/* Needed for dynamic muxing of GPIO pins for off-idle */
916void omap_mux_set_gpio(u16 val, int gpio)
917{
918 u16 offset;
919
920 offset = omap_mux_get_by_gpio(gpio);
921 if (offset == OMAP_MUX_TERMINATOR) {
922 printk(KERN_ERR "mux: Could not set gpio%i\n", gpio);
923 return;
924 }
925
926 omap_mux_write(val, offset);
927}
928
929static struct omap_mux * __init omap_mux_list_add(struct omap_mux *src)
930{
931 struct omap_mux_entry *entry;
932 struct omap_mux *m;
933
934 entry = kzalloc(sizeof(struct omap_mux_entry), GFP_KERNEL);
935 if (!entry)
936 return NULL;
937
938 m = &entry->mux;
939 memcpy(m, src, sizeof(struct omap_mux_entry));
940
941#ifdef CONFIG_OMAP_MUX
942 if (omap_mux_copy_names(src, m)) {
943 kfree(entry);
944 return NULL;
945 }
946#endif
947
948 mutex_lock(&muxmode_mutex);
949 list_add_tail(&entry->node, &muxmodes);
950 mutex_unlock(&muxmode_mutex);
951
952 return m;
953}
954
955/*
956 * Note if CONFIG_OMAP_MUX is not selected, we will only initialize
957 * the GPIO to mux offset mapping that is needed for dynamic muxing
958 * of GPIO pins for off-idle.
959 */
960static void __init omap_mux_init_list(struct omap_mux *superset)
961{
962 while (superset->reg_offset != OMAP_MUX_TERMINATOR) {
963 struct omap_mux *entry;
964
965#ifdef CONFIG_OMAP_MUX
966 if (!superset->muxnames || !superset->muxnames[0]) {
967 superset++;
968 continue;
969 }
970#else
971 /* Skip pins that are not muxed as GPIO by bootloader */
972 if (!OMAP_MODE_GPIO(omap_mux_read(superset->reg_offset))) {
973 superset++;
974 continue;
975 }
976#endif
977
978 entry = omap_mux_list_add(superset);
979 if (!entry) {
980 printk(KERN_ERR "mux: Could not add entry\n");
981 return;
982 }
983 superset++;
640 } 984 }
985}
986
987#ifdef CONFIG_OMAP_MUX
988
989static void omap_mux_init_package(struct omap_mux *superset,
990 struct omap_mux *package_subset,
991 struct omap_ball *package_balls)
992{
993 if (package_subset)
994 omap_mux_package_fixup(package_subset, superset);
995 if (package_balls)
996 omap_mux_package_init_balls(package_balls, superset);
997}
641 998
642 return omap_mux_register(&arch_mux_cfg); 999static void omap_mux_init_signals(struct omap_board_mux *board_mux)
1000{
1001 omap_mux_set_cmdline_signals();
1002 omap_mux_write_array(board_mux);
1003}
1004
1005#else
1006
1007static void omap_mux_init_package(struct omap_mux *superset,
1008 struct omap_mux *package_subset,
1009 struct omap_ball *package_balls)
1010{
1011}
1012
1013static void omap_mux_init_signals(struct omap_board_mux *board_mux)
1014{
643} 1015}
644 1016
645#endif 1017#endif
1018
1019int __init omap_mux_init(u32 mux_pbase, u32 mux_size,
1020 struct omap_mux *superset,
1021 struct omap_mux *package_subset,
1022 struct omap_board_mux *board_mux,
1023 struct omap_ball *package_balls)
1024{
1025 if (mux_base)
1026 return -EBUSY;
1027
1028 mux_phys = mux_pbase;
1029 mux_base = ioremap(mux_pbase, mux_size);
1030 if (!mux_base) {
1031 printk(KERN_ERR "mux: Could not ioremap\n");
1032 return -ENODEV;
1033 }
1034
1035 omap_mux_init_package(superset, package_subset, package_balls);
1036 omap_mux_init_list(superset);
1037 omap_mux_init_signals(board_mux);
1038
1039 return 0;
1040}
1041
1042#endif /* CONFIG_ARCH_OMAP3 */
1043
diff --git a/arch/arm/mach-omap2/mux.h b/arch/arm/mach-omap2/mux.h
new file mode 100644
index 000000000000..480abc56e605
--- /dev/null
+++ b/arch/arm/mach-omap2/mux.h
@@ -0,0 +1,187 @@
1/*
2 * Copyright (C) 2009 Nokia
3 * Copyright (C) 2009 Texas Instruments
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 */
9
10#include "mux34xx.h"
11
12#define OMAP_MUX_TERMINATOR 0xffff
13
14/* 34xx mux mode options for each pin. See TRM for options */
15#define OMAP_MUX_MODE0 0
16#define OMAP_MUX_MODE1 1
17#define OMAP_MUX_MODE2 2
18#define OMAP_MUX_MODE3 3
19#define OMAP_MUX_MODE4 4
20#define OMAP_MUX_MODE5 5
21#define OMAP_MUX_MODE6 6
22#define OMAP_MUX_MODE7 7
23
24/* 24xx/34xx mux bit defines */
25#define OMAP_PULL_ENA (1 << 3)
26#define OMAP_PULL_UP (1 << 4)
27#define OMAP_ALTELECTRICALSEL (1 << 5)
28
29/* 34xx specific mux bit defines */
30#define OMAP_INPUT_EN (1 << 8)
31#define OMAP_OFF_EN (1 << 9)
32#define OMAP_OFFOUT_EN (1 << 10)
33#define OMAP_OFFOUT_VAL (1 << 11)
34#define OMAP_OFF_PULL_EN (1 << 12)
35#define OMAP_OFF_PULL_UP (1 << 13)
36#define OMAP_WAKEUP_EN (1 << 14)
37
38/* Active pin states */
39#define OMAP_PIN_OUTPUT 0
40#define OMAP_PIN_INPUT OMAP_INPUT_EN
41#define OMAP_PIN_INPUT_PULLUP (OMAP_PULL_ENA | OMAP_INPUT_EN \
42 | OMAP_PULL_UP)
43#define OMAP_PIN_INPUT_PULLDOWN (OMAP_PULL_ENA | OMAP_INPUT_EN)
44
45/* Off mode states */
46#define OMAP_PIN_OFF_NONE 0
47#define OMAP_PIN_OFF_OUTPUT_HIGH (OMAP_OFF_EN | OMAP_OFFOUT_EN \
48 | OMAP_OFFOUT_VAL)
49#define OMAP_PIN_OFF_OUTPUT_LOW (OMAP_OFF_EN | OMAP_OFFOUT_EN)
50#define OMAP_PIN_OFF_INPUT_PULLUP (OMAP_OFF_EN | OMAP_OFF_PULL_EN \
51 | OMAP_OFF_PULL_UP)
52#define OMAP_PIN_OFF_INPUT_PULLDOWN (OMAP_OFF_EN | OMAP_OFF_PULL_EN)
53#define OMAP_PIN_OFF_WAKEUPENABLE OMAP_WAKEUP_EN
54
55#define OMAP_MODE_GPIO(x) (((x) & OMAP_MUX_MODE7) == OMAP_MUX_MODE4)
56
57/* Flags for omap_mux_init */
58#define OMAP_PACKAGE_MASK 0xffff
59#define OMAP_PACKAGE_CBP 4 /* 515-pin 0.40 0.50 */
60#define OMAP_PACKAGE_CUS 3 /* 423-pin 0.65 */
61#define OMAP_PACKAGE_CBB 2 /* 515-pin 0.40 0.50 */
62#define OMAP_PACKAGE_CBC 1 /* 515-pin 0.50 0.65 */
63
64
65#define OMAP_MUX_NR_MODES 8 /* Available modes */
66#define OMAP_MUX_NR_SIDES 2 /* Bottom & top */
67
68/**
69 * struct omap_mux - data for omap mux register offset and it's value
70 * @reg_offset: mux register offset from the mux base
71 * @gpio: GPIO number
72 * @muxnames: available signal modes for a ball
73 */
74struct omap_mux {
75 u16 reg_offset;
76 u16 gpio;
77#ifdef CONFIG_OMAP_MUX
78 char *muxnames[OMAP_MUX_NR_MODES];
79#ifdef CONFIG_DEBUG_FS
80 char *balls[OMAP_MUX_NR_SIDES];
81#endif
82#endif
83};
84
85/**
86 * struct omap_ball - data for balls on omap package
87 * @reg_offset: mux register offset from the mux base
88 * @balls: available balls on the package
89 */
90struct omap_ball {
91 u16 reg_offset;
92 char *balls[OMAP_MUX_NR_SIDES];
93};
94
95/**
96 * struct omap_board_mux - data for initializing mux registers
97 * @reg_offset: mux register offset from the mux base
98 * @mux_value: desired mux value to set
99 */
100struct omap_board_mux {
101 u16 reg_offset;
102 u16 value;
103};
104
105#if defined(CONFIG_OMAP_MUX) && defined(CONFIG_ARCH_OMAP3)
106
107/**
108 * omap_mux_init_gpio - initialize a signal based on the GPIO number
109 * @gpio: GPIO number
110 * @val: Options for the mux register value
111 */
112int omap_mux_init_gpio(int gpio, int val);
113
114/**
115 * omap_mux_init_signal - initialize a signal based on the signal name
116 * @muxname: Mux name in mode0_name.signal_name format
117 * @val: Options for the mux register value
118 */
119int omap_mux_init_signal(char *muxname, int val);
120
121#else
122
123static inline int omap_mux_init_gpio(int gpio, int val)
124{
125 return 0;
126}
127static inline int omap_mux_init_signal(char *muxname, int val)
128{
129 return 0;
130}
131
132#endif
133
134/**
135 * omap_mux_get_gpio() - get mux register value based on GPIO number
136 * @gpio: GPIO number
137 *
138 */
139u16 omap_mux_get_gpio(int gpio);
140
141/**
142 * omap_mux_set_gpio() - set mux register value based on GPIO number
143 * @val: New mux register value
144 * @gpio: GPIO number
145 *
146 */
147void omap_mux_set_gpio(u16 val, int gpio);
148
149/**
150 * omap_mux_read() - read mux register
151 * @mux_offset: Offset of the mux register
152 *
153 */
154u16 omap_mux_read(u16 mux_offset);
155
156/**
157 * omap_mux_write() - write mux register
158 * @val: New mux register value
159 * @mux_offset: Offset of the mux register
160 *
161 * This should be only needed for dynamic remuxing of non-gpio signals.
162 */
163void omap_mux_write(u16 val, u16 mux_offset);
164
165/**
166 * omap_mux_write_array() - write an array of mux registers
167 * @board_mux: Array of mux registers terminated by MAP_MUX_TERMINATOR
168 *
169 * This should be only needed for dynamic remuxing of non-gpio signals.
170 */
171void omap_mux_write_array(struct omap_board_mux *board_mux);
172
173/**
174 * omap3_mux_init() - initialize mux system with board specific set
175 * @board_mux: Board specific mux table
176 * @flags: OMAP package type used for the board
177 */
178int omap3_mux_init(struct omap_board_mux *board_mux, int flags);
179
180/**
181 * omap_mux_init - private mux init function, do not call
182 */
183int omap_mux_init(u32 mux_pbase, u32 mux_size,
184 struct omap_mux *superset,
185 struct omap_mux *package_subset,
186 struct omap_board_mux *board_mux,
187 struct omap_ball *package_balls);
diff --git a/arch/arm/mach-omap2/mux34xx.c b/arch/arm/mach-omap2/mux34xx.c
new file mode 100644
index 000000000000..07aa7b3c95f7
--- /dev/null
+++ b/arch/arm/mach-omap2/mux34xx.c
@@ -0,0 +1,2146 @@
1/*
2 * Copyright (C) 2009 Nokia
3 * Copyright (C) 2009 Texas Instruments
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 */
9
10#include <linux/module.h>
11#include <linux/init.h>
12
13#include "mux.h"
14
15#ifdef CONFIG_OMAP_MUX
16
17#define _OMAP3_MUXENTRY(M0, g, m0, m1, m2, m3, m4, m5, m6, m7) \
18{ \
19 .reg_offset = (OMAP3_CONTROL_PADCONF_##M0##_OFFSET), \
20 .gpio = (g), \
21 .muxnames = { m0, m1, m2, m3, m4, m5, m6, m7 }, \
22}
23
24#else
25
26#define _OMAP3_MUXENTRY(M0, g, m0, m1, m2, m3, m4, m5, m6, m7) \
27{ \
28 .reg_offset = (OMAP3_CONTROL_PADCONF_##M0##_OFFSET), \
29 .gpio = (g), \
30}
31
32#endif
33
34#define _OMAP3_BALLENTRY(M0, bb, bt) \
35{ \
36 .reg_offset = (OMAP3_CONTROL_PADCONF_##M0##_OFFSET), \
37 .balls = { bb, bt }, \
38}
39
40/*
41 * Superset of all mux modes for omap3
42 */
43static struct omap_mux __initdata omap3_muxmodes[] = {
44 _OMAP3_MUXENTRY(CAM_D0, 99,
45 "cam_d0", NULL, NULL, NULL,
46 "gpio_99", NULL, NULL, "safe_mode"),
47 _OMAP3_MUXENTRY(CAM_D1, 100,
48 "cam_d1", NULL, NULL, NULL,
49 "gpio_100", NULL, NULL, "safe_mode"),
50 _OMAP3_MUXENTRY(CAM_D10, 109,
51 "cam_d10", NULL, NULL, NULL,
52 "gpio_109", "hw_dbg8", NULL, "safe_mode"),
53 _OMAP3_MUXENTRY(CAM_D11, 110,
54 "cam_d11", NULL, NULL, NULL,
55 "gpio_110", "hw_dbg9", NULL, "safe_mode"),
56 _OMAP3_MUXENTRY(CAM_D2, 101,
57 "cam_d2", NULL, NULL, NULL,
58 "gpio_101", "hw_dbg4", NULL, "safe_mode"),
59 _OMAP3_MUXENTRY(CAM_D3, 102,
60 "cam_d3", NULL, NULL, NULL,
61 "gpio_102", "hw_dbg5", NULL, "safe_mode"),
62 _OMAP3_MUXENTRY(CAM_D4, 103,
63 "cam_d4", NULL, NULL, NULL,
64 "gpio_103", "hw_dbg6", NULL, "safe_mode"),
65 _OMAP3_MUXENTRY(CAM_D5, 104,
66 "cam_d5", NULL, NULL, NULL,
67 "gpio_104", "hw_dbg7", NULL, "safe_mode"),
68 _OMAP3_MUXENTRY(CAM_D6, 105,
69 "cam_d6", NULL, NULL, NULL,
70 "gpio_105", NULL, NULL, "safe_mode"),
71 _OMAP3_MUXENTRY(CAM_D7, 106,
72 "cam_d7", NULL, NULL, NULL,
73 "gpio_106", NULL, NULL, "safe_mode"),
74 _OMAP3_MUXENTRY(CAM_D8, 107,
75 "cam_d8", NULL, NULL, NULL,
76 "gpio_107", NULL, NULL, "safe_mode"),
77 _OMAP3_MUXENTRY(CAM_D9, 108,
78 "cam_d9", NULL, NULL, NULL,
79 "gpio_108", NULL, NULL, "safe_mode"),
80 _OMAP3_MUXENTRY(CAM_FLD, 98,
81 "cam_fld", NULL, "cam_global_reset", NULL,
82 "gpio_98", "hw_dbg3", NULL, "safe_mode"),
83 _OMAP3_MUXENTRY(CAM_HS, 94,
84 "cam_hs", NULL, NULL, NULL,
85 "gpio_94", "hw_dbg0", NULL, "safe_mode"),
86 _OMAP3_MUXENTRY(CAM_PCLK, 97,
87 "cam_pclk", NULL, NULL, NULL,
88 "gpio_97", "hw_dbg2", NULL, "safe_mode"),
89 _OMAP3_MUXENTRY(CAM_STROBE, 126,
90 "cam_strobe", NULL, NULL, NULL,
91 "gpio_126", "hw_dbg11", NULL, "safe_mode"),
92 _OMAP3_MUXENTRY(CAM_VS, 95,
93 "cam_vs", NULL, NULL, NULL,
94 "gpio_95", "hw_dbg1", NULL, "safe_mode"),
95 _OMAP3_MUXENTRY(CAM_WEN, 167,
96 "cam_wen", NULL, "cam_shutter", NULL,
97 "gpio_167", "hw_dbg10", NULL, "safe_mode"),
98 _OMAP3_MUXENTRY(CAM_XCLKA, 96,
99 "cam_xclka", NULL, NULL, NULL,
100 "gpio_96", NULL, NULL, "safe_mode"),
101 _OMAP3_MUXENTRY(CAM_XCLKB, 111,
102 "cam_xclkb", NULL, NULL, NULL,
103 "gpio_111", NULL, NULL, "safe_mode"),
104 _OMAP3_MUXENTRY(CSI2_DX0, 112,
105 "csi2_dx0", NULL, NULL, NULL,
106 "gpio_112", NULL, NULL, "safe_mode"),
107 _OMAP3_MUXENTRY(CSI2_DX1, 114,
108 "csi2_dx1", NULL, NULL, NULL,
109 "gpio_114", NULL, NULL, "safe_mode"),
110 _OMAP3_MUXENTRY(CSI2_DY0, 113,
111 "csi2_dy0", NULL, NULL, NULL,
112 "gpio_113", NULL, NULL, "safe_mode"),
113 _OMAP3_MUXENTRY(CSI2_DY1, 115,
114 "csi2_dy1", NULL, NULL, NULL,
115 "gpio_115", NULL, NULL, "safe_mode"),
116 _OMAP3_MUXENTRY(DSS_ACBIAS, 69,
117 "dss_acbias", NULL, NULL, NULL,
118 "gpio_69", NULL, NULL, "safe_mode"),
119 _OMAP3_MUXENTRY(DSS_DATA0, 70,
120 "dss_data0", NULL, "uart1_cts", NULL,
121 "gpio_70", NULL, NULL, "safe_mode"),
122 _OMAP3_MUXENTRY(DSS_DATA1, 71,
123 "dss_data1", NULL, "uart1_rts", NULL,
124 "gpio_71", NULL, NULL, "safe_mode"),
125 _OMAP3_MUXENTRY(DSS_DATA10, 80,
126 "dss_data10", NULL, NULL, NULL,
127 "gpio_80", NULL, NULL, "safe_mode"),
128 _OMAP3_MUXENTRY(DSS_DATA11, 81,
129 "dss_data11", NULL, NULL, NULL,
130 "gpio_81", NULL, NULL, "safe_mode"),
131 _OMAP3_MUXENTRY(DSS_DATA12, 82,
132 "dss_data12", NULL, NULL, NULL,
133 "gpio_82", NULL, NULL, "safe_mode"),
134 _OMAP3_MUXENTRY(DSS_DATA13, 83,
135 "dss_data13", NULL, NULL, NULL,
136 "gpio_83", NULL, NULL, "safe_mode"),
137 _OMAP3_MUXENTRY(DSS_DATA14, 84,
138 "dss_data14", NULL, NULL, NULL,
139 "gpio_84", NULL, NULL, "safe_mode"),
140 _OMAP3_MUXENTRY(DSS_DATA15, 85,
141 "dss_data15", NULL, NULL, NULL,
142 "gpio_85", NULL, NULL, "safe_mode"),
143 _OMAP3_MUXENTRY(DSS_DATA16, 86,
144 "dss_data16", NULL, NULL, NULL,
145 "gpio_86", NULL, NULL, "safe_mode"),
146 _OMAP3_MUXENTRY(DSS_DATA17, 87,
147 "dss_data17", NULL, NULL, NULL,
148 "gpio_87", NULL, NULL, "safe_mode"),
149 _OMAP3_MUXENTRY(DSS_DATA18, 88,
150 "dss_data18", NULL, "mcspi3_clk", "dss_data0",
151 "gpio_88", NULL, NULL, "safe_mode"),
152 _OMAP3_MUXENTRY(DSS_DATA19, 89,
153 "dss_data19", NULL, "mcspi3_simo", "dss_data1",
154 "gpio_89", NULL, NULL, "safe_mode"),
155 _OMAP3_MUXENTRY(DSS_DATA20, 90,
156 "dss_data20", NULL, "mcspi3_somi", "dss_data2",
157 "gpio_90", NULL, NULL, "safe_mode"),
158 _OMAP3_MUXENTRY(DSS_DATA21, 91,
159 "dss_data21", NULL, "mcspi3_cs0", "dss_data3",
160 "gpio_91", NULL, NULL, "safe_mode"),
161 _OMAP3_MUXENTRY(DSS_DATA22, 92,
162 "dss_data22", NULL, "mcspi3_cs1", "dss_data4",
163 "gpio_92", NULL, NULL, "safe_mode"),
164 _OMAP3_MUXENTRY(DSS_DATA23, 93,
165 "dss_data23", NULL, NULL, "dss_data5",
166 "gpio_93", NULL, NULL, "safe_mode"),
167 _OMAP3_MUXENTRY(DSS_DATA2, 72,
168 "dss_data2", NULL, NULL, NULL,
169 "gpio_72", NULL, NULL, "safe_mode"),
170 _OMAP3_MUXENTRY(DSS_DATA3, 73,
171 "dss_data3", NULL, NULL, NULL,
172 "gpio_73", NULL, NULL, "safe_mode"),
173 _OMAP3_MUXENTRY(DSS_DATA4, 74,
174 "dss_data4", NULL, "uart3_rx_irrx", NULL,
175 "gpio_74", NULL, NULL, "safe_mode"),
176 _OMAP3_MUXENTRY(DSS_DATA5, 75,
177 "dss_data5", NULL, "uart3_tx_irtx", NULL,
178 "gpio_75", NULL, NULL, "safe_mode"),
179 _OMAP3_MUXENTRY(DSS_DATA6, 76,
180 "dss_data6", NULL, "uart1_tx", NULL,
181 "gpio_76", "hw_dbg14", NULL, "safe_mode"),
182 _OMAP3_MUXENTRY(DSS_DATA7, 77,
183 "dss_data7", NULL, "uart1_rx", NULL,
184 "gpio_77", "hw_dbg15", NULL, "safe_mode"),
185 _OMAP3_MUXENTRY(DSS_DATA8, 78,
186 "dss_data8", NULL, NULL, NULL,
187 "gpio_78", "hw_dbg16", NULL, "safe_mode"),
188 _OMAP3_MUXENTRY(DSS_DATA9, 79,
189 "dss_data9", NULL, NULL, NULL,
190 "gpio_79", "hw_dbg17", NULL, "safe_mode"),
191 _OMAP3_MUXENTRY(DSS_HSYNC, 67,
192 "dss_hsync", NULL, NULL, NULL,
193 "gpio_67", "hw_dbg13", NULL, "safe_mode"),
194 _OMAP3_MUXENTRY(DSS_PCLK, 66,
195 "dss_pclk", NULL, NULL, NULL,
196 "gpio_66", "hw_dbg12", NULL, "safe_mode"),
197 _OMAP3_MUXENTRY(DSS_VSYNC, 68,
198 "dss_vsync", NULL, NULL, NULL,
199 "gpio_68", NULL, NULL, "safe_mode"),
200 _OMAP3_MUXENTRY(ETK_CLK, 12,
201 "etk_clk", "mcbsp5_clkx", "sdmmc3_clk", "hsusb1_stp",
202 "gpio_12", "mm1_rxdp", "hsusb1_tll_stp", "hw_dbg0"),
203 _OMAP3_MUXENTRY(ETK_CTL, 13,
204 "etk_ctl", NULL, "sdmmc3_cmd", "hsusb1_clk",
205 "gpio_13", NULL, "hsusb1_tll_clk", "hw_dbg1"),
206 _OMAP3_MUXENTRY(ETK_D0, 14,
207 "etk_d0", "mcspi3_simo", "sdmmc3_dat4", "hsusb1_data0",
208 "gpio_14", "mm1_rxrcv", "hsusb1_tll_data0", "hw_dbg2"),
209 _OMAP3_MUXENTRY(ETK_D1, 15,
210 "etk_d1", "mcspi3_somi", NULL, "hsusb1_data1",
211 "gpio_15", "mm1_txse0", "hsusb1_tll_data1", "hw_dbg3"),
212 _OMAP3_MUXENTRY(ETK_D10, 24,
213 "etk_d10", NULL, "uart1_rx", "hsusb2_clk",
214 "gpio_24", NULL, "hsusb2_tll_clk", "hw_dbg12"),
215 _OMAP3_MUXENTRY(ETK_D11, 25,
216 "etk_d11", NULL, NULL, "hsusb2_stp",
217 "gpio_25", "mm2_rxdp", "hsusb2_tll_stp", "hw_dbg13"),
218 _OMAP3_MUXENTRY(ETK_D12, 26,
219 "etk_d12", NULL, NULL, "hsusb2_dir",
220 "gpio_26", NULL, "hsusb2_tll_dir", "hw_dbg14"),
221 _OMAP3_MUXENTRY(ETK_D13, 27,
222 "etk_d13", NULL, NULL, "hsusb2_nxt",
223 "gpio_27", "mm2_rxdm", "hsusb2_tll_nxt", "hw_dbg15"),
224 _OMAP3_MUXENTRY(ETK_D14, 28,
225 "etk_d14", NULL, NULL, "hsusb2_data0",
226 "gpio_28", "mm2_rxrcv", "hsusb2_tll_data0", "hw_dbg16"),
227 _OMAP3_MUXENTRY(ETK_D15, 29,
228 "etk_d15", NULL, NULL, "hsusb2_data1",
229 "gpio_29", "mm2_txse0", "hsusb2_tll_data1", "hw_dbg17"),
230 _OMAP3_MUXENTRY(ETK_D2, 16,
231 "etk_d2", "mcspi3_cs0", NULL, "hsusb1_data2",
232 "gpio_16", "mm1_txdat", "hsusb1_tll_data2", "hw_dbg4"),
233 _OMAP3_MUXENTRY(ETK_D3, 17,
234 "etk_d3", "mcspi3_clk", "sdmmc3_dat3", "hsusb1_data7",
235 "gpio_17", NULL, "hsusb1_tll_data7", "hw_dbg5"),
236 _OMAP3_MUXENTRY(ETK_D4, 18,
237 "etk_d4", "mcbsp5_dr", "sdmmc3_dat0", "hsusb1_data4",
238 "gpio_18", NULL, "hsusb1_tll_data4", "hw_dbg6"),
239 _OMAP3_MUXENTRY(ETK_D5, 19,
240 "etk_d5", "mcbsp5_fsx", "sdmmc3_dat1", "hsusb1_data5",
241 "gpio_19", NULL, "hsusb1_tll_data5", "hw_dbg7"),
242 _OMAP3_MUXENTRY(ETK_D6, 20,
243 "etk_d6", "mcbsp5_dx", "sdmmc3_dat2", "hsusb1_data6",
244 "gpio_20", NULL, "hsusb1_tll_data6", "hw_dbg8"),
245 _OMAP3_MUXENTRY(ETK_D7, 21,
246 "etk_d7", "mcspi3_cs1", "sdmmc3_dat7", "hsusb1_data3",
247 "gpio_21", "mm1_txen_n", "hsusb1_tll_data3", "hw_dbg9"),
248 _OMAP3_MUXENTRY(ETK_D8, 22,
249 "etk_d8", "sys_drm_msecure", "sdmmc3_dat6", "hsusb1_dir",
250 "gpio_22", NULL, "hsusb1_tll_dir", "hw_dbg10"),
251 _OMAP3_MUXENTRY(ETK_D9, 23,
252 "etk_d9", "sys_secure_indicator", "sdmmc3_dat5", "hsusb1_nxt",
253 "gpio_23", "mm1_rxdm", "hsusb1_tll_nxt", "hw_dbg11"),
254 _OMAP3_MUXENTRY(GPMC_A1, 34,
255 "gpmc_a1", NULL, NULL, NULL,
256 "gpio_34", NULL, NULL, "safe_mode"),
257 _OMAP3_MUXENTRY(GPMC_A10, 43,
258 "gpmc_a10", "sys_ndmareq3", NULL, NULL,
259 "gpio_43", NULL, NULL, "safe_mode"),
260 _OMAP3_MUXENTRY(GPMC_A2, 35,
261 "gpmc_a2", NULL, NULL, NULL,
262 "gpio_35", NULL, NULL, "safe_mode"),
263 _OMAP3_MUXENTRY(GPMC_A3, 36,
264 "gpmc_a3", NULL, NULL, NULL,
265 "gpio_36", NULL, NULL, "safe_mode"),
266 _OMAP3_MUXENTRY(GPMC_A4, 37,
267 "gpmc_a4", NULL, NULL, NULL,
268 "gpio_37", NULL, NULL, "safe_mode"),
269 _OMAP3_MUXENTRY(GPMC_A5, 38,
270 "gpmc_a5", NULL, NULL, NULL,
271 "gpio_38", NULL, NULL, "safe_mode"),
272 _OMAP3_MUXENTRY(GPMC_A6, 39,
273 "gpmc_a6", NULL, NULL, NULL,
274 "gpio_39", NULL, NULL, "safe_mode"),
275 _OMAP3_MUXENTRY(GPMC_A7, 40,
276 "gpmc_a7", NULL, NULL, NULL,
277 "gpio_40", NULL, NULL, "safe_mode"),
278 _OMAP3_MUXENTRY(GPMC_A8, 41,
279 "gpmc_a8", NULL, NULL, NULL,
280 "gpio_41", NULL, NULL, "safe_mode"),
281 _OMAP3_MUXENTRY(GPMC_A9, 42,
282 "gpmc_a9", "sys_ndmareq2", NULL, NULL,
283 "gpio_42", NULL, NULL, "safe_mode"),
284 _OMAP3_MUXENTRY(GPMC_CLK, 59,
285 "gpmc_clk", NULL, NULL, NULL,
286 "gpio_59", NULL, NULL, "safe_mode"),
287 _OMAP3_MUXENTRY(GPMC_D10, 46,
288 "gpmc_d10", NULL, NULL, NULL,
289 "gpio_46", NULL, NULL, "safe_mode"),
290 _OMAP3_MUXENTRY(GPMC_D11, 47,
291 "gpmc_d11", NULL, NULL, NULL,
292 "gpio_47", NULL, NULL, "safe_mode"),
293 _OMAP3_MUXENTRY(GPMC_D12, 48,
294 "gpmc_d12", NULL, NULL, NULL,
295 "gpio_48", NULL, NULL, "safe_mode"),
296 _OMAP3_MUXENTRY(GPMC_D13, 49,
297 "gpmc_d13", NULL, NULL, NULL,
298 "gpio_49", NULL, NULL, "safe_mode"),
299 _OMAP3_MUXENTRY(GPMC_D14, 50,
300 "gpmc_d14", NULL, NULL, NULL,
301 "gpio_50", NULL, NULL, "safe_mode"),
302 _OMAP3_MUXENTRY(GPMC_D15, 51,
303 "gpmc_d15", NULL, NULL, NULL,
304 "gpio_51", NULL, NULL, "safe_mode"),
305 _OMAP3_MUXENTRY(GPMC_D8, 44,
306 "gpmc_d8", NULL, NULL, NULL,
307 "gpio_44", NULL, NULL, "safe_mode"),
308 _OMAP3_MUXENTRY(GPMC_D9, 45,
309 "gpmc_d9", NULL, NULL, NULL,
310 "gpio_45", NULL, NULL, "safe_mode"),
311 _OMAP3_MUXENTRY(GPMC_NBE0_CLE, 60,
312 "gpmc_nbe0_cle", NULL, NULL, NULL,
313 "gpio_60", NULL, NULL, "safe_mode"),
314 _OMAP3_MUXENTRY(GPMC_NBE1, 61,
315 "gpmc_nbe1", NULL, NULL, NULL,
316 "gpio_61", NULL, NULL, "safe_mode"),
317 _OMAP3_MUXENTRY(GPMC_NCS1, 52,
318 "gpmc_ncs1", NULL, NULL, NULL,
319 "gpio_52", NULL, NULL, "safe_mode"),
320 _OMAP3_MUXENTRY(GPMC_NCS2, 53,
321 "gpmc_ncs2", NULL, NULL, NULL,
322 "gpio_53", NULL, NULL, "safe_mode"),
323 _OMAP3_MUXENTRY(GPMC_NCS3, 54,
324 "gpmc_ncs3", "sys_ndmareq0", NULL, NULL,
325 "gpio_54", NULL, NULL, "safe_mode"),
326 _OMAP3_MUXENTRY(GPMC_NCS4, 55,
327 "gpmc_ncs4", "sys_ndmareq1", "mcbsp4_clkx", "gpt9_pwm_evt",
328 "gpio_55", NULL, NULL, "safe_mode"),
329 _OMAP3_MUXENTRY(GPMC_NCS5, 56,
330 "gpmc_ncs5", "sys_ndmareq2", "mcbsp4_dr", "gpt10_pwm_evt",
331 "gpio_56", NULL, NULL, "safe_mode"),
332 _OMAP3_MUXENTRY(GPMC_NCS6, 57,
333 "gpmc_ncs6", "sys_ndmareq3", "mcbsp4_dx", "gpt11_pwm_evt",
334 "gpio_57", NULL, NULL, "safe_mode"),
335 _OMAP3_MUXENTRY(GPMC_NCS7, 58,
336 "gpmc_ncs7", "gpmc_io_dir", "mcbsp4_fsx", "gpt8_pwm_evt",
337 "gpio_58", NULL, NULL, "safe_mode"),
338 _OMAP3_MUXENTRY(GPMC_NWP, 62,
339 "gpmc_nwp", NULL, NULL, NULL,
340 "gpio_62", NULL, NULL, "safe_mode"),
341 _OMAP3_MUXENTRY(GPMC_WAIT1, 63,
342 "gpmc_wait1", NULL, NULL, NULL,
343 "gpio_63", NULL, NULL, "safe_mode"),
344 _OMAP3_MUXENTRY(GPMC_WAIT2, 64,
345 "gpmc_wait2", NULL, NULL, NULL,
346 "gpio_64", NULL, NULL, "safe_mode"),
347 _OMAP3_MUXENTRY(GPMC_WAIT3, 65,
348 "gpmc_wait3", "sys_ndmareq1", NULL, NULL,
349 "gpio_65", NULL, NULL, "safe_mode"),
350 _OMAP3_MUXENTRY(HDQ_SIO, 170,
351 "hdq_sio", "sys_altclk", "i2c2_sccbe", "i2c3_sccbe",
352 "gpio_170", NULL, NULL, "safe_mode"),
353 _OMAP3_MUXENTRY(HSUSB0_CLK, 120,
354 "hsusb0_clk", NULL, NULL, NULL,
355 "gpio_120", NULL, NULL, "safe_mode"),
356 _OMAP3_MUXENTRY(HSUSB0_DATA0, 125,
357 "hsusb0_data0", NULL, "uart3_tx_irtx", NULL,
358 "gpio_125", NULL, NULL, "safe_mode"),
359 _OMAP3_MUXENTRY(HSUSB0_DATA1, 130,
360 "hsusb0_data1", NULL, "uart3_rx_irrx", NULL,
361 "gpio_130", NULL, NULL, "safe_mode"),
362 _OMAP3_MUXENTRY(HSUSB0_DATA2, 131,
363 "hsusb0_data2", NULL, "uart3_rts_sd", NULL,
364 "gpio_131", NULL, NULL, "safe_mode"),
365 _OMAP3_MUXENTRY(HSUSB0_DATA3, 169,
366 "hsusb0_data3", NULL, "uart3_cts_rctx", NULL,
367 "gpio_169", NULL, NULL, "safe_mode"),
368 _OMAP3_MUXENTRY(HSUSB0_DATA4, 188,
369 "hsusb0_data4", NULL, NULL, NULL,
370 "gpio_188", NULL, NULL, "safe_mode"),
371 _OMAP3_MUXENTRY(HSUSB0_DATA5, 189,
372 "hsusb0_data5", NULL, NULL, NULL,
373 "gpio_189", NULL, NULL, "safe_mode"),
374 _OMAP3_MUXENTRY(HSUSB0_DATA6, 190,
375 "hsusb0_data6", NULL, NULL, NULL,
376 "gpio_190", NULL, NULL, "safe_mode"),
377 _OMAP3_MUXENTRY(HSUSB0_DATA7, 191,
378 "hsusb0_data7", NULL, NULL, NULL,
379 "gpio_191", NULL, NULL, "safe_mode"),
380 _OMAP3_MUXENTRY(HSUSB0_DIR, 122,
381 "hsusb0_dir", NULL, NULL, NULL,
382 "gpio_122", NULL, NULL, "safe_mode"),
383 _OMAP3_MUXENTRY(HSUSB0_NXT, 124,
384 "hsusb0_nxt", NULL, NULL, NULL,
385 "gpio_124", NULL, NULL, "safe_mode"),
386 _OMAP3_MUXENTRY(HSUSB0_STP, 121,
387 "hsusb0_stp", NULL, NULL, NULL,
388 "gpio_121", NULL, NULL, "safe_mode"),
389 _OMAP3_MUXENTRY(I2C2_SCL, 168,
390 "i2c2_scl", NULL, NULL, NULL,
391 "gpio_168", NULL, NULL, "safe_mode"),
392 _OMAP3_MUXENTRY(I2C2_SDA, 183,
393 "i2c2_sda", NULL, NULL, NULL,
394 "gpio_183", NULL, NULL, "safe_mode"),
395 _OMAP3_MUXENTRY(I2C3_SCL, 184,
396 "i2c3_scl", NULL, NULL, NULL,
397 "gpio_184", NULL, NULL, "safe_mode"),
398 _OMAP3_MUXENTRY(I2C3_SDA, 185,
399 "i2c3_sda", NULL, NULL, NULL,
400 "gpio_185", NULL, NULL, "safe_mode"),
401 _OMAP3_MUXENTRY(I2C4_SCL, 0,
402 "i2c4_scl", "sys_nvmode1", NULL, NULL,
403 NULL, NULL, NULL, "safe_mode"),
404 _OMAP3_MUXENTRY(I2C4_SDA, 0,
405 "i2c4_sda", "sys_nvmode2", NULL, NULL,
406 NULL, NULL, NULL, "safe_mode"),
407 _OMAP3_MUXENTRY(JTAG_EMU0, 11,
408 "jtag_emu0", NULL, NULL, NULL,
409 "gpio_11", NULL, NULL, "safe_mode"),
410 _OMAP3_MUXENTRY(JTAG_EMU1, 31,
411 "jtag_emu1", NULL, NULL, NULL,
412 "gpio_31", NULL, NULL, "safe_mode"),
413 _OMAP3_MUXENTRY(MCBSP1_CLKR, 156,
414 "mcbsp1_clkr", "mcspi4_clk", NULL, NULL,
415 "gpio_156", NULL, NULL, "safe_mode"),
416 _OMAP3_MUXENTRY(MCBSP1_CLKX, 162,
417 "mcbsp1_clkx", NULL, "mcbsp3_clkx", NULL,
418 "gpio_162", NULL, NULL, "safe_mode"),
419 _OMAP3_MUXENTRY(MCBSP1_DR, 159,
420 "mcbsp1_dr", "mcspi4_somi", "mcbsp3_dr", NULL,
421 "gpio_159", NULL, NULL, "safe_mode"),
422 _OMAP3_MUXENTRY(MCBSP1_DX, 158,
423 "mcbsp1_dx", "mcspi4_simo", "mcbsp3_dx", NULL,
424 "gpio_158", NULL, NULL, "safe_mode"),
425 _OMAP3_MUXENTRY(MCBSP1_FSR, 157,
426 "mcbsp1_fsr", NULL, "cam_global_reset", NULL,
427 "gpio_157", NULL, NULL, "safe_mode"),
428 _OMAP3_MUXENTRY(MCBSP1_FSX, 161,
429 "mcbsp1_fsx", "mcspi4_cs0", "mcbsp3_fsx", NULL,
430 "gpio_161", NULL, NULL, "safe_mode"),
431 _OMAP3_MUXENTRY(MCBSP2_CLKX, 117,
432 "mcbsp2_clkx", NULL, NULL, NULL,
433 "gpio_117", NULL, NULL, "safe_mode"),
434 _OMAP3_MUXENTRY(MCBSP2_DR, 118,
435 "mcbsp2_dr", NULL, NULL, NULL,
436 "gpio_118", NULL, NULL, "safe_mode"),
437 _OMAP3_MUXENTRY(MCBSP2_DX, 119,
438 "mcbsp2_dx", NULL, NULL, NULL,
439 "gpio_119", NULL, NULL, "safe_mode"),
440 _OMAP3_MUXENTRY(MCBSP2_FSX, 116,
441 "mcbsp2_fsx", NULL, NULL, NULL,
442 "gpio_116", NULL, NULL, "safe_mode"),
443 _OMAP3_MUXENTRY(MCBSP3_CLKX, 142,
444 "mcbsp3_clkx", "uart2_tx", NULL, NULL,
445 "gpio_142", "hsusb3_tll_data6", NULL, "safe_mode"),
446 _OMAP3_MUXENTRY(MCBSP3_DR, 141,
447 "mcbsp3_dr", "uart2_rts", NULL, NULL,
448 "gpio_141", "hsusb3_tll_data5", NULL, "safe_mode"),
449 _OMAP3_MUXENTRY(MCBSP3_DX, 140,
450 "mcbsp3_dx", "uart2_cts", NULL, NULL,
451 "gpio_140", "hsusb3_tll_data4", NULL, "safe_mode"),
452 _OMAP3_MUXENTRY(MCBSP3_FSX, 143,
453 "mcbsp3_fsx", "uart2_rx", NULL, NULL,
454 "gpio_143", "hsusb3_tll_data7", NULL, "safe_mode"),
455 _OMAP3_MUXENTRY(MCBSP4_CLKX, 152,
456 "mcbsp4_clkx", NULL, NULL, NULL,
457 "gpio_152", "hsusb3_tll_data1", "mm3_txse0", "safe_mode"),
458 _OMAP3_MUXENTRY(MCBSP4_DR, 153,
459 "mcbsp4_dr", NULL, NULL, NULL,
460 "gpio_153", "hsusb3_tll_data0", "mm3_rxrcv", "safe_mode"),
461 _OMAP3_MUXENTRY(MCBSP4_DX, 154,
462 "mcbsp4_dx", NULL, NULL, NULL,
463 "gpio_154", "hsusb3_tll_data2", "mm3_txdat", "safe_mode"),
464 _OMAP3_MUXENTRY(MCBSP4_FSX, 155,
465 "mcbsp4_fsx", NULL, NULL, NULL,
466 "gpio_155", "hsusb3_tll_data3", "mm3_txen_n", "safe_mode"),
467 _OMAP3_MUXENTRY(MCBSP_CLKS, 160,
468 "mcbsp_clks", NULL, "cam_shutter", NULL,
469 "gpio_160", "uart1_cts", NULL, "safe_mode"),
470 _OMAP3_MUXENTRY(MCSPI1_CLK, 171,
471 "mcspi1_clk", "sdmmc2_dat4", NULL, NULL,
472 "gpio_171", NULL, NULL, "safe_mode"),
473 _OMAP3_MUXENTRY(MCSPI1_CS0, 174,
474 "mcspi1_cs0", "sdmmc2_dat7", NULL, NULL,
475 "gpio_174", NULL, NULL, "safe_mode"),
476 _OMAP3_MUXENTRY(MCSPI1_CS1, 175,
477 "mcspi1_cs1", NULL, NULL, "sdmmc3_cmd",
478 "gpio_175", NULL, NULL, "safe_mode"),
479 _OMAP3_MUXENTRY(MCSPI1_CS2, 176,
480 "mcspi1_cs2", NULL, NULL, "sdmmc3_clk",
481 "gpio_176", NULL, NULL, "safe_mode"),
482 _OMAP3_MUXENTRY(MCSPI1_CS3, 177,
483 "mcspi1_cs3", NULL, "hsusb2_tll_data2", "hsusb2_data2",
484 "gpio_177", "mm2_txdat", NULL, "safe_mode"),
485 _OMAP3_MUXENTRY(MCSPI1_SIMO, 172,
486 "mcspi1_simo", "sdmmc2_dat5", NULL, NULL,
487 "gpio_172", NULL, NULL, "safe_mode"),
488 _OMAP3_MUXENTRY(MCSPI1_SOMI, 173,
489 "mcspi1_somi", "sdmmc2_dat6", NULL, NULL,
490 "gpio_173", NULL, NULL, "safe_mode"),
491 _OMAP3_MUXENTRY(MCSPI2_CLK, 178,
492 "mcspi2_clk", NULL, "hsusb2_tll_data7", "hsusb2_data7",
493 "gpio_178", NULL, NULL, "safe_mode"),
494 _OMAP3_MUXENTRY(MCSPI2_CS0, 181,
495 "mcspi2_cs0", "gpt11_pwm_evt",
496 "hsusb2_tll_data6", "hsusb2_data6",
497 "gpio_181", NULL, NULL, "safe_mode"),
498 _OMAP3_MUXENTRY(MCSPI2_CS1, 182,
499 "mcspi2_cs1", "gpt8_pwm_evt",
500 "hsusb2_tll_data3", "hsusb2_data3",
501 "gpio_182", "mm2_txen_n", NULL, "safe_mode"),
502 _OMAP3_MUXENTRY(MCSPI2_SIMO, 179,
503 "mcspi2_simo", "gpt9_pwm_evt",
504 "hsusb2_tll_data4", "hsusb2_data4",
505 "gpio_179", NULL, NULL, "safe_mode"),
506 _OMAP3_MUXENTRY(MCSPI2_SOMI, 180,
507 "mcspi2_somi", "gpt10_pwm_evt",
508 "hsusb2_tll_data5", "hsusb2_data5",
509 "gpio_180", NULL, NULL, "safe_mode"),
510 _OMAP3_MUXENTRY(SDMMC1_CLK, 120,
511 "sdmmc1_clk", NULL, NULL, NULL,
512 "gpio_120", NULL, NULL, "safe_mode"),
513 _OMAP3_MUXENTRY(SDMMC1_CMD, 121,
514 "sdmmc1_cmd", NULL, NULL, NULL,
515 "gpio_121", NULL, NULL, "safe_mode"),
516 _OMAP3_MUXENTRY(SDMMC1_DAT0, 122,
517 "sdmmc1_dat0", NULL, NULL, NULL,
518 "gpio_122", NULL, NULL, "safe_mode"),
519 _OMAP3_MUXENTRY(SDMMC1_DAT1, 123,
520 "sdmmc1_dat1", NULL, NULL, NULL,
521 "gpio_123", NULL, NULL, "safe_mode"),
522 _OMAP3_MUXENTRY(SDMMC1_DAT2, 124,
523 "sdmmc1_dat2", NULL, NULL, NULL,
524 "gpio_124", NULL, NULL, "safe_mode"),
525 _OMAP3_MUXENTRY(SDMMC1_DAT3, 125,
526 "sdmmc1_dat3", NULL, NULL, NULL,
527 "gpio_125", NULL, NULL, "safe_mode"),
528 _OMAP3_MUXENTRY(SDMMC1_DAT4, 126,
529 "sdmmc1_dat4", NULL, "sim_io", NULL,
530 "gpio_126", NULL, NULL, "safe_mode"),
531 _OMAP3_MUXENTRY(SDMMC1_DAT5, 127,
532 "sdmmc1_dat5", NULL, "sim_clk", NULL,
533 "gpio_127", NULL, NULL, "safe_mode"),
534 _OMAP3_MUXENTRY(SDMMC1_DAT6, 128,
535 "sdmmc1_dat6", NULL, "sim_pwrctrl", NULL,
536 "gpio_128", NULL, NULL, "safe_mode"),
537 _OMAP3_MUXENTRY(SDMMC1_DAT7, 129,
538 "sdmmc1_dat7", NULL, "sim_rst", NULL,
539 "gpio_129", NULL, NULL, "safe_mode"),
540 _OMAP3_MUXENTRY(SDMMC2_CLK, 130,
541 "sdmmc2_clk", "mcspi3_clk", NULL, NULL,
542 "gpio_130", NULL, NULL, "safe_mode"),
543 _OMAP3_MUXENTRY(SDMMC2_CMD, 131,
544 "sdmmc2_cmd", "mcspi3_simo", NULL, NULL,
545 "gpio_131", NULL, NULL, "safe_mode"),
546 _OMAP3_MUXENTRY(SDMMC2_DAT0, 132,
547 "sdmmc2_dat0", "mcspi3_somi", NULL, NULL,
548 "gpio_132", NULL, NULL, "safe_mode"),
549 _OMAP3_MUXENTRY(SDMMC2_DAT1, 133,
550 "sdmmc2_dat1", NULL, NULL, NULL,
551 "gpio_133", NULL, NULL, "safe_mode"),
552 _OMAP3_MUXENTRY(SDMMC2_DAT2, 134,
553 "sdmmc2_dat2", "mcspi3_cs1", NULL, NULL,
554 "gpio_134", NULL, NULL, "safe_mode"),
555 _OMAP3_MUXENTRY(SDMMC2_DAT3, 135,
556 "sdmmc2_dat3", "mcspi3_cs0", NULL, NULL,
557 "gpio_135", NULL, NULL, "safe_mode"),
558 _OMAP3_MUXENTRY(SDMMC2_DAT4, 136,
559 "sdmmc2_dat4", "sdmmc2_dir_dat0", NULL, "sdmmc3_dat0",
560 "gpio_136", NULL, NULL, "safe_mode"),
561 _OMAP3_MUXENTRY(SDMMC2_DAT5, 137,
562 "sdmmc2_dat5", "sdmmc2_dir_dat1",
563 "cam_global_reset", "sdmmc3_dat1",
564 "gpio_137", "hsusb3_tll_stp", "mm3_rxdp", "safe_mode"),
565 _OMAP3_MUXENTRY(SDMMC2_DAT6, 138,
566 "sdmmc2_dat6", "sdmmc2_dir_cmd", "cam_shutter", "sdmmc3_dat2",
567 "gpio_138", "hsusb3_tll_dir", NULL, "safe_mode"),
568 _OMAP3_MUXENTRY(SDMMC2_DAT7, 139,
569 "sdmmc2_dat7", "sdmmc2_clkin", NULL, "sdmmc3_dat3",
570 "gpio_139", "hsusb3_tll_nxt", "mm3_rxdm", "safe_mode"),
571 _OMAP3_MUXENTRY(SDRC_CKE0, 0,
572 "sdrc_cke0", NULL, NULL, NULL,
573 NULL, NULL, NULL, "safe_mode"),
574 _OMAP3_MUXENTRY(SDRC_CKE1, 0,
575 "sdrc_cke1", NULL, NULL, NULL,
576 NULL, NULL, NULL, "safe_mode"),
577 _OMAP3_MUXENTRY(SYS_BOOT0, 2,
578 "sys_boot0", NULL, NULL, NULL,
579 "gpio_2", NULL, NULL, "safe_mode"),
580 _OMAP3_MUXENTRY(SYS_BOOT1, 3,
581 "sys_boot1", NULL, NULL, NULL,
582 "gpio_3", NULL, NULL, "safe_mode"),
583 _OMAP3_MUXENTRY(SYS_BOOT2, 4,
584 "sys_boot2", NULL, NULL, NULL,
585 "gpio_4", NULL, NULL, "safe_mode"),
586 _OMAP3_MUXENTRY(SYS_BOOT3, 5,
587 "sys_boot3", NULL, NULL, NULL,
588 "gpio_5", NULL, NULL, "safe_mode"),
589 _OMAP3_MUXENTRY(SYS_BOOT4, 6,
590 "sys_boot4", "sdmmc2_dir_dat2", NULL, NULL,
591 "gpio_6", NULL, NULL, "safe_mode"),
592 _OMAP3_MUXENTRY(SYS_BOOT5, 7,
593 "sys_boot5", "sdmmc2_dir_dat3", NULL, NULL,
594 "gpio_7", NULL, NULL, "safe_mode"),
595 _OMAP3_MUXENTRY(SYS_BOOT6, 8,
596 "sys_boot6", NULL, NULL, NULL,
597 "gpio_8", NULL, NULL, "safe_mode"),
598 _OMAP3_MUXENTRY(SYS_CLKOUT1, 10,
599 "sys_clkout1", NULL, NULL, NULL,
600 "gpio_10", NULL, NULL, "safe_mode"),
601 _OMAP3_MUXENTRY(SYS_CLKOUT2, 186,
602 "sys_clkout2", NULL, NULL, NULL,
603 "gpio_186", NULL, NULL, "safe_mode"),
604 _OMAP3_MUXENTRY(SYS_CLKREQ, 1,
605 "sys_clkreq", NULL, NULL, NULL,
606 "gpio_1", NULL, NULL, "safe_mode"),
607 _OMAP3_MUXENTRY(SYS_NIRQ, 0,
608 "sys_nirq", NULL, NULL, NULL,
609 "gpio_0", NULL, NULL, "safe_mode"),
610 _OMAP3_MUXENTRY(SYS_NRESWARM, 30,
611 "sys_nreswarm", NULL, NULL, NULL,
612 "gpio_30", NULL, NULL, "safe_mode"),
613 _OMAP3_MUXENTRY(SYS_OFF_MODE, 9,
614 "sys_off_mode", NULL, NULL, NULL,
615 "gpio_9", NULL, NULL, "safe_mode"),
616 _OMAP3_MUXENTRY(UART1_CTS, 150,
617 "uart1_cts", NULL, NULL, NULL,
618 "gpio_150", "hsusb3_tll_clk", NULL, "safe_mode"),
619 _OMAP3_MUXENTRY(UART1_RTS, 149,
620 "uart1_rts", NULL, NULL, NULL,
621 "gpio_149", NULL, NULL, "safe_mode"),
622 _OMAP3_MUXENTRY(UART1_RX, 151,
623 "uart1_rx", NULL, "mcbsp1_clkr", "mcspi4_clk",
624 "gpio_151", NULL, NULL, "safe_mode"),
625 _OMAP3_MUXENTRY(UART1_TX, 148,
626 "uart1_tx", NULL, NULL, NULL,
627 "gpio_148", NULL, NULL, "safe_mode"),
628 _OMAP3_MUXENTRY(UART2_CTS, 144,
629 "uart2_cts", "mcbsp3_dx", "gpt9_pwm_evt", NULL,
630 "gpio_144", NULL, NULL, "safe_mode"),
631 _OMAP3_MUXENTRY(UART2_RTS, 145,
632 "uart2_rts", "mcbsp3_dr", "gpt10_pwm_evt", NULL,
633 "gpio_145", NULL, NULL, "safe_mode"),
634 _OMAP3_MUXENTRY(UART2_RX, 147,
635 "uart2_rx", "mcbsp3_fsx", "gpt8_pwm_evt", NULL,
636 "gpio_147", NULL, NULL, "safe_mode"),
637 _OMAP3_MUXENTRY(UART2_TX, 146,
638 "uart2_tx", "mcbsp3_clkx", "gpt11_pwm_evt", NULL,
639 "gpio_146", NULL, NULL, "safe_mode"),
640 _OMAP3_MUXENTRY(UART3_CTS_RCTX, 163,
641 "uart3_cts_rctx", NULL, NULL, NULL,
642 "gpio_163", NULL, NULL, "safe_mode"),
643 _OMAP3_MUXENTRY(UART3_RTS_SD, 164,
644 "uart3_rts_sd", NULL, NULL, NULL,
645 "gpio_164", NULL, NULL, "safe_mode"),
646 _OMAP3_MUXENTRY(UART3_RX_IRRX, 165,
647 "uart3_rx_irrx", NULL, NULL, NULL,
648 "gpio_165", NULL, NULL, "safe_mode"),
649 _OMAP3_MUXENTRY(UART3_TX_IRTX, 166,
650 "uart3_tx_irtx", NULL, NULL, NULL,
651 "gpio_166", NULL, NULL, "safe_mode"),
652
653 /* Only on 3630, see omap36xx_cbp_subset for the signals */
654 _OMAP3_MUXENTRY(GPMC_A11, 0,
655 NULL, NULL, NULL, NULL,
656 NULL, NULL, NULL, NULL),
657 _OMAP3_MUXENTRY(SAD2D_MBUSFLAG, 0,
658 NULL, NULL, NULL, NULL,
659 NULL, NULL, NULL, NULL),
660 _OMAP3_MUXENTRY(SAD2D_MREAD, 0,
661 NULL, NULL, NULL, NULL,
662 NULL, NULL, NULL, NULL),
663 _OMAP3_MUXENTRY(SAD2D_MWRITE, 0,
664 NULL, NULL, NULL, NULL,
665 NULL, NULL, NULL, NULL),
666 _OMAP3_MUXENTRY(SAD2D_SBUSFLAG, 0,
667 NULL, NULL, NULL, NULL,
668 NULL, NULL, NULL, NULL),
669 _OMAP3_MUXENTRY(SAD2D_SREAD, 0,
670 NULL, NULL, NULL, NULL,
671 NULL, NULL, NULL, NULL),
672 _OMAP3_MUXENTRY(SAD2D_SWRITE, 0,
673 NULL, NULL, NULL, NULL,
674 NULL, NULL, NULL, NULL),
675 _OMAP3_MUXENTRY(GPMC_A11, 0,
676 NULL, NULL, NULL, NULL,
677 NULL, NULL, NULL, NULL),
678 _OMAP3_MUXENTRY(SAD2D_MCAD28, 0,
679 NULL, NULL, NULL, NULL,
680 NULL, NULL, NULL, NULL),
681 _OMAP3_MUXENTRY(SAD2D_MCAD29, 0,
682 NULL, NULL, NULL, NULL,
683 NULL, NULL, NULL, NULL),
684 _OMAP3_MUXENTRY(SAD2D_MCAD32, 0,
685 NULL, NULL, NULL, NULL,
686 NULL, NULL, NULL, NULL),
687 _OMAP3_MUXENTRY(SAD2D_MCAD33, 0,
688 NULL, NULL, NULL, NULL,
689 NULL, NULL, NULL, NULL),
690 _OMAP3_MUXENTRY(SAD2D_MCAD34, 0,
691 NULL, NULL, NULL, NULL,
692 NULL, NULL, NULL, NULL),
693 _OMAP3_MUXENTRY(SAD2D_MCAD35, 0,
694 NULL, NULL, NULL, NULL,
695 NULL, NULL, NULL, NULL),
696 _OMAP3_MUXENTRY(SAD2D_MCAD36, 0,
697 NULL, NULL, NULL, NULL,
698 NULL, NULL, NULL, NULL),
699 { .reg_offset = OMAP_MUX_TERMINATOR },
700};
701
702/*
703 * Signals different on CBC package compared to the superset
704 */
705#if defined(CONFIG_OMAP_MUX) && defined(CONFIG_OMAP_PACKAGE_CBC)
706struct omap_mux __initdata omap3_cbc_subset[] = {
707 { .reg_offset = OMAP_MUX_TERMINATOR },
708};
709#else
710#define omap3_cbc_subset NULL
711#endif
712
713/*
714 * Balls for CBC package
715 * 515-pin s-PBGA Package, 0.65mm Ball Pitch (Top), 0.50mm Ball Pitch (Bottom)
716 *
717 * FIXME: What's up with the outdated TI documentation? See:
718 *
719 * http://wiki.davincidsp.com/index.php/Datasheet_Errata_for_OMAP35x_CBC_Package
720 * http://community.ti.com/forums/t/10982.aspx
721 */
722#if defined(CONFIG_OMAP_MUX) && defined(CONFIG_DEBUG_FS) \
723 && defined(CONFIG_OMAP_PACKAGE_CBC)
724struct omap_ball __initdata omap3_cbc_ball[] = {
725 _OMAP3_BALLENTRY(CAM_D0, "ae16", NULL),
726 _OMAP3_BALLENTRY(CAM_D1, "ae15", NULL),
727 _OMAP3_BALLENTRY(CAM_D10, "d25", NULL),
728 _OMAP3_BALLENTRY(CAM_D11, "e26", NULL),
729 _OMAP3_BALLENTRY(CAM_D2, "a24", NULL),
730 _OMAP3_BALLENTRY(CAM_D3, "b24", NULL),
731 _OMAP3_BALLENTRY(CAM_D4, "d24", NULL),
732 _OMAP3_BALLENTRY(CAM_D5, "c24", NULL),
733 _OMAP3_BALLENTRY(CAM_D6, "p25", NULL),
734 _OMAP3_BALLENTRY(CAM_D7, "p26", NULL),
735 _OMAP3_BALLENTRY(CAM_D8, "n25", NULL),
736 _OMAP3_BALLENTRY(CAM_D9, "n26", NULL),
737 _OMAP3_BALLENTRY(CAM_FLD, "b23", NULL),
738 _OMAP3_BALLENTRY(CAM_HS, "c23", NULL),
739 _OMAP3_BALLENTRY(CAM_PCLK, "c26", NULL),
740 _OMAP3_BALLENTRY(CAM_STROBE, "d26", NULL),
741 _OMAP3_BALLENTRY(CAM_VS, "d23", NULL),
742 _OMAP3_BALLENTRY(CAM_WEN, "a23", NULL),
743 _OMAP3_BALLENTRY(CAM_XCLKA, "c25", NULL),
744 _OMAP3_BALLENTRY(CAM_XCLKB, "e25", NULL),
745 _OMAP3_BALLENTRY(CSI2_DX0, "ad17", NULL),
746 _OMAP3_BALLENTRY(CSI2_DX1, "ae18", NULL),
747 _OMAP3_BALLENTRY(CSI2_DY0, "ad16", NULL),
748 _OMAP3_BALLENTRY(CSI2_DY1, "ae17", NULL),
749 _OMAP3_BALLENTRY(DSS_ACBIAS, "f26", NULL),
750 _OMAP3_BALLENTRY(DSS_DATA0, "ae21", NULL),
751 _OMAP3_BALLENTRY(DSS_DATA1, "ae22", NULL),
752 _OMAP3_BALLENTRY(DSS_DATA10, "ac26", NULL),
753 _OMAP3_BALLENTRY(DSS_DATA11, "ad26", NULL),
754 _OMAP3_BALLENTRY(DSS_DATA12, "aa25", NULL),
755 _OMAP3_BALLENTRY(DSS_DATA13, "y25", NULL),
756 _OMAP3_BALLENTRY(DSS_DATA14, "aa26", NULL),
757 _OMAP3_BALLENTRY(DSS_DATA15, "ab26", NULL),
758 _OMAP3_BALLENTRY(DSS_DATA16, "l25", NULL),
759 _OMAP3_BALLENTRY(DSS_DATA17, "l26", NULL),
760 _OMAP3_BALLENTRY(DSS_DATA18, "m24", NULL),
761 _OMAP3_BALLENTRY(DSS_DATA19, "m26", NULL),
762 _OMAP3_BALLENTRY(DSS_DATA2, "ae23", NULL),
763 _OMAP3_BALLENTRY(DSS_DATA20, "f25", NULL),
764 _OMAP3_BALLENTRY(DSS_DATA21, "n24", NULL),
765 _OMAP3_BALLENTRY(DSS_DATA22, "ac25", NULL),
766 _OMAP3_BALLENTRY(DSS_DATA23, "ab25", NULL),
767 _OMAP3_BALLENTRY(DSS_DATA3, "ae24", NULL),
768 _OMAP3_BALLENTRY(DSS_DATA4, "ad23", NULL),
769 _OMAP3_BALLENTRY(DSS_DATA5, "ad24", NULL),
770 _OMAP3_BALLENTRY(DSS_DATA6, "g26", NULL),
771 _OMAP3_BALLENTRY(DSS_DATA7, "h25", NULL),
772 _OMAP3_BALLENTRY(DSS_DATA8, "h26", NULL),
773 _OMAP3_BALLENTRY(DSS_DATA9, "j26", NULL),
774 _OMAP3_BALLENTRY(DSS_HSYNC, "k24", NULL),
775 _OMAP3_BALLENTRY(DSS_PCLK, "g25", NULL),
776 _OMAP3_BALLENTRY(DSS_VSYNC, "m25", NULL),
777 _OMAP3_BALLENTRY(ETK_CLK, "ab2", NULL),
778 _OMAP3_BALLENTRY(ETK_CTL, "ab3", NULL),
779 _OMAP3_BALLENTRY(ETK_D0, "ac3", NULL),
780 _OMAP3_BALLENTRY(ETK_D1, "ad4", NULL),
781 _OMAP3_BALLENTRY(ETK_D10, "ae4", NULL),
782 _OMAP3_BALLENTRY(ETK_D11, "af6", NULL),
783 _OMAP3_BALLENTRY(ETK_D12, "ae6", NULL),
784 _OMAP3_BALLENTRY(ETK_D13, "af7", NULL),
785 _OMAP3_BALLENTRY(ETK_D14, "af9", NULL),
786 _OMAP3_BALLENTRY(ETK_D15, "ae9", NULL),
787 _OMAP3_BALLENTRY(ETK_D2, "ad3", NULL),
788 _OMAP3_BALLENTRY(ETK_D3, "aa3", NULL),
789 _OMAP3_BALLENTRY(ETK_D4, "y3", NULL),
790 _OMAP3_BALLENTRY(ETK_D5, "ab1", NULL),
791 _OMAP3_BALLENTRY(ETK_D6, "ae3", NULL),
792 _OMAP3_BALLENTRY(ETK_D7, "ad2", NULL),
793 _OMAP3_BALLENTRY(ETK_D8, "aa4", NULL),
794 _OMAP3_BALLENTRY(ETK_D9, "v2", NULL),
795 _OMAP3_BALLENTRY(GPMC_A1, "j2", NULL),
796 _OMAP3_BALLENTRY(GPMC_A10, "d2", NULL),
797 _OMAP3_BALLENTRY(GPMC_A2, "h1", NULL),
798 _OMAP3_BALLENTRY(GPMC_A3, "h2", NULL),
799 _OMAP3_BALLENTRY(GPMC_A4, "g2", NULL),
800 _OMAP3_BALLENTRY(GPMC_A5, "f1", NULL),
801 _OMAP3_BALLENTRY(GPMC_A6, "f2", NULL),
802 _OMAP3_BALLENTRY(GPMC_A7, "e1", NULL),
803 _OMAP3_BALLENTRY(GPMC_A8, "e2", NULL),
804 _OMAP3_BALLENTRY(GPMC_A9, "d1", NULL),
805 _OMAP3_BALLENTRY(GPMC_CLK, "n1", "l1"),
806 _OMAP3_BALLENTRY(GPMC_D10, "t1", "n1"),
807 _OMAP3_BALLENTRY(GPMC_D11, "u2", "p2"),
808 _OMAP3_BALLENTRY(GPMC_D12, "u1", "p1"),
809 _OMAP3_BALLENTRY(GPMC_D13, "p1", "m1"),
810 _OMAP3_BALLENTRY(GPMC_D14, "l2", "j2"),
811 _OMAP3_BALLENTRY(GPMC_D15, "m2", "k2"),
812 _OMAP3_BALLENTRY(GPMC_D8, "v1", "r1"),
813 _OMAP3_BALLENTRY(GPMC_D9, "y1", "t1"),
814 _OMAP3_BALLENTRY(GPMC_NBE0_CLE, "k2", NULL),
815 _OMAP3_BALLENTRY(GPMC_NBE1, "j1", NULL),
816 _OMAP3_BALLENTRY(GPMC_NCS1, "ad1", "w1"),
817 _OMAP3_BALLENTRY(GPMC_NCS2, "a3", NULL),
818 _OMAP3_BALLENTRY(GPMC_NCS3, "b6", NULL),
819 _OMAP3_BALLENTRY(GPMC_NCS4, "b4", NULL),
820 _OMAP3_BALLENTRY(GPMC_NCS5, "c4", NULL),
821 _OMAP3_BALLENTRY(GPMC_NCS6, "b5", NULL),
822 _OMAP3_BALLENTRY(GPMC_NCS7, "c5", NULL),
823 _OMAP3_BALLENTRY(GPMC_NWP, "ac6", "y5"),
824 _OMAP3_BALLENTRY(GPMC_WAIT1, "ac8", "y8"),
825 _OMAP3_BALLENTRY(GPMC_WAIT2, "b3", NULL),
826 _OMAP3_BALLENTRY(GPMC_WAIT3, "c6", NULL),
827 _OMAP3_BALLENTRY(HDQ_SIO, "j23", NULL),
828 _OMAP3_BALLENTRY(HSUSB0_CLK, "w19", NULL),
829 _OMAP3_BALLENTRY(HSUSB0_DATA0, "v20", NULL),
830 _OMAP3_BALLENTRY(HSUSB0_DATA1, "y20", NULL),
831 _OMAP3_BALLENTRY(HSUSB0_DATA2, "v18", NULL),
832 _OMAP3_BALLENTRY(HSUSB0_DATA3, "w20", NULL),
833 _OMAP3_BALLENTRY(HSUSB0_DATA4, "w17", NULL),
834 _OMAP3_BALLENTRY(HSUSB0_DATA5, "y18", NULL),
835 _OMAP3_BALLENTRY(HSUSB0_DATA6, "y19", NULL),
836 _OMAP3_BALLENTRY(HSUSB0_DATA7, "y17", NULL),
837 _OMAP3_BALLENTRY(HSUSB0_DIR, "v19", NULL),
838 _OMAP3_BALLENTRY(HSUSB0_NXT, "w18", NULL),
839 _OMAP3_BALLENTRY(HSUSB0_STP, "u20", NULL),
840 _OMAP3_BALLENTRY(I2C2_SCL, "c2", NULL),
841 _OMAP3_BALLENTRY(I2C2_SDA, "c1", NULL),
842 _OMAP3_BALLENTRY(I2C3_SCL, "ab4", NULL),
843 _OMAP3_BALLENTRY(I2C3_SDA, "ac4", NULL),
844 _OMAP3_BALLENTRY(I2C4_SCL, "ad15", NULL),
845 _OMAP3_BALLENTRY(I2C4_SDA, "w16", NULL),
846 _OMAP3_BALLENTRY(JTAG_EMU0, "y15", NULL),
847 _OMAP3_BALLENTRY(JTAG_EMU1, "y14", NULL),
848 _OMAP3_BALLENTRY(MCBSP1_CLKR, "u19", NULL),
849 _OMAP3_BALLENTRY(MCBSP1_CLKX, "t17", NULL),
850 _OMAP3_BALLENTRY(MCBSP1_DR, "t20", NULL),
851 _OMAP3_BALLENTRY(MCBSP1_DX, "u17", NULL),
852 _OMAP3_BALLENTRY(MCBSP1_FSR, "v17", NULL),
853 _OMAP3_BALLENTRY(MCBSP1_FSX, "p20", NULL),
854 _OMAP3_BALLENTRY(MCBSP2_CLKX, "r18", NULL),
855 _OMAP3_BALLENTRY(MCBSP2_DR, "t18", NULL),
856 _OMAP3_BALLENTRY(MCBSP2_DX, "r19", NULL),
857 _OMAP3_BALLENTRY(MCBSP2_FSX, "u18", NULL),
858 _OMAP3_BALLENTRY(MCBSP3_CLKX, "u3", NULL),
859 _OMAP3_BALLENTRY(MCBSP3_DR, "n3", NULL),
860 _OMAP3_BALLENTRY(MCBSP3_DX, "p3", NULL),
861 _OMAP3_BALLENTRY(MCBSP3_FSX, "w3", NULL),
862 _OMAP3_BALLENTRY(MCBSP4_CLKX, "v3", NULL),
863 _OMAP3_BALLENTRY(MCBSP4_DR, "u4", NULL),
864 _OMAP3_BALLENTRY(MCBSP4_DX, "r3", NULL),
865 _OMAP3_BALLENTRY(MCBSP4_FSX, "t3", NULL),
866 _OMAP3_BALLENTRY(MCBSP_CLKS, "t19", NULL),
867 _OMAP3_BALLENTRY(MCSPI1_CLK, "p9", NULL),
868 _OMAP3_BALLENTRY(MCSPI1_CS0, "r7", NULL),
869 _OMAP3_BALLENTRY(MCSPI1_CS1, "r8", NULL),
870 _OMAP3_BALLENTRY(MCSPI1_CS2, "r9", NULL),
871 _OMAP3_BALLENTRY(MCSPI1_CS3, "t8", NULL),
872 _OMAP3_BALLENTRY(MCSPI1_SIMO, "p8", NULL),
873 _OMAP3_BALLENTRY(MCSPI1_SOMI, "p7", NULL),
874 _OMAP3_BALLENTRY(MCSPI2_CLK, "w7", NULL),
875 _OMAP3_BALLENTRY(MCSPI2_CS0, "v8", NULL),
876 _OMAP3_BALLENTRY(MCSPI2_CS1, "v9", NULL),
877 _OMAP3_BALLENTRY(MCSPI2_SIMO, "w8", NULL),
878 _OMAP3_BALLENTRY(MCSPI2_SOMI, "u8", NULL),
879 _OMAP3_BALLENTRY(SDMMC1_CLK, "n19", NULL),
880 _OMAP3_BALLENTRY(SDMMC1_CMD, "l18", NULL),
881 _OMAP3_BALLENTRY(SDMMC1_DAT0, "m19", NULL),
882 _OMAP3_BALLENTRY(SDMMC1_DAT1, "m18", NULL),
883 _OMAP3_BALLENTRY(SDMMC1_DAT2, "k18", NULL),
884 _OMAP3_BALLENTRY(SDMMC1_DAT3, "n20", NULL),
885 _OMAP3_BALLENTRY(SDMMC1_DAT4, "m20", NULL),
886 _OMAP3_BALLENTRY(SDMMC1_DAT5, "p17", NULL),
887 _OMAP3_BALLENTRY(SDMMC1_DAT6, "p18", NULL),
888 _OMAP3_BALLENTRY(SDMMC1_DAT7, "p19", NULL),
889 _OMAP3_BALLENTRY(SDMMC2_CLK, "w10", NULL),
890 _OMAP3_BALLENTRY(SDMMC2_CMD, "r10", NULL),
891 _OMAP3_BALLENTRY(SDMMC2_DAT0, "t10", NULL),
892 _OMAP3_BALLENTRY(SDMMC2_DAT1, "t9", NULL),
893 _OMAP3_BALLENTRY(SDMMC2_DAT2, "u10", NULL),
894 _OMAP3_BALLENTRY(SDMMC2_DAT3, "u9", NULL),
895 _OMAP3_BALLENTRY(SDMMC2_DAT4, "v10", NULL),
896 _OMAP3_BALLENTRY(SDMMC2_DAT5, "m3", NULL),
897 _OMAP3_BALLENTRY(SDMMC2_DAT6, "l3", NULL),
898 _OMAP3_BALLENTRY(SDMMC2_DAT7, "k3", NULL),
899 _OMAP3_BALLENTRY(SYS_BOOT0, "f3", NULL),
900 _OMAP3_BALLENTRY(SYS_BOOT1, "d3", NULL),
901 _OMAP3_BALLENTRY(SYS_BOOT2, "c3", NULL),
902 _OMAP3_BALLENTRY(SYS_BOOT3, "e3", NULL),
903 _OMAP3_BALLENTRY(SYS_BOOT4, "e4", NULL),
904 _OMAP3_BALLENTRY(SYS_BOOT5, "g3", NULL),
905 _OMAP3_BALLENTRY(SYS_BOOT6, "d4", NULL),
906 _OMAP3_BALLENTRY(SYS_CLKOUT1, "ae14", NULL),
907 _OMAP3_BALLENTRY(SYS_CLKOUT2, "w11", NULL),
908 _OMAP3_BALLENTRY(SYS_CLKREQ, "w15", NULL),
909 _OMAP3_BALLENTRY(SYS_NIRQ, "v16", NULL),
910 _OMAP3_BALLENTRY(SYS_NRESWARM, "ad7", "aa5"),
911 _OMAP3_BALLENTRY(SYS_OFF_MODE, "v12", NULL),
912 _OMAP3_BALLENTRY(UART1_CTS, "w2", NULL),
913 _OMAP3_BALLENTRY(UART1_RTS, "r2", NULL),
914 _OMAP3_BALLENTRY(UART1_RX, "h3", NULL),
915 _OMAP3_BALLENTRY(UART1_TX, "l4", NULL),
916 _OMAP3_BALLENTRY(UART2_CTS, "y24", NULL),
917 _OMAP3_BALLENTRY(UART2_RTS, "aa24", NULL),
918 _OMAP3_BALLENTRY(UART2_RX, "ad21", NULL),
919 _OMAP3_BALLENTRY(UART2_TX, "ad22", NULL),
920 _OMAP3_BALLENTRY(UART3_CTS_RCTX, "f23", NULL),
921 _OMAP3_BALLENTRY(UART3_RTS_SD, "f24", NULL),
922 _OMAP3_BALLENTRY(UART3_RX_IRRX, "h24", NULL),
923 _OMAP3_BALLENTRY(UART3_TX_IRTX, "g24", NULL),
924 { .reg_offset = OMAP_MUX_TERMINATOR },
925};
926#else
927#define omap3_cbc_ball NULL
928#endif
929
930/*
931 * Signals different on CUS package compared to superset
932 */
933#if defined(CONFIG_OMAP_MUX) && defined(CONFIG_OMAP_PACKAGE_CUS)
934struct omap_mux __initdata omap3_cus_subset[] = {
935 _OMAP3_MUXENTRY(CAM_D10, 109,
936 "cam_d10", NULL, NULL, NULL,
937 "gpio_109", NULL, NULL, "safe_mode"),
938 _OMAP3_MUXENTRY(CAM_D11, 110,
939 "cam_d11", NULL, NULL, NULL,
940 "gpio_110", NULL, NULL, "safe_mode"),
941 _OMAP3_MUXENTRY(CAM_D2, 101,
942 "cam_d2", NULL, NULL, NULL,
943 "gpio_101", NULL, NULL, "safe_mode"),
944 _OMAP3_MUXENTRY(CAM_D3, 102,
945 "cam_d3", NULL, NULL, NULL,
946 "gpio_102", NULL, NULL, "safe_mode"),
947 _OMAP3_MUXENTRY(CAM_D4, 103,
948 "cam_d4", NULL, NULL, NULL,
949 "gpio_103", NULL, NULL, "safe_mode"),
950 _OMAP3_MUXENTRY(CAM_D5, 104,
951 "cam_d5", NULL, NULL, NULL,
952 "gpio_104", NULL, NULL, "safe_mode"),
953 _OMAP3_MUXENTRY(CAM_FLD, 98,
954 "cam_fld", NULL, "cam_global_reset", NULL,
955 "gpio_98", NULL, NULL, "safe_mode"),
956 _OMAP3_MUXENTRY(CAM_HS, 94,
957 "cam_hs", NULL, NULL, NULL,
958 "gpio_94", NULL, NULL, "safe_mode"),
959 _OMAP3_MUXENTRY(CAM_PCLK, 97,
960 "cam_pclk", NULL, NULL, NULL,
961 "gpio_97", NULL, NULL, "safe_mode"),
962 _OMAP3_MUXENTRY(CAM_STROBE, 126,
963 "cam_strobe", NULL, NULL, NULL,
964 "gpio_126", NULL, NULL, "safe_mode"),
965 _OMAP3_MUXENTRY(CAM_VS, 95,
966 "cam_vs", NULL, NULL, NULL,
967 "gpio_95", NULL, NULL, "safe_mode"),
968 _OMAP3_MUXENTRY(CAM_WEN, 167,
969 "cam_wen", NULL, "cam_shutter", NULL,
970 "gpio_167", NULL, NULL, "safe_mode"),
971 _OMAP3_MUXENTRY(DSS_DATA6, 76,
972 "dss_data6", NULL, "uart1_tx", NULL,
973 "gpio_76", NULL, NULL, "safe_mode"),
974 _OMAP3_MUXENTRY(DSS_DATA7, 77,
975 "dss_data7", NULL, "uart1_rx", NULL,
976 "gpio_77", NULL, NULL, "safe_mode"),
977 _OMAP3_MUXENTRY(DSS_DATA8, 78,
978 "dss_data8", NULL, NULL, NULL,
979 "gpio_78", NULL, NULL, "safe_mode"),
980 _OMAP3_MUXENTRY(DSS_DATA9, 79,
981 "dss_data9", NULL, NULL, NULL,
982 "gpio_79", NULL, NULL, "safe_mode"),
983 _OMAP3_MUXENTRY(DSS_HSYNC, 67,
984 "dss_hsync", NULL, NULL, NULL,
985 "gpio_67", NULL, NULL, "safe_mode"),
986 _OMAP3_MUXENTRY(DSS_PCLK, 66,
987 "dss_pclk", NULL, NULL, NULL,
988 "gpio_66", NULL, NULL, "safe_mode"),
989 _OMAP3_MUXENTRY(ETK_CLK, 12,
990 "etk_clk", "mcbsp5_clkx", "sdmmc3_clk", "hsusb1_stp",
991 "gpio_12", "mm1_rxdp", "hsusb1_tll_stp", NULL),
992 _OMAP3_MUXENTRY(ETK_CTL, 13,
993 "etk_ctl", NULL, "sdmmc3_cmd", "hsusb1_clk",
994 "gpio_13", NULL, "hsusb1_tll_clk", NULL),
995 _OMAP3_MUXENTRY(ETK_D0, 14,
996 "etk_d0", "mcspi3_simo", "sdmmc3_dat4", "hsusb1_data0",
997 "gpio_14", "mm1_rxrcv", "hsusb1_tll_data0", NULL),
998 _OMAP3_MUXENTRY(ETK_D1, 15,
999 "etk_d1", "mcspi3_somi", NULL, "hsusb1_data1",
1000 "gpio_15", "mm1_txse0", "hsusb1_tll_data1", NULL),
1001 _OMAP3_MUXENTRY(ETK_D10, 24,
1002 "etk_d10", NULL, "uart1_rx", "hsusb2_clk",
1003 "gpio_24", NULL, "hsusb2_tll_clk", NULL),
1004 _OMAP3_MUXENTRY(ETK_D11, 25,
1005 "etk_d11", NULL, NULL, "hsusb2_stp",
1006 "gpio_25", "mm2_rxdp", "hsusb2_tll_stp", NULL),
1007 _OMAP3_MUXENTRY(ETK_D12, 26,
1008 "etk_d12", NULL, NULL, "hsusb2_dir",
1009 "gpio_26", NULL, "hsusb2_tll_dir", NULL),
1010 _OMAP3_MUXENTRY(ETK_D13, 27,
1011 "etk_d13", NULL, NULL, "hsusb2_nxt",
1012 "gpio_27", "mm2_rxdm", "hsusb2_tll_nxt", NULL),
1013 _OMAP3_MUXENTRY(ETK_D14, 28,
1014 "etk_d14", NULL, NULL, "hsusb2_data0",
1015 "gpio_28", "mm2_rxrcv", "hsusb2_tll_data0", NULL),
1016 _OMAP3_MUXENTRY(ETK_D15, 29,
1017 "etk_d15", NULL, NULL, "hsusb2_data1",
1018 "gpio_29", "mm2_txse0", "hsusb2_tll_data1", NULL),
1019 _OMAP3_MUXENTRY(ETK_D2, 16,
1020 "etk_d2", "mcspi3_cs0", NULL, "hsusb1_data2",
1021 "gpio_16", "mm1_txdat", "hsusb1_tll_data2", NULL),
1022 _OMAP3_MUXENTRY(ETK_D3, 17,
1023 "etk_d3", "mcspi3_clk", "sdmmc3_dat3", "hsusb1_data7",
1024 "gpio_17", NULL, "hsusb1_tll_data7", NULL),
1025 _OMAP3_MUXENTRY(ETK_D4, 18,
1026 "etk_d4", "mcbsp5_dr", "sdmmc3_dat0", "hsusb1_data4",
1027 "gpio_18", NULL, "hsusb1_tll_data4", NULL),
1028 _OMAP3_MUXENTRY(ETK_D5, 19,
1029 "etk_d5", "mcbsp5_fsx", "sdmmc3_dat1", "hsusb1_data5",
1030 "gpio_19", NULL, "hsusb1_tll_data5", NULL),
1031 _OMAP3_MUXENTRY(ETK_D6, 20,
1032 "etk_d6", "mcbsp5_dx", "sdmmc3_dat2", "hsusb1_data6",
1033 "gpio_20", NULL, "hsusb1_tll_data6", NULL),
1034 _OMAP3_MUXENTRY(ETK_D7, 21,
1035 "etk_d7", "mcspi3_cs1", "sdmmc3_dat7", "hsusb1_data3",
1036 "gpio_21", "mm1_txen_n", "hsusb1_tll_data3", NULL),
1037 _OMAP3_MUXENTRY(ETK_D8, 22,
1038 "etk_d8", "sys_drm_msecure", "sdmmc3_dat6", "hsusb1_dir",
1039 "gpio_22", NULL, "hsusb1_tll_dir", NULL),
1040 _OMAP3_MUXENTRY(ETK_D9, 23,
1041 "etk_d9", "sys_secure_indicator", "sdmmc3_dat5", "hsusb1_nxt",
1042 "gpio_23", "mm1_rxdm", "hsusb1_tll_nxt", NULL),
1043 _OMAP3_MUXENTRY(MCBSP3_CLKX, 142,
1044 "mcbsp3_clkx", "uart2_tx", NULL, NULL,
1045 "gpio_142", NULL, NULL, "safe_mode"),
1046 _OMAP3_MUXENTRY(MCBSP3_DR, 141,
1047 "mcbsp3_dr", "uart2_rts", NULL, NULL,
1048 "gpio_141", NULL, NULL, "safe_mode"),
1049 _OMAP3_MUXENTRY(MCBSP3_DX, 140,
1050 "mcbsp3_dx", "uart2_cts", NULL, NULL,
1051 "gpio_140", NULL, NULL, "safe_mode"),
1052 _OMAP3_MUXENTRY(MCBSP3_FSX, 143,
1053 "mcbsp3_fsx", "uart2_rx", NULL, NULL,
1054 "gpio_143", NULL, NULL, "safe_mode"),
1055 _OMAP3_MUXENTRY(SDMMC2_DAT5, 137,
1056 "sdmmc2_dat5", "sdmmc2_dir_dat1",
1057 "cam_global_reset", "sdmmc3_dat1",
1058 "gpio_137", NULL, NULL, "safe_mode"),
1059 _OMAP3_MUXENTRY(SDMMC2_DAT6, 138,
1060 "sdmmc2_dat6", "sdmmc2_dir_cmd", "cam_shutter", "sdmmc3_dat2",
1061 "gpio_138", NULL, NULL, "safe_mode"),
1062 _OMAP3_MUXENTRY(SDMMC2_DAT7, 139,
1063 "sdmmc2_dat7", "sdmmc2_clkin", NULL, "sdmmc3_dat3",
1064 "gpio_139", NULL, NULL, "safe_mode"),
1065 _OMAP3_MUXENTRY(UART1_CTS, 150,
1066 "uart1_cts", NULL, NULL, NULL,
1067 "gpio_150", NULL, NULL, "safe_mode"),
1068 { .reg_offset = OMAP_MUX_TERMINATOR },
1069};
1070#else
1071#define omap3_cus_subset NULL
1072#endif
1073
1074/*
1075 * Balls for CUS package
1076 * 423-pin s-PBGA Package, 0.65mm Ball Pitch (Bottom)
1077 */
1078#if defined(CONFIG_OMAP_MUX) && defined(CONFIG_DEBUG_FS) \
1079 && defined(CONFIG_OMAP_PACKAGE_CUS)
1080struct omap_ball __initdata omap3_cus_ball[] = {
1081 _OMAP3_BALLENTRY(CAM_D0, "ab18", NULL),
1082 _OMAP3_BALLENTRY(CAM_D1, "ac18", NULL),
1083 _OMAP3_BALLENTRY(CAM_D10, "f21", NULL),
1084 _OMAP3_BALLENTRY(CAM_D11, "g21", NULL),
1085 _OMAP3_BALLENTRY(CAM_D2, "g19", NULL),
1086 _OMAP3_BALLENTRY(CAM_D3, "f19", NULL),
1087 _OMAP3_BALLENTRY(CAM_D4, "g20", NULL),
1088 _OMAP3_BALLENTRY(CAM_D5, "b21", NULL),
1089 _OMAP3_BALLENTRY(CAM_D6, "l24", NULL),
1090 _OMAP3_BALLENTRY(CAM_D7, "k24", NULL),
1091 _OMAP3_BALLENTRY(CAM_D8, "j23", NULL),
1092 _OMAP3_BALLENTRY(CAM_D9, "k23", NULL),
1093 _OMAP3_BALLENTRY(CAM_FLD, "h24", NULL),
1094 _OMAP3_BALLENTRY(CAM_HS, "a22", NULL),
1095 _OMAP3_BALLENTRY(CAM_PCLK, "j19", NULL),
1096 _OMAP3_BALLENTRY(CAM_STROBE, "j20", NULL),
1097 _OMAP3_BALLENTRY(CAM_VS, "e18", NULL),
1098 _OMAP3_BALLENTRY(CAM_WEN, "f18", NULL),
1099 _OMAP3_BALLENTRY(CAM_XCLKA, "b22", NULL),
1100 _OMAP3_BALLENTRY(CAM_XCLKB, "c22", NULL),
1101 _OMAP3_BALLENTRY(DSS_ACBIAS, "j21", NULL),
1102 _OMAP3_BALLENTRY(DSS_DATA0, "ac19", NULL),
1103 _OMAP3_BALLENTRY(DSS_DATA1, "ab19", NULL),
1104 _OMAP3_BALLENTRY(DSS_DATA10, "ac22", NULL),
1105 _OMAP3_BALLENTRY(DSS_DATA11, "ac23", NULL),
1106 _OMAP3_BALLENTRY(DSS_DATA12, "ab22", NULL),
1107 _OMAP3_BALLENTRY(DSS_DATA13, "y22", NULL),
1108 _OMAP3_BALLENTRY(DSS_DATA14, "w22", NULL),
1109 _OMAP3_BALLENTRY(DSS_DATA15, "v22", NULL),
1110 _OMAP3_BALLENTRY(DSS_DATA16, "j22", NULL),
1111 _OMAP3_BALLENTRY(DSS_DATA17, "g23", NULL),
1112 _OMAP3_BALLENTRY(DSS_DATA18, "g24", NULL),
1113 _OMAP3_BALLENTRY(DSS_DATA19, "h23", NULL),
1114 _OMAP3_BALLENTRY(DSS_DATA2, "ad20", NULL),
1115 _OMAP3_BALLENTRY(DSS_DATA20, "d23", NULL),
1116 _OMAP3_BALLENTRY(DSS_DATA21, "k22", NULL),
1117 _OMAP3_BALLENTRY(DSS_DATA22, "v21", NULL),
1118 _OMAP3_BALLENTRY(DSS_DATA23, "w21", NULL),
1119 _OMAP3_BALLENTRY(DSS_DATA3, "ac20", NULL),
1120 _OMAP3_BALLENTRY(DSS_DATA4, "ad21", NULL),
1121 _OMAP3_BALLENTRY(DSS_DATA5, "ac21", NULL),
1122 _OMAP3_BALLENTRY(DSS_DATA6, "d24", NULL),
1123 _OMAP3_BALLENTRY(DSS_DATA7, "e23", NULL),
1124 _OMAP3_BALLENTRY(DSS_DATA8, "e24", NULL),
1125 _OMAP3_BALLENTRY(DSS_DATA9, "f23", NULL),
1126 _OMAP3_BALLENTRY(DSS_HSYNC, "e22", NULL),
1127 _OMAP3_BALLENTRY(DSS_PCLK, "g22", NULL),
1128 _OMAP3_BALLENTRY(DSS_VSYNC, "f22", NULL),
1129 _OMAP3_BALLENTRY(ETK_CLK, "ac1", NULL),
1130 _OMAP3_BALLENTRY(ETK_CTL, "ad3", NULL),
1131 _OMAP3_BALLENTRY(ETK_D0, "ad6", NULL),
1132 _OMAP3_BALLENTRY(ETK_D1, "ac6", NULL),
1133 _OMAP3_BALLENTRY(ETK_D10, "ac3", NULL),
1134 _OMAP3_BALLENTRY(ETK_D11, "ac9", NULL),
1135 _OMAP3_BALLENTRY(ETK_D12, "ac10", NULL),
1136 _OMAP3_BALLENTRY(ETK_D13, "ad11", NULL),
1137 _OMAP3_BALLENTRY(ETK_D14, "ac11", NULL),
1138 _OMAP3_BALLENTRY(ETK_D15, "ad12", NULL),
1139 _OMAP3_BALLENTRY(ETK_D2, "ac7", NULL),
1140 _OMAP3_BALLENTRY(ETK_D3, "ad8", NULL),
1141 _OMAP3_BALLENTRY(ETK_D4, "ac5", NULL),
1142 _OMAP3_BALLENTRY(ETK_D5, "ad2", NULL),
1143 _OMAP3_BALLENTRY(ETK_D6, "ac8", NULL),
1144 _OMAP3_BALLENTRY(ETK_D7, "ad9", NULL),
1145 _OMAP3_BALLENTRY(ETK_D8, "ac4", NULL),
1146 _OMAP3_BALLENTRY(ETK_D9, "ad5", NULL),
1147 _OMAP3_BALLENTRY(GPMC_A1, "k4", NULL),
1148 _OMAP3_BALLENTRY(GPMC_A10, "g2", NULL),
1149 _OMAP3_BALLENTRY(GPMC_A2, "k3", NULL),
1150 _OMAP3_BALLENTRY(GPMC_A3, "k2", NULL),
1151 _OMAP3_BALLENTRY(GPMC_A4, "j4", NULL),
1152 _OMAP3_BALLENTRY(GPMC_A5, "j3", NULL),
1153 _OMAP3_BALLENTRY(GPMC_A6, "j2", NULL),
1154 _OMAP3_BALLENTRY(GPMC_A7, "j1", NULL),
1155 _OMAP3_BALLENTRY(GPMC_A8, "h1", NULL),
1156 _OMAP3_BALLENTRY(GPMC_A9, "h2", NULL),
1157 _OMAP3_BALLENTRY(GPMC_CLK, "w2", NULL),
1158 _OMAP3_BALLENTRY(GPMC_D10, "u1", NULL),
1159 _OMAP3_BALLENTRY(GPMC_D11, "r3", NULL),
1160 _OMAP3_BALLENTRY(GPMC_D12, "t3", NULL),
1161 _OMAP3_BALLENTRY(GPMC_D13, "u2", NULL),
1162 _OMAP3_BALLENTRY(GPMC_D14, "v1", NULL),
1163 _OMAP3_BALLENTRY(GPMC_D15, "v2", NULL),
1164 _OMAP3_BALLENTRY(GPMC_D8, "r2", NULL),
1165 _OMAP3_BALLENTRY(GPMC_D9, "t2", NULL),
1166 _OMAP3_BALLENTRY(GPMC_NBE0_CLE, "k5", NULL),
1167 _OMAP3_BALLENTRY(GPMC_NBE1, "l1", NULL),
1168 _OMAP3_BALLENTRY(GPMC_NCS3, "d2", NULL),
1169 _OMAP3_BALLENTRY(GPMC_NCS4, "f4", NULL),
1170 _OMAP3_BALLENTRY(GPMC_NCS5, "g5", NULL),
1171 _OMAP3_BALLENTRY(GPMC_NCS6, "f3", NULL),
1172 _OMAP3_BALLENTRY(GPMC_NCS7, "g4", NULL),
1173 _OMAP3_BALLENTRY(GPMC_NWP, "e1", NULL),
1174 _OMAP3_BALLENTRY(GPMC_WAIT3, "c2", NULL),
1175 _OMAP3_BALLENTRY(HDQ_SIO, "a24", NULL),
1176 _OMAP3_BALLENTRY(HSUSB0_CLK, "r21", NULL),
1177 _OMAP3_BALLENTRY(HSUSB0_DATA0, "t24", NULL),
1178 _OMAP3_BALLENTRY(HSUSB0_DATA1, "t23", NULL),
1179 _OMAP3_BALLENTRY(HSUSB0_DATA2, "u24", NULL),
1180 _OMAP3_BALLENTRY(HSUSB0_DATA3, "u23", NULL),
1181 _OMAP3_BALLENTRY(HSUSB0_DATA4, "w24", NULL),
1182 _OMAP3_BALLENTRY(HSUSB0_DATA5, "v23", NULL),
1183 _OMAP3_BALLENTRY(HSUSB0_DATA6, "w23", NULL),
1184 _OMAP3_BALLENTRY(HSUSB0_DATA7, "t22", NULL),
1185 _OMAP3_BALLENTRY(HSUSB0_DIR, "p23", NULL),
1186 _OMAP3_BALLENTRY(HSUSB0_NXT, "r22", NULL),
1187 _OMAP3_BALLENTRY(HSUSB0_STP, "r23", NULL),
1188 _OMAP3_BALLENTRY(I2C2_SCL, "ac15", NULL),
1189 _OMAP3_BALLENTRY(I2C2_SDA, "ac14", NULL),
1190 _OMAP3_BALLENTRY(I2C3_SCL, "ac13", NULL),
1191 _OMAP3_BALLENTRY(I2C3_SDA, "ac12", NULL),
1192 _OMAP3_BALLENTRY(I2C4_SCL, "y16", NULL),
1193 _OMAP3_BALLENTRY(I2C4_SDA, "y15", NULL),
1194 _OMAP3_BALLENTRY(JTAG_EMU0, "ac24", NULL),
1195 _OMAP3_BALLENTRY(JTAG_EMU1, "ad24", NULL),
1196 _OMAP3_BALLENTRY(MCBSP1_CLKR, "w19", NULL),
1197 _OMAP3_BALLENTRY(MCBSP1_CLKX, "v18", NULL),
1198 _OMAP3_BALLENTRY(MCBSP1_DR, "y18", NULL),
1199 _OMAP3_BALLENTRY(MCBSP1_DX, "w18", NULL),
1200 _OMAP3_BALLENTRY(MCBSP1_FSR, "ab20", NULL),
1201 _OMAP3_BALLENTRY(MCBSP1_FSX, "aa19", NULL),
1202 _OMAP3_BALLENTRY(MCBSP2_CLKX, "t21", NULL),
1203 _OMAP3_BALLENTRY(MCBSP2_DR, "v19", NULL),
1204 _OMAP3_BALLENTRY(MCBSP2_DX, "r20", NULL),
1205 _OMAP3_BALLENTRY(MCBSP2_FSX, "v20", NULL),
1206 _OMAP3_BALLENTRY(MCBSP3_CLKX, "w4", NULL),
1207 _OMAP3_BALLENTRY(MCBSP3_DR, "v5", NULL),
1208 _OMAP3_BALLENTRY(MCBSP3_DX, "v6", NULL),
1209 _OMAP3_BALLENTRY(MCBSP3_FSX, "v4", NULL),
1210 _OMAP3_BALLENTRY(MCBSP_CLKS, "aa18", NULL),
1211 _OMAP3_BALLENTRY(MCSPI1_CLK, "t5", NULL),
1212 _OMAP3_BALLENTRY(MCSPI1_CS0, "t6", NULL),
1213 _OMAP3_BALLENTRY(MCSPI1_CS3, "r5", NULL),
1214 _OMAP3_BALLENTRY(MCSPI1_SIMO, "r4", NULL),
1215 _OMAP3_BALLENTRY(MCSPI1_SOMI, "t4", NULL),
1216 _OMAP3_BALLENTRY(MCSPI2_CLK, "n5", NULL),
1217 _OMAP3_BALLENTRY(MCSPI2_CS0, "m5", NULL),
1218 _OMAP3_BALLENTRY(MCSPI2_CS1, "m4", NULL),
1219 _OMAP3_BALLENTRY(MCSPI2_SIMO, "n4", NULL),
1220 _OMAP3_BALLENTRY(MCSPI2_SOMI, "n3", NULL),
1221 _OMAP3_BALLENTRY(SDMMC1_CLK, "m23", NULL),
1222 _OMAP3_BALLENTRY(SDMMC1_CMD, "l23", NULL),
1223 _OMAP3_BALLENTRY(SDMMC1_DAT0, "m22", NULL),
1224 _OMAP3_BALLENTRY(SDMMC1_DAT1, "m21", NULL),
1225 _OMAP3_BALLENTRY(SDMMC1_DAT2, "m20", NULL),
1226 _OMAP3_BALLENTRY(SDMMC1_DAT3, "n23", NULL),
1227 _OMAP3_BALLENTRY(SDMMC1_DAT4, "n22", NULL),
1228 _OMAP3_BALLENTRY(SDMMC1_DAT5, "n21", NULL),
1229 _OMAP3_BALLENTRY(SDMMC1_DAT6, "n20", NULL),
1230 _OMAP3_BALLENTRY(SDMMC1_DAT7, "p24", NULL),
1231 _OMAP3_BALLENTRY(SDMMC2_CLK, "y1", NULL),
1232 _OMAP3_BALLENTRY(SDMMC2_CMD, "ab5", NULL),
1233 _OMAP3_BALLENTRY(SDMMC2_DAT0, "ab3", NULL),
1234 _OMAP3_BALLENTRY(SDMMC2_DAT1, "y3", NULL),
1235 _OMAP3_BALLENTRY(SDMMC2_DAT2, "w3", NULL),
1236 _OMAP3_BALLENTRY(SDMMC2_DAT3, "v3", NULL),
1237 _OMAP3_BALLENTRY(SDMMC2_DAT4, "ab2", NULL),
1238 _OMAP3_BALLENTRY(SDMMC2_DAT5, "aa2", NULL),
1239 _OMAP3_BALLENTRY(SDMMC2_DAT6, "y2", NULL),
1240 _OMAP3_BALLENTRY(SDMMC2_DAT7, "aa1", NULL),
1241 _OMAP3_BALLENTRY(SYS_BOOT0, "ab12", NULL),
1242 _OMAP3_BALLENTRY(SYS_BOOT1, "ac16", NULL),
1243 _OMAP3_BALLENTRY(SYS_BOOT2, "ad17", NULL),
1244 _OMAP3_BALLENTRY(SYS_BOOT3, "ad18", NULL),
1245 _OMAP3_BALLENTRY(SYS_BOOT4, "ac17", NULL),
1246 _OMAP3_BALLENTRY(SYS_BOOT5, "ab16", NULL),
1247 _OMAP3_BALLENTRY(SYS_BOOT6, "aa15", NULL),
1248 _OMAP3_BALLENTRY(SYS_CLKOUT1, "y7", NULL),
1249 _OMAP3_BALLENTRY(SYS_CLKOUT2, "aa6", NULL),
1250 _OMAP3_BALLENTRY(SYS_CLKREQ, "y13", NULL),
1251 _OMAP3_BALLENTRY(SYS_NIRQ, "w16", NULL),
1252 _OMAP3_BALLENTRY(SYS_NRESWARM, "y10", NULL),
1253 _OMAP3_BALLENTRY(SYS_OFF_MODE, "ad23", NULL),
1254 _OMAP3_BALLENTRY(UART1_CTS, "ac2", NULL),
1255 _OMAP3_BALLENTRY(UART1_RTS, "w6", NULL),
1256 _OMAP3_BALLENTRY(UART1_RX, "v7", NULL),
1257 _OMAP3_BALLENTRY(UART1_TX, "w7", NULL),
1258 _OMAP3_BALLENTRY(UART3_CTS_RCTX, "a23", NULL),
1259 _OMAP3_BALLENTRY(UART3_RTS_SD, "b23", NULL),
1260 _OMAP3_BALLENTRY(UART3_RX_IRRX, "b24", NULL),
1261 _OMAP3_BALLENTRY(UART3_TX_IRTX, "c23", NULL),
1262 { .reg_offset = OMAP_MUX_TERMINATOR },
1263};
1264#else
1265#define omap3_cus_ball NULL
1266#endif
1267
1268/*
1269 * Signals different on CBB package comapared to superset
1270 */
1271#if defined(CONFIG_OMAP_MUX) && defined(CONFIG_OMAP_PACKAGE_CBB)
1272struct omap_mux __initdata omap3_cbb_subset[] = {
1273 _OMAP3_MUXENTRY(CAM_D10, 109,
1274 "cam_d10", NULL, NULL, NULL,
1275 "gpio_109", NULL, NULL, "safe_mode"),
1276 _OMAP3_MUXENTRY(CAM_D11, 110,
1277 "cam_d11", NULL, NULL, NULL,
1278 "gpio_110", NULL, NULL, "safe_mode"),
1279 _OMAP3_MUXENTRY(CAM_D2, 101,
1280 "cam_d2", NULL, NULL, NULL,
1281 "gpio_101", NULL, NULL, "safe_mode"),
1282 _OMAP3_MUXENTRY(CAM_D3, 102,
1283 "cam_d3", NULL, NULL, NULL,
1284 "gpio_102", NULL, NULL, "safe_mode"),
1285 _OMAP3_MUXENTRY(CAM_D4, 103,
1286 "cam_d4", NULL, NULL, NULL,
1287 "gpio_103", NULL, NULL, "safe_mode"),
1288 _OMAP3_MUXENTRY(CAM_D5, 104,
1289 "cam_d5", NULL, NULL, NULL,
1290 "gpio_104", NULL, NULL, "safe_mode"),
1291 _OMAP3_MUXENTRY(CAM_FLD, 98,
1292 "cam_fld", NULL, "cam_global_reset", NULL,
1293 "gpio_98", NULL, NULL, "safe_mode"),
1294 _OMAP3_MUXENTRY(CAM_HS, 94,
1295 "cam_hs", NULL, NULL, NULL,
1296 "gpio_94", NULL, NULL, "safe_mode"),
1297 _OMAP3_MUXENTRY(CAM_PCLK, 97,
1298 "cam_pclk", NULL, NULL, NULL,
1299 "gpio_97", NULL, NULL, "safe_mode"),
1300 _OMAP3_MUXENTRY(CAM_STROBE, 126,
1301 "cam_strobe", NULL, NULL, NULL,
1302 "gpio_126", NULL, NULL, "safe_mode"),
1303 _OMAP3_MUXENTRY(CAM_VS, 95,
1304 "cam_vs", NULL, NULL, NULL,
1305 "gpio_95", NULL, NULL, "safe_mode"),
1306 _OMAP3_MUXENTRY(CAM_WEN, 167,
1307 "cam_wen", NULL, "cam_shutter", NULL,
1308 "gpio_167", NULL, NULL, "safe_mode"),
1309 _OMAP3_MUXENTRY(DSS_DATA6, 76,
1310 "dss_data6", NULL, "uart1_tx", NULL,
1311 "gpio_76", NULL, NULL, "safe_mode"),
1312 _OMAP3_MUXENTRY(DSS_DATA7, 77,
1313 "dss_data7", NULL, "uart1_rx", NULL,
1314 "gpio_77", NULL, NULL, "safe_mode"),
1315 _OMAP3_MUXENTRY(DSS_DATA8, 78,
1316 "dss_data8", NULL, NULL, NULL,
1317 "gpio_78", NULL, NULL, "safe_mode"),
1318 _OMAP3_MUXENTRY(DSS_DATA9, 79,
1319 "dss_data9", NULL, NULL, NULL,
1320 "gpio_79", NULL, NULL, "safe_mode"),
1321 _OMAP3_MUXENTRY(DSS_HSYNC, 67,
1322 "dss_hsync", NULL, NULL, NULL,
1323 "gpio_67", NULL, NULL, "safe_mode"),
1324 _OMAP3_MUXENTRY(DSS_PCLK, 66,
1325 "dss_pclk", NULL, NULL, NULL,
1326 "gpio_66", NULL, NULL, "safe_mode"),
1327 _OMAP3_MUXENTRY(ETK_CLK, 12,
1328 "etk_clk", "mcbsp5_clkx", "sdmmc3_clk", "hsusb1_stp",
1329 "gpio_12", "mm1_rxdp", "hsusb1_tll_stp", NULL),
1330 _OMAP3_MUXENTRY(ETK_CTL, 13,
1331 "etk_ctl", NULL, "sdmmc3_cmd", "hsusb1_clk",
1332 "gpio_13", NULL, "hsusb1_tll_clk", NULL),
1333 _OMAP3_MUXENTRY(ETK_D0, 14,
1334 "etk_d0", "mcspi3_simo", "sdmmc3_dat4", "hsusb1_data0",
1335 "gpio_14", "mm1_rxrcv", "hsusb1_tll_data0", NULL),
1336 _OMAP3_MUXENTRY(ETK_D1, 15,
1337 "etk_d1", "mcspi3_somi", NULL, "hsusb1_data1",
1338 "gpio_15", "mm1_txse0", "hsusb1_tll_data1", NULL),
1339 _OMAP3_MUXENTRY(ETK_D10, 24,
1340 "etk_d10", NULL, "uart1_rx", "hsusb2_clk",
1341 "gpio_24", NULL, "hsusb2_tll_clk", NULL),
1342 _OMAP3_MUXENTRY(ETK_D11, 25,
1343 "etk_d11", NULL, NULL, "hsusb2_stp",
1344 "gpio_25", "mm2_rxdp", "hsusb2_tll_stp", NULL),
1345 _OMAP3_MUXENTRY(ETK_D12, 26,
1346 "etk_d12", NULL, NULL, "hsusb2_dir",
1347 "gpio_26", NULL, "hsusb2_tll_dir", NULL),
1348 _OMAP3_MUXENTRY(ETK_D13, 27,
1349 "etk_d13", NULL, NULL, "hsusb2_nxt",
1350 "gpio_27", "mm2_rxdm", "hsusb2_tll_nxt", NULL),
1351 _OMAP3_MUXENTRY(ETK_D14, 28,
1352 "etk_d14", NULL, NULL, "hsusb2_data0",
1353 "gpio_28", "mm2_rxrcv", "hsusb2_tll_data0", NULL),
1354 _OMAP3_MUXENTRY(ETK_D15, 29,
1355 "etk_d15", NULL, NULL, "hsusb2_data1",
1356 "gpio_29", "mm2_txse0", "hsusb2_tll_data1", NULL),
1357 _OMAP3_MUXENTRY(ETK_D2, 16,
1358 "etk_d2", "mcspi3_cs0", NULL, "hsusb1_data2",
1359 "gpio_16", "mm1_txdat", "hsusb1_tll_data2", NULL),
1360 _OMAP3_MUXENTRY(ETK_D3, 17,
1361 "etk_d3", "mcspi3_clk", "sdmmc3_dat3", "hsusb1_data7",
1362 "gpio_17", NULL, "hsusb1_tll_data7", NULL),
1363 _OMAP3_MUXENTRY(ETK_D4, 18,
1364 "etk_d4", "mcbsp5_dr", "sdmmc3_dat0", "hsusb1_data4",
1365 "gpio_18", NULL, "hsusb1_tll_data4", NULL),
1366 _OMAP3_MUXENTRY(ETK_D5, 19,
1367 "etk_d5", "mcbsp5_fsx", "sdmmc3_dat1", "hsusb1_data5",
1368 "gpio_19", NULL, "hsusb1_tll_data5", NULL),
1369 _OMAP3_MUXENTRY(ETK_D6, 20,
1370 "etk_d6", "mcbsp5_dx", "sdmmc3_dat2", "hsusb1_data6",
1371 "gpio_20", NULL, "hsusb1_tll_data6", NULL),
1372 _OMAP3_MUXENTRY(ETK_D7, 21,
1373 "etk_d7", "mcspi3_cs1", "sdmmc3_dat7", "hsusb1_data3",
1374 "gpio_21", "mm1_txen_n", "hsusb1_tll_data3", NULL),
1375 _OMAP3_MUXENTRY(ETK_D8, 22,
1376 "etk_d8", "sys_drm_msecure", "sdmmc3_dat6", "hsusb1_dir",
1377 "gpio_22", NULL, "hsusb1_tll_dir", NULL),
1378 _OMAP3_MUXENTRY(ETK_D9, 23,
1379 "etk_d9", "sys_secure_indicator", "sdmmc3_dat5", "hsusb1_nxt",
1380 "gpio_23", "mm1_rxdm", "hsusb1_tll_nxt", NULL),
1381 { .reg_offset = OMAP_MUX_TERMINATOR },
1382};
1383#else
1384#define omap3_cbb_subset NULL
1385#endif
1386
1387/*
1388 * Balls for CBB package
1389 * 515-pin s-PBGA Package, 0.50mm Ball Pitch (Top), 0.40mm Ball Pitch (Bottom)
1390 */
1391#if defined(CONFIG_OMAP_MUX) && defined(CONFIG_DEBUG_FS) \
1392 && defined(CONFIG_OMAP_PACKAGE_CBB)
1393struct omap_ball __initdata omap3_cbb_ball[] = {
1394 _OMAP3_BALLENTRY(CAM_D0, "ag17", NULL),
1395 _OMAP3_BALLENTRY(CAM_D1, "ah17", NULL),
1396 _OMAP3_BALLENTRY(CAM_D10, "b25", NULL),
1397 _OMAP3_BALLENTRY(CAM_D11, "c26", NULL),
1398 _OMAP3_BALLENTRY(CAM_D2, "b24", NULL),
1399 _OMAP3_BALLENTRY(CAM_D3, "c24", NULL),
1400 _OMAP3_BALLENTRY(CAM_D4, "d24", NULL),
1401 _OMAP3_BALLENTRY(CAM_D5, "a25", NULL),
1402 _OMAP3_BALLENTRY(CAM_D6, "k28", NULL),
1403 _OMAP3_BALLENTRY(CAM_D7, "l28", NULL),
1404 _OMAP3_BALLENTRY(CAM_D8, "k27", NULL),
1405 _OMAP3_BALLENTRY(CAM_D9, "l27", NULL),
1406 _OMAP3_BALLENTRY(CAM_FLD, "c23", NULL),
1407 _OMAP3_BALLENTRY(CAM_HS, "a24", NULL),
1408 _OMAP3_BALLENTRY(CAM_PCLK, "c27", NULL),
1409 _OMAP3_BALLENTRY(CAM_STROBE, "d25", NULL),
1410 _OMAP3_BALLENTRY(CAM_VS, "a23", NULL),
1411 _OMAP3_BALLENTRY(CAM_WEN, "b23", NULL),
1412 _OMAP3_BALLENTRY(CAM_XCLKA, "c25", NULL),
1413 _OMAP3_BALLENTRY(CAM_XCLKB, "b26", NULL),
1414 _OMAP3_BALLENTRY(CSI2_DX0, "ag19", NULL),
1415 _OMAP3_BALLENTRY(CSI2_DX1, "ag18", NULL),
1416 _OMAP3_BALLENTRY(CSI2_DY0, "ah19", NULL),
1417 _OMAP3_BALLENTRY(CSI2_DY1, "ah18", NULL),
1418 _OMAP3_BALLENTRY(DSS_ACBIAS, "e27", NULL),
1419 _OMAP3_BALLENTRY(DSS_DATA0, "ag22", NULL),
1420 _OMAP3_BALLENTRY(DSS_DATA1, "ah22", NULL),
1421 _OMAP3_BALLENTRY(DSS_DATA10, "ad28", NULL),
1422 _OMAP3_BALLENTRY(DSS_DATA11, "ad27", NULL),
1423 _OMAP3_BALLENTRY(DSS_DATA12, "ab28", NULL),
1424 _OMAP3_BALLENTRY(DSS_DATA13, "ab27", NULL),
1425 _OMAP3_BALLENTRY(DSS_DATA14, "aa28", NULL),
1426 _OMAP3_BALLENTRY(DSS_DATA15, "aa27", NULL),
1427 _OMAP3_BALLENTRY(DSS_DATA16, "g25", NULL),
1428 _OMAP3_BALLENTRY(DSS_DATA17, "h27", NULL),
1429 _OMAP3_BALLENTRY(DSS_DATA18, "h26", NULL),
1430 _OMAP3_BALLENTRY(DSS_DATA19, "h25", NULL),
1431 _OMAP3_BALLENTRY(DSS_DATA2, "ag23", NULL),
1432 _OMAP3_BALLENTRY(DSS_DATA20, "e28", NULL),
1433 _OMAP3_BALLENTRY(DSS_DATA21, "j26", NULL),
1434 _OMAP3_BALLENTRY(DSS_DATA22, "ac27", NULL),
1435 _OMAP3_BALLENTRY(DSS_DATA23, "ac28", NULL),
1436 _OMAP3_BALLENTRY(DSS_DATA3, "ah23", NULL),
1437 _OMAP3_BALLENTRY(DSS_DATA4, "ag24", NULL),
1438 _OMAP3_BALLENTRY(DSS_DATA5, "ah24", NULL),
1439 _OMAP3_BALLENTRY(DSS_DATA6, "e26", NULL),
1440 _OMAP3_BALLENTRY(DSS_DATA7, "f28", NULL),
1441 _OMAP3_BALLENTRY(DSS_DATA8, "f27", NULL),
1442 _OMAP3_BALLENTRY(DSS_DATA9, "g26", NULL),
1443 _OMAP3_BALLENTRY(DSS_HSYNC, "d26", NULL),
1444 _OMAP3_BALLENTRY(DSS_PCLK, "d28", NULL),
1445 _OMAP3_BALLENTRY(DSS_VSYNC, "d27", NULL),
1446 _OMAP3_BALLENTRY(ETK_CLK, "af10", NULL),
1447 _OMAP3_BALLENTRY(ETK_CTL, "ae10", NULL),
1448 _OMAP3_BALLENTRY(ETK_D0, "af11", NULL),
1449 _OMAP3_BALLENTRY(ETK_D1, "ag12", NULL),
1450 _OMAP3_BALLENTRY(ETK_D10, "ae7", NULL),
1451 _OMAP3_BALLENTRY(ETK_D11, "af7", NULL),
1452 _OMAP3_BALLENTRY(ETK_D12, "ag7", NULL),
1453 _OMAP3_BALLENTRY(ETK_D13, "ah7", NULL),
1454 _OMAP3_BALLENTRY(ETK_D14, "ag8", NULL),
1455 _OMAP3_BALLENTRY(ETK_D15, "ah8", NULL),
1456 _OMAP3_BALLENTRY(ETK_D2, "ah12", NULL),
1457 _OMAP3_BALLENTRY(ETK_D3, "ae13", NULL),
1458 _OMAP3_BALLENTRY(ETK_D4, "ae11", NULL),
1459 _OMAP3_BALLENTRY(ETK_D5, "ah9", NULL),
1460 _OMAP3_BALLENTRY(ETK_D6, "af13", NULL),
1461 _OMAP3_BALLENTRY(ETK_D7, "ah14", NULL),
1462 _OMAP3_BALLENTRY(ETK_D8, "af9", NULL),
1463 _OMAP3_BALLENTRY(ETK_D9, "ag9", NULL),
1464 _OMAP3_BALLENTRY(GPMC_A1, "n4", "ac15"),
1465 _OMAP3_BALLENTRY(GPMC_A10, "k3", "ab19"),
1466 _OMAP3_BALLENTRY(GPMC_A2, "m4", "ab15"),
1467 _OMAP3_BALLENTRY(GPMC_A3, "l4", "ac16"),
1468 _OMAP3_BALLENTRY(GPMC_A4, "k4", "ab16"),
1469 _OMAP3_BALLENTRY(GPMC_A5, "t3", "ac17"),
1470 _OMAP3_BALLENTRY(GPMC_A6, "r3", "ab17"),
1471 _OMAP3_BALLENTRY(GPMC_A7, "n3", "ac18"),
1472 _OMAP3_BALLENTRY(GPMC_A8, "m3", "ab18"),
1473 _OMAP3_BALLENTRY(GPMC_A9, "l3", "ac19"),
1474 _OMAP3_BALLENTRY(GPMC_CLK, "t4", "w2"),
1475 _OMAP3_BALLENTRY(GPMC_D10, "p1", "ab4"),
1476 _OMAP3_BALLENTRY(GPMC_D11, "r1", "ac4"),
1477 _OMAP3_BALLENTRY(GPMC_D12, "r2", "ab6"),
1478 _OMAP3_BALLENTRY(GPMC_D13, "t2", "ac6"),
1479 _OMAP3_BALLENTRY(GPMC_D14, "w1", "ab7"),
1480 _OMAP3_BALLENTRY(GPMC_D15, "y1", "ac7"),
1481 _OMAP3_BALLENTRY(GPMC_D8, "h2", "ab3"),
1482 _OMAP3_BALLENTRY(GPMC_D9, "k2", "ac3"),
1483 _OMAP3_BALLENTRY(GPMC_NBE0_CLE, "g3", "ac12"),
1484 _OMAP3_BALLENTRY(GPMC_NBE1, "u3", NULL),
1485 _OMAP3_BALLENTRY(GPMC_NCS1, "h3", "y1"),
1486 _OMAP3_BALLENTRY(GPMC_NCS2, "v8", NULL),
1487 _OMAP3_BALLENTRY(GPMC_NCS3, "u8", NULL),
1488 _OMAP3_BALLENTRY(GPMC_NCS4, "t8", NULL),
1489 _OMAP3_BALLENTRY(GPMC_NCS5, "r8", NULL),
1490 _OMAP3_BALLENTRY(GPMC_NCS6, "p8", NULL),
1491 _OMAP3_BALLENTRY(GPMC_NCS7, "n8", NULL),
1492 _OMAP3_BALLENTRY(GPMC_NWP, "h1", "ab10"),
1493 _OMAP3_BALLENTRY(GPMC_WAIT1, "l8", "ac10"),
1494 _OMAP3_BALLENTRY(GPMC_WAIT2, "k8", NULL),
1495 _OMAP3_BALLENTRY(GPMC_WAIT3, "j8", NULL),
1496 _OMAP3_BALLENTRY(HDQ_SIO, "j25", NULL),
1497 _OMAP3_BALLENTRY(HSUSB0_CLK, "t28", NULL),
1498 _OMAP3_BALLENTRY(HSUSB0_DATA0, "t27", NULL),
1499 _OMAP3_BALLENTRY(HSUSB0_DATA1, "u28", NULL),
1500 _OMAP3_BALLENTRY(HSUSB0_DATA2, "u27", NULL),
1501 _OMAP3_BALLENTRY(HSUSB0_DATA3, "u26", NULL),
1502 _OMAP3_BALLENTRY(HSUSB0_DATA4, "u25", NULL),
1503 _OMAP3_BALLENTRY(HSUSB0_DATA5, "v28", NULL),
1504 _OMAP3_BALLENTRY(HSUSB0_DATA6, "v27", NULL),
1505 _OMAP3_BALLENTRY(HSUSB0_DATA7, "v26", NULL),
1506 _OMAP3_BALLENTRY(HSUSB0_DIR, "r28", NULL),
1507 _OMAP3_BALLENTRY(HSUSB0_NXT, "t26", NULL),
1508 _OMAP3_BALLENTRY(HSUSB0_STP, "t25", NULL),
1509 _OMAP3_BALLENTRY(I2C2_SCL, "af15", NULL),
1510 _OMAP3_BALLENTRY(I2C2_SDA, "ae15", NULL),
1511 _OMAP3_BALLENTRY(I2C3_SCL, "af14", NULL),
1512 _OMAP3_BALLENTRY(I2C3_SDA, "ag14", NULL),
1513 _OMAP3_BALLENTRY(I2C4_SCL, "ad26", NULL),
1514 _OMAP3_BALLENTRY(I2C4_SDA, "ae26", NULL),
1515 _OMAP3_BALLENTRY(JTAG_EMU0, "aa11", NULL),
1516 _OMAP3_BALLENTRY(JTAG_EMU1, "aa10", NULL),
1517 _OMAP3_BALLENTRY(MCBSP1_CLKR, "y21", NULL),
1518 _OMAP3_BALLENTRY(MCBSP1_CLKX, "w21", NULL),
1519 _OMAP3_BALLENTRY(MCBSP1_DR, "u21", NULL),
1520 _OMAP3_BALLENTRY(MCBSP1_DX, "v21", NULL),
1521 _OMAP3_BALLENTRY(MCBSP1_FSR, "aa21", NULL),
1522 _OMAP3_BALLENTRY(MCBSP1_FSX, "k26", NULL),
1523 _OMAP3_BALLENTRY(MCBSP2_CLKX, "n21", NULL),
1524 _OMAP3_BALLENTRY(MCBSP2_DR, "r21", NULL),
1525 _OMAP3_BALLENTRY(MCBSP2_DX, "m21", NULL),
1526 _OMAP3_BALLENTRY(MCBSP2_FSX, "p21", NULL),
1527 _OMAP3_BALLENTRY(MCBSP3_CLKX, "af5", NULL),
1528 _OMAP3_BALLENTRY(MCBSP3_DR, "ae6", NULL),
1529 _OMAP3_BALLENTRY(MCBSP3_DX, "af6", NULL),
1530 _OMAP3_BALLENTRY(MCBSP3_FSX, "ae5", NULL),
1531 _OMAP3_BALLENTRY(MCBSP4_CLKX, "ae1", NULL),
1532 _OMAP3_BALLENTRY(MCBSP4_DR, "ad1", NULL),
1533 _OMAP3_BALLENTRY(MCBSP4_DX, "ad2", NULL),
1534 _OMAP3_BALLENTRY(MCBSP4_FSX, "ac1", NULL),
1535 _OMAP3_BALLENTRY(MCBSP_CLKS, "t21", NULL),
1536 _OMAP3_BALLENTRY(MCSPI1_CLK, "ab3", NULL),
1537 _OMAP3_BALLENTRY(MCSPI1_CS0, "ac2", NULL),
1538 _OMAP3_BALLENTRY(MCSPI1_CS1, "ac3", NULL),
1539 _OMAP3_BALLENTRY(MCSPI1_CS2, "ab1", NULL),
1540 _OMAP3_BALLENTRY(MCSPI1_CS3, "ab2", NULL),
1541 _OMAP3_BALLENTRY(MCSPI1_SIMO, "ab4", NULL),
1542 _OMAP3_BALLENTRY(MCSPI1_SOMI, "aa4", NULL),
1543 _OMAP3_BALLENTRY(MCSPI2_CLK, "aa3", NULL),
1544 _OMAP3_BALLENTRY(MCSPI2_CS0, "y4", NULL),
1545 _OMAP3_BALLENTRY(MCSPI2_CS1, "v3", NULL),
1546 _OMAP3_BALLENTRY(MCSPI2_SIMO, "y2", NULL),
1547 _OMAP3_BALLENTRY(MCSPI2_SOMI, "y3", NULL),
1548 _OMAP3_BALLENTRY(SDMMC1_CLK, "n28", NULL),
1549 _OMAP3_BALLENTRY(SDMMC1_CMD, "m27", NULL),
1550 _OMAP3_BALLENTRY(SDMMC1_DAT0, "n27", NULL),
1551 _OMAP3_BALLENTRY(SDMMC1_DAT1, "n26", NULL),
1552 _OMAP3_BALLENTRY(SDMMC1_DAT2, "n25", NULL),
1553 _OMAP3_BALLENTRY(SDMMC1_DAT3, "p28", NULL),
1554 _OMAP3_BALLENTRY(SDMMC1_DAT4, "p27", NULL),
1555 _OMAP3_BALLENTRY(SDMMC1_DAT5, "p26", NULL),
1556 _OMAP3_BALLENTRY(SDMMC1_DAT6, "r27", NULL),
1557 _OMAP3_BALLENTRY(SDMMC1_DAT7, "r25", NULL),
1558 _OMAP3_BALLENTRY(SDMMC2_CLK, "ae2", NULL),
1559 _OMAP3_BALLENTRY(SDMMC2_CMD, "ag5", NULL),
1560 _OMAP3_BALLENTRY(SDMMC2_DAT0, "ah5", NULL),
1561 _OMAP3_BALLENTRY(SDMMC2_DAT1, "ah4", NULL),
1562 _OMAP3_BALLENTRY(SDMMC2_DAT2, "ag4", NULL),
1563 _OMAP3_BALLENTRY(SDMMC2_DAT3, "af4", NULL),
1564 _OMAP3_BALLENTRY(SDMMC2_DAT4, "ae4", NULL),
1565 _OMAP3_BALLENTRY(SDMMC2_DAT5, "ah3", NULL),
1566 _OMAP3_BALLENTRY(SDMMC2_DAT6, "af3", NULL),
1567 _OMAP3_BALLENTRY(SDMMC2_DAT7, "ae3", NULL),
1568 _OMAP3_BALLENTRY(SYS_BOOT0, "ah26", NULL),
1569 _OMAP3_BALLENTRY(SYS_BOOT1, "ag26", NULL),
1570 _OMAP3_BALLENTRY(SYS_BOOT2, "ae14", NULL),
1571 _OMAP3_BALLENTRY(SYS_BOOT3, "af18", NULL),
1572 _OMAP3_BALLENTRY(SYS_BOOT4, "af19", NULL),
1573 _OMAP3_BALLENTRY(SYS_BOOT5, "ae21", NULL),
1574 _OMAP3_BALLENTRY(SYS_BOOT6, "af21", NULL),
1575 _OMAP3_BALLENTRY(SYS_CLKOUT1, "ag25", NULL),
1576 _OMAP3_BALLENTRY(SYS_CLKOUT2, "ae22", NULL),
1577 _OMAP3_BALLENTRY(SYS_CLKREQ, "af25", NULL),
1578 _OMAP3_BALLENTRY(SYS_NIRQ, "af26", NULL),
1579 _OMAP3_BALLENTRY(SYS_NRESWARM, "af24", NULL),
1580 _OMAP3_BALLENTRY(SYS_OFF_MODE, "af22", NULL),
1581 _OMAP3_BALLENTRY(UART1_CTS, "w8", NULL),
1582 _OMAP3_BALLENTRY(UART1_RTS, "aa9", NULL),
1583 _OMAP3_BALLENTRY(UART1_RX, "y8", NULL),
1584 _OMAP3_BALLENTRY(UART1_TX, "aa8", NULL),
1585 _OMAP3_BALLENTRY(UART2_CTS, "ab26", NULL),
1586 _OMAP3_BALLENTRY(UART2_RTS, "ab25", NULL),
1587 _OMAP3_BALLENTRY(UART2_RX, "ad25", NULL),
1588 _OMAP3_BALLENTRY(UART2_TX, "aa25", NULL),
1589 _OMAP3_BALLENTRY(UART3_CTS_RCTX, "h18", NULL),
1590 _OMAP3_BALLENTRY(UART3_RTS_SD, "h19", NULL),
1591 _OMAP3_BALLENTRY(UART3_RX_IRRX, "h20", NULL),
1592 _OMAP3_BALLENTRY(UART3_TX_IRTX, "h21", NULL),
1593 { .reg_offset = OMAP_MUX_TERMINATOR },
1594};
1595#else
1596#define omap3_cbb_ball NULL
1597#endif
1598
1599/*
1600 * Signals different on 36XX CBP package comapared to 34XX CBC package
1601 */
1602#if defined(CONFIG_OMAP_MUX) && defined(CONFIG_OMAP_PACKAGE_CBP)
1603struct omap_mux __initdata omap36xx_cbp_subset[] = {
1604 _OMAP3_MUXENTRY(CAM_D0, 99,
1605 "cam_d0", NULL, "csi2_dx2", NULL,
1606 "gpio_99", NULL, NULL, "safe_mode"),
1607 _OMAP3_MUXENTRY(CAM_D1, 100,
1608 "cam_d1", NULL, "csi2_dy2", NULL,
1609 "gpio_100", NULL, NULL, "safe_mode"),
1610 _OMAP3_MUXENTRY(CAM_D10, 109,
1611 "cam_d10", "ssi2_wake", NULL, NULL,
1612 "gpio_109", "hw_dbg8", NULL, "safe_mode"),
1613 _OMAP3_MUXENTRY(CAM_D2, 101,
1614 "cam_d2", "ssi2_rdy_tx", NULL, NULL,
1615 "gpio_101", "hw_dbg4", NULL, "safe_mode"),
1616 _OMAP3_MUXENTRY(CAM_D3, 102,
1617 "cam_d3", "ssi2_dat_rx", NULL, NULL,
1618 "gpio_102", "hw_dbg5", NULL, "safe_mode"),
1619 _OMAP3_MUXENTRY(CAM_D4, 103,
1620 "cam_d4", "ssi2_flag_rx", NULL, NULL,
1621 "gpio_103", "hw_dbg6", NULL, "safe_mode"),
1622 _OMAP3_MUXENTRY(CAM_D5, 104,
1623 "cam_d5", "ssi2_rdy_rx", NULL, NULL,
1624 "gpio_104", "hw_dbg7", NULL, "safe_mode"),
1625 _OMAP3_MUXENTRY(CAM_HS, 94,
1626 "cam_hs", "ssi2_dat_tx", NULL, NULL,
1627 "gpio_94", "hw_dbg0", NULL, "safe_mode"),
1628 _OMAP3_MUXENTRY(CAM_VS, 95,
1629 "cam_vs", "ssi2_flag_tx", NULL, NULL,
1630 "gpio_95", "hw_dbg1", NULL, "safe_mode"),
1631 _OMAP3_MUXENTRY(DSS_DATA0, 70,
1632 "dss_data0", "dsi_dx0", "uart1_cts", NULL,
1633 "gpio_70", NULL, NULL, "safe_mode"),
1634 _OMAP3_MUXENTRY(DSS_DATA1, 71,
1635 "dss_data1", "dsi_dy0", "uart1_rts", NULL,
1636 "gpio_71", NULL, NULL, "safe_mode"),
1637 _OMAP3_MUXENTRY(DSS_DATA2, 72,
1638 "dss_data2", "dsi_dx1", NULL, NULL,
1639 "gpio_72", NULL, NULL, "safe_mode"),
1640 _OMAP3_MUXENTRY(DSS_DATA3, 73,
1641 "dss_data3", "dsi_dy1", NULL, NULL,
1642 "gpio_73", NULL, NULL, "safe_mode"),
1643 _OMAP3_MUXENTRY(DSS_DATA4, 74,
1644 "dss_data4", "dsi_dx2", "uart3_rx_irrx", NULL,
1645 "gpio_74", NULL, NULL, "safe_mode"),
1646 _OMAP3_MUXENTRY(DSS_DATA5, 75,
1647 "dss_data5", "dsi_dy2", "uart3_tx_irtx", NULL,
1648 "gpio_75", NULL, NULL, "safe_mode"),
1649 _OMAP3_MUXENTRY(DSS_DATA6, 76,
1650 "dss_data6", NULL, "uart1_tx", "dssvenc656_data6",
1651 "gpio_76", "hw_dbg14", NULL, "safe_mode"),
1652 _OMAP3_MUXENTRY(DSS_DATA7, 77,
1653 "dss_data7", NULL, "uart1_rx", "dssvenc656_data7",
1654 "gpio_77", "hw_dbg15", NULL, "safe_mode"),
1655 _OMAP3_MUXENTRY(DSS_DATA8, 78,
1656 "dss_data8", NULL, "uart3_rx_irrx", NULL,
1657 "gpio_78", "hw_dbg16", NULL, "safe_mode"),
1658 _OMAP3_MUXENTRY(DSS_DATA9, 79,
1659 "dss_data9", NULL, "uart3_tx_irtx", NULL,
1660 "gpio_79", "hw_dbg17", NULL, "safe_mode"),
1661 _OMAP3_MUXENTRY(ETK_D12, 26,
1662 "etk_d12", "sys_drm_msecure", NULL, "hsusb2_dir",
1663 "gpio_26", NULL, "hsusb2_tll_dir", "hw_dbg14"),
1664 _OMAP3_MUXENTRY(GPMC_A11, 0,
1665 "gpmc_a11", NULL, NULL, NULL,
1666 NULL, NULL, NULL, "safe_mode"),
1667 _OMAP3_MUXENTRY(GPMC_WAIT2, 64,
1668 "gpmc_wait2", NULL, "uart4_tx", NULL,
1669 "gpio_64", NULL, NULL, "safe_mode"),
1670 _OMAP3_MUXENTRY(GPMC_WAIT3, 65,
1671 "gpmc_wait3", "sys_ndmareq1", "uart4_rx", NULL,
1672 "gpio_65", NULL, NULL, "safe_mode"),
1673 _OMAP3_MUXENTRY(HSUSB0_DATA0, 125,
1674 "hsusb0_data0", NULL, "uart3_tx_irtx", NULL,
1675 "gpio_125", "uart2_tx", NULL, "safe_mode"),
1676 _OMAP3_MUXENTRY(HSUSB0_DATA1, 130,
1677 "hsusb0_data1", NULL, "uart3_rx_irrx", NULL,
1678 "gpio_130", "uart2_rx", NULL, "safe_mode"),
1679 _OMAP3_MUXENTRY(HSUSB0_DATA2, 131,
1680 "hsusb0_data2", NULL, "uart3_rts_sd", NULL,
1681 "gpio_131", "uart2_rts", NULL, "safe_mode"),
1682 _OMAP3_MUXENTRY(HSUSB0_DATA3, 169,
1683 "hsusb0_data3", NULL, "uart3_cts_rctx", NULL,
1684 "gpio_169", "uart2_cts", NULL, "safe_mode"),
1685 _OMAP3_MUXENTRY(MCBSP1_CLKR, 156,
1686 "mcbsp1_clkr", "mcspi4_clk", "sim_cd", NULL,
1687 "gpio_156", NULL, NULL, "safe_mode"),
1688 _OMAP3_MUXENTRY(MCBSP1_FSR, 157,
1689 "mcbsp1_fsr", "adpllv2d_dithering_en1",
1690 "cam_global_reset", NULL,
1691 "gpio_157", NULL, NULL, "safe_mode"),
1692 _OMAP3_MUXENTRY(MCBSP4_CLKX, 152,
1693 "mcbsp4_clkx", "ssi1_dat_rx", NULL, NULL,
1694 "gpio_152", "hsusb3_tll_data1", "mm3_txse0", "safe_mode"),
1695 _OMAP3_MUXENTRY(MCBSP4_DR, 153,
1696 "mcbsp4_dr", "ssi1_flag_rx", NULL, NULL,
1697 "gpio_153", "hsusb3_tll_data0", "mm3_rxrcv", "safe_mode"),
1698 _OMAP3_MUXENTRY(MCBSP4_DX, 154,
1699 "mcbsp4_dx", "ssi1_rdy_rx", NULL, NULL,
1700 "gpio_154", "hsusb3_tll_data2", "mm3_txdat", "safe_mode"),
1701 _OMAP3_MUXENTRY(MCBSP4_FSX, 155,
1702 "mcbsp4_fsx", "ssi1_wake", NULL, NULL,
1703 "gpio_155", "hsusb3_tll_data3", "mm3_txen_n", "safe_mode"),
1704 _OMAP3_MUXENTRY(MCSPI1_CS1, 175,
1705 "mcspi1_cs1", "adpllv2d_dithering_en2", NULL, "sdmmc3_cmd",
1706 "gpio_175", NULL, NULL, "safe_mode"),
1707 _OMAP3_MUXENTRY(SAD2D_MBUSFLAG, 0,
1708 "sad2d_mbusflag", "mad2d_sbusflag", NULL, NULL,
1709 NULL, NULL, NULL, NULL),
1710 _OMAP3_MUXENTRY(SAD2D_MCAD28, 0,
1711 "sad2d_mcad28", "mad2d_mcad28", NULL, NULL,
1712 NULL, NULL, NULL, NULL),
1713 _OMAP3_MUXENTRY(SAD2D_MCAD29, 0,
1714 "sad2d_mcad29", "mad2d_mcad29", NULL, NULL,
1715 NULL, NULL, NULL, NULL),
1716 _OMAP3_MUXENTRY(SAD2D_MCAD32, 0,
1717 "sad2d_mcad32", "mad2d_mcad32", NULL, NULL,
1718 NULL, NULL, NULL, NULL),
1719 _OMAP3_MUXENTRY(SAD2D_MCAD33, 0,
1720 "sad2d_mcad33", "mad2d_mcad33", NULL, NULL,
1721 NULL, NULL, NULL, NULL),
1722 _OMAP3_MUXENTRY(SAD2D_MCAD34, 0,
1723 "sad2d_mcad34", "mad2d_mcad34", NULL, NULL,
1724 NULL, NULL, NULL, NULL),
1725 _OMAP3_MUXENTRY(SAD2D_MCAD35, 0,
1726 "sad2d_mcad35", "mad2d_mcad35", NULL, NULL,
1727 NULL, NULL, NULL, NULL),
1728 _OMAP3_MUXENTRY(SAD2D_MCAD36, 0,
1729 "sad2d_mcad36", "mad2d_mcad36", NULL, NULL,
1730 NULL, NULL, NULL, NULL),
1731 _OMAP3_MUXENTRY(SAD2D_MREAD, 0,
1732 "sad2d_mread", "mad2d_sread", NULL, NULL,
1733 NULL, NULL, NULL, NULL),
1734 _OMAP3_MUXENTRY(SAD2D_MWRITE, 0,
1735 "sad2d_mwrite", "mad2d_swrite", NULL, NULL,
1736 NULL, NULL, NULL, NULL),
1737 _OMAP3_MUXENTRY(SAD2D_SBUSFLAG, 0,
1738 "sad2d_sbusflag", "mad2d_mbusflag", NULL, NULL,
1739 NULL, NULL, NULL, NULL),
1740 _OMAP3_MUXENTRY(SAD2D_SREAD, 0,
1741 "sad2d_sread", "mad2d_mread", NULL, NULL,
1742 NULL, NULL, NULL, NULL),
1743 _OMAP3_MUXENTRY(SAD2D_SWRITE, 0,
1744 "sad2d_swrite", "mad2d_mwrite", NULL, NULL,
1745 NULL, NULL, NULL, NULL),
1746 _OMAP3_MUXENTRY(SDMMC1_CLK, 120,
1747 "sdmmc1_clk", "ms_clk", NULL, NULL,
1748 "gpio_120", NULL, NULL, "safe_mode"),
1749 _OMAP3_MUXENTRY(SDMMC1_CMD, 121,
1750 "sdmmc1_cmd", "ms_bs", NULL, NULL,
1751 "gpio_121", NULL, NULL, "safe_mode"),
1752 _OMAP3_MUXENTRY(SDMMC1_DAT0, 122,
1753 "sdmmc1_dat0", "ms_dat0", NULL, NULL,
1754 "gpio_122", NULL, NULL, "safe_mode"),
1755 _OMAP3_MUXENTRY(SDMMC1_DAT1, 123,
1756 "sdmmc1_dat1", "ms_dat1", NULL, NULL,
1757 "gpio_123", NULL, NULL, "safe_mode"),
1758 _OMAP3_MUXENTRY(SDMMC1_DAT2, 124,
1759 "sdmmc1_dat2", "ms_dat2", NULL, NULL,
1760 "gpio_124", NULL, NULL, "safe_mode"),
1761 _OMAP3_MUXENTRY(SDMMC1_DAT3, 125,
1762 "sdmmc1_dat3", "ms_dat3", NULL, NULL,
1763 "gpio_125", NULL, NULL, "safe_mode"),
1764 _OMAP3_MUXENTRY(SDRC_CKE0, 0,
1765 "sdrc_cke0", NULL, NULL, NULL,
1766 NULL, NULL, NULL, "safe_mode_out1"),
1767 _OMAP3_MUXENTRY(SDRC_CKE1, 0,
1768 "sdrc_cke1", NULL, NULL, NULL,
1769 NULL, NULL, NULL, "safe_mode_out1"),
1770 _OMAP3_MUXENTRY(SIM_IO, 126,
1771 "sim_io", "sim_io_low_impedance", NULL, NULL,
1772 "gpio_126", NULL, NULL, "safe_mode"),
1773 _OMAP3_MUXENTRY(SIM_CLK, 127,
1774 "sim_clk", NULL, NULL, NULL,
1775 "gpio_127", NULL, NULL, "safe_mode"),
1776 _OMAP3_MUXENTRY(SIM_PWRCTRL, 128,
1777 "sim_pwrctrl", NULL, NULL, NULL,
1778 "gpio_128", NULL, NULL, "safe_mode"),
1779 _OMAP3_MUXENTRY(SIM_RST, 129,
1780 "sim_rst", NULL, NULL, NULL,
1781 "gpio_129", NULL, NULL, "safe_mode"),
1782 _OMAP3_MUXENTRY(SYS_BOOT0, 2,
1783 "sys_boot0", NULL, NULL, "dss_data18",
1784 "gpio_2", NULL, NULL, "safe_mode"),
1785 _OMAP3_MUXENTRY(SYS_BOOT1, 3,
1786 "sys_boot1", NULL, NULL, "dss_data19",
1787 "gpio_3", NULL, NULL, "safe_mode"),
1788 _OMAP3_MUXENTRY(SYS_BOOT3, 5,
1789 "sys_boot3", NULL, NULL, "dss_data20",
1790 "gpio_5", NULL, NULL, "safe_mode"),
1791 _OMAP3_MUXENTRY(SYS_BOOT4, 6,
1792 "sys_boot4", "sdmmc2_dir_dat2", NULL, "dss_data21",
1793 "gpio_6", NULL, NULL, "safe_mode"),
1794 _OMAP3_MUXENTRY(SYS_BOOT5, 7,
1795 "sys_boot5", "sdmmc2_dir_dat3", NULL, "dss_data22",
1796 "gpio_7", NULL, NULL, "safe_mode"),
1797 _OMAP3_MUXENTRY(SYS_BOOT6, 8,
1798 "sys_boot6", NULL, NULL, "dss_data23",
1799 "gpio_8", NULL, NULL, "safe_mode"),
1800 _OMAP3_MUXENTRY(UART1_CTS, 150,
1801 "uart1_cts", "ssi1_rdy_tx", NULL, NULL,
1802 "gpio_150", "hsusb3_tll_clk", NULL, "safe_mode"),
1803 _OMAP3_MUXENTRY(UART1_RTS, 149,
1804 "uart1_rts", "ssi1_flag_tx", NULL, NULL,
1805 "gpio_149", NULL, NULL, "safe_mode"),
1806 _OMAP3_MUXENTRY(UART1_TX, 148,
1807 "uart1_tx", "ssi1_dat_tx", NULL, NULL,
1808 "gpio_148", NULL, NULL, "safe_mode"),
1809 { .reg_offset = OMAP_MUX_TERMINATOR },
1810};
1811#else
1812#define omap36xx_cbp_subset NULL
1813#endif
1814
1815/*
1816 * Balls for 36XX CBP package
1817 * 515-pin s-PBGA Package, 0.50mm Ball Pitch (Top), 0.40mm Ball Pitch (Bottom)
1818 */
1819#if defined(CONFIG_OMAP_MUX) && defined(CONFIG_DEBUG_FS) \
1820 && defined (CONFIG_OMAP_PACKAGE_CBP)
1821struct omap_ball __initdata omap36xx_cbp_ball[] = {
1822 _OMAP3_BALLENTRY(CAM_D0, "ag17", NULL),
1823 _OMAP3_BALLENTRY(CAM_D1, "ah17", NULL),
1824 _OMAP3_BALLENTRY(CAM_D10, "b25", NULL),
1825 _OMAP3_BALLENTRY(CAM_D11, "c26", NULL),
1826 _OMAP3_BALLENTRY(CAM_D2, "b24", NULL),
1827 _OMAP3_BALLENTRY(CAM_D3, "c24", NULL),
1828 _OMAP3_BALLENTRY(CAM_D4, "d24", NULL),
1829 _OMAP3_BALLENTRY(CAM_D5, "a25", NULL),
1830 _OMAP3_BALLENTRY(CAM_D6, "k28", NULL),
1831 _OMAP3_BALLENTRY(CAM_D7, "l28", NULL),
1832 _OMAP3_BALLENTRY(CAM_D8, "k27", NULL),
1833 _OMAP3_BALLENTRY(CAM_D9, "l27", NULL),
1834 _OMAP3_BALLENTRY(CAM_FLD, "c23", NULL),
1835 _OMAP3_BALLENTRY(CAM_HS, "a24", NULL),
1836 _OMAP3_BALLENTRY(CAM_PCLK, "c27", NULL),
1837 _OMAP3_BALLENTRY(CAM_STROBE, "d25", NULL),
1838 _OMAP3_BALLENTRY(CAM_VS, "a23", NULL),
1839 _OMAP3_BALLENTRY(CAM_WEN, "b23", NULL),
1840 _OMAP3_BALLENTRY(CAM_XCLKA, "c25", NULL),
1841 _OMAP3_BALLENTRY(CAM_XCLKB, "b26", NULL),
1842 _OMAP3_BALLENTRY(CSI2_DX0, "ag19", NULL),
1843 _OMAP3_BALLENTRY(CSI2_DX1, "ag18", NULL),
1844 _OMAP3_BALLENTRY(CSI2_DY0, "ah19", NULL),
1845 _OMAP3_BALLENTRY(CSI2_DY1, "ah18", NULL),
1846 _OMAP3_BALLENTRY(DSS_ACBIAS, "e27", NULL),
1847 _OMAP3_BALLENTRY(DSS_DATA0, "ag22", NULL),
1848 _OMAP3_BALLENTRY(DSS_DATA1, "ah22", NULL),
1849 _OMAP3_BALLENTRY(DSS_DATA10, "ad28", NULL),
1850 _OMAP3_BALLENTRY(DSS_DATA11, "ad27", NULL),
1851 _OMAP3_BALLENTRY(DSS_DATA12, "ab28", NULL),
1852 _OMAP3_BALLENTRY(DSS_DATA13, "ab27", NULL),
1853 _OMAP3_BALLENTRY(DSS_DATA14, "aa28", NULL),
1854 _OMAP3_BALLENTRY(DSS_DATA15, "aa27", NULL),
1855 _OMAP3_BALLENTRY(DSS_DATA16, "g25", NULL),
1856 _OMAP3_BALLENTRY(DSS_DATA17, "h27", NULL),
1857 _OMAP3_BALLENTRY(DSS_DATA18, "h26", NULL),
1858 _OMAP3_BALLENTRY(DSS_DATA19, "h25", NULL),
1859 _OMAP3_BALLENTRY(DSS_DATA2, "ag23", NULL),
1860 _OMAP3_BALLENTRY(DSS_DATA20, "e28", NULL),
1861 _OMAP3_BALLENTRY(DSS_DATA21, "j26", NULL),
1862 _OMAP3_BALLENTRY(DSS_DATA22, "ac27", NULL),
1863 _OMAP3_BALLENTRY(DSS_DATA23, "ac28", NULL),
1864 _OMAP3_BALLENTRY(DSS_DATA3, "ah23", NULL),
1865 _OMAP3_BALLENTRY(DSS_DATA4, "ag24", NULL),
1866 _OMAP3_BALLENTRY(DSS_DATA5, "ah24", NULL),
1867 _OMAP3_BALLENTRY(DSS_DATA6, "e26", NULL),
1868 _OMAP3_BALLENTRY(DSS_DATA7, "f28", NULL),
1869 _OMAP3_BALLENTRY(DSS_DATA8, "f27", NULL),
1870 _OMAP3_BALLENTRY(DSS_DATA9, "g26", NULL),
1871 _OMAP3_BALLENTRY(DSS_HSYNC, "d26", NULL),
1872 _OMAP3_BALLENTRY(DSS_PCLK, "d28", NULL),
1873 _OMAP3_BALLENTRY(DSS_VSYNC, "d27", NULL),
1874 _OMAP3_BALLENTRY(ETK_CLK, "af10", NULL),
1875 _OMAP3_BALLENTRY(ETK_CTL, "ae10", NULL),
1876 _OMAP3_BALLENTRY(ETK_D0, "af11", NULL),
1877 _OMAP3_BALLENTRY(ETK_D1, "ag12", NULL),
1878 _OMAP3_BALLENTRY(ETK_D10, "ae7", NULL),
1879 _OMAP3_BALLENTRY(ETK_D11, "af7", NULL),
1880 _OMAP3_BALLENTRY(ETK_D12, "ag7", NULL),
1881 _OMAP3_BALLENTRY(ETK_D13, "ah7", NULL),
1882 _OMAP3_BALLENTRY(ETK_D14, "ag8", NULL),
1883 _OMAP3_BALLENTRY(ETK_D15, "ah8", NULL),
1884 _OMAP3_BALLENTRY(ETK_D2, "ah12", NULL),
1885 _OMAP3_BALLENTRY(ETK_D3, "ae13", NULL),
1886 _OMAP3_BALLENTRY(ETK_D4, "ae11", NULL),
1887 _OMAP3_BALLENTRY(ETK_D5, "ah9", NULL),
1888 _OMAP3_BALLENTRY(ETK_D6, "af13", NULL),
1889 _OMAP3_BALLENTRY(ETK_D7, "ah14", NULL),
1890 _OMAP3_BALLENTRY(ETK_D8, "af9", NULL),
1891 _OMAP3_BALLENTRY(ETK_D9, "ag9", NULL),
1892 _OMAP3_BALLENTRY(GPMC_A1, "n4", "ac15"),
1893 _OMAP3_BALLENTRY(GPMC_A10, "k3", "ab19"),
1894 _OMAP3_BALLENTRY(GPMC_A11, NULL, "ac20"),
1895 _OMAP3_BALLENTRY(GPMC_A2, "m4", "ab15"),
1896 _OMAP3_BALLENTRY(GPMC_A3, "l4", "ac16"),
1897 _OMAP3_BALLENTRY(GPMC_A4, "k4", "ab16"),
1898 _OMAP3_BALLENTRY(GPMC_A5, "t3", "ac17"),
1899 _OMAP3_BALLENTRY(GPMC_A6, "r3", "ab17"),
1900 _OMAP3_BALLENTRY(GPMC_A7, "n3", "ac18"),
1901 _OMAP3_BALLENTRY(GPMC_A8, "m3", "ab18"),
1902 _OMAP3_BALLENTRY(GPMC_A9, "l3", "ac19"),
1903 _OMAP3_BALLENTRY(GPMC_CLK, "t4", "w2"),
1904 _OMAP3_BALLENTRY(GPMC_D0, "k1", "m2"),
1905 _OMAP3_BALLENTRY(GPMC_D1, "l1", "m1"),
1906 _OMAP3_BALLENTRY(GPMC_D10, "p1", "ab4"),
1907 _OMAP3_BALLENTRY(GPMC_D11, "r1", "ac4"),
1908 _OMAP3_BALLENTRY(GPMC_D12, "r2", "ab6"),
1909 _OMAP3_BALLENTRY(GPMC_D13, "t2", "ac6"),
1910 _OMAP3_BALLENTRY(GPMC_D14, "w1", "ab7"),
1911 _OMAP3_BALLENTRY(GPMC_D15, "y1", "ac7"),
1912 _OMAP3_BALLENTRY(GPMC_D2, "l2", "n2"),
1913 _OMAP3_BALLENTRY(GPMC_D3, "p2", "n1"),
1914 _OMAP3_BALLENTRY(GPMC_D4, "t1", "r2"),
1915 _OMAP3_BALLENTRY(GPMC_D5, "v1", "r1"),
1916 _OMAP3_BALLENTRY(GPMC_D6, "v2", "t2"),
1917 _OMAP3_BALLENTRY(GPMC_D7, "w2", "t1"),
1918 _OMAP3_BALLENTRY(GPMC_D8, "h2", "ab3"),
1919 _OMAP3_BALLENTRY(GPMC_D9, "k2", "ac3"),
1920 _OMAP3_BALLENTRY(GPMC_NADV_ALE, "f3", "w1"),
1921 _OMAP3_BALLENTRY(GPMC_NBE0_CLE, "g3", "ac12"),
1922 _OMAP3_BALLENTRY(GPMC_NBE1, "u3", NULL),
1923 _OMAP3_BALLENTRY(GPMC_NCS0, "g4", "y2"),
1924 _OMAP3_BALLENTRY(GPMC_NCS1, "h3", "y1"),
1925 _OMAP3_BALLENTRY(GPMC_NCS2, "v8", NULL),
1926 _OMAP3_BALLENTRY(GPMC_NCS3, "u8", NULL),
1927 _OMAP3_BALLENTRY(GPMC_NCS4, "t8", NULL),
1928 _OMAP3_BALLENTRY(GPMC_NCS5, "r8", NULL),
1929 _OMAP3_BALLENTRY(GPMC_NCS6, "p8", NULL),
1930 _OMAP3_BALLENTRY(GPMC_NCS7, "n8", NULL),
1931 _OMAP3_BALLENTRY(GPMC_NOE, "g2", "v2"),
1932 _OMAP3_BALLENTRY(GPMC_NWE, "f4", "v1"),
1933 _OMAP3_BALLENTRY(GPMC_NWP, "h1", "ab10"),
1934 _OMAP3_BALLENTRY(GPMC_WAIT0, "m8", "ab12"),
1935 _OMAP3_BALLENTRY(GPMC_WAIT1, "l8", "ac10"),
1936 _OMAP3_BALLENTRY(GPMC_WAIT2, "k8", NULL),
1937 _OMAP3_BALLENTRY(GPMC_WAIT3, "j8", NULL),
1938 _OMAP3_BALLENTRY(HDQ_SIO, "j25", NULL),
1939 _OMAP3_BALLENTRY(HSUSB0_CLK, "t28", NULL),
1940 _OMAP3_BALLENTRY(HSUSB0_DATA0, "t27", NULL),
1941 _OMAP3_BALLENTRY(HSUSB0_DATA1, "u28", NULL),
1942 _OMAP3_BALLENTRY(HSUSB0_DATA2, "u27", NULL),
1943 _OMAP3_BALLENTRY(HSUSB0_DATA3, "u26", NULL),
1944 _OMAP3_BALLENTRY(HSUSB0_DATA4, "u25", NULL),
1945 _OMAP3_BALLENTRY(HSUSB0_DATA5, "v28", NULL),
1946 _OMAP3_BALLENTRY(HSUSB0_DATA6, "v27", NULL),
1947 _OMAP3_BALLENTRY(HSUSB0_DATA7, "v26", NULL),
1948 _OMAP3_BALLENTRY(HSUSB0_DIR, "r28", NULL),
1949 _OMAP3_BALLENTRY(HSUSB0_NXT, "t26", NULL),
1950 _OMAP3_BALLENTRY(HSUSB0_STP, "t25", NULL),
1951 _OMAP3_BALLENTRY(I2C1_SCL, "k21", NULL),
1952 _OMAP3_BALLENTRY(I2C1_SDA, "j21", NULL),
1953 _OMAP3_BALLENTRY(I2C2_SCL, "af15", NULL),
1954 _OMAP3_BALLENTRY(I2C2_SDA, "ae15", NULL),
1955 _OMAP3_BALLENTRY(I2C3_SCL, "af14", NULL),
1956 _OMAP3_BALLENTRY(I2C3_SDA, "ag14", NULL),
1957 _OMAP3_BALLENTRY(I2C4_SCL, "ad26", NULL),
1958 _OMAP3_BALLENTRY(I2C4_SDA, "ae26", NULL),
1959 _OMAP3_BALLENTRY(JTAG_EMU0, "aa11", NULL),
1960 _OMAP3_BALLENTRY(JTAG_EMU1, "aa10", NULL),
1961 _OMAP3_BALLENTRY(JTAG_RTCK, "aa12", NULL),
1962 _OMAP3_BALLENTRY(JTAG_TCK, "aa13", NULL),
1963 _OMAP3_BALLENTRY(JTAG_TDI, "aa20", NULL),
1964 _OMAP3_BALLENTRY(JTAG_TDO, "aa19", NULL),
1965 _OMAP3_BALLENTRY(JTAG_TMS_TMSC, "aa18", NULL),
1966 _OMAP3_BALLENTRY(MCBSP1_CLKR, "y21", NULL),
1967 _OMAP3_BALLENTRY(MCBSP1_CLKX, "w21", NULL),
1968 _OMAP3_BALLENTRY(MCBSP1_DR, "u21", NULL),
1969 _OMAP3_BALLENTRY(MCBSP1_DX, "v21", NULL),
1970 _OMAP3_BALLENTRY(MCBSP1_FSR, "aa21", NULL),
1971 _OMAP3_BALLENTRY(MCBSP1_FSX, "k26", NULL),
1972 _OMAP3_BALLENTRY(MCBSP2_CLKX, "n21", NULL),
1973 _OMAP3_BALLENTRY(MCBSP2_DR, "r21", NULL),
1974 _OMAP3_BALLENTRY(MCBSP2_DX, "m21", NULL),
1975 _OMAP3_BALLENTRY(MCBSP2_FSX, "p21", NULL),
1976 _OMAP3_BALLENTRY(MCBSP3_CLKX, "af5", NULL),
1977 _OMAP3_BALLENTRY(MCBSP3_DR, "ae6", NULL),
1978 _OMAP3_BALLENTRY(MCBSP3_DX, "af6", NULL),
1979 _OMAP3_BALLENTRY(MCBSP3_FSX, "ae5", NULL),
1980 _OMAP3_BALLENTRY(MCBSP4_CLKX, "ae1", NULL),
1981 _OMAP3_BALLENTRY(MCBSP4_DR, "ad1", NULL),
1982 _OMAP3_BALLENTRY(MCBSP4_DX, "ad2", NULL),
1983 _OMAP3_BALLENTRY(MCBSP4_FSX, "ac1", NULL),
1984 _OMAP3_BALLENTRY(MCBSP_CLKS, "t21", NULL),
1985 _OMAP3_BALLENTRY(MCSPI1_CLK, "ab3", NULL),
1986 _OMAP3_BALLENTRY(MCSPI1_CS0, "ac2", NULL),
1987 _OMAP3_BALLENTRY(MCSPI1_CS1, "ac3", NULL),
1988 _OMAP3_BALLENTRY(MCSPI1_CS2, "ab1", NULL),
1989 _OMAP3_BALLENTRY(MCSPI1_CS3, "ab2", NULL),
1990 _OMAP3_BALLENTRY(MCSPI1_SIMO, "ab4", NULL),
1991 _OMAP3_BALLENTRY(MCSPI1_SOMI, "aa4", NULL),
1992 _OMAP3_BALLENTRY(MCSPI2_CLK, "aa3", NULL),
1993 _OMAP3_BALLENTRY(MCSPI2_CS0, "y4", NULL),
1994 _OMAP3_BALLENTRY(MCSPI2_CS1, "v3", NULL),
1995 _OMAP3_BALLENTRY(MCSPI2_SIMO, "y2", NULL),
1996 _OMAP3_BALLENTRY(MCSPI2_SOMI, "y3", NULL),
1997 _OMAP3_BALLENTRY(SDMMC1_CLK, "n28", NULL),
1998 _OMAP3_BALLENTRY(SDMMC1_CMD, "m27", NULL),
1999 _OMAP3_BALLENTRY(SDMMC1_DAT0, "n27", NULL),
2000 _OMAP3_BALLENTRY(SDMMC1_DAT1, "n26", NULL),
2001 _OMAP3_BALLENTRY(SDMMC1_DAT2, "n25", NULL),
2002 _OMAP3_BALLENTRY(SDMMC1_DAT3, "p28", NULL),
2003 _OMAP3_BALLENTRY(SDMMC2_CLK, "ae2", NULL),
2004 _OMAP3_BALLENTRY(SDMMC2_CMD, "ag5", NULL),
2005 _OMAP3_BALLENTRY(SDMMC2_DAT0, "ah5", NULL),
2006 _OMAP3_BALLENTRY(SDMMC2_DAT1, "ah4", NULL),
2007 _OMAP3_BALLENTRY(SDMMC2_DAT2, "ag4", NULL),
2008 _OMAP3_BALLENTRY(SDMMC2_DAT3, "af4", NULL),
2009 _OMAP3_BALLENTRY(SDMMC2_DAT4, "ae4", NULL),
2010 _OMAP3_BALLENTRY(SDMMC2_DAT5, "ah3", NULL),
2011 _OMAP3_BALLENTRY(SDMMC2_DAT6, "af3", NULL),
2012 _OMAP3_BALLENTRY(SDMMC2_DAT7, "ae3", NULL),
2013 _OMAP3_BALLENTRY(SDRC_A0, NULL, "n22"),
2014 _OMAP3_BALLENTRY(SDRC_A1, NULL, "n23"),
2015 _OMAP3_BALLENTRY(SDRC_A10, NULL, "v22"),
2016 _OMAP3_BALLENTRY(SDRC_A11, NULL, "v23"),
2017 _OMAP3_BALLENTRY(SDRC_A12, NULL, "w22"),
2018 _OMAP3_BALLENTRY(SDRC_A13, NULL, "w23"),
2019 _OMAP3_BALLENTRY(SDRC_A14, NULL, "y22"),
2020 _OMAP3_BALLENTRY(SDRC_A2, NULL, "p22"),
2021 _OMAP3_BALLENTRY(SDRC_A3, NULL, "p23"),
2022 _OMAP3_BALLENTRY(SDRC_A4, NULL, "r22"),
2023 _OMAP3_BALLENTRY(SDRC_A5, NULL, "r23"),
2024 _OMAP3_BALLENTRY(SDRC_A6, NULL, "t22"),
2025 _OMAP3_BALLENTRY(SDRC_A7, NULL, "t23"),
2026 _OMAP3_BALLENTRY(SDRC_A8, NULL, "u22"),
2027 _OMAP3_BALLENTRY(SDRC_A9, NULL, "u23"),
2028 _OMAP3_BALLENTRY(SDRC_BA0, "h9", "ab21"),
2029 _OMAP3_BALLENTRY(SDRC_BA1, "h10", "ac21"),
2030 _OMAP3_BALLENTRY(SDRC_CKE0, "h16", "j22"),
2031 _OMAP3_BALLENTRY(SDRC_CKE1, "h17", "j23"),
2032 _OMAP3_BALLENTRY(SDRC_CLK, "a13", "a11"),
2033 _OMAP3_BALLENTRY(SDRC_D0, NULL, "j2"),
2034 _OMAP3_BALLENTRY(SDRC_D1, NULL, "j1"),
2035 _OMAP3_BALLENTRY(SDRC_D10, "c15", "b14"),
2036 _OMAP3_BALLENTRY(SDRC_D11, "b16", "a14"),
2037 _OMAP3_BALLENTRY(SDRC_D12, "d17", "b16"),
2038 _OMAP3_BALLENTRY(SDRC_D13, "c17", "a16"),
2039 _OMAP3_BALLENTRY(SDRC_D14, "b17", "b19"),
2040 _OMAP3_BALLENTRY(SDRC_D15, "d18", "a19"),
2041 _OMAP3_BALLENTRY(SDRC_D16, NULL, "b3"),
2042 _OMAP3_BALLENTRY(SDRC_D17, NULL, "a3"),
2043 _OMAP3_BALLENTRY(SDRC_D18, NULL, "b5"),
2044 _OMAP3_BALLENTRY(SDRC_D19, NULL, "a5"),
2045 _OMAP3_BALLENTRY(SDRC_D2, NULL, "g2"),
2046 _OMAP3_BALLENTRY(SDRC_D20, NULL, "b8"),
2047 _OMAP3_BALLENTRY(SDRC_D21, NULL, "a8"),
2048 _OMAP3_BALLENTRY(SDRC_D22, NULL, "b9"),
2049 _OMAP3_BALLENTRY(SDRC_D23, NULL, "a9"),
2050 _OMAP3_BALLENTRY(SDRC_D24, NULL, "b21"),
2051 _OMAP3_BALLENTRY(SDRC_D25, NULL, "a21"),
2052 _OMAP3_BALLENTRY(SDRC_D26, NULL, "d22"),
2053 _OMAP3_BALLENTRY(SDRC_D27, NULL, "d23"),
2054 _OMAP3_BALLENTRY(SDRC_D28, NULL, "e22"),
2055 _OMAP3_BALLENTRY(SDRC_D29, NULL, "e23"),
2056 _OMAP3_BALLENTRY(SDRC_D3, NULL, "g1"),
2057 _OMAP3_BALLENTRY(SDRC_D30, NULL, "g22"),
2058 _OMAP3_BALLENTRY(SDRC_D31, NULL, "g23"),
2059 _OMAP3_BALLENTRY(SDRC_D4, NULL, "f2"),
2060 _OMAP3_BALLENTRY(SDRC_D5, NULL, "f1"),
2061 _OMAP3_BALLENTRY(SDRC_D6, NULL, "d2"),
2062 _OMAP3_BALLENTRY(SDRC_D7, NULL, "d1"),
2063 _OMAP3_BALLENTRY(SDRC_D8, "c14", "b13"),
2064 _OMAP3_BALLENTRY(SDRC_D9, "b14", "a13"),
2065 _OMAP3_BALLENTRY(SDRC_DM0, NULL, "c1"),
2066 _OMAP3_BALLENTRY(SDRC_DM1, "a16", "a17"),
2067 _OMAP3_BALLENTRY(SDRC_DM2, NULL, "a6"),
2068 _OMAP3_BALLENTRY(SDRC_DM3, NULL, "a20"),
2069 _OMAP3_BALLENTRY(SDRC_DQS0, NULL, "c2"),
2070 _OMAP3_BALLENTRY(SDRC_DQS1, "a17", "b17"),
2071 _OMAP3_BALLENTRY(SDRC_DQS2, NULL, "b6"),
2072 _OMAP3_BALLENTRY(SDRC_DQS3, NULL, "b20"),
2073 _OMAP3_BALLENTRY(SDRC_NCAS, "h13", "l22"),
2074 _OMAP3_BALLENTRY(SDRC_NCLK, "a14", "b11"),
2075 _OMAP3_BALLENTRY(SDRC_NCS0, "h11", "m22"),
2076 _OMAP3_BALLENTRY(SDRC_NCS1, "h12", "m23"),
2077 _OMAP3_BALLENTRY(SDRC_NRAS, "h14", "l23"),
2078 _OMAP3_BALLENTRY(SDRC_NWE, "h15", "k23"),
2079 _OMAP3_BALLENTRY(SIM_CLK, "p26", NULL),
2080 _OMAP3_BALLENTRY(SIM_IO, "p27", NULL),
2081 _OMAP3_BALLENTRY(SIM_PWRCTRL, "r27", NULL),
2082 _OMAP3_BALLENTRY(SIM_RST, "r25", NULL),
2083 _OMAP3_BALLENTRY(SYS_32K, "ae25", NULL),
2084 _OMAP3_BALLENTRY(SYS_BOOT0, "ah26", NULL),
2085 _OMAP3_BALLENTRY(SYS_BOOT1, "ag26", NULL),
2086 _OMAP3_BALLENTRY(SYS_BOOT2, "ae14", NULL),
2087 _OMAP3_BALLENTRY(SYS_BOOT3, "af18", NULL),
2088 _OMAP3_BALLENTRY(SYS_BOOT4, "af19", NULL),
2089 _OMAP3_BALLENTRY(SYS_BOOT5, "ae21", NULL),
2090 _OMAP3_BALLENTRY(SYS_BOOT6, "af21", NULL),
2091 _OMAP3_BALLENTRY(SYS_CLKOUT1, "ag25", NULL),
2092 _OMAP3_BALLENTRY(SYS_CLKOUT2, "ae22", NULL),
2093 _OMAP3_BALLENTRY(SYS_CLKREQ, "af25", NULL),
2094 _OMAP3_BALLENTRY(SYS_NIRQ, "af26", NULL),
2095 _OMAP3_BALLENTRY(SYS_NRESWARM, "af24", NULL),
2096 _OMAP3_BALLENTRY(SYS_OFF_MODE, "af22", NULL),
2097 _OMAP3_BALLENTRY(UART1_CTS, "w8", NULL),
2098 _OMAP3_BALLENTRY(UART1_RTS, "aa9", NULL),
2099 _OMAP3_BALLENTRY(UART1_RX, "y8", NULL),
2100 _OMAP3_BALLENTRY(UART1_TX, "aa8", NULL),
2101 _OMAP3_BALLENTRY(UART2_CTS, "ab26", NULL),
2102 _OMAP3_BALLENTRY(UART2_RTS, "ab25", NULL),
2103 _OMAP3_BALLENTRY(UART2_RX, "ad25", NULL),
2104 _OMAP3_BALLENTRY(UART2_TX, "aa25", NULL),
2105 _OMAP3_BALLENTRY(UART3_CTS_RCTX, "h18", NULL),
2106 _OMAP3_BALLENTRY(UART3_RTS_SD, "h19", NULL),
2107 _OMAP3_BALLENTRY(UART3_RX_IRRX, "h20", NULL),
2108 _OMAP3_BALLENTRY(UART3_TX_IRTX, "h21", NULL),
2109 { .reg_offset = OMAP_MUX_TERMINATOR },
2110};
2111#else
2112#define omap36xx_cbp_ball NULL
2113#endif
2114
2115int __init omap3_mux_init(struct omap_board_mux *board_subset, int flags)
2116{
2117 struct omap_mux *package_subset;
2118 struct omap_ball *package_balls;
2119
2120 switch (flags & OMAP_PACKAGE_MASK) {
2121 case (OMAP_PACKAGE_CBC):
2122 package_subset = omap3_cbc_subset;
2123 package_balls = omap3_cbc_ball;
2124 break;
2125 case (OMAP_PACKAGE_CBB):
2126 package_subset = omap3_cbb_subset;
2127 package_balls = omap3_cbb_ball;
2128 break;
2129 case (OMAP_PACKAGE_CUS):
2130 package_subset = omap3_cus_subset;
2131 package_balls = omap3_cus_ball;
2132 break;
2133 case (OMAP_PACKAGE_CBP):
2134 package_subset = omap36xx_cbp_subset;
2135 package_balls = omap36xx_cbp_ball;
2136 break;
2137 default:
2138 printk(KERN_ERR "mux: Unknown omap package, mux disabled\n");
2139 return -EINVAL;
2140 }
2141
2142 return omap_mux_init(OMAP3_CONTROL_PADCONF_MUX_PBASE,
2143 OMAP3_CONTROL_PADCONF_MUX_SIZE,
2144 omap3_muxmodes, package_subset, board_subset,
2145 package_balls);
2146}
diff --git a/arch/arm/mach-omap2/mux34xx.h b/arch/arm/mach-omap2/mux34xx.h
new file mode 100644
index 000000000000..6543ebf8ecfc
--- /dev/null
+++ b/arch/arm/mach-omap2/mux34xx.h
@@ -0,0 +1,398 @@
1/*
2 * Copyright (C) 2009 Nokia
3 * Copyright (C) 2009 Texas Instruments
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 */
9
10#define OMAP3_CONTROL_PADCONF_MUX_PBASE 0x48002030LU
11
12#define OMAP3_MUX(mode0, mux_value) \
13{ \
14 .reg_offset = (OMAP3_CONTROL_PADCONF_##mode0##_OFFSET), \
15 .value = (mux_value), \
16}
17
18/*
19 * OMAP3 CONTROL_PADCONF* register offsets for pin-muxing
20 *
21 * Extracted from the TRM. Add 0x48002030 to these values to get the
22 * absolute addresses. The name in the macro is the mode-0 name of
23 * the pin. NOTE: These registers are 16-bits wide.
24 *
25 * Note that 34XX TRM uses MMC instead of SDMMC and SAD2D instead
26 * of CHASSIS for some registers. For the defines, we follow the
27 * 36XX naming, and use SDMMC and CHASSIS.
28 */
29#define OMAP3_CONTROL_PADCONF_SDRC_D0_OFFSET 0x000
30#define OMAP3_CONTROL_PADCONF_SDRC_D1_OFFSET 0x002
31#define OMAP3_CONTROL_PADCONF_SDRC_D2_OFFSET 0x004
32#define OMAP3_CONTROL_PADCONF_SDRC_D3_OFFSET 0x006
33#define OMAP3_CONTROL_PADCONF_SDRC_D4_OFFSET 0x008
34#define OMAP3_CONTROL_PADCONF_SDRC_D5_OFFSET 0x00a
35#define OMAP3_CONTROL_PADCONF_SDRC_D6_OFFSET 0x00c
36#define OMAP3_CONTROL_PADCONF_SDRC_D7_OFFSET 0x00e
37#define OMAP3_CONTROL_PADCONF_SDRC_D8_OFFSET 0x010
38#define OMAP3_CONTROL_PADCONF_SDRC_D9_OFFSET 0x012
39#define OMAP3_CONTROL_PADCONF_SDRC_D10_OFFSET 0x014
40#define OMAP3_CONTROL_PADCONF_SDRC_D11_OFFSET 0x016
41#define OMAP3_CONTROL_PADCONF_SDRC_D12_OFFSET 0x018
42#define OMAP3_CONTROL_PADCONF_SDRC_D13_OFFSET 0x01a
43#define OMAP3_CONTROL_PADCONF_SDRC_D14_OFFSET 0x01c
44#define OMAP3_CONTROL_PADCONF_SDRC_D15_OFFSET 0x01e
45#define OMAP3_CONTROL_PADCONF_SDRC_D16_OFFSET 0x020
46#define OMAP3_CONTROL_PADCONF_SDRC_D17_OFFSET 0x022
47#define OMAP3_CONTROL_PADCONF_SDRC_D18_OFFSET 0x024
48#define OMAP3_CONTROL_PADCONF_SDRC_D19_OFFSET 0x026
49#define OMAP3_CONTROL_PADCONF_SDRC_D20_OFFSET 0x028
50#define OMAP3_CONTROL_PADCONF_SDRC_D21_OFFSET 0x02a
51#define OMAP3_CONTROL_PADCONF_SDRC_D22_OFFSET 0x02c
52#define OMAP3_CONTROL_PADCONF_SDRC_D23_OFFSET 0x02e
53#define OMAP3_CONTROL_PADCONF_SDRC_D24_OFFSET 0x030
54#define OMAP3_CONTROL_PADCONF_SDRC_D25_OFFSET 0x032
55#define OMAP3_CONTROL_PADCONF_SDRC_D26_OFFSET 0x034
56#define OMAP3_CONTROL_PADCONF_SDRC_D27_OFFSET 0x036
57#define OMAP3_CONTROL_PADCONF_SDRC_D28_OFFSET 0x038
58#define OMAP3_CONTROL_PADCONF_SDRC_D29_OFFSET 0x03a
59#define OMAP3_CONTROL_PADCONF_SDRC_D30_OFFSET 0x03c
60#define OMAP3_CONTROL_PADCONF_SDRC_D31_OFFSET 0x03e
61#define OMAP3_CONTROL_PADCONF_SDRC_CLK_OFFSET 0x040
62#define OMAP3_CONTROL_PADCONF_SDRC_DQS0_OFFSET 0x042
63#define OMAP3_CONTROL_PADCONF_SDRC_DQS1_OFFSET 0x044
64#define OMAP3_CONTROL_PADCONF_SDRC_DQS2_OFFSET 0x046
65#define OMAP3_CONTROL_PADCONF_SDRC_DQS3_OFFSET 0x048
66#define OMAP3_CONTROL_PADCONF_GPMC_A1_OFFSET 0x04a
67#define OMAP3_CONTROL_PADCONF_GPMC_A2_OFFSET 0x04c
68#define OMAP3_CONTROL_PADCONF_GPMC_A3_OFFSET 0x04e
69#define OMAP3_CONTROL_PADCONF_GPMC_A4_OFFSET 0x050
70#define OMAP3_CONTROL_PADCONF_GPMC_A5_OFFSET 0x052
71#define OMAP3_CONTROL_PADCONF_GPMC_A6_OFFSET 0x054
72#define OMAP3_CONTROL_PADCONF_GPMC_A7_OFFSET 0x056
73#define OMAP3_CONTROL_PADCONF_GPMC_A8_OFFSET 0x058
74#define OMAP3_CONTROL_PADCONF_GPMC_A9_OFFSET 0x05a
75#define OMAP3_CONTROL_PADCONF_GPMC_A10_OFFSET 0x05c
76#define OMAP3_CONTROL_PADCONF_GPMC_D0_OFFSET 0x05e
77#define OMAP3_CONTROL_PADCONF_GPMC_D1_OFFSET 0x060
78#define OMAP3_CONTROL_PADCONF_GPMC_D2_OFFSET 0x062
79#define OMAP3_CONTROL_PADCONF_GPMC_D3_OFFSET 0x064
80#define OMAP3_CONTROL_PADCONF_GPMC_D4_OFFSET 0x066
81#define OMAP3_CONTROL_PADCONF_GPMC_D5_OFFSET 0x068
82#define OMAP3_CONTROL_PADCONF_GPMC_D6_OFFSET 0x06a
83#define OMAP3_CONTROL_PADCONF_GPMC_D7_OFFSET 0x06c
84#define OMAP3_CONTROL_PADCONF_GPMC_D8_OFFSET 0x06e
85#define OMAP3_CONTROL_PADCONF_GPMC_D9_OFFSET 0x070
86#define OMAP3_CONTROL_PADCONF_GPMC_D10_OFFSET 0x072
87#define OMAP3_CONTROL_PADCONF_GPMC_D11_OFFSET 0x074
88#define OMAP3_CONTROL_PADCONF_GPMC_D12_OFFSET 0x076
89#define OMAP3_CONTROL_PADCONF_GPMC_D13_OFFSET 0x078
90#define OMAP3_CONTROL_PADCONF_GPMC_D14_OFFSET 0x07a
91#define OMAP3_CONTROL_PADCONF_GPMC_D15_OFFSET 0x07c
92#define OMAP3_CONTROL_PADCONF_GPMC_NCS0_OFFSET 0x07e
93#define OMAP3_CONTROL_PADCONF_GPMC_NCS1_OFFSET 0x080
94#define OMAP3_CONTROL_PADCONF_GPMC_NCS2_OFFSET 0x082
95#define OMAP3_CONTROL_PADCONF_GPMC_NCS3_OFFSET 0x084
96#define OMAP3_CONTROL_PADCONF_GPMC_NCS4_OFFSET 0x086
97#define OMAP3_CONTROL_PADCONF_GPMC_NCS5_OFFSET 0x088
98#define OMAP3_CONTROL_PADCONF_GPMC_NCS6_OFFSET 0x08a
99#define OMAP3_CONTROL_PADCONF_GPMC_NCS7_OFFSET 0x08c
100#define OMAP3_CONTROL_PADCONF_GPMC_CLK_OFFSET 0x08e
101#define OMAP3_CONTROL_PADCONF_GPMC_NADV_ALE_OFFSET 0x090
102#define OMAP3_CONTROL_PADCONF_GPMC_NOE_OFFSET 0x092
103#define OMAP3_CONTROL_PADCONF_GPMC_NWE_OFFSET 0x094
104#define OMAP3_CONTROL_PADCONF_GPMC_NBE0_CLE_OFFSET 0x096
105#define OMAP3_CONTROL_PADCONF_GPMC_NBE1_OFFSET 0x098
106#define OMAP3_CONTROL_PADCONF_GPMC_NWP_OFFSET 0x09a
107#define OMAP3_CONTROL_PADCONF_GPMC_WAIT0_OFFSET 0x09c
108#define OMAP3_CONTROL_PADCONF_GPMC_WAIT1_OFFSET 0x09e
109#define OMAP3_CONTROL_PADCONF_GPMC_WAIT2_OFFSET 0x0a0
110#define OMAP3_CONTROL_PADCONF_GPMC_WAIT3_OFFSET 0x0a2
111#define OMAP3_CONTROL_PADCONF_DSS_PCLK_OFFSET 0x0a4
112#define OMAP3_CONTROL_PADCONF_DSS_HSYNC_OFFSET 0x0a6
113#define OMAP3_CONTROL_PADCONF_DSS_VSYNC_OFFSET 0x0a8
114#define OMAP3_CONTROL_PADCONF_DSS_ACBIAS_OFFSET 0x0aa
115#define OMAP3_CONTROL_PADCONF_DSS_DATA0_OFFSET 0x0ac
116#define OMAP3_CONTROL_PADCONF_DSS_DATA1_OFFSET 0x0ae
117#define OMAP3_CONTROL_PADCONF_DSS_DATA2_OFFSET 0x0b0
118#define OMAP3_CONTROL_PADCONF_DSS_DATA3_OFFSET 0x0b2
119#define OMAP3_CONTROL_PADCONF_DSS_DATA4_OFFSET 0x0b4
120#define OMAP3_CONTROL_PADCONF_DSS_DATA5_OFFSET 0x0b6
121#define OMAP3_CONTROL_PADCONF_DSS_DATA6_OFFSET 0x0b8
122#define OMAP3_CONTROL_PADCONF_DSS_DATA7_OFFSET 0x0ba
123#define OMAP3_CONTROL_PADCONF_DSS_DATA8_OFFSET 0x0bc
124#define OMAP3_CONTROL_PADCONF_DSS_DATA9_OFFSET 0x0be
125#define OMAP3_CONTROL_PADCONF_DSS_DATA10_OFFSET 0x0c0
126#define OMAP3_CONTROL_PADCONF_DSS_DATA11_OFFSET 0x0c2
127#define OMAP3_CONTROL_PADCONF_DSS_DATA12_OFFSET 0x0c4
128#define OMAP3_CONTROL_PADCONF_DSS_DATA13_OFFSET 0x0c6
129#define OMAP3_CONTROL_PADCONF_DSS_DATA14_OFFSET 0x0c8
130#define OMAP3_CONTROL_PADCONF_DSS_DATA15_OFFSET 0x0ca
131#define OMAP3_CONTROL_PADCONF_DSS_DATA16_OFFSET 0x0cc
132#define OMAP3_CONTROL_PADCONF_DSS_DATA17_OFFSET 0x0ce
133#define OMAP3_CONTROL_PADCONF_DSS_DATA18_OFFSET 0x0d0
134#define OMAP3_CONTROL_PADCONF_DSS_DATA19_OFFSET 0x0d2
135#define OMAP3_CONTROL_PADCONF_DSS_DATA20_OFFSET 0x0d4
136#define OMAP3_CONTROL_PADCONF_DSS_DATA21_OFFSET 0x0d6
137#define OMAP3_CONTROL_PADCONF_DSS_DATA22_OFFSET 0x0d8
138#define OMAP3_CONTROL_PADCONF_DSS_DATA23_OFFSET 0x0da
139#define OMAP3_CONTROL_PADCONF_CAM_HS_OFFSET 0x0dc
140#define OMAP3_CONTROL_PADCONF_CAM_VS_OFFSET 0x0de
141#define OMAP3_CONTROL_PADCONF_CAM_XCLKA_OFFSET 0x0e0
142#define OMAP3_CONTROL_PADCONF_CAM_PCLK_OFFSET 0x0e2
143#define OMAP3_CONTROL_PADCONF_CAM_FLD_OFFSET 0x0e4
144#define OMAP3_CONTROL_PADCONF_CAM_D0_OFFSET 0x0e6
145#define OMAP3_CONTROL_PADCONF_CAM_D1_OFFSET 0x0e8
146#define OMAP3_CONTROL_PADCONF_CAM_D2_OFFSET 0x0ea
147#define OMAP3_CONTROL_PADCONF_CAM_D3_OFFSET 0x0ec
148#define OMAP3_CONTROL_PADCONF_CAM_D4_OFFSET 0x0ee
149#define OMAP3_CONTROL_PADCONF_CAM_D5_OFFSET 0x0f0
150#define OMAP3_CONTROL_PADCONF_CAM_D6_OFFSET 0x0f2
151#define OMAP3_CONTROL_PADCONF_CAM_D7_OFFSET 0x0f4
152#define OMAP3_CONTROL_PADCONF_CAM_D8_OFFSET 0x0f6
153#define OMAP3_CONTROL_PADCONF_CAM_D9_OFFSET 0x0f8
154#define OMAP3_CONTROL_PADCONF_CAM_D10_OFFSET 0x0fa
155#define OMAP3_CONTROL_PADCONF_CAM_D11_OFFSET 0x0fc
156#define OMAP3_CONTROL_PADCONF_CAM_XCLKB_OFFSET 0x0fe
157#define OMAP3_CONTROL_PADCONF_CAM_WEN_OFFSET 0x100
158#define OMAP3_CONTROL_PADCONF_CAM_STROBE_OFFSET 0x102
159#define OMAP3_CONTROL_PADCONF_CSI2_DX0_OFFSET 0x104
160#define OMAP3_CONTROL_PADCONF_CSI2_DY0_OFFSET 0x106
161#define OMAP3_CONTROL_PADCONF_CSI2_DX1_OFFSET 0x108
162#define OMAP3_CONTROL_PADCONF_CSI2_DY1_OFFSET 0x10a
163#define OMAP3_CONTROL_PADCONF_MCBSP2_FSX_OFFSET 0x10c
164#define OMAP3_CONTROL_PADCONF_MCBSP2_CLKX_OFFSET 0x10e
165#define OMAP3_CONTROL_PADCONF_MCBSP2_DR_OFFSET 0x110
166#define OMAP3_CONTROL_PADCONF_MCBSP2_DX_OFFSET 0x112
167#define OMAP3_CONTROL_PADCONF_SDMMC1_CLK_OFFSET 0x114
168#define OMAP3_CONTROL_PADCONF_SDMMC1_CMD_OFFSET 0x116
169#define OMAP3_CONTROL_PADCONF_SDMMC1_DAT0_OFFSET 0x118
170#define OMAP3_CONTROL_PADCONF_SDMMC1_DAT1_OFFSET 0x11a
171#define OMAP3_CONTROL_PADCONF_SDMMC1_DAT2_OFFSET 0x11c
172#define OMAP3_CONTROL_PADCONF_SDMMC1_DAT3_OFFSET 0x11e
173
174/* SDMMC1_DAT4 - DAT7 are SIM_IO SIM_CLK SIM_PWRCTRL and SIM_RST on 36xx */
175#define OMAP3_CONTROL_PADCONF_SDMMC1_DAT4_OFFSET 0x120
176#define OMAP3_CONTROL_PADCONF_SDMMC1_DAT5_OFFSET 0x122
177#define OMAP3_CONTROL_PADCONF_SDMMC1_DAT6_OFFSET 0x124
178#define OMAP3_CONTROL_PADCONF_SDMMC1_DAT7_OFFSET 0x126
179
180#define OMAP3_CONTROL_PADCONF_SDMMC2_CLK_OFFSET 0x128
181#define OMAP3_CONTROL_PADCONF_SDMMC2_CMD_OFFSET 0x12a
182#define OMAP3_CONTROL_PADCONF_SDMMC2_DAT0_OFFSET 0x12c
183#define OMAP3_CONTROL_PADCONF_SDMMC2_DAT1_OFFSET 0x12e
184#define OMAP3_CONTROL_PADCONF_SDMMC2_DAT2_OFFSET 0x130
185#define OMAP3_CONTROL_PADCONF_SDMMC2_DAT3_OFFSET 0x132
186#define OMAP3_CONTROL_PADCONF_SDMMC2_DAT4_OFFSET 0x134
187#define OMAP3_CONTROL_PADCONF_SDMMC2_DAT5_OFFSET 0x136
188#define OMAP3_CONTROL_PADCONF_SDMMC2_DAT6_OFFSET 0x138
189#define OMAP3_CONTROL_PADCONF_SDMMC2_DAT7_OFFSET 0x13a
190#define OMAP3_CONTROL_PADCONF_MCBSP3_DX_OFFSET 0x13c
191#define OMAP3_CONTROL_PADCONF_MCBSP3_DR_OFFSET 0x13e
192#define OMAP3_CONTROL_PADCONF_MCBSP3_CLKX_OFFSET 0x140
193#define OMAP3_CONTROL_PADCONF_MCBSP3_FSX_OFFSET 0x142
194#define OMAP3_CONTROL_PADCONF_UART2_CTS_OFFSET 0x144
195#define OMAP3_CONTROL_PADCONF_UART2_RTS_OFFSET 0x146
196#define OMAP3_CONTROL_PADCONF_UART2_TX_OFFSET 0x148
197#define OMAP3_CONTROL_PADCONF_UART2_RX_OFFSET 0x14a
198#define OMAP3_CONTROL_PADCONF_UART1_TX_OFFSET 0x14c
199#define OMAP3_CONTROL_PADCONF_UART1_RTS_OFFSET 0x14e
200#define OMAP3_CONTROL_PADCONF_UART1_CTS_OFFSET 0x150
201#define OMAP3_CONTROL_PADCONF_UART1_RX_OFFSET 0x152
202#define OMAP3_CONTROL_PADCONF_MCBSP4_CLKX_OFFSET 0x154
203#define OMAP3_CONTROL_PADCONF_MCBSP4_DR_OFFSET 0x156
204#define OMAP3_CONTROL_PADCONF_MCBSP4_DX_OFFSET 0x158
205#define OMAP3_CONTROL_PADCONF_MCBSP4_FSX_OFFSET 0x15a
206#define OMAP3_CONTROL_PADCONF_MCBSP1_CLKR_OFFSET 0x15c
207#define OMAP3_CONTROL_PADCONF_MCBSP1_FSR_OFFSET 0x15e
208#define OMAP3_CONTROL_PADCONF_MCBSP1_DX_OFFSET 0x160
209#define OMAP3_CONTROL_PADCONF_MCBSP1_DR_OFFSET 0x162
210#define OMAP3_CONTROL_PADCONF_MCBSP_CLKS_OFFSET 0x164
211#define OMAP3_CONTROL_PADCONF_MCBSP1_FSX_OFFSET 0x166
212#define OMAP3_CONTROL_PADCONF_MCBSP1_CLKX_OFFSET 0x168
213#define OMAP3_CONTROL_PADCONF_UART3_CTS_RCTX_OFFSET 0x16a
214#define OMAP3_CONTROL_PADCONF_UART3_RTS_SD_OFFSET 0x16c
215#define OMAP3_CONTROL_PADCONF_UART3_RX_IRRX_OFFSET 0x16e
216#define OMAP3_CONTROL_PADCONF_UART3_TX_IRTX_OFFSET 0x170
217#define OMAP3_CONTROL_PADCONF_HSUSB0_CLK_OFFSET 0x172
218#define OMAP3_CONTROL_PADCONF_HSUSB0_STP_OFFSET 0x174
219#define OMAP3_CONTROL_PADCONF_HSUSB0_DIR_OFFSET 0x176
220#define OMAP3_CONTROL_PADCONF_HSUSB0_NXT_OFFSET 0x178
221#define OMAP3_CONTROL_PADCONF_HSUSB0_DATA0_OFFSET 0x17a
222#define OMAP3_CONTROL_PADCONF_HSUSB0_DATA1_OFFSET 0x17c
223#define OMAP3_CONTROL_PADCONF_HSUSB0_DATA2_OFFSET 0x17e
224#define OMAP3_CONTROL_PADCONF_HSUSB0_DATA3_OFFSET 0x180
225#define OMAP3_CONTROL_PADCONF_HSUSB0_DATA4_OFFSET 0x182
226#define OMAP3_CONTROL_PADCONF_HSUSB0_DATA5_OFFSET 0x184
227#define OMAP3_CONTROL_PADCONF_HSUSB0_DATA6_OFFSET 0x186
228#define OMAP3_CONTROL_PADCONF_HSUSB0_DATA7_OFFSET 0x188
229#define OMAP3_CONTROL_PADCONF_I2C1_SCL_OFFSET 0x18a
230#define OMAP3_CONTROL_PADCONF_I2C1_SDA_OFFSET 0x18c
231#define OMAP3_CONTROL_PADCONF_I2C2_SCL_OFFSET 0x18e
232#define OMAP3_CONTROL_PADCONF_I2C2_SDA_OFFSET 0x190
233#define OMAP3_CONTROL_PADCONF_I2C3_SCL_OFFSET 0x192
234#define OMAP3_CONTROL_PADCONF_I2C3_SDA_OFFSET 0x194
235#define OMAP3_CONTROL_PADCONF_HDQ_SIO_OFFSET 0x196
236#define OMAP3_CONTROL_PADCONF_MCSPI1_CLK_OFFSET 0x198
237#define OMAP3_CONTROL_PADCONF_MCSPI1_SIMO_OFFSET 0x19a
238#define OMAP3_CONTROL_PADCONF_MCSPI1_SOMI_OFFSET 0x19c
239#define OMAP3_CONTROL_PADCONF_MCSPI1_CS0_OFFSET 0x19e
240#define OMAP3_CONTROL_PADCONF_MCSPI1_CS1_OFFSET 0x1a0
241#define OMAP3_CONTROL_PADCONF_MCSPI1_CS2_OFFSET 0x1a2
242#define OMAP3_CONTROL_PADCONF_MCSPI1_CS3_OFFSET 0x1a4
243#define OMAP3_CONTROL_PADCONF_MCSPI2_CLK_OFFSET 0x1a6
244#define OMAP3_CONTROL_PADCONF_MCSPI2_SIMO_OFFSET 0x1a8
245#define OMAP3_CONTROL_PADCONF_MCSPI2_SOMI_OFFSET 0x1aa
246#define OMAP3_CONTROL_PADCONF_MCSPI2_CS0_OFFSET 0x1ac
247#define OMAP3_CONTROL_PADCONF_MCSPI2_CS1_OFFSET 0x1ae
248#define OMAP3_CONTROL_PADCONF_SYS_NIRQ_OFFSET 0x1b0
249#define OMAP3_CONTROL_PADCONF_SYS_CLKOUT2_OFFSET 0x1b2
250#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD0_OFFSET 0x1b4
251#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD1_OFFSET 0x1b6
252#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD2_OFFSET 0x1b8
253#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD3_OFFSET 0x1ba
254#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD4_OFFSET 0x1bc
255#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD5_OFFSET 0x1be
256#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD6_OFFSET 0x1c0
257#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD7_OFFSET 0x1c2
258#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD8_OFFSET 0x1c4
259#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD9_OFFSET 0x1c6
260#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD10_OFFSET 0x1c8
261#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD11_OFFSET 0x1ca
262#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD12_OFFSET 0x1cc
263#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD13_OFFSET 0x1ce
264#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD14_OFFSET 0x1d0
265#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD15_OFFSET 0x1d2
266#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD16_OFFSET 0x1d4
267#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD17_OFFSET 0x1d6
268#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD18_OFFSET 0x1d8
269#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD19_OFFSET 0x1da
270#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD20_OFFSET 0x1dc
271#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD21_OFFSET 0x1de
272#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD22_OFFSET 0x1e0
273#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD23_OFFSET 0x1e2
274#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD24_OFFSET 0x1e4
275#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD25_OFFSET 0x1e6
276#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD26_OFFSET 0x1e8
277#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD27_OFFSET 0x1ea
278#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD28_OFFSET 0x1ec
279#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD29_OFFSET 0x1ee
280#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD30_OFFSET 0x1f0
281#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD31_OFFSET 0x1f2
282#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD32_OFFSET 0x1f4
283#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD33_OFFSET 0x1f6
284#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD34_OFFSET 0x1f8
285#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD35_OFFSET 0x1fa
286#define OMAP3_CONTROL_PADCONF_SAD2D_MCAD36_OFFSET 0x1fc
287
288/* Note that 34xx TRM has SAD2D instead of CHASSIS for these */
289#define OMAP3_CONTROL_PADCONF_CHASSIS_CLK26MI_OFFSET 0x1fe
290#define OMAP3_CONTROL_PADCONF_CHASSIS_NRESPWRON_OFFSET 0x200
291#define OMAP3_CONTROL_PADCONF_CHASSIS_NRESWARW_OFFSET 0x202
292#define OMAP3_CONTROL_PADCONF_CHASSIS_NIRQ_OFFSET 0x204
293#define OMAP3_CONTROL_PADCONF_CHASSIS_FIQ_OFFSET 0x206
294#define OMAP3_CONTROL_PADCONF_CHASSIS_ARMIRQ_OFFSET 0x208
295#define OMAP3_CONTROL_PADCONF_CHASSIS_IVAIRQ_OFFSET 0x20a
296#define OMAP3_CONTROL_PADCONF_CHASSIS_DMAREQ0_OFFSET 0x20c
297#define OMAP3_CONTROL_PADCONF_CHASSIS_DMAREQ1_OFFSET 0x20e
298#define OMAP3_CONTROL_PADCONF_CHASSIS_DMAREQ2_OFFSET 0x210
299#define OMAP3_CONTROL_PADCONF_CHASSIS_DMAREQ3_OFFSET 0x212
300#define OMAP3_CONTROL_PADCONF_CHASSIS_NTRST_OFFSET 0x214
301#define OMAP3_CONTROL_PADCONF_CHASSIS_TDI_OFFSET 0x216
302#define OMAP3_CONTROL_PADCONF_CHASSIS_TDO_OFFSET 0x218
303#define OMAP3_CONTROL_PADCONF_CHASSIS_TMS_OFFSET 0x21a
304#define OMAP3_CONTROL_PADCONF_CHASSIS_TCK_OFFSET 0x21c
305#define OMAP3_CONTROL_PADCONF_CHASSIS_RTCK_OFFSET 0x21e
306#define OMAP3_CONTROL_PADCONF_CHASSIS_MSTDBY_OFFSET 0x220
307#define OMAP3_CONTROL_PADCONF_CHASSIS_IDLEREQ_OFFSET 0x222
308#define OMAP3_CONTROL_PADCONF_CHASSIS_IDLEACK_OFFSET 0x224
309
310#define OMAP3_CONTROL_PADCONF_SAD2D_MWRITE_OFFSET 0x226
311#define OMAP3_CONTROL_PADCONF_SAD2D_SWRITE_OFFSET 0x228
312#define OMAP3_CONTROL_PADCONF_SAD2D_MREAD_OFFSET 0x22a
313#define OMAP3_CONTROL_PADCONF_SAD2D_SREAD_OFFSET 0x22c
314#define OMAP3_CONTROL_PADCONF_SAD2D_MBUSFLAG_OFFSET 0x22e
315#define OMAP3_CONTROL_PADCONF_SAD2D_SBUSFLAG_OFFSET 0x230
316#define OMAP3_CONTROL_PADCONF_SDRC_CKE0_OFFSET 0x232
317#define OMAP3_CONTROL_PADCONF_SDRC_CKE1_OFFSET 0x234
318
319/* 36xx only */
320#define OMAP3_CONTROL_PADCONF_GPMC_A11_OFFSET 0x236
321#define OMAP3_CONTROL_PADCONF_SDRC_BA0_OFFSET 0x570
322#define OMAP3_CONTROL_PADCONF_SDRC_BA1_OFFSET 0x572
323#define OMAP3_CONTROL_PADCONF_SDRC_A0_OFFSET 0x574
324#define OMAP3_CONTROL_PADCONF_SDRC_A1_OFFSET 0x576
325#define OMAP3_CONTROL_PADCONF_SDRC_A2_OFFSET 0x578
326#define OMAP3_CONTROL_PADCONF_SDRC_A3_OFFSET 0x57a
327#define OMAP3_CONTROL_PADCONF_SDRC_A4_OFFSET 0x57c
328#define OMAP3_CONTROL_PADCONF_SDRC_A5_OFFSET 0x57e
329#define OMAP3_CONTROL_PADCONF_SDRC_A6_OFFSET 0x580
330#define OMAP3_CONTROL_PADCONF_SDRC_A7_OFFSET 0x582
331#define OMAP3_CONTROL_PADCONF_SDRC_A8_OFFSET 0x584
332#define OMAP3_CONTROL_PADCONF_SDRC_A9_OFFSET 0x586
333#define OMAP3_CONTROL_PADCONF_SDRC_A10_OFFSET 0x588
334#define OMAP3_CONTROL_PADCONF_SDRC_A11_OFFSET 0x58a
335#define OMAP3_CONTROL_PADCONF_SDRC_A12_OFFSET 0x58c
336#define OMAP3_CONTROL_PADCONF_SDRC_A13_OFFSET 0x58e
337#define OMAP3_CONTROL_PADCONF_SDRC_A14_OFFSET 0x590
338#define OMAP3_CONTROL_PADCONF_SDRC_NCS0_OFFSET 0x592
339#define OMAP3_CONTROL_PADCONF_SDRC_NCS1_OFFSET 0x594
340#define OMAP3_CONTROL_PADCONF_SDRC_NCLK_OFFSET 0x596
341#define OMAP3_CONTROL_PADCONF_SDRC_NRAS_OFFSET 0x598
342#define OMAP3_CONTROL_PADCONF_SDRC_NCAS_OFFSET 0x59a
343#define OMAP3_CONTROL_PADCONF_SDRC_NWE_OFFSET 0x59c
344#define OMAP3_CONTROL_PADCONF_SDRC_DM0_OFFSET 0x59e
345#define OMAP3_CONTROL_PADCONF_SDRC_DM1_OFFSET 0x5a0
346#define OMAP3_CONTROL_PADCONF_SDRC_DM2_OFFSET 0x5a2
347#define OMAP3_CONTROL_PADCONF_SDRC_DM3_OFFSET 0x5a4
348
349/* 36xx only, these are SDMMC1_DAT4 - DAT7 on 34xx */
350#define OMAP3_CONTROL_PADCONF_SIM_IO_OFFSET 0x120
351#define OMAP3_CONTROL_PADCONF_SIM_CLK_OFFSET 0x122
352#define OMAP3_CONTROL_PADCONF_SIM_PWRCTRL_OFFSET 0x124
353#define OMAP3_CONTROL_PADCONF_SIM_RST_OFFSET 0x126
354
355#define OMAP3_CONTROL_PADCONF_ETK_CLK_OFFSET 0x5a8
356#define OMAP3_CONTROL_PADCONF_ETK_CTL_OFFSET 0x5aa
357#define OMAP3_CONTROL_PADCONF_ETK_D0_OFFSET 0x5ac
358#define OMAP3_CONTROL_PADCONF_ETK_D1_OFFSET 0x5ae
359#define OMAP3_CONTROL_PADCONF_ETK_D2_OFFSET 0x5b0
360#define OMAP3_CONTROL_PADCONF_ETK_D3_OFFSET 0x5b2
361#define OMAP3_CONTROL_PADCONF_ETK_D4_OFFSET 0x5b4
362#define OMAP3_CONTROL_PADCONF_ETK_D5_OFFSET 0x5b6
363#define OMAP3_CONTROL_PADCONF_ETK_D6_OFFSET 0x5b8
364#define OMAP3_CONTROL_PADCONF_ETK_D7_OFFSET 0x5ba
365#define OMAP3_CONTROL_PADCONF_ETK_D8_OFFSET 0x5bc
366#define OMAP3_CONTROL_PADCONF_ETK_D9_OFFSET 0x5be
367#define OMAP3_CONTROL_PADCONF_ETK_D10_OFFSET 0x5c0
368#define OMAP3_CONTROL_PADCONF_ETK_D11_OFFSET 0x5c2
369#define OMAP3_CONTROL_PADCONF_ETK_D12_OFFSET 0x5c4
370#define OMAP3_CONTROL_PADCONF_ETK_D13_OFFSET 0x5c6
371#define OMAP3_CONTROL_PADCONF_ETK_D14_OFFSET 0x5c8
372#define OMAP3_CONTROL_PADCONF_ETK_D15_OFFSET 0x5ca
373#define OMAP3_CONTROL_PADCONF_I2C4_SCL_OFFSET 0x9d0
374#define OMAP3_CONTROL_PADCONF_I2C4_SDA_OFFSET 0x9d2
375#define OMAP3_CONTROL_PADCONF_SYS_32K_OFFSET 0x9d4
376#define OMAP3_CONTROL_PADCONF_SYS_CLKREQ_OFFSET 0x9d6
377#define OMAP3_CONTROL_PADCONF_SYS_NRESWARM_OFFSET 0x9d8
378#define OMAP3_CONTROL_PADCONF_SYS_BOOT0_OFFSET 0x9da
379#define OMAP3_CONTROL_PADCONF_SYS_BOOT1_OFFSET 0x9dc
380#define OMAP3_CONTROL_PADCONF_SYS_BOOT2_OFFSET 0x9de
381#define OMAP3_CONTROL_PADCONF_SYS_BOOT3_OFFSET 0x9e0
382#define OMAP3_CONTROL_PADCONF_SYS_BOOT4_OFFSET 0x9e2
383#define OMAP3_CONTROL_PADCONF_SYS_BOOT5_OFFSET 0x9e4
384#define OMAP3_CONTROL_PADCONF_SYS_BOOT6_OFFSET 0x9e6
385#define OMAP3_CONTROL_PADCONF_SYS_OFF_MODE_OFFSET 0x9e8
386#define OMAP3_CONTROL_PADCONF_SYS_CLKOUT1_OFFSET 0x9ea
387#define OMAP3_CONTROL_PADCONF_JTAG_NTRST_OFFSET 0x9ec
388#define OMAP3_CONTROL_PADCONF_JTAG_TCK_OFFSET 0x9ee
389#define OMAP3_CONTROL_PADCONF_JTAG_TMS_TMSC_OFFSET 0x9f0
390#define OMAP3_CONTROL_PADCONF_JTAG_TDI_OFFSET 0x9f2
391#define OMAP3_CONTROL_PADCONF_JTAG_EMU0_OFFSET 0x9f4
392#define OMAP3_CONTROL_PADCONF_JTAG_EMU1_OFFSET 0x9f6
393#define OMAP3_CONTROL_PADCONF_SAD2D_SWAKEUP_OFFSET 0xa1c
394#define OMAP3_CONTROL_PADCONF_JTAG_RTCK_OFFSET 0xa1e
395#define OMAP3_CONTROL_PADCONF_JTAG_TDO_OFFSET 0xa20
396
397#define OMAP3_CONTROL_PADCONF_MUX_SIZE \
398 (OMAP3_CONTROL_PADCONF_JTAG_TDO_OFFSET + 0x2)
diff --git a/arch/arm/mach-omap2/omap-headsmp.S b/arch/arm/mach-omap2/omap-headsmp.S
index 4afadba09477..ef0e7a00dd6c 100644
--- a/arch/arm/mach-omap2/omap-headsmp.S
+++ b/arch/arm/mach-omap2/omap-headsmp.S
@@ -27,20 +27,39 @@
27 * OMAP4 specific entry point for secondary CPU to jump from ROM 27 * OMAP4 specific entry point for secondary CPU to jump from ROM
28 * code. This routine also provides a holding flag into which 28 * code. This routine also provides a holding flag into which
29 * secondary core is held until we're ready for it to initialise. 29 * secondary core is held until we're ready for it to initialise.
30 * The primary core will update the this flag using a hardware 30 * The primary core will update this flag using a hardware
31 * register AuxCoreBoot1. 31 * register AuxCoreBoot0.
32 */ 32 */
33ENTRY(omap_secondary_startup) 33ENTRY(omap_secondary_startup)
34 mrc p15, 0, r0, c0, c0, 5 34hold: ldr r12,=0x103
35 and r0, r0, #0x0f 35 dsb
36hold: ldr r1, =OMAP4_AUX_CORE_BOOT1_PA @ read from AuxCoreBoot1 36 smc #0 @ read from AuxCoreBoot0
37 ldr r2, [r1] 37 mov r0, r0, lsr #9
38 cmp r2, r0 38 mrc p15, 0, r4, c0, c0, 5
39 and r4, r4, #0x0f
40 cmp r0, r4
39 bne hold 41 bne hold
40 42
41 /* 43 /*
42 * we've been released from the cpu_release,secondary_stack 44 * we've been released from the wait loop,secondary_stack
43 * should now contain the SVC stack for this core 45 * should now contain the SVC stack for this core
44 */ 46 */
45 b secondary_startup 47 b secondary_startup
48END(omap_secondary_startup)
46 49
50
51ENTRY(omap_modify_auxcoreboot0)
52 stmfd sp!, {r1-r12, lr}
53 ldr r12, =0x104
54 dsb
55 smc #0
56 ldmfd sp!, {r1-r12, pc}
57END(omap_modify_auxcoreboot0)
58
59ENTRY(omap_auxcoreboot_addr)
60 stmfd sp!, {r2-r12, lr}
61 ldr r12, =0x105
62 dsb
63 smc #0
64 ldmfd sp!, {r2-r12, pc}
65END(omap_auxcoreboot_addr)
diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c
index 48ee295db275..38153e5fbca0 100644
--- a/arch/arm/mach-omap2/omap-smp.c
+++ b/arch/arm/mach-omap2/omap-smp.c
@@ -17,20 +17,17 @@
17 */ 17 */
18#include <linux/init.h> 18#include <linux/init.h>
19#include <linux/device.h> 19#include <linux/device.h>
20#include <linux/jiffies.h>
21#include <linux/smp.h> 20#include <linux/smp.h>
22#include <linux/io.h> 21#include <linux/io.h>
23 22
23#include <asm/cacheflush.h>
24#include <asm/localtimer.h> 24#include <asm/localtimer.h>
25#include <asm/smp_scu.h> 25#include <asm/smp_scu.h>
26#include <mach/hardware.h> 26#include <mach/hardware.h>
27 27#include <plat/common.h>
28/* Registers used for communicating startup information */
29#define OMAP4_AUXCOREBOOT_REG0 (OMAP44XX_VA_WKUPGEN_BASE + 0x800)
30#define OMAP4_AUXCOREBOOT_REG1 (OMAP44XX_VA_WKUPGEN_BASE + 0x804)
31 28
32/* SCU base address */ 29/* SCU base address */
33static void __iomem *scu_base = OMAP44XX_VA_SCU_BASE; 30static void __iomem *scu_base;
34 31
35/* 32/*
36 * Use SCU config register to count number of cores 33 * Use SCU config register to count number of cores
@@ -53,8 +50,7 @@ void __cpuinit platform_secondary_init(unsigned int cpu)
53 * core (e.g. timer irq), then they will not have been enabled 50 * core (e.g. timer irq), then they will not have been enabled
54 * for us: do so 51 * for us: do so
55 */ 52 */
56 53 gic_cpu_init(0, gic_cpu_base_addr);
57 gic_cpu_init(0, OMAP2_IO_ADDRESS(OMAP44XX_GIC_CPU_BASE));
58 54
59 /* 55 /*
60 * Synchronise with the boot thread. 56 * Synchronise with the boot thread.
@@ -65,8 +61,6 @@ void __cpuinit platform_secondary_init(unsigned int cpu)
65 61
66int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) 62int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
67{ 63{
68 unsigned long timeout;
69
70 /* 64 /*
71 * Set synchronisation state between this boot processor 65 * Set synchronisation state between this boot processor
72 * and the secondary one 66 * and the secondary one
@@ -74,18 +68,15 @@ int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle)
74 spin_lock(&boot_lock); 68 spin_lock(&boot_lock);
75 69
76 /* 70 /*
77 * Update the AuxCoreBoot1 with boot state for secondary core. 71 * Update the AuxCoreBoot0 with boot state for secondary core.
78 * omap_secondary_startup() routine will hold the secondary core till 72 * omap_secondary_startup() routine will hold the secondary core till
79 * the AuxCoreBoot1 register is updated with cpu state 73 * the AuxCoreBoot1 register is updated with cpu state
80 * A barrier is added to ensure that write buffer is drained 74 * A barrier is added to ensure that write buffer is drained
81 */ 75 */
82 __raw_writel(cpu, OMAP4_AUXCOREBOOT_REG1); 76 omap_modify_auxcoreboot0(0x200, 0x0);
77 flush_cache_all();
83 smp_wmb(); 78 smp_wmb();
84 79
85 timeout = jiffies + (1 * HZ);
86 while (time_before(jiffies, timeout))
87 ;
88
89 /* 80 /*
90 * Now the secondary core is starting up let it run its 81 * Now the secondary core is starting up let it run its
91 * calibrations, then wait for it to finish 82 * calibrations, then wait for it to finish
@@ -99,17 +90,18 @@ static void __init wakeup_secondary(void)
99{ 90{
100 /* 91 /*
101 * Write the address of secondary startup routine into the 92 * Write the address of secondary startup routine into the
102 * AuxCoreBoot0 where ROM code will jump and start executing 93 * AuxCoreBoot1 where ROM code will jump and start executing
103 * on secondary core once out of WFE 94 * on secondary core once out of WFE
104 * A barrier is added to ensure that write buffer is drained 95 * A barrier is added to ensure that write buffer is drained
105 */ 96 */
106 __raw_writel(virt_to_phys(omap_secondary_startup), \ 97 omap_auxcoreboot_addr(virt_to_phys(omap_secondary_startup));
107 OMAP4_AUXCOREBOOT_REG0);
108 smp_wmb(); 98 smp_wmb();
109 99
110 /* 100 /*
111 * Send a 'sev' to wake the secondary core from WFE. 101 * Send a 'sev' to wake the secondary core from WFE.
102 * Drain the outstanding writes to memory
112 */ 103 */
104 dsb();
113 set_event(); 105 set_event();
114 mb(); 106 mb();
115} 107}
@@ -120,7 +112,13 @@ static void __init wakeup_secondary(void)
120 */ 112 */
121void __init smp_init_cpus(void) 113void __init smp_init_cpus(void)
122{ 114{
123 unsigned int i, ncores = get_core_count(); 115 unsigned int i, ncores;
116
117 /* Never released */
118 scu_base = ioremap(OMAP44XX_SCU_BASE, SZ_256);
119 BUG_ON(!scu_base);
120
121 ncores = get_core_count();
124 122
125 for (i = 0; i < ncores; i++) 123 for (i = 0; i < ncores; i++)
126 set_cpu_possible(i, true); 124 set_cpu_possible(i, true);
diff --git a/arch/arm/mach-omap2/omap3-iommu.c b/arch/arm/mach-omap2/omap3-iommu.c
index 194189c746c2..fbbcb5c83367 100644
--- a/arch/arm/mach-omap2/omap3-iommu.c
+++ b/arch/arm/mach-omap2/omap3-iommu.c
@@ -12,49 +12,52 @@
12 12
13#include <linux/platform_device.h> 13#include <linux/platform_device.h>
14 14
15#include <mach/iommu.h> 15#include <plat/iommu.h>
16 16
17#define OMAP3_MMU1_BASE 0x480bd400 17struct iommu_device {
18#define OMAP3_MMU2_BASE 0x5d000000 18 resource_size_t base;
19#define OMAP3_MMU1_IRQ 24 19 int irq;
20#define OMAP3_MMU2_IRQ 28 20 struct iommu_platform_data pdata;
21 21 struct resource res[2];
22
23static unsigned long iommu_base[] __initdata = {
24 OMAP3_MMU1_BASE,
25 OMAP3_MMU2_BASE,
26};
27
28static int iommu_irq[] __initdata = {
29 OMAP3_MMU1_IRQ,
30 OMAP3_MMU2_IRQ,
31}; 22};
32 23
33static const struct iommu_platform_data omap3_iommu_pdata[] __initconst = { 24static struct iommu_device devices[] = {
34 { 25 {
35 .name = "isp", 26 .base = 0x480bd400,
36 .nr_tlb_entries = 8, 27 .irq = 24,
37 .clk_name = "cam_ick", 28 .pdata = {
29 .name = "isp",
30 .nr_tlb_entries = 8,
31 .clk_name = "cam_ick",
32 },
38 }, 33 },
39#if defined(CONFIG_MPU_BRIDGE_IOMMU) 34#if defined(CONFIG_MPU_BRIDGE_IOMMU)
40 { 35 {
41 .name = "iva2", 36 .base = 0x5d000000,
42 .nr_tlb_entries = 32, 37 .irq = 28,
43 .clk_name = "iva2_ck", 38 .pdata = {
39 .name = "iva2",
40 .nr_tlb_entries = 32,
41 .clk_name = "iva2_ck",
42 },
44 }, 43 },
45#endif 44#endif
46}; 45};
47#define NR_IOMMU_DEVICES ARRAY_SIZE(omap3_iommu_pdata) 46#define NR_IOMMU_DEVICES ARRAY_SIZE(devices)
48 47
49static struct platform_device *omap3_iommu_pdev[NR_IOMMU_DEVICES]; 48static struct platform_device *omap3_iommu_pdev[NR_IOMMU_DEVICES];
50 49
51static int __init omap3_iommu_init(void) 50static int __init omap3_iommu_init(void)
52{ 51{
53 int i, err; 52 int i, err;
53 struct resource res[] = {
54 { .flags = IORESOURCE_MEM },
55 { .flags = IORESOURCE_IRQ },
56 };
54 57
55 for (i = 0; i < NR_IOMMU_DEVICES; i++) { 58 for (i = 0; i < NR_IOMMU_DEVICES; i++) {
56 struct platform_device *pdev; 59 struct platform_device *pdev;
57 struct resource res[2]; 60 const struct iommu_device *d = &devices[i];
58 61
59 pdev = platform_device_alloc("omap-iommu", i); 62 pdev = platform_device_alloc("omap-iommu", i);
60 if (!pdev) { 63 if (!pdev) {
@@ -62,19 +65,16 @@ static int __init omap3_iommu_init(void)
62 goto err_out; 65 goto err_out;
63 } 66 }
64 67
65 memset(res, 0, sizeof(res)); 68 res[0].start = d->base;
66 res[0].start = iommu_base[i]; 69 res[0].end = d->base + MMU_REG_SIZE - 1;
67 res[0].end = iommu_base[i] + MMU_REG_SIZE - 1; 70 res[1].start = res[1].end = d->irq;
68 res[0].flags = IORESOURCE_MEM;
69 res[1].start = res[1].end = iommu_irq[i];
70 res[1].flags = IORESOURCE_IRQ;
71 71
72 err = platform_device_add_resources(pdev, res, 72 err = platform_device_add_resources(pdev, res,
73 ARRAY_SIZE(res)); 73 ARRAY_SIZE(res));
74 if (err) 74 if (err)
75 goto err_out; 75 goto err_out;
76 err = platform_device_add_data(pdev, &omap3_iommu_pdata[i], 76 err = platform_device_add_data(pdev, &d->pdata,
77 sizeof(omap3_iommu_pdata[0])); 77 sizeof(d->pdata));
78 if (err) 78 if (err)
79 goto err_out; 79 goto err_out;
80 err = platform_device_add(pdev); 80 err = platform_device_add(pdev);
diff --git a/arch/arm/mach-omap2/omap44xx-smc.S b/arch/arm/mach-omap2/omap44xx-smc.S
new file mode 100644
index 000000000000..f61c7771ca47
--- /dev/null
+++ b/arch/arm/mach-omap2/omap44xx-smc.S
@@ -0,0 +1,32 @@
1/*
2 * OMAP44xx secure APIs file.
3 *
4 * Copyright (C) 2010 Texas Instruments, Inc.
5 * Written by Santosh Shilimkar <santosh.shilimkar@ti.com>
6 *
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#include <linux/linkage.h>
14
15/*
16 * This is common routine to manage secure monitor API
17 * used to modify the PL310 secure registers.
18 * 'r0' contains the value to be modified and 'r12' contains
19 * the monitor API number. It uses few CPU registers
20 * internally and hence they need be backed up including
21 * link register "lr".
22 * Function signature : void omap_smc1(u32 fn, u32 arg)
23 */
24
25ENTRY(omap_smc1)
26 stmfd sp!, {r2-r12, lr}
27 mov r12, r0
28 mov r0, r1
29 dsb
30 smc #0
31 ldmfd sp!, {r2-r12, pc}
32END(omap_smc1)
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index d2e0f1c95961..e436dcb19795 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -45,11 +45,12 @@
45#include <linux/mutex.h> 45#include <linux/mutex.h>
46#include <linux/bootmem.h> 46#include <linux/bootmem.h>
47 47
48#include <mach/cpu.h> 48#include <plat/common.h>
49#include <mach/clockdomain.h> 49#include <plat/cpu.h>
50#include <mach/powerdomain.h> 50#include <plat/clockdomain.h>
51#include <mach/clock.h> 51#include <plat/powerdomain.h>
52#include <mach/omap_hwmod.h> 52#include <plat/clock.h>
53#include <plat/omap_hwmod.h>
53 54
54#include "cm.h" 55#include "cm.h"
55 56
@@ -83,17 +84,17 @@ static u8 inited;
83 */ 84 */
84static int _update_sysc_cache(struct omap_hwmod *oh) 85static int _update_sysc_cache(struct omap_hwmod *oh)
85{ 86{
86 if (!oh->sysconfig) { 87 if (!oh->class->sysc) {
87 WARN(!oh->sysconfig, "omap_hwmod: %s: cannot read " 88 WARN(1, "omap_hwmod: %s: cannot read OCP_SYSCONFIG: not defined on hwmod's class\n", oh->name);
88 "OCP_SYSCONFIG: not defined on hwmod\n", oh->name);
89 return -EINVAL; 89 return -EINVAL;
90 } 90 }
91 91
92 /* XXX ensure module interface clock is up */ 92 /* XXX ensure module interface clock is up */
93 93
94 oh->_sysc_cache = omap_hwmod_readl(oh, oh->sysconfig->sysc_offs); 94 oh->_sysc_cache = omap_hwmod_readl(oh, oh->class->sysc->sysc_offs);
95 95
96 oh->_int_flags |= _HWMOD_SYSCONFIG_LOADED; 96 if (!(oh->class->sysc->sysc_flags & SYSC_NO_CACHE))
97 oh->_int_flags |= _HWMOD_SYSCONFIG_LOADED;
97 98
98 return 0; 99 return 0;
99} 100}
@@ -103,14 +104,13 @@ static int _update_sysc_cache(struct omap_hwmod *oh)
103 * @v: OCP_SYSCONFIG value to write 104 * @v: OCP_SYSCONFIG value to write
104 * @oh: struct omap_hwmod * 105 * @oh: struct omap_hwmod *
105 * 106 *
106 * Write @v into the module OCP_SYSCONFIG register, if it has one. No 107 * Write @v into the module class' OCP_SYSCONFIG register, if it has
107 * return value. 108 * one. No return value.
108 */ 109 */
109static void _write_sysconfig(u32 v, struct omap_hwmod *oh) 110static void _write_sysconfig(u32 v, struct omap_hwmod *oh)
110{ 111{
111 if (!oh->sysconfig) { 112 if (!oh->class->sysc) {
112 WARN(!oh->sysconfig, "omap_hwmod: %s: cannot write " 113 WARN(1, "omap_hwmod: %s: cannot write OCP_SYSCONFIG: not defined on hwmod's class\n", oh->name);
113 "OCP_SYSCONFIG: not defined on hwmod\n", oh->name);
114 return; 114 return;
115 } 115 }
116 116
@@ -118,7 +118,7 @@ static void _write_sysconfig(u32 v, struct omap_hwmod *oh)
118 118
119 if (oh->_sysc_cache != v) { 119 if (oh->_sysc_cache != v) {
120 oh->_sysc_cache = v; 120 oh->_sysc_cache = v;
121 omap_hwmod_writel(v, oh, oh->sysconfig->sysc_offs); 121 omap_hwmod_writel(v, oh, oh->class->sysc->sysc_offs);
122 } 122 }
123} 123}
124 124
@@ -135,12 +135,23 @@ static void _write_sysconfig(u32 v, struct omap_hwmod *oh)
135static int _set_master_standbymode(struct omap_hwmod *oh, u8 standbymode, 135static int _set_master_standbymode(struct omap_hwmod *oh, u8 standbymode,
136 u32 *v) 136 u32 *v)
137{ 137{
138 if (!oh->sysconfig || 138 u32 mstandby_mask;
139 !(oh->sysconfig->sysc_flags & SYSC_HAS_MIDLEMODE)) 139 u8 mstandby_shift;
140
141 if (!oh->class->sysc ||
142 !(oh->class->sysc->sysc_flags & SYSC_HAS_MIDLEMODE))
143 return -EINVAL;
144
145 if (!oh->class->sysc->sysc_fields) {
146 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
140 return -EINVAL; 147 return -EINVAL;
148 }
149
150 mstandby_shift = oh->class->sysc->sysc_fields->midle_shift;
151 mstandby_mask = (0x3 << mstandby_shift);
141 152
142 *v &= ~SYSC_MIDLEMODE_MASK; 153 *v &= ~mstandby_mask;
143 *v |= __ffs(standbymode) << SYSC_MIDLEMODE_SHIFT; 154 *v |= __ffs(standbymode) << mstandby_shift;
144 155
145 return 0; 156 return 0;
146} 157}
@@ -157,12 +168,23 @@ static int _set_master_standbymode(struct omap_hwmod *oh, u8 standbymode,
157 */ 168 */
158static int _set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode, u32 *v) 169static int _set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode, u32 *v)
159{ 170{
160 if (!oh->sysconfig || 171 u32 sidle_mask;
161 !(oh->sysconfig->sysc_flags & SYSC_HAS_SIDLEMODE)) 172 u8 sidle_shift;
173
174 if (!oh->class->sysc ||
175 !(oh->class->sysc->sysc_flags & SYSC_HAS_SIDLEMODE))
176 return -EINVAL;
177
178 if (!oh->class->sysc->sysc_fields) {
179 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
162 return -EINVAL; 180 return -EINVAL;
181 }
182
183 sidle_shift = oh->class->sysc->sysc_fields->sidle_shift;
184 sidle_mask = (0x3 << sidle_shift);
163 185
164 *v &= ~SYSC_SIDLEMODE_MASK; 186 *v &= ~sidle_mask;
165 *v |= __ffs(idlemode) << SYSC_SIDLEMODE_SHIFT; 187 *v |= __ffs(idlemode) << sidle_shift;
166 188
167 return 0; 189 return 0;
168} 190}
@@ -180,12 +202,23 @@ static int _set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode, u32 *v)
180 */ 202 */
181static int _set_clockactivity(struct omap_hwmod *oh, u8 clockact, u32 *v) 203static int _set_clockactivity(struct omap_hwmod *oh, u8 clockact, u32 *v)
182{ 204{
183 if (!oh->sysconfig || 205 u32 clkact_mask;
184 !(oh->sysconfig->sysc_flags & SYSC_HAS_CLOCKACTIVITY)) 206 u8 clkact_shift;
207
208 if (!oh->class->sysc ||
209 !(oh->class->sysc->sysc_flags & SYSC_HAS_CLOCKACTIVITY))
210 return -EINVAL;
211
212 if (!oh->class->sysc->sysc_fields) {
213 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
185 return -EINVAL; 214 return -EINVAL;
215 }
216
217 clkact_shift = oh->class->sysc->sysc_fields->clkact_shift;
218 clkact_mask = (0x3 << clkact_shift);
186 219
187 *v &= ~SYSC_CLOCKACTIVITY_MASK; 220 *v &= ~clkact_mask;
188 *v |= clockact << SYSC_CLOCKACTIVITY_SHIFT; 221 *v |= clockact << clkact_shift;
189 222
190 return 0; 223 return 0;
191} 224}
@@ -200,11 +233,57 @@ static int _set_clockactivity(struct omap_hwmod *oh, u8 clockact, u32 *v)
200 */ 233 */
201static int _set_softreset(struct omap_hwmod *oh, u32 *v) 234static int _set_softreset(struct omap_hwmod *oh, u32 *v)
202{ 235{
203 if (!oh->sysconfig || 236 u32 softrst_mask;
204 !(oh->sysconfig->sysc_flags & SYSC_HAS_SOFTRESET)) 237
238 if (!oh->class->sysc ||
239 !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET))
240 return -EINVAL;
241
242 if (!oh->class->sysc->sysc_fields) {
243 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
244 return -EINVAL;
245 }
246
247 softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift);
248
249 *v |= softrst_mask;
250
251 return 0;
252}
253
254/**
255 * _set_module_autoidle: set the OCP_SYSCONFIG AUTOIDLE field in @v
256 * @oh: struct omap_hwmod *
257 * @autoidle: desired AUTOIDLE bitfield value (0 or 1)
258 * @v: pointer to register contents to modify
259 *
260 * Update the module autoidle bit in @v to be @autoidle for the @oh
261 * hwmod. The autoidle bit controls whether the module can gate
262 * internal clocks automatically when it isn't doing anything; the
263 * exact function of this bit varies on a per-module basis. This
264 * function does not write to the hardware. Returns -EINVAL upon
265 * error or 0 upon success.
266 */
267static int _set_module_autoidle(struct omap_hwmod *oh, u8 autoidle,
268 u32 *v)
269{
270 u32 autoidle_mask;
271 u8 autoidle_shift;
272
273 if (!oh->class->sysc ||
274 !(oh->class->sysc->sysc_flags & SYSC_HAS_AUTOIDLE))
205 return -EINVAL; 275 return -EINVAL;
206 276
207 *v |= SYSC_SOFTRESET_MASK; 277 if (!oh->class->sysc->sysc_fields) {
278 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
279 return -EINVAL;
280 }
281
282 autoidle_shift = oh->class->sysc->sysc_fields->autoidle_shift;
283 autoidle_mask = (0x3 << autoidle_shift);
284
285 *v &= ~autoidle_mask;
286 *v |= autoidle << autoidle_shift;
208 287
209 return 0; 288 return 0;
210} 289}
@@ -218,14 +297,21 @@ static int _set_softreset(struct omap_hwmod *oh, u32 *v)
218 */ 297 */
219static int _enable_wakeup(struct omap_hwmod *oh) 298static int _enable_wakeup(struct omap_hwmod *oh)
220{ 299{
221 u32 v; 300 u32 v, wakeup_mask;
301
302 if (!oh->class->sysc ||
303 !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP))
304 return -EINVAL;
222 305
223 if (!oh->sysconfig || 306 if (!oh->class->sysc->sysc_fields) {
224 !(oh->sysconfig->sysc_flags & SYSC_HAS_ENAWAKEUP)) 307 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
225 return -EINVAL; 308 return -EINVAL;
309 }
310
311 wakeup_mask = (0x1 << oh->class->sysc->sysc_fields->enwkup_shift);
226 312
227 v = oh->_sysc_cache; 313 v = oh->_sysc_cache;
228 v |= SYSC_ENAWAKEUP_MASK; 314 v |= wakeup_mask;
229 _write_sysconfig(v, oh); 315 _write_sysconfig(v, oh);
230 316
231 /* XXX test pwrdm_get_wken for this hwmod's subsystem */ 317 /* XXX test pwrdm_get_wken for this hwmod's subsystem */
@@ -244,14 +330,21 @@ static int _enable_wakeup(struct omap_hwmod *oh)
244 */ 330 */
245static int _disable_wakeup(struct omap_hwmod *oh) 331static int _disable_wakeup(struct omap_hwmod *oh)
246{ 332{
247 u32 v; 333 u32 v, wakeup_mask;
334
335 if (!oh->class->sysc ||
336 !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP))
337 return -EINVAL;
248 338
249 if (!oh->sysconfig || 339 if (!oh->class->sysc->sysc_fields) {
250 !(oh->sysconfig->sysc_flags & SYSC_HAS_ENAWAKEUP)) 340 WARN(1, "omap_hwmod: %s: offset struct for sysconfig not provided in class\n", oh->name);
251 return -EINVAL; 341 return -EINVAL;
342 }
343
344 wakeup_mask = (0x1 << oh->class->sysc->sysc_fields->enwkup_shift);
252 345
253 v = oh->_sysc_cache; 346 v = oh->_sysc_cache;
254 v &= ~SYSC_ENAWAKEUP_MASK; 347 v &= ~wakeup_mask;
255 _write_sysconfig(v, oh); 348 _write_sysconfig(v, oh);
256 349
257 /* XXX test pwrdm_get_wken for this hwmod's subsystem */ 350 /* XXX test pwrdm_get_wken for this hwmod's subsystem */
@@ -271,15 +364,14 @@ static int _disable_wakeup(struct omap_hwmod *oh)
271 * be accessed by the IVA, there should be a sleepdep between the IVA 364 * be accessed by the IVA, there should be a sleepdep between the IVA
272 * initiator and the module). Only applies to modules in smart-idle 365 * initiator and the module). Only applies to modules in smart-idle
273 * mode. Returns -EINVAL upon error or passes along 366 * mode. Returns -EINVAL upon error or passes along
274 * pwrdm_add_sleepdep() value upon success. 367 * clkdm_add_sleepdep() value upon success.
275 */ 368 */
276static int _add_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh) 369static int _add_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)
277{ 370{
278 if (!oh->_clk) 371 if (!oh->_clk)
279 return -EINVAL; 372 return -EINVAL;
280 373
281 return pwrdm_add_sleepdep(oh->_clk->clkdm->pwrdm.ptr, 374 return clkdm_add_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm);
282 init_oh->_clk->clkdm->pwrdm.ptr);
283} 375}
284 376
285/** 377/**
@@ -292,15 +384,14 @@ static int _add_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)
292 * be accessed by the IVA, there should be no sleepdep between the IVA 384 * be accessed by the IVA, there should be no sleepdep between the IVA
293 * initiator and the module). Only applies to modules in smart-idle 385 * initiator and the module). Only applies to modules in smart-idle
294 * mode. Returns -EINVAL upon error or passes along 386 * mode. Returns -EINVAL upon error or passes along
295 * pwrdm_add_sleepdep() value upon success. 387 * clkdm_del_sleepdep() value upon success.
296 */ 388 */
297static int _del_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh) 389static int _del_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)
298{ 390{
299 if (!oh->_clk) 391 if (!oh->_clk)
300 return -EINVAL; 392 return -EINVAL;
301 393
302 return pwrdm_del_sleepdep(oh->_clk->clkdm->pwrdm.ptr, 394 return clkdm_del_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm);
303 init_oh->_clk->clkdm->pwrdm.ptr);
304} 395}
305 396
306/** 397/**
@@ -316,16 +407,19 @@ static int _init_main_clk(struct omap_hwmod *oh)
316 struct clk *c; 407 struct clk *c;
317 int ret = 0; 408 int ret = 0;
318 409
319 if (!oh->clkdev_con_id) 410 if (!oh->main_clk)
320 return 0; 411 return 0;
321 412
322 c = clk_get_sys(oh->clkdev_dev_id, oh->clkdev_con_id); 413 c = omap_clk_get_by_name(oh->main_clk);
323 WARN(IS_ERR(c), "omap_hwmod: %s: cannot clk_get main_clk %s.%s\n", 414 WARN(IS_ERR(c), "omap_hwmod: %s: cannot clk_get main_clk %s\n",
324 oh->name, oh->clkdev_dev_id, oh->clkdev_con_id); 415 oh->name, oh->main_clk);
325 if (IS_ERR(c)) 416 if (IS_ERR(c))
326 ret = -EINVAL; 417 ret = -EINVAL;
327 oh->_clk = c; 418 oh->_clk = c;
328 419
420 WARN(!c->clkdm, "omap_hwmod: %s: missing clockdomain for %s.\n",
421 oh->main_clk, c->name);
422
329 return ret; 423 return ret;
330} 424}
331 425
@@ -347,13 +441,12 @@ static int _init_interface_clks(struct omap_hwmod *oh)
347 return 0; 441 return 0;
348 442
349 for (i = 0, os = *oh->slaves; i < oh->slaves_cnt; i++, os++) { 443 for (i = 0, os = *oh->slaves; i < oh->slaves_cnt; i++, os++) {
350 if (!os->clkdev_con_id) 444 if (!os->clk)
351 continue; 445 continue;
352 446
353 c = clk_get_sys(os->clkdev_dev_id, os->clkdev_con_id); 447 c = omap_clk_get_by_name(os->clk);
354 WARN(IS_ERR(c), "omap_hwmod: %s: cannot clk_get " 448 WARN(IS_ERR(c), "omap_hwmod: %s: cannot clk_get "
355 "interface_clk %s.%s\n", oh->name, 449 "interface_clk %s\n", oh->name, os->clk);
356 os->clkdev_dev_id, os->clkdev_con_id);
357 if (IS_ERR(c)) 450 if (IS_ERR(c))
358 ret = -EINVAL; 451 ret = -EINVAL;
359 os->_clk = c; 452 os->_clk = c;
@@ -377,10 +470,9 @@ static int _init_opt_clks(struct omap_hwmod *oh)
377 int ret = 0; 470 int ret = 0;
378 471
379 for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) { 472 for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++) {
380 c = clk_get_sys(oc->clkdev_dev_id, oc->clkdev_con_id); 473 c = omap_clk_get_by_name(oc->clk);
381 WARN(IS_ERR(c), "omap_hwmod: %s: cannot clk_get opt_clk " 474 WARN(IS_ERR(c), "omap_hwmod: %s: cannot clk_get opt_clk "
382 "%s.%s\n", oh->name, oc->clkdev_dev_id, 475 "%s\n", oh->name, oc->clk);
383 oc->clkdev_con_id);
384 if (IS_ERR(c)) 476 if (IS_ERR(c))
385 ret = -EINVAL; 477 ret = -EINVAL;
386 oc->_clk = c; 478 oc->_clk = c;
@@ -496,6 +588,7 @@ static void __iomem *_find_mpu_rt_base(struct omap_hwmod *oh, u8 index)
496 struct omap_hwmod_addr_space *mem; 588 struct omap_hwmod_addr_space *mem;
497 int i; 589 int i;
498 int found = 0; 590 int found = 0;
591 void __iomem *va_start;
499 592
500 if (!oh || oh->slaves_cnt == 0) 593 if (!oh || oh->slaves_cnt == 0)
501 return NULL; 594 return NULL;
@@ -509,16 +602,20 @@ static void __iomem *_find_mpu_rt_base(struct omap_hwmod *oh, u8 index)
509 } 602 }
510 } 603 }
511 604
512 /* XXX use ioremap() instead? */ 605 if (found) {
513 606 va_start = ioremap(mem->pa_start, mem->pa_end - mem->pa_start);
514 if (found) 607 if (!va_start) {
608 pr_err("omap_hwmod: %s: Could not ioremap\n", oh->name);
609 return NULL;
610 }
515 pr_debug("omap_hwmod: %s: MPU register target at va %p\n", 611 pr_debug("omap_hwmod: %s: MPU register target at va %p\n",
516 oh->name, OMAP2_IO_ADDRESS(mem->pa_start)); 612 oh->name, va_start);
517 else 613 } else {
518 pr_debug("omap_hwmod: %s: no MPU register target found\n", 614 pr_debug("omap_hwmod: %s: no MPU register target found\n",
519 oh->name); 615 oh->name);
616 }
520 617
521 return (found) ? OMAP2_IO_ADDRESS(mem->pa_start) : NULL; 618 return (found) ? va_start : NULL;
522} 619}
523 620
524/** 621/**
@@ -532,31 +629,43 @@ static void __iomem *_find_mpu_rt_base(struct omap_hwmod *oh, u8 index)
532 */ 629 */
533static void _sysc_enable(struct omap_hwmod *oh) 630static void _sysc_enable(struct omap_hwmod *oh)
534{ 631{
535 u8 idlemode; 632 u8 idlemode, sf;
536 u32 v; 633 u32 v;
537 634
538 if (!oh->sysconfig) 635 if (!oh->class->sysc)
539 return; 636 return;
540 637
541 v = oh->_sysc_cache; 638 v = oh->_sysc_cache;
639 sf = oh->class->sysc->sysc_flags;
542 640
543 if (oh->sysconfig->sysc_flags & SYSC_HAS_SIDLEMODE) { 641 if (sf & SYSC_HAS_SIDLEMODE) {
544 idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ? 642 idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ?
545 HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART; 643 HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART;
546 _set_slave_idlemode(oh, idlemode, &v); 644 _set_slave_idlemode(oh, idlemode, &v);
547 } 645 }
548 646
549 if (oh->sysconfig->sysc_flags & SYSC_HAS_MIDLEMODE) { 647 if (sf & SYSC_HAS_MIDLEMODE) {
550 idlemode = (oh->flags & HWMOD_SWSUP_MSTANDBY) ? 648 idlemode = (oh->flags & HWMOD_SWSUP_MSTANDBY) ?
551 HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART; 649 HWMOD_IDLEMODE_NO : HWMOD_IDLEMODE_SMART;
552 _set_master_standbymode(oh, idlemode, &v); 650 _set_master_standbymode(oh, idlemode, &v);
553 } 651 }
554 652
555 /* XXX OCP AUTOIDLE bit? */ 653 if (sf & SYSC_HAS_AUTOIDLE) {
654 idlemode = (oh->flags & HWMOD_NO_OCP_AUTOIDLE) ?
655 0 : 1;
656 _set_module_autoidle(oh, idlemode, &v);
657 }
658
659 /* XXX OCP ENAWAKEUP bit? */
556 660
557 if (oh->flags & HWMOD_SET_DEFAULT_CLOCKACT && 661 /*
558 oh->sysconfig->sysc_flags & SYSC_HAS_CLOCKACTIVITY) 662 * XXX The clock framework should handle this, by
559 _set_clockactivity(oh, oh->sysconfig->clockact, &v); 663 * calling into this code. But this must wait until the
664 * clock structures are tagged with omap_hwmod entries
665 */
666 if ((oh->flags & HWMOD_SET_DEFAULT_CLOCKACT) &&
667 (sf & SYSC_HAS_CLOCKACTIVITY))
668 _set_clockactivity(oh, oh->class->sysc->clockact, &v);
560 669
561 _write_sysconfig(v, oh); 670 _write_sysconfig(v, oh);
562} 671}
@@ -572,21 +681,22 @@ static void _sysc_enable(struct omap_hwmod *oh)
572 */ 681 */
573static void _sysc_idle(struct omap_hwmod *oh) 682static void _sysc_idle(struct omap_hwmod *oh)
574{ 683{
575 u8 idlemode; 684 u8 idlemode, sf;
576 u32 v; 685 u32 v;
577 686
578 if (!oh->sysconfig) 687 if (!oh->class->sysc)
579 return; 688 return;
580 689
581 v = oh->_sysc_cache; 690 v = oh->_sysc_cache;
691 sf = oh->class->sysc->sysc_flags;
582 692
583 if (oh->sysconfig->sysc_flags & SYSC_HAS_SIDLEMODE) { 693 if (sf & SYSC_HAS_SIDLEMODE) {
584 idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ? 694 idlemode = (oh->flags & HWMOD_SWSUP_SIDLE) ?
585 HWMOD_IDLEMODE_FORCE : HWMOD_IDLEMODE_SMART; 695 HWMOD_IDLEMODE_FORCE : HWMOD_IDLEMODE_SMART;
586 _set_slave_idlemode(oh, idlemode, &v); 696 _set_slave_idlemode(oh, idlemode, &v);
587 } 697 }
588 698
589 if (oh->sysconfig->sysc_flags & SYSC_HAS_MIDLEMODE) { 699 if (sf & SYSC_HAS_MIDLEMODE) {
590 idlemode = (oh->flags & HWMOD_SWSUP_MSTANDBY) ? 700 idlemode = (oh->flags & HWMOD_SWSUP_MSTANDBY) ?
591 HWMOD_IDLEMODE_FORCE : HWMOD_IDLEMODE_SMART; 701 HWMOD_IDLEMODE_FORCE : HWMOD_IDLEMODE_SMART;
592 _set_master_standbymode(oh, idlemode, &v); 702 _set_master_standbymode(oh, idlemode, &v);
@@ -605,19 +715,22 @@ static void _sysc_idle(struct omap_hwmod *oh)
605static void _sysc_shutdown(struct omap_hwmod *oh) 715static void _sysc_shutdown(struct omap_hwmod *oh)
606{ 716{
607 u32 v; 717 u32 v;
718 u8 sf;
608 719
609 if (!oh->sysconfig) 720 if (!oh->class->sysc)
610 return; 721 return;
611 722
612 v = oh->_sysc_cache; 723 v = oh->_sysc_cache;
724 sf = oh->class->sysc->sysc_flags;
613 725
614 if (oh->sysconfig->sysc_flags & SYSC_HAS_SIDLEMODE) 726 if (sf & SYSC_HAS_SIDLEMODE)
615 _set_slave_idlemode(oh, HWMOD_IDLEMODE_FORCE, &v); 727 _set_slave_idlemode(oh, HWMOD_IDLEMODE_FORCE, &v);
616 728
617 if (oh->sysconfig->sysc_flags & SYSC_HAS_MIDLEMODE) 729 if (sf & SYSC_HAS_MIDLEMODE)
618 _set_master_standbymode(oh, HWMOD_IDLEMODE_FORCE, &v); 730 _set_master_standbymode(oh, HWMOD_IDLEMODE_FORCE, &v);
619 731
620 /* XXX clear OCP AUTOIDLE bit? */ 732 if (sf & SYSC_HAS_AUTOIDLE)
733 _set_module_autoidle(oh, 1, &v);
621 734
622 _write_sysconfig(v, oh); 735 _write_sysconfig(v, oh);
623} 736}
@@ -731,11 +844,11 @@ static int _wait_target_ready(struct omap_hwmod *oh)
731static int _reset(struct omap_hwmod *oh) 844static int _reset(struct omap_hwmod *oh)
732{ 845{
733 u32 r, v; 846 u32 r, v;
734 int c; 847 int c = 0;
735 848
736 if (!oh->sysconfig || 849 if (!oh->class->sysc ||
737 !(oh->sysconfig->sysc_flags & SYSC_HAS_SOFTRESET) || 850 !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET) ||
738 (oh->sysconfig->sysc_flags & SYSS_MISSING)) 851 (oh->class->sysc->sysc_flags & SYSS_MISSING))
739 return -EINVAL; 852 return -EINVAL;
740 853
741 /* clocks must be on for this operation */ 854 /* clocks must be on for this operation */
@@ -753,13 +866,9 @@ static int _reset(struct omap_hwmod *oh)
753 return r; 866 return r;
754 _write_sysconfig(v, oh); 867 _write_sysconfig(v, oh);
755 868
756 c = 0; 869 omap_test_timeout((omap_hwmod_readl(oh, oh->class->sysc->syss_offs) &
757 while (c < MAX_MODULE_RESET_WAIT && 870 SYSS_RESETDONE_MASK),
758 !(omap_hwmod_readl(oh, oh->sysconfig->syss_offs) & 871 MAX_MODULE_RESET_WAIT, c);
759 SYSS_RESETDONE_MASK)) {
760 udelay(1);
761 c++;
762 }
763 872
764 if (c == MAX_MODULE_RESET_WAIT) 873 if (c == MAX_MODULE_RESET_WAIT)
765 WARN(1, "omap_hwmod: %s: failed to reset in %d usec\n", 874 WARN(1, "omap_hwmod: %s: failed to reset in %d usec\n",
@@ -803,7 +912,7 @@ static int _enable(struct omap_hwmod *oh)
803 _add_initiator_dep(oh, mpu_oh); 912 _add_initiator_dep(oh, mpu_oh);
804 _enable_clocks(oh); 913 _enable_clocks(oh);
805 914
806 if (oh->sysconfig) { 915 if (oh->class->sysc) {
807 if (!(oh->_int_flags & _HWMOD_SYSCONFIG_LOADED)) 916 if (!(oh->_int_flags & _HWMOD_SYSCONFIG_LOADED))
808 _update_sysc_cache(oh); 917 _update_sysc_cache(oh);
809 _sysc_enable(oh); 918 _sysc_enable(oh);
@@ -834,7 +943,7 @@ static int _idle(struct omap_hwmod *oh)
834 943
835 pr_debug("omap_hwmod: %s: idling\n", oh->name); 944 pr_debug("omap_hwmod: %s: idling\n", oh->name);
836 945
837 if (oh->sysconfig) 946 if (oh->class->sysc)
838 _sysc_idle(oh); 947 _sysc_idle(oh);
839 _del_initiator_dep(oh, mpu_oh); 948 _del_initiator_dep(oh, mpu_oh);
840 _disable_clocks(oh); 949 _disable_clocks(oh);
@@ -864,7 +973,7 @@ static int _shutdown(struct omap_hwmod *oh)
864 973
865 pr_debug("omap_hwmod: %s: disabling\n", oh->name); 974 pr_debug("omap_hwmod: %s: disabling\n", oh->name);
866 975
867 if (oh->sysconfig) 976 if (oh->class->sysc)
868 _sysc_shutdown(oh); 977 _sysc_shutdown(oh);
869 _del_initiator_dep(oh, mpu_oh); 978 _del_initiator_dep(oh, mpu_oh);
870 /* XXX what about the other system initiators here? DMA, tesla, d2d */ 979 /* XXX what about the other system initiators here? DMA, tesla, d2d */
@@ -879,33 +988,6 @@ static int _shutdown(struct omap_hwmod *oh)
879} 988}
880 989
881/** 990/**
882 * _write_clockact_lock - set the module's clockactivity bits
883 * @oh: struct omap_hwmod *
884 * @clockact: CLOCKACTIVITY field bits
885 *
886 * Writes the CLOCKACTIVITY bits @clockact to the hwmod @oh
887 * OCP_SYSCONFIG register. Returns -EINVAL if the hwmod is in the
888 * wrong state or returns 0.
889 */
890static int _write_clockact_lock(struct omap_hwmod *oh, u8 clockact)
891{
892 u32 v;
893
894 if (!oh->sysconfig ||
895 !(oh->sysconfig->sysc_flags & SYSC_HAS_CLOCKACTIVITY))
896 return -EINVAL;
897
898 mutex_lock(&omap_hwmod_mutex);
899 v = oh->_sysc_cache;
900 _set_clockactivity(oh, clockact, &v);
901 _write_sysconfig(v, oh);
902 mutex_unlock(&omap_hwmod_mutex);
903
904 return 0;
905}
906
907
908/**
909 * _setup - do initial configuration of omap_hwmod 991 * _setup - do initial configuration of omap_hwmod
910 * @oh: struct omap_hwmod * 992 * @oh: struct omap_hwmod *
911 * 993 *
@@ -943,11 +1025,19 @@ static int _setup(struct omap_hwmod *oh)
943 1025
944 _enable(oh); 1026 _enable(oh);
945 1027
946 if (!(oh->flags & HWMOD_INIT_NO_RESET)) 1028 if (!(oh->flags & HWMOD_INIT_NO_RESET)) {
947 _reset(oh); 1029 /*
948 1030 * XXX Do the OCP_SYSCONFIG bits need to be
949 /* XXX OCP AUTOIDLE bit? */ 1031 * reprogrammed after a reset? If not, then this can
950 /* XXX OCP ENAWAKEUP bit? */ 1032 * be removed. If they do, then probably the
1033 * _enable() function should be split to avoid the
1034 * rewrite of the OCP_SYSCONFIG register.
1035 */
1036 if (oh->class->sysc) {
1037 _update_sysc_cache(oh);
1038 _sysc_enable(oh);
1039 }
1040 }
951 1041
952 if (!(oh->flags & HWMOD_INIT_NO_IDLE)) 1042 if (!(oh->flags & HWMOD_INIT_NO_IDLE))
953 _idle(oh); 1043 _idle(oh);
@@ -969,13 +1059,33 @@ void omap_hwmod_writel(u32 v, struct omap_hwmod *oh, u16 reg_offs)
969 __raw_writel(v, oh->_rt_va + reg_offs); 1059 __raw_writel(v, oh->_rt_va + reg_offs);
970} 1060}
971 1061
1062int omap_hwmod_set_slave_idlemode(struct omap_hwmod *oh, u8 idlemode)
1063{
1064 u32 v;
1065 int retval = 0;
1066
1067 if (!oh)
1068 return -EINVAL;
1069
1070 v = oh->_sysc_cache;
1071
1072 retval = _set_slave_idlemode(oh, idlemode, &v);
1073 if (!retval)
1074 _write_sysconfig(v, oh);
1075
1076 return retval;
1077}
1078
972/** 1079/**
973 * omap_hwmod_register - register a struct omap_hwmod 1080 * omap_hwmod_register - register a struct omap_hwmod
974 * @oh: struct omap_hwmod * 1081 * @oh: struct omap_hwmod *
975 * 1082 *
976 * Registers the omap_hwmod @oh. Returns -EEXIST if an omap_hwmod already 1083 * Registers the omap_hwmod @oh. Returns -EEXIST if an omap_hwmod
977 * has been registered by the same name; -EINVAL if the omap_hwmod is in the 1084 * already has been registered by the same name; -EINVAL if the
978 * wrong state, or 0 on success. 1085 * omap_hwmod is in the wrong state, if @oh is NULL, if the
1086 * omap_hwmod's class field is NULL; if the omap_hwmod is missing a
1087 * name, or if the omap_hwmod's class is missing a name; or 0 upon
1088 * success.
979 * 1089 *
980 * XXX The data should be copied into bootmem, so the original data 1090 * XXX The data should be copied into bootmem, so the original data
981 * should be marked __initdata and freed after init. This would allow 1091 * should be marked __initdata and freed after init. This would allow
@@ -987,7 +1097,8 @@ int omap_hwmod_register(struct omap_hwmod *oh)
987{ 1097{
988 int ret, ms_id; 1098 int ret, ms_id;
989 1099
990 if (!oh || (oh->_state != _HWMOD_STATE_UNKNOWN)) 1100 if (!oh || !oh->name || !oh->class || !oh->class->name ||
1101 (oh->_state != _HWMOD_STATE_UNKNOWN))
991 return -EINVAL; 1102 return -EINVAL;
992 1103
993 mutex_lock(&omap_hwmod_mutex); 1104 mutex_lock(&omap_hwmod_mutex);
@@ -1148,6 +1259,7 @@ int omap_hwmod_unregister(struct omap_hwmod *oh)
1148 pr_debug("omap_hwmod: %s: unregistering\n", oh->name); 1259 pr_debug("omap_hwmod: %s: unregistering\n", oh->name);
1149 1260
1150 mutex_lock(&omap_hwmod_mutex); 1261 mutex_lock(&omap_hwmod_mutex);
1262 iounmap(oh->_rt_va);
1151 list_del(&oh->node); 1263 list_del(&oh->node);
1152 mutex_unlock(&omap_hwmod_mutex); 1264 mutex_unlock(&omap_hwmod_mutex);
1153 1265
@@ -1259,7 +1371,7 @@ void omap_hwmod_ocp_barrier(struct omap_hwmod *oh)
1259{ 1371{
1260 BUG_ON(!oh); 1372 BUG_ON(!oh);
1261 1373
1262 if (!oh->sysconfig || !oh->sysconfig->sysc_flags) { 1374 if (!oh->class->sysc || !oh->class->sysc->sysc_flags) {
1263 WARN(1, "omap_device: %s: OCP barrier impossible due to " 1375 WARN(1, "omap_device: %s: OCP barrier impossible due to "
1264 "device configuration\n", oh->name); 1376 "device configuration\n", oh->name);
1265 return; 1377 return;
@@ -1269,7 +1381,7 @@ void omap_hwmod_ocp_barrier(struct omap_hwmod *oh)
1269 * Forces posted writes to complete on the OCP thread handling 1381 * Forces posted writes to complete on the OCP thread handling
1270 * register writes 1382 * register writes
1271 */ 1383 */
1272 omap_hwmod_readl(oh, oh->sysconfig->sysc_offs); 1384 omap_hwmod_readl(oh, oh->class->sysc->sysc_offs);
1273} 1385}
1274 1386
1275/** 1387/**
@@ -1342,8 +1454,9 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res)
1342 /* For each IRQ, DMA, memory area, fill in array.*/ 1454 /* For each IRQ, DMA, memory area, fill in array.*/
1343 1455
1344 for (i = 0; i < oh->mpu_irqs_cnt; i++) { 1456 for (i = 0; i < oh->mpu_irqs_cnt; i++) {
1345 (res + r)->start = *(oh->mpu_irqs + i); 1457 (res + r)->name = (oh->mpu_irqs + i)->name;
1346 (res + r)->end = *(oh->mpu_irqs + i); 1458 (res + r)->start = (oh->mpu_irqs + i)->irq;
1459 (res + r)->end = (oh->mpu_irqs + i)->irq;
1347 (res + r)->flags = IORESOURCE_IRQ; 1460 (res + r)->flags = IORESOURCE_IRQ;
1348 r++; 1461 r++;
1349 } 1462 }
@@ -1398,6 +1511,9 @@ struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh)
1398 c = oh->slaves[oh->_mpu_port_index]->_clk; 1511 c = oh->slaves[oh->_mpu_port_index]->_clk;
1399 } 1512 }
1400 1513
1514 if (!c->clkdm)
1515 return NULL;
1516
1401 return c->clkdm->pwrdm.ptr; 1517 return c->clkdm->pwrdm.ptr;
1402 1518
1403} 1519}
@@ -1448,62 +1564,6 @@ int omap_hwmod_del_initiator_dep(struct omap_hwmod *oh,
1448} 1564}
1449 1565
1450/** 1566/**
1451 * omap_hwmod_set_clockact_none - set clockactivity test to BOTH
1452 * @oh: struct omap_hwmod *
1453 *
1454 * On some modules, this function can affect the wakeup latency vs.
1455 * power consumption balance. Intended to be called by the
1456 * omap_device layer. Passes along the return value from
1457 * _write_clockact_lock().
1458 */
1459int omap_hwmod_set_clockact_both(struct omap_hwmod *oh)
1460{
1461 return _write_clockact_lock(oh, CLOCKACT_TEST_BOTH);
1462}
1463
1464/**
1465 * omap_hwmod_set_clockact_none - set clockactivity test to MAIN
1466 * @oh: struct omap_hwmod *
1467 *
1468 * On some modules, this function can affect the wakeup latency vs.
1469 * power consumption balance. Intended to be called by the
1470 * omap_device layer. Passes along the return value from
1471 * _write_clockact_lock().
1472 */
1473int omap_hwmod_set_clockact_main(struct omap_hwmod *oh)
1474{
1475 return _write_clockact_lock(oh, CLOCKACT_TEST_MAIN);
1476}
1477
1478/**
1479 * omap_hwmod_set_clockact_none - set clockactivity test to ICLK
1480 * @oh: struct omap_hwmod *
1481 *
1482 * On some modules, this function can affect the wakeup latency vs.
1483 * power consumption balance. Intended to be called by the
1484 * omap_device layer. Passes along the return value from
1485 * _write_clockact_lock().
1486 */
1487int omap_hwmod_set_clockact_iclk(struct omap_hwmod *oh)
1488{
1489 return _write_clockact_lock(oh, CLOCKACT_TEST_ICLK);
1490}
1491
1492/**
1493 * omap_hwmod_set_clockact_none - set clockactivity test to NONE
1494 * @oh: struct omap_hwmod *
1495 *
1496 * On some modules, this function can affect the wakeup latency vs.
1497 * power consumption balance. Intended to be called by the
1498 * omap_device layer. Passes along the return value from
1499 * _write_clockact_lock().
1500 */
1501int omap_hwmod_set_clockact_none(struct omap_hwmod *oh)
1502{
1503 return _write_clockact_lock(oh, CLOCKACT_TEST_NONE);
1504}
1505
1506/**
1507 * omap_hwmod_enable_wakeup - allow device to wake up the system 1567 * omap_hwmod_enable_wakeup - allow device to wake up the system
1508 * @oh: struct omap_hwmod * 1568 * @oh: struct omap_hwmod *
1509 * 1569 *
@@ -1517,8 +1577,8 @@ int omap_hwmod_set_clockact_none(struct omap_hwmod *oh)
1517 */ 1577 */
1518int omap_hwmod_enable_wakeup(struct omap_hwmod *oh) 1578int omap_hwmod_enable_wakeup(struct omap_hwmod *oh)
1519{ 1579{
1520 if (!oh->sysconfig || 1580 if (!oh->class->sysc ||
1521 !(oh->sysconfig->sysc_flags & SYSC_HAS_ENAWAKEUP)) 1581 !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP))
1522 return -EINVAL; 1582 return -EINVAL;
1523 1583
1524 mutex_lock(&omap_hwmod_mutex); 1584 mutex_lock(&omap_hwmod_mutex);
@@ -1542,8 +1602,8 @@ int omap_hwmod_enable_wakeup(struct omap_hwmod *oh)
1542 */ 1602 */
1543int omap_hwmod_disable_wakeup(struct omap_hwmod *oh) 1603int omap_hwmod_disable_wakeup(struct omap_hwmod *oh)
1544{ 1604{
1545 if (!oh->sysconfig || 1605 if (!oh->class->sysc ||
1546 !(oh->sysconfig->sysc_flags & SYSC_HAS_ENAWAKEUP)) 1606 !(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP))
1547 return -EINVAL; 1607 return -EINVAL;
1548 1608
1549 mutex_lock(&omap_hwmod_mutex); 1609 mutex_lock(&omap_hwmod_mutex);
@@ -1552,3 +1612,52 @@ int omap_hwmod_disable_wakeup(struct omap_hwmod *oh)
1552 1612
1553 return 0; 1613 return 0;
1554} 1614}
1615
1616/**
1617 * omap_hwmod_for_each_by_class - call @fn for each hwmod of class @classname
1618 * @classname: struct omap_hwmod_class name to search for
1619 * @fn: callback function pointer to call for each hwmod in class @classname
1620 * @user: arbitrary context data to pass to the callback function
1621 *
1622 * For each omap_hwmod of class @classname, call @fn. Takes
1623 * omap_hwmod_mutex to prevent the hwmod list from changing during the
1624 * iteration. If the callback function returns something other than
1625 * zero, the iterator is terminated, and the callback function's return
1626 * value is passed back to the caller. Returns 0 upon success, -EINVAL
1627 * if @classname or @fn are NULL, or passes back the error code from @fn.
1628 */
1629int omap_hwmod_for_each_by_class(const char *classname,
1630 int (*fn)(struct omap_hwmod *oh,
1631 void *user),
1632 void *user)
1633{
1634 struct omap_hwmod *temp_oh;
1635 int ret = 0;
1636
1637 if (!classname || !fn)
1638 return -EINVAL;
1639
1640 pr_debug("omap_hwmod: %s: looking for modules of class %s\n",
1641 __func__, classname);
1642
1643 mutex_lock(&omap_hwmod_mutex);
1644
1645 list_for_each_entry(temp_oh, &omap_hwmod_list, node) {
1646 if (!strcmp(temp_oh->class->name, classname)) {
1647 pr_debug("omap_hwmod: %s: %s: calling callback fn\n",
1648 __func__, temp_oh->name);
1649 ret = (*fn)(temp_oh, user);
1650 if (ret)
1651 break;
1652 }
1653 }
1654
1655 mutex_unlock(&omap_hwmod_mutex);
1656
1657 if (ret)
1658 pr_debug("omap_hwmod: %s: iterator terminated early: %d\n",
1659 __func__, ret);
1660
1661 return ret;
1662}
1663
diff --git a/arch/arm/mach-omap2/omap_hwmod_2420.h b/arch/arm/mach-omap2/omap_hwmod_2420_data.c
index 767e4965ac4e..eb7ee2453b24 100644
--- a/arch/arm/mach-omap2/omap_hwmod_2420.h
+++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * omap_hwmod_2420.h - hardware modules present on the OMAP2420 chips 2 * omap_hwmod_2420_data.c - hardware modules present on the OMAP2420 chips
3 * 3 *
4 * Copyright (C) 2009 Nokia Corporation 4 * Copyright (C) 2009-2010 Nokia Corporation
5 * Paul Walmsley 5 * Paul Walmsley
6 * 6 *
7 * This program is free software; you can redistribute it and/or modify 7 * This program is free software; you can redistribute it and/or modify
@@ -9,20 +9,26 @@
9 * published by the Free Software Foundation. 9 * published by the Free Software Foundation.
10 * 10 *
11 * XXX handle crossbar/shared link difference for L3? 11 * XXX handle crossbar/shared link difference for L3?
12 * 12 * XXX these should be marked initdata for multi-OMAP kernels
13 */ 13 */
14#ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD2420_H 14#include <plat/omap_hwmod.h>
15#define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD2420_H
16
17#ifdef CONFIG_ARCH_OMAP2420
18
19#include <mach/omap_hwmod.h>
20#include <mach/irqs.h> 15#include <mach/irqs.h>
21#include <mach/cpu.h> 16#include <plat/cpu.h>
22#include <mach/dma.h> 17#include <plat/dma.h>
18
19#include "omap_hwmod_common_data.h"
23 20
24#include "prm-regbits-24xx.h" 21#include "prm-regbits-24xx.h"
25 22
23/*
24 * OMAP2420 hardware module integration data
25 *
26 * ALl of the data in this section should be autogeneratable from the
27 * TI hardware database or other technical documentation. Data that
28 * is driver-specific or driver-kernel integration-specific belongs
29 * elsewhere.
30 */
31
26static struct omap_hwmod omap2420_mpu_hwmod; 32static struct omap_hwmod omap2420_mpu_hwmod;
27static struct omap_hwmod omap2420_l3_hwmod; 33static struct omap_hwmod omap2420_l3_hwmod;
28static struct omap_hwmod omap2420_l4_core_hwmod; 34static struct omap_hwmod omap2420_l4_core_hwmod;
@@ -54,6 +60,7 @@ static struct omap_hwmod_ocp_if *omap2420_l3_masters[] = {
54/* L3 */ 60/* L3 */
55static struct omap_hwmod omap2420_l3_hwmod = { 61static struct omap_hwmod omap2420_l3_hwmod = {
56 .name = "l3_hwmod", 62 .name = "l3_hwmod",
63 .class = &l3_hwmod_class,
57 .masters = omap2420_l3_masters, 64 .masters = omap2420_l3_masters,
58 .masters_cnt = ARRAY_SIZE(omap2420_l3_masters), 65 .masters_cnt = ARRAY_SIZE(omap2420_l3_masters),
59 .slaves = omap2420_l3_slaves, 66 .slaves = omap2420_l3_slaves,
@@ -83,6 +90,7 @@ static struct omap_hwmod_ocp_if *omap2420_l4_core_masters[] = {
83/* L4 CORE */ 90/* L4 CORE */
84static struct omap_hwmod omap2420_l4_core_hwmod = { 91static struct omap_hwmod omap2420_l4_core_hwmod = {
85 .name = "l4_core_hwmod", 92 .name = "l4_core_hwmod",
93 .class = &l4_hwmod_class,
86 .masters = omap2420_l4_core_masters, 94 .masters = omap2420_l4_core_masters,
87 .masters_cnt = ARRAY_SIZE(omap2420_l4_core_masters), 95 .masters_cnt = ARRAY_SIZE(omap2420_l4_core_masters),
88 .slaves = omap2420_l4_core_slaves, 96 .slaves = omap2420_l4_core_slaves,
@@ -102,6 +110,7 @@ static struct omap_hwmod_ocp_if *omap2420_l4_wkup_masters[] = {
102/* L4 WKUP */ 110/* L4 WKUP */
103static struct omap_hwmod omap2420_l4_wkup_hwmod = { 111static struct omap_hwmod omap2420_l4_wkup_hwmod = {
104 .name = "l4_wkup_hwmod", 112 .name = "l4_wkup_hwmod",
113 .class = &l4_hwmod_class,
105 .masters = omap2420_l4_wkup_masters, 114 .masters = omap2420_l4_wkup_masters,
106 .masters_cnt = ARRAY_SIZE(omap2420_l4_wkup_masters), 115 .masters_cnt = ARRAY_SIZE(omap2420_l4_wkup_masters),
107 .slaves = omap2420_l4_wkup_slaves, 116 .slaves = omap2420_l4_wkup_slaves,
@@ -117,8 +126,8 @@ static struct omap_hwmod_ocp_if *omap2420_mpu_masters[] = {
117/* MPU */ 126/* MPU */
118static struct omap_hwmod omap2420_mpu_hwmod = { 127static struct omap_hwmod omap2420_mpu_hwmod = {
119 .name = "mpu_hwmod", 128 .name = "mpu_hwmod",
120 .clkdev_dev_id = NULL, 129 .class = &mpu_hwmod_class,
121 .clkdev_con_id = "mpu_ck", 130 .main_clk = "mpu_ck",
122 .masters = omap2420_mpu_masters, 131 .masters = omap2420_mpu_masters,
123 .masters_cnt = ARRAY_SIZE(omap2420_mpu_masters), 132 .masters_cnt = ARRAY_SIZE(omap2420_mpu_masters),
124 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420), 133 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
@@ -132,10 +141,9 @@ static __initdata struct omap_hwmod *omap2420_hwmods[] = {
132 NULL, 141 NULL,
133}; 142};
134 143
135#else 144int __init omap2420_hwmod_init(void)
136# define omap2420_hwmods 0 145{
137#endif 146 return omap_hwmod_init(omap2420_hwmods);
138 147}
139#endif
140 148
141 149
diff --git a/arch/arm/mach-omap2/omap_hwmod_2430.h b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
index a412be6420ec..241bd8230729 100644
--- a/arch/arm/mach-omap2/omap_hwmod_2430.h
+++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * omap_hwmod_2430.h - hardware modules present on the OMAP2430 chips 2 * omap_hwmod_2430_data.c - hardware modules present on the OMAP2430 chips
3 * 3 *
4 * Copyright (C) 2009 Nokia Corporation 4 * Copyright (C) 2009-2010 Nokia Corporation
5 * Paul Walmsley 5 * Paul Walmsley
6 * 6 *
7 * This program is free software; you can redistribute it and/or modify 7 * This program is free software; you can redistribute it and/or modify
@@ -9,20 +9,26 @@
9 * published by the Free Software Foundation. 9 * published by the Free Software Foundation.
10 * 10 *
11 * XXX handle crossbar/shared link difference for L3? 11 * XXX handle crossbar/shared link difference for L3?
12 * 12 * XXX these should be marked initdata for multi-OMAP kernels
13 */ 13 */
14#ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD2430_H 14#include <plat/omap_hwmod.h>
15#define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD2430_H
16
17#ifdef CONFIG_ARCH_OMAP2430
18
19#include <mach/omap_hwmod.h>
20#include <mach/irqs.h> 15#include <mach/irqs.h>
21#include <mach/cpu.h> 16#include <plat/cpu.h>
22#include <mach/dma.h> 17#include <plat/dma.h>
18
19#include "omap_hwmod_common_data.h"
23 20
24#include "prm-regbits-24xx.h" 21#include "prm-regbits-24xx.h"
25 22
23/*
24 * OMAP2430 hardware module integration data
25 *
26 * ALl of the data in this section should be autogeneratable from the
27 * TI hardware database or other technical documentation. Data that
28 * is driver-specific or driver-kernel integration-specific belongs
29 * elsewhere.
30 */
31
26static struct omap_hwmod omap2430_mpu_hwmod; 32static struct omap_hwmod omap2430_mpu_hwmod;
27static struct omap_hwmod omap2430_l3_hwmod; 33static struct omap_hwmod omap2430_l3_hwmod;
28static struct omap_hwmod omap2430_l4_core_hwmod; 34static struct omap_hwmod omap2430_l4_core_hwmod;
@@ -54,6 +60,7 @@ static struct omap_hwmod_ocp_if *omap2430_l3_masters[] = {
54/* L3 */ 60/* L3 */
55static struct omap_hwmod omap2430_l3_hwmod = { 61static struct omap_hwmod omap2430_l3_hwmod = {
56 .name = "l3_hwmod", 62 .name = "l3_hwmod",
63 .class = &l3_hwmod_class,
57 .masters = omap2430_l3_masters, 64 .masters = omap2430_l3_masters,
58 .masters_cnt = ARRAY_SIZE(omap2430_l3_masters), 65 .masters_cnt = ARRAY_SIZE(omap2430_l3_masters),
59 .slaves = omap2430_l3_slaves, 66 .slaves = omap2430_l3_slaves,
@@ -85,6 +92,7 @@ static struct omap_hwmod_ocp_if *omap2430_l4_core_masters[] = {
85/* L4 CORE */ 92/* L4 CORE */
86static struct omap_hwmod omap2430_l4_core_hwmod = { 93static struct omap_hwmod omap2430_l4_core_hwmod = {
87 .name = "l4_core_hwmod", 94 .name = "l4_core_hwmod",
95 .class = &l4_hwmod_class,
88 .masters = omap2430_l4_core_masters, 96 .masters = omap2430_l4_core_masters,
89 .masters_cnt = ARRAY_SIZE(omap2430_l4_core_masters), 97 .masters_cnt = ARRAY_SIZE(omap2430_l4_core_masters),
90 .slaves = omap2430_l4_core_slaves, 98 .slaves = omap2430_l4_core_slaves,
@@ -104,6 +112,7 @@ static struct omap_hwmod_ocp_if *omap2430_l4_wkup_masters[] = {
104/* L4 WKUP */ 112/* L4 WKUP */
105static struct omap_hwmod omap2430_l4_wkup_hwmod = { 113static struct omap_hwmod omap2430_l4_wkup_hwmod = {
106 .name = "l4_wkup_hwmod", 114 .name = "l4_wkup_hwmod",
115 .class = &l4_hwmod_class,
107 .masters = omap2430_l4_wkup_masters, 116 .masters = omap2430_l4_wkup_masters,
108 .masters_cnt = ARRAY_SIZE(omap2430_l4_wkup_masters), 117 .masters_cnt = ARRAY_SIZE(omap2430_l4_wkup_masters),
109 .slaves = omap2430_l4_wkup_slaves, 118 .slaves = omap2430_l4_wkup_slaves,
@@ -119,8 +128,8 @@ static struct omap_hwmod_ocp_if *omap2430_mpu_masters[] = {
119/* MPU */ 128/* MPU */
120static struct omap_hwmod omap2430_mpu_hwmod = { 129static struct omap_hwmod omap2430_mpu_hwmod = {
121 .name = "mpu_hwmod", 130 .name = "mpu_hwmod",
122 .clkdev_dev_id = NULL, 131 .class = &mpu_hwmod_class,
123 .clkdev_con_id = "mpu_ck", 132 .main_clk = "mpu_ck",
124 .masters = omap2430_mpu_masters, 133 .masters = omap2430_mpu_masters,
125 .masters_cnt = ARRAY_SIZE(omap2430_mpu_masters), 134 .masters_cnt = ARRAY_SIZE(omap2430_mpu_masters),
126 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430), 135 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
@@ -134,10 +143,9 @@ static __initdata struct omap_hwmod *omap2430_hwmods[] = {
134 NULL, 143 NULL,
135}; 144};
136 145
137#else 146int __init omap2430_hwmod_init(void)
138# define omap2430_hwmods 0 147{
139#endif 148 return omap_hwmod_init(omap2430_hwmods);
140 149}
141#endif
142 150
143 151
diff --git a/arch/arm/mach-omap2/omap_hwmod_34xx.h b/arch/arm/mach-omap2/omap_hwmod_34xx.h
deleted file mode 100644
index 1e069f831575..000000000000
--- a/arch/arm/mach-omap2/omap_hwmod_34xx.h
+++ /dev/null
@@ -1,168 +0,0 @@
1/*
2 * omap_hwmod_34xx.h - hardware modules present on the OMAP34xx chips
3 *
4 * Copyright (C) 2009 Nokia Corporation
5 * Paul Walmsley
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 *
11 */
12#ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD34XX_H
13#define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD34XX_H
14
15#ifdef CONFIG_ARCH_OMAP34XX
16
17#include <mach/omap_hwmod.h>
18#include <mach/irqs.h>
19#include <mach/cpu.h>
20#include <mach/dma.h>
21
22#include "prm-regbits-34xx.h"
23
24static struct omap_hwmod omap34xx_mpu_hwmod;
25static struct omap_hwmod omap34xx_l3_hwmod;
26static struct omap_hwmod omap34xx_l4_core_hwmod;
27static struct omap_hwmod omap34xx_l4_per_hwmod;
28
29/* L3 -> L4_CORE interface */
30static struct omap_hwmod_ocp_if omap34xx_l3__l4_core = {
31 .master = &omap34xx_l3_hwmod,
32 .slave = &omap34xx_l4_core_hwmod,
33 .user = OCP_USER_MPU | OCP_USER_SDMA,
34};
35
36/* L3 -> L4_PER interface */
37static struct omap_hwmod_ocp_if omap34xx_l3__l4_per = {
38 .master = &omap34xx_l3_hwmod,
39 .slave = &omap34xx_l4_per_hwmod,
40 .user = OCP_USER_MPU | OCP_USER_SDMA,
41};
42
43/* MPU -> L3 interface */
44static struct omap_hwmod_ocp_if omap34xx_mpu__l3 = {
45 .master = &omap34xx_mpu_hwmod,
46 .slave = &omap34xx_l3_hwmod,
47 .user = OCP_USER_MPU,
48};
49
50/* Slave interfaces on the L3 interconnect */
51static struct omap_hwmod_ocp_if *omap34xx_l3_slaves[] = {
52 &omap34xx_mpu__l3,
53};
54
55/* Master interfaces on the L3 interconnect */
56static struct omap_hwmod_ocp_if *omap34xx_l3_masters[] = {
57 &omap34xx_l3__l4_core,
58 &omap34xx_l3__l4_per,
59};
60
61/* L3 */
62static struct omap_hwmod omap34xx_l3_hwmod = {
63 .name = "l3_hwmod",
64 .masters = omap34xx_l3_masters,
65 .masters_cnt = ARRAY_SIZE(omap34xx_l3_masters),
66 .slaves = omap34xx_l3_slaves,
67 .slaves_cnt = ARRAY_SIZE(omap34xx_l3_slaves),
68 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
69};
70
71static struct omap_hwmod omap34xx_l4_wkup_hwmod;
72
73/* L4_CORE -> L4_WKUP interface */
74static struct omap_hwmod_ocp_if omap34xx_l4_core__l4_wkup = {
75 .master = &omap34xx_l4_core_hwmod,
76 .slave = &omap34xx_l4_wkup_hwmod,
77 .user = OCP_USER_MPU | OCP_USER_SDMA,
78};
79
80/* Slave interfaces on the L4_CORE interconnect */
81static struct omap_hwmod_ocp_if *omap34xx_l4_core_slaves[] = {
82 &omap34xx_l3__l4_core,
83};
84
85/* Master interfaces on the L4_CORE interconnect */
86static struct omap_hwmod_ocp_if *omap34xx_l4_core_masters[] = {
87 &omap34xx_l4_core__l4_wkup,
88};
89
90/* L4 CORE */
91static struct omap_hwmod omap34xx_l4_core_hwmod = {
92 .name = "l4_core_hwmod",
93 .masters = omap34xx_l4_core_masters,
94 .masters_cnt = ARRAY_SIZE(omap34xx_l4_core_masters),
95 .slaves = omap34xx_l4_core_slaves,
96 .slaves_cnt = ARRAY_SIZE(omap34xx_l4_core_slaves),
97 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
98};
99
100/* Slave interfaces on the L4_PER interconnect */
101static struct omap_hwmod_ocp_if *omap34xx_l4_per_slaves[] = {
102 &omap34xx_l3__l4_per,
103};
104
105/* Master interfaces on the L4_PER interconnect */
106static struct omap_hwmod_ocp_if *omap34xx_l4_per_masters[] = {
107};
108
109/* L4 PER */
110static struct omap_hwmod omap34xx_l4_per_hwmod = {
111 .name = "l4_per_hwmod",
112 .masters = omap34xx_l4_per_masters,
113 .masters_cnt = ARRAY_SIZE(omap34xx_l4_per_masters),
114 .slaves = omap34xx_l4_per_slaves,
115 .slaves_cnt = ARRAY_SIZE(omap34xx_l4_per_slaves),
116 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
117};
118
119/* Slave interfaces on the L4_WKUP interconnect */
120static struct omap_hwmod_ocp_if *omap34xx_l4_wkup_slaves[] = {
121 &omap34xx_l4_core__l4_wkup,
122};
123
124/* Master interfaces on the L4_WKUP interconnect */
125static struct omap_hwmod_ocp_if *omap34xx_l4_wkup_masters[] = {
126};
127
128/* L4 WKUP */
129static struct omap_hwmod omap34xx_l4_wkup_hwmod = {
130 .name = "l4_wkup_hwmod",
131 .masters = omap34xx_l4_wkup_masters,
132 .masters_cnt = ARRAY_SIZE(omap34xx_l4_wkup_masters),
133 .slaves = omap34xx_l4_wkup_slaves,
134 .slaves_cnt = ARRAY_SIZE(omap34xx_l4_wkup_slaves),
135 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
136};
137
138/* Master interfaces on the MPU device */
139static struct omap_hwmod_ocp_if *omap34xx_mpu_masters[] = {
140 &omap34xx_mpu__l3,
141};
142
143/* MPU */
144static struct omap_hwmod omap34xx_mpu_hwmod = {
145 .name = "mpu_hwmod",
146 .clkdev_dev_id = NULL,
147 .clkdev_con_id = "arm_fck",
148 .masters = omap34xx_mpu_masters,
149 .masters_cnt = ARRAY_SIZE(omap34xx_mpu_masters),
150 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
151};
152
153static __initdata struct omap_hwmod *omap34xx_hwmods[] = {
154 &omap34xx_l3_hwmod,
155 &omap34xx_l4_core_hwmod,
156 &omap34xx_l4_per_hwmod,
157 &omap34xx_l4_wkup_hwmod,
158 &omap34xx_mpu_hwmod,
159 NULL,
160};
161
162#else
163# define omap34xx_hwmods 0
164#endif
165
166#endif
167
168
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
new file mode 100644
index 000000000000..ed6084004260
--- /dev/null
+++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
@@ -0,0 +1,181 @@
1/*
2 * omap_hwmod_3xxx_data.c - hardware modules present on the OMAP3xxx chips
3 *
4 * Copyright (C) 2009-2010 Nokia Corporation
5 * Paul Walmsley
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 *
11 * The data in this file should be completely autogeneratable from
12 * the TI hardware database or other technical documentation.
13 *
14 * XXX these should be marked initdata for multi-OMAP kernels
15 */
16#include <plat/omap_hwmod.h>
17#include <mach/irqs.h>
18#include <plat/cpu.h>
19#include <plat/dma.h>
20
21#include "omap_hwmod_common_data.h"
22
23#include "prm-regbits-34xx.h"
24
25/*
26 * OMAP3xxx hardware module integration data
27 *
28 * ALl of the data in this section should be autogeneratable from the
29 * TI hardware database or other technical documentation. Data that
30 * is driver-specific or driver-kernel integration-specific belongs
31 * elsewhere.
32 */
33
34static struct omap_hwmod omap3xxx_mpu_hwmod;
35static struct omap_hwmod omap3xxx_l3_hwmod;
36static struct omap_hwmod omap3xxx_l4_core_hwmod;
37static struct omap_hwmod omap3xxx_l4_per_hwmod;
38
39/* L3 -> L4_CORE interface */
40static struct omap_hwmod_ocp_if omap3xxx_l3__l4_core = {
41 .master = &omap3xxx_l3_hwmod,
42 .slave = &omap3xxx_l4_core_hwmod,
43 .user = OCP_USER_MPU | OCP_USER_SDMA,
44};
45
46/* L3 -> L4_PER interface */
47static struct omap_hwmod_ocp_if omap3xxx_l3__l4_per = {
48 .master = &omap3xxx_l3_hwmod,
49 .slave = &omap3xxx_l4_per_hwmod,
50 .user = OCP_USER_MPU | OCP_USER_SDMA,
51};
52
53/* MPU -> L3 interface */
54static struct omap_hwmod_ocp_if omap3xxx_mpu__l3 = {
55 .master = &omap3xxx_mpu_hwmod,
56 .slave = &omap3xxx_l3_hwmod,
57 .user = OCP_USER_MPU,
58};
59
60/* Slave interfaces on the L3 interconnect */
61static struct omap_hwmod_ocp_if *omap3xxx_l3_slaves[] = {
62 &omap3xxx_mpu__l3,
63};
64
65/* Master interfaces on the L3 interconnect */
66static struct omap_hwmod_ocp_if *omap3xxx_l3_masters[] = {
67 &omap3xxx_l3__l4_core,
68 &omap3xxx_l3__l4_per,
69};
70
71/* L3 */
72static struct omap_hwmod omap3xxx_l3_hwmod = {
73 .name = "l3_hwmod",
74 .class = &l3_hwmod_class,
75 .masters = omap3xxx_l3_masters,
76 .masters_cnt = ARRAY_SIZE(omap3xxx_l3_masters),
77 .slaves = omap3xxx_l3_slaves,
78 .slaves_cnt = ARRAY_SIZE(omap3xxx_l3_slaves),
79 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
80};
81
82static struct omap_hwmod omap3xxx_l4_wkup_hwmod;
83
84/* L4_CORE -> L4_WKUP interface */
85static struct omap_hwmod_ocp_if omap3xxx_l4_core__l4_wkup = {
86 .master = &omap3xxx_l4_core_hwmod,
87 .slave = &omap3xxx_l4_wkup_hwmod,
88 .user = OCP_USER_MPU | OCP_USER_SDMA,
89};
90
91/* Slave interfaces on the L4_CORE interconnect */
92static struct omap_hwmod_ocp_if *omap3xxx_l4_core_slaves[] = {
93 &omap3xxx_l3__l4_core,
94};
95
96/* Master interfaces on the L4_CORE interconnect */
97static struct omap_hwmod_ocp_if *omap3xxx_l4_core_masters[] = {
98 &omap3xxx_l4_core__l4_wkup,
99};
100
101/* L4 CORE */
102static struct omap_hwmod omap3xxx_l4_core_hwmod = {
103 .name = "l4_core_hwmod",
104 .class = &l4_hwmod_class,
105 .masters = omap3xxx_l4_core_masters,
106 .masters_cnt = ARRAY_SIZE(omap3xxx_l4_core_masters),
107 .slaves = omap3xxx_l4_core_slaves,
108 .slaves_cnt = ARRAY_SIZE(omap3xxx_l4_core_slaves),
109 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
110};
111
112/* Slave interfaces on the L4_PER interconnect */
113static struct omap_hwmod_ocp_if *omap3xxx_l4_per_slaves[] = {
114 &omap3xxx_l3__l4_per,
115};
116
117/* Master interfaces on the L4_PER interconnect */
118static struct omap_hwmod_ocp_if *omap3xxx_l4_per_masters[] = {
119};
120
121/* L4 PER */
122static struct omap_hwmod omap3xxx_l4_per_hwmod = {
123 .name = "l4_per_hwmod",
124 .class = &l4_hwmod_class,
125 .masters = omap3xxx_l4_per_masters,
126 .masters_cnt = ARRAY_SIZE(omap3xxx_l4_per_masters),
127 .slaves = omap3xxx_l4_per_slaves,
128 .slaves_cnt = ARRAY_SIZE(omap3xxx_l4_per_slaves),
129 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
130};
131
132/* Slave interfaces on the L4_WKUP interconnect */
133static struct omap_hwmod_ocp_if *omap3xxx_l4_wkup_slaves[] = {
134 &omap3xxx_l4_core__l4_wkup,
135};
136
137/* Master interfaces on the L4_WKUP interconnect */
138static struct omap_hwmod_ocp_if *omap3xxx_l4_wkup_masters[] = {
139};
140
141/* L4 WKUP */
142static struct omap_hwmod omap3xxx_l4_wkup_hwmod = {
143 .name = "l4_wkup_hwmod",
144 .class = &l4_hwmod_class,
145 .masters = omap3xxx_l4_wkup_masters,
146 .masters_cnt = ARRAY_SIZE(omap3xxx_l4_wkup_masters),
147 .slaves = omap3xxx_l4_wkup_slaves,
148 .slaves_cnt = ARRAY_SIZE(omap3xxx_l4_wkup_slaves),
149 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
150};
151
152/* Master interfaces on the MPU device */
153static struct omap_hwmod_ocp_if *omap3xxx_mpu_masters[] = {
154 &omap3xxx_mpu__l3,
155};
156
157/* MPU */
158static struct omap_hwmod omap3xxx_mpu_hwmod = {
159 .name = "mpu_hwmod",
160 .class = &mpu_hwmod_class,
161 .main_clk = "arm_fck",
162 .masters = omap3xxx_mpu_masters,
163 .masters_cnt = ARRAY_SIZE(omap3xxx_mpu_masters),
164 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
165};
166
167static __initdata struct omap_hwmod *omap3xxx_hwmods[] = {
168 &omap3xxx_l3_hwmod,
169 &omap3xxx_l4_core_hwmod,
170 &omap3xxx_l4_per_hwmod,
171 &omap3xxx_l4_wkup_hwmod,
172 &omap3xxx_mpu_hwmod,
173 NULL,
174};
175
176int __init omap3xxx_hwmod_init(void)
177{
178 return omap_hwmod_init(omap3xxx_hwmods);
179}
180
181
diff --git a/arch/arm/mach-omap2/omap_hwmod_common_data.c b/arch/arm/mach-omap2/omap_hwmod_common_data.c
new file mode 100644
index 000000000000..1e80b914fa1a
--- /dev/null
+++ b/arch/arm/mach-omap2/omap_hwmod_common_data.c
@@ -0,0 +1,68 @@
1/*
2 * omap_hwmod common data structures
3 *
4 * Copyright (C) 2010 Texas Instruments, Inc.
5 * Thara Gopinath <thara@ti.com>
6 * Benoît Cousson
7 *
8 * Copyright (C) 2010 Nokia Corporation
9 * Paul Walmsley
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
14 *
15 * This data/structures are to be used while defining OMAP on-chip module
16 * data and their integration with other OMAP modules and Linux.
17 */
18
19#include <plat/omap_hwmod.h>
20
21#include "omap_hwmod_common_data.h"
22
23/**
24 * struct omap_hwmod_sysc_type1 - TYPE1 sysconfig scheme.
25 *
26 * To be used by hwmod structure to specify the sysconfig offsets
27 * if the device ip is compliant with the original PRCM protocol
28 * defined for OMAP2420.
29 */
30struct omap_hwmod_sysc_fields omap_hwmod_sysc_type1 = {
31 .midle_shift = SYSC_TYPE1_MIDLEMODE_SHIFT,
32 .clkact_shift = SYSC_TYPE1_CLOCKACTIVITY_SHIFT,
33 .sidle_shift = SYSC_TYPE1_SIDLEMODE_SHIFT,
34 .enwkup_shift = SYSC_TYPE1_ENAWAKEUP_SHIFT,
35 .srst_shift = SYSC_TYPE1_SOFTRESET_SHIFT,
36 .autoidle_shift = SYSC_TYPE1_AUTOIDLE_SHIFT,
37};
38
39/**
40 * struct omap_hwmod_sysc_type2 - TYPE2 sysconfig scheme.
41 *
42 * To be used by hwmod structure to specify the sysconfig offsets if the
43 * device ip is compliant with the new PRCM protocol defined for new
44 * OMAP4 IPs.
45 */
46struct omap_hwmod_sysc_fields omap_hwmod_sysc_type2 = {
47 .midle_shift = SYSC_TYPE2_MIDLEMODE_SHIFT,
48 .sidle_shift = SYSC_TYPE2_SIDLEMODE_SHIFT,
49 .srst_shift = SYSC_TYPE2_SOFTRESET_SHIFT,
50};
51
52
53/*
54 * omap_hwmod class data
55 */
56
57struct omap_hwmod_class l3_hwmod_class = {
58 .name = "l3"
59};
60
61struct omap_hwmod_class l4_hwmod_class = {
62 .name = "l4"
63};
64
65struct omap_hwmod_class mpu_hwmod_class = {
66 .name = "mpu"
67};
68
diff --git a/arch/arm/mach-omap2/omap_hwmod_common_data.h b/arch/arm/mach-omap2/omap_hwmod_common_data.h
new file mode 100644
index 000000000000..3645a28c7c27
--- /dev/null
+++ b/arch/arm/mach-omap2/omap_hwmod_common_data.h
@@ -0,0 +1,24 @@
1/*
2 * omap_hwmod_common_data.h - OMAP hwmod common macros and declarations
3 *
4 * Copyright (C) 2010 Nokia Corporation
5 * Paul Walmsley
6 *
7 * Copyright (C) 2010 Texas Instruments, Inc.
8 * Benoît Cousson
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 */
14#ifndef __ARCH_ARM_MACH_OMAP2_OMAP_HWMOD_COMMON_DATA_H
15#define __ARCH_ARM_MACH_OMAP2_OMAP_HWMOD_COMMON_DATA_H
16
17#include <plat/omap_hwmod.h>
18
19/* OMAP hwmod classes - forward declarations */
20extern struct omap_hwmod_class l3_hwmod_class;
21extern struct omap_hwmod_class l4_hwmod_class;
22extern struct omap_hwmod_class mpu_hwmod_class;
23
24#endif
diff --git a/arch/arm/mach-omap2/opp2420_data.c b/arch/arm/mach-omap2/opp2420_data.c
new file mode 100644
index 000000000000..e6dda694fd5c
--- /dev/null
+++ b/arch/arm/mach-omap2/opp2420_data.c
@@ -0,0 +1,128 @@
1/*
2 * opp2420_data.c - old-style "OPP" table for OMAP2420
3 *
4 * Copyright (C) 2005-2009 Texas Instruments, Inc.
5 * Copyright (C) 2004-2009 Nokia Corporation
6 *
7 * Richard Woodruff <r-woodruff2@ti.com>
8 *
9 * The OMAP2 processor can be run at several discrete 'PRCM configurations'.
10 * These configurations are characterized by voltage and speed for clocks.
11 * The device is only validated for certain combinations. One way to express
12 * these combinations is via the 'ratios' which the clocks operate with
13 * respect to each other. These ratio sets are for a given voltage/DPLL
14 * setting. All configurations can be described by a DPLL setting and a ratio.
15 *
16 * XXX Missing voltage data.
17 * XXX Missing 19.2MHz sys_clk rate sets (needed for N800/N810)
18 *
19 * THe format described in this file is deprecated. Once a reasonable
20 * OPP API exists, the data in this file should be converted to use it.
21 *
22 * This is technically part of the OMAP2xxx clock code.
23 *
24 * Considerable work is still needed to fully support dynamic frequency
25 * changes on OMAP2xxx-series chips. Readers interested in such a
26 * project are encouraged to review the Maemo Diablo RX-34 and RX-44
27 * kernel source at:
28 * http://repository.maemo.org/pool/diablo/free/k/kernel-source-diablo/
29 */
30
31#include "opp2xxx.h"
32#include "sdrc.h"
33#include "clock.h"
34
35/*
36 * Key dividers which make up a PRCM set. Ratios for a PRCM are mandated.
37 * xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU,
38 * CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL,
39 * CM_CLKSEL2_PLL, CM_CLKSEL_MDM
40 *
41 * Filling in table based on H4 boards available. There are quite a
42 * few more rate combinations which could be defined.
43 *
44 * When multiple values are defined the start up will try and choose
45 * the fastest one. If a 'fast' value is defined, then automatically,
46 * the /2 one should be included as it can be used. Generally having
47 * more than one fast set does not make sense, as static timings need
48 * to be changed to change the set. The exception is the bypass
49 * setting which is available for low power bypass.
50 *
51 * Note: This table needs to be sorted, fastest to slowest.
52 **/
53const struct prcm_config omap2420_rate_table[] = {
54 /* PRCM I - FAST */
55 {S12M, S660M, S330M, RI_CM_CLKSEL_MPU_VAL, /* 330MHz ARM */
56 RI_CM_CLKSEL_DSP_VAL, RI_CM_CLKSEL_GFX_VAL,
57 RI_CM_CLKSEL1_CORE_VAL, MI_CM_CLKSEL1_PLL_12_VAL,
58 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_165MHz,
59 RATE_IN_242X},
60
61 /* PRCM II - FAST */
62 {S12M, S600M, S300M, RII_CM_CLKSEL_MPU_VAL, /* 300MHz ARM */
63 RII_CM_CLKSEL_DSP_VAL, RII_CM_CLKSEL_GFX_VAL,
64 RII_CM_CLKSEL1_CORE_VAL, MII_CM_CLKSEL1_PLL_12_VAL,
65 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_100MHz,
66 RATE_IN_242X},
67
68 {S13M, S600M, S300M, RII_CM_CLKSEL_MPU_VAL, /* 300MHz ARM */
69 RII_CM_CLKSEL_DSP_VAL, RII_CM_CLKSEL_GFX_VAL,
70 RII_CM_CLKSEL1_CORE_VAL, MII_CM_CLKSEL1_PLL_13_VAL,
71 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_100MHz,
72 RATE_IN_242X},
73
74 /* PRCM III - FAST */
75 {S12M, S532M, S266M, RIII_CM_CLKSEL_MPU_VAL, /* 266MHz ARM */
76 RIII_CM_CLKSEL_DSP_VAL, RIII_CM_CLKSEL_GFX_VAL,
77 RIII_CM_CLKSEL1_CORE_VAL, MIII_CM_CLKSEL1_PLL_12_VAL,
78 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_133MHz,
79 RATE_IN_242X},
80
81 {S13M, S532M, S266M, RIII_CM_CLKSEL_MPU_VAL, /* 266MHz ARM */
82 RIII_CM_CLKSEL_DSP_VAL, RIII_CM_CLKSEL_GFX_VAL,
83 RIII_CM_CLKSEL1_CORE_VAL, MIII_CM_CLKSEL1_PLL_13_VAL,
84 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_133MHz,
85 RATE_IN_242X},
86
87 /* PRCM II - SLOW */
88 {S12M, S300M, S150M, RII_CM_CLKSEL_MPU_VAL, /* 150MHz ARM */
89 RII_CM_CLKSEL_DSP_VAL, RII_CM_CLKSEL_GFX_VAL,
90 RII_CM_CLKSEL1_CORE_VAL, MII_CM_CLKSEL1_PLL_12_VAL,
91 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_100MHz,
92 RATE_IN_242X},
93
94 {S13M, S300M, S150M, RII_CM_CLKSEL_MPU_VAL, /* 150MHz ARM */
95 RII_CM_CLKSEL_DSP_VAL, RII_CM_CLKSEL_GFX_VAL,
96 RII_CM_CLKSEL1_CORE_VAL, MII_CM_CLKSEL1_PLL_13_VAL,
97 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_100MHz,
98 RATE_IN_242X},
99
100 /* PRCM III - SLOW */
101 {S12M, S266M, S133M, RIII_CM_CLKSEL_MPU_VAL, /* 133MHz ARM */
102 RIII_CM_CLKSEL_DSP_VAL, RIII_CM_CLKSEL_GFX_VAL,
103 RIII_CM_CLKSEL1_CORE_VAL, MIII_CM_CLKSEL1_PLL_12_VAL,
104 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_133MHz,
105 RATE_IN_242X},
106
107 {S13M, S266M, S133M, RIII_CM_CLKSEL_MPU_VAL, /* 133MHz ARM */
108 RIII_CM_CLKSEL_DSP_VAL, RIII_CM_CLKSEL_GFX_VAL,
109 RIII_CM_CLKSEL1_CORE_VAL, MIII_CM_CLKSEL1_PLL_13_VAL,
110 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_133MHz,
111 RATE_IN_242X},
112
113 /* PRCM-VII (boot-bypass) */
114 {S12M, S12M, S12M, RVII_CM_CLKSEL_MPU_VAL, /* 12MHz ARM*/
115 RVII_CM_CLKSEL_DSP_VAL, RVII_CM_CLKSEL_GFX_VAL,
116 RVII_CM_CLKSEL1_CORE_VAL, MVII_CM_CLKSEL1_PLL_12_VAL,
117 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_BYPASS,
118 RATE_IN_242X},
119
120 /* PRCM-VII (boot-bypass) */
121 {S13M, S13M, S13M, RVII_CM_CLKSEL_MPU_VAL, /* 13MHz ARM */
122 RVII_CM_CLKSEL_DSP_VAL, RVII_CM_CLKSEL_GFX_VAL,
123 RVII_CM_CLKSEL1_CORE_VAL, MVII_CM_CLKSEL1_PLL_13_VAL,
124 MX_CLKSEL2_PLL_2x_VAL, 0, SDRC_RFR_CTRL_BYPASS,
125 RATE_IN_242X},
126
127 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
128};
diff --git a/arch/arm/mach-omap2/opp2430_data.c b/arch/arm/mach-omap2/opp2430_data.c
new file mode 100644
index 000000000000..1b9596ae201e
--- /dev/null
+++ b/arch/arm/mach-omap2/opp2430_data.c
@@ -0,0 +1,133 @@
1/*
2 * opp2430_data.c - old-style "OPP" table for OMAP2430
3 *
4 * Copyright (C) 2005-2009 Texas Instruments, Inc.
5 * Copyright (C) 2004-2009 Nokia Corporation
6 *
7 * Richard Woodruff <r-woodruff2@ti.com>
8 *
9 * The OMAP2 processor can be run at several discrete 'PRCM configurations'.
10 * These configurations are characterized by voltage and speed for clocks.
11 * The device is only validated for certain combinations. One way to express
12 * these combinations is via the 'ratios' which the clocks operate with
13 * respect to each other. These ratio sets are for a given voltage/DPLL
14 * setting. All configurations can be described by a DPLL setting and a ratio.
15 *
16 * 2430 differs from 2420 in that there are no more phase synchronizers used.
17 * They both have a slightly different clock domain setup. 2420(iva1,dsp) vs
18 * 2430 (iva2.1, NOdsp, mdm)
19 *
20 * XXX Missing voltage data.
21 * XXX Missing 19.2MHz sys_clk rate sets.
22 *
23 * THe format described in this file is deprecated. Once a reasonable
24 * OPP API exists, the data in this file should be converted to use it.
25 *
26 * This is technically part of the OMAP2xxx clock code.
27 */
28
29#include "opp2xxx.h"
30#include "sdrc.h"
31#include "clock.h"
32
33/*
34 * Key dividers which make up a PRCM set. Ratios for a PRCM are mandated.
35 * xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU,
36 * CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL,
37 * CM_CLKSEL2_PLL, CM_CLKSEL_MDM
38 *
39 * Filling in table based on 2430-SDPs variants available. There are
40 * quite a few more rate combinations which could be defined.
41 *
42 * When multiple values are defined the start up will try and choose
43 * the fastest one. If a 'fast' value is defined, then automatically,
44 * the /2 one should be included as it can be used. Generally having
45 * more than one fast set does not make sense, as static timings need
46 * to be changed to change the set. The exception is the bypass
47 * setting which is available for low power bypass.
48 *
49 * Note: This table needs to be sorted, fastest to slowest.
50 */
51const struct prcm_config omap2430_rate_table[] = {
52 /* PRCM #4 - ratio2 (ES2.1) - FAST */
53 {S13M, S798M, S399M, R2_CM_CLKSEL_MPU_VAL, /* 399MHz ARM */
54 R2_CM_CLKSEL_DSP_VAL, R2_CM_CLKSEL_GFX_VAL,
55 R2_CM_CLKSEL1_CORE_VAL, M4_CM_CLKSEL1_PLL_13_VAL,
56 MX_CLKSEL2_PLL_2x_VAL, R2_CM_CLKSEL_MDM_VAL,
57 SDRC_RFR_CTRL_133MHz,
58 RATE_IN_243X},
59
60 /* PRCM #2 - ratio1 (ES2) - FAST */
61 {S13M, S658M, S329M, R1_CM_CLKSEL_MPU_VAL, /* 330MHz ARM */
62 R1_CM_CLKSEL_DSP_VAL, R1_CM_CLKSEL_GFX_VAL,
63 R1_CM_CLKSEL1_CORE_VAL, M2_CM_CLKSEL1_PLL_13_VAL,
64 MX_CLKSEL2_PLL_2x_VAL, R1_CM_CLKSEL_MDM_VAL,
65 SDRC_RFR_CTRL_165MHz,
66 RATE_IN_243X},
67
68 /* PRCM #5a - ratio1 - FAST */
69 {S13M, S532M, S266M, R1_CM_CLKSEL_MPU_VAL, /* 266MHz ARM */
70 R1_CM_CLKSEL_DSP_VAL, R1_CM_CLKSEL_GFX_VAL,
71 R1_CM_CLKSEL1_CORE_VAL, M5A_CM_CLKSEL1_PLL_13_VAL,
72 MX_CLKSEL2_PLL_2x_VAL, R1_CM_CLKSEL_MDM_VAL,
73 SDRC_RFR_CTRL_133MHz,
74 RATE_IN_243X},
75
76 /* PRCM #5b - ratio1 - FAST */
77 {S13M, S400M, S200M, R1_CM_CLKSEL_MPU_VAL, /* 200MHz ARM */
78 R1_CM_CLKSEL_DSP_VAL, R1_CM_CLKSEL_GFX_VAL,
79 R1_CM_CLKSEL1_CORE_VAL, M5B_CM_CLKSEL1_PLL_13_VAL,
80 MX_CLKSEL2_PLL_2x_VAL, R1_CM_CLKSEL_MDM_VAL,
81 SDRC_RFR_CTRL_100MHz,
82 RATE_IN_243X},
83
84 /* PRCM #4 - ratio1 (ES2.1) - SLOW */
85 {S13M, S399M, S199M, R2_CM_CLKSEL_MPU_VAL, /* 200MHz ARM */
86 R2_CM_CLKSEL_DSP_VAL, R2_CM_CLKSEL_GFX_VAL,
87 R2_CM_CLKSEL1_CORE_VAL, M4_CM_CLKSEL1_PLL_13_VAL,
88 MX_CLKSEL2_PLL_1x_VAL, R2_CM_CLKSEL_MDM_VAL,
89 SDRC_RFR_CTRL_133MHz,
90 RATE_IN_243X},
91
92 /* PRCM #2 - ratio1 (ES2) - SLOW */
93 {S13M, S329M, S164M, R1_CM_CLKSEL_MPU_VAL, /* 165MHz ARM */
94 R1_CM_CLKSEL_DSP_VAL, R1_CM_CLKSEL_GFX_VAL,
95 R1_CM_CLKSEL1_CORE_VAL, M2_CM_CLKSEL1_PLL_13_VAL,
96 MX_CLKSEL2_PLL_1x_VAL, R1_CM_CLKSEL_MDM_VAL,
97 SDRC_RFR_CTRL_165MHz,
98 RATE_IN_243X},
99
100 /* PRCM #5a - ratio1 - SLOW */
101 {S13M, S266M, S133M, R1_CM_CLKSEL_MPU_VAL, /* 133MHz ARM */
102 R1_CM_CLKSEL_DSP_VAL, R1_CM_CLKSEL_GFX_VAL,
103 R1_CM_CLKSEL1_CORE_VAL, M5A_CM_CLKSEL1_PLL_13_VAL,
104 MX_CLKSEL2_PLL_1x_VAL, R1_CM_CLKSEL_MDM_VAL,
105 SDRC_RFR_CTRL_133MHz,
106 RATE_IN_243X},
107
108 /* PRCM #5b - ratio1 - SLOW*/
109 {S13M, S200M, S100M, R1_CM_CLKSEL_MPU_VAL, /* 100MHz ARM */
110 R1_CM_CLKSEL_DSP_VAL, R1_CM_CLKSEL_GFX_VAL,
111 R1_CM_CLKSEL1_CORE_VAL, M5B_CM_CLKSEL1_PLL_13_VAL,
112 MX_CLKSEL2_PLL_1x_VAL, R1_CM_CLKSEL_MDM_VAL,
113 SDRC_RFR_CTRL_100MHz,
114 RATE_IN_243X},
115
116 /* PRCM-boot/bypass */
117 {S13M, S13M, S13M, RB_CM_CLKSEL_MPU_VAL, /* 13Mhz */
118 RB_CM_CLKSEL_DSP_VAL, RB_CM_CLKSEL_GFX_VAL,
119 RB_CM_CLKSEL1_CORE_VAL, MB_CM_CLKSEL1_PLL_13_VAL,
120 MX_CLKSEL2_PLL_2x_VAL, RB_CM_CLKSEL_MDM_VAL,
121 SDRC_RFR_CTRL_BYPASS,
122 RATE_IN_243X},
123
124 /* PRCM-boot/bypass */
125 {S12M, S12M, S12M, RB_CM_CLKSEL_MPU_VAL, /* 12Mhz */
126 RB_CM_CLKSEL_DSP_VAL, RB_CM_CLKSEL_GFX_VAL,
127 RB_CM_CLKSEL1_CORE_VAL, MB_CM_CLKSEL1_PLL_12_VAL,
128 MX_CLKSEL2_PLL_2x_VAL, RB_CM_CLKSEL_MDM_VAL,
129 SDRC_RFR_CTRL_BYPASS,
130 RATE_IN_243X},
131
132 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
133};
diff --git a/arch/arm/mach-omap2/opp2xxx.h b/arch/arm/mach-omap2/opp2xxx.h
new file mode 100644
index 000000000000..38b730550506
--- /dev/null
+++ b/arch/arm/mach-omap2/opp2xxx.h
@@ -0,0 +1,429 @@
1/*
2 * opp2xxx.h - macros for old-style OMAP2xxx "OPP" definitions
3 *
4 * Copyright (C) 2005-2009 Texas Instruments, Inc.
5 * Copyright (C) 2004-2009 Nokia Corporation
6 *
7 * Richard Woodruff <r-woodruff2@ti.com>
8 *
9 * The OMAP2 processor can be run at several discrete 'PRCM configurations'.
10 * These configurations are characterized by voltage and speed for clocks.
11 * The device is only validated for certain combinations. One way to express
12 * these combinations is via the 'ratio's' which the clocks operate with
13 * respect to each other. These ratio sets are for a given voltage/DPLL
14 * setting. All configurations can be described by a DPLL setting and a ratio
15 * There are 3 ratio sets for the 2430 and X ratio sets for 2420.
16 *
17 * 2430 differs from 2420 in that there are no more phase synchronizers used.
18 * They both have a slightly different clock domain setup. 2420(iva1,dsp) vs
19 * 2430 (iva2.1, NOdsp, mdm)
20 *
21 * XXX Missing voltage data.
22 *
23 * THe format described in this file is deprecated. Once a reasonable
24 * OPP API exists, the data in this file should be converted to use it.
25 *
26 * This is technically part of the OMAP2xxx clock code.
27 */
28
29#ifndef __ARCH_ARM_MACH_OMAP2_OPP2XXX_H
30#define __ARCH_ARM_MACH_OMAP2_OPP2XXX_H
31
32/**
33 * struct prcm_config - define clock rates on a per-OPP basis (24xx)
34 *
35 * Key dividers which make up a PRCM set. Ratio's for a PRCM are mandated.
36 * xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU,CM_CLKSEL_DSP
37 * CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL CM_CLKSEL2_PLL, CM_CLKSEL_MDM
38 *
39 * This is deprecated. As soon as we have a decent OPP API, we should
40 * move all this stuff to it.
41 */
42struct prcm_config {
43 unsigned long xtal_speed; /* crystal rate */
44 unsigned long dpll_speed; /* dpll: out*xtal*M/(N-1)table_recalc */
45 unsigned long mpu_speed; /* speed of MPU */
46 unsigned long cm_clksel_mpu; /* mpu divider */
47 unsigned long cm_clksel_dsp; /* dsp+iva1 div(2420), iva2.1(2430) */
48 unsigned long cm_clksel_gfx; /* gfx dividers */
49 unsigned long cm_clksel1_core; /* major subsystem dividers */
50 unsigned long cm_clksel1_pll; /* m,n */
51 unsigned long cm_clksel2_pll; /* dpllx1 or x2 out */
52 unsigned long cm_clksel_mdm; /* modem dividers 2430 only */
53 unsigned long base_sdrc_rfr; /* base refresh timing for a set */
54 unsigned char flags;
55};
56
57
58/* Core fields for cm_clksel, not ratio governed */
59#define RX_CLKSEL_DSS1 (0x10 << 8)
60#define RX_CLKSEL_DSS2 (0x0 << 13)
61#define RX_CLKSEL_SSI (0x5 << 20)
62
63/*-------------------------------------------------------------------------
64 * Voltage/DPLL ratios
65 *-------------------------------------------------------------------------*/
66
67/* 2430 Ratio's, 2430-Ratio Config 1 */
68#define R1_CLKSEL_L3 (4 << 0)
69#define R1_CLKSEL_L4 (2 << 5)
70#define R1_CLKSEL_USB (4 << 25)
71#define R1_CM_CLKSEL1_CORE_VAL (R1_CLKSEL_USB | RX_CLKSEL_SSI | \
72 RX_CLKSEL_DSS2 | RX_CLKSEL_DSS1 | \
73 R1_CLKSEL_L4 | R1_CLKSEL_L3)
74#define R1_CLKSEL_MPU (2 << 0)
75#define R1_CM_CLKSEL_MPU_VAL R1_CLKSEL_MPU
76#define R1_CLKSEL_DSP (2 << 0)
77#define R1_CLKSEL_DSP_IF (2 << 5)
78#define R1_CM_CLKSEL_DSP_VAL (R1_CLKSEL_DSP | R1_CLKSEL_DSP_IF)
79#define R1_CLKSEL_GFX (2 << 0)
80#define R1_CM_CLKSEL_GFX_VAL R1_CLKSEL_GFX
81#define R1_CLKSEL_MDM (4 << 0)
82#define R1_CM_CLKSEL_MDM_VAL R1_CLKSEL_MDM
83
84/* 2430-Ratio Config 2 */
85#define R2_CLKSEL_L3 (6 << 0)
86#define R2_CLKSEL_L4 (2 << 5)
87#define R2_CLKSEL_USB (2 << 25)
88#define R2_CM_CLKSEL1_CORE_VAL (R2_CLKSEL_USB | RX_CLKSEL_SSI | \
89 RX_CLKSEL_DSS2 | RX_CLKSEL_DSS1 | \
90 R2_CLKSEL_L4 | R2_CLKSEL_L3)
91#define R2_CLKSEL_MPU (2 << 0)
92#define R2_CM_CLKSEL_MPU_VAL R2_CLKSEL_MPU
93#define R2_CLKSEL_DSP (2 << 0)
94#define R2_CLKSEL_DSP_IF (3 << 5)
95#define R2_CM_CLKSEL_DSP_VAL (R2_CLKSEL_DSP | R2_CLKSEL_DSP_IF)
96#define R2_CLKSEL_GFX (2 << 0)
97#define R2_CM_CLKSEL_GFX_VAL R2_CLKSEL_GFX
98#define R2_CLKSEL_MDM (6 << 0)
99#define R2_CM_CLKSEL_MDM_VAL R2_CLKSEL_MDM
100
101/* 2430-Ratio Bootm (BYPASS) */
102#define RB_CLKSEL_L3 (1 << 0)
103#define RB_CLKSEL_L4 (1 << 5)
104#define RB_CLKSEL_USB (1 << 25)
105#define RB_CM_CLKSEL1_CORE_VAL (RB_CLKSEL_USB | RX_CLKSEL_SSI | \
106 RX_CLKSEL_DSS2 | RX_CLKSEL_DSS1 | \
107 RB_CLKSEL_L4 | RB_CLKSEL_L3)
108#define RB_CLKSEL_MPU (1 << 0)
109#define RB_CM_CLKSEL_MPU_VAL RB_CLKSEL_MPU
110#define RB_CLKSEL_DSP (1 << 0)
111#define RB_CLKSEL_DSP_IF (1 << 5)
112#define RB_CM_CLKSEL_DSP_VAL (RB_CLKSEL_DSP | RB_CLKSEL_DSP_IF)
113#define RB_CLKSEL_GFX (1 << 0)
114#define RB_CM_CLKSEL_GFX_VAL RB_CLKSEL_GFX
115#define RB_CLKSEL_MDM (1 << 0)
116#define RB_CM_CLKSEL_MDM_VAL RB_CLKSEL_MDM
117
118/* 2420 Ratio Equivalents */
119#define RXX_CLKSEL_VLYNQ (0x12 << 15)
120#define RXX_CLKSEL_SSI (0x8 << 20)
121
122/* 2420-PRCM III 532MHz core */
123#define RIII_CLKSEL_L3 (4 << 0) /* 133MHz */
124#define RIII_CLKSEL_L4 (2 << 5) /* 66.5MHz */
125#define RIII_CLKSEL_USB (4 << 25) /* 33.25MHz */
126#define RIII_CM_CLKSEL1_CORE_VAL (RIII_CLKSEL_USB | RXX_CLKSEL_SSI | \
127 RXX_CLKSEL_VLYNQ | RX_CLKSEL_DSS2 | \
128 RX_CLKSEL_DSS1 | RIII_CLKSEL_L4 | \
129 RIII_CLKSEL_L3)
130#define RIII_CLKSEL_MPU (2 << 0) /* 266MHz */
131#define RIII_CM_CLKSEL_MPU_VAL RIII_CLKSEL_MPU
132#define RIII_CLKSEL_DSP (3 << 0) /* c5x - 177.3MHz */
133#define RIII_CLKSEL_DSP_IF (2 << 5) /* c5x - 88.67MHz */
134#define RIII_SYNC_DSP (1 << 7) /* Enable sync */
135#define RIII_CLKSEL_IVA (6 << 8) /* iva1 - 88.67MHz */
136#define RIII_SYNC_IVA (1 << 13) /* Enable sync */
137#define RIII_CM_CLKSEL_DSP_VAL (RIII_SYNC_IVA | RIII_CLKSEL_IVA | \
138 RIII_SYNC_DSP | RIII_CLKSEL_DSP_IF | \
139 RIII_CLKSEL_DSP)
140#define RIII_CLKSEL_GFX (2 << 0) /* 66.5MHz */
141#define RIII_CM_CLKSEL_GFX_VAL RIII_CLKSEL_GFX
142
143/* 2420-PRCM II 600MHz core */
144#define RII_CLKSEL_L3 (6 << 0) /* 100MHz */
145#define RII_CLKSEL_L4 (2 << 5) /* 50MHz */
146#define RII_CLKSEL_USB (2 << 25) /* 50MHz */
147#define RII_CM_CLKSEL1_CORE_VAL (RII_CLKSEL_USB | RXX_CLKSEL_SSI | \
148 RXX_CLKSEL_VLYNQ | RX_CLKSEL_DSS2 | \
149 RX_CLKSEL_DSS1 | RII_CLKSEL_L4 | \
150 RII_CLKSEL_L3)
151#define RII_CLKSEL_MPU (2 << 0) /* 300MHz */
152#define RII_CM_CLKSEL_MPU_VAL RII_CLKSEL_MPU
153#define RII_CLKSEL_DSP (3 << 0) /* c5x - 200MHz */
154#define RII_CLKSEL_DSP_IF (2 << 5) /* c5x - 100MHz */
155#define RII_SYNC_DSP (0 << 7) /* Bypass sync */
156#define RII_CLKSEL_IVA (3 << 8) /* iva1 - 200MHz */
157#define RII_SYNC_IVA (0 << 13) /* Bypass sync */
158#define RII_CM_CLKSEL_DSP_VAL (RII_SYNC_IVA | RII_CLKSEL_IVA | \
159 RII_SYNC_DSP | RII_CLKSEL_DSP_IF | \
160 RII_CLKSEL_DSP)
161#define RII_CLKSEL_GFX (2 << 0) /* 50MHz */
162#define RII_CM_CLKSEL_GFX_VAL RII_CLKSEL_GFX
163
164/* 2420-PRCM I 660MHz core */
165#define RI_CLKSEL_L3 (4 << 0) /* 165MHz */
166#define RI_CLKSEL_L4 (2 << 5) /* 82.5MHz */
167#define RI_CLKSEL_USB (4 << 25) /* 41.25MHz */
168#define RI_CM_CLKSEL1_CORE_VAL (RI_CLKSEL_USB | \
169 RXX_CLKSEL_SSI | RXX_CLKSEL_VLYNQ | \
170 RX_CLKSEL_DSS2 | RX_CLKSEL_DSS1 | \
171 RI_CLKSEL_L4 | RI_CLKSEL_L3)
172#define RI_CLKSEL_MPU (2 << 0) /* 330MHz */
173#define RI_CM_CLKSEL_MPU_VAL RI_CLKSEL_MPU
174#define RI_CLKSEL_DSP (3 << 0) /* c5x - 220MHz */
175#define RI_CLKSEL_DSP_IF (2 << 5) /* c5x - 110MHz */
176#define RI_SYNC_DSP (1 << 7) /* Activate sync */
177#define RI_CLKSEL_IVA (4 << 8) /* iva1 - 165MHz */
178#define RI_SYNC_IVA (0 << 13) /* Bypass sync */
179#define RI_CM_CLKSEL_DSP_VAL (RI_SYNC_IVA | RI_CLKSEL_IVA | \
180 RI_SYNC_DSP | RI_CLKSEL_DSP_IF | \
181 RI_CLKSEL_DSP)
182#define RI_CLKSEL_GFX (1 << 0) /* 165MHz */
183#define RI_CM_CLKSEL_GFX_VAL RI_CLKSEL_GFX
184
185/* 2420-PRCM VII (boot) */
186#define RVII_CLKSEL_L3 (1 << 0)
187#define RVII_CLKSEL_L4 (1 << 5)
188#define RVII_CLKSEL_DSS1 (1 << 8)
189#define RVII_CLKSEL_DSS2 (0 << 13)
190#define RVII_CLKSEL_VLYNQ (1 << 15)
191#define RVII_CLKSEL_SSI (1 << 20)
192#define RVII_CLKSEL_USB (1 << 25)
193
194#define RVII_CM_CLKSEL1_CORE_VAL (RVII_CLKSEL_USB | RVII_CLKSEL_SSI | \
195 RVII_CLKSEL_VLYNQ | \
196 RVII_CLKSEL_DSS2 | RVII_CLKSEL_DSS1 | \
197 RVII_CLKSEL_L4 | RVII_CLKSEL_L3)
198
199#define RVII_CLKSEL_MPU (1 << 0) /* all divide by 1 */
200#define RVII_CM_CLKSEL_MPU_VAL RVII_CLKSEL_MPU
201
202#define RVII_CLKSEL_DSP (1 << 0)
203#define RVII_CLKSEL_DSP_IF (1 << 5)
204#define RVII_SYNC_DSP (0 << 7)
205#define RVII_CLKSEL_IVA (1 << 8)
206#define RVII_SYNC_IVA (0 << 13)
207#define RVII_CM_CLKSEL_DSP_VAL (RVII_SYNC_IVA | RVII_CLKSEL_IVA | \
208 RVII_SYNC_DSP | RVII_CLKSEL_DSP_IF | \
209 RVII_CLKSEL_DSP)
210
211#define RVII_CLKSEL_GFX (1 << 0)
212#define RVII_CM_CLKSEL_GFX_VAL RVII_CLKSEL_GFX
213
214/*-------------------------------------------------------------------------
215 * 2430 Target modes: Along with each configuration the CPU has several
216 * modes which goes along with them. Modes mainly are the addition of
217 * describe DPLL combinations to go along with a ratio.
218 *-------------------------------------------------------------------------*/
219
220/* Hardware governed */
221#define MX_48M_SRC (0 << 3)
222#define MX_54M_SRC (0 << 5)
223#define MX_APLLS_CLIKIN_12 (3 << 23)
224#define MX_APLLS_CLIKIN_13 (2 << 23)
225#define MX_APLLS_CLIKIN_19_2 (0 << 23)
226
227/*
228 * 2430 - standalone, 2*ref*M/(n+1), M/N is for exactness not relock speed
229 * #5a (ratio1) baseport-target, target DPLL = 266*2 = 532MHz
230 */
231#define M5A_DPLL_MULT_12 (133 << 12)
232#define M5A_DPLL_DIV_12 (5 << 8)
233#define M5A_CM_CLKSEL1_PLL_12_VAL (MX_48M_SRC | MX_54M_SRC | \
234 M5A_DPLL_DIV_12 | M5A_DPLL_MULT_12 | \
235 MX_APLLS_CLIKIN_12)
236#define M5A_DPLL_MULT_13 (61 << 12)
237#define M5A_DPLL_DIV_13 (2 << 8)
238#define M5A_CM_CLKSEL1_PLL_13_VAL (MX_48M_SRC | MX_54M_SRC | \
239 M5A_DPLL_DIV_13 | M5A_DPLL_MULT_13 | \
240 MX_APLLS_CLIKIN_13)
241#define M5A_DPLL_MULT_19 (55 << 12)
242#define M5A_DPLL_DIV_19 (3 << 8)
243#define M5A_CM_CLKSEL1_PLL_19_VAL (MX_48M_SRC | MX_54M_SRC | \
244 M5A_DPLL_DIV_19 | M5A_DPLL_MULT_19 | \
245 MX_APLLS_CLIKIN_19_2)
246/* #5b (ratio1) target DPLL = 200*2 = 400MHz */
247#define M5B_DPLL_MULT_12 (50 << 12)
248#define M5B_DPLL_DIV_12 (2 << 8)
249#define M5B_CM_CLKSEL1_PLL_12_VAL (MX_48M_SRC | MX_54M_SRC | \
250 M5B_DPLL_DIV_12 | M5B_DPLL_MULT_12 | \
251 MX_APLLS_CLIKIN_12)
252#define M5B_DPLL_MULT_13 (200 << 12)
253#define M5B_DPLL_DIV_13 (12 << 8)
254
255#define M5B_CM_CLKSEL1_PLL_13_VAL (MX_48M_SRC | MX_54M_SRC | \
256 M5B_DPLL_DIV_13 | M5B_DPLL_MULT_13 | \
257 MX_APLLS_CLIKIN_13)
258#define M5B_DPLL_MULT_19 (125 << 12)
259#define M5B_DPLL_DIV_19 (31 << 8)
260#define M5B_CM_CLKSEL1_PLL_19_VAL (MX_48M_SRC | MX_54M_SRC | \
261 M5B_DPLL_DIV_19 | M5B_DPLL_MULT_19 | \
262 MX_APLLS_CLIKIN_19_2)
263/*
264 * #4 (ratio2), DPLL = 399*2 = 798MHz, L3=133MHz
265 */
266#define M4_DPLL_MULT_12 (133 << 12)
267#define M4_DPLL_DIV_12 (3 << 8)
268#define M4_CM_CLKSEL1_PLL_12_VAL (MX_48M_SRC | MX_54M_SRC | \
269 M4_DPLL_DIV_12 | M4_DPLL_MULT_12 | \
270 MX_APLLS_CLIKIN_12)
271
272#define M4_DPLL_MULT_13 (399 << 12)
273#define M4_DPLL_DIV_13 (12 << 8)
274#define M4_CM_CLKSEL1_PLL_13_VAL (MX_48M_SRC | MX_54M_SRC | \
275 M4_DPLL_DIV_13 | M4_DPLL_MULT_13 | \
276 MX_APLLS_CLIKIN_13)
277
278#define M4_DPLL_MULT_19 (145 << 12)
279#define M4_DPLL_DIV_19 (6 << 8)
280#define M4_CM_CLKSEL1_PLL_19_VAL (MX_48M_SRC | MX_54M_SRC | \
281 M4_DPLL_DIV_19 | M4_DPLL_MULT_19 | \
282 MX_APLLS_CLIKIN_19_2)
283
284/*
285 * #3 (ratio2) baseport-target, target DPLL = 330*2 = 660MHz
286 */
287#define M3_DPLL_MULT_12 (55 << 12)
288#define M3_DPLL_DIV_12 (1 << 8)
289#define M3_CM_CLKSEL1_PLL_12_VAL (MX_48M_SRC | MX_54M_SRC | \
290 M3_DPLL_DIV_12 | M3_DPLL_MULT_12 | \
291 MX_APLLS_CLIKIN_12)
292#define M3_DPLL_MULT_13 (76 << 12)
293#define M3_DPLL_DIV_13 (2 << 8)
294#define M3_CM_CLKSEL1_PLL_13_VAL (MX_48M_SRC | MX_54M_SRC | \
295 M3_DPLL_DIV_13 | M3_DPLL_MULT_13 | \
296 MX_APLLS_CLIKIN_13)
297#define M3_DPLL_MULT_19 (17 << 12)
298#define M3_DPLL_DIV_19 (0 << 8)
299#define M3_CM_CLKSEL1_PLL_19_VAL (MX_48M_SRC | MX_54M_SRC | \
300 M3_DPLL_DIV_19 | M3_DPLL_MULT_19 | \
301 MX_APLLS_CLIKIN_19_2)
302
303/*
304 * #2 (ratio1) DPLL = 330*2 = 660MHz, L3=165MHz
305 */
306#define M2_DPLL_MULT_12 (55 << 12)
307#define M2_DPLL_DIV_12 (1 << 8)
308#define M2_CM_CLKSEL1_PLL_12_VAL (MX_48M_SRC | MX_54M_SRC | \
309 M2_DPLL_DIV_12 | M2_DPLL_MULT_12 | \
310 MX_APLLS_CLIKIN_12)
311
312/* Speed changes - Used 658.7MHz instead of 660MHz for LP-Refresh M=76 N=2,
313 * relock time issue */
314/* Core frequency changed from 330/165 to 329/164 MHz*/
315#define M2_DPLL_MULT_13 (76 << 12)
316#define M2_DPLL_DIV_13 (2 << 8)
317#define M2_CM_CLKSEL1_PLL_13_VAL (MX_48M_SRC | MX_54M_SRC | \
318 M2_DPLL_DIV_13 | M2_DPLL_MULT_13 | \
319 MX_APLLS_CLIKIN_13)
320
321#define M2_DPLL_MULT_19 (17 << 12)
322#define M2_DPLL_DIV_19 (0 << 8)
323#define M2_CM_CLKSEL1_PLL_19_VAL (MX_48M_SRC | MX_54M_SRC | \
324 M2_DPLL_DIV_19 | M2_DPLL_MULT_19 | \
325 MX_APLLS_CLIKIN_19_2)
326
327/* boot (boot) */
328#define MB_DPLL_MULT (1 << 12)
329#define MB_DPLL_DIV (0 << 8)
330#define MB_CM_CLKSEL1_PLL_12_VAL (MX_48M_SRC | MX_54M_SRC | \
331 MB_DPLL_DIV | MB_DPLL_MULT | \
332 MX_APLLS_CLIKIN_12)
333
334#define MB_CM_CLKSEL1_PLL_13_VAL (MX_48M_SRC | MX_54M_SRC | \
335 MB_DPLL_DIV | MB_DPLL_MULT | \
336 MX_APLLS_CLIKIN_13)
337
338#define MB_CM_CLKSEL1_PLL_19_VAL (MX_48M_SRC | MX_54M_SRC | \
339 MB_DPLL_DIV | MB_DPLL_MULT | \
340 MX_APLLS_CLIKIN_19)
341
342/*
343 * 2430 - chassis (sedna)
344 * 165 (ratio1) same as above #2
345 * 150 (ratio1)
346 * 133 (ratio2) same as above #4
347 * 110 (ratio2) same as above #3
348 * 104 (ratio2)
349 * boot (boot)
350 */
351
352/* PRCM I target DPLL = 2*330MHz = 660MHz */
353#define MI_DPLL_MULT_12 (55 << 12)
354#define MI_DPLL_DIV_12 (1 << 8)
355#define MI_CM_CLKSEL1_PLL_12_VAL (MX_48M_SRC | MX_54M_SRC | \
356 MI_DPLL_DIV_12 | MI_DPLL_MULT_12 | \
357 MX_APLLS_CLIKIN_12)
358
359/*
360 * 2420 Equivalent - mode registers
361 * PRCM II , target DPLL = 2*300MHz = 600MHz
362 */
363#define MII_DPLL_MULT_12 (50 << 12)
364#define MII_DPLL_DIV_12 (1 << 8)
365#define MII_CM_CLKSEL1_PLL_12_VAL (MX_48M_SRC | MX_54M_SRC | \
366 MII_DPLL_DIV_12 | MII_DPLL_MULT_12 | \
367 MX_APLLS_CLIKIN_12)
368#define MII_DPLL_MULT_13 (300 << 12)
369#define MII_DPLL_DIV_13 (12 << 8)
370#define MII_CM_CLKSEL1_PLL_13_VAL (MX_48M_SRC | MX_54M_SRC | \
371 MII_DPLL_DIV_13 | MII_DPLL_MULT_13 | \
372 MX_APLLS_CLIKIN_13)
373
374/* PRCM III target DPLL = 2*266 = 532MHz*/
375#define MIII_DPLL_MULT_12 (133 << 12)
376#define MIII_DPLL_DIV_12 (5 << 8)
377#define MIII_CM_CLKSEL1_PLL_12_VAL (MX_48M_SRC | MX_54M_SRC | \
378 MIII_DPLL_DIV_12 | \
379 MIII_DPLL_MULT_12 | MX_APLLS_CLIKIN_12)
380#define MIII_DPLL_MULT_13 (266 << 12)
381#define MIII_DPLL_DIV_13 (12 << 8)
382#define MIII_CM_CLKSEL1_PLL_13_VAL (MX_48M_SRC | MX_54M_SRC | \
383 MIII_DPLL_DIV_13 | \
384 MIII_DPLL_MULT_13 | MX_APLLS_CLIKIN_13)
385
386/* PRCM VII (boot bypass) */
387#define MVII_CM_CLKSEL1_PLL_12_VAL MB_CM_CLKSEL1_PLL_12_VAL
388#define MVII_CM_CLKSEL1_PLL_13_VAL MB_CM_CLKSEL1_PLL_13_VAL
389
390/* High and low operation value */
391#define MX_CLKSEL2_PLL_2x_VAL (2 << 0)
392#define MX_CLKSEL2_PLL_1x_VAL (1 << 0)
393
394/* MPU speed defines */
395#define S12M 12000000
396#define S13M 13000000
397#define S19M 19200000
398#define S26M 26000000
399#define S100M 100000000
400#define S133M 133000000
401#define S150M 150000000
402#define S164M 164000000
403#define S165M 165000000
404#define S199M 199000000
405#define S200M 200000000
406#define S266M 266000000
407#define S300M 300000000
408#define S329M 329000000
409#define S330M 330000000
410#define S399M 399000000
411#define S400M 400000000
412#define S532M 532000000
413#define S600M 600000000
414#define S658M 658000000
415#define S660M 660000000
416#define S798M 798000000
417
418
419extern const struct prcm_config omap2420_rate_table[];
420
421#ifdef CONFIG_ARCH_OMAP2430
422extern const struct prcm_config omap2430_rate_table[];
423#else
424#define omap2430_rate_table NULL
425#endif
426extern const struct prcm_config *rate_table;
427extern const struct prcm_config *curr_prcm_set;
428
429#endif
diff --git a/arch/arm/mach-omap2/pm-debug.c b/arch/arm/mach-omap2/pm-debug.c
index 2fc4d6abbd0a..6cac9817c243 100644
--- a/arch/arm/mach-omap2/pm-debug.c
+++ b/arch/arm/mach-omap2/pm-debug.c
@@ -25,11 +25,12 @@
25#include <linux/err.h> 25#include <linux/err.h>
26#include <linux/io.h> 26#include <linux/io.h>
27#include <linux/module.h> 27#include <linux/module.h>
28#include <linux/slab.h>
28 29
29#include <mach/clock.h> 30#include <plat/clock.h>
30#include <mach/board.h> 31#include <plat/board.h>
31#include <mach/powerdomain.h> 32#include <plat/powerdomain.h>
32#include <mach/clockdomain.h> 33#include <plat/clockdomain.h>
33 34
34#include "prm.h" 35#include "prm.h"
35#include "cm.h" 36#include "cm.h"
@@ -51,9 +52,8 @@ int omap2_pm_debug;
51 regs[reg_count++].val = __raw_readl(reg) 52 regs[reg_count++].val = __raw_readl(reg)
52#define DUMP_INTC_REG(reg, off) \ 53#define DUMP_INTC_REG(reg, off) \
53 regs[reg_count].name = #reg; \ 54 regs[reg_count].name = #reg; \
54 regs[reg_count++].val = __raw_readl(OMAP2_IO_ADDRESS(0x480fe000 + (off))) 55 regs[reg_count++].val = \
55 56 __raw_readl(OMAP2_L4_IO_ADDRESS(0x480fe000 + (off)))
56static int __init pm_dbg_init(void);
57 57
58void omap2_pm_dump(int mode, int resume, unsigned int us) 58void omap2_pm_dump(int mode, int resume, unsigned int us)
59{ 59{
@@ -68,9 +68,9 @@ void omap2_pm_dump(int mode, int resume, unsigned int us)
68#if 0 68#if 0
69 /* MPU */ 69 /* MPU */
70 DUMP_PRM_MOD_REG(OCP_MOD, OMAP2_PRM_IRQENABLE_MPU_OFFSET); 70 DUMP_PRM_MOD_REG(OCP_MOD, OMAP2_PRM_IRQENABLE_MPU_OFFSET);
71 DUMP_CM_MOD_REG(MPU_MOD, CM_CLKSTCTRL); 71 DUMP_CM_MOD_REG(MPU_MOD, OMAP2_CM_CLKSTCTRL);
72 DUMP_PRM_MOD_REG(MPU_MOD, PM_PWSTCTRL); 72 DUMP_PRM_MOD_REG(MPU_MOD, OMAP2_PM_PWSTCTRL);
73 DUMP_PRM_MOD_REG(MPU_MOD, PM_PWSTST); 73 DUMP_PRM_MOD_REG(MPU_MOD, OMAP2_PM_PWSTST);
74 DUMP_PRM_MOD_REG(MPU_MOD, PM_WKDEP); 74 DUMP_PRM_MOD_REG(MPU_MOD, PM_WKDEP);
75#endif 75#endif
76#if 0 76#if 0
@@ -94,7 +94,7 @@ void omap2_pm_dump(int mode, int resume, unsigned int us)
94 DUMP_CM_MOD_REG(WKUP_MOD, CM_ICLKEN); 94 DUMP_CM_MOD_REG(WKUP_MOD, CM_ICLKEN);
95 DUMP_CM_MOD_REG(PLL_MOD, CM_CLKEN); 95 DUMP_CM_MOD_REG(PLL_MOD, CM_CLKEN);
96 DUMP_CM_MOD_REG(PLL_MOD, CM_AUTOIDLE); 96 DUMP_CM_MOD_REG(PLL_MOD, CM_AUTOIDLE);
97 DUMP_PRM_MOD_REG(CORE_MOD, PM_PWSTST); 97 DUMP_PRM_MOD_REG(CORE_MOD, OMAP2_PM_PWSTST);
98#endif 98#endif
99#if 0 99#if 0
100 /* DSP */ 100 /* DSP */
@@ -104,11 +104,11 @@ void omap2_pm_dump(int mode, int resume, unsigned int us)
104 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_IDLEST); 104 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_IDLEST);
105 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_AUTOIDLE); 105 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_AUTOIDLE);
106 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_CLKSEL); 106 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_CLKSEL);
107 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_CLKSTCTRL); 107 DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_CM_CLKSTCTRL);
108 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, RM_RSTCTRL); 108 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_RM_RSTCTRL);
109 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, RM_RSTST); 109 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_RM_RSTST);
110 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, PM_PWSTCTRL); 110 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_PM_PWSTCTRL);
111 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, PM_PWSTST); 111 DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_PM_PWSTST);
112 } 112 }
113#endif 113#endif
114 } else { 114 } else {
@@ -166,6 +166,8 @@ struct dentry *pm_dbg_dir;
166 166
167static int pm_dbg_init_done; 167static int pm_dbg_init_done;
168 168
169static int __init pm_dbg_init(void);
170
169enum { 171enum {
170 DEBUG_FILE_COUNTERS = 0, 172 DEBUG_FILE_COUNTERS = 0,
171 DEBUG_FILE_TIMERS, 173 DEBUG_FILE_TIMERS,
@@ -325,7 +327,7 @@ int pm_dbg_regset_save(int reg_set)
325 return 0; 327 return 0;
326} 328}
327 329
328static const char pwrdm_state_names[][4] = { 330static const char pwrdm_state_names[][PWRDM_MAX_PWRSTS] = {
329 "OFF", 331 "OFF",
330 "RET", 332 "RET",
331 "INA", 333 "INA",
@@ -380,10 +382,15 @@ static int pwrdm_dbg_show_counter(struct powerdomain *pwrdm, void *user)
380 382
381 seq_printf(s, "%s (%s)", pwrdm->name, 383 seq_printf(s, "%s (%s)", pwrdm->name,
382 pwrdm_state_names[pwrdm->state]); 384 pwrdm_state_names[pwrdm->state]);
383 for (i = 0; i < 4; i++) 385 for (i = 0; i < PWRDM_MAX_PWRSTS; i++)
384 seq_printf(s, ",%s:%d", pwrdm_state_names[i], 386 seq_printf(s, ",%s:%d", pwrdm_state_names[i],
385 pwrdm->state_counter[i]); 387 pwrdm->state_counter[i]);
386 388
389 seq_printf(s, ",RET-LOGIC-OFF:%d", pwrdm->ret_logic_off_counter);
390 for (i = 0; i < pwrdm->banks; i++)
391 seq_printf(s, ",RET-MEMBANK%d-OFF:%d", i + 1,
392 pwrdm->ret_mem_off_counter[i]);
393
387 seq_printf(s, "\n"); 394 seq_printf(s, "\n");
388 395
389 return 0; 396 return 0;
@@ -487,9 +494,11 @@ int pm_dbg_regset_init(int reg_set)
487 494
488static int pwrdm_suspend_get(void *data, u64 *val) 495static int pwrdm_suspend_get(void *data, u64 *val)
489{ 496{
490 *val = omap3_pm_get_suspend_state((struct powerdomain *)data); 497 int ret;
498 ret = omap3_pm_get_suspend_state((struct powerdomain *)data);
499 *val = ret;
491 500
492 if (*val >= 0) 501 if (ret >= 0)
493 return 0; 502 return 0;
494 return *val; 503 return *val;
495} 504}
@@ -526,6 +535,29 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *dir)
526 return 0; 535 return 0;
527} 536}
528 537
538static int option_get(void *data, u64 *val)
539{
540 u32 *option = data;
541
542 *val = *option;
543
544 return 0;
545}
546
547static int option_set(void *data, u64 val)
548{
549 u32 *option = data;
550
551 *option = val;
552
553 if (option == &enable_off_mode)
554 omap3_pm_off_mode_enable(val);
555
556 return 0;
557}
558
559DEFINE_SIMPLE_ATTRIBUTE(pm_dbg_option_fops, option_get, option_set, "%llu\n");
560
529static int __init pm_dbg_init(void) 561static int __init pm_dbg_init(void)
530{ 562{
531 int i; 563 int i;
@@ -551,7 +583,7 @@ static int __init pm_dbg_init(void)
551 (void) debugfs_create_file("time", S_IRUGO, 583 (void) debugfs_create_file("time", S_IRUGO,
552 d, (void *)DEBUG_FILE_TIMERS, &debug_fops); 584 d, (void *)DEBUG_FILE_TIMERS, &debug_fops);
553 585
554 pwrdm_for_each_nolock(pwrdms_setup, (void *)d); 586 pwrdm_for_each(pwrdms_setup, (void *)d);
555 587
556 pm_dbg_dir = debugfs_create_dir("registers", d); 588 pm_dbg_dir = debugfs_create_dir("registers", d);
557 if (IS_ERR(pm_dbg_dir)) 589 if (IS_ERR(pm_dbg_dir))
@@ -568,12 +600,16 @@ static int __init pm_dbg_init(void)
568 600
569 } 601 }
570 602
603 (void) debugfs_create_file("enable_off_mode", S_IRUGO | S_IWUGO, d,
604 &enable_off_mode, &pm_dbg_option_fops);
605 (void) debugfs_create_file("sleep_while_idle", S_IRUGO | S_IWUGO, d,
606 &sleep_while_idle, &pm_dbg_option_fops);
607 (void) debugfs_create_file("wakeup_timer_seconds", S_IRUGO | S_IWUGO, d,
608 &wakeup_timer_seconds, &pm_dbg_option_fops);
571 pm_dbg_init_done = 1; 609 pm_dbg_init_done = 1;
572 610
573 return 0; 611 return 0;
574} 612}
575arch_initcall(pm_dbg_init); 613arch_initcall(pm_dbg_init);
576 614
577#else
578void pm_dbg_update_time(struct powerdomain *pwrdm, int prev) {}
579#endif 615#endif
diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h
index 8400f5768923..bd6466a2b039 100644
--- a/arch/arm/mach-omap2/pm.h
+++ b/arch/arm/mach-omap2/pm.h
@@ -11,20 +11,57 @@
11#ifndef __ARCH_ARM_MACH_OMAP2_PM_H 11#ifndef __ARCH_ARM_MACH_OMAP2_PM_H
12#define __ARCH_ARM_MACH_OMAP2_PM_H 12#define __ARCH_ARM_MACH_OMAP2_PM_H
13 13
14#include <mach/powerdomain.h> 14#include <plat/powerdomain.h>
15
16extern u32 enable_off_mode;
17extern u32 sleep_while_idle;
18
19extern void *omap3_secure_ram_storage;
20extern void omap3_pm_off_mode_enable(int);
21extern void omap_sram_idle(void);
22extern int omap3_can_sleep(void);
23extern int set_pwrdm_state(struct powerdomain *pwrdm, u32 state);
24extern int omap3_idle_init(void);
25
26struct cpuidle_params {
27 u8 valid;
28 u32 sleep_latency;
29 u32 wake_latency;
30 u32 threshold;
31};
32
33#if defined(CONFIG_PM) && defined(CONFIG_CPU_IDLE)
34extern void omap3_pm_init_cpuidle(struct cpuidle_params *cpuidle_board_params);
35#else
36static
37inline void omap3_pm_init_cpuidle(struct cpuidle_params *cpuidle_board_params)
38{
39}
40#endif
15 41
16extern int omap3_pm_get_suspend_state(struct powerdomain *pwrdm); 42extern int omap3_pm_get_suspend_state(struct powerdomain *pwrdm);
17extern int omap3_pm_set_suspend_state(struct powerdomain *pwrdm, int state); 43extern int omap3_pm_set_suspend_state(struct powerdomain *pwrdm, int state);
18 44
45extern u32 wakeup_timer_seconds;
46extern struct omap_dm_timer *gptimer_wakeup;
47
19#ifdef CONFIG_PM_DEBUG 48#ifdef CONFIG_PM_DEBUG
20extern void omap2_pm_dump(int mode, int resume, unsigned int us); 49extern void omap2_pm_dump(int mode, int resume, unsigned int us);
21extern int omap2_pm_debug; 50extern int omap2_pm_debug;
51#else
52#define omap2_pm_dump(mode, resume, us) do {} while (0);
53#define omap2_pm_debug 0
54#endif
55
56#if defined(CONFIG_CPU_IDLE)
57extern void omap3_cpuidle_update_states(void);
58#endif
59
60#if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS)
22extern void pm_dbg_update_time(struct powerdomain *pwrdm, int prev); 61extern void pm_dbg_update_time(struct powerdomain *pwrdm, int prev);
23extern int pm_dbg_regset_save(int reg_set); 62extern int pm_dbg_regset_save(int reg_set);
24extern int pm_dbg_regset_init(int reg_set); 63extern int pm_dbg_regset_init(int reg_set);
25#else 64#else
26#define omap2_pm_dump(mode, resume, us) do {} while (0);
27#define omap2_pm_debug 0
28#define pm_dbg_update_time(pwrdm, prev) do {} while (0); 65#define pm_dbg_update_time(pwrdm, prev) do {} while (0);
29#define pm_dbg_regset_save(reg_set) do {} while (0); 66#define pm_dbg_regset_save(reg_set) do {} while (0);
30#define pm_dbg_regset_init(reg_set) do {} while (0); 67#define pm_dbg_regset_init(reg_set) do {} while (0);
@@ -36,6 +73,7 @@ extern void omap24xx_cpu_suspend(u32 dll_ctrl, void __iomem *sdrc_dlla_ctrl,
36 void __iomem *sdrc_power); 73 void __iomem *sdrc_power);
37extern void omap34xx_cpu_suspend(u32 *addr, int save_state); 74extern void omap34xx_cpu_suspend(u32 *addr, int save_state);
38extern void save_secure_ram_context(u32 *addr); 75extern void save_secure_ram_context(u32 *addr);
76extern void omap3_save_scratchpad_contents(void);
39 77
40extern unsigned int omap24xx_idle_loop_suspend_sz; 78extern unsigned int omap24xx_idle_loop_suspend_sz;
41extern unsigned int omap34xx_suspend_sz; 79extern unsigned int omap34xx_suspend_sz;
diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c
index bff5c4e89742..374299ea7ade 100644
--- a/arch/arm/mach-omap2/pm24xx.c
+++ b/arch/arm/mach-omap2/pm24xx.c
@@ -36,12 +36,12 @@
36#include <asm/mach-types.h> 36#include <asm/mach-types.h>
37 37
38#include <mach/irqs.h> 38#include <mach/irqs.h>
39#include <mach/clock.h> 39#include <plat/clock.h>
40#include <mach/sram.h> 40#include <plat/sram.h>
41#include <mach/control.h> 41#include <plat/control.h>
42#include <mach/mux.h> 42#include <plat/mux.h>
43#include <mach/dma.h> 43#include <plat/dma.h>
44#include <mach/board.h> 44#include <plat/board.h>
45 45
46#include "prm.h" 46#include "prm.h"
47#include "prm-regbits-24xx.h" 47#include "prm-regbits-24xx.h"
@@ -50,18 +50,15 @@
50#include "sdrc.h" 50#include "sdrc.h"
51#include "pm.h" 51#include "pm.h"
52 52
53#include <mach/powerdomain.h> 53#include <plat/powerdomain.h>
54#include <mach/clockdomain.h> 54#include <plat/clockdomain.h>
55 55
56static void (*omap2_sram_idle)(void); 56static void (*omap2_sram_idle)(void);
57static void (*omap2_sram_suspend)(u32 dllctrl, void __iomem *sdrc_dlla_ctrl, 57static void (*omap2_sram_suspend)(u32 dllctrl, void __iomem *sdrc_dlla_ctrl,
58 void __iomem *sdrc_power); 58 void __iomem *sdrc_power);
59 59
60static struct powerdomain *mpu_pwrdm; 60static struct powerdomain *mpu_pwrdm, *core_pwrdm;
61static struct powerdomain *core_pwrdm; 61static struct clockdomain *dsp_clkdm, *mpu_clkdm, *wkup_clkdm, *gfx_clkdm;
62
63static struct clockdomain *dsp_clkdm;
64static struct clockdomain *gfx_clkdm;
65 62
66static struct clk *osc_ck, *emul_ck; 63static struct clk *osc_ck, *emul_ck;
67 64
@@ -219,11 +216,12 @@ static void omap2_enter_mpu_retention(void)
219 /* Try to enter MPU retention */ 216 /* Try to enter MPU retention */
220 prm_write_mod_reg((0x01 << OMAP_POWERSTATE_SHIFT) | 217 prm_write_mod_reg((0x01 << OMAP_POWERSTATE_SHIFT) |
221 OMAP_LOGICRETSTATE, 218 OMAP_LOGICRETSTATE,
222 MPU_MOD, PM_PWSTCTRL); 219 MPU_MOD, OMAP2_PM_PWSTCTRL);
223 } else { 220 } else {
224 /* Block MPU retention */ 221 /* Block MPU retention */
225 222
226 prm_write_mod_reg(OMAP_LOGICRETSTATE, MPU_MOD, PM_PWSTCTRL); 223 prm_write_mod_reg(OMAP_LOGICRETSTATE, MPU_MOD,
224 OMAP2_PM_PWSTCTRL);
227 only_idle = 1; 225 only_idle = 1;
228 } 226 }
229 227
@@ -333,9 +331,17 @@ static struct platform_suspend_ops omap_pm_ops = {
333 .valid = suspend_valid_only_mem, 331 .valid = suspend_valid_only_mem,
334}; 332};
335 333
336static int _pm_clkdm_enable_hwsup(struct clockdomain *clkdm, void *unused) 334/* XXX This function should be shareable between OMAP2xxx and OMAP3 */
335static int __init clkdms_setup(struct clockdomain *clkdm, void *unused)
337{ 336{
338 omap2_clkdm_allow_idle(clkdm); 337 clkdm_clear_all_wkdeps(clkdm);
338 clkdm_clear_all_sleepdeps(clkdm);
339
340 if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO)
341 omap2_clkdm_allow_idle(clkdm);
342 else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&
343 atomic_read(&clkdm->usecount) == 0)
344 omap2_clkdm_sleep(clkdm);
339 return 0; 345 return 0;
340} 346}
341 347
@@ -348,14 +354,6 @@ static void __init prcm_setup_regs(void)
348 prm_write_mod_reg(OMAP24XX_AUTOIDLE, OCP_MOD, 354 prm_write_mod_reg(OMAP24XX_AUTOIDLE, OCP_MOD,
349 OMAP2_PRCM_SYSCONFIG_OFFSET); 355 OMAP2_PRCM_SYSCONFIG_OFFSET);
350 356
351 /* Set all domain wakeup dependencies */
352 prm_write_mod_reg(OMAP_EN_WKUP_MASK, MPU_MOD, PM_WKDEP);
353 prm_write_mod_reg(0, OMAP24XX_DSP_MOD, PM_WKDEP);
354 prm_write_mod_reg(0, GFX_MOD, PM_WKDEP);
355 prm_write_mod_reg(0, CORE_MOD, PM_WKDEP);
356 if (cpu_is_omap2430())
357 prm_write_mod_reg(0, OMAP2430_MDM_MOD, PM_WKDEP);
358
359 /* 357 /*
360 * Set CORE powerdomain memory banks to retain their contents 358 * Set CORE powerdomain memory banks to retain their contents
361 * during RETENTION 359 * during RETENTION
@@ -384,8 +382,12 @@ static void __init prcm_setup_regs(void)
384 pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF); 382 pwrdm_set_next_pwrst(pwrdm, PWRDM_POWER_OFF);
385 omap2_clkdm_sleep(gfx_clkdm); 383 omap2_clkdm_sleep(gfx_clkdm);
386 384
387 /* Enable clockdomain hardware-supervised control for all clkdms */ 385 /*
388 clkdm_for_each(_pm_clkdm_enable_hwsup, NULL); 386 * Clear clockdomain wakeup dependencies and enable
387 * hardware-supervised idle for all clkdms
388 */
389 clkdm_for_each(clkdms_setup, NULL);
390 clkdm_add_wkdep(mpu_clkdm, wkup_clkdm);
389 391
390 /* Enable clock autoidle for all domains */ 392 /* Enable clock autoidle for all domains */
391 cm_write_mod_reg(OMAP24XX_AUTO_CAM | 393 cm_write_mod_reg(OMAP24XX_AUTO_CAM |
@@ -481,7 +483,7 @@ static int __init omap2_pm_init(void)
481 l = prm_read_mod_reg(OCP_MOD, OMAP2_PRCM_REVISION_OFFSET); 483 l = prm_read_mod_reg(OCP_MOD, OMAP2_PRCM_REVISION_OFFSET);
482 printk(KERN_INFO "PRCM revision %d.%d\n", (l >> 4) & 0x0f, l & 0x0f); 484 printk(KERN_INFO "PRCM revision %d.%d\n", (l >> 4) & 0x0f, l & 0x0f);
483 485
484 /* Look up important powerdomains, clockdomains */ 486 /* Look up important powerdomains */
485 487
486 mpu_pwrdm = pwrdm_lookup("mpu_pwrdm"); 488 mpu_pwrdm = pwrdm_lookup("mpu_pwrdm");
487 if (!mpu_pwrdm) 489 if (!mpu_pwrdm)
@@ -491,9 +493,19 @@ static int __init omap2_pm_init(void)
491 if (!core_pwrdm) 493 if (!core_pwrdm)
492 pr_err("PM: core_pwrdm not found\n"); 494 pr_err("PM: core_pwrdm not found\n");
493 495
496 /* Look up important clockdomains */
497
498 mpu_clkdm = clkdm_lookup("mpu_clkdm");
499 if (!mpu_clkdm)
500 pr_err("PM: mpu_clkdm not found\n");
501
502 wkup_clkdm = clkdm_lookup("wkup_clkdm");
503 if (!wkup_clkdm)
504 pr_err("PM: wkup_clkdm not found\n");
505
494 dsp_clkdm = clkdm_lookup("dsp_clkdm"); 506 dsp_clkdm = clkdm_lookup("dsp_clkdm");
495 if (!dsp_clkdm) 507 if (!dsp_clkdm)
496 pr_err("PM: mpu_clkdm not found\n"); 508 pr_err("PM: dsp_clkdm not found\n");
497 509
498 gfx_clkdm = clkdm_lookup("gfx_clkdm"); 510 gfx_clkdm = clkdm_lookup("gfx_clkdm");
499 if (!gfx_clkdm) 511 if (!gfx_clkdm)
diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c
index 89463190923a..ea0000bc5358 100644
--- a/arch/arm/mach-omap2/pm34xx.c
+++ b/arch/arm/mach-omap2/pm34xx.c
@@ -5,6 +5,9 @@
5 * Tony Lindgren <tony@atomide.com> 5 * Tony Lindgren <tony@atomide.com>
6 * Jouni Hogander 6 * Jouni Hogander
7 * 7 *
8 * Copyright (C) 2007 Texas Instruments, Inc.
9 * Rajendra Nayak <rnayak@ti.com>
10 *
8 * Copyright (C) 2005 Texas Instruments, Inc. 11 * Copyright (C) 2005 Texas Instruments, Inc.
9 * Richard Woodruff <r-woodruff2@ti.com> 12 * Richard Woodruff <r-woodruff2@ti.com>
10 * 13 *
@@ -22,12 +25,22 @@
22#include <linux/list.h> 25#include <linux/list.h>
23#include <linux/err.h> 26#include <linux/err.h>
24#include <linux/gpio.h> 27#include <linux/gpio.h>
25 28#include <linux/clk.h>
26#include <mach/sram.h> 29#include <linux/delay.h>
27#include <mach/clockdomain.h> 30#include <linux/slab.h>
28#include <mach/powerdomain.h> 31
29#include <mach/control.h> 32#include <plat/sram.h>
30#include <mach/serial.h> 33#include <plat/clockdomain.h>
34#include <plat/powerdomain.h>
35#include <plat/control.h>
36#include <plat/serial.h>
37#include <plat/sdrc.h>
38#include <plat/prcm.h>
39#include <plat/gpmc.h>
40#include <plat/dma.h>
41#include <plat/dmtimer.h>
42
43#include <asm/tlbflush.h>
31 44
32#include "cm.h" 45#include "cm.h"
33#include "cm-regbits-34xx.h" 46#include "cm-regbits-34xx.h"
@@ -35,6 +48,16 @@
35 48
36#include "prm.h" 49#include "prm.h"
37#include "pm.h" 50#include "pm.h"
51#include "sdrc.h"
52
53/* Scratchpad offsets */
54#define OMAP343X_TABLE_ADDRESS_OFFSET 0x31
55#define OMAP343X_TABLE_VALUE_OFFSET 0x30
56#define OMAP343X_CONTROL_REG_VALUE_OFFSET 0x32
57
58u32 enable_off_mode;
59u32 sleep_while_idle;
60u32 wakeup_timer_seconds;
38 61
39struct power_state { 62struct power_state {
40 struct powerdomain *pwrdm; 63 struct powerdomain *pwrdm;
@@ -49,7 +72,120 @@ static LIST_HEAD(pwrst_list);
49 72
50static void (*_omap_sram_idle)(u32 *addr, int save_state); 73static void (*_omap_sram_idle)(u32 *addr, int save_state);
51 74
52static struct powerdomain *mpu_pwrdm; 75static int (*_omap_save_secure_sram)(u32 *addr);
76
77static struct powerdomain *mpu_pwrdm, *neon_pwrdm;
78static struct powerdomain *core_pwrdm, *per_pwrdm;
79static struct powerdomain *cam_pwrdm;
80
81static inline void omap3_per_save_context(void)
82{
83 omap_gpio_save_context();
84}
85
86static inline void omap3_per_restore_context(void)
87{
88 omap_gpio_restore_context();
89}
90
91static void omap3_enable_io_chain(void)
92{
93 int timeout = 0;
94
95 if (omap_rev() >= OMAP3430_REV_ES3_1) {
96 prm_set_mod_reg_bits(OMAP3430_EN_IO_CHAIN, WKUP_MOD, PM_WKEN);
97 /* Do a readback to assure write has been done */
98 prm_read_mod_reg(WKUP_MOD, PM_WKEN);
99
100 while (!(prm_read_mod_reg(WKUP_MOD, PM_WKST) &
101 OMAP3430_ST_IO_CHAIN)) {
102 timeout++;
103 if (timeout > 1000) {
104 printk(KERN_ERR "Wake up daisy chain "
105 "activation failed.\n");
106 return;
107 }
108 prm_set_mod_reg_bits(OMAP3430_ST_IO_CHAIN,
109 WKUP_MOD, PM_WKST);
110 }
111 }
112}
113
114static void omap3_disable_io_chain(void)
115{
116 if (omap_rev() >= OMAP3430_REV_ES3_1)
117 prm_clear_mod_reg_bits(OMAP3430_EN_IO_CHAIN, WKUP_MOD, PM_WKEN);
118}
119
120static void omap3_core_save_context(void)
121{
122 u32 control_padconf_off;
123
124 /* Save the padconf registers */
125 control_padconf_off = omap_ctrl_readl(OMAP343X_CONTROL_PADCONF_OFF);
126 control_padconf_off |= START_PADCONF_SAVE;
127 omap_ctrl_writel(control_padconf_off, OMAP343X_CONTROL_PADCONF_OFF);
128 /* wait for the save to complete */
129 while (!(omap_ctrl_readl(OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS)
130 & PADCONF_SAVE_DONE))
131 udelay(1);
132
133 /*
134 * Force write last pad into memory, as this can fail in some
135 * cases according to erratas 1.157, 1.185
136 */
137 omap_ctrl_writel(omap_ctrl_readl(OMAP343X_PADCONF_ETK_D14),
138 OMAP343X_CONTROL_MEM_WKUP + 0x2a0);
139
140 /* Save the Interrupt controller context */
141 omap_intc_save_context();
142 /* Save the GPMC context */
143 omap3_gpmc_save_context();
144 /* Save the system control module context, padconf already save above*/
145 omap3_control_save_context();
146 omap_dma_global_context_save();
147}
148
149static void omap3_core_restore_context(void)
150{
151 /* Restore the control module context, padconf restored by h/w */
152 omap3_control_restore_context();
153 /* Restore the GPMC context */
154 omap3_gpmc_restore_context();
155 /* Restore the interrupt controller context */
156 omap_intc_restore_context();
157 omap_dma_global_context_restore();
158}
159
160/*
161 * FIXME: This function should be called before entering off-mode after
162 * OMAP3 secure services have been accessed. Currently it is only called
163 * once during boot sequence, but this works as we are not using secure
164 * services.
165 */
166static void omap3_save_secure_ram_context(u32 target_mpu_state)
167{
168 u32 ret;
169
170 if (omap_type() != OMAP2_DEVICE_TYPE_GP) {
171 /*
172 * MPU next state must be set to POWER_ON temporarily,
173 * otherwise the WFI executed inside the ROM code
174 * will hang the system.
175 */
176 pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON);
177 ret = _omap_save_secure_sram((u32 *)
178 __pa(omap3_secure_ram_storage));
179 pwrdm_set_next_pwrst(mpu_pwrdm, target_mpu_state);
180 /* Following is for error tracking, it should not happen */
181 if (ret) {
182 printk(KERN_ERR "save_secure_sram() returns %08x\n",
183 ret);
184 while (1)
185 ;
186 }
187 }
188}
53 189
54/* 190/*
55 * PRCM Interrupt Handler Helper Function 191 * PRCM Interrupt Handler Helper Function
@@ -161,7 +297,36 @@ static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id)
161 return IRQ_HANDLED; 297 return IRQ_HANDLED;
162} 298}
163 299
164static void omap_sram_idle(void) 300static void restore_control_register(u32 val)
301{
302 __asm__ __volatile__ ("mcr p15, 0, %0, c1, c0, 0" : : "r" (val));
303}
304
305/* Function to restore the table entry that was modified for enabling MMU */
306static void restore_table_entry(void)
307{
308 u32 *scratchpad_address;
309 u32 previous_value, control_reg_value;
310 u32 *address;
311
312 scratchpad_address = OMAP2_L4_IO_ADDRESS(OMAP343X_SCRATCHPAD);
313
314 /* Get address of entry that was modified */
315 address = (u32 *)__raw_readl(scratchpad_address +
316 OMAP343X_TABLE_ADDRESS_OFFSET);
317 /* Get the previous value which needs to be restored */
318 previous_value = __raw_readl(scratchpad_address +
319 OMAP343X_TABLE_VALUE_OFFSET);
320 address = __va(address);
321 *address = previous_value;
322 flush_tlb_all();
323 control_reg_value = __raw_readl(scratchpad_address
324 + OMAP343X_CONTROL_REG_VALUE_OFFSET);
325 /* This will enable caches and prediction */
326 restore_control_register(control_reg_value);
327}
328
329void omap_sram_idle(void)
165{ 330{
166 /* Variable to tell what needs to be saved and restored 331 /* Variable to tell what needs to be saved and restored
167 * in omap_sram_idle*/ 332 * in omap_sram_idle*/
@@ -169,17 +334,32 @@ static void omap_sram_idle(void)
169 /* save_state = 1 => Only L1 and logic lost */ 334 /* save_state = 1 => Only L1 and logic lost */
170 /* save_state = 2 => Only L2 lost */ 335 /* save_state = 2 => Only L2 lost */
171 /* save_state = 3 => L1, L2 and logic lost */ 336 /* save_state = 3 => L1, L2 and logic lost */
172 int save_state = 0, mpu_next_state; 337 int save_state = 0;
338 int mpu_next_state = PWRDM_POWER_ON;
339 int per_next_state = PWRDM_POWER_ON;
340 int core_next_state = PWRDM_POWER_ON;
341 int core_prev_state, per_prev_state;
342 u32 sdrc_pwr = 0;
343 int per_state_modified = 0;
173 344
174 if (!_omap_sram_idle) 345 if (!_omap_sram_idle)
175 return; 346 return;
176 347
348 pwrdm_clear_all_prev_pwrst(mpu_pwrdm);
349 pwrdm_clear_all_prev_pwrst(neon_pwrdm);
350 pwrdm_clear_all_prev_pwrst(core_pwrdm);
351 pwrdm_clear_all_prev_pwrst(per_pwrdm);
352
177 mpu_next_state = pwrdm_read_next_pwrst(mpu_pwrdm); 353 mpu_next_state = pwrdm_read_next_pwrst(mpu_pwrdm);
178 switch (mpu_next_state) { 354 switch (mpu_next_state) {
355 case PWRDM_POWER_ON:
179 case PWRDM_POWER_RET: 356 case PWRDM_POWER_RET:
180 /* No need to save context */ 357 /* No need to save context */
181 save_state = 0; 358 save_state = 0;
182 break; 359 break;
360 case PWRDM_POWER_OFF:
361 save_state = 3;
362 break;
183 default: 363 default:
184 /* Invalid state */ 364 /* Invalid state */
185 printk(KERN_ERR "Invalid mpu state in sram_idle\n"); 365 printk(KERN_ERR "Invalid mpu state in sram_idle\n");
@@ -187,68 +367,117 @@ static void omap_sram_idle(void)
187 } 367 }
188 pwrdm_pre_transition(); 368 pwrdm_pre_transition();
189 369
190 omap2_gpio_prepare_for_retention(); 370 /* NEON control */
191 omap_uart_prepare_idle(0); 371 if (pwrdm_read_pwrst(neon_pwrdm) == PWRDM_POWER_ON)
192 omap_uart_prepare_idle(1); 372 pwrdm_set_next_pwrst(neon_pwrdm, mpu_next_state);
193 omap_uart_prepare_idle(2); 373
374 /* PER */
375 per_next_state = pwrdm_read_next_pwrst(per_pwrdm);
376 core_next_state = pwrdm_read_next_pwrst(core_pwrdm);
377 if (per_next_state < PWRDM_POWER_ON) {
378 omap_uart_prepare_idle(2);
379 omap2_gpio_prepare_for_retention();
380 if (per_next_state == PWRDM_POWER_OFF) {
381 if (core_next_state == PWRDM_POWER_ON) {
382 per_next_state = PWRDM_POWER_RET;
383 pwrdm_set_next_pwrst(per_pwrdm, per_next_state);
384 per_state_modified = 1;
385 } else
386 omap3_per_save_context();
387 }
388 }
194 389
195 _omap_sram_idle(NULL, save_state); 390 if (pwrdm_read_pwrst(cam_pwrdm) == PWRDM_POWER_ON)
196 cpu_init(); 391 omap2_clkdm_deny_idle(mpu_pwrdm->pwrdm_clkdms[0]);
197 392
198 omap_uart_resume_idle(2); 393 /* CORE */
199 omap_uart_resume_idle(1); 394 if (core_next_state < PWRDM_POWER_ON) {
200 omap_uart_resume_idle(0); 395 omap_uart_prepare_idle(0);
201 omap2_gpio_resume_after_retention(); 396 omap_uart_prepare_idle(1);
397 if (core_next_state == PWRDM_POWER_OFF) {
398 omap3_core_save_context();
399 omap3_prcm_save_context();
400 }
401 /* Enable IO-PAD and IO-CHAIN wakeups */
402 prm_set_mod_reg_bits(OMAP3430_EN_IO, WKUP_MOD, PM_WKEN);
403 omap3_enable_io_chain();
404 }
405 omap3_intc_prepare_idle();
202 406
203 pwrdm_post_transition(); 407 /*
408 * On EMU/HS devices ROM code restores a SRDC value
409 * from scratchpad which has automatic self refresh on timeout
410 * of AUTO_CNT = 1 enabled. This takes care of errata 1.142.
411 * Hence store/restore the SDRC_POWER register here.
412 */
413 if (omap_rev() >= OMAP3430_REV_ES3_0 &&
414 omap_type() != OMAP2_DEVICE_TYPE_GP &&
415 core_next_state == PWRDM_POWER_OFF)
416 sdrc_pwr = sdrc_read_reg(SDRC_POWER);
204 417
205} 418 /*
419 * omap3_arm_context is the location where ARM registers
420 * get saved. The restore path then reads from this
421 * location and restores them back.
422 */
423 _omap_sram_idle(omap3_arm_context, save_state);
424 cpu_init();
206 425
207/* 426 /* Restore normal SDRC POWER settings */
208 * Check if functional clocks are enabled before entering 427 if (omap_rev() >= OMAP3430_REV_ES3_0 &&
209 * sleep. This function could be behind CONFIG_PM_DEBUG 428 omap_type() != OMAP2_DEVICE_TYPE_GP &&
210 * when all drivers are configuring their sysconfig registers 429 core_next_state == PWRDM_POWER_OFF)
211 * properly and using their clocks properly. 430 sdrc_write_reg(sdrc_pwr, SDRC_POWER);
212 */ 431
213static int omap3_fclks_active(void) 432 /* Restore table entry modified during MMU restoration */
214{ 433 if (pwrdm_read_prev_pwrst(mpu_pwrdm) == PWRDM_POWER_OFF)
215 u32 fck_core1 = 0, fck_core3 = 0, fck_sgx = 0, fck_dss = 0, 434 restore_table_entry();
216 fck_cam = 0, fck_per = 0, fck_usbhost = 0; 435
436 /* CORE */
437 if (core_next_state < PWRDM_POWER_ON) {
438 core_prev_state = pwrdm_read_prev_pwrst(core_pwrdm);
439 if (core_prev_state == PWRDM_POWER_OFF) {
440 omap3_core_restore_context();
441 omap3_prcm_restore_context();
442 omap3_sram_restore_context();
443 omap2_sms_restore_context();
444 }
445 omap_uart_resume_idle(0);
446 omap_uart_resume_idle(1);
447 if (core_next_state == PWRDM_POWER_OFF)
448 prm_clear_mod_reg_bits(OMAP3430_AUTO_OFF,
449 OMAP3430_GR_MOD,
450 OMAP3_PRM_VOLTCTRL_OFFSET);
451 }
452 omap3_intc_resume_idle();
453
454 /* PER */
455 if (per_next_state < PWRDM_POWER_ON) {
456 per_prev_state = pwrdm_read_prev_pwrst(per_pwrdm);
457 if (per_prev_state == PWRDM_POWER_OFF)
458 omap3_per_restore_context();
459 omap2_gpio_resume_after_retention();
460 omap_uart_resume_idle(2);
461 if (per_state_modified)
462 pwrdm_set_next_pwrst(per_pwrdm, PWRDM_POWER_OFF);
463 }
217 464
218 fck_core1 = cm_read_mod_reg(CORE_MOD, 465 /* Disable IO-PAD and IO-CHAIN wakeup */
219 CM_FCLKEN1); 466 if (core_next_state < PWRDM_POWER_ON) {
220 if (omap_rev() > OMAP3430_REV_ES1_0) { 467 prm_clear_mod_reg_bits(OMAP3430_EN_IO, WKUP_MOD, PM_WKEN);
221 fck_core3 = cm_read_mod_reg(CORE_MOD, 468 omap3_disable_io_chain();
222 OMAP3430ES2_CM_FCLKEN3); 469 }
223 fck_sgx = cm_read_mod_reg(OMAP3430ES2_SGX_MOD, 470
224 CM_FCLKEN); 471 pwrdm_post_transition();
225 fck_usbhost = cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, 472
226 CM_FCLKEN); 473 omap2_clkdm_allow_idle(mpu_pwrdm->pwrdm_clkdms[0]);
227 } else
228 fck_sgx = cm_read_mod_reg(GFX_MOD,
229 OMAP3430ES2_CM_FCLKEN3);
230 fck_dss = cm_read_mod_reg(OMAP3430_DSS_MOD,
231 CM_FCLKEN);
232 fck_cam = cm_read_mod_reg(OMAP3430_CAM_MOD,
233 CM_FCLKEN);
234 fck_per = cm_read_mod_reg(OMAP3430_PER_MOD,
235 CM_FCLKEN);
236
237 /* Ignore UART clocks. These are handled by UART core (serial.c) */
238 fck_core1 &= ~(OMAP3430_EN_UART1 | OMAP3430_EN_UART2);
239 fck_per &= ~OMAP3430_EN_UART3;
240
241 if (fck_core1 | fck_core3 | fck_sgx | fck_dss |
242 fck_cam | fck_per | fck_usbhost)
243 return 1;
244 return 0;
245} 474}
246 475
247static int omap3_can_sleep(void) 476int omap3_can_sleep(void)
248{ 477{
249 if (!omap_uart_can_sleep()) 478 if (!sleep_while_idle)
250 return 0; 479 return 0;
251 if (omap3_fclks_active()) 480 if (!omap_uart_can_sleep())
252 return 0; 481 return 0;
253 return 1; 482 return 1;
254} 483}
@@ -256,7 +485,7 @@ static int omap3_can_sleep(void)
256/* This sets pwrdm state (other than mpu & core. Currently only ON & 485/* This sets pwrdm state (other than mpu & core. Currently only ON &
257 * RET are supported. Function is assuming that clkdm doesn't have 486 * RET are supported. Function is assuming that clkdm doesn't have
258 * hw_sup mode enabled. */ 487 * hw_sup mode enabled. */
259static int set_pwrdm_state(struct powerdomain *pwrdm, u32 state) 488int set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
260{ 489{
261 u32 cur_state; 490 u32 cur_state;
262 int sleep_switch = 0; 491 int sleep_switch = 0;
@@ -306,7 +535,7 @@ static void omap3_pm_idle(void)
306 if (!omap3_can_sleep()) 535 if (!omap3_can_sleep())
307 goto out; 536 goto out;
308 537
309 if (omap_irq_pending()) 538 if (omap_irq_pending() || need_resched())
310 goto out; 539 goto out;
311 540
312 omap_sram_idle(); 541 omap_sram_idle();
@@ -319,6 +548,22 @@ out:
319#ifdef CONFIG_SUSPEND 548#ifdef CONFIG_SUSPEND
320static suspend_state_t suspend_state; 549static suspend_state_t suspend_state;
321 550
551static void omap2_pm_wakeup_on_timer(u32 seconds)
552{
553 u32 tick_rate, cycles;
554
555 if (!seconds)
556 return;
557
558 tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer_wakeup));
559 cycles = tick_rate * seconds;
560 omap_dm_timer_stop(gptimer_wakeup);
561 omap_dm_timer_set_load_start(gptimer_wakeup, 0, 0xffffffff - cycles);
562
563 pr_info("PM: Resume timer in %d secs (%d ticks at %d ticks/sec.)\n",
564 seconds, cycles, tick_rate);
565}
566
322static int omap3_pm_prepare(void) 567static int omap3_pm_prepare(void)
323{ 568{
324 disable_hlt(); 569 disable_hlt();
@@ -330,6 +575,9 @@ static int omap3_pm_suspend(void)
330 struct power_state *pwrst; 575 struct power_state *pwrst;
331 int state, ret = 0; 576 int state, ret = 0;
332 577
578 if (wakeup_timer_seconds)
579 omap2_pm_wakeup_on_timer(wakeup_timer_seconds);
580
333 /* Read current next_pwrsts */ 581 /* Read current next_pwrsts */
334 list_for_each_entry(pwrst, &pwrst_list, node) 582 list_for_each_entry(pwrst, &pwrst_list, node)
335 pwrst->saved_state = pwrdm_read_next_pwrst(pwrst->pwrdm); 583 pwrst->saved_state = pwrdm_read_next_pwrst(pwrst->pwrdm);
@@ -342,6 +590,8 @@ static int omap3_pm_suspend(void)
342 } 590 }
343 591
344 omap_uart_prepare_suspend(); 592 omap_uart_prepare_suspend();
593 omap3_intc_suspend();
594
345 omap_sram_idle(); 595 omap_sram_idle();
346 596
347restore: 597restore:
@@ -436,10 +686,10 @@ static void __init omap3_iva_idle(void)
436 prm_write_mod_reg(OMAP3430_RST1_IVA2 | 686 prm_write_mod_reg(OMAP3430_RST1_IVA2 |
437 OMAP3430_RST2_IVA2 | 687 OMAP3430_RST2_IVA2 |
438 OMAP3430_RST3_IVA2, 688 OMAP3430_RST3_IVA2,
439 OMAP3430_IVA2_MOD, RM_RSTCTRL); 689 OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL);
440 690
441 /* Enable IVA2 clock */ 691 /* Enable IVA2 clock */
442 cm_write_mod_reg(OMAP3430_CM_FCLKEN_IVA2_EN_IVA2, 692 cm_write_mod_reg(OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_MASK,
443 OMAP3430_IVA2_MOD, CM_FCLKEN); 693 OMAP3430_IVA2_MOD, CM_FCLKEN);
444 694
445 /* Set IVA2 boot mode to 'idle' */ 695 /* Set IVA2 boot mode to 'idle' */
@@ -447,7 +697,7 @@ static void __init omap3_iva_idle(void)
447 OMAP343X_CONTROL_IVA2_BOOTMOD); 697 OMAP343X_CONTROL_IVA2_BOOTMOD);
448 698
449 /* Un-reset IVA2 */ 699 /* Un-reset IVA2 */
450 prm_write_mod_reg(0, OMAP3430_IVA2_MOD, RM_RSTCTRL); 700 prm_write_mod_reg(0, OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL);
451 701
452 /* Disable IVA2 clock */ 702 /* Disable IVA2 clock */
453 cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN); 703 cm_write_mod_reg(0, OMAP3430_IVA2_MOD, CM_FCLKEN);
@@ -456,7 +706,7 @@ static void __init omap3_iva_idle(void)
456 prm_write_mod_reg(OMAP3430_RST1_IVA2 | 706 prm_write_mod_reg(OMAP3430_RST1_IVA2 |
457 OMAP3430_RST2_IVA2 | 707 OMAP3430_RST2_IVA2 |
458 OMAP3430_RST3_IVA2, 708 OMAP3430_RST3_IVA2,
459 OMAP3430_IVA2_MOD, RM_RSTCTRL); 709 OMAP3430_IVA2_MOD, OMAP2_RM_RSTCTRL);
460} 710}
461 711
462static void __init omap3_d2d_idle(void) 712static void __init omap3_d2d_idle(void)
@@ -479,8 +729,8 @@ static void __init omap3_d2d_idle(void)
479 /* reset modem */ 729 /* reset modem */
480 prm_write_mod_reg(OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RSTPWRON | 730 prm_write_mod_reg(OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RSTPWRON |
481 OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RST, 731 OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RST,
482 CORE_MOD, RM_RSTCTRL); 732 CORE_MOD, OMAP2_RM_RSTCTRL);
483 prm_write_mod_reg(0, CORE_MOD, RM_RSTCTRL); 733 prm_write_mod_reg(0, CORE_MOD, OMAP2_RM_RSTCTRL);
484} 734}
485 735
486static void __init prcm_setup_regs(void) 736static void __init prcm_setup_regs(void)
@@ -599,6 +849,8 @@ static void __init prcm_setup_regs(void)
599 CM_AUTOIDLE); 849 CM_AUTOIDLE);
600 } 850 }
601 851
852 omap_ctrl_writel(OMAP3430_AUTOIDLE, OMAP2_CONTROL_SYSCONFIG);
853
602 /* 854 /*
603 * Set all plls to autoidle. This is needed until autoidle is 855 * Set all plls to autoidle. This is needed until autoidle is
604 * enabled by clockfw 856 * enabled by clockfw
@@ -639,15 +891,23 @@ static void __init prcm_setup_regs(void)
639 prm_write_mod_reg(OMAP3430_IO_EN | OMAP3430_WKUP_EN, 891 prm_write_mod_reg(OMAP3430_IO_EN | OMAP3430_WKUP_EN,
640 OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET); 892 OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET);
641 893
894 /* Enable PM_WKEN to support DSS LPR */
895 prm_write_mod_reg(OMAP3430_PM_WKEN_DSS_EN_DSS,
896 OMAP3430_DSS_MOD, PM_WKEN);
897
642 /* Enable wakeups in PER */ 898 /* Enable wakeups in PER */
643 prm_write_mod_reg(OMAP3430_EN_GPIO2 | OMAP3430_EN_GPIO3 | 899 prm_write_mod_reg(OMAP3430_EN_GPIO2 | OMAP3430_EN_GPIO3 |
644 OMAP3430_EN_GPIO4 | OMAP3430_EN_GPIO5 | 900 OMAP3430_EN_GPIO4 | OMAP3430_EN_GPIO5 |
645 OMAP3430_EN_GPIO6 | OMAP3430_EN_UART3, 901 OMAP3430_EN_GPIO6 | OMAP3430_EN_UART3 |
902 OMAP3430_EN_MCBSP2 | OMAP3430_EN_MCBSP3 |
903 OMAP3430_EN_MCBSP4,
646 OMAP3430_PER_MOD, PM_WKEN); 904 OMAP3430_PER_MOD, PM_WKEN);
647 /* and allow them to wake up MPU */ 905 /* and allow them to wake up MPU */
648 prm_write_mod_reg(OMAP3430_GRPSEL_GPIO2 | OMAP3430_EN_GPIO3 | 906 prm_write_mod_reg(OMAP3430_GRPSEL_GPIO2 | OMAP3430_EN_GPIO3 |
649 OMAP3430_GRPSEL_GPIO4 | OMAP3430_EN_GPIO5 | 907 OMAP3430_GRPSEL_GPIO4 | OMAP3430_EN_GPIO5 |
650 OMAP3430_GRPSEL_GPIO6 | OMAP3430_EN_UART3, 908 OMAP3430_GRPSEL_GPIO6 | OMAP3430_EN_UART3 |
909 OMAP3430_EN_MCBSP2 | OMAP3430_EN_MCBSP3 |
910 OMAP3430_EN_MCBSP4,
651 OMAP3430_PER_MOD, OMAP3430_PM_MPUGRPSEL); 911 OMAP3430_PER_MOD, OMAP3430_PM_MPUGRPSEL);
652 912
653 /* Don't attach IVA interrupts */ 913 /* Don't attach IVA interrupts */
@@ -657,37 +917,39 @@ static void __init prcm_setup_regs(void)
657 prm_write_mod_reg(0, OMAP3430_PER_MOD, OMAP3430_PM_IVAGRPSEL); 917 prm_write_mod_reg(0, OMAP3430_PER_MOD, OMAP3430_PM_IVAGRPSEL);
658 918
659 /* Clear any pending 'reset' flags */ 919 /* Clear any pending 'reset' flags */
660 prm_write_mod_reg(0xffffffff, MPU_MOD, RM_RSTST); 920 prm_write_mod_reg(0xffffffff, MPU_MOD, OMAP2_RM_RSTST);
661 prm_write_mod_reg(0xffffffff, CORE_MOD, RM_RSTST); 921 prm_write_mod_reg(0xffffffff, CORE_MOD, OMAP2_RM_RSTST);
662 prm_write_mod_reg(0xffffffff, OMAP3430_PER_MOD, RM_RSTST); 922 prm_write_mod_reg(0xffffffff, OMAP3430_PER_MOD, OMAP2_RM_RSTST);
663 prm_write_mod_reg(0xffffffff, OMAP3430_EMU_MOD, RM_RSTST); 923 prm_write_mod_reg(0xffffffff, OMAP3430_EMU_MOD, OMAP2_RM_RSTST);
664 prm_write_mod_reg(0xffffffff, OMAP3430_NEON_MOD, RM_RSTST); 924 prm_write_mod_reg(0xffffffff, OMAP3430_NEON_MOD, OMAP2_RM_RSTST);
665 prm_write_mod_reg(0xffffffff, OMAP3430_DSS_MOD, RM_RSTST); 925 prm_write_mod_reg(0xffffffff, OMAP3430_DSS_MOD, OMAP2_RM_RSTST);
666 prm_write_mod_reg(0xffffffff, OMAP3430ES2_USBHOST_MOD, RM_RSTST); 926 prm_write_mod_reg(0xffffffff, OMAP3430ES2_USBHOST_MOD, OMAP2_RM_RSTST);
667 927
668 /* Clear any pending PRCM interrupts */ 928 /* Clear any pending PRCM interrupts */
669 prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); 929 prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
670 930
671 /* Don't attach IVA interrupts */ 931 omap3_iva_idle();
672 prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL); 932 omap3_d2d_idle();
673 prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1); 933}
674 prm_write_mod_reg(0, CORE_MOD, OMAP3430ES2_PM_IVAGRPSEL3);
675 prm_write_mod_reg(0, OMAP3430_PER_MOD, OMAP3430_PM_IVAGRPSEL);
676 934
677 /* Clear any pending 'reset' flags */ 935void omap3_pm_off_mode_enable(int enable)
678 prm_write_mod_reg(0xffffffff, MPU_MOD, RM_RSTST); 936{
679 prm_write_mod_reg(0xffffffff, CORE_MOD, RM_RSTST); 937 struct power_state *pwrst;
680 prm_write_mod_reg(0xffffffff, OMAP3430_PER_MOD, RM_RSTST); 938 u32 state;
681 prm_write_mod_reg(0xffffffff, OMAP3430_EMU_MOD, RM_RSTST);
682 prm_write_mod_reg(0xffffffff, OMAP3430_NEON_MOD, RM_RSTST);
683 prm_write_mod_reg(0xffffffff, OMAP3430_DSS_MOD, RM_RSTST);
684 prm_write_mod_reg(0xffffffff, OMAP3430ES2_USBHOST_MOD, RM_RSTST);
685 939
686 /* Clear any pending PRCM interrupts */ 940 if (enable)
687 prm_write_mod_reg(0, OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET); 941 state = PWRDM_POWER_OFF;
942 else
943 state = PWRDM_POWER_RET;
688 944
689 omap3_iva_idle(); 945#ifdef CONFIG_CPU_IDLE
690 omap3_d2d_idle(); 946 omap3_cpuidle_update_states();
947#endif
948
949 list_for_each_entry(pwrst, &pwrst_list, node) {
950 pwrst->next_state = state;
951 set_pwrdm_state(pwrst->pwrdm, state);
952 }
691} 953}
692 954
693int omap3_pm_get_suspend_state(struct powerdomain *pwrdm) 955int omap3_pm_get_suspend_state(struct powerdomain *pwrdm)
@@ -741,6 +1003,9 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused)
741 */ 1003 */
742static int __init clkdms_setup(struct clockdomain *clkdm, void *unused) 1004static int __init clkdms_setup(struct clockdomain *clkdm, void *unused)
743{ 1005{
1006 clkdm_clear_all_wkdeps(clkdm);
1007 clkdm_clear_all_sleepdeps(clkdm);
1008
744 if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO) 1009 if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO)
745 omap2_clkdm_allow_idle(clkdm); 1010 omap2_clkdm_allow_idle(clkdm);
746 else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP && 1011 else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&
@@ -749,9 +1014,19 @@ static int __init clkdms_setup(struct clockdomain *clkdm, void *unused)
749 return 0; 1014 return 0;
750} 1015}
751 1016
1017void omap_push_sram_idle(void)
1018{
1019 _omap_sram_idle = omap_sram_push(omap34xx_cpu_suspend,
1020 omap34xx_cpu_suspend_sz);
1021 if (omap_type() != OMAP2_DEVICE_TYPE_GP)
1022 _omap_save_secure_sram = omap_sram_push(save_secure_ram_context,
1023 save_secure_ram_context_sz);
1024}
1025
752static int __init omap3_pm_init(void) 1026static int __init omap3_pm_init(void)
753{ 1027{
754 struct power_state *pwrst, *tmp; 1028 struct power_state *pwrst, *tmp;
1029 struct clockdomain *neon_clkdm, *per_clkdm, *mpu_clkdm, *core_clkdm;
755 int ret; 1030 int ret;
756 1031
757 if (!cpu_is_omap34xx()) 1032 if (!cpu_is_omap34xx())
@@ -786,15 +1061,52 @@ static int __init omap3_pm_init(void)
786 goto err2; 1061 goto err2;
787 } 1062 }
788 1063
789 _omap_sram_idle = omap_sram_push(omap34xx_cpu_suspend, 1064 neon_pwrdm = pwrdm_lookup("neon_pwrdm");
790 omap34xx_cpu_suspend_sz); 1065 per_pwrdm = pwrdm_lookup("per_pwrdm");
1066 core_pwrdm = pwrdm_lookup("core_pwrdm");
1067 cam_pwrdm = pwrdm_lookup("cam_pwrdm");
1068
1069 neon_clkdm = clkdm_lookup("neon_clkdm");
1070 mpu_clkdm = clkdm_lookup("mpu_clkdm");
1071 per_clkdm = clkdm_lookup("per_clkdm");
1072 core_clkdm = clkdm_lookup("core_clkdm");
791 1073
1074 omap_push_sram_idle();
792#ifdef CONFIG_SUSPEND 1075#ifdef CONFIG_SUSPEND
793 suspend_set_ops(&omap_pm_ops); 1076 suspend_set_ops(&omap_pm_ops);
794#endif /* CONFIG_SUSPEND */ 1077#endif /* CONFIG_SUSPEND */
795 1078
796 pm_idle = omap3_pm_idle; 1079 pm_idle = omap3_pm_idle;
1080 omap3_idle_init();
1081
1082 clkdm_add_wkdep(neon_clkdm, mpu_clkdm);
1083 /*
1084 * REVISIT: This wkdep is only necessary when GPIO2-6 are enabled for
1085 * IO-pad wakeup. Otherwise it will unnecessarily waste power
1086 * waking up PER with every CORE wakeup - see
1087 * http://marc.info/?l=linux-omap&m=121852150710062&w=2
1088 */
1089 clkdm_add_wkdep(per_clkdm, core_clkdm);
1090
1091 if (omap_type() != OMAP2_DEVICE_TYPE_GP) {
1092 omap3_secure_ram_storage =
1093 kmalloc(0x803F, GFP_KERNEL);
1094 if (!omap3_secure_ram_storage)
1095 printk(KERN_ERR "Memory allocation failed when"
1096 "allocating for secure sram context\n");
1097
1098 local_irq_disable();
1099 local_fiq_disable();
1100
1101 omap_dma_global_context_save();
1102 omap3_save_secure_ram_context(PWRDM_POWER_ON);
1103 omap_dma_global_context_restore();
1104
1105 local_irq_enable();
1106 local_fiq_enable();
1107 }
797 1108
1109 omap3_save_scratchpad_contents();
798err1: 1110err1:
799 return ret; 1111 return ret;
800err2: 1112err2:
diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c
index f00289abd30f..ebfce7d1a5d3 100644
--- a/arch/arm/mach-omap2/powerdomain.c
+++ b/arch/arm/mach-omap2/powerdomain.c
@@ -2,17 +2,17 @@
2 * OMAP powerdomain control 2 * OMAP powerdomain control
3 * 3 *
4 * Copyright (C) 2007-2008 Texas Instruments, Inc. 4 * Copyright (C) 2007-2008 Texas Instruments, Inc.
5 * Copyright (C) 2007-2008 Nokia Corporation 5 * Copyright (C) 2007-2009 Nokia Corporation
6 * 6 *
7 * Written by Paul Walmsley 7 * Written by Paul Walmsley
8 * 8 *
9 * Added OMAP4 specific support by Abhijit Pagare <abhijitpagare@ti.com>
10 *
9 * This program is free software; you can redistribute it and/or modify 11 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as 12 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation. 13 * published by the Free Software Foundation.
12 */ 14 */
13#ifdef CONFIG_OMAP_DEBUG_POWERDOMAIN 15#undef DEBUG
14# define DEBUG
15#endif
16 16
17#include <linux/kernel.h> 17#include <linux/kernel.h>
18#include <linux/module.h> 18#include <linux/module.h>
@@ -28,12 +28,15 @@
28 28
29#include "cm.h" 29#include "cm.h"
30#include "cm-regbits-34xx.h" 30#include "cm-regbits-34xx.h"
31#include "cm-regbits-44xx.h"
31#include "prm.h" 32#include "prm.h"
32#include "prm-regbits-34xx.h" 33#include "prm-regbits-34xx.h"
34#include "prm-regbits-44xx.h"
33 35
34#include <mach/cpu.h> 36#include <plat/cpu.h>
35#include <mach/powerdomain.h> 37#include <plat/powerdomain.h>
36#include <mach/clockdomain.h> 38#include <plat/clockdomain.h>
39#include <plat/prcm.h>
37 40
38#include "pm.h" 41#include "pm.h"
39 42
@@ -42,28 +45,42 @@ enum {
42 PWRDM_STATE_PREV, 45 PWRDM_STATE_PREV,
43}; 46};
44 47
45/* pwrdm_list contains all registered struct powerdomains */ 48/* Variable holding value of the CPU dependent PWRSTCTRL Register Offset */
46static LIST_HEAD(pwrdm_list); 49static u16 pwrstctrl_reg_offs;
47
48/*
49 * pwrdm_rwlock protects pwrdm_list add and del ops - also reused to
50 * protect pwrdm_clkdms[] during clkdm add/del ops
51 */
52static DEFINE_RWLOCK(pwrdm_rwlock);
53 50
51/* Variable holding value of the CPU dependent PWRSTST Register Offset */
52static u16 pwrstst_reg_offs;
54 53
55/* Private functions */ 54/* OMAP3 and OMAP4 specific register bit initialisations
55 * Notice that the names here are not according to each power
56 * domain but the bit mapping used applies to all of them
57 */
56 58
57static u32 prm_read_mod_bits_shift(s16 domain, s16 idx, u32 mask) 59/* OMAP3 and OMAP4 Memory Onstate Masks (common across all power domains) */
58{ 60#define OMAP_MEM0_ONSTATE_MASK OMAP3430_SHAREDL1CACHEFLATONSTATE_MASK
59 u32 v; 61#define OMAP_MEM1_ONSTATE_MASK OMAP3430_L1FLATMEMONSTATE_MASK
62#define OMAP_MEM2_ONSTATE_MASK OMAP3430_SHAREDL2CACHEFLATONSTATE_MASK
63#define OMAP_MEM3_ONSTATE_MASK OMAP3430_L2FLATMEMONSTATE_MASK
64#define OMAP_MEM4_ONSTATE_MASK OMAP4430_OCP_NRET_BANK_ONSTATE_MASK
65
66/* OMAP3 and OMAP4 Memory Retstate Masks (common across all power domains) */
67#define OMAP_MEM0_RETSTATE_MASK OMAP3430_SHAREDL1CACHEFLATRETSTATE
68#define OMAP_MEM1_RETSTATE_MASK OMAP3430_L1FLATMEMRETSTATE
69#define OMAP_MEM2_RETSTATE_MASK OMAP3430_SHAREDL2CACHEFLATRETSTATE
70#define OMAP_MEM3_RETSTATE_MASK OMAP3430_L2FLATMEMRETSTATE
71#define OMAP_MEM4_RETSTATE_MASK OMAP4430_OCP_NRET_BANK_RETSTATE_MASK
72
73/* OMAP3 and OMAP4 Memory Status bits */
74#define OMAP_MEM0_STATEST_MASK OMAP3430_SHAREDL1CACHEFLATSTATEST_MASK
75#define OMAP_MEM1_STATEST_MASK OMAP3430_L1FLATMEMSTATEST_MASK
76#define OMAP_MEM2_STATEST_MASK OMAP3430_SHAREDL2CACHEFLATSTATEST_MASK
77#define OMAP_MEM3_STATEST_MASK OMAP3430_L2FLATMEMSTATEST_MASK
78#define OMAP_MEM4_STATEST_MASK OMAP4430_OCP_NRET_BANK_STATEST_MASK
60 79
61 v = prm_read_mod_reg(domain, idx); 80/* pwrdm_list contains all registered struct powerdomains */
62 v &= mask; 81static LIST_HEAD(pwrdm_list);
63 v >>= __ffs(mask);
64 82
65 return v; 83/* Private functions */
66}
67 84
68static struct powerdomain *_pwrdm_lookup(const char *name) 85static struct powerdomain *_pwrdm_lookup(const char *name)
69{ 86{
@@ -81,32 +98,63 @@ static struct powerdomain *_pwrdm_lookup(const char *name)
81 return pwrdm; 98 return pwrdm;
82} 99}
83 100
84/* _pwrdm_deps_lookup - look up the specified powerdomain in a pwrdm list */ 101/**
85static struct powerdomain *_pwrdm_deps_lookup(struct powerdomain *pwrdm, 102 * _pwrdm_register - register a powerdomain
86 struct pwrdm_dep *deps) 103 * @pwrdm: struct powerdomain * to register
104 *
105 * Adds a powerdomain to the internal powerdomain list. Returns
106 * -EINVAL if given a null pointer, -EEXIST if a powerdomain is
107 * already registered by the provided name, or 0 upon success.
108 */
109static int _pwrdm_register(struct powerdomain *pwrdm)
87{ 110{
88 struct pwrdm_dep *pd; 111 int i;
89 112
90 if (!pwrdm || !deps || !omap_chip_is(pwrdm->omap_chip)) 113 if (!pwrdm)
91 return ERR_PTR(-EINVAL); 114 return -EINVAL;
92 115
93 for (pd = deps; pd->pwrdm_name; pd++) { 116 if (!omap_chip_is(pwrdm->omap_chip))
117 return -EINVAL;
118
119 if (_pwrdm_lookup(pwrdm->name))
120 return -EEXIST;
94 121
95 if (!omap_chip_is(pd->omap_chip)) 122 list_add(&pwrdm->node, &pwrdm_list);
96 continue;
97 123
98 if (!pd->pwrdm && pd->pwrdm_name) 124 /* Initialize the powerdomain's state counter */
99 pd->pwrdm = pwrdm_lookup(pd->pwrdm_name); 125 for (i = 0; i < PWRDM_MAX_PWRSTS; i++)
126 pwrdm->state_counter[i] = 0;
100 127
101 if (pd->pwrdm == pwrdm) 128 pwrdm->ret_logic_off_counter = 0;
102 break; 129 for (i = 0; i < pwrdm->banks; i++)
130 pwrdm->ret_mem_off_counter[i] = 0;
103 131
104 } 132 pwrdm_wait_transition(pwrdm);
133 pwrdm->state = pwrdm_read_pwrst(pwrdm);
134 pwrdm->state_counter[pwrdm->state] = 1;
105 135
106 if (!pd->pwrdm_name) 136 pr_debug("powerdomain: registered %s\n", pwrdm->name);
107 return ERR_PTR(-ENOENT);
108 137
109 return pd->pwrdm; 138 return 0;
139}
140
141static void _update_logic_membank_counters(struct powerdomain *pwrdm)
142{
143 int i;
144 u8 prev_logic_pwrst, prev_mem_pwrst;
145
146 prev_logic_pwrst = pwrdm_read_prev_logic_pwrst(pwrdm);
147 if ((pwrdm->pwrsts_logic_ret == PWRSTS_OFF_RET) &&
148 (prev_logic_pwrst == PWRDM_POWER_OFF))
149 pwrdm->ret_logic_off_counter++;
150
151 for (i = 0; i < pwrdm->banks; i++) {
152 prev_mem_pwrst = pwrdm_read_prev_mem_pwrst(pwrdm, i);
153
154 if ((pwrdm->pwrsts_mem_ret[i] == PWRSTS_OFF_RET) &&
155 (prev_mem_pwrst == PWRDM_POWER_OFF))
156 pwrdm->ret_mem_off_counter[i]++;
157 }
110} 158}
111 159
112static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag) 160static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag)
@@ -128,6 +176,8 @@ static int _pwrdm_state_switch(struct powerdomain *pwrdm, int flag)
128 prev = pwrdm_read_prev_pwrst(pwrdm); 176 prev = pwrdm_read_prev_pwrst(pwrdm);
129 if (pwrdm->state != prev) 177 if (pwrdm->state != prev)
130 pwrdm->state_counter[prev]++; 178 pwrdm->state_counter[prev]++;
179 if (prev == PWRDM_POWER_RET)
180 _update_logic_membank_counters(pwrdm);
131 break; 181 break;
132 default: 182 default:
133 return -EINVAL; 183 return -EINVAL;
@@ -156,134 +206,71 @@ static int _pwrdm_post_transition_cb(struct powerdomain *pwrdm, void *unused)
156 return 0; 206 return 0;
157} 207}
158 208
159static __init void _pwrdm_setup(struct powerdomain *pwrdm)
160{
161 int i;
162
163 for (i = 0; i < 4; i++)
164 pwrdm->state_counter[i] = 0;
165
166 pwrdm_wait_transition(pwrdm);
167 pwrdm->state = pwrdm_read_pwrst(pwrdm);
168 pwrdm->state_counter[pwrdm->state] = 1;
169
170}
171
172/* Public functions */ 209/* Public functions */
173 210
174/** 211/**
175 * pwrdm_init - set up the powerdomain layer 212 * pwrdm_init - set up the powerdomain layer
213 * @pwrdm_list: array of struct powerdomain pointers to register
176 * 214 *
177 * Loop through the list of powerdomains, registering all that are 215 * Loop through the array of powerdomains @pwrdm_list, registering all
178 * available on the current CPU. If pwrdm_list is supplied and not 216 * that are available on the current CPU. If pwrdm_list is supplied
179 * null, all of the referenced powerdomains will be registered. No 217 * and not null, all of the referenced powerdomains will be
180 * return value. 218 * registered. No return value. XXX pwrdm_list is not really a
219 * "list"; it is an array. Rename appropriately.
181 */ 220 */
182void pwrdm_init(struct powerdomain **pwrdm_list) 221void pwrdm_init(struct powerdomain **pwrdm_list)
183{ 222{
184 struct powerdomain **p = NULL; 223 struct powerdomain **p = NULL;
185 224
186 if (pwrdm_list) { 225 if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
187 for (p = pwrdm_list; *p; p++) { 226 pwrstctrl_reg_offs = OMAP2_PM_PWSTCTRL;
188 pwrdm_register(*p); 227 pwrstst_reg_offs = OMAP2_PM_PWSTST;
189 _pwrdm_setup(*p); 228 } else if (cpu_is_omap44xx()) {
190 } 229 pwrstctrl_reg_offs = OMAP4_PM_PWSTCTRL;
230 pwrstst_reg_offs = OMAP4_PM_PWSTST;
231 } else {
232 printk(KERN_ERR "Power Domain struct not supported for " \
233 "this CPU\n");
234 return;
191 } 235 }
192}
193
194/**
195 * pwrdm_register - register a powerdomain
196 * @pwrdm: struct powerdomain * to register
197 *
198 * Adds a powerdomain to the internal powerdomain list. Returns
199 * -EINVAL if given a null pointer, -EEXIST if a powerdomain is
200 * already registered by the provided name, or 0 upon success.
201 */
202int pwrdm_register(struct powerdomain *pwrdm)
203{
204 unsigned long flags;
205 int ret = -EINVAL;
206 236
207 if (!pwrdm) 237 if (pwrdm_list) {
208 return -EINVAL; 238 for (p = pwrdm_list; *p; p++)
209 239 _pwrdm_register(*p);
210 if (!omap_chip_is(pwrdm->omap_chip))
211 return -EINVAL;
212
213 write_lock_irqsave(&pwrdm_rwlock, flags);
214 if (_pwrdm_lookup(pwrdm->name)) {
215 ret = -EEXIST;
216 goto pr_unlock;
217 } 240 }
218
219 list_add(&pwrdm->node, &pwrdm_list);
220
221 pr_debug("powerdomain: registered %s\n", pwrdm->name);
222 ret = 0;
223
224pr_unlock:
225 write_unlock_irqrestore(&pwrdm_rwlock, flags);
226
227 return ret;
228}
229
230/**
231 * pwrdm_unregister - unregister a powerdomain
232 * @pwrdm: struct powerdomain * to unregister
233 *
234 * Removes a powerdomain from the internal powerdomain list. Returns
235 * -EINVAL if pwrdm argument is NULL.
236 */
237int pwrdm_unregister(struct powerdomain *pwrdm)
238{
239 unsigned long flags;
240
241 if (!pwrdm)
242 return -EINVAL;
243
244 write_lock_irqsave(&pwrdm_rwlock, flags);
245 list_del(&pwrdm->node);
246 write_unlock_irqrestore(&pwrdm_rwlock, flags);
247
248 pr_debug("powerdomain: unregistered %s\n", pwrdm->name);
249
250 return 0;
251} 241}
252 242
253/** 243/**
254 * pwrdm_lookup - look up a powerdomain by name, return a pointer 244 * pwrdm_lookup - look up a powerdomain by name, return a pointer
255 * @name: name of powerdomain 245 * @name: name of powerdomain
256 * 246 *
257 * Find a registered powerdomain by its name. Returns a pointer to the 247 * Find a registered powerdomain by its name @name. Returns a pointer
258 * struct powerdomain if found, or NULL otherwise. 248 * to the struct powerdomain if found, or NULL otherwise.
259 */ 249 */
260struct powerdomain *pwrdm_lookup(const char *name) 250struct powerdomain *pwrdm_lookup(const char *name)
261{ 251{
262 struct powerdomain *pwrdm; 252 struct powerdomain *pwrdm;
263 unsigned long flags;
264 253
265 if (!name) 254 if (!name)
266 return NULL; 255 return NULL;
267 256
268 read_lock_irqsave(&pwrdm_rwlock, flags);
269 pwrdm = _pwrdm_lookup(name); 257 pwrdm = _pwrdm_lookup(name);
270 read_unlock_irqrestore(&pwrdm_rwlock, flags);
271 258
272 return pwrdm; 259 return pwrdm;
273} 260}
274 261
275/** 262/**
276 * pwrdm_for_each_nolock - call function on each registered clockdomain 263 * pwrdm_for_each - call function on each registered clockdomain
277 * @fn: callback function * 264 * @fn: callback function *
278 * 265 *
279 * Call the supplied function for each registered powerdomain. The 266 * Call the supplied function @fn for each registered powerdomain.
280 * callback function can return anything but 0 to bail out early from 267 * The callback function @fn can return anything but 0 to bail out
281 * the iterator. Returns the last return value of the callback function, which 268 * early from the iterator. Returns the last return value of the
282 * should be 0 for success or anything else to indicate failure; or -EINVAL if 269 * callback function, which should be 0 for success or anything else
283 * the function pointer is null. 270 * to indicate failure; or -EINVAL if the function pointer is null.
284 */ 271 */
285int pwrdm_for_each_nolock(int (*fn)(struct powerdomain *pwrdm, void *user), 272int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user),
286 void *user) 273 void *user)
287{ 274{
288 struct powerdomain *temp_pwrdm; 275 struct powerdomain *temp_pwrdm;
289 int ret = 0; 276 int ret = 0;
@@ -301,40 +288,17 @@ int pwrdm_for_each_nolock(int (*fn)(struct powerdomain *pwrdm, void *user),
301} 288}
302 289
303/** 290/**
304 * pwrdm_for_each - call function on each registered clockdomain
305 * @fn: callback function *
306 *
307 * This function is the same as 'pwrdm_for_each_nolock()', but keeps the
308 * &pwrdm_rwlock locked for reading, so no powerdomain structure manipulation
309 * functions should be called from the callback, although hardware powerdomain
310 * control functions are fine.
311 */
312int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user),
313 void *user)
314{
315 unsigned long flags;
316 int ret;
317
318 read_lock_irqsave(&pwrdm_rwlock, flags);
319 ret = pwrdm_for_each_nolock(fn, user);
320 read_unlock_irqrestore(&pwrdm_rwlock, flags);
321
322 return ret;
323}
324
325/**
326 * pwrdm_add_clkdm - add a clockdomain to a powerdomain 291 * pwrdm_add_clkdm - add a clockdomain to a powerdomain
327 * @pwrdm: struct powerdomain * to add the clockdomain to 292 * @pwrdm: struct powerdomain * to add the clockdomain to
328 * @clkdm: struct clockdomain * to associate with a powerdomain 293 * @clkdm: struct clockdomain * to associate with a powerdomain
329 * 294 *
330 * Associate the clockdomain 'clkdm' with a powerdomain 'pwrdm'. This 295 * Associate the clockdomain @clkdm with a powerdomain @pwrdm. This
331 * enables the use of pwrdm_for_each_clkdm(). Returns -EINVAL if 296 * enables the use of pwrdm_for_each_clkdm(). Returns -EINVAL if
332 * presented with invalid pointers; -ENOMEM if memory could not be allocated; 297 * presented with invalid pointers; -ENOMEM if memory could not be allocated;
333 * or 0 upon success. 298 * or 0 upon success.
334 */ 299 */
335int pwrdm_add_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm) 300int pwrdm_add_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm)
336{ 301{
337 unsigned long flags;
338 int i; 302 int i;
339 int ret = -EINVAL; 303 int ret = -EINVAL;
340 304
@@ -344,8 +308,6 @@ int pwrdm_add_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm)
344 pr_debug("powerdomain: associating clockdomain %s with powerdomain " 308 pr_debug("powerdomain: associating clockdomain %s with powerdomain "
345 "%s\n", clkdm->name, pwrdm->name); 309 "%s\n", clkdm->name, pwrdm->name);
346 310
347 write_lock_irqsave(&pwrdm_rwlock, flags);
348
349 for (i = 0; i < PWRDM_MAX_CLKDMS; i++) { 311 for (i = 0; i < PWRDM_MAX_CLKDMS; i++) {
350 if (!pwrdm->pwrdm_clkdms[i]) 312 if (!pwrdm->pwrdm_clkdms[i])
351 break; 313 break;
@@ -370,8 +332,6 @@ int pwrdm_add_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm)
370 ret = 0; 332 ret = 0;
371 333
372pac_exit: 334pac_exit:
373 write_unlock_irqrestore(&pwrdm_rwlock, flags);
374
375 return ret; 335 return ret;
376} 336}
377 337
@@ -380,14 +340,13 @@ pac_exit:
380 * @pwrdm: struct powerdomain * to add the clockdomain to 340 * @pwrdm: struct powerdomain * to add the clockdomain to
381 * @clkdm: struct clockdomain * to associate with a powerdomain 341 * @clkdm: struct clockdomain * to associate with a powerdomain
382 * 342 *
383 * Dissociate the clockdomain 'clkdm' from the powerdomain 343 * Dissociate the clockdomain @clkdm from the powerdomain
384 * 'pwrdm'. Returns -EINVAL if presented with invalid pointers; 344 * @pwrdm. Returns -EINVAL if presented with invalid pointers; -ENOENT
385 * -ENOENT if the clkdm was not associated with the powerdomain, or 0 345 * if @clkdm was not associated with the powerdomain, or 0 upon
386 * upon success. 346 * success.
387 */ 347 */
388int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm) 348int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm)
389{ 349{
390 unsigned long flags;
391 int ret = -EINVAL; 350 int ret = -EINVAL;
392 int i; 351 int i;
393 352
@@ -397,8 +356,6 @@ int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm)
397 pr_debug("powerdomain: dissociating clockdomain %s from powerdomain " 356 pr_debug("powerdomain: dissociating clockdomain %s from powerdomain "
398 "%s\n", clkdm->name, pwrdm->name); 357 "%s\n", clkdm->name, pwrdm->name);
399 358
400 write_lock_irqsave(&pwrdm_rwlock, flags);
401
402 for (i = 0; i < PWRDM_MAX_CLKDMS; i++) 359 for (i = 0; i < PWRDM_MAX_CLKDMS; i++)
403 if (pwrdm->pwrdm_clkdms[i] == clkdm) 360 if (pwrdm->pwrdm_clkdms[i] == clkdm)
404 break; 361 break;
@@ -415,8 +372,6 @@ int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm)
415 ret = 0; 372 ret = 0;
416 373
417pdc_exit: 374pdc_exit:
418 write_unlock_irqrestore(&pwrdm_rwlock, flags);
419
420 return ret; 375 return ret;
421} 376}
422 377
@@ -425,259 +380,34 @@ pdc_exit:
425 * @pwrdm: struct powerdomain * to iterate over 380 * @pwrdm: struct powerdomain * to iterate over
426 * @fn: callback function * 381 * @fn: callback function *
427 * 382 *
428 * Call the supplied function for each clockdomain in the powerdomain 383 * Call the supplied function @fn for each clockdomain in the powerdomain
429 * 'pwrdm'. The callback function can return anything but 0 to bail 384 * @pwrdm. The callback function can return anything but 0 to bail
430 * out early from the iterator. The callback function is called with 385 * out early from the iterator. Returns -EINVAL if presented with
431 * the pwrdm_rwlock held for reading, so no powerdomain structure 386 * invalid pointers; or passes along the last return value of the
432 * manipulation functions should be called from the callback, although 387 * callback function, which should be 0 for success or anything else
433 * hardware powerdomain control functions are fine. Returns -EINVAL 388 * to indicate failure.
434 * if presented with invalid pointers; or passes along the last return
435 * value of the callback function, which should be 0 for success or
436 * anything else to indicate failure.
437 */ 389 */
438int pwrdm_for_each_clkdm(struct powerdomain *pwrdm, 390int pwrdm_for_each_clkdm(struct powerdomain *pwrdm,
439 int (*fn)(struct powerdomain *pwrdm, 391 int (*fn)(struct powerdomain *pwrdm,
440 struct clockdomain *clkdm)) 392 struct clockdomain *clkdm))
441{ 393{
442 unsigned long flags;
443 int ret = 0; 394 int ret = 0;
444 int i; 395 int i;
445 396
446 if (!fn) 397 if (!fn)
447 return -EINVAL; 398 return -EINVAL;
448 399
449 read_lock_irqsave(&pwrdm_rwlock, flags);
450
451 for (i = 0; i < PWRDM_MAX_CLKDMS && !ret; i++) 400 for (i = 0; i < PWRDM_MAX_CLKDMS && !ret; i++)
452 ret = (*fn)(pwrdm, pwrdm->pwrdm_clkdms[i]); 401 ret = (*fn)(pwrdm, pwrdm->pwrdm_clkdms[i]);
453 402
454 read_unlock_irqrestore(&pwrdm_rwlock, flags);
455
456 return ret; 403 return ret;
457} 404}
458 405
459
460/**
461 * pwrdm_add_wkdep - add a wakeup dependency from pwrdm2 to pwrdm1
462 * @pwrdm1: wake this struct powerdomain * up (dependent)
463 * @pwrdm2: when this struct powerdomain * wakes up (source)
464 *
465 * When the powerdomain represented by pwrdm2 wakes up (due to an
466 * interrupt), wake up pwrdm1. Implemented in hardware on the OMAP,
467 * this feature is designed to reduce wakeup latency of the dependent
468 * powerdomain. Returns -EINVAL if presented with invalid powerdomain
469 * pointers, -ENOENT if pwrdm2 cannot wake up pwrdm1 in hardware, or
470 * 0 upon success.
471 */
472int pwrdm_add_wkdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2)
473{
474 struct powerdomain *p;
475
476 if (!pwrdm1)
477 return -EINVAL;
478
479 p = _pwrdm_deps_lookup(pwrdm2, pwrdm1->wkdep_srcs);
480 if (IS_ERR(p)) {
481 pr_debug("powerdomain: hardware cannot set/clear wake up of "
482 "%s when %s wakes up\n", pwrdm1->name, pwrdm2->name);
483 return IS_ERR(p);
484 }
485
486 pr_debug("powerdomain: hardware will wake up %s when %s wakes up\n",
487 pwrdm1->name, pwrdm2->name);
488
489 prm_set_mod_reg_bits((1 << pwrdm2->dep_bit),
490 pwrdm1->prcm_offs, PM_WKDEP);
491
492 return 0;
493}
494
495/**
496 * pwrdm_del_wkdep - remove a wakeup dependency from pwrdm2 to pwrdm1
497 * @pwrdm1: wake this struct powerdomain * up (dependent)
498 * @pwrdm2: when this struct powerdomain * wakes up (source)
499 *
500 * Remove a wakeup dependency that causes pwrdm1 to wake up when pwrdm2
501 * wakes up. Returns -EINVAL if presented with invalid powerdomain
502 * pointers, -ENOENT if pwrdm2 cannot wake up pwrdm1 in hardware, or
503 * 0 upon success.
504 */
505int pwrdm_del_wkdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2)
506{
507 struct powerdomain *p;
508
509 if (!pwrdm1)
510 return -EINVAL;
511
512 p = _pwrdm_deps_lookup(pwrdm2, pwrdm1->wkdep_srcs);
513 if (IS_ERR(p)) {
514 pr_debug("powerdomain: hardware cannot set/clear wake up of "
515 "%s when %s wakes up\n", pwrdm1->name, pwrdm2->name);
516 return IS_ERR(p);
517 }
518
519 pr_debug("powerdomain: hardware will no longer wake up %s after %s "
520 "wakes up\n", pwrdm1->name, pwrdm2->name);
521
522 prm_clear_mod_reg_bits((1 << pwrdm2->dep_bit),
523 pwrdm1->prcm_offs, PM_WKDEP);
524
525 return 0;
526}
527
528/**
529 * pwrdm_read_wkdep - read wakeup dependency state from pwrdm2 to pwrdm1
530 * @pwrdm1: wake this struct powerdomain * up (dependent)
531 * @pwrdm2: when this struct powerdomain * wakes up (source)
532 *
533 * Return 1 if a hardware wakeup dependency exists wherein pwrdm1 will be
534 * awoken when pwrdm2 wakes up; 0 if dependency is not set; -EINVAL
535 * if either powerdomain pointer is invalid; or -ENOENT if the hardware
536 * is incapable.
537 *
538 * REVISIT: Currently this function only represents software-controllable
539 * wakeup dependencies. Wakeup dependencies fixed in hardware are not
540 * yet handled here.
541 */
542int pwrdm_read_wkdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2)
543{
544 struct powerdomain *p;
545
546 if (!pwrdm1)
547 return -EINVAL;
548
549 p = _pwrdm_deps_lookup(pwrdm2, pwrdm1->wkdep_srcs);
550 if (IS_ERR(p)) {
551 pr_debug("powerdomain: hardware cannot set/clear wake up of "
552 "%s when %s wakes up\n", pwrdm1->name, pwrdm2->name);
553 return IS_ERR(p);
554 }
555
556 return prm_read_mod_bits_shift(pwrdm1->prcm_offs, PM_WKDEP,
557 (1 << pwrdm2->dep_bit));
558}
559
560/**
561 * pwrdm_add_sleepdep - add a sleep dependency from pwrdm2 to pwrdm1
562 * @pwrdm1: prevent this struct powerdomain * from sleeping (dependent)
563 * @pwrdm2: when this struct powerdomain * is active (source)
564 *
565 * Prevent pwrdm1 from automatically going inactive (and then to
566 * retention or off) if pwrdm2 is still active. Returns -EINVAL if
567 * presented with invalid powerdomain pointers or called on a machine
568 * that does not support software-configurable hardware sleep dependencies,
569 * -ENOENT if the specified dependency cannot be set in hardware, or
570 * 0 upon success.
571 */
572int pwrdm_add_sleepdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2)
573{
574 struct powerdomain *p;
575
576 if (!pwrdm1)
577 return -EINVAL;
578
579 if (!cpu_is_omap34xx())
580 return -EINVAL;
581
582 p = _pwrdm_deps_lookup(pwrdm2, pwrdm1->sleepdep_srcs);
583 if (IS_ERR(p)) {
584 pr_debug("powerdomain: hardware cannot set/clear sleep "
585 "dependency affecting %s from %s\n", pwrdm1->name,
586 pwrdm2->name);
587 return IS_ERR(p);
588 }
589
590 pr_debug("powerdomain: will prevent %s from sleeping if %s is active\n",
591 pwrdm1->name, pwrdm2->name);
592
593 cm_set_mod_reg_bits((1 << pwrdm2->dep_bit),
594 pwrdm1->prcm_offs, OMAP3430_CM_SLEEPDEP);
595
596 return 0;
597}
598
599/**
600 * pwrdm_del_sleepdep - remove a sleep dependency from pwrdm2 to pwrdm1
601 * @pwrdm1: prevent this struct powerdomain * from sleeping (dependent)
602 * @pwrdm2: when this struct powerdomain * is active (source)
603 *
604 * Allow pwrdm1 to automatically go inactive (and then to retention or
605 * off), independent of the activity state of pwrdm2. Returns -EINVAL
606 * if presented with invalid powerdomain pointers or called on a machine
607 * that does not support software-configurable hardware sleep dependencies,
608 * -ENOENT if the specified dependency cannot be cleared in hardware, or
609 * 0 upon success.
610 */
611int pwrdm_del_sleepdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2)
612{
613 struct powerdomain *p;
614
615 if (!pwrdm1)
616 return -EINVAL;
617
618 if (!cpu_is_omap34xx())
619 return -EINVAL;
620
621 p = _pwrdm_deps_lookup(pwrdm2, pwrdm1->sleepdep_srcs);
622 if (IS_ERR(p)) {
623 pr_debug("powerdomain: hardware cannot set/clear sleep "
624 "dependency affecting %s from %s\n", pwrdm1->name,
625 pwrdm2->name);
626 return IS_ERR(p);
627 }
628
629 pr_debug("powerdomain: will no longer prevent %s from sleeping if "
630 "%s is active\n", pwrdm1->name, pwrdm2->name);
631
632 cm_clear_mod_reg_bits((1 << pwrdm2->dep_bit),
633 pwrdm1->prcm_offs, OMAP3430_CM_SLEEPDEP);
634
635 return 0;
636}
637
638/**
639 * pwrdm_read_sleepdep - read sleep dependency state from pwrdm2 to pwrdm1
640 * @pwrdm1: prevent this struct powerdomain * from sleeping (dependent)
641 * @pwrdm2: when this struct powerdomain * is active (source)
642 *
643 * Return 1 if a hardware sleep dependency exists wherein pwrdm1 will
644 * not be allowed to automatically go inactive if pwrdm2 is active;
645 * 0 if pwrdm1's automatic power state inactivity transition is independent
646 * of pwrdm2's; -EINVAL if either powerdomain pointer is invalid or called
647 * on a machine that does not support software-configurable hardware sleep
648 * dependencies; or -ENOENT if the hardware is incapable.
649 *
650 * REVISIT: Currently this function only represents software-controllable
651 * sleep dependencies. Sleep dependencies fixed in hardware are not
652 * yet handled here.
653 */
654int pwrdm_read_sleepdep(struct powerdomain *pwrdm1, struct powerdomain *pwrdm2)
655{
656 struct powerdomain *p;
657
658 if (!pwrdm1)
659 return -EINVAL;
660
661 if (!cpu_is_omap34xx())
662 return -EINVAL;
663
664 p = _pwrdm_deps_lookup(pwrdm2, pwrdm1->sleepdep_srcs);
665 if (IS_ERR(p)) {
666 pr_debug("powerdomain: hardware cannot set/clear sleep "
667 "dependency affecting %s from %s\n", pwrdm1->name,
668 pwrdm2->name);
669 return IS_ERR(p);
670 }
671
672 return prm_read_mod_bits_shift(pwrdm1->prcm_offs, OMAP3430_CM_SLEEPDEP,
673 (1 << pwrdm2->dep_bit));
674}
675
676/** 406/**
677 * pwrdm_get_mem_bank_count - get number of memory banks in this powerdomain 407 * pwrdm_get_mem_bank_count - get number of memory banks in this powerdomain
678 * @pwrdm: struct powerdomain * 408 * @pwrdm: struct powerdomain *
679 * 409 *
680 * Return the number of controllable memory banks in powerdomain pwrdm, 410 * Return the number of controllable memory banks in powerdomain @pwrdm,
681 * starting with 1. Returns -EINVAL if the powerdomain pointer is null. 411 * starting with 1. Returns -EINVAL if the powerdomain pointer is null.
682 */ 412 */
683int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm) 413int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm)
@@ -693,7 +423,7 @@ int pwrdm_get_mem_bank_count(struct powerdomain *pwrdm)
693 * @pwrdm: struct powerdomain * to set 423 * @pwrdm: struct powerdomain * to set
694 * @pwrst: one of the PWRDM_POWER_* macros 424 * @pwrst: one of the PWRDM_POWER_* macros
695 * 425 *
696 * Set the powerdomain pwrdm's next power state to pwrst. The powerdomain 426 * Set the powerdomain @pwrdm's next power state to @pwrst. The powerdomain
697 * may not enter this state immediately if the preconditions for this state 427 * may not enter this state immediately if the preconditions for this state
698 * have not been satisfied. Returns -EINVAL if the powerdomain pointer is 428 * have not been satisfied. Returns -EINVAL if the powerdomain pointer is
699 * null or if the power state is invalid for the powerdomin, or returns 0 429 * null or if the power state is invalid for the powerdomin, or returns 0
@@ -712,7 +442,7 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
712 442
713 prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK, 443 prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
714 (pwrst << OMAP_POWERSTATE_SHIFT), 444 (pwrst << OMAP_POWERSTATE_SHIFT),
715 pwrdm->prcm_offs, PM_PWSTCTRL); 445 pwrdm->prcm_offs, pwrstctrl_reg_offs);
716 446
717 return 0; 447 return 0;
718} 448}
@@ -721,7 +451,7 @@ int pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
721 * pwrdm_read_next_pwrst - get next powerdomain power state 451 * pwrdm_read_next_pwrst - get next powerdomain power state
722 * @pwrdm: struct powerdomain * to get power state 452 * @pwrdm: struct powerdomain * to get power state
723 * 453 *
724 * Return the powerdomain pwrdm's next power state. Returns -EINVAL 454 * Return the powerdomain @pwrdm's next power state. Returns -EINVAL
725 * if the powerdomain pointer is null or returns the next power state 455 * if the powerdomain pointer is null or returns the next power state
726 * upon success. 456 * upon success.
727 */ 457 */
@@ -730,15 +460,15 @@ int pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
730 if (!pwrdm) 460 if (!pwrdm)
731 return -EINVAL; 461 return -EINVAL;
732 462
733 return prm_read_mod_bits_shift(pwrdm->prcm_offs, PM_PWSTCTRL, 463 return prm_read_mod_bits_shift(pwrdm->prcm_offs,
734 OMAP_POWERSTATE_MASK); 464 pwrstctrl_reg_offs, OMAP_POWERSTATE_MASK);
735} 465}
736 466
737/** 467/**
738 * pwrdm_read_pwrst - get current powerdomain power state 468 * pwrdm_read_pwrst - get current powerdomain power state
739 * @pwrdm: struct powerdomain * to get power state 469 * @pwrdm: struct powerdomain * to get power state
740 * 470 *
741 * Return the powerdomain pwrdm's current power state. Returns -EINVAL 471 * Return the powerdomain @pwrdm's current power state. Returns -EINVAL
742 * if the powerdomain pointer is null or returns the current power state 472 * if the powerdomain pointer is null or returns the current power state
743 * upon success. 473 * upon success.
744 */ 474 */
@@ -747,15 +477,15 @@ int pwrdm_read_pwrst(struct powerdomain *pwrdm)
747 if (!pwrdm) 477 if (!pwrdm)
748 return -EINVAL; 478 return -EINVAL;
749 479
750 return prm_read_mod_bits_shift(pwrdm->prcm_offs, PM_PWSTST, 480 return prm_read_mod_bits_shift(pwrdm->prcm_offs,
751 OMAP_POWERSTATEST_MASK); 481 pwrstst_reg_offs, OMAP_POWERSTATEST_MASK);
752} 482}
753 483
754/** 484/**
755 * pwrdm_read_prev_pwrst - get previous powerdomain power state 485 * pwrdm_read_prev_pwrst - get previous powerdomain power state
756 * @pwrdm: struct powerdomain * to get previous power state 486 * @pwrdm: struct powerdomain * to get previous power state
757 * 487 *
758 * Return the powerdomain pwrdm's previous power state. Returns -EINVAL 488 * Return the powerdomain @pwrdm's previous power state. Returns -EINVAL
759 * if the powerdomain pointer is null or returns the previous power state 489 * if the powerdomain pointer is null or returns the previous power state
760 * upon success. 490 * upon success.
761 */ 491 */
@@ -773,11 +503,11 @@ int pwrdm_read_prev_pwrst(struct powerdomain *pwrdm)
773 * @pwrdm: struct powerdomain * to set 503 * @pwrdm: struct powerdomain * to set
774 * @pwrst: one of the PWRDM_POWER_* macros 504 * @pwrst: one of the PWRDM_POWER_* macros
775 * 505 *
776 * Set the next power state that the logic portion of the powerdomain 506 * Set the next power state @pwrst that the logic portion of the
777 * pwrdm will enter when the powerdomain enters retention. This will 507 * powerdomain @pwrdm will enter when the powerdomain enters retention.
778 * be either RETENTION or OFF, if supported. Returns -EINVAL if the 508 * This will be either RETENTION or OFF, if supported. Returns
779 * powerdomain pointer is null or the target power state is not not 509 * -EINVAL if the powerdomain pointer is null or the target power
780 * supported, or returns 0 upon success. 510 * state is not not supported, or returns 0 upon success.
781 */ 511 */
782int pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst) 512int pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
783{ 513{
@@ -798,7 +528,7 @@ int pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
798 */ 528 */
799 prm_rmw_mod_reg_bits(OMAP3430_LOGICL1CACHERETSTATE, 529 prm_rmw_mod_reg_bits(OMAP3430_LOGICL1CACHERETSTATE,
800 (pwrst << __ffs(OMAP3430_LOGICL1CACHERETSTATE)), 530 (pwrst << __ffs(OMAP3430_LOGICL1CACHERETSTATE)),
801 pwrdm->prcm_offs, PM_PWSTCTRL); 531 pwrdm->prcm_offs, pwrstctrl_reg_offs);
802 532
803 return 0; 533 return 0;
804} 534}
@@ -809,13 +539,14 @@ int pwrdm_set_logic_retst(struct powerdomain *pwrdm, u8 pwrst)
809 * @bank: memory bank number to set (0-3) 539 * @bank: memory bank number to set (0-3)
810 * @pwrst: one of the PWRDM_POWER_* macros 540 * @pwrst: one of the PWRDM_POWER_* macros
811 * 541 *
812 * Set the next power state that memory bank x of the powerdomain 542 * Set the next power state @pwrst that memory bank @bank of the
813 * pwrdm will enter when the powerdomain enters the ON state. Bank 543 * powerdomain @pwrdm will enter when the powerdomain enters the ON
814 * will be a number from 0 to 3, and represents different types of 544 * state. @bank will be a number from 0 to 3, and represents different
815 * memory, depending on the powerdomain. Returns -EINVAL if the 545 * types of memory, depending on the powerdomain. Returns -EINVAL if
816 * powerdomain pointer is null or the target power state is not not 546 * the powerdomain pointer is null or the target power state is not
817 * supported for this memory bank, -EEXIST if the target memory bank 547 * not supported for this memory bank, -EEXIST if the target memory
818 * does not exist or is not controllable, or returns 0 upon success. 548 * bank does not exist or is not controllable, or returns 0 upon
549 * success.
819 */ 550 */
820int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst) 551int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
821{ 552{
@@ -841,16 +572,19 @@ int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
841 */ 572 */
842 switch (bank) { 573 switch (bank) {
843 case 0: 574 case 0:
844 m = OMAP3430_SHAREDL1CACHEFLATONSTATE_MASK; 575 m = OMAP_MEM0_ONSTATE_MASK;
845 break; 576 break;
846 case 1: 577 case 1:
847 m = OMAP3430_L1FLATMEMONSTATE_MASK; 578 m = OMAP_MEM1_ONSTATE_MASK;
848 break; 579 break;
849 case 2: 580 case 2:
850 m = OMAP3430_SHAREDL2CACHEFLATONSTATE_MASK; 581 m = OMAP_MEM2_ONSTATE_MASK;
851 break; 582 break;
852 case 3: 583 case 3:
853 m = OMAP3430_L2FLATMEMONSTATE_MASK; 584 m = OMAP_MEM3_ONSTATE_MASK;
585 break;
586 case 4:
587 m = OMAP_MEM4_ONSTATE_MASK;
854 break; 588 break;
855 default: 589 default:
856 WARN_ON(1); /* should never happen */ 590 WARN_ON(1); /* should never happen */
@@ -858,7 +592,7 @@ int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
858 } 592 }
859 593
860 prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)), 594 prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)),
861 pwrdm->prcm_offs, PM_PWSTCTRL); 595 pwrdm->prcm_offs, pwrstctrl_reg_offs);
862 596
863 return 0; 597 return 0;
864} 598}
@@ -869,14 +603,15 @@ int pwrdm_set_mem_onst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
869 * @bank: memory bank number to set (0-3) 603 * @bank: memory bank number to set (0-3)
870 * @pwrst: one of the PWRDM_POWER_* macros 604 * @pwrst: one of the PWRDM_POWER_* macros
871 * 605 *
872 * Set the next power state that memory bank x of the powerdomain 606 * Set the next power state @pwrst that memory bank @bank of the
873 * pwrdm will enter when the powerdomain enters the RETENTION state. 607 * powerdomain @pwrdm will enter when the powerdomain enters the
874 * Bank will be a number from 0 to 3, and represents different types 608 * RETENTION state. Bank will be a number from 0 to 3, and represents
875 * of memory, depending on the powerdomain. pwrst will be either 609 * different types of memory, depending on the powerdomain. @pwrst
876 * RETENTION or OFF, if supported. Returns -EINVAL if the powerdomain 610 * will be either RETENTION or OFF, if supported. Returns -EINVAL if
877 * pointer is null or the target power state is not not supported for 611 * the powerdomain pointer is null or the target power state is not
878 * this memory bank, -EEXIST if the target memory bank does not exist 612 * not supported for this memory bank, -EEXIST if the target memory
879 * or is not controllable, or returns 0 upon success. 613 * bank does not exist or is not controllable, or returns 0 upon
614 * success.
880 */ 615 */
881int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst) 616int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
882{ 617{
@@ -902,16 +637,19 @@ int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
902 */ 637 */
903 switch (bank) { 638 switch (bank) {
904 case 0: 639 case 0:
905 m = OMAP3430_SHAREDL1CACHEFLATRETSTATE; 640 m = OMAP_MEM0_RETSTATE_MASK;
906 break; 641 break;
907 case 1: 642 case 1:
908 m = OMAP3430_L1FLATMEMRETSTATE; 643 m = OMAP_MEM1_RETSTATE_MASK;
909 break; 644 break;
910 case 2: 645 case 2:
911 m = OMAP3430_SHAREDL2CACHEFLATRETSTATE; 646 m = OMAP_MEM2_RETSTATE_MASK;
912 break; 647 break;
913 case 3: 648 case 3:
914 m = OMAP3430_L2FLATMEMRETSTATE; 649 m = OMAP_MEM3_RETSTATE_MASK;
650 break;
651 case 4:
652 m = OMAP_MEM4_RETSTATE_MASK;
915 break; 653 break;
916 default: 654 default:
917 WARN_ON(1); /* should never happen */ 655 WARN_ON(1); /* should never happen */
@@ -919,7 +657,7 @@ int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
919 } 657 }
920 658
921 prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)), pwrdm->prcm_offs, 659 prm_rmw_mod_reg_bits(m, (pwrst << __ffs(m)), pwrdm->prcm_offs,
922 PM_PWSTCTRL); 660 pwrstctrl_reg_offs);
923 661
924 return 0; 662 return 0;
925} 663}
@@ -928,27 +666,27 @@ int pwrdm_set_mem_retst(struct powerdomain *pwrdm, u8 bank, u8 pwrst)
928 * pwrdm_read_logic_pwrst - get current powerdomain logic retention power state 666 * pwrdm_read_logic_pwrst - get current powerdomain logic retention power state
929 * @pwrdm: struct powerdomain * to get current logic retention power state 667 * @pwrdm: struct powerdomain * to get current logic retention power state
930 * 668 *
931 * Return the current power state that the logic portion of 669 * Return the power state that the logic portion of powerdomain @pwrdm
932 * powerdomain pwrdm will enter 670 * will enter when the powerdomain enters retention. Returns -EINVAL
933 * Returns -EINVAL if the powerdomain pointer is null or returns the 671 * if the powerdomain pointer is null or returns the logic retention
934 * current logic retention power state upon success. 672 * power state upon success.
935 */ 673 */
936int pwrdm_read_logic_pwrst(struct powerdomain *pwrdm) 674int pwrdm_read_logic_pwrst(struct powerdomain *pwrdm)
937{ 675{
938 if (!pwrdm) 676 if (!pwrdm)
939 return -EINVAL; 677 return -EINVAL;
940 678
941 return prm_read_mod_bits_shift(pwrdm->prcm_offs, PM_PWSTST, 679 return prm_read_mod_bits_shift(pwrdm->prcm_offs,
942 OMAP3430_LOGICSTATEST); 680 pwrstst_reg_offs, OMAP3430_LOGICSTATEST);
943} 681}
944 682
945/** 683/**
946 * pwrdm_read_prev_logic_pwrst - get previous powerdomain logic power state 684 * pwrdm_read_prev_logic_pwrst - get previous powerdomain logic power state
947 * @pwrdm: struct powerdomain * to get previous logic power state 685 * @pwrdm: struct powerdomain * to get previous logic power state
948 * 686 *
949 * Return the powerdomain pwrdm's logic power state. Returns -EINVAL 687 * Return the powerdomain @pwrdm's previous logic power state. Returns
950 * if the powerdomain pointer is null or returns the previous logic 688 * -EINVAL if the powerdomain pointer is null or returns the previous
951 * power state upon success. 689 * logic power state upon success.
952 */ 690 */
953int pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm) 691int pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm)
954{ 692{
@@ -966,12 +704,35 @@ int pwrdm_read_prev_logic_pwrst(struct powerdomain *pwrdm)
966} 704}
967 705
968/** 706/**
707 * pwrdm_read_logic_retst - get next powerdomain logic power state
708 * @pwrdm: struct powerdomain * to get next logic power state
709 *
710 * Return the powerdomain pwrdm's logic power state. Returns -EINVAL
711 * if the powerdomain pointer is null or returns the next logic
712 * power state upon success.
713 */
714int pwrdm_read_logic_retst(struct powerdomain *pwrdm)
715{
716 if (!pwrdm)
717 return -EINVAL;
718
719 /*
720 * The register bit names below may not correspond to the
721 * actual names of the bits in each powerdomain's register,
722 * but the type of value returned is the same for each
723 * powerdomain.
724 */
725 return prm_read_mod_bits_shift(pwrdm->prcm_offs, pwrstctrl_reg_offs,
726 OMAP3430_LOGICSTATEST);
727}
728
729/**
969 * pwrdm_read_mem_pwrst - get current memory bank power state 730 * pwrdm_read_mem_pwrst - get current memory bank power state
970 * @pwrdm: struct powerdomain * to get current memory bank power state 731 * @pwrdm: struct powerdomain * to get current memory bank power state
971 * @bank: memory bank number (0-3) 732 * @bank: memory bank number (0-3)
972 * 733 *
973 * Return the powerdomain pwrdm's current memory power state for bank 734 * Return the powerdomain @pwrdm's current memory power state for bank
974 * x. Returns -EINVAL if the powerdomain pointer is null, -EEXIST if 735 * @bank. Returns -EINVAL if the powerdomain pointer is null, -EEXIST if
975 * the target memory bank does not exist or is not controllable, or 736 * the target memory bank does not exist or is not controllable, or
976 * returns the current memory power state upon success. 737 * returns the current memory power state upon success.
977 */ 738 */
@@ -985,6 +746,9 @@ int pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
985 if (pwrdm->banks < (bank + 1)) 746 if (pwrdm->banks < (bank + 1))
986 return -EEXIST; 747 return -EEXIST;
987 748
749 if (pwrdm->flags & PWRDM_HAS_MPU_QUIRK)
750 bank = 1;
751
988 /* 752 /*
989 * The register bit names below may not correspond to the 753 * The register bit names below may not correspond to the
990 * actual names of the bits in each powerdomain's register, 754 * actual names of the bits in each powerdomain's register,
@@ -993,23 +757,27 @@ int pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
993 */ 757 */
994 switch (bank) { 758 switch (bank) {
995 case 0: 759 case 0:
996 m = OMAP3430_SHAREDL1CACHEFLATSTATEST_MASK; 760 m = OMAP_MEM0_STATEST_MASK;
997 break; 761 break;
998 case 1: 762 case 1:
999 m = OMAP3430_L1FLATMEMSTATEST_MASK; 763 m = OMAP_MEM1_STATEST_MASK;
1000 break; 764 break;
1001 case 2: 765 case 2:
1002 m = OMAP3430_SHAREDL2CACHEFLATSTATEST_MASK; 766 m = OMAP_MEM2_STATEST_MASK;
1003 break; 767 break;
1004 case 3: 768 case 3:
1005 m = OMAP3430_L2FLATMEMSTATEST_MASK; 769 m = OMAP_MEM3_STATEST_MASK;
770 break;
771 case 4:
772 m = OMAP_MEM4_STATEST_MASK;
1006 break; 773 break;
1007 default: 774 default:
1008 WARN_ON(1); /* should never happen */ 775 WARN_ON(1); /* should never happen */
1009 return -EEXIST; 776 return -EEXIST;
1010 } 777 }
1011 778
1012 return prm_read_mod_bits_shift(pwrdm->prcm_offs, PM_PWSTST, m); 779 return prm_read_mod_bits_shift(pwrdm->prcm_offs,
780 pwrstst_reg_offs, m);
1013} 781}
1014 782
1015/** 783/**
@@ -1017,10 +785,11 @@ int pwrdm_read_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
1017 * @pwrdm: struct powerdomain * to get previous memory bank power state 785 * @pwrdm: struct powerdomain * to get previous memory bank power state
1018 * @bank: memory bank number (0-3) 786 * @bank: memory bank number (0-3)
1019 * 787 *
1020 * Return the powerdomain pwrdm's previous memory power state for bank 788 * Return the powerdomain @pwrdm's previous memory power state for
1021 * x. Returns -EINVAL if the powerdomain pointer is null, -EEXIST if 789 * bank @bank. Returns -EINVAL if the powerdomain pointer is null,
1022 * the target memory bank does not exist or is not controllable, or 790 * -EEXIST if the target memory bank does not exist or is not
1023 * returns the previous memory power state upon success. 791 * controllable, or returns the previous memory power state upon
792 * success.
1024 */ 793 */
1025int pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank) 794int pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
1026{ 795{
@@ -1032,6 +801,9 @@ int pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
1032 if (pwrdm->banks < (bank + 1)) 801 if (pwrdm->banks < (bank + 1))
1033 return -EEXIST; 802 return -EEXIST;
1034 803
804 if (pwrdm->flags & PWRDM_HAS_MPU_QUIRK)
805 bank = 1;
806
1035 /* 807 /*
1036 * The register bit names below may not correspond to the 808 * The register bit names below may not correspond to the
1037 * actual names of the bits in each powerdomain's register, 809 * actual names of the bits in each powerdomain's register,
@@ -1061,13 +833,63 @@ int pwrdm_read_prev_mem_pwrst(struct powerdomain *pwrdm, u8 bank)
1061} 833}
1062 834
1063/** 835/**
836 * pwrdm_read_mem_retst - get next memory bank power state
837 * @pwrdm: struct powerdomain * to get mext memory bank power state
838 * @bank: memory bank number (0-3)
839 *
840 * Return the powerdomain pwrdm's next memory power state for bank
841 * x. Returns -EINVAL if the powerdomain pointer is null, -EEXIST if
842 * the target memory bank does not exist or is not controllable, or
843 * returns the next memory power state upon success.
844 */
845int pwrdm_read_mem_retst(struct powerdomain *pwrdm, u8 bank)
846{
847 u32 m;
848
849 if (!pwrdm)
850 return -EINVAL;
851
852 if (pwrdm->banks < (bank + 1))
853 return -EEXIST;
854
855 /*
856 * The register bit names below may not correspond to the
857 * actual names of the bits in each powerdomain's register,
858 * but the type of value returned is the same for each
859 * powerdomain.
860 */
861 switch (bank) {
862 case 0:
863 m = OMAP_MEM0_RETSTATE_MASK;
864 break;
865 case 1:
866 m = OMAP_MEM1_RETSTATE_MASK;
867 break;
868 case 2:
869 m = OMAP_MEM2_RETSTATE_MASK;
870 break;
871 case 3:
872 m = OMAP_MEM3_RETSTATE_MASK;
873 break;
874 case 4:
875 m = OMAP_MEM4_RETSTATE_MASK;
876 default:
877 WARN_ON(1); /* should never happen */
878 return -EEXIST;
879 }
880
881 return prm_read_mod_bits_shift(pwrdm->prcm_offs,
882 pwrstctrl_reg_offs, m);
883}
884
885/**
1064 * pwrdm_clear_all_prev_pwrst - clear previous powerstate register for a pwrdm 886 * pwrdm_clear_all_prev_pwrst - clear previous powerstate register for a pwrdm
1065 * @pwrdm: struct powerdomain * to clear 887 * @pwrdm: struct powerdomain * to clear
1066 * 888 *
1067 * Clear the powerdomain's previous power state register. Clears the 889 * Clear the powerdomain's previous power state register @pwrdm.
1068 * entire register, including logic and memory bank previous power states. 890 * Clears the entire register, including logic and memory bank
1069 * Returns -EINVAL if the powerdomain pointer is null, or returns 0 upon 891 * previous power states. Returns -EINVAL if the powerdomain pointer
1070 * success. 892 * is null, or returns 0 upon success.
1071 */ 893 */
1072int pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm) 894int pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm)
1073{ 895{
@@ -1092,11 +914,11 @@ int pwrdm_clear_all_prev_pwrst(struct powerdomain *pwrdm)
1092 * @pwrdm: struct powerdomain * 914 * @pwrdm: struct powerdomain *
1093 * 915 *
1094 * Enable automatic context save-and-restore upon power state change 916 * Enable automatic context save-and-restore upon power state change
1095 * for some devices in a powerdomain. Warning: this only affects a 917 * for some devices in the powerdomain @pwrdm. Warning: this only
1096 * subset of devices in a powerdomain; check the TRM closely. Returns 918 * affects a subset of devices in a powerdomain; check the TRM
1097 * -EINVAL if the powerdomain pointer is null or if the powerdomain 919 * closely. Returns -EINVAL if the powerdomain pointer is null or if
1098 * does not support automatic save-and-restore, or returns 0 upon 920 * the powerdomain does not support automatic save-and-restore, or
1099 * success. 921 * returns 0 upon success.
1100 */ 922 */
1101int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm) 923int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm)
1102{ 924{
@@ -1110,7 +932,7 @@ int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm)
1110 pwrdm->name); 932 pwrdm->name);
1111 933
1112 prm_rmw_mod_reg_bits(0, 1 << OMAP3430ES2_SAVEANDRESTORE_SHIFT, 934 prm_rmw_mod_reg_bits(0, 1 << OMAP3430ES2_SAVEANDRESTORE_SHIFT,
1113 pwrdm->prcm_offs, PM_PWSTCTRL); 935 pwrdm->prcm_offs, pwrstctrl_reg_offs);
1114 936
1115 return 0; 937 return 0;
1116} 938}
@@ -1120,11 +942,11 @@ int pwrdm_enable_hdwr_sar(struct powerdomain *pwrdm)
1120 * @pwrdm: struct powerdomain * 942 * @pwrdm: struct powerdomain *
1121 * 943 *
1122 * Disable automatic context save-and-restore upon power state change 944 * Disable automatic context save-and-restore upon power state change
1123 * for some devices in a powerdomain. Warning: this only affects a 945 * for some devices in the powerdomain @pwrdm. Warning: this only
1124 * subset of devices in a powerdomain; check the TRM closely. Returns 946 * affects a subset of devices in a powerdomain; check the TRM
1125 * -EINVAL if the powerdomain pointer is null or if the powerdomain 947 * closely. Returns -EINVAL if the powerdomain pointer is null or if
1126 * does not support automatic save-and-restore, or returns 0 upon 948 * the powerdomain does not support automatic save-and-restore, or
1127 * success. 949 * returns 0 upon success.
1128 */ 950 */
1129int pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm) 951int pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm)
1130{ 952{
@@ -1138,7 +960,7 @@ int pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm)
1138 pwrdm->name); 960 pwrdm->name);
1139 961
1140 prm_rmw_mod_reg_bits(1 << OMAP3430ES2_SAVEANDRESTORE_SHIFT, 0, 962 prm_rmw_mod_reg_bits(1 << OMAP3430ES2_SAVEANDRESTORE_SHIFT, 0,
1141 pwrdm->prcm_offs, PM_PWSTCTRL); 963 pwrdm->prcm_offs, pwrstctrl_reg_offs);
1142 964
1143 return 0; 965 return 0;
1144} 966}
@@ -1147,7 +969,7 @@ int pwrdm_disable_hdwr_sar(struct powerdomain *pwrdm)
1147 * pwrdm_has_hdwr_sar - test whether powerdomain supports hardware SAR 969 * pwrdm_has_hdwr_sar - test whether powerdomain supports hardware SAR
1148 * @pwrdm: struct powerdomain * 970 * @pwrdm: struct powerdomain *
1149 * 971 *
1150 * Returns 1 if powerdomain 'pwrdm' supports hardware save-and-restore 972 * Returns 1 if powerdomain @pwrdm supports hardware save-and-restore
1151 * for some devices, or 0 if it does not. 973 * for some devices, or 0 if it does not.
1152 */ 974 */
1153bool pwrdm_has_hdwr_sar(struct powerdomain *pwrdm) 975bool pwrdm_has_hdwr_sar(struct powerdomain *pwrdm)
@@ -1159,7 +981,7 @@ bool pwrdm_has_hdwr_sar(struct powerdomain *pwrdm)
1159 * pwrdm_wait_transition - wait for powerdomain power transition to finish 981 * pwrdm_wait_transition - wait for powerdomain power transition to finish
1160 * @pwrdm: struct powerdomain * to wait for 982 * @pwrdm: struct powerdomain * to wait for
1161 * 983 *
1162 * If the powerdomain pwrdm is in the process of a state transition, 984 * If the powerdomain @pwrdm is in the process of a state transition,
1163 * spin until it completes the power transition, or until an iteration 985 * spin until it completes the power transition, or until an iteration
1164 * bailout value is reached. Returns -EINVAL if the powerdomain 986 * bailout value is reached. Returns -EINVAL if the powerdomain
1165 * pointer is null, -EAGAIN if the bailout value was reached, or 987 * pointer is null, -EAGAIN if the bailout value was reached, or
@@ -1179,10 +1001,10 @@ int pwrdm_wait_transition(struct powerdomain *pwrdm)
1179 */ 1001 */
1180 1002
1181 /* XXX Is this udelay() value meaningful? */ 1003 /* XXX Is this udelay() value meaningful? */
1182 while ((prm_read_mod_reg(pwrdm->prcm_offs, PM_PWSTST) & 1004 while ((prm_read_mod_reg(pwrdm->prcm_offs, pwrstst_reg_offs) &
1183 OMAP_INTRANSITION) && 1005 OMAP_INTRANSITION) &&
1184 (c++ < PWRDM_TRANSITION_BAILOUT)) 1006 (c++ < PWRDM_TRANSITION_BAILOUT))
1185 udelay(1); 1007 udelay(1);
1186 1008
1187 if (c > PWRDM_TRANSITION_BAILOUT) { 1009 if (c > PWRDM_TRANSITION_BAILOUT) {
1188 printk(KERN_ERR "powerdomain: waited too long for " 1010 printk(KERN_ERR "powerdomain: waited too long for "
@@ -1209,12 +1031,6 @@ int pwrdm_clkdm_state_switch(struct clockdomain *clkdm)
1209 1031
1210 return -EINVAL; 1032 return -EINVAL;
1211} 1033}
1212int pwrdm_clk_state_switch(struct clk *clk)
1213{
1214 if (clk != NULL && clk->clkdm != NULL)
1215 return pwrdm_clkdm_state_switch(clk->clkdm);
1216 return -EINVAL;
1217}
1218 1034
1219int pwrdm_pre_transition(void) 1035int pwrdm_pre_transition(void)
1220{ 1036{
diff --git a/arch/arm/mach-omap2/powerdomains.h b/arch/arm/mach-omap2/powerdomains.h
index 691470ea4c6a..105cbcaefd3b 100644
--- a/arch/arm/mach-omap2/powerdomains.h
+++ b/arch/arm/mach-omap2/powerdomains.h
@@ -1,8 +1,8 @@
1/* 1/*
2 * OMAP2/3 common powerdomain definitions 2 * OMAP2/3 common powerdomain definitions
3 * 3 *
4 * Copyright (C) 2007-8 Texas Instruments, Inc. 4 * Copyright (C) 2007-2008 Texas Instruments, Inc.
5 * Copyright (C) 2007-8 Nokia Corporation 5 * Copyright (C) 2007-2009 Nokia Corporation
6 * 6 *
7 * Written by Paul Walmsley 7 * Written by Paul Walmsley
8 * Debugging and integration fixes by Jouni Högander 8 * Debugging and integration fixes by Jouni Högander
@@ -12,26 +12,21 @@
12 * published by the Free Software Foundation. 12 * published by the Free Software Foundation.
13 */ 13 */
14 14
15/*
16 * To Do List
17 * -> Move the Sleep/Wakeup dependencies from Power Domain framework to
18 * Clock Domain Framework
19 */
20
15#ifndef ARCH_ARM_MACH_OMAP2_POWERDOMAINS 21#ifndef ARCH_ARM_MACH_OMAP2_POWERDOMAINS
16#define ARCH_ARM_MACH_OMAP2_POWERDOMAINS 22#define ARCH_ARM_MACH_OMAP2_POWERDOMAINS
17 23
18/* 24/*
19 * This file contains all of the powerdomains that have some element 25 * This file contains all of the powerdomains that have some element
20 * of software control for the OMAP24xx and OMAP34XX chips. 26 * of software control for the OMAP24xx and OMAP34xx chips.
21 *
22 * A few notes:
23 * 27 *
24 * This is not an exhaustive listing of powerdomains on the chips; only 28 * This is not an exhaustive listing of powerdomains on the chips; only
25 * powerdomains that can be controlled in software. 29 * powerdomains that can be controlled in software.
26 *
27 * A useful validation rule for struct powerdomain:
28 * Any powerdomain referenced by a wkdep_srcs or sleepdep_srcs array
29 * must have a dep_bit assigned. So wkdep_srcs/sleepdep_srcs are really
30 * just software-controllable dependencies. Non-software-controllable
31 * dependencies do exist, but they are not encoded below (yet).
32 *
33 * 24xx does not support programmable sleep dependencies (SLEEPDEP)
34 *
35 */ 30 */
36 31
37/* 32/*
@@ -41,96 +36,41 @@
41 * 36 *
42 * On the 2420, this is a 'C55 DSP called, simply, the DSP. Its 37 * On the 2420, this is a 'C55 DSP called, simply, the DSP. Its
43 * powerdomain is called the "DSP power domain." On the 2430, the 38 * powerdomain is called the "DSP power domain." On the 2430, the
44 * on-board DSP is a 'C64 DSP, now called the IVA2 or IVA2.1. Its 39 * on-board DSP is a 'C64 DSP, now called (along with its hardware
45 * powerdomain is still called the "DSP power domain." On the 3430, 40 * accelerators) the IVA2 or IVA2.1. Its powerdomain is still called
46 * the DSP is a 'C64 DSP like the 2430, also known as the IVA2; but 41 * the "DSP power domain." On the 3430, the DSP is a 'C64 DSP like the
47 * its powerdomain is now called the "IVA2 power domain." 42 * 2430, also known as the IVA2; but its powerdomain is now called the
43 * "IVA2 power domain."
48 * 44 *
49 * The 2420 also has something called the IVA, which is a separate ARM 45 * The 2420 also has something called the IVA, which is a separate ARM
50 * core, and has nothing to do with the DSP/IVA2. 46 * core, and has nothing to do with the DSP/IVA2.
51 * 47 *
52 * Ideally the DSP/IVA2 could just be the same powerdomain, but the PRCM 48 * Ideally the DSP/IVA2 could just be the same powerdomain, but the PRCM
53 * address offset is different between the C55 and C64 DSPs. 49 * address offset is different between the C55 and C64 DSPs.
54 *
55 * The overly-specific dep_bit names are due to a bit name collision
56 * with CM_FCLKEN_{DSP,IVA2}. The DSP/IVA2 PM_WKDEP and CM_SLEEPDEP shift
57 * value are the same for all powerdomains: 2
58 */ 50 */
59 51
60/* 52#include <plat/powerdomain.h>
61 * XXX should dep_bit be a mask, so we can test to see if it is 0 as a
62 * sanity check?
63 * XXX encode hardware fixed wakeup dependencies -- esp. for 3430 CORE
64 */
65
66#include <mach/powerdomain.h>
67 53
68#include "prcm-common.h" 54#include "prcm-common.h"
69#include "prm.h" 55#include "prm.h"
70#include "cm.h" 56#include "cm.h"
71
72/* OMAP2/3-common powerdomains and wakeup dependencies */
73
74/*
75 * 2420/2430 PM_WKDEP_GFX: CORE, MPU, WKUP
76 * 3430ES1 PM_WKDEP_GFX: adds IVA2, removes CORE
77 * 3430ES2 PM_WKDEP_SGX: adds IVA2, removes CORE
78 */
79static struct pwrdm_dep gfx_sgx_wkdeps[] = {
80 {
81 .pwrdm_name = "core_pwrdm",
82 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
83 },
84 {
85 .pwrdm_name = "iva2_pwrdm",
86 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
87 },
88 {
89 .pwrdm_name = "mpu_pwrdm",
90 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX |
91 CHIP_IS_OMAP3430)
92 },
93 {
94 .pwrdm_name = "wkup_pwrdm",
95 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX |
96 CHIP_IS_OMAP3430)
97 },
98 { NULL },
99};
100
101/*
102 * 3430: CM_SLEEPDEP_CAM: MPU
103 * 3430ES1: CM_SLEEPDEP_GFX: MPU
104 * 3430ES2: CM_SLEEPDEP_SGX: MPU
105 */
106static struct pwrdm_dep cam_gfx_sleepdeps[] = {
107 {
108 .pwrdm_name = "mpu_pwrdm",
109 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
110 },
111 { NULL },
112};
113
114
115#include "powerdomains24xx.h" 57#include "powerdomains24xx.h"
116#include "powerdomains34xx.h" 58#include "powerdomains34xx.h"
59#include "powerdomains44xx.h"
117 60
61/* OMAP2/3-common powerdomains */
118 62
119/* 63#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
120 * OMAP2/3 common powerdomains
121 */
122 64
123/* 65/*
124 * The GFX powerdomain is not present on 3430ES2, but currently we do not 66 * The GFX powerdomain is not present on 3430ES2, but currently we do not
125 * have a macro to filter it out at compile-time. 67 * have a macro to filter it out at compile-time.
126 */ 68 */
127static struct powerdomain gfx_pwrdm = { 69static struct powerdomain gfx_omap2_pwrdm = {
128 .name = "gfx_pwrdm", 70 .name = "gfx_pwrdm",
129 .prcm_offs = GFX_MOD, 71 .prcm_offs = GFX_MOD,
130 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | 72 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX |
131 CHIP_IS_OMAP3430ES1), 73 CHIP_IS_OMAP3430ES1),
132 .wkdep_srcs = gfx_sgx_wkdeps,
133 .sleepdep_srcs = cam_gfx_sleepdeps,
134 .pwrsts = PWRSTS_OFF_RET_ON, 74 .pwrsts = PWRSTS_OFF_RET_ON,
135 .pwrsts_logic_ret = PWRDM_POWER_RET, 75 .pwrsts_logic_ret = PWRDM_POWER_RET,
136 .banks = 1, 76 .banks = 1,
@@ -142,22 +82,24 @@ static struct powerdomain gfx_pwrdm = {
142 }, 82 },
143}; 83};
144 84
145static struct powerdomain wkup_pwrdm = { 85static struct powerdomain wkup_omap2_pwrdm = {
146 .name = "wkup_pwrdm", 86 .name = "wkup_pwrdm",
147 .prcm_offs = WKUP_MOD, 87 .prcm_offs = WKUP_MOD,
148 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430), 88 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX | CHIP_IS_OMAP3430),
149 .dep_bit = OMAP_EN_WKUP_SHIFT,
150}; 89};
151 90
91#endif
152 92
153 93
154/* As powerdomains are added or removed above, this list must also be changed */ 94/* As powerdomains are added or removed above, this list must also be changed */
155static struct powerdomain *powerdomains_omap[] __initdata = { 95static struct powerdomain *powerdomains_omap[] __initdata = {
156 96
157 &gfx_pwrdm, 97#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
158 &wkup_pwrdm, 98 &wkup_omap2_pwrdm,
99 &gfx_omap2_pwrdm,
100#endif
159 101
160#ifdef CONFIG_ARCH_OMAP24XX 102#ifdef CONFIG_ARCH_OMAP2
161 &dsp_pwrdm, 103 &dsp_pwrdm,
162 &mpu_24xx_pwrdm, 104 &mpu_24xx_pwrdm,
163 &core_24xx_pwrdm, 105 &core_24xx_pwrdm,
@@ -167,12 +109,12 @@ static struct powerdomain *powerdomains_omap[] __initdata = {
167 &mdm_pwrdm, 109 &mdm_pwrdm,
168#endif 110#endif
169 111
170#ifdef CONFIG_ARCH_OMAP34XX 112#ifdef CONFIG_ARCH_OMAP3
171 &iva2_pwrdm, 113 &iva2_pwrdm,
172 &mpu_34xx_pwrdm, 114 &mpu_3xxx_pwrdm,
173 &neon_pwrdm, 115 &neon_pwrdm,
174 &core_34xx_pre_es3_1_pwrdm, 116 &core_3xxx_pre_es3_1_pwrdm,
175 &core_34xx_es3_1_pwrdm, 117 &core_3xxx_es3_1_pwrdm,
176 &cam_pwrdm, 118 &cam_pwrdm,
177 &dss_pwrdm, 119 &dss_pwrdm,
178 &per_pwrdm, 120 &per_pwrdm,
@@ -186,6 +128,24 @@ static struct powerdomain *powerdomains_omap[] __initdata = {
186 &dpll5_pwrdm, 128 &dpll5_pwrdm,
187#endif 129#endif
188 130
131#ifdef CONFIG_ARCH_OMAP4
132 &core_44xx_pwrdm,
133 &gfx_44xx_pwrdm,
134 &abe_44xx_pwrdm,
135 &dss_44xx_pwrdm,
136 &tesla_44xx_pwrdm,
137 &wkup_44xx_pwrdm,
138 &cpu0_44xx_pwrdm,
139 &cpu1_44xx_pwrdm,
140 &emu_44xx_pwrdm,
141 &mpu_44xx_pwrdm,
142 &ivahd_44xx_pwrdm,
143 &cam_44xx_pwrdm,
144 &l3init_44xx_pwrdm,
145 &l4per_44xx_pwrdm,
146 &always_on_core_44xx_pwrdm,
147 &cefuse_44xx_pwrdm,
148#endif
189 NULL 149 NULL
190}; 150};
191 151
diff --git a/arch/arm/mach-omap2/powerdomains24xx.h b/arch/arm/mach-omap2/powerdomains24xx.h
index 9f08dc3f7fd2..775093add9b6 100644
--- a/arch/arm/mach-omap2/powerdomains24xx.h
+++ b/arch/arm/mach-omap2/powerdomains24xx.h
@@ -2,7 +2,7 @@
2 * OMAP24XX powerdomain definitions 2 * OMAP24XX powerdomain definitions
3 * 3 *
4 * Copyright (C) 2007-2008 Texas Instruments, Inc. 4 * Copyright (C) 2007-2008 Texas Instruments, Inc.
5 * Copyright (C) 2007-2008 Nokia Corporation 5 * Copyright (C) 2007-2009 Nokia Corporation
6 * 6 *
7 * Written by Paul Walmsley 7 * Written by Paul Walmsley
8 * Debugging and integration fixes by Jouni Högander 8 * Debugging and integration fixes by Jouni Högander
@@ -20,7 +20,7 @@
20 * the array in mach-omap2/powerdomains.h. 20 * the array in mach-omap2/powerdomains.h.
21 */ 21 */
22 22
23#include <mach/powerdomain.h> 23#include <plat/powerdomain.h>
24 24
25#include "prcm-common.h" 25#include "prcm-common.h"
26#include "prm.h" 26#include "prm.h"
@@ -30,83 +30,7 @@
30 30
31/* 24XX powerdomains and dependencies */ 31/* 24XX powerdomains and dependencies */
32 32
33#ifdef CONFIG_ARCH_OMAP24XX 33#ifdef CONFIG_ARCH_OMAP2
34
35
36/* Wakeup dependency source arrays */
37
38/*
39 * 2420/2430 PM_WKDEP_DSP: CORE, MPU, WKUP
40 * 2430 PM_WKDEP_MDM: same as above
41 */
42static struct pwrdm_dep dsp_mdm_24xx_wkdeps[] = {
43 {
44 .pwrdm_name = "core_pwrdm",
45 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
46 },
47 {
48 .pwrdm_name = "mpu_pwrdm",
49 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
50 },
51 {
52 .pwrdm_name = "wkup_pwrdm",
53 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
54 },
55 { NULL },
56};
57
58/*
59 * 2420 PM_WKDEP_MPU: CORE, DSP, WKUP
60 * 2430 adds MDM
61 */
62static struct pwrdm_dep mpu_24xx_wkdeps[] = {
63 {
64 .pwrdm_name = "core_pwrdm",
65 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
66 },
67 {
68 .pwrdm_name = "dsp_pwrdm",
69 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
70 },
71 {
72 .pwrdm_name = "wkup_pwrdm",
73 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
74 },
75 {
76 .pwrdm_name = "mdm_pwrdm",
77 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
78 },
79 { NULL },
80};
81
82/*
83 * 2420 PM_WKDEP_CORE: DSP, GFX, MPU, WKUP
84 * 2430 adds MDM
85 */
86static struct pwrdm_dep core_24xx_wkdeps[] = {
87 {
88 .pwrdm_name = "dsp_pwrdm",
89 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
90 },
91 {
92 .pwrdm_name = "gfx_pwrdm",
93 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
94 },
95 {
96 .pwrdm_name = "mpu_pwrdm",
97 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
98 },
99 {
100 .pwrdm_name = "wkup_pwrdm",
101 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX)
102 },
103 {
104 .pwrdm_name = "mdm_pwrdm",
105 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
106 },
107 { NULL },
108};
109
110 34
111/* Powerdomains */ 35/* Powerdomains */
112 36
@@ -114,8 +38,6 @@ static struct powerdomain dsp_pwrdm = {
114 .name = "dsp_pwrdm", 38 .name = "dsp_pwrdm",
115 .prcm_offs = OMAP24XX_DSP_MOD, 39 .prcm_offs = OMAP24XX_DSP_MOD,
116 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX), 40 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX),
117 .dep_bit = OMAP24XX_PM_WKDEP_MPU_EN_DSP_SHIFT,
118 .wkdep_srcs = dsp_mdm_24xx_wkdeps,
119 .pwrsts = PWRSTS_OFF_RET_ON, 41 .pwrsts = PWRSTS_OFF_RET_ON,
120 .pwrsts_logic_ret = PWRDM_POWER_RET, 42 .pwrsts_logic_ret = PWRDM_POWER_RET,
121 .banks = 1, 43 .banks = 1,
@@ -131,8 +53,6 @@ static struct powerdomain mpu_24xx_pwrdm = {
131 .name = "mpu_pwrdm", 53 .name = "mpu_pwrdm",
132 .prcm_offs = MPU_MOD, 54 .prcm_offs = MPU_MOD,
133 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX), 55 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX),
134 .dep_bit = OMAP24XX_EN_MPU_SHIFT,
135 .wkdep_srcs = mpu_24xx_wkdeps,
136 .pwrsts = PWRSTS_OFF_RET_ON, 56 .pwrsts = PWRSTS_OFF_RET_ON,
137 .pwrsts_logic_ret = PWRSTS_OFF_RET, 57 .pwrsts_logic_ret = PWRSTS_OFF_RET,
138 .banks = 1, 58 .banks = 1,
@@ -148,9 +68,7 @@ static struct powerdomain core_24xx_pwrdm = {
148 .name = "core_pwrdm", 68 .name = "core_pwrdm",
149 .prcm_offs = CORE_MOD, 69 .prcm_offs = CORE_MOD,
150 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX), 70 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP24XX),
151 .wkdep_srcs = core_24xx_wkdeps,
152 .pwrsts = PWRSTS_OFF_RET_ON, 71 .pwrsts = PWRSTS_OFF_RET_ON,
153 .dep_bit = OMAP24XX_EN_CORE_SHIFT,
154 .banks = 3, 72 .banks = 3,
155 .pwrsts_mem_ret = { 73 .pwrsts_mem_ret = {
156 [0] = PWRSTS_OFF_RET, /* MEM1RETSTATE */ 74 [0] = PWRSTS_OFF_RET, /* MEM1RETSTATE */
@@ -164,7 +82,7 @@ static struct powerdomain core_24xx_pwrdm = {
164 }, 82 },
165}; 83};
166 84
167#endif /* CONFIG_ARCH_OMAP24XX */ 85#endif /* CONFIG_ARCH_OMAP2 */
168 86
169 87
170 88
@@ -176,13 +94,10 @@ static struct powerdomain core_24xx_pwrdm = {
176 94
177/* XXX 2430 KILLDOMAINWKUP bit? No current users apparently */ 95/* XXX 2430 KILLDOMAINWKUP bit? No current users apparently */
178 96
179/* Another case of bit name collisions between several registers: EN_MDM */
180static struct powerdomain mdm_pwrdm = { 97static struct powerdomain mdm_pwrdm = {
181 .name = "mdm_pwrdm", 98 .name = "mdm_pwrdm",
182 .prcm_offs = OMAP2430_MDM_MOD, 99 .prcm_offs = OMAP2430_MDM_MOD,
183 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430), 100 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
184 .dep_bit = OMAP2430_PM_WKDEP_MPU_EN_MDM_SHIFT,
185 .wkdep_srcs = dsp_mdm_24xx_wkdeps,
186 .pwrsts = PWRSTS_OFF_RET_ON, 101 .pwrsts = PWRSTS_OFF_RET_ON,
187 .pwrsts_logic_ret = PWRDM_POWER_RET, 102 .pwrsts_logic_ret = PWRDM_POWER_RET,
188 .banks = 1, 103 .banks = 1,
diff --git a/arch/arm/mach-omap2/powerdomains34xx.h b/arch/arm/mach-omap2/powerdomains34xx.h
index 4dcf94b800ab..bd87112beea8 100644
--- a/arch/arm/mach-omap2/powerdomains34xx.h
+++ b/arch/arm/mach-omap2/powerdomains34xx.h
@@ -1,8 +1,8 @@
1/* 1/*
2 * OMAP34XX powerdomain definitions 2 * OMAP3 powerdomain definitions
3 * 3 *
4 * Copyright (C) 2007-2008 Texas Instruments, Inc. 4 * Copyright (C) 2007-2008 Texas Instruments, Inc.
5 * Copyright (C) 2007-2008 Nokia Corporation 5 * Copyright (C) 2007-2010 Nokia Corporation
6 * 6 *
7 * Written by Paul Walmsley 7 * Written by Paul Walmsley
8 * Debugging and integration fixes by Jouni Högander 8 * Debugging and integration fixes by Jouni Högander
@@ -20,7 +20,7 @@
20 * the array in mach-omap2/powerdomains.h. 20 * the array in mach-omap2/powerdomains.h.
21 */ 21 */
22 22
23#include <mach/powerdomain.h> 23#include <plat/powerdomain.h>
24 24
25#include "prcm-common.h" 25#include "prcm-common.h"
26#include "prm.h" 26#include "prm.h"
@@ -32,128 +32,7 @@
32 * 34XX-specific powerdomains, dependencies 32 * 34XX-specific powerdomains, dependencies
33 */ 33 */
34 34
35#ifdef CONFIG_ARCH_OMAP34XX 35#ifdef CONFIG_ARCH_OMAP3
36
37/*
38 * 3430: PM_WKDEP_{PER,USBHOST}: CORE, IVA2, MPU, WKUP
39 * (USBHOST is ES2 only)
40 */
41static struct pwrdm_dep per_usbhost_wkdeps[] = {
42 {
43 .pwrdm_name = "core_pwrdm",
44 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
45 },
46 {
47 .pwrdm_name = "iva2_pwrdm",
48 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
49 },
50 {
51 .pwrdm_name = "mpu_pwrdm",
52 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
53 },
54 {
55 .pwrdm_name = "wkup_pwrdm",
56 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
57 },
58 { NULL },
59};
60
61/*
62 * 3430 PM_WKDEP_MPU: CORE, IVA2, DSS, PER
63 */
64static struct pwrdm_dep mpu_34xx_wkdeps[] = {
65 {
66 .pwrdm_name = "core_pwrdm",
67 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
68 },
69 {
70 .pwrdm_name = "iva2_pwrdm",
71 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
72 },
73 {
74 .pwrdm_name = "dss_pwrdm",
75 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
76 },
77 {
78 .pwrdm_name = "per_pwrdm",
79 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
80 },
81 { NULL },
82};
83
84/*
85 * 3430 PM_WKDEP_IVA2: CORE, MPU, WKUP, DSS, PER
86 */
87static struct pwrdm_dep iva2_wkdeps[] = {
88 {
89 .pwrdm_name = "core_pwrdm",
90 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
91 },
92 {
93 .pwrdm_name = "mpu_pwrdm",
94 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
95 },
96 {
97 .pwrdm_name = "wkup_pwrdm",
98 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
99 },
100 {
101 .pwrdm_name = "dss_pwrdm",
102 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
103 },
104 {
105 .pwrdm_name = "per_pwrdm",
106 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
107 },
108 { NULL },
109};
110
111
112/* 3430 PM_WKDEP_{CAM,DSS}: IVA2, MPU, WKUP */
113static struct pwrdm_dep cam_dss_wkdeps[] = {
114 {
115 .pwrdm_name = "iva2_pwrdm",
116 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
117 },
118 {
119 .pwrdm_name = "mpu_pwrdm",
120 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
121 },
122 {
123 .pwrdm_name = "wkup_pwrdm",
124 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
125 },
126 { NULL },
127};
128
129/* 3430: PM_WKDEP_NEON: MPU */
130static struct pwrdm_dep neon_wkdeps[] = {
131 {
132 .pwrdm_name = "mpu_pwrdm",
133 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
134 },
135 { NULL },
136};
137
138
139/* Sleep dependency source arrays for 34xx-specific pwrdms - 34XX only */
140
141/*
142 * 3430: CM_SLEEPDEP_{DSS,PER}: MPU, IVA
143 * 3430ES2: CM_SLEEPDEP_USBHOST: MPU, IVA
144 */
145static struct pwrdm_dep dss_per_usbhost_sleepdeps[] = {
146 {
147 .pwrdm_name = "mpu_pwrdm",
148 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
149 },
150 {
151 .pwrdm_name = "iva2_pwrdm",
152 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
153 },
154 { NULL },
155};
156
157 36
158/* 37/*
159 * Powerdomains 38 * Powerdomains
@@ -163,8 +42,6 @@ static struct powerdomain iva2_pwrdm = {
163 .name = "iva2_pwrdm", 42 .name = "iva2_pwrdm",
164 .prcm_offs = OMAP3430_IVA2_MOD, 43 .prcm_offs = OMAP3430_IVA2_MOD,
165 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), 44 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
166 .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_IVA2_SHIFT,
167 .wkdep_srcs = iva2_wkdeps,
168 .pwrsts = PWRSTS_OFF_RET_ON, 45 .pwrsts = PWRSTS_OFF_RET_ON,
169 .pwrsts_logic_ret = PWRSTS_OFF_RET, 46 .pwrsts_logic_ret = PWRSTS_OFF_RET,
170 .banks = 4, 47 .banks = 4,
@@ -182,14 +59,13 @@ static struct powerdomain iva2_pwrdm = {
182 }, 59 },
183}; 60};
184 61
185static struct powerdomain mpu_34xx_pwrdm = { 62static struct powerdomain mpu_3xxx_pwrdm = {
186 .name = "mpu_pwrdm", 63 .name = "mpu_pwrdm",
187 .prcm_offs = MPU_MOD, 64 .prcm_offs = MPU_MOD,
188 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), 65 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
189 .dep_bit = OMAP3430_EN_MPU_SHIFT,
190 .wkdep_srcs = mpu_34xx_wkdeps,
191 .pwrsts = PWRSTS_OFF_RET_ON, 66 .pwrsts = PWRSTS_OFF_RET_ON,
192 .pwrsts_logic_ret = PWRSTS_OFF_RET, 67 .pwrsts_logic_ret = PWRSTS_OFF_RET,
68 .flags = PWRDM_HAS_MPU_QUIRK,
193 .banks = 1, 69 .banks = 1,
194 .pwrsts_mem_ret = { 70 .pwrsts_mem_ret = {
195 [0] = PWRSTS_OFF_RET, 71 [0] = PWRSTS_OFF_RET,
@@ -199,15 +75,14 @@ static struct powerdomain mpu_34xx_pwrdm = {
199 }, 75 },
200}; 76};
201 77
202/* No wkdeps or sleepdeps for 34xx core apparently */ 78static struct powerdomain core_3xxx_pre_es3_1_pwrdm = {
203static struct powerdomain core_34xx_pre_es3_1_pwrdm = {
204 .name = "core_pwrdm", 79 .name = "core_pwrdm",
205 .prcm_offs = CORE_MOD, 80 .prcm_offs = CORE_MOD,
206 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES1 | 81 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430ES1 |
207 CHIP_IS_OMAP3430ES2 | 82 CHIP_IS_OMAP3430ES2 |
208 CHIP_IS_OMAP3430ES3_0), 83 CHIP_IS_OMAP3430ES3_0),
209 .pwrsts = PWRSTS_OFF_RET_ON, 84 .pwrsts = PWRSTS_OFF_RET_ON,
210 .dep_bit = OMAP3430_EN_CORE_SHIFT, 85 .pwrsts_logic_ret = PWRSTS_OFF_RET,
211 .banks = 2, 86 .banks = 2,
212 .pwrsts_mem_ret = { 87 .pwrsts_mem_ret = {
213 [0] = PWRSTS_OFF_RET, /* MEM1RETSTATE */ 88 [0] = PWRSTS_OFF_RET, /* MEM1RETSTATE */
@@ -219,13 +94,12 @@ static struct powerdomain core_34xx_pre_es3_1_pwrdm = {
219 }, 94 },
220}; 95};
221 96
222/* No wkdeps or sleepdeps for 34xx core apparently */ 97static struct powerdomain core_3xxx_es3_1_pwrdm = {
223static struct powerdomain core_34xx_es3_1_pwrdm = {
224 .name = "core_pwrdm", 98 .name = "core_pwrdm",
225 .prcm_offs = CORE_MOD, 99 .prcm_offs = CORE_MOD,
226 .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES3_1), 100 .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES3_1),
227 .pwrsts = PWRSTS_OFF_RET_ON, 101 .pwrsts = PWRSTS_OFF_RET_ON,
228 .dep_bit = OMAP3430_EN_CORE_SHIFT, 102 .pwrsts_logic_ret = PWRSTS_OFF_RET,
229 .flags = PWRDM_HAS_HDWR_SAR, /* for USBTLL only */ 103 .flags = PWRDM_HAS_HDWR_SAR, /* for USBTLL only */
230 .banks = 2, 104 .banks = 2,
231 .pwrsts_mem_ret = { 105 .pwrsts_mem_ret = {
@@ -238,14 +112,10 @@ static struct powerdomain core_34xx_es3_1_pwrdm = {
238 }, 112 },
239}; 113};
240 114
241/* Another case of bit name collisions between several registers: EN_DSS */
242static struct powerdomain dss_pwrdm = { 115static struct powerdomain dss_pwrdm = {
243 .name = "dss_pwrdm", 116 .name = "dss_pwrdm",
244 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), 117 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
245 .prcm_offs = OMAP3430_DSS_MOD, 118 .prcm_offs = OMAP3430_DSS_MOD,
246 .dep_bit = OMAP3430_PM_WKDEP_MPU_EN_DSS_SHIFT,
247 .wkdep_srcs = cam_dss_wkdeps,
248 .sleepdep_srcs = dss_per_usbhost_sleepdeps,
249 .pwrsts = PWRSTS_OFF_RET_ON, 119 .pwrsts = PWRSTS_OFF_RET_ON,
250 .pwrsts_logic_ret = PWRDM_POWER_RET, 120 .pwrsts_logic_ret = PWRDM_POWER_RET,
251 .banks = 1, 121 .banks = 1,
@@ -266,8 +136,6 @@ static struct powerdomain sgx_pwrdm = {
266 .name = "sgx_pwrdm", 136 .name = "sgx_pwrdm",
267 .prcm_offs = OMAP3430ES2_SGX_MOD, 137 .prcm_offs = OMAP3430ES2_SGX_MOD,
268 .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2), 138 .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
269 .wkdep_srcs = gfx_sgx_wkdeps,
270 .sleepdep_srcs = cam_gfx_sleepdeps,
271 /* XXX This is accurate for 3430 SGX, but what about GFX? */ 139 /* XXX This is accurate for 3430 SGX, but what about GFX? */
272 .pwrsts = PWRSTS_OFF_ON, 140 .pwrsts = PWRSTS_OFF_ON,
273 .pwrsts_logic_ret = PWRDM_POWER_RET, 141 .pwrsts_logic_ret = PWRDM_POWER_RET,
@@ -284,8 +152,6 @@ static struct powerdomain cam_pwrdm = {
284 .name = "cam_pwrdm", 152 .name = "cam_pwrdm",
285 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), 153 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
286 .prcm_offs = OMAP3430_CAM_MOD, 154 .prcm_offs = OMAP3430_CAM_MOD,
287 .wkdep_srcs = cam_dss_wkdeps,
288 .sleepdep_srcs = cam_gfx_sleepdeps,
289 .pwrsts = PWRSTS_OFF_RET_ON, 155 .pwrsts = PWRSTS_OFF_RET_ON,
290 .pwrsts_logic_ret = PWRDM_POWER_RET, 156 .pwrsts_logic_ret = PWRDM_POWER_RET,
291 .banks = 1, 157 .banks = 1,
@@ -301,9 +167,6 @@ static struct powerdomain per_pwrdm = {
301 .name = "per_pwrdm", 167 .name = "per_pwrdm",
302 .prcm_offs = OMAP3430_PER_MOD, 168 .prcm_offs = OMAP3430_PER_MOD,
303 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), 169 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
304 .dep_bit = OMAP3430_EN_PER_SHIFT,
305 .wkdep_srcs = per_usbhost_wkdeps,
306 .sleepdep_srcs = dss_per_usbhost_sleepdeps,
307 .pwrsts = PWRSTS_OFF_RET_ON, 170 .pwrsts = PWRSTS_OFF_RET_ON,
308 .pwrsts_logic_ret = PWRSTS_OFF_RET, 171 .pwrsts_logic_ret = PWRSTS_OFF_RET,
309 .banks = 1, 172 .banks = 1,
@@ -325,7 +188,6 @@ static struct powerdomain neon_pwrdm = {
325 .name = "neon_pwrdm", 188 .name = "neon_pwrdm",
326 .prcm_offs = OMAP3430_NEON_MOD, 189 .prcm_offs = OMAP3430_NEON_MOD,
327 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430), 190 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
328 .wkdep_srcs = neon_wkdeps,
329 .pwrsts = PWRSTS_OFF_RET_ON, 191 .pwrsts = PWRSTS_OFF_RET_ON,
330 .pwrsts_logic_ret = PWRDM_POWER_RET, 192 .pwrsts_logic_ret = PWRDM_POWER_RET,
331}; 193};
@@ -334,11 +196,15 @@ static struct powerdomain usbhost_pwrdm = {
334 .name = "usbhost_pwrdm", 196 .name = "usbhost_pwrdm",
335 .prcm_offs = OMAP3430ES2_USBHOST_MOD, 197 .prcm_offs = OMAP3430ES2_USBHOST_MOD,
336 .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2), 198 .omap_chip = OMAP_CHIP_INIT(CHIP_GE_OMAP3430ES2),
337 .wkdep_srcs = per_usbhost_wkdeps,
338 .sleepdep_srcs = dss_per_usbhost_sleepdeps,
339 .pwrsts = PWRSTS_OFF_RET_ON, 199 .pwrsts = PWRSTS_OFF_RET_ON,
340 .pwrsts_logic_ret = PWRDM_POWER_RET, 200 .pwrsts_logic_ret = PWRDM_POWER_RET,
341 .flags = PWRDM_HAS_HDWR_SAR, /* for USBHOST ctrlr only */ 201 /*
202 * REVISIT: Enabling usb host save and restore mechanism seems to
203 * leave the usb host domain permanently in ACTIVE mode after
204 * changing the usb host power domain state from OFF to active once.
205 * Disabling for now.
206 */
207 /*.flags = PWRDM_HAS_HDWR_SAR,*/ /* for USBHOST ctrlr only */
342 .banks = 1, 208 .banks = 1,
343 .pwrsts_mem_ret = { 209 .pwrsts_mem_ret = {
344 [0] = PWRDM_POWER_RET, /* MEMRETSTATE */ 210 [0] = PWRDM_POWER_RET, /* MEMRETSTATE */
@@ -379,7 +245,7 @@ static struct powerdomain dpll5_pwrdm = {
379}; 245};
380 246
381 247
382#endif /* CONFIG_ARCH_OMAP34XX */ 248#endif /* CONFIG_ARCH_OMAP3 */
383 249
384 250
385#endif 251#endif
diff --git a/arch/arm/mach-omap2/powerdomains44xx.h b/arch/arm/mach-omap2/powerdomains44xx.h
new file mode 100644
index 000000000000..c1015147d579
--- /dev/null
+++ b/arch/arm/mach-omap2/powerdomains44xx.h
@@ -0,0 +1,310 @@
1/*
2 * OMAP4 Power domains framework
3 *
4 * Copyright (C) 2009 Texas Instruments, Inc.
5 * Copyright (C) 2009 Nokia Corporation
6 *
7 * Abhijit Pagare (abhijitpagare@ti.com)
8 * Benoit Cousson (b-cousson@ti.com)
9 * Paul Walmsley
10 *
11 * This file is automatically generated from the OMAP hardware databases.
12 * We respectfully ask that any modifications to this file be coordinated
13 * with the public linux-omap@vger.kernel.org mailing list and the
14 * authors above to ensure that the autogeneration scripts are kept
15 * up-to-date with the file contents.
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License version 2 as
19 * published by the Free Software Foundation.
20 */
21
22#ifndef __ARCH_ARM_MACH_OMAP2_POWERDOMAINS44XX_H
23#define __ARCH_ARM_MACH_OMAP2_POWERDOMAINS44XX_H
24
25#include <plat/powerdomain.h>
26
27#include "prcm-common.h"
28#include "cm.h"
29#include "cm-regbits-44xx.h"
30#include "prm.h"
31#include "prm-regbits-44xx.h"
32
33#if defined(CONFIG_ARCH_OMAP4)
34
35/* core_44xx_pwrdm: CORE power domain */
36static struct powerdomain core_44xx_pwrdm = {
37 .name = "core_pwrdm",
38 .prcm_offs = OMAP4430_PRM_CORE_MOD,
39 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
40 .pwrsts = PWRSTS_RET_ON,
41 .pwrsts_logic_ret = PWRSTS_OFF_RET,
42 .banks = 5,
43 .pwrsts_mem_ret = {
44 [0] = PWRDM_POWER_OFF, /* core_nret_bank */
45 [1] = PWRSTS_OFF_RET, /* core_ocmram */
46 [2] = PWRDM_POWER_RET, /* core_other_bank */
47 [3] = PWRSTS_OFF_RET, /* ducati_l2ram */
48 [4] = PWRSTS_OFF_RET, /* ducati_unicache */
49 },
50 .pwrsts_mem_on = {
51 [0] = PWRDM_POWER_ON, /* core_nret_bank */
52 [1] = PWRSTS_OFF_RET, /* core_ocmram */
53 [2] = PWRDM_POWER_ON, /* core_other_bank */
54 [3] = PWRDM_POWER_ON, /* ducati_l2ram */
55 [4] = PWRDM_POWER_ON, /* ducati_unicache */
56 },
57};
58
59/* gfx_44xx_pwrdm: 3D accelerator power domain */
60static struct powerdomain gfx_44xx_pwrdm = {
61 .name = "gfx_pwrdm",
62 .prcm_offs = OMAP4430_PRM_GFX_MOD,
63 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
64 .pwrsts = PWRSTS_OFF_ON,
65 .banks = 1,
66 .pwrsts_mem_ret = {
67 [0] = PWRDM_POWER_OFF, /* gfx_mem */
68 },
69 .pwrsts_mem_on = {
70 [0] = PWRDM_POWER_ON, /* gfx_mem */
71 },
72};
73
74/* abe_44xx_pwrdm: Audio back end power domain */
75static struct powerdomain abe_44xx_pwrdm = {
76 .name = "abe_pwrdm",
77 .prcm_offs = OMAP4430_PRM_ABE_MOD,
78 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
79 .pwrsts = PWRSTS_OFF_RET_ON,
80 .pwrsts_logic_ret = PWRDM_POWER_OFF,
81 .banks = 2,
82 .pwrsts_mem_ret = {
83 [0] = PWRDM_POWER_RET, /* aessmem */
84 [1] = PWRDM_POWER_OFF, /* periphmem */
85 },
86 .pwrsts_mem_on = {
87 [0] = PWRDM_POWER_ON, /* aessmem */
88 [1] = PWRDM_POWER_ON, /* periphmem */
89 },
90};
91
92/* dss_44xx_pwrdm: Display subsystem power domain */
93static struct powerdomain dss_44xx_pwrdm = {
94 .name = "dss_pwrdm",
95 .prcm_offs = OMAP4430_PRM_DSS_MOD,
96 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
97 .pwrsts = PWRSTS_OFF_RET_ON,
98 .pwrsts_logic_ret = PWRSTS_OFF_RET,
99 .banks = 1,
100 .pwrsts_mem_ret = {
101 [0] = PWRDM_POWER_OFF, /* dss_mem */
102 },
103 .pwrsts_mem_on = {
104 [0] = PWRDM_POWER_ON, /* dss_mem */
105 },
106};
107
108/* tesla_44xx_pwrdm: Tesla processor power domain */
109static struct powerdomain tesla_44xx_pwrdm = {
110 .name = "tesla_pwrdm",
111 .prcm_offs = OMAP4430_PRM_TESLA_MOD,
112 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
113 .pwrsts = PWRSTS_OFF_RET_ON,
114 .pwrsts_logic_ret = PWRSTS_OFF_RET,
115 .banks = 3,
116 .pwrsts_mem_ret = {
117 [0] = PWRDM_POWER_RET, /* tesla_edma */
118 [1] = PWRSTS_OFF_RET, /* tesla_l1 */
119 [2] = PWRSTS_OFF_RET, /* tesla_l2 */
120 },
121 .pwrsts_mem_on = {
122 [0] = PWRDM_POWER_ON, /* tesla_edma */
123 [1] = PWRDM_POWER_ON, /* tesla_l1 */
124 [2] = PWRDM_POWER_ON, /* tesla_l2 */
125 },
126};
127
128/* wkup_44xx_pwrdm: Wake-up power domain */
129static struct powerdomain wkup_44xx_pwrdm = {
130 .name = "wkup_pwrdm",
131 .prcm_offs = OMAP4430_PRM_WKUP_MOD,
132 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
133 .pwrsts = PWRDM_POWER_ON,
134 .banks = 1,
135 .pwrsts_mem_ret = {
136 [0] = PWRDM_POWER_OFF, /* wkup_bank */
137 },
138 .pwrsts_mem_on = {
139 [0] = PWRDM_POWER_ON, /* wkup_bank */
140 },
141};
142
143/* cpu0_44xx_pwrdm: MPU0 processor and Neon coprocessor power domain */
144static struct powerdomain cpu0_44xx_pwrdm = {
145 .name = "cpu0_pwrdm",
146 .prcm_offs = OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD,
147 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
148 .pwrsts = PWRSTS_OFF_RET_ON,
149 .pwrsts_logic_ret = PWRSTS_OFF_RET,
150 .banks = 1,
151 .pwrsts_mem_ret = {
152 [0] = PWRSTS_OFF_RET, /* cpu0_l1 */
153 },
154 .pwrsts_mem_on = {
155 [0] = PWRDM_POWER_ON, /* cpu0_l1 */
156 },
157};
158
159/* cpu1_44xx_pwrdm: MPU1 processor and Neon coprocessor power domain */
160static struct powerdomain cpu1_44xx_pwrdm = {
161 .name = "cpu1_pwrdm",
162 .prcm_offs = OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD,
163 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
164 .pwrsts = PWRSTS_OFF_RET_ON,
165 .pwrsts_logic_ret = PWRSTS_OFF_RET,
166 .banks = 1,
167 .pwrsts_mem_ret = {
168 [0] = PWRSTS_OFF_RET, /* cpu1_l1 */
169 },
170 .pwrsts_mem_on = {
171 [0] = PWRDM_POWER_ON, /* cpu1_l1 */
172 },
173};
174
175/* emu_44xx_pwrdm: Emulation power domain */
176static struct powerdomain emu_44xx_pwrdm = {
177 .name = "emu_pwrdm",
178 .prcm_offs = OMAP4430_PRM_EMU_MOD,
179 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
180 .pwrsts = PWRSTS_OFF_ON,
181 .banks = 1,
182 .pwrsts_mem_ret = {
183 [0] = PWRDM_POWER_OFF, /* emu_bank */
184 },
185 .pwrsts_mem_on = {
186 [0] = PWRDM_POWER_ON, /* emu_bank */
187 },
188};
189
190/* mpu_44xx_pwrdm: Modena processor and the Neon coprocessor power domain */
191static struct powerdomain mpu_44xx_pwrdm = {
192 .name = "mpu_pwrdm",
193 .prcm_offs = OMAP4430_PRM_MPU_MOD,
194 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
195 .pwrsts = PWRSTS_OFF_RET_ON,
196 .pwrsts_logic_ret = PWRSTS_OFF_RET,
197 .banks = 3,
198 .pwrsts_mem_ret = {
199 [0] = PWRSTS_OFF_RET, /* mpu_l1 */
200 [1] = PWRSTS_OFF_RET, /* mpu_l2 */
201 [2] = PWRDM_POWER_RET, /* mpu_ram */
202 },
203 .pwrsts_mem_on = {
204 [0] = PWRDM_POWER_ON, /* mpu_l1 */
205 [1] = PWRDM_POWER_ON, /* mpu_l2 */
206 [2] = PWRDM_POWER_ON, /* mpu_ram */
207 },
208};
209
210/* ivahd_44xx_pwrdm: IVA-HD power domain */
211static struct powerdomain ivahd_44xx_pwrdm = {
212 .name = "ivahd_pwrdm",
213 .prcm_offs = OMAP4430_PRM_IVAHD_MOD,
214 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
215 .pwrsts = PWRSTS_OFF_RET_ON,
216 .pwrsts_logic_ret = PWRDM_POWER_OFF,
217 .banks = 4,
218 .pwrsts_mem_ret = {
219 [0] = PWRDM_POWER_OFF, /* hwa_mem */
220 [1] = PWRSTS_OFF_RET, /* sl2_mem */
221 [2] = PWRSTS_OFF_RET, /* tcm1_mem */
222 [3] = PWRSTS_OFF_RET, /* tcm2_mem */
223 },
224 .pwrsts_mem_on = {
225 [0] = PWRDM_POWER_ON, /* hwa_mem */
226 [1] = PWRDM_POWER_ON, /* sl2_mem */
227 [2] = PWRDM_POWER_ON, /* tcm1_mem */
228 [3] = PWRDM_POWER_ON, /* tcm2_mem */
229 },
230};
231
232/* cam_44xx_pwrdm: Camera subsystem power domain */
233static struct powerdomain cam_44xx_pwrdm = {
234 .name = "cam_pwrdm",
235 .prcm_offs = OMAP4430_PRM_CAM_MOD,
236 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
237 .pwrsts = PWRSTS_OFF_ON,
238 .banks = 1,
239 .pwrsts_mem_ret = {
240 [0] = PWRDM_POWER_OFF, /* cam_mem */
241 },
242 .pwrsts_mem_on = {
243 [0] = PWRDM_POWER_ON, /* cam_mem */
244 },
245};
246
247/* l3init_44xx_pwrdm: L3 initators pheripherals power domain */
248static struct powerdomain l3init_44xx_pwrdm = {
249 .name = "l3init_pwrdm",
250 .prcm_offs = OMAP4430_PRM_L3INIT_MOD,
251 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
252 .pwrsts = PWRSTS_OFF_RET_ON,
253 .pwrsts_logic_ret = PWRSTS_OFF_RET,
254 .banks = 1,
255 .pwrsts_mem_ret = {
256 [0] = PWRDM_POWER_OFF, /* l3init_bank1 */
257 },
258 .pwrsts_mem_on = {
259 [0] = PWRDM_POWER_ON, /* l3init_bank1 */
260 },
261};
262
263/* l4per_44xx_pwrdm: Target peripherals power domain */
264static struct powerdomain l4per_44xx_pwrdm = {
265 .name = "l4per_pwrdm",
266 .prcm_offs = OMAP4430_PRM_L4PER_MOD,
267 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
268 .pwrsts = PWRSTS_OFF_RET_ON,
269 .pwrsts_logic_ret = PWRSTS_OFF_RET,
270 .banks = 2,
271 .pwrsts_mem_ret = {
272 [0] = PWRDM_POWER_OFF, /* nonretained_bank */
273 [1] = PWRDM_POWER_RET, /* retained_bank */
274 },
275 .pwrsts_mem_on = {
276 [0] = PWRDM_POWER_ON, /* nonretained_bank */
277 [1] = PWRDM_POWER_ON, /* retained_bank */
278 },
279};
280
281/*
282 * always_on_core_44xx_pwrdm: Always ON logic that sits in VDD_CORE voltage
283 * domain
284 */
285static struct powerdomain always_on_core_44xx_pwrdm = {
286 .name = "always_on_core_pwrdm",
287 .prcm_offs = OMAP4430_PRM_ALWAYS_ON_MOD,
288 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
289 .pwrsts = PWRDM_POWER_ON,
290};
291
292/* cefuse_44xx_pwrdm: Customer efuse controller power domain */
293static struct powerdomain cefuse_44xx_pwrdm = {
294 .name = "cefuse_pwrdm",
295 .prcm_offs = OMAP4430_PRM_CEFUSE_MOD,
296 .omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
297 .pwrsts = PWRSTS_OFF_ON,
298};
299
300/*
301 * The following power domains are not under SW control
302 *
303 * always_on_iva
304 * always_on_mpu
305 * stdefuse
306 */
307
308#endif
309
310#endif
diff --git a/arch/arm/mach-omap2/prcm-common.h b/arch/arm/mach-omap2/prcm-common.h
index cb1ae84e0925..90f603d434c6 100644
--- a/arch/arm/mach-omap2/prcm-common.h
+++ b/arch/arm/mach-omap2/prcm-common.h
@@ -4,10 +4,12 @@
4/* 4/*
5 * OMAP2/3 PRCM base and module definitions 5 * OMAP2/3 PRCM base and module definitions
6 * 6 *
7 * Copyright (C) 2007-2008 Texas Instruments, Inc. 7 * Copyright (C) 2007-2009 Texas Instruments, Inc.
8 * Copyright (C) 2007-2008 Nokia Corporation 8 * Copyright (C) 2007-2009 Nokia Corporation
9 * 9 *
10 * Written by Paul Walmsley 10 * Written by Paul Walmsley
11 * OMAP4 defines in this file are automatically generated from the OMAP hardware
12 * databases.
11 * 13 *
12 * This program is free software; you can redistribute it and/or modify 14 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License version 2 as 15 * it under the terms of the GNU General Public License version 2 as
@@ -49,6 +51,82 @@
49#define OMAP3430_NEON_MOD 0xb00 51#define OMAP3430_NEON_MOD 0xb00
50#define OMAP3430ES2_USBHOST_MOD 0xc00 52#define OMAP3430ES2_USBHOST_MOD 0xc00
51 53
54#define BITS(n_bit) \
55 (((1 << n_bit) - 1) | (1 << n_bit))
56
57#define BITFIELD(l_bit, u_bit) \
58 (BITS(u_bit) & ~((BITS(l_bit)) >> 1))
59
60/* OMAP44XX specific module offsets */
61
62/* CM1 instances */
63
64#define OMAP4430_CM1_OCP_SOCKET_MOD 0x0000
65#define OMAP4430_CM1_CKGEN_MOD 0x0100
66#define OMAP4430_CM1_MPU_MOD 0x0300
67#define OMAP4430_CM1_TESLA_MOD 0x0400
68#define OMAP4430_CM1_ABE_MOD 0x0500
69#define OMAP4430_CM1_RESTORE_MOD 0x0e00
70#define OMAP4430_CM1_INSTR_MOD 0x0f00
71
72/* CM2 instances */
73
74#define OMAP4430_CM2_OCP_SOCKET_MOD 0x0000
75#define OMAP4430_CM2_CKGEN_MOD 0x0100
76#define OMAP4430_CM2_ALWAYS_ON_MOD 0x0600
77#define OMAP4430_CM2_CORE_MOD 0x0700
78#define OMAP4430_CM2_IVAHD_MOD 0x0f00
79#define OMAP4430_CM2_CAM_MOD 0x1000
80#define OMAP4430_CM2_DSS_MOD 0x1100
81#define OMAP4430_CM2_GFX_MOD 0x1200
82#define OMAP4430_CM2_L3INIT_MOD 0x1300
83#define OMAP4430_CM2_L4PER_MOD 0x1400
84#define OMAP4430_CM2_CEFUSE_MOD 0x1600
85#define OMAP4430_CM2_RESTORE_MOD 0x1e00
86#define OMAP4430_CM2_INSTR_MOD 0x1f00
87
88/* PRM instances */
89
90#define OMAP4430_PRM_OCP_SOCKET_MOD 0x0000
91#define OMAP4430_PRM_CKGEN_MOD 0x0100
92#define OMAP4430_PRM_MPU_MOD 0x0300
93#define OMAP4430_PRM_TESLA_MOD 0x0400
94#define OMAP4430_PRM_ABE_MOD 0x0500
95#define OMAP4430_PRM_ALWAYS_ON_MOD 0x0600
96#define OMAP4430_PRM_CORE_MOD 0x0700
97#define OMAP4430_PRM_IVAHD_MOD 0x0f00
98#define OMAP4430_PRM_CAM_MOD 0x1000
99#define OMAP4430_PRM_DSS_MOD 0x1100
100#define OMAP4430_PRM_GFX_MOD 0x1200
101#define OMAP4430_PRM_L3INIT_MOD 0x1300
102#define OMAP4430_PRM_L4PER_MOD 0x1400
103#define OMAP4430_PRM_CEFUSE_MOD 0x1600
104#define OMAP4430_PRM_WKUP_MOD 0x1700
105#define OMAP4430_PRM_WKUP_CM_MOD 0x1800
106#define OMAP4430_PRM_EMU_MOD 0x1900
107#define OMAP4430_PRM_EMU_CM_MOD 0x1a00
108#define OMAP4430_PRM_DEVICE_MOD 0x1b00
109#define OMAP4430_PRM_INSTR_MOD 0x1f00
110
111/* SCRM instances */
112
113#define OMAP4430_SCRM_SCRM_MOD 0x0000
114
115/* CHIRONSS instances */
116
117#define OMAP4430_CHIRONSS_CHIRONSS_OCP_SOCKET_PRCM_MOD 0x0000
118#define OMAP4430_CHIRONSS_CHIRONSS_DEVICE_PRM_MOD 0x0200
119#define OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD 0x0400
120#define OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD 0x0800
121
122/* Base Addresses for the OMAP4 */
123
124#define OMAP4430_CM1_BASE 0x4a004000
125#define OMAP4430_CM2_BASE 0x4a008000
126#define OMAP4430_PRM_BASE 0x4a306000
127#define OMAP4430_SCRM_BASE 0x4a30a000
128#define OMAP4430_CHIRONSS_BASE 0x48243000
129
52 130
53/* 24XX register bits shared between CM & PRM registers */ 131/* 24XX register bits shared between CM & PRM registers */
54 132
diff --git a/arch/arm/mach-omap2/prcm.c b/arch/arm/mach-omap2/prcm.c
index ced555a4cd1a..07a60f1204ca 100644
--- a/arch/arm/mach-omap2/prcm.c
+++ b/arch/arm/mach-omap2/prcm.c
@@ -7,7 +7,11 @@
7 * 7 *
8 * Written by Tony Lindgren <tony.lindgren@nokia.com> 8 * Written by Tony Lindgren <tony.lindgren@nokia.com>
9 * 9 *
10 * Copyright (C) 2007 Texas Instruments, Inc.
11 * Rajendra Nayak <rnayak@ti.com>
12 *
10 * Some pieces of code Copyright (C) 2005 Texas Instruments, Inc. 13 * Some pieces of code Copyright (C) 2005 Texas Instruments, Inc.
14 * Upgraded with OMAP4 support by Abhijit Pagare <abhijitpagare@ti.com>
11 * 15 *
12 * This program is free software; you can redistribute it and/or modify 16 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License version 2 as 17 * it under the terms of the GNU General Public License version 2 as
@@ -19,39 +23,146 @@
19#include <linux/io.h> 23#include <linux/io.h>
20#include <linux/delay.h> 24#include <linux/delay.h>
21 25
22#include <mach/common.h> 26#include <plat/common.h>
23#include <mach/prcm.h> 27#include <plat/prcm.h>
28#include <plat/irqs.h>
29#include <plat/control.h>
24 30
25#include "clock.h" 31#include "clock.h"
32#include "clock2xxx.h"
33#include "cm.h"
26#include "prm.h" 34#include "prm.h"
27#include "prm-regbits-24xx.h" 35#include "prm-regbits-24xx.h"
28 36
29static void __iomem *prm_base; 37static void __iomem *prm_base;
30static void __iomem *cm_base; 38static void __iomem *cm_base;
39static void __iomem *cm2_base;
31 40
32#define MAX_MODULE_ENABLE_WAIT 100000 41#define MAX_MODULE_ENABLE_WAIT 100000
33 42
43struct omap3_prcm_regs {
44 u32 control_padconf_sys_nirq;
45 u32 iva2_cm_clksel1;
46 u32 iva2_cm_clksel2;
47 u32 cm_sysconfig;
48 u32 sgx_cm_clksel;
49 u32 dss_cm_clksel;
50 u32 cam_cm_clksel;
51 u32 per_cm_clksel;
52 u32 emu_cm_clksel;
53 u32 emu_cm_clkstctrl;
54 u32 pll_cm_autoidle2;
55 u32 pll_cm_clksel4;
56 u32 pll_cm_clksel5;
57 u32 pll_cm_clken2;
58 u32 cm_polctrl;
59 u32 iva2_cm_fclken;
60 u32 iva2_cm_clken_pll;
61 u32 core_cm_fclken1;
62 u32 core_cm_fclken3;
63 u32 sgx_cm_fclken;
64 u32 wkup_cm_fclken;
65 u32 dss_cm_fclken;
66 u32 cam_cm_fclken;
67 u32 per_cm_fclken;
68 u32 usbhost_cm_fclken;
69 u32 core_cm_iclken1;
70 u32 core_cm_iclken2;
71 u32 core_cm_iclken3;
72 u32 sgx_cm_iclken;
73 u32 wkup_cm_iclken;
74 u32 dss_cm_iclken;
75 u32 cam_cm_iclken;
76 u32 per_cm_iclken;
77 u32 usbhost_cm_iclken;
78 u32 iva2_cm_autiidle2;
79 u32 mpu_cm_autoidle2;
80 u32 iva2_cm_clkstctrl;
81 u32 mpu_cm_clkstctrl;
82 u32 core_cm_clkstctrl;
83 u32 sgx_cm_clkstctrl;
84 u32 dss_cm_clkstctrl;
85 u32 cam_cm_clkstctrl;
86 u32 per_cm_clkstctrl;
87 u32 neon_cm_clkstctrl;
88 u32 usbhost_cm_clkstctrl;
89 u32 core_cm_autoidle1;
90 u32 core_cm_autoidle2;
91 u32 core_cm_autoidle3;
92 u32 wkup_cm_autoidle;
93 u32 dss_cm_autoidle;
94 u32 cam_cm_autoidle;
95 u32 per_cm_autoidle;
96 u32 usbhost_cm_autoidle;
97 u32 sgx_cm_sleepdep;
98 u32 dss_cm_sleepdep;
99 u32 cam_cm_sleepdep;
100 u32 per_cm_sleepdep;
101 u32 usbhost_cm_sleepdep;
102 u32 cm_clkout_ctrl;
103 u32 prm_clkout_ctrl;
104 u32 sgx_pm_wkdep;
105 u32 dss_pm_wkdep;
106 u32 cam_pm_wkdep;
107 u32 per_pm_wkdep;
108 u32 neon_pm_wkdep;
109 u32 usbhost_pm_wkdep;
110 u32 core_pm_mpugrpsel1;
111 u32 iva2_pm_ivagrpsel1;
112 u32 core_pm_mpugrpsel3;
113 u32 core_pm_ivagrpsel3;
114 u32 wkup_pm_mpugrpsel;
115 u32 wkup_pm_ivagrpsel;
116 u32 per_pm_mpugrpsel;
117 u32 per_pm_ivagrpsel;
118 u32 wkup_pm_wken;
119};
120
121struct omap3_prcm_regs prcm_context;
122
34u32 omap_prcm_get_reset_sources(void) 123u32 omap_prcm_get_reset_sources(void)
35{ 124{
36 /* XXX This presumably needs modification for 34XX */ 125 /* XXX This presumably needs modification for 34XX */
37 return prm_read_mod_reg(WKUP_MOD, RM_RSTST) & 0x7f; 126 if (cpu_is_omap24xx() || cpu_is_omap34xx())
127 return prm_read_mod_reg(WKUP_MOD, OMAP2_RM_RSTST) & 0x7f;
128 if (cpu_is_omap44xx())
129 return prm_read_mod_reg(WKUP_MOD, OMAP4_RM_RSTST) & 0x7f;
130
131 return 0;
38} 132}
39EXPORT_SYMBOL(omap_prcm_get_reset_sources); 133EXPORT_SYMBOL(omap_prcm_get_reset_sources);
40 134
41/* Resets clock rates and reboots the system. Only called from system.h */ 135/* Resets clock rates and reboots the system. Only called from system.h */
42void omap_prcm_arch_reset(char mode) 136void omap_prcm_arch_reset(char mode, const char *cmd)
43{ 137{
44 s16 prcm_offs; 138 s16 prcm_offs = 0;
45 omap2_clk_prepare_for_reboot(); 139
140 if (cpu_is_omap24xx()) {
141 omap2xxx_clk_prepare_for_reboot();
46 142
47 if (cpu_is_omap24xx())
48 prcm_offs = WKUP_MOD; 143 prcm_offs = WKUP_MOD;
49 else if (cpu_is_omap34xx()) 144 } else if (cpu_is_omap34xx()) {
145 u32 l;
146
50 prcm_offs = OMAP3430_GR_MOD; 147 prcm_offs = OMAP3430_GR_MOD;
148 l = ('B' << 24) | ('M' << 16) | (cmd ? (u8)*cmd : 0);
149 /* Reserve the first word in scratchpad for communicating
150 * with the boot ROM. A pointer to a data structure
151 * describing the boot process can be stored there,
152 * cf. OMAP34xx TRM, Initialization / Software Booting
153 * Configuration. */
154 omap_writel(l, OMAP343X_SCRATCHPAD + 4);
155 } else if (cpu_is_omap44xx())
156 prcm_offs = OMAP4430_PRM_DEVICE_MOD;
51 else 157 else
52 WARN_ON(1); 158 WARN_ON(1);
53 159
54 prm_set_mod_reg_bits(OMAP_RST_DPLL3, prcm_offs, RM_RSTCTRL); 160 if (cpu_is_omap24xx() || cpu_is_omap34xx())
161 prm_set_mod_reg_bits(OMAP_RST_DPLL3, prcm_offs,
162 OMAP2_RM_RSTCTRL);
163 if (cpu_is_omap44xx())
164 prm_set_mod_reg_bits(OMAP_RST_DPLL3, prcm_offs,
165 OMAP4_RM_RSTCTRL);
55} 166}
56 167
57static inline u32 __omap_prcm_read(void __iomem *base, s16 module, u16 reg) 168static inline u32 __omap_prcm_read(void __iomem *base, s16 module, u16 reg)
@@ -72,14 +183,12 @@ u32 prm_read_mod_reg(s16 module, u16 idx)
72{ 183{
73 return __omap_prcm_read(prm_base, module, idx); 184 return __omap_prcm_read(prm_base, module, idx);
74} 185}
75EXPORT_SYMBOL(prm_read_mod_reg);
76 186
77/* Write into a register in a PRM module */ 187/* Write into a register in a PRM module */
78void prm_write_mod_reg(u32 val, s16 module, u16 idx) 188void prm_write_mod_reg(u32 val, s16 module, u16 idx)
79{ 189{
80 __omap_prcm_write(val, prm_base, module, idx); 190 __omap_prcm_write(val, prm_base, module, idx);
81} 191}
82EXPORT_SYMBOL(prm_write_mod_reg);
83 192
84/* Read-modify-write a register in a PRM module. Caller must lock */ 193/* Read-modify-write a register in a PRM module. Caller must lock */
85u32 prm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx) 194u32 prm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx)
@@ -93,21 +202,30 @@ u32 prm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx)
93 202
94 return v; 203 return v;
95} 204}
96EXPORT_SYMBOL(prm_rmw_mod_reg_bits); 205
206/* Read a PRM register, AND it, and shift the result down to bit 0 */
207u32 prm_read_mod_bits_shift(s16 domain, s16 idx, u32 mask)
208{
209 u32 v;
210
211 v = prm_read_mod_reg(domain, idx);
212 v &= mask;
213 v >>= __ffs(mask);
214
215 return v;
216}
97 217
98/* Read a register in a CM module */ 218/* Read a register in a CM module */
99u32 cm_read_mod_reg(s16 module, u16 idx) 219u32 cm_read_mod_reg(s16 module, u16 idx)
100{ 220{
101 return __omap_prcm_read(cm_base, module, idx); 221 return __omap_prcm_read(cm_base, module, idx);
102} 222}
103EXPORT_SYMBOL(cm_read_mod_reg);
104 223
105/* Write into a register in a CM module */ 224/* Write into a register in a CM module */
106void cm_write_mod_reg(u32 val, s16 module, u16 idx) 225void cm_write_mod_reg(u32 val, s16 module, u16 idx)
107{ 226{
108 __omap_prcm_write(val, cm_base, module, idx); 227 __omap_prcm_write(val, cm_base, module, idx);
109} 228}
110EXPORT_SYMBOL(cm_write_mod_reg);
111 229
112/* Read-modify-write a register in a CM module. Caller must lock */ 230/* Read-modify-write a register in a CM module. Caller must lock */
113u32 cm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx) 231u32 cm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx)
@@ -121,37 +239,31 @@ u32 cm_rmw_mod_reg_bits(u32 mask, u32 bits, s16 module, s16 idx)
121 239
122 return v; 240 return v;
123} 241}
124EXPORT_SYMBOL(cm_rmw_mod_reg_bits);
125 242
126/** 243/**
127 * omap2_cm_wait_idlest - wait for IDLEST bit to indicate module readiness 244 * omap2_cm_wait_idlest - wait for IDLEST bit to indicate module readiness
128 * @reg: physical address of module IDLEST register 245 * @reg: physical address of module IDLEST register
129 * @mask: value to mask against to determine if the module is active 246 * @mask: value to mask against to determine if the module is active
247 * @idlest: idle state indicator (0 or 1) for the clock
130 * @name: name of the clock (for printk) 248 * @name: name of the clock (for printk)
131 * 249 *
132 * Returns 1 if the module indicated readiness in time, or 0 if it 250 * Returns 1 if the module indicated readiness in time, or 0 if it
133 * failed to enable in roughly MAX_MODULE_ENABLE_WAIT microseconds. 251 * failed to enable in roughly MAX_MODULE_ENABLE_WAIT microseconds.
134 */ 252 */
135int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, const char *name) 253int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, u8 idlest,
254 const char *name)
136{ 255{
137 int i = 0; 256 int i = 0;
138 int ena = 0; 257 int ena = 0;
139 258
140 /* 259 if (idlest)
141 * 24xx uses 0 to indicate not ready, and 1 to indicate ready.
142 * 34xx reverses this, just to keep us on our toes
143 */
144 if (cpu_is_omap24xx())
145 ena = mask;
146 else if (cpu_is_omap34xx())
147 ena = 0; 260 ena = 0;
148 else 261 else
149 BUG(); 262 ena = mask;
150 263
151 /* Wait for lock */ 264 /* Wait for lock */
152 while (((__raw_readl(reg) & mask) != ena) && 265 omap_test_timeout(((__raw_readl(reg) & mask) == ena),
153 (i++ < MAX_MODULE_ENABLE_WAIT)) 266 MAX_MODULE_ENABLE_WAIT, i);
154 udelay(1);
155 267
156 if (i < MAX_MODULE_ENABLE_WAIT) 268 if (i < MAX_MODULE_ENABLE_WAIT)
157 pr_debug("cm: Module associated with clock %s ready after %d " 269 pr_debug("cm: Module associated with clock %s ready after %d "
@@ -165,6 +277,317 @@ int omap2_cm_wait_idlest(void __iomem *reg, u32 mask, const char *name)
165 277
166void __init omap2_set_globals_prcm(struct omap_globals *omap2_globals) 278void __init omap2_set_globals_prcm(struct omap_globals *omap2_globals)
167{ 279{
168 prm_base = omap2_globals->prm; 280 /* Static mapping, never released */
169 cm_base = omap2_globals->cm; 281 if (omap2_globals->prm) {
282 prm_base = ioremap(omap2_globals->prm, SZ_8K);
283 WARN_ON(!prm_base);
284 }
285 if (omap2_globals->cm) {
286 cm_base = ioremap(omap2_globals->cm, SZ_8K);
287 WARN_ON(!cm_base);
288 }
289 if (omap2_globals->cm2) {
290 cm2_base = ioremap(omap2_globals->cm2, SZ_8K);
291 WARN_ON(!cm2_base);
292 }
293}
294
295#ifdef CONFIG_ARCH_OMAP3
296void omap3_prcm_save_context(void)
297{
298 prcm_context.control_padconf_sys_nirq =
299 omap_ctrl_readl(OMAP343X_CONTROL_PADCONF_SYSNIRQ);
300 prcm_context.iva2_cm_clksel1 =
301 cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_CLKSEL1);
302 prcm_context.iva2_cm_clksel2 =
303 cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_CLKSEL2);
304 prcm_context.cm_sysconfig = __raw_readl(OMAP3430_CM_SYSCONFIG);
305 prcm_context.sgx_cm_clksel =
306 cm_read_mod_reg(OMAP3430ES2_SGX_MOD, CM_CLKSEL);
307 prcm_context.dss_cm_clksel =
308 cm_read_mod_reg(OMAP3430_DSS_MOD, CM_CLKSEL);
309 prcm_context.cam_cm_clksel =
310 cm_read_mod_reg(OMAP3430_CAM_MOD, CM_CLKSEL);
311 prcm_context.per_cm_clksel =
312 cm_read_mod_reg(OMAP3430_PER_MOD, CM_CLKSEL);
313 prcm_context.emu_cm_clksel =
314 cm_read_mod_reg(OMAP3430_EMU_MOD, CM_CLKSEL1);
315 prcm_context.emu_cm_clkstctrl =
316 cm_read_mod_reg(OMAP3430_EMU_MOD, OMAP2_CM_CLKSTCTRL);
317 prcm_context.pll_cm_autoidle2 =
318 cm_read_mod_reg(PLL_MOD, CM_AUTOIDLE2);
319 prcm_context.pll_cm_clksel4 =
320 cm_read_mod_reg(PLL_MOD, OMAP3430ES2_CM_CLKSEL4);
321 prcm_context.pll_cm_clksel5 =
322 cm_read_mod_reg(PLL_MOD, OMAP3430ES2_CM_CLKSEL5);
323 prcm_context.pll_cm_clken2 =
324 cm_read_mod_reg(PLL_MOD, OMAP3430ES2_CM_CLKEN2);
325 prcm_context.cm_polctrl = __raw_readl(OMAP3430_CM_POLCTRL);
326 prcm_context.iva2_cm_fclken =
327 cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_FCLKEN);
328 prcm_context.iva2_cm_clken_pll = cm_read_mod_reg(OMAP3430_IVA2_MOD,
329 OMAP3430_CM_CLKEN_PLL);
330 prcm_context.core_cm_fclken1 =
331 cm_read_mod_reg(CORE_MOD, CM_FCLKEN1);
332 prcm_context.core_cm_fclken3 =
333 cm_read_mod_reg(CORE_MOD, OMAP3430ES2_CM_FCLKEN3);
334 prcm_context.sgx_cm_fclken =
335 cm_read_mod_reg(OMAP3430ES2_SGX_MOD, CM_FCLKEN);
336 prcm_context.wkup_cm_fclken =
337 cm_read_mod_reg(WKUP_MOD, CM_FCLKEN);
338 prcm_context.dss_cm_fclken =
339 cm_read_mod_reg(OMAP3430_DSS_MOD, CM_FCLKEN);
340 prcm_context.cam_cm_fclken =
341 cm_read_mod_reg(OMAP3430_CAM_MOD, CM_FCLKEN);
342 prcm_context.per_cm_fclken =
343 cm_read_mod_reg(OMAP3430_PER_MOD, CM_FCLKEN);
344 prcm_context.usbhost_cm_fclken =
345 cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, CM_FCLKEN);
346 prcm_context.core_cm_iclken1 =
347 cm_read_mod_reg(CORE_MOD, CM_ICLKEN1);
348 prcm_context.core_cm_iclken2 =
349 cm_read_mod_reg(CORE_MOD, CM_ICLKEN2);
350 prcm_context.core_cm_iclken3 =
351 cm_read_mod_reg(CORE_MOD, CM_ICLKEN3);
352 prcm_context.sgx_cm_iclken =
353 cm_read_mod_reg(OMAP3430ES2_SGX_MOD, CM_ICLKEN);
354 prcm_context.wkup_cm_iclken =
355 cm_read_mod_reg(WKUP_MOD, CM_ICLKEN);
356 prcm_context.dss_cm_iclken =
357 cm_read_mod_reg(OMAP3430_DSS_MOD, CM_ICLKEN);
358 prcm_context.cam_cm_iclken =
359 cm_read_mod_reg(OMAP3430_CAM_MOD, CM_ICLKEN);
360 prcm_context.per_cm_iclken =
361 cm_read_mod_reg(OMAP3430_PER_MOD, CM_ICLKEN);
362 prcm_context.usbhost_cm_iclken =
363 cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, CM_ICLKEN);
364 prcm_context.iva2_cm_autiidle2 =
365 cm_read_mod_reg(OMAP3430_IVA2_MOD, CM_AUTOIDLE2);
366 prcm_context.mpu_cm_autoidle2 =
367 cm_read_mod_reg(MPU_MOD, CM_AUTOIDLE2);
368 prcm_context.iva2_cm_clkstctrl =
369 cm_read_mod_reg(OMAP3430_IVA2_MOD, OMAP2_CM_CLKSTCTRL);
370 prcm_context.mpu_cm_clkstctrl =
371 cm_read_mod_reg(MPU_MOD, OMAP2_CM_CLKSTCTRL);
372 prcm_context.core_cm_clkstctrl =
373 cm_read_mod_reg(CORE_MOD, OMAP2_CM_CLKSTCTRL);
374 prcm_context.sgx_cm_clkstctrl =
375 cm_read_mod_reg(OMAP3430ES2_SGX_MOD,
376 OMAP2_CM_CLKSTCTRL);
377 prcm_context.dss_cm_clkstctrl =
378 cm_read_mod_reg(OMAP3430_DSS_MOD, OMAP2_CM_CLKSTCTRL);
379 prcm_context.cam_cm_clkstctrl =
380 cm_read_mod_reg(OMAP3430_CAM_MOD, OMAP2_CM_CLKSTCTRL);
381 prcm_context.per_cm_clkstctrl =
382 cm_read_mod_reg(OMAP3430_PER_MOD, OMAP2_CM_CLKSTCTRL);
383 prcm_context.neon_cm_clkstctrl =
384 cm_read_mod_reg(OMAP3430_NEON_MOD, OMAP2_CM_CLKSTCTRL);
385 prcm_context.usbhost_cm_clkstctrl =
386 cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD,
387 OMAP2_CM_CLKSTCTRL);
388 prcm_context.core_cm_autoidle1 =
389 cm_read_mod_reg(CORE_MOD, CM_AUTOIDLE1);
390 prcm_context.core_cm_autoidle2 =
391 cm_read_mod_reg(CORE_MOD, CM_AUTOIDLE2);
392 prcm_context.core_cm_autoidle3 =
393 cm_read_mod_reg(CORE_MOD, CM_AUTOIDLE3);
394 prcm_context.wkup_cm_autoidle =
395 cm_read_mod_reg(WKUP_MOD, CM_AUTOIDLE);
396 prcm_context.dss_cm_autoidle =
397 cm_read_mod_reg(OMAP3430_DSS_MOD, CM_AUTOIDLE);
398 prcm_context.cam_cm_autoidle =
399 cm_read_mod_reg(OMAP3430_CAM_MOD, CM_AUTOIDLE);
400 prcm_context.per_cm_autoidle =
401 cm_read_mod_reg(OMAP3430_PER_MOD, CM_AUTOIDLE);
402 prcm_context.usbhost_cm_autoidle =
403 cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, CM_AUTOIDLE);
404 prcm_context.sgx_cm_sleepdep =
405 cm_read_mod_reg(OMAP3430ES2_SGX_MOD, OMAP3430_CM_SLEEPDEP);
406 prcm_context.dss_cm_sleepdep =
407 cm_read_mod_reg(OMAP3430_DSS_MOD, OMAP3430_CM_SLEEPDEP);
408 prcm_context.cam_cm_sleepdep =
409 cm_read_mod_reg(OMAP3430_CAM_MOD, OMAP3430_CM_SLEEPDEP);
410 prcm_context.per_cm_sleepdep =
411 cm_read_mod_reg(OMAP3430_PER_MOD, OMAP3430_CM_SLEEPDEP);
412 prcm_context.usbhost_cm_sleepdep =
413 cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, OMAP3430_CM_SLEEPDEP);
414 prcm_context.cm_clkout_ctrl = cm_read_mod_reg(OMAP3430_CCR_MOD,
415 OMAP3_CM_CLKOUT_CTRL_OFFSET);
416 prcm_context.prm_clkout_ctrl = prm_read_mod_reg(OMAP3430_CCR_MOD,
417 OMAP3_PRM_CLKOUT_CTRL_OFFSET);
418 prcm_context.sgx_pm_wkdep =
419 prm_read_mod_reg(OMAP3430ES2_SGX_MOD, PM_WKDEP);
420 prcm_context.dss_pm_wkdep =
421 prm_read_mod_reg(OMAP3430_DSS_MOD, PM_WKDEP);
422 prcm_context.cam_pm_wkdep =
423 prm_read_mod_reg(OMAP3430_CAM_MOD, PM_WKDEP);
424 prcm_context.per_pm_wkdep =
425 prm_read_mod_reg(OMAP3430_PER_MOD, PM_WKDEP);
426 prcm_context.neon_pm_wkdep =
427 prm_read_mod_reg(OMAP3430_NEON_MOD, PM_WKDEP);
428 prcm_context.usbhost_pm_wkdep =
429 prm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, PM_WKDEP);
430 prcm_context.core_pm_mpugrpsel1 =
431 prm_read_mod_reg(CORE_MOD, OMAP3430_PM_MPUGRPSEL1);
432 prcm_context.iva2_pm_ivagrpsel1 =
433 prm_read_mod_reg(OMAP3430_IVA2_MOD, OMAP3430_PM_IVAGRPSEL1);
434 prcm_context.core_pm_mpugrpsel3 =
435 prm_read_mod_reg(CORE_MOD, OMAP3430ES2_PM_MPUGRPSEL3);
436 prcm_context.core_pm_ivagrpsel3 =
437 prm_read_mod_reg(CORE_MOD, OMAP3430ES2_PM_IVAGRPSEL3);
438 prcm_context.wkup_pm_mpugrpsel =
439 prm_read_mod_reg(WKUP_MOD, OMAP3430_PM_MPUGRPSEL);
440 prcm_context.wkup_pm_ivagrpsel =
441 prm_read_mod_reg(WKUP_MOD, OMAP3430_PM_IVAGRPSEL);
442 prcm_context.per_pm_mpugrpsel =
443 prm_read_mod_reg(OMAP3430_PER_MOD, OMAP3430_PM_MPUGRPSEL);
444 prcm_context.per_pm_ivagrpsel =
445 prm_read_mod_reg(OMAP3430_PER_MOD, OMAP3430_PM_IVAGRPSEL);
446 prcm_context.wkup_pm_wken = prm_read_mod_reg(WKUP_MOD, PM_WKEN);
447 return;
448}
449
450void omap3_prcm_restore_context(void)
451{
452 omap_ctrl_writel(prcm_context.control_padconf_sys_nirq,
453 OMAP343X_CONTROL_PADCONF_SYSNIRQ);
454 cm_write_mod_reg(prcm_context.iva2_cm_clksel1, OMAP3430_IVA2_MOD,
455 CM_CLKSEL1);
456 cm_write_mod_reg(prcm_context.iva2_cm_clksel2, OMAP3430_IVA2_MOD,
457 CM_CLKSEL2);
458 __raw_writel(prcm_context.cm_sysconfig, OMAP3430_CM_SYSCONFIG);
459 cm_write_mod_reg(prcm_context.sgx_cm_clksel, OMAP3430ES2_SGX_MOD,
460 CM_CLKSEL);
461 cm_write_mod_reg(prcm_context.dss_cm_clksel, OMAP3430_DSS_MOD,
462 CM_CLKSEL);
463 cm_write_mod_reg(prcm_context.cam_cm_clksel, OMAP3430_CAM_MOD,
464 CM_CLKSEL);
465 cm_write_mod_reg(prcm_context.per_cm_clksel, OMAP3430_PER_MOD,
466 CM_CLKSEL);
467 cm_write_mod_reg(prcm_context.emu_cm_clksel, OMAP3430_EMU_MOD,
468 CM_CLKSEL1);
469 cm_write_mod_reg(prcm_context.emu_cm_clkstctrl, OMAP3430_EMU_MOD,
470 OMAP2_CM_CLKSTCTRL);
471 cm_write_mod_reg(prcm_context.pll_cm_autoidle2, PLL_MOD,
472 CM_AUTOIDLE2);
473 cm_write_mod_reg(prcm_context.pll_cm_clksel4, PLL_MOD,
474 OMAP3430ES2_CM_CLKSEL4);
475 cm_write_mod_reg(prcm_context.pll_cm_clksel5, PLL_MOD,
476 OMAP3430ES2_CM_CLKSEL5);
477 cm_write_mod_reg(prcm_context.pll_cm_clken2, PLL_MOD,
478 OMAP3430ES2_CM_CLKEN2);
479 __raw_writel(prcm_context.cm_polctrl, OMAP3430_CM_POLCTRL);
480 cm_write_mod_reg(prcm_context.iva2_cm_fclken, OMAP3430_IVA2_MOD,
481 CM_FCLKEN);
482 cm_write_mod_reg(prcm_context.iva2_cm_clken_pll, OMAP3430_IVA2_MOD,
483 OMAP3430_CM_CLKEN_PLL);
484 cm_write_mod_reg(prcm_context.core_cm_fclken1, CORE_MOD, CM_FCLKEN1);
485 cm_write_mod_reg(prcm_context.core_cm_fclken3, CORE_MOD,
486 OMAP3430ES2_CM_FCLKEN3);
487 cm_write_mod_reg(prcm_context.sgx_cm_fclken, OMAP3430ES2_SGX_MOD,
488 CM_FCLKEN);
489 cm_write_mod_reg(prcm_context.wkup_cm_fclken, WKUP_MOD, CM_FCLKEN);
490 cm_write_mod_reg(prcm_context.dss_cm_fclken, OMAP3430_DSS_MOD,
491 CM_FCLKEN);
492 cm_write_mod_reg(prcm_context.cam_cm_fclken, OMAP3430_CAM_MOD,
493 CM_FCLKEN);
494 cm_write_mod_reg(prcm_context.per_cm_fclken, OMAP3430_PER_MOD,
495 CM_FCLKEN);
496 cm_write_mod_reg(prcm_context.usbhost_cm_fclken,
497 OMAP3430ES2_USBHOST_MOD, CM_FCLKEN);
498 cm_write_mod_reg(prcm_context.core_cm_iclken1, CORE_MOD, CM_ICLKEN1);
499 cm_write_mod_reg(prcm_context.core_cm_iclken2, CORE_MOD, CM_ICLKEN2);
500 cm_write_mod_reg(prcm_context.core_cm_iclken3, CORE_MOD, CM_ICLKEN3);
501 cm_write_mod_reg(prcm_context.sgx_cm_iclken, OMAP3430ES2_SGX_MOD,
502 CM_ICLKEN);
503 cm_write_mod_reg(prcm_context.wkup_cm_iclken, WKUP_MOD, CM_ICLKEN);
504 cm_write_mod_reg(prcm_context.dss_cm_iclken, OMAP3430_DSS_MOD,
505 CM_ICLKEN);
506 cm_write_mod_reg(prcm_context.cam_cm_iclken, OMAP3430_CAM_MOD,
507 CM_ICLKEN);
508 cm_write_mod_reg(prcm_context.per_cm_iclken, OMAP3430_PER_MOD,
509 CM_ICLKEN);
510 cm_write_mod_reg(prcm_context.usbhost_cm_iclken,
511 OMAP3430ES2_USBHOST_MOD, CM_ICLKEN);
512 cm_write_mod_reg(prcm_context.iva2_cm_autiidle2, OMAP3430_IVA2_MOD,
513 CM_AUTOIDLE2);
514 cm_write_mod_reg(prcm_context.mpu_cm_autoidle2, MPU_MOD, CM_AUTOIDLE2);
515 cm_write_mod_reg(prcm_context.iva2_cm_clkstctrl, OMAP3430_IVA2_MOD,
516 OMAP2_CM_CLKSTCTRL);
517 cm_write_mod_reg(prcm_context.mpu_cm_clkstctrl, MPU_MOD,
518 OMAP2_CM_CLKSTCTRL);
519 cm_write_mod_reg(prcm_context.core_cm_clkstctrl, CORE_MOD,
520 OMAP2_CM_CLKSTCTRL);
521 cm_write_mod_reg(prcm_context.sgx_cm_clkstctrl, OMAP3430ES2_SGX_MOD,
522 OMAP2_CM_CLKSTCTRL);
523 cm_write_mod_reg(prcm_context.dss_cm_clkstctrl, OMAP3430_DSS_MOD,
524 OMAP2_CM_CLKSTCTRL);
525 cm_write_mod_reg(prcm_context.cam_cm_clkstctrl, OMAP3430_CAM_MOD,
526 OMAP2_CM_CLKSTCTRL);
527 cm_write_mod_reg(prcm_context.per_cm_clkstctrl, OMAP3430_PER_MOD,
528 OMAP2_CM_CLKSTCTRL);
529 cm_write_mod_reg(prcm_context.neon_cm_clkstctrl, OMAP3430_NEON_MOD,
530 OMAP2_CM_CLKSTCTRL);
531 cm_write_mod_reg(prcm_context.usbhost_cm_clkstctrl,
532 OMAP3430ES2_USBHOST_MOD, OMAP2_CM_CLKSTCTRL);
533 cm_write_mod_reg(prcm_context.core_cm_autoidle1, CORE_MOD,
534 CM_AUTOIDLE1);
535 cm_write_mod_reg(prcm_context.core_cm_autoidle2, CORE_MOD,
536 CM_AUTOIDLE2);
537 cm_write_mod_reg(prcm_context.core_cm_autoidle3, CORE_MOD,
538 CM_AUTOIDLE3);
539 cm_write_mod_reg(prcm_context.wkup_cm_autoidle, WKUP_MOD, CM_AUTOIDLE);
540 cm_write_mod_reg(prcm_context.dss_cm_autoidle, OMAP3430_DSS_MOD,
541 CM_AUTOIDLE);
542 cm_write_mod_reg(prcm_context.cam_cm_autoidle, OMAP3430_CAM_MOD,
543 CM_AUTOIDLE);
544 cm_write_mod_reg(prcm_context.per_cm_autoidle, OMAP3430_PER_MOD,
545 CM_AUTOIDLE);
546 cm_write_mod_reg(prcm_context.usbhost_cm_autoidle,
547 OMAP3430ES2_USBHOST_MOD, CM_AUTOIDLE);
548 cm_write_mod_reg(prcm_context.sgx_cm_sleepdep, OMAP3430ES2_SGX_MOD,
549 OMAP3430_CM_SLEEPDEP);
550 cm_write_mod_reg(prcm_context.dss_cm_sleepdep, OMAP3430_DSS_MOD,
551 OMAP3430_CM_SLEEPDEP);
552 cm_write_mod_reg(prcm_context.cam_cm_sleepdep, OMAP3430_CAM_MOD,
553 OMAP3430_CM_SLEEPDEP);
554 cm_write_mod_reg(prcm_context.per_cm_sleepdep, OMAP3430_PER_MOD,
555 OMAP3430_CM_SLEEPDEP);
556 cm_write_mod_reg(prcm_context.usbhost_cm_sleepdep,
557 OMAP3430ES2_USBHOST_MOD, OMAP3430_CM_SLEEPDEP);
558 cm_write_mod_reg(prcm_context.cm_clkout_ctrl, OMAP3430_CCR_MOD,
559 OMAP3_CM_CLKOUT_CTRL_OFFSET);
560 prm_write_mod_reg(prcm_context.prm_clkout_ctrl, OMAP3430_CCR_MOD,
561 OMAP3_PRM_CLKOUT_CTRL_OFFSET);
562 prm_write_mod_reg(prcm_context.sgx_pm_wkdep, OMAP3430ES2_SGX_MOD,
563 PM_WKDEP);
564 prm_write_mod_reg(prcm_context.dss_pm_wkdep, OMAP3430_DSS_MOD,
565 PM_WKDEP);
566 prm_write_mod_reg(prcm_context.cam_pm_wkdep, OMAP3430_CAM_MOD,
567 PM_WKDEP);
568 prm_write_mod_reg(prcm_context.per_pm_wkdep, OMAP3430_PER_MOD,
569 PM_WKDEP);
570 prm_write_mod_reg(prcm_context.neon_pm_wkdep, OMAP3430_NEON_MOD,
571 PM_WKDEP);
572 prm_write_mod_reg(prcm_context.usbhost_pm_wkdep,
573 OMAP3430ES2_USBHOST_MOD, PM_WKDEP);
574 prm_write_mod_reg(prcm_context.core_pm_mpugrpsel1, CORE_MOD,
575 OMAP3430_PM_MPUGRPSEL1);
576 prm_write_mod_reg(prcm_context.iva2_pm_ivagrpsel1, OMAP3430_IVA2_MOD,
577 OMAP3430_PM_IVAGRPSEL1);
578 prm_write_mod_reg(prcm_context.core_pm_mpugrpsel3, CORE_MOD,
579 OMAP3430ES2_PM_MPUGRPSEL3);
580 prm_write_mod_reg(prcm_context.core_pm_ivagrpsel3, CORE_MOD,
581 OMAP3430ES2_PM_IVAGRPSEL3);
582 prm_write_mod_reg(prcm_context.wkup_pm_mpugrpsel, WKUP_MOD,
583 OMAP3430_PM_MPUGRPSEL);
584 prm_write_mod_reg(prcm_context.wkup_pm_ivagrpsel, WKUP_MOD,
585 OMAP3430_PM_IVAGRPSEL);
586 prm_write_mod_reg(prcm_context.per_pm_mpugrpsel, OMAP3430_PER_MOD,
587 OMAP3430_PM_MPUGRPSEL);
588 prm_write_mod_reg(prcm_context.per_pm_ivagrpsel, OMAP3430_PER_MOD,
589 OMAP3430_PM_IVAGRPSEL);
590 prm_write_mod_reg(prcm_context.wkup_pm_wken, WKUP_MOD, PM_WKEN);
591 return;
170} 592}
593#endif
diff --git a/arch/arm/mach-omap2/prm-regbits-34xx.h b/arch/arm/mach-omap2/prm-regbits-34xx.h
index 9fd03a2ec95c..8f21bae6dc1c 100644
--- a/arch/arm/mach-omap2/prm-regbits-34xx.h
+++ b/arch/arm/mach-omap2/prm-regbits-34xx.h
@@ -365,6 +365,7 @@
365/* PM_PREPWSTST_GFX specific bits */ 365/* PM_PREPWSTST_GFX specific bits */
366 366
367/* PM_WKEN_WKUP specific bits */ 367/* PM_WKEN_WKUP specific bits */
368#define OMAP3430_EN_IO_CHAIN (1 << 16)
368#define OMAP3430_EN_IO (1 << 8) 369#define OMAP3430_EN_IO (1 << 8)
369#define OMAP3430_EN_GPIO1 (1 << 3) 370#define OMAP3430_EN_GPIO1 (1 << 3)
370 371
@@ -373,6 +374,7 @@
373/* PM_IVA2GRPSEL_WKUP specific bits */ 374/* PM_IVA2GRPSEL_WKUP specific bits */
374 375
375/* PM_WKST_WKUP specific bits */ 376/* PM_WKST_WKUP specific bits */
377#define OMAP3430_ST_IO_CHAIN (1 << 16)
376#define OMAP3430_ST_IO (1 << 8) 378#define OMAP3430_ST_IO (1 << 8)
377 379
378/* PRM_CLKSEL */ 380/* PRM_CLKSEL */
diff --git a/arch/arm/mach-omap2/prm-regbits-44xx.h b/arch/arm/mach-omap2/prm-regbits-44xx.h
new file mode 100644
index 000000000000..597be4a2b9ff
--- /dev/null
+++ b/arch/arm/mach-omap2/prm-regbits-44xx.h
@@ -0,0 +1,2205 @@
1/*
2 * OMAP44xx Power Management register bits
3 *
4 * Copyright (C) 2009 Texas Instruments, Inc.
5 * Copyright (C) 2009 Nokia Corporation
6 *
7 * Paul Walmsley (paul@pwsan.com)
8 * Rajendra Nayak (rnayak@ti.com)
9 * Benoit Cousson (b-cousson@ti.com)
10 *
11 * This file is automatically generated from the OMAP hardware databases.
12 * We respectfully ask that any modifications to this file be coordinated
13 * with the public linux-omap@vger.kernel.org mailing list and the
14 * authors above to ensure that the autogeneration scripts are kept
15 * up-to-date with the file contents.
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License version 2 as
19 * published by the Free Software Foundation.
20 */
21
22#ifndef __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_44XX_H
23#define __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_44XX_H
24
25#include "prm.h"
26
27
28/*
29 * Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_IVA_SETUP,
30 * PRM_LDO_SRAM_MPU_SETUP
31 */
32#define OMAP4430_ABBOFF_ACT_EXPORT_SHIFT 1
33#define OMAP4430_ABBOFF_ACT_EXPORT_MASK BITFIELD(1, 1)
34
35/*
36 * Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_IVA_SETUP,
37 * PRM_LDO_SRAM_MPU_SETUP
38 */
39#define OMAP4430_ABBOFF_SLEEP_EXPORT_SHIFT 2
40#define OMAP4430_ABBOFF_SLEEP_EXPORT_MASK BITFIELD(2, 2)
41
42/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
43#define OMAP4430_ABB_IVA_DONE_EN_SHIFT 31
44#define OMAP4430_ABB_IVA_DONE_EN_MASK BITFIELD(31, 31)
45
46/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
47#define OMAP4430_ABB_IVA_DONE_ST_SHIFT 31
48#define OMAP4430_ABB_IVA_DONE_ST_MASK BITFIELD(31, 31)
49
50/* Used by PRM_IRQENABLE_MPU_2 */
51#define OMAP4430_ABB_MPU_DONE_EN_SHIFT 7
52#define OMAP4430_ABB_MPU_DONE_EN_MASK BITFIELD(7, 7)
53
54/* Used by PRM_IRQSTATUS_MPU_2 */
55#define OMAP4430_ABB_MPU_DONE_ST_SHIFT 7
56#define OMAP4430_ABB_MPU_DONE_ST_MASK BITFIELD(7, 7)
57
58/* Used by PRM_LDO_ABB_IVA_SETUP, PRM_LDO_ABB_MPU_SETUP */
59#define OMAP4430_ACTIVE_FBB_SEL_SHIFT 2
60#define OMAP4430_ACTIVE_FBB_SEL_MASK BITFIELD(2, 2)
61
62/* Used by PRM_LDO_ABB_IVA_SETUP, PRM_LDO_ABB_MPU_SETUP */
63#define OMAP4430_ACTIVE_RBB_SEL_SHIFT 1
64#define OMAP4430_ACTIVE_RBB_SEL_MASK BITFIELD(1, 1)
65
66/* Used by PM_ABE_PWRSTCTRL */
67#define OMAP4430_AESSMEM_ONSTATE_SHIFT 16
68#define OMAP4430_AESSMEM_ONSTATE_MASK BITFIELD(16, 17)
69
70/* Used by PM_ABE_PWRSTCTRL */
71#define OMAP4430_AESSMEM_RETSTATE_SHIFT 8
72#define OMAP4430_AESSMEM_RETSTATE_MASK BITFIELD(8, 8)
73
74/* Used by PM_ABE_PWRSTST */
75#define OMAP4430_AESSMEM_STATEST_SHIFT 4
76#define OMAP4430_AESSMEM_STATEST_MASK BITFIELD(4, 5)
77
78/*
79 * Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_IVA_SETUP,
80 * PRM_LDO_SRAM_MPU_SETUP
81 */
82#define OMAP4430_AIPOFF_SHIFT 8
83#define OMAP4430_AIPOFF_MASK BITFIELD(8, 8)
84
85/* Used by PRM_VOLTCTRL */
86#define OMAP4430_AUTO_CTRL_VDD_CORE_L_SHIFT 0
87#define OMAP4430_AUTO_CTRL_VDD_CORE_L_MASK BITFIELD(0, 1)
88
89/* Used by PRM_VOLTCTRL */
90#define OMAP4430_AUTO_CTRL_VDD_IVA_L_SHIFT 4
91#define OMAP4430_AUTO_CTRL_VDD_IVA_L_MASK BITFIELD(4, 5)
92
93/* Used by PRM_VOLTCTRL */
94#define OMAP4430_AUTO_CTRL_VDD_MPU_L_SHIFT 2
95#define OMAP4430_AUTO_CTRL_VDD_MPU_L_MASK BITFIELD(2, 3)
96
97/* Used by PM_CAM_PWRSTCTRL */
98#define OMAP4430_CAM_MEM_ONSTATE_SHIFT 16
99#define OMAP4430_CAM_MEM_ONSTATE_MASK BITFIELD(16, 17)
100
101/* Used by PM_CAM_PWRSTST */
102#define OMAP4430_CAM_MEM_STATEST_SHIFT 4
103#define OMAP4430_CAM_MEM_STATEST_MASK BITFIELD(4, 5)
104
105/* Used by PRM_CLKREQCTRL */
106#define OMAP4430_CLKREQ_COND_SHIFT 0
107#define OMAP4430_CLKREQ_COND_MASK BITFIELD(0, 2)
108
109/* Used by PRM_VC_VAL_SMPS_RA_CMD */
110#define OMAP4430_CMDRA_VDD_CORE_L_SHIFT 0
111#define OMAP4430_CMDRA_VDD_CORE_L_MASK BITFIELD(0, 7)
112
113/* Used by PRM_VC_VAL_SMPS_RA_CMD */
114#define OMAP4430_CMDRA_VDD_IVA_L_SHIFT 8
115#define OMAP4430_CMDRA_VDD_IVA_L_MASK BITFIELD(8, 15)
116
117/* Used by PRM_VC_VAL_SMPS_RA_CMD */
118#define OMAP4430_CMDRA_VDD_MPU_L_SHIFT 16
119#define OMAP4430_CMDRA_VDD_MPU_L_MASK BITFIELD(16, 23)
120
121/* Used by PRM_VC_CFG_CHANNEL */
122#define OMAP4430_CMD_VDD_CORE_L_SHIFT 4
123#define OMAP4430_CMD_VDD_CORE_L_MASK BITFIELD(4, 4)
124
125/* Used by PRM_VC_CFG_CHANNEL */
126#define OMAP4430_CMD_VDD_IVA_L_SHIFT 12
127#define OMAP4430_CMD_VDD_IVA_L_MASK BITFIELD(12, 12)
128
129/* Used by PRM_VC_CFG_CHANNEL */
130#define OMAP4430_CMD_VDD_MPU_L_SHIFT 17
131#define OMAP4430_CMD_VDD_MPU_L_MASK BITFIELD(17, 17)
132
133/* Used by PM_CORE_PWRSTCTRL */
134#define OMAP4430_CORE_OCMRAM_ONSTATE_SHIFT 18
135#define OMAP4430_CORE_OCMRAM_ONSTATE_MASK BITFIELD(18, 19)
136
137/* Used by PM_CORE_PWRSTCTRL */
138#define OMAP4430_CORE_OCMRAM_RETSTATE_SHIFT 9
139#define OMAP4430_CORE_OCMRAM_RETSTATE_MASK BITFIELD(9, 9)
140
141/* Used by PM_CORE_PWRSTST */
142#define OMAP4430_CORE_OCMRAM_STATEST_SHIFT 6
143#define OMAP4430_CORE_OCMRAM_STATEST_MASK BITFIELD(6, 7)
144
145/* Used by PM_CORE_PWRSTCTRL */
146#define OMAP4430_CORE_OTHER_BANK_ONSTATE_SHIFT 16
147#define OMAP4430_CORE_OTHER_BANK_ONSTATE_MASK BITFIELD(16, 17)
148
149/* Used by PM_CORE_PWRSTCTRL */
150#define OMAP4430_CORE_OTHER_BANK_RETSTATE_SHIFT 8
151#define OMAP4430_CORE_OTHER_BANK_RETSTATE_MASK BITFIELD(8, 8)
152
153/* Used by PM_CORE_PWRSTST */
154#define OMAP4430_CORE_OTHER_BANK_STATEST_SHIFT 4
155#define OMAP4430_CORE_OTHER_BANK_STATEST_MASK BITFIELD(4, 5)
156
157/* Used by PRM_VC_VAL_BYPASS */
158#define OMAP4430_DATA_SHIFT 16
159#define OMAP4430_DATA_MASK BITFIELD(16, 23)
160
161/* Used by PRM_DEVICE_OFF_CTRL */
162#define OMAP4430_DEVICE_OFF_ENABLE_SHIFT 0
163#define OMAP4430_DEVICE_OFF_ENABLE_MASK BITFIELD(0, 0)
164
165/* Used by PRM_VC_CFG_I2C_MODE */
166#define OMAP4430_DFILTEREN_SHIFT 6
167#define OMAP4430_DFILTEREN_MASK BITFIELD(6, 6)
168
169/* Used by PRM_IRQENABLE_MPU, PRM_IRQENABLE_TESLA */
170#define OMAP4430_DPLL_ABE_RECAL_EN_SHIFT 4
171#define OMAP4430_DPLL_ABE_RECAL_EN_MASK BITFIELD(4, 4)
172
173/* Used by PRM_IRQSTATUS_MPU, PRM_IRQSTATUS_TESLA */
174#define OMAP4430_DPLL_ABE_RECAL_ST_SHIFT 4
175#define OMAP4430_DPLL_ABE_RECAL_ST_MASK BITFIELD(4, 4)
176
177/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
178#define OMAP4430_DPLL_CORE_RECAL_EN_SHIFT 0
179#define OMAP4430_DPLL_CORE_RECAL_EN_MASK BITFIELD(0, 0)
180
181/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
182#define OMAP4430_DPLL_CORE_RECAL_ST_SHIFT 0
183#define OMAP4430_DPLL_CORE_RECAL_ST_MASK BITFIELD(0, 0)
184
185/* Used by PRM_IRQENABLE_MPU */
186#define OMAP4430_DPLL_DDRPHY_RECAL_EN_SHIFT 6
187#define OMAP4430_DPLL_DDRPHY_RECAL_EN_MASK BITFIELD(6, 6)
188
189/* Used by PRM_IRQSTATUS_MPU */
190#define OMAP4430_DPLL_DDRPHY_RECAL_ST_SHIFT 6
191#define OMAP4430_DPLL_DDRPHY_RECAL_ST_MASK BITFIELD(6, 6)
192
193/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU, PRM_IRQENABLE_TESLA */
194#define OMAP4430_DPLL_IVA_RECAL_EN_SHIFT 2
195#define OMAP4430_DPLL_IVA_RECAL_EN_MASK BITFIELD(2, 2)
196
197/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU, PRM_IRQSTATUS_TESLA */
198#define OMAP4430_DPLL_IVA_RECAL_ST_SHIFT 2
199#define OMAP4430_DPLL_IVA_RECAL_ST_MASK BITFIELD(2, 2)
200
201/* Used by PRM_IRQENABLE_MPU */
202#define OMAP4430_DPLL_MPU_RECAL_EN_SHIFT 1
203#define OMAP4430_DPLL_MPU_RECAL_EN_MASK BITFIELD(1, 1)
204
205/* Used by PRM_IRQSTATUS_MPU */
206#define OMAP4430_DPLL_MPU_RECAL_ST_SHIFT 1
207#define OMAP4430_DPLL_MPU_RECAL_ST_MASK BITFIELD(1, 1)
208
209/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
210#define OMAP4430_DPLL_PER_RECAL_EN_SHIFT 3
211#define OMAP4430_DPLL_PER_RECAL_EN_MASK BITFIELD(3, 3)
212
213/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
214#define OMAP4430_DPLL_PER_RECAL_ST_SHIFT 3
215#define OMAP4430_DPLL_PER_RECAL_ST_MASK BITFIELD(3, 3)
216
217/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
218#define OMAP4430_DPLL_UNIPRO_RECAL_EN_SHIFT 7
219#define OMAP4430_DPLL_UNIPRO_RECAL_EN_MASK BITFIELD(7, 7)
220
221/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
222#define OMAP4430_DPLL_UNIPRO_RECAL_ST_SHIFT 7
223#define OMAP4430_DPLL_UNIPRO_RECAL_ST_MASK BITFIELD(7, 7)
224
225/* Used by PRM_IRQENABLE_MPU */
226#define OMAP4430_DPLL_USB_RECAL_EN_SHIFT 5
227#define OMAP4430_DPLL_USB_RECAL_EN_MASK BITFIELD(5, 5)
228
229/* Used by PRM_IRQSTATUS_MPU */
230#define OMAP4430_DPLL_USB_RECAL_ST_SHIFT 5
231#define OMAP4430_DPLL_USB_RECAL_ST_MASK BITFIELD(5, 5)
232
233/* Used by PM_DSS_PWRSTCTRL */
234#define OMAP4430_DSS_MEM_ONSTATE_SHIFT 16
235#define OMAP4430_DSS_MEM_ONSTATE_MASK BITFIELD(16, 17)
236
237/* Used by PM_DSS_PWRSTCTRL */
238#define OMAP4430_DSS_MEM_RETSTATE_SHIFT 8
239#define OMAP4430_DSS_MEM_RETSTATE_MASK BITFIELD(8, 8)
240
241/* Used by PM_DSS_PWRSTST */
242#define OMAP4430_DSS_MEM_STATEST_SHIFT 4
243#define OMAP4430_DSS_MEM_STATEST_MASK BITFIELD(4, 5)
244
245/* Used by PM_CORE_PWRSTCTRL */
246#define OMAP4430_DUCATI_L2RAM_ONSTATE_SHIFT 20
247#define OMAP4430_DUCATI_L2RAM_ONSTATE_MASK BITFIELD(20, 21)
248
249/* Used by PM_CORE_PWRSTCTRL */
250#define OMAP4430_DUCATI_L2RAM_RETSTATE_SHIFT 10
251#define OMAP4430_DUCATI_L2RAM_RETSTATE_MASK BITFIELD(10, 10)
252
253/* Used by PM_CORE_PWRSTST */
254#define OMAP4430_DUCATI_L2RAM_STATEST_SHIFT 8
255#define OMAP4430_DUCATI_L2RAM_STATEST_MASK BITFIELD(8, 9)
256
257/* Used by PM_CORE_PWRSTCTRL */
258#define OMAP4430_DUCATI_UNICACHE_ONSTATE_SHIFT 22
259#define OMAP4430_DUCATI_UNICACHE_ONSTATE_MASK BITFIELD(22, 23)
260
261/* Used by PM_CORE_PWRSTCTRL */
262#define OMAP4430_DUCATI_UNICACHE_RETSTATE_SHIFT 11
263#define OMAP4430_DUCATI_UNICACHE_RETSTATE_MASK BITFIELD(11, 11)
264
265/* Used by PM_CORE_PWRSTST */
266#define OMAP4430_DUCATI_UNICACHE_STATEST_SHIFT 10
267#define OMAP4430_DUCATI_UNICACHE_STATEST_MASK BITFIELD(10, 11)
268
269/* Used by RM_MPU_RSTST */
270#define OMAP4430_EMULATION_RST_SHIFT 0
271#define OMAP4430_EMULATION_RST_MASK BITFIELD(0, 0)
272
273/* Used by RM_DUCATI_RSTST */
274#define OMAP4430_EMULATION_RST1ST_SHIFT 3
275#define OMAP4430_EMULATION_RST1ST_MASK BITFIELD(3, 3)
276
277/* Used by RM_DUCATI_RSTST */
278#define OMAP4430_EMULATION_RST2ST_SHIFT 4
279#define OMAP4430_EMULATION_RST2ST_MASK BITFIELD(4, 4)
280
281/* Used by RM_IVAHD_RSTST */
282#define OMAP4430_EMULATION_SEQ1_RST1ST_SHIFT 3
283#define OMAP4430_EMULATION_SEQ1_RST1ST_MASK BITFIELD(3, 3)
284
285/* Used by RM_IVAHD_RSTST */
286#define OMAP4430_EMULATION_SEQ2_RST2ST_SHIFT 4
287#define OMAP4430_EMULATION_SEQ2_RST2ST_MASK BITFIELD(4, 4)
288
289/* Used by PM_EMU_PWRSTCTRL */
290#define OMAP4430_EMU_BANK_ONSTATE_SHIFT 16
291#define OMAP4430_EMU_BANK_ONSTATE_MASK BITFIELD(16, 17)
292
293/* Used by PM_EMU_PWRSTST */
294#define OMAP4430_EMU_BANK_STATEST_SHIFT 4
295#define OMAP4430_EMU_BANK_STATEST_MASK BITFIELD(4, 5)
296
297/*
298 * Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_IVA_SETUP,
299 * PRM_LDO_SRAM_MPU_SETUP, PRM_SRAM_WKUP_SETUP
300 */
301#define OMAP4430_ENABLE_RTA_EXPORT_SHIFT 0
302#define OMAP4430_ENABLE_RTA_EXPORT_MASK BITFIELD(0, 0)
303
304/*
305 * Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_IVA_SETUP,
306 * PRM_LDO_SRAM_MPU_SETUP
307 */
308#define OMAP4430_ENFUNC1_SHIFT 3
309#define OMAP4430_ENFUNC1_MASK BITFIELD(3, 3)
310
311/*
312 * Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_IVA_SETUP,
313 * PRM_LDO_SRAM_MPU_SETUP
314 */
315#define OMAP4430_ENFUNC3_SHIFT 5
316#define OMAP4430_ENFUNC3_MASK BITFIELD(5, 5)
317
318/*
319 * Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_IVA_SETUP,
320 * PRM_LDO_SRAM_MPU_SETUP
321 */
322#define OMAP4430_ENFUNC4_SHIFT 6
323#define OMAP4430_ENFUNC4_MASK BITFIELD(6, 6)
324
325/*
326 * Used by PRM_LDO_SRAM_CORE_SETUP, PRM_LDO_SRAM_IVA_SETUP,
327 * PRM_LDO_SRAM_MPU_SETUP
328 */
329#define OMAP4430_ENFUNC5_SHIFT 7
330#define OMAP4430_ENFUNC5_MASK BITFIELD(7, 7)
331
332/* Used by PRM_VP_CORE_CONFIG, PRM_VP_IVA_CONFIG, PRM_VP_MPU_CONFIG */
333#define OMAP4430_ERRORGAIN_SHIFT 16
334#define OMAP4430_ERRORGAIN_MASK BITFIELD(16, 23)
335
336/* Used by PRM_VP_CORE_CONFIG, PRM_VP_IVA_CONFIG, PRM_VP_MPU_CONFIG */
337#define OMAP4430_ERROROFFSET_SHIFT 24
338#define OMAP4430_ERROROFFSET_MASK BITFIELD(24, 31)
339
340/* Used by PRM_RSTST */
341#define OMAP4430_EXTERNAL_WARM_RST_SHIFT 5
342#define OMAP4430_EXTERNAL_WARM_RST_MASK BITFIELD(5, 5)
343
344/* Used by PRM_VP_CORE_CONFIG, PRM_VP_IVA_CONFIG, PRM_VP_MPU_CONFIG */
345#define OMAP4430_FORCEUPDATE_SHIFT 1
346#define OMAP4430_FORCEUPDATE_MASK BITFIELD(1, 1)
347
348/* Used by PRM_VP_CORE_VOLTAGE, PRM_VP_IVA_VOLTAGE, PRM_VP_MPU_VOLTAGE */
349#define OMAP4430_FORCEUPDATEWAIT_SHIFT 8
350#define OMAP4430_FORCEUPDATEWAIT_MASK BITFIELD(8, 31)
351
352/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_TESLA */
353#define OMAP4430_FORCEWKUP_EN_SHIFT 10
354#define OMAP4430_FORCEWKUP_EN_MASK BITFIELD(10, 10)
355
356/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_TESLA */
357#define OMAP4430_FORCEWKUP_ST_SHIFT 10
358#define OMAP4430_FORCEWKUP_ST_MASK BITFIELD(10, 10)
359
360/* Used by PM_GFX_PWRSTCTRL */
361#define OMAP4430_GFX_MEM_ONSTATE_SHIFT 16
362#define OMAP4430_GFX_MEM_ONSTATE_MASK BITFIELD(16, 17)
363
364/* Used by PM_GFX_PWRSTST */
365#define OMAP4430_GFX_MEM_STATEST_SHIFT 4
366#define OMAP4430_GFX_MEM_STATEST_MASK BITFIELD(4, 5)
367
368/* Used by PRM_RSTST */
369#define OMAP4430_GLOBAL_COLD_RST_SHIFT 0
370#define OMAP4430_GLOBAL_COLD_RST_MASK BITFIELD(0, 0)
371
372/* Used by PRM_RSTST */
373#define OMAP4430_GLOBAL_WARM_SW_RST_SHIFT 1
374#define OMAP4430_GLOBAL_WARM_SW_RST_MASK BITFIELD(1, 1)
375
376/* Used by PRM_IO_PMCTRL */
377#define OMAP4430_GLOBAL_WUEN_SHIFT 16
378#define OMAP4430_GLOBAL_WUEN_MASK BITFIELD(16, 16)
379
380/* Used by PRM_VC_CFG_I2C_MODE */
381#define OMAP4430_HSMCODE_SHIFT 0
382#define OMAP4430_HSMCODE_MASK BITFIELD(0, 2)
383
384/* Used by PRM_VC_CFG_I2C_MODE */
385#define OMAP4430_HSMODEEN_SHIFT 3
386#define OMAP4430_HSMODEEN_MASK BITFIELD(3, 3)
387
388/* Used by PRM_VC_CFG_I2C_CLK */
389#define OMAP4430_HSSCLH_SHIFT 16
390#define OMAP4430_HSSCLH_MASK BITFIELD(16, 23)
391
392/* Used by PRM_VC_CFG_I2C_CLK */
393#define OMAP4430_HSSCLL_SHIFT 24
394#define OMAP4430_HSSCLL_MASK BITFIELD(24, 31)
395
396/* Used by PM_IVAHD_PWRSTCTRL */
397#define OMAP4430_HWA_MEM_ONSTATE_SHIFT 16
398#define OMAP4430_HWA_MEM_ONSTATE_MASK BITFIELD(16, 17)
399
400/* Used by PM_IVAHD_PWRSTCTRL */
401#define OMAP4430_HWA_MEM_RETSTATE_SHIFT 8
402#define OMAP4430_HWA_MEM_RETSTATE_MASK BITFIELD(8, 8)
403
404/* Used by PM_IVAHD_PWRSTST */
405#define OMAP4430_HWA_MEM_STATEST_SHIFT 4
406#define OMAP4430_HWA_MEM_STATEST_MASK BITFIELD(4, 5)
407
408/* Used by RM_MPU_RSTST */
409#define OMAP4430_ICECRUSHER_MPU_RST_SHIFT 1
410#define OMAP4430_ICECRUSHER_MPU_RST_MASK BITFIELD(1, 1)
411
412/* Used by RM_DUCATI_RSTST */
413#define OMAP4430_ICECRUSHER_RST1ST_SHIFT 5
414#define OMAP4430_ICECRUSHER_RST1ST_MASK BITFIELD(5, 5)
415
416/* Used by RM_DUCATI_RSTST */
417#define OMAP4430_ICECRUSHER_RST2ST_SHIFT 6
418#define OMAP4430_ICECRUSHER_RST2ST_MASK BITFIELD(6, 6)
419
420/* Used by RM_IVAHD_RSTST */
421#define OMAP4430_ICECRUSHER_SEQ1_RST1ST_SHIFT 5
422#define OMAP4430_ICECRUSHER_SEQ1_RST1ST_MASK BITFIELD(5, 5)
423
424/* Used by RM_IVAHD_RSTST */
425#define OMAP4430_ICECRUSHER_SEQ2_RST2ST_SHIFT 6
426#define OMAP4430_ICECRUSHER_SEQ2_RST2ST_MASK BITFIELD(6, 6)
427
428/* Used by PRM_RSTST */
429#define OMAP4430_ICEPICK_RST_SHIFT 9
430#define OMAP4430_ICEPICK_RST_MASK BITFIELD(9, 9)
431
432/* Used by PRM_VP_CORE_CONFIG, PRM_VP_IVA_CONFIG, PRM_VP_MPU_CONFIG */
433#define OMAP4430_INITVDD_SHIFT 2
434#define OMAP4430_INITVDD_MASK BITFIELD(2, 2)
435
436/* Used by PRM_VP_CORE_CONFIG, PRM_VP_IVA_CONFIG, PRM_VP_MPU_CONFIG */
437#define OMAP4430_INITVOLTAGE_SHIFT 8
438#define OMAP4430_INITVOLTAGE_MASK BITFIELD(8, 15)
439
440/*
441 * Used by PM_EMU_PWRSTST, PM_CORE_PWRSTST, PM_CAM_PWRSTST, PM_L3INIT_PWRSTST,
442 * PM_ABE_PWRSTST, PM_GFX_PWRSTST, PM_MPU_PWRSTST, PM_CEFUSE_PWRSTST,
443 * PM_DSS_PWRSTST, PM_L4PER_PWRSTST, PM_TESLA_PWRSTST, PM_IVAHD_PWRSTST
444 */
445#define OMAP4430_INTRANSITION_SHIFT 20
446#define OMAP4430_INTRANSITION_MASK BITFIELD(20, 20)
447
448/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
449#define OMAP4430_IO_EN_SHIFT 9
450#define OMAP4430_IO_EN_MASK BITFIELD(9, 9)
451
452/* Used by PRM_IO_PMCTRL */
453#define OMAP4430_IO_ON_STATUS_SHIFT 5
454#define OMAP4430_IO_ON_STATUS_MASK BITFIELD(5, 5)
455
456/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
457#define OMAP4430_IO_ST_SHIFT 9
458#define OMAP4430_IO_ST_MASK BITFIELD(9, 9)
459
460/* Used by PRM_IO_PMCTRL */
461#define OMAP4430_ISOCLK_OVERRIDE_SHIFT 0
462#define OMAP4430_ISOCLK_OVERRIDE_MASK BITFIELD(0, 0)
463
464/* Used by PRM_IO_PMCTRL */
465#define OMAP4430_ISOCLK_STATUS_SHIFT 1
466#define OMAP4430_ISOCLK_STATUS_MASK BITFIELD(1, 1)
467
468/* Used by PRM_IO_PMCTRL */
469#define OMAP4430_ISOOVR_EXTEND_SHIFT 4
470#define OMAP4430_ISOOVR_EXTEND_MASK BITFIELD(4, 4)
471
472/* Used by PRM_IO_COUNT */
473#define OMAP4430_ISO_2_ON_TIME_SHIFT 0
474#define OMAP4430_ISO_2_ON_TIME_MASK BITFIELD(0, 7)
475
476/* Used by PM_L3INIT_PWRSTCTRL */
477#define OMAP4430_L3INIT_BANK1_ONSTATE_SHIFT 16
478#define OMAP4430_L3INIT_BANK1_ONSTATE_MASK BITFIELD(16, 17)
479
480/* Used by PM_L3INIT_PWRSTCTRL */
481#define OMAP4430_L3INIT_BANK1_RETSTATE_SHIFT 8
482#define OMAP4430_L3INIT_BANK1_RETSTATE_MASK BITFIELD(8, 8)
483
484/* Used by PM_L3INIT_PWRSTST */
485#define OMAP4430_L3INIT_BANK1_STATEST_SHIFT 4
486#define OMAP4430_L3INIT_BANK1_STATEST_MASK BITFIELD(4, 5)
487
488/*
489 * Used by PM_CORE_PWRSTCTRL, PM_L3INIT_PWRSTCTRL, PM_ABE_PWRSTCTRL,
490 * PM_MPU_PWRSTCTRL, PM_DSS_PWRSTCTRL, PM_L4PER_PWRSTCTRL, PM_TESLA_PWRSTCTRL,
491 * PM_IVAHD_PWRSTCTRL
492 */
493#define OMAP4430_LOGICRETSTATE_SHIFT 2
494#define OMAP4430_LOGICRETSTATE_MASK BITFIELD(2, 2)
495
496/*
497 * Used by PM_EMU_PWRSTST, PM_CORE_PWRSTST, PM_CAM_PWRSTST, PM_L3INIT_PWRSTST,
498 * PM_ABE_PWRSTST, PM_GFX_PWRSTST, PM_MPU_PWRSTST, PM_CEFUSE_PWRSTST,
499 * PM_DSS_PWRSTST, PM_L4PER_PWRSTST, PM_TESLA_PWRSTST, PM_IVAHD_PWRSTST
500 */
501#define OMAP4430_LOGICSTATEST_SHIFT 2
502#define OMAP4430_LOGICSTATEST_MASK BITFIELD(2, 2)
503
504/*
505 * Used by RM_WKUP_GPIO1_CONTEXT, RM_WKUP_KEYBOARD_CONTEXT,
506 * RM_WKUP_L4WKUP_CONTEXT, RM_WKUP_RTC_CONTEXT, RM_WKUP_SARRAM_CONTEXT,
507 * RM_WKUP_SYNCTIMER_CONTEXT, RM_WKUP_TIMER12_CONTEXT, RM_WKUP_TIMER1_CONTEXT,
508 * RM_WKUP_USIM_CONTEXT, RM_WKUP_WDT1_CONTEXT, RM_WKUP_WDT2_CONTEXT,
509 * RM_EMU_DEBUGSS_CONTEXT, RM_D2D_SAD2D_CONTEXT, RM_D2D_SAD2D_FW_CONTEXT,
510 * RM_DUCATI_DUCATI_CONTEXT, RM_L3INSTR_L3_3_CONTEXT,
511 * RM_L3INSTR_L3_INSTR_CONTEXT, RM_L3INSTR_OCP_WP1_CONTEXT,
512 * RM_L3_1_L3_1_CONTEXT, RM_L3_2_L3_2_CONTEXT, RM_L3_2_OCMC_RAM_CONTEXT,
513 * RM_L4CFG_L4_CFG_CONTEXT, RM_L4CFG_SAR_ROM_CONTEXT, RM_MEMIF_DLL_CONTEXT,
514 * RM_MEMIF_DLL_H_CONTEXT, RM_MEMIF_DMM_CONTEXT, RM_MEMIF_EMIF_FW_CONTEXT,
515 * RM_CAM_FDIF_CONTEXT, RM_CAM_ISS_CONTEXT, RM_L3INIT_CCPTX_CONTEXT,
516 * RM_L3INIT_EMAC_CONTEXT, RM_L3INIT_P1500_CONTEXT, RM_L3INIT_PCIESS_CONTEXT,
517 * RM_L3INIT_SATA_CONTEXT, RM_L3INIT_TPPSS_CONTEXT, RM_L3INIT_UNIPRO1_CONTEXT,
518 * RM_L3INIT_USBPHYOCP2SCP_CONTEXT, RM_L3INIT_XHPI_CONTEXT,
519 * RM_ABE_AESS_CONTEXT, RM_ABE_DMIC_CONTEXT, RM_ABE_MCASP_CONTEXT,
520 * RM_ABE_MCBSP1_CONTEXT, RM_ABE_MCBSP2_CONTEXT, RM_ABE_MCBSP3_CONTEXT,
521 * RM_ABE_PDM_CONTEXT, RM_ABE_SLIMBUS_CONTEXT, RM_ABE_TIMER5_CONTEXT,
522 * RM_ABE_TIMER6_CONTEXT, RM_ABE_TIMER7_CONTEXT, RM_ABE_TIMER8_CONTEXT,
523 * RM_ABE_WDT3_CONTEXT, RM_GFX_GFX_CONTEXT, RM_MPU_MPU_CONTEXT,
524 * RM_CEFUSE_CEFUSE_CONTEXT, RM_ALWON_MDMINTC_CONTEXT,
525 * RM_ALWON_SR_CORE_CONTEXT, RM_ALWON_SR_IVA_CONTEXT, RM_ALWON_SR_MPU_CONTEXT,
526 * RM_DSS_DEISS_CONTEXT, RM_DSS_DSS_CONTEXT, RM_L4PER_ADC_CONTEXT,
527 * RM_L4PER_DMTIMER10_CONTEXT, RM_L4PER_DMTIMER11_CONTEXT,
528 * RM_L4PER_DMTIMER2_CONTEXT, RM_L4PER_DMTIMER3_CONTEXT,
529 * RM_L4PER_DMTIMER4_CONTEXT, RM_L4PER_DMTIMER9_CONTEXT, RM_L4PER_ELM_CONTEXT,
530 * RM_L4PER_HDQ1W_CONTEXT, RM_L4PER_HECC1_CONTEXT, RM_L4PER_HECC2_CONTEXT,
531 * RM_L4PER_I2C2_CONTEXT, RM_L4PER_I2C3_CONTEXT, RM_L4PER_I2C4_CONTEXT,
532 * RM_L4PER_I2C5_CONTEXT, RM_L4PER_L4_PER_CONTEXT, RM_L4PER_MCASP2_CONTEXT,
533 * RM_L4PER_MCASP3_CONTEXT, RM_L4PER_MCBSP4_CONTEXT, RM_L4PER_MCSPI1_CONTEXT,
534 * RM_L4PER_MCSPI2_CONTEXT, RM_L4PER_MCSPI3_CONTEXT, RM_L4PER_MCSPI4_CONTEXT,
535 * RM_L4PER_MGATE_CONTEXT, RM_L4PER_MMCSD3_CONTEXT, RM_L4PER_MMCSD4_CONTEXT,
536 * RM_L4PER_MMCSD5_CONTEXT, RM_L4PER_MSPROHG_CONTEXT,
537 * RM_L4PER_SLIMBUS2_CONTEXT, RM_L4SEC_PKAEIP29_CONTEXT,
538 * RM_TESLA_TESLA_CONTEXT, RM_IVAHD_IVAHD_CONTEXT, RM_IVAHD_SL2_CONTEXT
539 */
540#define OMAP4430_LOSTCONTEXT_DFF_SHIFT 0
541#define OMAP4430_LOSTCONTEXT_DFF_MASK BITFIELD(0, 0)
542
543/*
544 * Used by RM_D2D_MODEM_ICR_CONTEXT, RM_D2D_SAD2D_CONTEXT,
545 * RM_D2D_SAD2D_FW_CONTEXT, RM_DUCATI_DUCATI_CONTEXT, RM_L3INSTR_L3_3_CONTEXT,
546 * RM_L3INSTR_OCP_WP1_CONTEXT, RM_L3_1_L3_1_CONTEXT, RM_L3_2_GPMC_CONTEXT,
547 * RM_L3_2_L3_2_CONTEXT, RM_L4CFG_HW_SEM_CONTEXT, RM_L4CFG_L4_CFG_CONTEXT,
548 * RM_L4CFG_MAILBOX_CONTEXT, RM_MEMIF_DMM_CONTEXT, RM_MEMIF_EMIF_1_CONTEXT,
549 * RM_MEMIF_EMIF_2_CONTEXT, RM_MEMIF_EMIF_FW_CONTEXT, RM_MEMIF_EMIF_H1_CONTEXT,
550 * RM_MEMIF_EMIF_H2_CONTEXT, RM_SDMA_SDMA_CONTEXT, RM_L3INIT_HSI_CONTEXT,
551 * RM_L3INIT_MMC1_CONTEXT, RM_L3INIT_MMC2_CONTEXT, RM_L3INIT_MMC6_CONTEXT,
552 * RM_L3INIT_USB_HOST_CONTEXT, RM_L3INIT_USB_HOST_FS_CONTEXT,
553 * RM_L3INIT_USB_OTG_CONTEXT, RM_L3INIT_USB_TLL_CONTEXT, RM_DSS_DSS_CONTEXT,
554 * RM_L4PER_GPIO2_CONTEXT, RM_L4PER_GPIO3_CONTEXT, RM_L4PER_GPIO4_CONTEXT,
555 * RM_L4PER_GPIO5_CONTEXT, RM_L4PER_GPIO6_CONTEXT, RM_L4PER_I2C1_CONTEXT,
556 * RM_L4PER_L4_PER_CONTEXT, RM_L4PER_UART1_CONTEXT, RM_L4PER_UART2_CONTEXT,
557 * RM_L4PER_UART3_CONTEXT, RM_L4PER_UART4_CONTEXT, RM_L4SEC_AES1_CONTEXT,
558 * RM_L4SEC_AES2_CONTEXT, RM_L4SEC_CRYPTODMA_CONTEXT, RM_L4SEC_DES3DES_CONTEXT,
559 * RM_L4SEC_RNG_CONTEXT, RM_L4SEC_SHA2MD51_CONTEXT, RM_TESLA_TESLA_CONTEXT
560 */
561#define OMAP4430_LOSTCONTEXT_RFF_SHIFT 1
562#define OMAP4430_LOSTCONTEXT_RFF_MASK BITFIELD(1, 1)
563
564/* Used by RM_ABE_AESS_CONTEXT */
565#define OMAP4430_LOSTMEM_AESSMEM_SHIFT 8
566#define OMAP4430_LOSTMEM_AESSMEM_MASK BITFIELD(8, 8)
567
568/* Used by RM_CAM_FDIF_CONTEXT, RM_CAM_ISS_CONTEXT */
569#define OMAP4430_LOSTMEM_CAM_MEM_SHIFT 8
570#define OMAP4430_LOSTMEM_CAM_MEM_MASK BITFIELD(8, 8)
571
572/* Used by RM_L3INSTR_OCP_WP1_CONTEXT */
573#define OMAP4430_LOSTMEM_CORE_NRET_BANK_SHIFT 8
574#define OMAP4430_LOSTMEM_CORE_NRET_BANK_MASK BITFIELD(8, 8)
575
576/* Renamed from LOSTMEM_CORE_NRET_BANK Used by RM_MEMIF_DMM_CONTEXT */
577#define OMAP4430_LOSTMEM_CORE_NRET_BANK_9_9_SHIFT 9
578#define OMAP4430_LOSTMEM_CORE_NRET_BANK_9_9_MASK BITFIELD(9, 9)
579
580/* Used by RM_L3_2_OCMC_RAM_CONTEXT */
581#define OMAP4430_LOSTMEM_CORE_OCMRAM_SHIFT 8
582#define OMAP4430_LOSTMEM_CORE_OCMRAM_MASK BITFIELD(8, 8)
583
584/*
585 * Used by RM_D2D_MODEM_ICR_CONTEXT, RM_MEMIF_DMM_CONTEXT,
586 * RM_SDMA_SDMA_CONTEXT
587 */
588#define OMAP4430_LOSTMEM_CORE_OTHER_BANK_SHIFT 8
589#define OMAP4430_LOSTMEM_CORE_OTHER_BANK_MASK BITFIELD(8, 8)
590
591/* Used by RM_DSS_DEISS_CONTEXT, RM_DSS_DSS_CONTEXT */
592#define OMAP4430_LOSTMEM_DSS_MEM_SHIFT 8
593#define OMAP4430_LOSTMEM_DSS_MEM_MASK BITFIELD(8, 8)
594
595/* Used by RM_DUCATI_DUCATI_CONTEXT */
596#define OMAP4430_LOSTMEM_DUCATI_L2RAM_SHIFT 9
597#define OMAP4430_LOSTMEM_DUCATI_L2RAM_MASK BITFIELD(9, 9)
598
599/* Used by RM_DUCATI_DUCATI_CONTEXT */
600#define OMAP4430_LOSTMEM_DUCATI_UNICACHE_SHIFT 8
601#define OMAP4430_LOSTMEM_DUCATI_UNICACHE_MASK BITFIELD(8, 8)
602
603/* Used by RM_EMU_DEBUGSS_CONTEXT */
604#define OMAP4430_LOSTMEM_EMU_BANK_SHIFT 8
605#define OMAP4430_LOSTMEM_EMU_BANK_MASK BITFIELD(8, 8)
606
607/* Used by RM_GFX_GFX_CONTEXT */
608#define OMAP4430_LOSTMEM_GFX_MEM_SHIFT 8
609#define OMAP4430_LOSTMEM_GFX_MEM_MASK BITFIELD(8, 8)
610
611/* Used by RM_IVAHD_IVAHD_CONTEXT */
612#define OMAP4430_LOSTMEM_HWA_MEM_SHIFT 10
613#define OMAP4430_LOSTMEM_HWA_MEM_MASK BITFIELD(10, 10)
614
615/*
616 * Used by RM_L3INIT_CCPTX_CONTEXT, RM_L3INIT_EMAC_CONTEXT,
617 * RM_L3INIT_HSI_CONTEXT, RM_L3INIT_MMC1_CONTEXT, RM_L3INIT_MMC2_CONTEXT,
618 * RM_L3INIT_MMC6_CONTEXT, RM_L3INIT_PCIESS_CONTEXT, RM_L3INIT_SATA_CONTEXT,
619 * RM_L3INIT_TPPSS_CONTEXT, RM_L3INIT_UNIPRO1_CONTEXT,
620 * RM_L3INIT_USB_OTG_CONTEXT, RM_L3INIT_XHPI_CONTEXT
621 */
622#define OMAP4430_LOSTMEM_L3INIT_BANK1_SHIFT 8
623#define OMAP4430_LOSTMEM_L3INIT_BANK1_MASK BITFIELD(8, 8)
624
625/* Used by RM_MPU_MPU_CONTEXT */
626#define OMAP4430_LOSTMEM_MPU_L1_SHIFT 8
627#define OMAP4430_LOSTMEM_MPU_L1_MASK BITFIELD(8, 8)
628
629/* Used by RM_MPU_MPU_CONTEXT */
630#define OMAP4430_LOSTMEM_MPU_L2_SHIFT 9
631#define OMAP4430_LOSTMEM_MPU_L2_MASK BITFIELD(9, 9)
632
633/* Used by RM_MPU_MPU_CONTEXT */
634#define OMAP4430_LOSTMEM_MPU_RAM_SHIFT 10
635#define OMAP4430_LOSTMEM_MPU_RAM_MASK BITFIELD(10, 10)
636
637/*
638 * Used by RM_L4PER_HECC1_CONTEXT, RM_L4PER_HECC2_CONTEXT,
639 * RM_L4PER_MCBSP4_CONTEXT, RM_L4PER_MMCSD3_CONTEXT, RM_L4PER_MMCSD4_CONTEXT,
640 * RM_L4PER_MMCSD5_CONTEXT, RM_L4PER_SLIMBUS2_CONTEXT, RM_L4SEC_PKAEIP29_CONTEXT
641 */
642#define OMAP4430_LOSTMEM_NONRETAINED_BANK_SHIFT 8
643#define OMAP4430_LOSTMEM_NONRETAINED_BANK_MASK BITFIELD(8, 8)
644
645/*
646 * Used by RM_ABE_DMIC_CONTEXT, RM_ABE_MCBSP1_CONTEXT, RM_ABE_MCBSP2_CONTEXT,
647 * RM_ABE_MCBSP3_CONTEXT, RM_ABE_PDM_CONTEXT, RM_ABE_SLIMBUS_CONTEXT
648 */
649#define OMAP4430_LOSTMEM_PERIHPMEM_SHIFT 8
650#define OMAP4430_LOSTMEM_PERIHPMEM_MASK BITFIELD(8, 8)
651
652/*
653 * Used by RM_L4PER_MSPROHG_CONTEXT, RM_L4PER_UART1_CONTEXT,
654 * RM_L4PER_UART2_CONTEXT, RM_L4PER_UART3_CONTEXT, RM_L4PER_UART4_CONTEXT,
655 * RM_L4SEC_CRYPTODMA_CONTEXT
656 */
657#define OMAP4430_LOSTMEM_RETAINED_BANK_SHIFT 8
658#define OMAP4430_LOSTMEM_RETAINED_BANK_MASK BITFIELD(8, 8)
659
660/* Used by RM_IVAHD_SL2_CONTEXT */
661#define OMAP4430_LOSTMEM_SL2_MEM_SHIFT 8
662#define OMAP4430_LOSTMEM_SL2_MEM_MASK BITFIELD(8, 8)
663
664/* Used by RM_IVAHD_IVAHD_CONTEXT */
665#define OMAP4430_LOSTMEM_TCM1_MEM_SHIFT 8
666#define OMAP4430_LOSTMEM_TCM1_MEM_MASK BITFIELD(8, 8)
667
668/* Used by RM_IVAHD_IVAHD_CONTEXT */
669#define OMAP4430_LOSTMEM_TCM2_MEM_SHIFT 9
670#define OMAP4430_LOSTMEM_TCM2_MEM_MASK BITFIELD(9, 9)
671
672/* Used by RM_TESLA_TESLA_CONTEXT */
673#define OMAP4430_LOSTMEM_TESLA_EDMA_SHIFT 10
674#define OMAP4430_LOSTMEM_TESLA_EDMA_MASK BITFIELD(10, 10)
675
676/* Used by RM_TESLA_TESLA_CONTEXT */
677#define OMAP4430_LOSTMEM_TESLA_L1_SHIFT 8
678#define OMAP4430_LOSTMEM_TESLA_L1_MASK BITFIELD(8, 8)
679
680/* Used by RM_TESLA_TESLA_CONTEXT */
681#define OMAP4430_LOSTMEM_TESLA_L2_SHIFT 9
682#define OMAP4430_LOSTMEM_TESLA_L2_MASK BITFIELD(9, 9)
683
684/* Used by RM_WKUP_SARRAM_CONTEXT */
685#define OMAP4430_LOSTMEM_WKUP_BANK_SHIFT 8
686#define OMAP4430_LOSTMEM_WKUP_BANK_MASK BITFIELD(8, 8)
687
688/*
689 * Used by PM_CORE_PWRSTCTRL, PM_CAM_PWRSTCTRL, PM_L3INIT_PWRSTCTRL,
690 * PM_ABE_PWRSTCTRL, PM_GFX_PWRSTCTRL, PM_MPU_PWRSTCTRL, PM_CEFUSE_PWRSTCTRL,
691 * PM_DSS_PWRSTCTRL, PM_L4PER_PWRSTCTRL, PM_TESLA_PWRSTCTRL, PM_IVAHD_PWRSTCTRL
692 */
693#define OMAP4430_LOWPOWERSTATECHANGE_SHIFT 4
694#define OMAP4430_LOWPOWERSTATECHANGE_MASK BITFIELD(4, 4)
695
696/* Used by PM_CORE_PWRSTCTRL */
697#define OMAP4430_MEMORYCHANGE_SHIFT 3
698#define OMAP4430_MEMORYCHANGE_MASK BITFIELD(3, 3)
699
700/* Used by PRM_MODEM_IF_CTRL */
701#define OMAP4430_MODEM_READY_SHIFT 1
702#define OMAP4430_MODEM_READY_MASK BITFIELD(1, 1)
703
704/* Used by PRM_MODEM_IF_CTRL */
705#define OMAP4430_MODEM_SHUTDOWN_IRQ_SHIFT 9
706#define OMAP4430_MODEM_SHUTDOWN_IRQ_MASK BITFIELD(9, 9)
707
708/* Used by PRM_MODEM_IF_CTRL */
709#define OMAP4430_MODEM_SLEEP_ST_SHIFT 16
710#define OMAP4430_MODEM_SLEEP_ST_MASK BITFIELD(16, 16)
711
712/* Used by PRM_MODEM_IF_CTRL */
713#define OMAP4430_MODEM_WAKE_IRQ_SHIFT 8
714#define OMAP4430_MODEM_WAKE_IRQ_MASK BITFIELD(8, 8)
715
716/* Used by PM_MPU_PWRSTCTRL */
717#define OMAP4430_MPU_L1_ONSTATE_SHIFT 16
718#define OMAP4430_MPU_L1_ONSTATE_MASK BITFIELD(16, 17)
719
720/* Used by PM_MPU_PWRSTCTRL */
721#define OMAP4430_MPU_L1_RETSTATE_SHIFT 8
722#define OMAP4430_MPU_L1_RETSTATE_MASK BITFIELD(8, 8)
723
724/* Used by PM_MPU_PWRSTST */
725#define OMAP4430_MPU_L1_STATEST_SHIFT 4
726#define OMAP4430_MPU_L1_STATEST_MASK BITFIELD(4, 5)
727
728/* Used by PM_MPU_PWRSTCTRL */
729#define OMAP4430_MPU_L2_ONSTATE_SHIFT 18
730#define OMAP4430_MPU_L2_ONSTATE_MASK BITFIELD(18, 19)
731
732/* Used by PM_MPU_PWRSTCTRL */
733#define OMAP4430_MPU_L2_RETSTATE_SHIFT 9
734#define OMAP4430_MPU_L2_RETSTATE_MASK BITFIELD(9, 9)
735
736/* Used by PM_MPU_PWRSTST */
737#define OMAP4430_MPU_L2_STATEST_SHIFT 6
738#define OMAP4430_MPU_L2_STATEST_MASK BITFIELD(6, 7)
739
740/* Used by PM_MPU_PWRSTCTRL */
741#define OMAP4430_MPU_RAM_ONSTATE_SHIFT 20
742#define OMAP4430_MPU_RAM_ONSTATE_MASK BITFIELD(20, 21)
743
744/* Used by PM_MPU_PWRSTCTRL */
745#define OMAP4430_MPU_RAM_RETSTATE_SHIFT 10
746#define OMAP4430_MPU_RAM_RETSTATE_MASK BITFIELD(10, 10)
747
748/* Used by PM_MPU_PWRSTST */
749#define OMAP4430_MPU_RAM_STATEST_SHIFT 8
750#define OMAP4430_MPU_RAM_STATEST_MASK BITFIELD(8, 9)
751
752/* Used by PRM_RSTST */
753#define OMAP4430_MPU_SECURITY_VIOL_RST_SHIFT 2
754#define OMAP4430_MPU_SECURITY_VIOL_RST_MASK BITFIELD(2, 2)
755
756/* Used by PRM_RSTST */
757#define OMAP4430_MPU_WDT_RST_SHIFT 3
758#define OMAP4430_MPU_WDT_RST_MASK BITFIELD(3, 3)
759
760/* Used by PM_L4PER_PWRSTCTRL */
761#define OMAP4430_NONRETAINED_BANK_ONSTATE_SHIFT 18
762#define OMAP4430_NONRETAINED_BANK_ONSTATE_MASK BITFIELD(18, 19)
763
764/* Used by PM_L4PER_PWRSTCTRL */
765#define OMAP4430_NONRETAINED_BANK_RETSTATE_SHIFT 9
766#define OMAP4430_NONRETAINED_BANK_RETSTATE_MASK BITFIELD(9, 9)
767
768/* Used by PM_L4PER_PWRSTST */
769#define OMAP4430_NONRETAINED_BANK_STATEST_SHIFT 6
770#define OMAP4430_NONRETAINED_BANK_STATEST_MASK BITFIELD(6, 7)
771
772/* Used by PM_CORE_PWRSTCTRL */
773#define OMAP4430_OCP_NRET_BANK_ONSTATE_SHIFT 24
774#define OMAP4430_OCP_NRET_BANK_ONSTATE_MASK BITFIELD(24, 25)
775
776/* Used by PM_CORE_PWRSTCTRL */
777#define OMAP4430_OCP_NRET_BANK_RETSTATE_SHIFT 12
778#define OMAP4430_OCP_NRET_BANK_RETSTATE_MASK BITFIELD(12, 12)
779
780/* Used by PM_CORE_PWRSTST */
781#define OMAP4430_OCP_NRET_BANK_STATEST_SHIFT 12
782#define OMAP4430_OCP_NRET_BANK_STATEST_MASK BITFIELD(12, 13)
783
784/*
785 * Used by PRM_VC_VAL_CMD_VDD_CORE_L, PRM_VC_VAL_CMD_VDD_IVA_L,
786 * PRM_VC_VAL_CMD_VDD_MPU_L
787 */
788#define OMAP4430_OFF_SHIFT 0
789#define OMAP4430_OFF_MASK BITFIELD(0, 7)
790
791/* Used by PRM_LDO_BANDGAP_CTRL */
792#define OMAP4430_OFF_ENABLE_SHIFT 0
793#define OMAP4430_OFF_ENABLE_MASK BITFIELD(0, 0)
794
795/*
796 * Used by PRM_VC_VAL_CMD_VDD_CORE_L, PRM_VC_VAL_CMD_VDD_IVA_L,
797 * PRM_VC_VAL_CMD_VDD_MPU_L
798 */
799#define OMAP4430_ON_SHIFT 24
800#define OMAP4430_ON_MASK BITFIELD(24, 31)
801
802/*
803 * Used by PRM_VC_VAL_CMD_VDD_CORE_L, PRM_VC_VAL_CMD_VDD_IVA_L,
804 * PRM_VC_VAL_CMD_VDD_MPU_L
805 */
806#define OMAP4430_ONLP_SHIFT 16
807#define OMAP4430_ONLP_MASK BITFIELD(16, 23)
808
809/* Used by PRM_LDO_ABB_IVA_CTRL, PRM_LDO_ABB_MPU_CTRL */
810#define OMAP4430_OPP_CHANGE_SHIFT 2
811#define OMAP4430_OPP_CHANGE_MASK BITFIELD(2, 2)
812
813/* Used by PRM_LDO_ABB_IVA_CTRL, PRM_LDO_ABB_MPU_CTRL */
814#define OMAP4430_OPP_SEL_SHIFT 0
815#define OMAP4430_OPP_SEL_MASK BITFIELD(0, 1)
816
817/* Used by PRM_SRAM_COUNT */
818#define OMAP4430_PCHARGECNT_VALUE_SHIFT 0
819#define OMAP4430_PCHARGECNT_VALUE_MASK BITFIELD(0, 5)
820
821/* Used by PRM_PSCON_COUNT */
822#define OMAP4430_PCHARGE_TIME_SHIFT 0
823#define OMAP4430_PCHARGE_TIME_MASK BITFIELD(0, 7)
824
825/* Used by PM_ABE_PWRSTCTRL */
826#define OMAP4430_PERIPHMEM_ONSTATE_SHIFT 20
827#define OMAP4430_PERIPHMEM_ONSTATE_MASK BITFIELD(20, 21)
828
829/* Used by PM_ABE_PWRSTCTRL */
830#define OMAP4430_PERIPHMEM_RETSTATE_SHIFT 10
831#define OMAP4430_PERIPHMEM_RETSTATE_MASK BITFIELD(10, 10)
832
833/* Used by PM_ABE_PWRSTST */
834#define OMAP4430_PERIPHMEM_STATEST_SHIFT 8
835#define OMAP4430_PERIPHMEM_STATEST_MASK BITFIELD(8, 9)
836
837/* Used by PRM_PHASE1_CNDP */
838#define OMAP4430_PHASE1_CNDP_SHIFT 0
839#define OMAP4430_PHASE1_CNDP_MASK BITFIELD(0, 31)
840
841/* Used by PRM_PHASE2A_CNDP */
842#define OMAP4430_PHASE2A_CNDP_SHIFT 0
843#define OMAP4430_PHASE2A_CNDP_MASK BITFIELD(0, 31)
844
845/* Used by PRM_PHASE2B_CNDP */
846#define OMAP4430_PHASE2B_CNDP_SHIFT 0
847#define OMAP4430_PHASE2B_CNDP_MASK BITFIELD(0, 31)
848
849/* Used by PRM_PSCON_COUNT */
850#define OMAP4430_PONOUT_2_PGOODIN_TIME_SHIFT 8
851#define OMAP4430_PONOUT_2_PGOODIN_TIME_MASK BITFIELD(8, 15)
852
853/*
854 * Used by PM_EMU_PWRSTCTRL, PM_CORE_PWRSTCTRL, PM_CAM_PWRSTCTRL,
855 * PM_L3INIT_PWRSTCTRL, PM_ABE_PWRSTCTRL, PM_GFX_PWRSTCTRL, PM_MPU_PWRSTCTRL,
856 * PM_CEFUSE_PWRSTCTRL, PM_DSS_PWRSTCTRL, PM_L4PER_PWRSTCTRL,
857 * PM_TESLA_PWRSTCTRL, PM_IVAHD_PWRSTCTRL
858 */
859#define OMAP4430_POWERSTATE_SHIFT 0
860#define OMAP4430_POWERSTATE_MASK BITFIELD(0, 1)
861
862/*
863 * Used by PM_EMU_PWRSTST, PM_CORE_PWRSTST, PM_CAM_PWRSTST, PM_L3INIT_PWRSTST,
864 * PM_ABE_PWRSTST, PM_GFX_PWRSTST, PM_MPU_PWRSTST, PM_CEFUSE_PWRSTST,
865 * PM_DSS_PWRSTST, PM_L4PER_PWRSTST, PM_TESLA_PWRSTST, PM_IVAHD_PWRSTST
866 */
867#define OMAP4430_POWERSTATEST_SHIFT 0
868#define OMAP4430_POWERSTATEST_MASK BITFIELD(0, 1)
869
870/* Used by PRM_PWRREQCTRL */
871#define OMAP4430_PWRREQ_COND_SHIFT 0
872#define OMAP4430_PWRREQ_COND_MASK BITFIELD(0, 1)
873
874/* Used by PRM_VC_CFG_CHANNEL */
875#define OMAP4430_RACEN_VDD_CORE_L_SHIFT 3
876#define OMAP4430_RACEN_VDD_CORE_L_MASK BITFIELD(3, 3)
877
878/* Used by PRM_VC_CFG_CHANNEL */
879#define OMAP4430_RACEN_VDD_IVA_L_SHIFT 11
880#define OMAP4430_RACEN_VDD_IVA_L_MASK BITFIELD(11, 11)
881
882/* Used by PRM_VC_CFG_CHANNEL */
883#define OMAP4430_RACEN_VDD_MPU_L_SHIFT 20
884#define OMAP4430_RACEN_VDD_MPU_L_MASK BITFIELD(20, 20)
885
886/* Used by PRM_VC_CFG_CHANNEL */
887#define OMAP4430_RAC_VDD_CORE_L_SHIFT 2
888#define OMAP4430_RAC_VDD_CORE_L_MASK BITFIELD(2, 2)
889
890/* Used by PRM_VC_CFG_CHANNEL */
891#define OMAP4430_RAC_VDD_IVA_L_SHIFT 10
892#define OMAP4430_RAC_VDD_IVA_L_MASK BITFIELD(10, 10)
893
894/* Used by PRM_VC_CFG_CHANNEL */
895#define OMAP4430_RAC_VDD_MPU_L_SHIFT 19
896#define OMAP4430_RAC_VDD_MPU_L_MASK BITFIELD(19, 19)
897
898/*
899 * Used by PRM_VOLTSETUP_CORE_OFF, PRM_VOLTSETUP_CORE_RET_SLEEP,
900 * PRM_VOLTSETUP_IVA_OFF, PRM_VOLTSETUP_IVA_RET_SLEEP, PRM_VOLTSETUP_MPU_OFF,
901 * PRM_VOLTSETUP_MPU_RET_SLEEP
902 */
903#define OMAP4430_RAMP_DOWN_COUNT_SHIFT 16
904#define OMAP4430_RAMP_DOWN_COUNT_MASK BITFIELD(16, 21)
905
906/*
907 * Used by PRM_VOLTSETUP_CORE_OFF, PRM_VOLTSETUP_CORE_RET_SLEEP,
908 * PRM_VOLTSETUP_IVA_OFF, PRM_VOLTSETUP_IVA_RET_SLEEP, PRM_VOLTSETUP_MPU_OFF,
909 * PRM_VOLTSETUP_MPU_RET_SLEEP
910 */
911#define OMAP4430_RAMP_DOWN_PRESCAL_SHIFT 24
912#define OMAP4430_RAMP_DOWN_PRESCAL_MASK BITFIELD(24, 25)
913
914/*
915 * Used by PRM_VOLTSETUP_CORE_OFF, PRM_VOLTSETUP_CORE_RET_SLEEP,
916 * PRM_VOLTSETUP_IVA_OFF, PRM_VOLTSETUP_IVA_RET_SLEEP, PRM_VOLTSETUP_MPU_OFF,
917 * PRM_VOLTSETUP_MPU_RET_SLEEP
918 */
919#define OMAP4430_RAMP_UP_COUNT_SHIFT 0
920#define OMAP4430_RAMP_UP_COUNT_MASK BITFIELD(0, 5)
921
922/*
923 * Used by PRM_VOLTSETUP_CORE_OFF, PRM_VOLTSETUP_CORE_RET_SLEEP,
924 * PRM_VOLTSETUP_IVA_OFF, PRM_VOLTSETUP_IVA_RET_SLEEP, PRM_VOLTSETUP_MPU_OFF,
925 * PRM_VOLTSETUP_MPU_RET_SLEEP
926 */
927#define OMAP4430_RAMP_UP_PRESCAL_SHIFT 8
928#define OMAP4430_RAMP_UP_PRESCAL_MASK BITFIELD(8, 9)
929
930/* Used by PRM_VC_CFG_CHANNEL */
931#define OMAP4430_RAV_VDD_CORE_L_SHIFT 1
932#define OMAP4430_RAV_VDD_CORE_L_MASK BITFIELD(1, 1)
933
934/* Used by PRM_VC_CFG_CHANNEL */
935#define OMAP4430_RAV_VDD_IVA_L_SHIFT 9
936#define OMAP4430_RAV_VDD_IVA_L_MASK BITFIELD(9, 9)
937
938/* Used by PRM_VC_CFG_CHANNEL */
939#define OMAP4430_RAV_VDD_MPU_L_SHIFT 18
940#define OMAP4430_RAV_VDD_MPU_L_MASK BITFIELD(18, 18)
941
942/* Used by PRM_VC_VAL_BYPASS */
943#define OMAP4430_REGADDR_SHIFT 8
944#define OMAP4430_REGADDR_MASK BITFIELD(8, 15)
945
946/*
947 * Used by PRM_VC_VAL_CMD_VDD_CORE_L, PRM_VC_VAL_CMD_VDD_IVA_L,
948 * PRM_VC_VAL_CMD_VDD_MPU_L
949 */
950#define OMAP4430_RET_SHIFT 8
951#define OMAP4430_RET_MASK BITFIELD(8, 15)
952
953/* Used by PM_L4PER_PWRSTCTRL */
954#define OMAP4430_RETAINED_BANK_ONSTATE_SHIFT 16
955#define OMAP4430_RETAINED_BANK_ONSTATE_MASK BITFIELD(16, 17)
956
957/* Used by PM_L4PER_PWRSTCTRL */
958#define OMAP4430_RETAINED_BANK_RETSTATE_SHIFT 8
959#define OMAP4430_RETAINED_BANK_RETSTATE_MASK BITFIELD(8, 8)
960
961/* Used by PM_L4PER_PWRSTST */
962#define OMAP4430_RETAINED_BANK_STATEST_SHIFT 4
963#define OMAP4430_RETAINED_BANK_STATEST_MASK BITFIELD(4, 5)
964
965/*
966 * Used by PRM_LDO_SRAM_CORE_CTRL, PRM_LDO_SRAM_IVA_CTRL,
967 * PRM_LDO_SRAM_MPU_CTRL
968 */
969#define OMAP4430_RETMODE_ENABLE_SHIFT 0
970#define OMAP4430_RETMODE_ENABLE_MASK BITFIELD(0, 0)
971
972/* Used by REVISION_PRM */
973#define OMAP4430_REV_SHIFT 0
974#define OMAP4430_REV_MASK BITFIELD(0, 7)
975
976/* Used by RM_DUCATI_RSTCTRL, RM_TESLA_RSTCTRL, RM_IVAHD_RSTCTRL */
977#define OMAP4430_RST1_SHIFT 0
978#define OMAP4430_RST1_MASK BITFIELD(0, 0)
979
980/* Used by RM_DUCATI_RSTST, RM_TESLA_RSTST, RM_IVAHD_RSTST */
981#define OMAP4430_RST1ST_SHIFT 0
982#define OMAP4430_RST1ST_MASK BITFIELD(0, 0)
983
984/* Used by RM_DUCATI_RSTCTRL, RM_TESLA_RSTCTRL, RM_IVAHD_RSTCTRL */
985#define OMAP4430_RST2_SHIFT 1
986#define OMAP4430_RST2_MASK BITFIELD(1, 1)
987
988/* Used by RM_DUCATI_RSTST, RM_TESLA_RSTST, RM_IVAHD_RSTST */
989#define OMAP4430_RST2ST_SHIFT 1
990#define OMAP4430_RST2ST_MASK BITFIELD(1, 1)
991
992/* Used by RM_DUCATI_RSTCTRL, RM_IVAHD_RSTCTRL */
993#define OMAP4430_RST3_SHIFT 2
994#define OMAP4430_RST3_MASK BITFIELD(2, 2)
995
996/* Used by RM_DUCATI_RSTST, RM_IVAHD_RSTST */
997#define OMAP4430_RST3ST_SHIFT 2
998#define OMAP4430_RST3ST_MASK BITFIELD(2, 2)
999
1000/* Used by PRM_RSTTIME */
1001#define OMAP4430_RSTTIME1_SHIFT 0
1002#define OMAP4430_RSTTIME1_MASK BITFIELD(0, 9)
1003
1004/* Used by PRM_RSTTIME */
1005#define OMAP4430_RSTTIME2_SHIFT 10
1006#define OMAP4430_RSTTIME2_MASK BITFIELD(10, 14)
1007
1008/* Used by PRM_RSTCTRL */
1009#define OMAP4430_RST_GLOBAL_COLD_SW_SHIFT 1
1010#define OMAP4430_RST_GLOBAL_COLD_SW_MASK BITFIELD(1, 1)
1011
1012/* Used by PRM_RSTCTRL */
1013#define OMAP4430_RST_GLOBAL_WARM_SW_SHIFT 0
1014#define OMAP4430_RST_GLOBAL_WARM_SW_MASK BITFIELD(0, 0)
1015
1016/* Used by PRM_VC_CFG_CHANNEL */
1017#define OMAP4430_SA_VDD_CORE_L_SHIFT 0
1018#define OMAP4430_SA_VDD_CORE_L_MASK BITFIELD(0, 0)
1019
1020/* Renamed from SA_VDD_CORE_L Used by PRM_VC_SMPS_SA */
1021#define OMAP4430_SA_VDD_CORE_L_0_6_SHIFT 0
1022#define OMAP4430_SA_VDD_CORE_L_0_6_MASK BITFIELD(0, 6)
1023
1024/* Used by PRM_VC_CFG_CHANNEL */
1025#define OMAP4430_SA_VDD_IVA_L_SHIFT 8
1026#define OMAP4430_SA_VDD_IVA_L_MASK BITFIELD(8, 8)
1027
1028/* Renamed from SA_VDD_IVA_L Used by PRM_VC_SMPS_SA */
1029#define OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_SHIFT 8
1030#define OMAP4430_SA_VDD_IVA_L_PRM_VC_SMPS_SA_MASK BITFIELD(8, 14)
1031
1032/* Used by PRM_VC_CFG_CHANNEL */
1033#define OMAP4430_SA_VDD_MPU_L_SHIFT 16
1034#define OMAP4430_SA_VDD_MPU_L_MASK BITFIELD(16, 16)
1035
1036/* Renamed from SA_VDD_MPU_L Used by PRM_VC_SMPS_SA */
1037#define OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_SHIFT 16
1038#define OMAP4430_SA_VDD_MPU_L_PRM_VC_SMPS_SA_MASK BITFIELD(16, 22)
1039
1040/* Used by PRM_VC_CFG_I2C_CLK */
1041#define OMAP4430_SCLH_SHIFT 0
1042#define OMAP4430_SCLH_MASK BITFIELD(0, 7)
1043
1044/* Used by PRM_VC_CFG_I2C_CLK */
1045#define OMAP4430_SCLL_SHIFT 8
1046#define OMAP4430_SCLL_MASK BITFIELD(8, 15)
1047
1048/* Used by PRM_RSTST */
1049#define OMAP4430_SECURE_WDT_RST_SHIFT 4
1050#define OMAP4430_SECURE_WDT_RST_MASK BITFIELD(4, 4)
1051
1052/* Used by PM_IVAHD_PWRSTCTRL */
1053#define OMAP4430_SL2_MEM_ONSTATE_SHIFT 18
1054#define OMAP4430_SL2_MEM_ONSTATE_MASK BITFIELD(18, 19)
1055
1056/* Used by PM_IVAHD_PWRSTCTRL */
1057#define OMAP4430_SL2_MEM_RETSTATE_SHIFT 9
1058#define OMAP4430_SL2_MEM_RETSTATE_MASK BITFIELD(9, 9)
1059
1060/* Used by PM_IVAHD_PWRSTST */
1061#define OMAP4430_SL2_MEM_STATEST_SHIFT 6
1062#define OMAP4430_SL2_MEM_STATEST_MASK BITFIELD(6, 7)
1063
1064/* Used by PRM_VC_VAL_BYPASS */
1065#define OMAP4430_SLAVEADDR_SHIFT 0
1066#define OMAP4430_SLAVEADDR_MASK BITFIELD(0, 6)
1067
1068/* Used by PRM_LDO_ABB_IVA_SETUP, PRM_LDO_ABB_MPU_SETUP */
1069#define OMAP4430_SLEEP_RBB_SEL_SHIFT 3
1070#define OMAP4430_SLEEP_RBB_SEL_MASK BITFIELD(3, 3)
1071
1072/* Used by PRM_SRAM_COUNT */
1073#define OMAP4430_SLPCNT_VALUE_SHIFT 16
1074#define OMAP4430_SLPCNT_VALUE_MASK BITFIELD(16, 23)
1075
1076/* Used by PRM_VP_CORE_VSTEPMAX, PRM_VP_IVA_VSTEPMAX, PRM_VP_MPU_VSTEPMAX */
1077#define OMAP4430_SMPSWAITTIMEMAX_SHIFT 8
1078#define OMAP4430_SMPSWAITTIMEMAX_MASK BITFIELD(8, 23)
1079
1080/* Used by PRM_VP_CORE_VSTEPMIN, PRM_VP_IVA_VSTEPMIN, PRM_VP_MPU_VSTEPMIN */
1081#define OMAP4430_SMPSWAITTIMEMIN_SHIFT 8
1082#define OMAP4430_SMPSWAITTIMEMIN_MASK BITFIELD(8, 23)
1083
1084/* Used by PRM_LDO_ABB_IVA_SETUP, PRM_LDO_ABB_MPU_SETUP */
1085#define OMAP4430_SR2EN_SHIFT 0
1086#define OMAP4430_SR2EN_MASK BITFIELD(0, 0)
1087
1088/* Used by PRM_LDO_ABB_IVA_CTRL, PRM_LDO_ABB_MPU_CTRL */
1089#define OMAP4430_SR2_IN_TRANSITION_SHIFT 6
1090#define OMAP4430_SR2_IN_TRANSITION_MASK BITFIELD(6, 6)
1091
1092/* Used by PRM_LDO_ABB_IVA_CTRL, PRM_LDO_ABB_MPU_CTRL */
1093#define OMAP4430_SR2_STATUS_SHIFT 3
1094#define OMAP4430_SR2_STATUS_MASK BITFIELD(3, 4)
1095
1096/* Used by PRM_LDO_ABB_IVA_SETUP, PRM_LDO_ABB_MPU_SETUP */
1097#define OMAP4430_SR2_WTCNT_VALUE_SHIFT 8
1098#define OMAP4430_SR2_WTCNT_VALUE_MASK BITFIELD(8, 15)
1099
1100/*
1101 * Used by PRM_LDO_SRAM_CORE_CTRL, PRM_LDO_SRAM_IVA_CTRL,
1102 * PRM_LDO_SRAM_MPU_CTRL
1103 */
1104#define OMAP4430_SRAMLDO_STATUS_SHIFT 8
1105#define OMAP4430_SRAMLDO_STATUS_MASK BITFIELD(8, 8)
1106
1107/*
1108 * Used by PRM_LDO_SRAM_CORE_CTRL, PRM_LDO_SRAM_IVA_CTRL,
1109 * PRM_LDO_SRAM_MPU_CTRL
1110 */
1111#define OMAP4430_SRAM_IN_TRANSITION_SHIFT 9
1112#define OMAP4430_SRAM_IN_TRANSITION_MASK BITFIELD(9, 9)
1113
1114/* Used by PRM_VC_CFG_I2C_MODE */
1115#define OMAP4430_SRMODEEN_SHIFT 4
1116#define OMAP4430_SRMODEEN_MASK BITFIELD(4, 4)
1117
1118/* Used by PRM_VOLTSETUP_WARMRESET */
1119#define OMAP4430_STABLE_COUNT_SHIFT 0
1120#define OMAP4430_STABLE_COUNT_MASK BITFIELD(0, 5)
1121
1122/* Used by PRM_VOLTSETUP_WARMRESET */
1123#define OMAP4430_STABLE_PRESCAL_SHIFT 8
1124#define OMAP4430_STABLE_PRESCAL_MASK BITFIELD(8, 9)
1125
1126/* Used by PM_IVAHD_PWRSTCTRL */
1127#define OMAP4430_TCM1_MEM_ONSTATE_SHIFT 20
1128#define OMAP4430_TCM1_MEM_ONSTATE_MASK BITFIELD(20, 21)
1129
1130/* Used by PM_IVAHD_PWRSTCTRL */
1131#define OMAP4430_TCM1_MEM_RETSTATE_SHIFT 10
1132#define OMAP4430_TCM1_MEM_RETSTATE_MASK BITFIELD(10, 10)
1133
1134/* Used by PM_IVAHD_PWRSTST */
1135#define OMAP4430_TCM1_MEM_STATEST_SHIFT 8
1136#define OMAP4430_TCM1_MEM_STATEST_MASK BITFIELD(8, 9)
1137
1138/* Used by PM_IVAHD_PWRSTCTRL */
1139#define OMAP4430_TCM2_MEM_ONSTATE_SHIFT 22
1140#define OMAP4430_TCM2_MEM_ONSTATE_MASK BITFIELD(22, 23)
1141
1142/* Used by PM_IVAHD_PWRSTCTRL */
1143#define OMAP4430_TCM2_MEM_RETSTATE_SHIFT 11
1144#define OMAP4430_TCM2_MEM_RETSTATE_MASK BITFIELD(11, 11)
1145
1146/* Used by PM_IVAHD_PWRSTST */
1147#define OMAP4430_TCM2_MEM_STATEST_SHIFT 10
1148#define OMAP4430_TCM2_MEM_STATEST_MASK BITFIELD(10, 11)
1149
1150/* Used by RM_TESLA_RSTST */
1151#define OMAP4430_TESLASS_EMU_RSTST_SHIFT 2
1152#define OMAP4430_TESLASS_EMU_RSTST_MASK BITFIELD(2, 2)
1153
1154/* Used by RM_TESLA_RSTST */
1155#define OMAP4430_TESLA_DSP_EMU_REQ_RSTST_SHIFT 3
1156#define OMAP4430_TESLA_DSP_EMU_REQ_RSTST_MASK BITFIELD(3, 3)
1157
1158/* Used by PM_TESLA_PWRSTCTRL */
1159#define OMAP4430_TESLA_EDMA_ONSTATE_SHIFT 20
1160#define OMAP4430_TESLA_EDMA_ONSTATE_MASK BITFIELD(20, 21)
1161
1162/* Used by PM_TESLA_PWRSTCTRL */
1163#define OMAP4430_TESLA_EDMA_RETSTATE_SHIFT 10
1164#define OMAP4430_TESLA_EDMA_RETSTATE_MASK BITFIELD(10, 10)
1165
1166/* Used by PM_TESLA_PWRSTST */
1167#define OMAP4430_TESLA_EDMA_STATEST_SHIFT 8
1168#define OMAP4430_TESLA_EDMA_STATEST_MASK BITFIELD(8, 9)
1169
1170/* Used by PM_TESLA_PWRSTCTRL */
1171#define OMAP4430_TESLA_L1_ONSTATE_SHIFT 16
1172#define OMAP4430_TESLA_L1_ONSTATE_MASK BITFIELD(16, 17)
1173
1174/* Used by PM_TESLA_PWRSTCTRL */
1175#define OMAP4430_TESLA_L1_RETSTATE_SHIFT 8
1176#define OMAP4430_TESLA_L1_RETSTATE_MASK BITFIELD(8, 8)
1177
1178/* Used by PM_TESLA_PWRSTST */
1179#define OMAP4430_TESLA_L1_STATEST_SHIFT 4
1180#define OMAP4430_TESLA_L1_STATEST_MASK BITFIELD(4, 5)
1181
1182/* Used by PM_TESLA_PWRSTCTRL */
1183#define OMAP4430_TESLA_L2_ONSTATE_SHIFT 18
1184#define OMAP4430_TESLA_L2_ONSTATE_MASK BITFIELD(18, 19)
1185
1186/* Used by PM_TESLA_PWRSTCTRL */
1187#define OMAP4430_TESLA_L2_RETSTATE_SHIFT 9
1188#define OMAP4430_TESLA_L2_RETSTATE_MASK BITFIELD(9, 9)
1189
1190/* Used by PM_TESLA_PWRSTST */
1191#define OMAP4430_TESLA_L2_STATEST_SHIFT 6
1192#define OMAP4430_TESLA_L2_STATEST_MASK BITFIELD(6, 7)
1193
1194/* Used by PRM_VP_CORE_VLIMITTO, PRM_VP_IVA_VLIMITTO, PRM_VP_MPU_VLIMITTO */
1195#define OMAP4430_TIMEOUT_SHIFT 0
1196#define OMAP4430_TIMEOUT_MASK BITFIELD(0, 15)
1197
1198/* Used by PRM_VP_CORE_CONFIG, PRM_VP_IVA_CONFIG, PRM_VP_MPU_CONFIG */
1199#define OMAP4430_TIMEOUTEN_SHIFT 3
1200#define OMAP4430_TIMEOUTEN_MASK BITFIELD(3, 3)
1201
1202/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1203#define OMAP4430_TRANSITION_EN_SHIFT 8
1204#define OMAP4430_TRANSITION_EN_MASK BITFIELD(8, 8)
1205
1206/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1207#define OMAP4430_TRANSITION_ST_SHIFT 8
1208#define OMAP4430_TRANSITION_ST_MASK BITFIELD(8, 8)
1209
1210/* Used by PRM_VC_VAL_BYPASS */
1211#define OMAP4430_VALID_SHIFT 24
1212#define OMAP4430_VALID_MASK BITFIELD(24, 24)
1213
1214/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1215#define OMAP4430_VC_BYPASSACK_EN_SHIFT 14
1216#define OMAP4430_VC_BYPASSACK_EN_MASK BITFIELD(14, 14)
1217
1218/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1219#define OMAP4430_VC_BYPASSACK_ST_SHIFT 14
1220#define OMAP4430_VC_BYPASSACK_ST_MASK BITFIELD(14, 14)
1221
1222/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1223#define OMAP4430_VC_IVA_VPACK_EN_SHIFT 30
1224#define OMAP4430_VC_IVA_VPACK_EN_MASK BITFIELD(30, 30)
1225
1226/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1227#define OMAP4430_VC_IVA_VPACK_ST_SHIFT 30
1228#define OMAP4430_VC_IVA_VPACK_ST_MASK BITFIELD(30, 30)
1229
1230/* Used by PRM_IRQENABLE_MPU_2 */
1231#define OMAP4430_VC_MPU_VPACK_EN_SHIFT 6
1232#define OMAP4430_VC_MPU_VPACK_EN_MASK BITFIELD(6, 6)
1233
1234/* Used by PRM_IRQSTATUS_MPU_2 */
1235#define OMAP4430_VC_MPU_VPACK_ST_SHIFT 6
1236#define OMAP4430_VC_MPU_VPACK_ST_MASK BITFIELD(6, 6)
1237
1238/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1239#define OMAP4430_VC_RAERR_EN_SHIFT 12
1240#define OMAP4430_VC_RAERR_EN_MASK BITFIELD(12, 12)
1241
1242/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1243#define OMAP4430_VC_RAERR_ST_SHIFT 12
1244#define OMAP4430_VC_RAERR_ST_MASK BITFIELD(12, 12)
1245
1246/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1247#define OMAP4430_VC_SAERR_EN_SHIFT 11
1248#define OMAP4430_VC_SAERR_EN_MASK BITFIELD(11, 11)
1249
1250/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1251#define OMAP4430_VC_SAERR_ST_SHIFT 11
1252#define OMAP4430_VC_SAERR_ST_MASK BITFIELD(11, 11)
1253
1254/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1255#define OMAP4430_VC_TOERR_EN_SHIFT 13
1256#define OMAP4430_VC_TOERR_EN_MASK BITFIELD(13, 13)
1257
1258/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1259#define OMAP4430_VC_TOERR_ST_SHIFT 13
1260#define OMAP4430_VC_TOERR_ST_MASK BITFIELD(13, 13)
1261
1262/* Used by PRM_VP_CORE_VLIMITTO, PRM_VP_IVA_VLIMITTO, PRM_VP_MPU_VLIMITTO */
1263#define OMAP4430_VDDMAX_SHIFT 24
1264#define OMAP4430_VDDMAX_MASK BITFIELD(24, 31)
1265
1266/* Used by PRM_VP_CORE_VLIMITTO, PRM_VP_IVA_VLIMITTO, PRM_VP_MPU_VLIMITTO */
1267#define OMAP4430_VDDMIN_SHIFT 16
1268#define OMAP4430_VDDMIN_MASK BITFIELD(16, 23)
1269
1270/* Used by PRM_VOLTCTRL */
1271#define OMAP4430_VDD_CORE_I2C_DISABLE_SHIFT 12
1272#define OMAP4430_VDD_CORE_I2C_DISABLE_MASK BITFIELD(12, 12)
1273
1274/* Used by PRM_RSTST */
1275#define OMAP4430_VDD_CORE_VOLT_MGR_RST_SHIFT 8
1276#define OMAP4430_VDD_CORE_VOLT_MGR_RST_MASK BITFIELD(8, 8)
1277
1278/* Used by PRM_VOLTCTRL */
1279#define OMAP4430_VDD_IVA_I2C_DISABLE_SHIFT 14
1280#define OMAP4430_VDD_IVA_I2C_DISABLE_MASK BITFIELD(14, 14)
1281
1282/* Used by PRM_VOLTCTRL */
1283#define OMAP4430_VDD_IVA_PRESENCE_SHIFT 9
1284#define OMAP4430_VDD_IVA_PRESENCE_MASK BITFIELD(9, 9)
1285
1286/* Used by PRM_RSTST */
1287#define OMAP4430_VDD_IVA_VOLT_MGR_RST_SHIFT 7
1288#define OMAP4430_VDD_IVA_VOLT_MGR_RST_MASK BITFIELD(7, 7)
1289
1290/* Used by PRM_VOLTCTRL */
1291#define OMAP4430_VDD_MPU_I2C_DISABLE_SHIFT 13
1292#define OMAP4430_VDD_MPU_I2C_DISABLE_MASK BITFIELD(13, 13)
1293
1294/* Used by PRM_VOLTCTRL */
1295#define OMAP4430_VDD_MPU_PRESENCE_SHIFT 8
1296#define OMAP4430_VDD_MPU_PRESENCE_MASK BITFIELD(8, 8)
1297
1298/* Used by PRM_RSTST */
1299#define OMAP4430_VDD_MPU_VOLT_MGR_RST_SHIFT 6
1300#define OMAP4430_VDD_MPU_VOLT_MGR_RST_MASK BITFIELD(6, 6)
1301
1302/* Used by PRM_VC_VAL_SMPS_RA_VOL */
1303#define OMAP4430_VOLRA_VDD_CORE_L_SHIFT 0
1304#define OMAP4430_VOLRA_VDD_CORE_L_MASK BITFIELD(0, 7)
1305
1306/* Used by PRM_VC_VAL_SMPS_RA_VOL */
1307#define OMAP4430_VOLRA_VDD_IVA_L_SHIFT 8
1308#define OMAP4430_VOLRA_VDD_IVA_L_MASK BITFIELD(8, 15)
1309
1310/* Used by PRM_VC_VAL_SMPS_RA_VOL */
1311#define OMAP4430_VOLRA_VDD_MPU_L_SHIFT 16
1312#define OMAP4430_VOLRA_VDD_MPU_L_MASK BITFIELD(16, 23)
1313
1314/* Used by PRM_VP_CORE_CONFIG, PRM_VP_IVA_CONFIG, PRM_VP_MPU_CONFIG */
1315#define OMAP4430_VPENABLE_SHIFT 0
1316#define OMAP4430_VPENABLE_MASK BITFIELD(0, 0)
1317
1318/* Used by PRM_VP_CORE_STATUS, PRM_VP_IVA_STATUS, PRM_VP_MPU_STATUS */
1319#define OMAP4430_VPINIDLE_SHIFT 0
1320#define OMAP4430_VPINIDLE_MASK BITFIELD(0, 0)
1321
1322/* Used by PRM_VP_CORE_VOLTAGE, PRM_VP_IVA_VOLTAGE, PRM_VP_MPU_VOLTAGE */
1323#define OMAP4430_VPVOLTAGE_SHIFT 0
1324#define OMAP4430_VPVOLTAGE_MASK BITFIELD(0, 7)
1325
1326/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1327#define OMAP4430_VP_CORE_EQVALUE_EN_SHIFT 20
1328#define OMAP4430_VP_CORE_EQVALUE_EN_MASK BITFIELD(20, 20)
1329
1330/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1331#define OMAP4430_VP_CORE_EQVALUE_ST_SHIFT 20
1332#define OMAP4430_VP_CORE_EQVALUE_ST_MASK BITFIELD(20, 20)
1333
1334/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1335#define OMAP4430_VP_CORE_MAXVDD_EN_SHIFT 18
1336#define OMAP4430_VP_CORE_MAXVDD_EN_MASK BITFIELD(18, 18)
1337
1338/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1339#define OMAP4430_VP_CORE_MAXVDD_ST_SHIFT 18
1340#define OMAP4430_VP_CORE_MAXVDD_ST_MASK BITFIELD(18, 18)
1341
1342/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1343#define OMAP4430_VP_CORE_MINVDD_EN_SHIFT 17
1344#define OMAP4430_VP_CORE_MINVDD_EN_MASK BITFIELD(17, 17)
1345
1346/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1347#define OMAP4430_VP_CORE_MINVDD_ST_SHIFT 17
1348#define OMAP4430_VP_CORE_MINVDD_ST_MASK BITFIELD(17, 17)
1349
1350/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1351#define OMAP4430_VP_CORE_NOSMPSACK_EN_SHIFT 19
1352#define OMAP4430_VP_CORE_NOSMPSACK_EN_MASK BITFIELD(19, 19)
1353
1354/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1355#define OMAP4430_VP_CORE_NOSMPSACK_ST_SHIFT 19
1356#define OMAP4430_VP_CORE_NOSMPSACK_ST_MASK BITFIELD(19, 19)
1357
1358/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1359#define OMAP4430_VP_CORE_OPPCHANGEDONE_EN_SHIFT 16
1360#define OMAP4430_VP_CORE_OPPCHANGEDONE_EN_MASK BITFIELD(16, 16)
1361
1362/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1363#define OMAP4430_VP_CORE_OPPCHANGEDONE_ST_SHIFT 16
1364#define OMAP4430_VP_CORE_OPPCHANGEDONE_ST_MASK BITFIELD(16, 16)
1365
1366/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1367#define OMAP4430_VP_CORE_TRANXDONE_EN_SHIFT 21
1368#define OMAP4430_VP_CORE_TRANXDONE_EN_MASK BITFIELD(21, 21)
1369
1370/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1371#define OMAP4430_VP_CORE_TRANXDONE_ST_SHIFT 21
1372#define OMAP4430_VP_CORE_TRANXDONE_ST_MASK BITFIELD(21, 21)
1373
1374/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1375#define OMAP4430_VP_IVA_EQVALUE_EN_SHIFT 28
1376#define OMAP4430_VP_IVA_EQVALUE_EN_MASK BITFIELD(28, 28)
1377
1378/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1379#define OMAP4430_VP_IVA_EQVALUE_ST_SHIFT 28
1380#define OMAP4430_VP_IVA_EQVALUE_ST_MASK BITFIELD(28, 28)
1381
1382/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1383#define OMAP4430_VP_IVA_MAXVDD_EN_SHIFT 26
1384#define OMAP4430_VP_IVA_MAXVDD_EN_MASK BITFIELD(26, 26)
1385
1386/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1387#define OMAP4430_VP_IVA_MAXVDD_ST_SHIFT 26
1388#define OMAP4430_VP_IVA_MAXVDD_ST_MASK BITFIELD(26, 26)
1389
1390/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1391#define OMAP4430_VP_IVA_MINVDD_EN_SHIFT 25
1392#define OMAP4430_VP_IVA_MINVDD_EN_MASK BITFIELD(25, 25)
1393
1394/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1395#define OMAP4430_VP_IVA_MINVDD_ST_SHIFT 25
1396#define OMAP4430_VP_IVA_MINVDD_ST_MASK BITFIELD(25, 25)
1397
1398/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1399#define OMAP4430_VP_IVA_NOSMPSACK_EN_SHIFT 27
1400#define OMAP4430_VP_IVA_NOSMPSACK_EN_MASK BITFIELD(27, 27)
1401
1402/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1403#define OMAP4430_VP_IVA_NOSMPSACK_ST_SHIFT 27
1404#define OMAP4430_VP_IVA_NOSMPSACK_ST_MASK BITFIELD(27, 27)
1405
1406/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1407#define OMAP4430_VP_IVA_OPPCHANGEDONE_EN_SHIFT 24
1408#define OMAP4430_VP_IVA_OPPCHANGEDONE_EN_MASK BITFIELD(24, 24)
1409
1410/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1411#define OMAP4430_VP_IVA_OPPCHANGEDONE_ST_SHIFT 24
1412#define OMAP4430_VP_IVA_OPPCHANGEDONE_ST_MASK BITFIELD(24, 24)
1413
1414/* Used by PRM_IRQENABLE_DUCATI, PRM_IRQENABLE_MPU */
1415#define OMAP4430_VP_IVA_TRANXDONE_EN_SHIFT 29
1416#define OMAP4430_VP_IVA_TRANXDONE_EN_MASK BITFIELD(29, 29)
1417
1418/* Used by PRM_IRQSTATUS_DUCATI, PRM_IRQSTATUS_MPU */
1419#define OMAP4430_VP_IVA_TRANXDONE_ST_SHIFT 29
1420#define OMAP4430_VP_IVA_TRANXDONE_ST_MASK BITFIELD(29, 29)
1421
1422/* Used by PRM_IRQENABLE_MPU_2 */
1423#define OMAP4430_VP_MPU_EQVALUE_EN_SHIFT 4
1424#define OMAP4430_VP_MPU_EQVALUE_EN_MASK BITFIELD(4, 4)
1425
1426/* Used by PRM_IRQSTATUS_MPU_2 */
1427#define OMAP4430_VP_MPU_EQVALUE_ST_SHIFT 4
1428#define OMAP4430_VP_MPU_EQVALUE_ST_MASK BITFIELD(4, 4)
1429
1430/* Used by PRM_IRQENABLE_MPU_2 */
1431#define OMAP4430_VP_MPU_MAXVDD_EN_SHIFT 2
1432#define OMAP4430_VP_MPU_MAXVDD_EN_MASK BITFIELD(2, 2)
1433
1434/* Used by PRM_IRQSTATUS_MPU_2 */
1435#define OMAP4430_VP_MPU_MAXVDD_ST_SHIFT 2
1436#define OMAP4430_VP_MPU_MAXVDD_ST_MASK BITFIELD(2, 2)
1437
1438/* Used by PRM_IRQENABLE_MPU_2 */
1439#define OMAP4430_VP_MPU_MINVDD_EN_SHIFT 1
1440#define OMAP4430_VP_MPU_MINVDD_EN_MASK BITFIELD(1, 1)
1441
1442/* Used by PRM_IRQSTATUS_MPU_2 */
1443#define OMAP4430_VP_MPU_MINVDD_ST_SHIFT 1
1444#define OMAP4430_VP_MPU_MINVDD_ST_MASK BITFIELD(1, 1)
1445
1446/* Used by PRM_IRQENABLE_MPU_2 */
1447#define OMAP4430_VP_MPU_NOSMPSACK_EN_SHIFT 3
1448#define OMAP4430_VP_MPU_NOSMPSACK_EN_MASK BITFIELD(3, 3)
1449
1450/* Used by PRM_IRQSTATUS_MPU_2 */
1451#define OMAP4430_VP_MPU_NOSMPSACK_ST_SHIFT 3
1452#define OMAP4430_VP_MPU_NOSMPSACK_ST_MASK BITFIELD(3, 3)
1453
1454/* Used by PRM_IRQENABLE_MPU_2 */
1455#define OMAP4430_VP_MPU_OPPCHANGEDONE_EN_SHIFT 0
1456#define OMAP4430_VP_MPU_OPPCHANGEDONE_EN_MASK BITFIELD(0, 0)
1457
1458/* Used by PRM_IRQSTATUS_MPU_2 */
1459#define OMAP4430_VP_MPU_OPPCHANGEDONE_ST_SHIFT 0
1460#define OMAP4430_VP_MPU_OPPCHANGEDONE_ST_MASK BITFIELD(0, 0)
1461
1462/* Used by PRM_IRQENABLE_MPU_2 */
1463#define OMAP4430_VP_MPU_TRANXDONE_EN_SHIFT 5
1464#define OMAP4430_VP_MPU_TRANXDONE_EN_MASK BITFIELD(5, 5)
1465
1466/* Used by PRM_IRQSTATUS_MPU_2 */
1467#define OMAP4430_VP_MPU_TRANXDONE_ST_SHIFT 5
1468#define OMAP4430_VP_MPU_TRANXDONE_ST_MASK BITFIELD(5, 5)
1469
1470/* Used by PRM_SRAM_COUNT */
1471#define OMAP4430_VSETUPCNT_VALUE_SHIFT 8
1472#define OMAP4430_VSETUPCNT_VALUE_MASK BITFIELD(8, 15)
1473
1474/* Used by PRM_VP_CORE_VSTEPMAX, PRM_VP_IVA_VSTEPMAX, PRM_VP_MPU_VSTEPMAX */
1475#define OMAP4430_VSTEPMAX_SHIFT 0
1476#define OMAP4430_VSTEPMAX_MASK BITFIELD(0, 7)
1477
1478/* Used by PRM_VP_CORE_VSTEPMIN, PRM_VP_IVA_VSTEPMIN, PRM_VP_MPU_VSTEPMIN */
1479#define OMAP4430_VSTEPMIN_SHIFT 0
1480#define OMAP4430_VSTEPMIN_MASK BITFIELD(0, 7)
1481
1482/* Used by PRM_MODEM_IF_CTRL */
1483#define OMAP4430_WAKE_MODEM_SHIFT 0
1484#define OMAP4430_WAKE_MODEM_MASK BITFIELD(0, 0)
1485
1486/* Used by PM_DSS_DSS_WKDEP */
1487#define OMAP4430_WKUPDEP_DISPC_DUCATI_SHIFT 1
1488#define OMAP4430_WKUPDEP_DISPC_DUCATI_MASK BITFIELD(1, 1)
1489
1490/* Used by PM_DSS_DSS_WKDEP */
1491#define OMAP4430_WKUPDEP_DISPC_MPU_SHIFT 0
1492#define OMAP4430_WKUPDEP_DISPC_MPU_MASK BITFIELD(0, 0)
1493
1494/* Used by PM_DSS_DSS_WKDEP */
1495#define OMAP4430_WKUPDEP_DISPC_SDMA_SHIFT 3
1496#define OMAP4430_WKUPDEP_DISPC_SDMA_MASK BITFIELD(3, 3)
1497
1498/* Used by PM_DSS_DSS_WKDEP */
1499#define OMAP4430_WKUPDEP_DISPC_TESLA_SHIFT 2
1500#define OMAP4430_WKUPDEP_DISPC_TESLA_MASK BITFIELD(2, 2)
1501
1502/* Used by PM_ABE_DMIC_WKDEP */
1503#define OMAP4430_WKUPDEP_DMIC_DMA_SDMA_SHIFT 7
1504#define OMAP4430_WKUPDEP_DMIC_DMA_SDMA_MASK BITFIELD(7, 7)
1505
1506/* Used by PM_ABE_DMIC_WKDEP */
1507#define OMAP4430_WKUPDEP_DMIC_DMA_TESLA_SHIFT 6
1508#define OMAP4430_WKUPDEP_DMIC_DMA_TESLA_MASK BITFIELD(6, 6)
1509
1510/* Used by PM_ABE_DMIC_WKDEP */
1511#define OMAP4430_WKUPDEP_DMIC_IRQ_MPU_SHIFT 0
1512#define OMAP4430_WKUPDEP_DMIC_IRQ_MPU_MASK BITFIELD(0, 0)
1513
1514/* Used by PM_ABE_DMIC_WKDEP */
1515#define OMAP4430_WKUPDEP_DMIC_IRQ_TESLA_SHIFT 2
1516#define OMAP4430_WKUPDEP_DMIC_IRQ_TESLA_MASK BITFIELD(2, 2)
1517
1518/* Used by PM_L4PER_DMTIMER10_WKDEP */
1519#define OMAP4430_WKUPDEP_DMTIMER10_MPU_SHIFT 0
1520#define OMAP4430_WKUPDEP_DMTIMER10_MPU_MASK BITFIELD(0, 0)
1521
1522/* Used by PM_L4PER_DMTIMER11_WKDEP */
1523#define OMAP4430_WKUPDEP_DMTIMER11_DUCATI_SHIFT 1
1524#define OMAP4430_WKUPDEP_DMTIMER11_DUCATI_MASK BITFIELD(1, 1)
1525
1526/* Used by PM_L4PER_DMTIMER11_WKDEP */
1527#define OMAP4430_WKUPDEP_DMTIMER11_MPU_SHIFT 0
1528#define OMAP4430_WKUPDEP_DMTIMER11_MPU_MASK BITFIELD(0, 0)
1529
1530/* Used by PM_L4PER_DMTIMER2_WKDEP */
1531#define OMAP4430_WKUPDEP_DMTIMER2_MPU_SHIFT 0
1532#define OMAP4430_WKUPDEP_DMTIMER2_MPU_MASK BITFIELD(0, 0)
1533
1534/* Used by PM_L4PER_DMTIMER3_WKDEP */
1535#define OMAP4430_WKUPDEP_DMTIMER3_DUCATI_SHIFT 1
1536#define OMAP4430_WKUPDEP_DMTIMER3_DUCATI_MASK BITFIELD(1, 1)
1537
1538/* Used by PM_L4PER_DMTIMER3_WKDEP */
1539#define OMAP4430_WKUPDEP_DMTIMER3_MPU_SHIFT 0
1540#define OMAP4430_WKUPDEP_DMTIMER3_MPU_MASK BITFIELD(0, 0)
1541
1542/* Used by PM_L4PER_DMTIMER4_WKDEP */
1543#define OMAP4430_WKUPDEP_DMTIMER4_DUCATI_SHIFT 1
1544#define OMAP4430_WKUPDEP_DMTIMER4_DUCATI_MASK BITFIELD(1, 1)
1545
1546/* Used by PM_L4PER_DMTIMER4_WKDEP */
1547#define OMAP4430_WKUPDEP_DMTIMER4_MPU_SHIFT 0
1548#define OMAP4430_WKUPDEP_DMTIMER4_MPU_MASK BITFIELD(0, 0)
1549
1550/* Used by PM_L4PER_DMTIMER9_WKDEP */
1551#define OMAP4430_WKUPDEP_DMTIMER9_DUCATI_SHIFT 1
1552#define OMAP4430_WKUPDEP_DMTIMER9_DUCATI_MASK BITFIELD(1, 1)
1553
1554/* Used by PM_L4PER_DMTIMER9_WKDEP */
1555#define OMAP4430_WKUPDEP_DMTIMER9_MPU_SHIFT 0
1556#define OMAP4430_WKUPDEP_DMTIMER9_MPU_MASK BITFIELD(0, 0)
1557
1558/* Used by PM_DSS_DSS_WKDEP */
1559#define OMAP4430_WKUPDEP_DSI1_DUCATI_SHIFT 5
1560#define OMAP4430_WKUPDEP_DSI1_DUCATI_MASK BITFIELD(5, 5)
1561
1562/* Used by PM_DSS_DSS_WKDEP */
1563#define OMAP4430_WKUPDEP_DSI1_MPU_SHIFT 4
1564#define OMAP4430_WKUPDEP_DSI1_MPU_MASK BITFIELD(4, 4)
1565
1566/* Used by PM_DSS_DSS_WKDEP */
1567#define OMAP4430_WKUPDEP_DSI1_SDMA_SHIFT 7
1568#define OMAP4430_WKUPDEP_DSI1_SDMA_MASK BITFIELD(7, 7)
1569
1570/* Used by PM_DSS_DSS_WKDEP */
1571#define OMAP4430_WKUPDEP_DSI1_TESLA_SHIFT 6
1572#define OMAP4430_WKUPDEP_DSI1_TESLA_MASK BITFIELD(6, 6)
1573
1574/* Used by PM_DSS_DSS_WKDEP */
1575#define OMAP4430_WKUPDEP_DSI2_DUCATI_SHIFT 9
1576#define OMAP4430_WKUPDEP_DSI2_DUCATI_MASK BITFIELD(9, 9)
1577
1578/* Used by PM_DSS_DSS_WKDEP */
1579#define OMAP4430_WKUPDEP_DSI2_MPU_SHIFT 8
1580#define OMAP4430_WKUPDEP_DSI2_MPU_MASK BITFIELD(8, 8)
1581
1582/* Used by PM_DSS_DSS_WKDEP */
1583#define OMAP4430_WKUPDEP_DSI2_SDMA_SHIFT 11
1584#define OMAP4430_WKUPDEP_DSI2_SDMA_MASK BITFIELD(11, 11)
1585
1586/* Used by PM_DSS_DSS_WKDEP */
1587#define OMAP4430_WKUPDEP_DSI2_TESLA_SHIFT 10
1588#define OMAP4430_WKUPDEP_DSI2_TESLA_MASK BITFIELD(10, 10)
1589
1590/* Used by PM_WKUP_GPIO1_WKDEP */
1591#define OMAP4430_WKUPDEP_GPIO1_IRQ1_DUCATI_SHIFT 1
1592#define OMAP4430_WKUPDEP_GPIO1_IRQ1_DUCATI_MASK BITFIELD(1, 1)
1593
1594/* Used by PM_WKUP_GPIO1_WKDEP */
1595#define OMAP4430_WKUPDEP_GPIO1_IRQ1_MPU_SHIFT 0
1596#define OMAP4430_WKUPDEP_GPIO1_IRQ1_MPU_MASK BITFIELD(0, 0)
1597
1598/* Used by PM_WKUP_GPIO1_WKDEP */
1599#define OMAP4430_WKUPDEP_GPIO1_IRQ2_TESLA_SHIFT 6
1600#define OMAP4430_WKUPDEP_GPIO1_IRQ2_TESLA_MASK BITFIELD(6, 6)
1601
1602/* Used by PM_L4PER_GPIO2_WKDEP */
1603#define OMAP4430_WKUPDEP_GPIO2_IRQ1_DUCATI_SHIFT 1
1604#define OMAP4430_WKUPDEP_GPIO2_IRQ1_DUCATI_MASK BITFIELD(1, 1)
1605
1606/* Used by PM_L4PER_GPIO2_WKDEP */
1607#define OMAP4430_WKUPDEP_GPIO2_IRQ1_MPU_SHIFT 0
1608#define OMAP4430_WKUPDEP_GPIO2_IRQ1_MPU_MASK BITFIELD(0, 0)
1609
1610/* Used by PM_L4PER_GPIO2_WKDEP */
1611#define OMAP4430_WKUPDEP_GPIO2_IRQ2_TESLA_SHIFT 6
1612#define OMAP4430_WKUPDEP_GPIO2_IRQ2_TESLA_MASK BITFIELD(6, 6)
1613
1614/* Used by PM_L4PER_GPIO3_WKDEP */
1615#define OMAP4430_WKUPDEP_GPIO3_IRQ1_MPU_SHIFT 0
1616#define OMAP4430_WKUPDEP_GPIO3_IRQ1_MPU_MASK BITFIELD(0, 0)
1617
1618/* Used by PM_L4PER_GPIO3_WKDEP */
1619#define OMAP4430_WKUPDEP_GPIO3_IRQ2_TESLA_SHIFT 6
1620#define OMAP4430_WKUPDEP_GPIO3_IRQ2_TESLA_MASK BITFIELD(6, 6)
1621
1622/* Used by PM_L4PER_GPIO4_WKDEP */
1623#define OMAP4430_WKUPDEP_GPIO4_IRQ1_MPU_SHIFT 0
1624#define OMAP4430_WKUPDEP_GPIO4_IRQ1_MPU_MASK BITFIELD(0, 0)
1625
1626/* Used by PM_L4PER_GPIO4_WKDEP */
1627#define OMAP4430_WKUPDEP_GPIO4_IRQ2_TESLA_SHIFT 6
1628#define OMAP4430_WKUPDEP_GPIO4_IRQ2_TESLA_MASK BITFIELD(6, 6)
1629
1630/* Used by PM_L4PER_GPIO5_WKDEP */
1631#define OMAP4430_WKUPDEP_GPIO5_IRQ1_MPU_SHIFT 0
1632#define OMAP4430_WKUPDEP_GPIO5_IRQ1_MPU_MASK BITFIELD(0, 0)
1633
1634/* Used by PM_L4PER_GPIO5_WKDEP */
1635#define OMAP4430_WKUPDEP_GPIO5_IRQ2_TESLA_SHIFT 6
1636#define OMAP4430_WKUPDEP_GPIO5_IRQ2_TESLA_MASK BITFIELD(6, 6)
1637
1638/* Used by PM_L4PER_GPIO6_WKDEP */
1639#define OMAP4430_WKUPDEP_GPIO6_IRQ1_MPU_SHIFT 0
1640#define OMAP4430_WKUPDEP_GPIO6_IRQ1_MPU_MASK BITFIELD(0, 0)
1641
1642/* Used by PM_L4PER_GPIO6_WKDEP */
1643#define OMAP4430_WKUPDEP_GPIO6_IRQ2_TESLA_SHIFT 6
1644#define OMAP4430_WKUPDEP_GPIO6_IRQ2_TESLA_MASK BITFIELD(6, 6)
1645
1646/* Used by PM_DSS_DSS_WKDEP */
1647#define OMAP4430_WKUPDEP_HDMIDMA_SDMA_SHIFT 19
1648#define OMAP4430_WKUPDEP_HDMIDMA_SDMA_MASK BITFIELD(19, 19)
1649
1650/* Used by PM_DSS_DSS_WKDEP */
1651#define OMAP4430_WKUPDEP_HDMIIRQ_DUCATI_SHIFT 13
1652#define OMAP4430_WKUPDEP_HDMIIRQ_DUCATI_MASK BITFIELD(13, 13)
1653
1654/* Used by PM_DSS_DSS_WKDEP */
1655#define OMAP4430_WKUPDEP_HDMIIRQ_MPU_SHIFT 12
1656#define OMAP4430_WKUPDEP_HDMIIRQ_MPU_MASK BITFIELD(12, 12)
1657
1658/* Used by PM_DSS_DSS_WKDEP */
1659#define OMAP4430_WKUPDEP_HDMIIRQ_TESLA_SHIFT 14
1660#define OMAP4430_WKUPDEP_HDMIIRQ_TESLA_MASK BITFIELD(14, 14)
1661
1662/* Used by PM_L4PER_HECC1_WKDEP */
1663#define OMAP4430_WKUPDEP_HECC1_MPU_SHIFT 0
1664#define OMAP4430_WKUPDEP_HECC1_MPU_MASK BITFIELD(0, 0)
1665
1666/* Used by PM_L4PER_HECC2_WKDEP */
1667#define OMAP4430_WKUPDEP_HECC2_MPU_SHIFT 0
1668#define OMAP4430_WKUPDEP_HECC2_MPU_MASK BITFIELD(0, 0)
1669
1670/* Used by PM_L3INIT_HSI_WKDEP */
1671#define OMAP4430_WKUPDEP_HSI_DSP_TESLA_SHIFT 6
1672#define OMAP4430_WKUPDEP_HSI_DSP_TESLA_MASK BITFIELD(6, 6)
1673
1674/* Used by PM_L3INIT_HSI_WKDEP */
1675#define OMAP4430_WKUPDEP_HSI_MCU_DUCATI_SHIFT 1
1676#define OMAP4430_WKUPDEP_HSI_MCU_DUCATI_MASK BITFIELD(1, 1)
1677
1678/* Used by PM_L3INIT_HSI_WKDEP */
1679#define OMAP4430_WKUPDEP_HSI_MCU_MPU_SHIFT 0
1680#define OMAP4430_WKUPDEP_HSI_MCU_MPU_MASK BITFIELD(0, 0)
1681
1682/* Used by PM_L4PER_I2C1_WKDEP */
1683#define OMAP4430_WKUPDEP_I2C1_DMA_SDMA_SHIFT 7
1684#define OMAP4430_WKUPDEP_I2C1_DMA_SDMA_MASK BITFIELD(7, 7)
1685
1686/* Used by PM_L4PER_I2C1_WKDEP */
1687#define OMAP4430_WKUPDEP_I2C1_IRQ_DUCATI_SHIFT 1
1688#define OMAP4430_WKUPDEP_I2C1_IRQ_DUCATI_MASK BITFIELD(1, 1)
1689
1690/* Used by PM_L4PER_I2C1_WKDEP */
1691#define OMAP4430_WKUPDEP_I2C1_IRQ_MPU_SHIFT 0
1692#define OMAP4430_WKUPDEP_I2C1_IRQ_MPU_MASK BITFIELD(0, 0)
1693
1694/* Used by PM_L4PER_I2C2_WKDEP */
1695#define OMAP4430_WKUPDEP_I2C2_DMA_SDMA_SHIFT 7
1696#define OMAP4430_WKUPDEP_I2C2_DMA_SDMA_MASK BITFIELD(7, 7)
1697
1698/* Used by PM_L4PER_I2C2_WKDEP */
1699#define OMAP4430_WKUPDEP_I2C2_IRQ_DUCATI_SHIFT 1
1700#define OMAP4430_WKUPDEP_I2C2_IRQ_DUCATI_MASK BITFIELD(1, 1)
1701
1702/* Used by PM_L4PER_I2C2_WKDEP */
1703#define OMAP4430_WKUPDEP_I2C2_IRQ_MPU_SHIFT 0
1704#define OMAP4430_WKUPDEP_I2C2_IRQ_MPU_MASK BITFIELD(0, 0)
1705
1706/* Used by PM_L4PER_I2C3_WKDEP */
1707#define OMAP4430_WKUPDEP_I2C3_DMA_SDMA_SHIFT 7
1708#define OMAP4430_WKUPDEP_I2C3_DMA_SDMA_MASK BITFIELD(7, 7)
1709
1710/* Used by PM_L4PER_I2C3_WKDEP */
1711#define OMAP4430_WKUPDEP_I2C3_IRQ_DUCATI_SHIFT 1
1712#define OMAP4430_WKUPDEP_I2C3_IRQ_DUCATI_MASK BITFIELD(1, 1)
1713
1714/* Used by PM_L4PER_I2C3_WKDEP */
1715#define OMAP4430_WKUPDEP_I2C3_IRQ_MPU_SHIFT 0
1716#define OMAP4430_WKUPDEP_I2C3_IRQ_MPU_MASK BITFIELD(0, 0)
1717
1718/* Used by PM_L4PER_I2C4_WKDEP */
1719#define OMAP4430_WKUPDEP_I2C4_DMA_SDMA_SHIFT 7
1720#define OMAP4430_WKUPDEP_I2C4_DMA_SDMA_MASK BITFIELD(7, 7)
1721
1722/* Used by PM_L4PER_I2C4_WKDEP */
1723#define OMAP4430_WKUPDEP_I2C4_IRQ_DUCATI_SHIFT 1
1724#define OMAP4430_WKUPDEP_I2C4_IRQ_DUCATI_MASK BITFIELD(1, 1)
1725
1726/* Used by PM_L4PER_I2C4_WKDEP */
1727#define OMAP4430_WKUPDEP_I2C4_IRQ_MPU_SHIFT 0
1728#define OMAP4430_WKUPDEP_I2C4_IRQ_MPU_MASK BITFIELD(0, 0)
1729
1730/* Used by PM_L4PER_I2C5_WKDEP */
1731#define OMAP4430_WKUPDEP_I2C5_DMA_SDMA_SHIFT 7
1732#define OMAP4430_WKUPDEP_I2C5_DMA_SDMA_MASK BITFIELD(7, 7)
1733
1734/* Used by PM_L4PER_I2C5_WKDEP */
1735#define OMAP4430_WKUPDEP_I2C5_IRQ_MPU_SHIFT 0
1736#define OMAP4430_WKUPDEP_I2C5_IRQ_MPU_MASK BITFIELD(0, 0)
1737
1738/* Used by PM_WKUP_KEYBOARD_WKDEP */
1739#define OMAP4430_WKUPDEP_KEYBOARD_MPU_SHIFT 0
1740#define OMAP4430_WKUPDEP_KEYBOARD_MPU_MASK BITFIELD(0, 0)
1741
1742/* Used by PM_ABE_MCASP_WKDEP */
1743#define OMAP4430_WKUPDEP_MCASP1_DMA_SDMA_SHIFT 7
1744#define OMAP4430_WKUPDEP_MCASP1_DMA_SDMA_MASK BITFIELD(7, 7)
1745
1746/* Used by PM_ABE_MCASP_WKDEP */
1747#define OMAP4430_WKUPDEP_MCASP1_DMA_TESLA_SHIFT 6
1748#define OMAP4430_WKUPDEP_MCASP1_DMA_TESLA_MASK BITFIELD(6, 6)
1749
1750/* Used by PM_ABE_MCASP_WKDEP */
1751#define OMAP4430_WKUPDEP_MCASP1_IRQ_MPU_SHIFT 0
1752#define OMAP4430_WKUPDEP_MCASP1_IRQ_MPU_MASK BITFIELD(0, 0)
1753
1754/* Used by PM_ABE_MCASP_WKDEP */
1755#define OMAP4430_WKUPDEP_MCASP1_IRQ_TESLA_SHIFT 2
1756#define OMAP4430_WKUPDEP_MCASP1_IRQ_TESLA_MASK BITFIELD(2, 2)
1757
1758/* Used by PM_L4PER_MCASP2_WKDEP */
1759#define OMAP4430_WKUPDEP_MCASP2_DMA_SDMA_SHIFT 7
1760#define OMAP4430_WKUPDEP_MCASP2_DMA_SDMA_MASK BITFIELD(7, 7)
1761
1762/* Used by PM_L4PER_MCASP2_WKDEP */
1763#define OMAP4430_WKUPDEP_MCASP2_DMA_TESLA_SHIFT 6
1764#define OMAP4430_WKUPDEP_MCASP2_DMA_TESLA_MASK BITFIELD(6, 6)
1765
1766/* Used by PM_L4PER_MCASP2_WKDEP */
1767#define OMAP4430_WKUPDEP_MCASP2_IRQ_MPU_SHIFT 0
1768#define OMAP4430_WKUPDEP_MCASP2_IRQ_MPU_MASK BITFIELD(0, 0)
1769
1770/* Used by PM_L4PER_MCASP2_WKDEP */
1771#define OMAP4430_WKUPDEP_MCASP2_IRQ_TESLA_SHIFT 2
1772#define OMAP4430_WKUPDEP_MCASP2_IRQ_TESLA_MASK BITFIELD(2, 2)
1773
1774/* Used by PM_L4PER_MCASP3_WKDEP */
1775#define OMAP4430_WKUPDEP_MCASP3_DMA_SDMA_SHIFT 7
1776#define OMAP4430_WKUPDEP_MCASP3_DMA_SDMA_MASK BITFIELD(7, 7)
1777
1778/* Used by PM_L4PER_MCASP3_WKDEP */
1779#define OMAP4430_WKUPDEP_MCASP3_DMA_TESLA_SHIFT 6
1780#define OMAP4430_WKUPDEP_MCASP3_DMA_TESLA_MASK BITFIELD(6, 6)
1781
1782/* Used by PM_L4PER_MCASP3_WKDEP */
1783#define OMAP4430_WKUPDEP_MCASP3_IRQ_MPU_SHIFT 0
1784#define OMAP4430_WKUPDEP_MCASP3_IRQ_MPU_MASK BITFIELD(0, 0)
1785
1786/* Used by PM_L4PER_MCASP3_WKDEP */
1787#define OMAP4430_WKUPDEP_MCASP3_IRQ_TESLA_SHIFT 2
1788#define OMAP4430_WKUPDEP_MCASP3_IRQ_TESLA_MASK BITFIELD(2, 2)
1789
1790/* Used by PM_ABE_MCBSP1_WKDEP */
1791#define OMAP4430_WKUPDEP_MCBSP1_MPU_SHIFT 0
1792#define OMAP4430_WKUPDEP_MCBSP1_MPU_MASK BITFIELD(0, 0)
1793
1794/* Used by PM_ABE_MCBSP1_WKDEP */
1795#define OMAP4430_WKUPDEP_MCBSP1_SDMA_SHIFT 3
1796#define OMAP4430_WKUPDEP_MCBSP1_SDMA_MASK BITFIELD(3, 3)
1797
1798/* Used by PM_ABE_MCBSP1_WKDEP */
1799#define OMAP4430_WKUPDEP_MCBSP1_TESLA_SHIFT 2
1800#define OMAP4430_WKUPDEP_MCBSP1_TESLA_MASK BITFIELD(2, 2)
1801
1802/* Used by PM_ABE_MCBSP2_WKDEP */
1803#define OMAP4430_WKUPDEP_MCBSP2_MPU_SHIFT 0
1804#define OMAP4430_WKUPDEP_MCBSP2_MPU_MASK BITFIELD(0, 0)
1805
1806/* Used by PM_ABE_MCBSP2_WKDEP */
1807#define OMAP4430_WKUPDEP_MCBSP2_SDMA_SHIFT 3
1808#define OMAP4430_WKUPDEP_MCBSP2_SDMA_MASK BITFIELD(3, 3)
1809
1810/* Used by PM_ABE_MCBSP2_WKDEP */
1811#define OMAP4430_WKUPDEP_MCBSP2_TESLA_SHIFT 2
1812#define OMAP4430_WKUPDEP_MCBSP2_TESLA_MASK BITFIELD(2, 2)
1813
1814/* Used by PM_ABE_MCBSP3_WKDEP */
1815#define OMAP4430_WKUPDEP_MCBSP3_MPU_SHIFT 0
1816#define OMAP4430_WKUPDEP_MCBSP3_MPU_MASK BITFIELD(0, 0)
1817
1818/* Used by PM_ABE_MCBSP3_WKDEP */
1819#define OMAP4430_WKUPDEP_MCBSP3_SDMA_SHIFT 3
1820#define OMAP4430_WKUPDEP_MCBSP3_SDMA_MASK BITFIELD(3, 3)
1821
1822/* Used by PM_ABE_MCBSP3_WKDEP */
1823#define OMAP4430_WKUPDEP_MCBSP3_TESLA_SHIFT 2
1824#define OMAP4430_WKUPDEP_MCBSP3_TESLA_MASK BITFIELD(2, 2)
1825
1826/* Used by PM_L4PER_MCBSP4_WKDEP */
1827#define OMAP4430_WKUPDEP_MCBSP4_MPU_SHIFT 0
1828#define OMAP4430_WKUPDEP_MCBSP4_MPU_MASK BITFIELD(0, 0)
1829
1830/* Used by PM_L4PER_MCBSP4_WKDEP */
1831#define OMAP4430_WKUPDEP_MCBSP4_SDMA_SHIFT 3
1832#define OMAP4430_WKUPDEP_MCBSP4_SDMA_MASK BITFIELD(3, 3)
1833
1834/* Used by PM_L4PER_MCBSP4_WKDEP */
1835#define OMAP4430_WKUPDEP_MCBSP4_TESLA_SHIFT 2
1836#define OMAP4430_WKUPDEP_MCBSP4_TESLA_MASK BITFIELD(2, 2)
1837
1838/* Used by PM_L4PER_MCSPI1_WKDEP */
1839#define OMAP4430_WKUPDEP_MCSPI1_DUCATI_SHIFT 1
1840#define OMAP4430_WKUPDEP_MCSPI1_DUCATI_MASK BITFIELD(1, 1)
1841
1842/* Used by PM_L4PER_MCSPI1_WKDEP */
1843#define OMAP4430_WKUPDEP_MCSPI1_MPU_SHIFT 0
1844#define OMAP4430_WKUPDEP_MCSPI1_MPU_MASK BITFIELD(0, 0)
1845
1846/* Used by PM_L4PER_MCSPI1_WKDEP */
1847#define OMAP4430_WKUPDEP_MCSPI1_SDMA_SHIFT 3
1848#define OMAP4430_WKUPDEP_MCSPI1_SDMA_MASK BITFIELD(3, 3)
1849
1850/* Used by PM_L4PER_MCSPI1_WKDEP */
1851#define OMAP4430_WKUPDEP_MCSPI1_TESLA_SHIFT 2
1852#define OMAP4430_WKUPDEP_MCSPI1_TESLA_MASK BITFIELD(2, 2)
1853
1854/* Used by PM_L4PER_MCSPI2_WKDEP */
1855#define OMAP4430_WKUPDEP_MCSPI2_DUCATI_SHIFT 1
1856#define OMAP4430_WKUPDEP_MCSPI2_DUCATI_MASK BITFIELD(1, 1)
1857
1858/* Used by PM_L4PER_MCSPI2_WKDEP */
1859#define OMAP4430_WKUPDEP_MCSPI2_MPU_SHIFT 0
1860#define OMAP4430_WKUPDEP_MCSPI2_MPU_MASK BITFIELD(0, 0)
1861
1862/* Used by PM_L4PER_MCSPI2_WKDEP */
1863#define OMAP4430_WKUPDEP_MCSPI2_SDMA_SHIFT 3
1864#define OMAP4430_WKUPDEP_MCSPI2_SDMA_MASK BITFIELD(3, 3)
1865
1866/* Used by PM_L4PER_MCSPI3_WKDEP */
1867#define OMAP4430_WKUPDEP_MCSPI3_MPU_SHIFT 0
1868#define OMAP4430_WKUPDEP_MCSPI3_MPU_MASK BITFIELD(0, 0)
1869
1870/* Used by PM_L4PER_MCSPI3_WKDEP */
1871#define OMAP4430_WKUPDEP_MCSPI3_SDMA_SHIFT 3
1872#define OMAP4430_WKUPDEP_MCSPI3_SDMA_MASK BITFIELD(3, 3)
1873
1874/* Used by PM_L4PER_MCSPI4_WKDEP */
1875#define OMAP4430_WKUPDEP_MCSPI4_MPU_SHIFT 0
1876#define OMAP4430_WKUPDEP_MCSPI4_MPU_MASK BITFIELD(0, 0)
1877
1878/* Used by PM_L4PER_MCSPI4_WKDEP */
1879#define OMAP4430_WKUPDEP_MCSPI4_SDMA_SHIFT 3
1880#define OMAP4430_WKUPDEP_MCSPI4_SDMA_MASK BITFIELD(3, 3)
1881
1882/* Used by PM_L3INIT_MMC1_WKDEP */
1883#define OMAP4430_WKUPDEP_MMC1_DUCATI_SHIFT 1
1884#define OMAP4430_WKUPDEP_MMC1_DUCATI_MASK BITFIELD(1, 1)
1885
1886/* Used by PM_L3INIT_MMC1_WKDEP */
1887#define OMAP4430_WKUPDEP_MMC1_MPU_SHIFT 0
1888#define OMAP4430_WKUPDEP_MMC1_MPU_MASK BITFIELD(0, 0)
1889
1890/* Used by PM_L3INIT_MMC1_WKDEP */
1891#define OMAP4430_WKUPDEP_MMC1_SDMA_SHIFT 3
1892#define OMAP4430_WKUPDEP_MMC1_SDMA_MASK BITFIELD(3, 3)
1893
1894/* Used by PM_L3INIT_MMC1_WKDEP */
1895#define OMAP4430_WKUPDEP_MMC1_TESLA_SHIFT 2
1896#define OMAP4430_WKUPDEP_MMC1_TESLA_MASK BITFIELD(2, 2)
1897
1898/* Used by PM_L3INIT_MMC2_WKDEP */
1899#define OMAP4430_WKUPDEP_MMC2_DUCATI_SHIFT 1
1900#define OMAP4430_WKUPDEP_MMC2_DUCATI_MASK BITFIELD(1, 1)
1901
1902/* Used by PM_L3INIT_MMC2_WKDEP */
1903#define OMAP4430_WKUPDEP_MMC2_MPU_SHIFT 0
1904#define OMAP4430_WKUPDEP_MMC2_MPU_MASK BITFIELD(0, 0)
1905
1906/* Used by PM_L3INIT_MMC2_WKDEP */
1907#define OMAP4430_WKUPDEP_MMC2_SDMA_SHIFT 3
1908#define OMAP4430_WKUPDEP_MMC2_SDMA_MASK BITFIELD(3, 3)
1909
1910/* Used by PM_L3INIT_MMC2_WKDEP */
1911#define OMAP4430_WKUPDEP_MMC2_TESLA_SHIFT 2
1912#define OMAP4430_WKUPDEP_MMC2_TESLA_MASK BITFIELD(2, 2)
1913
1914/* Used by PM_L3INIT_MMC6_WKDEP */
1915#define OMAP4430_WKUPDEP_MMC6_DUCATI_SHIFT 1
1916#define OMAP4430_WKUPDEP_MMC6_DUCATI_MASK BITFIELD(1, 1)
1917
1918/* Used by PM_L3INIT_MMC6_WKDEP */
1919#define OMAP4430_WKUPDEP_MMC6_MPU_SHIFT 0
1920#define OMAP4430_WKUPDEP_MMC6_MPU_MASK BITFIELD(0, 0)
1921
1922/* Used by PM_L3INIT_MMC6_WKDEP */
1923#define OMAP4430_WKUPDEP_MMC6_TESLA_SHIFT 2
1924#define OMAP4430_WKUPDEP_MMC6_TESLA_MASK BITFIELD(2, 2)
1925
1926/* Used by PM_L4PER_MMCSD3_WKDEP */
1927#define OMAP4430_WKUPDEP_MMCSD3_DUCATI_SHIFT 1
1928#define OMAP4430_WKUPDEP_MMCSD3_DUCATI_MASK BITFIELD(1, 1)
1929
1930/* Used by PM_L4PER_MMCSD3_WKDEP */
1931#define OMAP4430_WKUPDEP_MMCSD3_MPU_SHIFT 0
1932#define OMAP4430_WKUPDEP_MMCSD3_MPU_MASK BITFIELD(0, 0)
1933
1934/* Used by PM_L4PER_MMCSD3_WKDEP */
1935#define OMAP4430_WKUPDEP_MMCSD3_SDMA_SHIFT 3
1936#define OMAP4430_WKUPDEP_MMCSD3_SDMA_MASK BITFIELD(3, 3)
1937
1938/* Used by PM_L4PER_MMCSD4_WKDEP */
1939#define OMAP4430_WKUPDEP_MMCSD4_DUCATI_SHIFT 1
1940#define OMAP4430_WKUPDEP_MMCSD4_DUCATI_MASK BITFIELD(1, 1)
1941
1942/* Used by PM_L4PER_MMCSD4_WKDEP */
1943#define OMAP4430_WKUPDEP_MMCSD4_MPU_SHIFT 0
1944#define OMAP4430_WKUPDEP_MMCSD4_MPU_MASK BITFIELD(0, 0)
1945
1946/* Used by PM_L4PER_MMCSD4_WKDEP */
1947#define OMAP4430_WKUPDEP_MMCSD4_SDMA_SHIFT 3
1948#define OMAP4430_WKUPDEP_MMCSD4_SDMA_MASK BITFIELD(3, 3)
1949
1950/* Used by PM_L4PER_MMCSD5_WKDEP */
1951#define OMAP4430_WKUPDEP_MMCSD5_DUCATI_SHIFT 1
1952#define OMAP4430_WKUPDEP_MMCSD5_DUCATI_MASK BITFIELD(1, 1)
1953
1954/* Used by PM_L4PER_MMCSD5_WKDEP */
1955#define OMAP4430_WKUPDEP_MMCSD5_MPU_SHIFT 0
1956#define OMAP4430_WKUPDEP_MMCSD5_MPU_MASK BITFIELD(0, 0)
1957
1958/* Used by PM_L4PER_MMCSD5_WKDEP */
1959#define OMAP4430_WKUPDEP_MMCSD5_SDMA_SHIFT 3
1960#define OMAP4430_WKUPDEP_MMCSD5_SDMA_MASK BITFIELD(3, 3)
1961
1962/* Used by PM_L3INIT_PCIESS_WKDEP */
1963#define OMAP4430_WKUPDEP_PCIESS_MPU_SHIFT 0
1964#define OMAP4430_WKUPDEP_PCIESS_MPU_MASK BITFIELD(0, 0)
1965
1966/* Used by PM_L3INIT_PCIESS_WKDEP */
1967#define OMAP4430_WKUPDEP_PCIESS_TESLA_SHIFT 2
1968#define OMAP4430_WKUPDEP_PCIESS_TESLA_MASK BITFIELD(2, 2)
1969
1970/* Used by PM_ABE_PDM_WKDEP */
1971#define OMAP4430_WKUPDEP_PDM_DMA_SDMA_SHIFT 7
1972#define OMAP4430_WKUPDEP_PDM_DMA_SDMA_MASK BITFIELD(7, 7)
1973
1974/* Used by PM_ABE_PDM_WKDEP */
1975#define OMAP4430_WKUPDEP_PDM_DMA_TESLA_SHIFT 6
1976#define OMAP4430_WKUPDEP_PDM_DMA_TESLA_MASK BITFIELD(6, 6)
1977
1978/* Used by PM_ABE_PDM_WKDEP */
1979#define OMAP4430_WKUPDEP_PDM_IRQ_MPU_SHIFT 0
1980#define OMAP4430_WKUPDEP_PDM_IRQ_MPU_MASK BITFIELD(0, 0)
1981
1982/* Used by PM_ABE_PDM_WKDEP */
1983#define OMAP4430_WKUPDEP_PDM_IRQ_TESLA_SHIFT 2
1984#define OMAP4430_WKUPDEP_PDM_IRQ_TESLA_MASK BITFIELD(2, 2)
1985
1986/* Used by PM_WKUP_RTC_WKDEP */
1987#define OMAP4430_WKUPDEP_RTC_MPU_SHIFT 0
1988#define OMAP4430_WKUPDEP_RTC_MPU_MASK BITFIELD(0, 0)
1989
1990/* Used by PM_L3INIT_SATA_WKDEP */
1991#define OMAP4430_WKUPDEP_SATA_MPU_SHIFT 0
1992#define OMAP4430_WKUPDEP_SATA_MPU_MASK BITFIELD(0, 0)
1993
1994/* Used by PM_L3INIT_SATA_WKDEP */
1995#define OMAP4430_WKUPDEP_SATA_TESLA_SHIFT 2
1996#define OMAP4430_WKUPDEP_SATA_TESLA_MASK BITFIELD(2, 2)
1997
1998/* Used by PM_ABE_SLIMBUS_WKDEP */
1999#define OMAP4430_WKUPDEP_SLIMBUS1_DMA_SDMA_SHIFT 7
2000#define OMAP4430_WKUPDEP_SLIMBUS1_DMA_SDMA_MASK BITFIELD(7, 7)
2001
2002/* Used by PM_ABE_SLIMBUS_WKDEP */
2003#define OMAP4430_WKUPDEP_SLIMBUS1_DMA_TESLA_SHIFT 6
2004#define OMAP4430_WKUPDEP_SLIMBUS1_DMA_TESLA_MASK BITFIELD(6, 6)
2005
2006/* Used by PM_ABE_SLIMBUS_WKDEP */
2007#define OMAP4430_WKUPDEP_SLIMBUS1_IRQ_MPU_SHIFT 0
2008#define OMAP4430_WKUPDEP_SLIMBUS1_IRQ_MPU_MASK BITFIELD(0, 0)
2009
2010/* Used by PM_ABE_SLIMBUS_WKDEP */
2011#define OMAP4430_WKUPDEP_SLIMBUS1_IRQ_TESLA_SHIFT 2
2012#define OMAP4430_WKUPDEP_SLIMBUS1_IRQ_TESLA_MASK BITFIELD(2, 2)
2013
2014/* Used by PM_L4PER_SLIMBUS2_WKDEP */
2015#define OMAP4430_WKUPDEP_SLIMBUS2_DMA_SDMA_SHIFT 7
2016#define OMAP4430_WKUPDEP_SLIMBUS2_DMA_SDMA_MASK BITFIELD(7, 7)
2017
2018/* Used by PM_L4PER_SLIMBUS2_WKDEP */
2019#define OMAP4430_WKUPDEP_SLIMBUS2_DMA_TESLA_SHIFT 6
2020#define OMAP4430_WKUPDEP_SLIMBUS2_DMA_TESLA_MASK BITFIELD(6, 6)
2021
2022/* Used by PM_L4PER_SLIMBUS2_WKDEP */
2023#define OMAP4430_WKUPDEP_SLIMBUS2_IRQ_MPU_SHIFT 0
2024#define OMAP4430_WKUPDEP_SLIMBUS2_IRQ_MPU_MASK BITFIELD(0, 0)
2025
2026/* Used by PM_L4PER_SLIMBUS2_WKDEP */
2027#define OMAP4430_WKUPDEP_SLIMBUS2_IRQ_TESLA_SHIFT 2
2028#define OMAP4430_WKUPDEP_SLIMBUS2_IRQ_TESLA_MASK BITFIELD(2, 2)
2029
2030/* Used by PM_ALWON_SR_CORE_WKDEP */
2031#define OMAP4430_WKUPDEP_SR_CORE_DUCATI_SHIFT 1
2032#define OMAP4430_WKUPDEP_SR_CORE_DUCATI_MASK BITFIELD(1, 1)
2033
2034/* Used by PM_ALWON_SR_CORE_WKDEP */
2035#define OMAP4430_WKUPDEP_SR_CORE_MPU_SHIFT 0
2036#define OMAP4430_WKUPDEP_SR_CORE_MPU_MASK BITFIELD(0, 0)
2037
2038/* Used by PM_ALWON_SR_IVA_WKDEP */
2039#define OMAP4430_WKUPDEP_SR_IVA_DUCATI_SHIFT 1
2040#define OMAP4430_WKUPDEP_SR_IVA_DUCATI_MASK BITFIELD(1, 1)
2041
2042/* Used by PM_ALWON_SR_IVA_WKDEP */
2043#define OMAP4430_WKUPDEP_SR_IVA_MPU_SHIFT 0
2044#define OMAP4430_WKUPDEP_SR_IVA_MPU_MASK BITFIELD(0, 0)
2045
2046/* Used by PM_ALWON_SR_MPU_WKDEP */
2047#define OMAP4430_WKUPDEP_SR_MPU_MPU_SHIFT 0
2048#define OMAP4430_WKUPDEP_SR_MPU_MPU_MASK BITFIELD(0, 0)
2049
2050/* Used by PM_WKUP_TIMER12_WKDEP */
2051#define OMAP4430_WKUPDEP_TIMER12_MPU_SHIFT 0
2052#define OMAP4430_WKUPDEP_TIMER12_MPU_MASK BITFIELD(0, 0)
2053
2054/* Used by PM_WKUP_TIMER1_WKDEP */
2055#define OMAP4430_WKUPDEP_TIMER1_MPU_SHIFT 0
2056#define OMAP4430_WKUPDEP_TIMER1_MPU_MASK BITFIELD(0, 0)
2057
2058/* Used by PM_ABE_TIMER5_WKDEP */
2059#define OMAP4430_WKUPDEP_TIMER5_MPU_SHIFT 0
2060#define OMAP4430_WKUPDEP_TIMER5_MPU_MASK BITFIELD(0, 0)
2061
2062/* Used by PM_ABE_TIMER5_WKDEP */
2063#define OMAP4430_WKUPDEP_TIMER5_TESLA_SHIFT 2
2064#define OMAP4430_WKUPDEP_TIMER5_TESLA_MASK BITFIELD(2, 2)
2065
2066/* Used by PM_ABE_TIMER6_WKDEP */
2067#define OMAP4430_WKUPDEP_TIMER6_MPU_SHIFT 0
2068#define OMAP4430_WKUPDEP_TIMER6_MPU_MASK BITFIELD(0, 0)
2069
2070/* Used by PM_ABE_TIMER6_WKDEP */
2071#define OMAP4430_WKUPDEP_TIMER6_TESLA_SHIFT 2
2072#define OMAP4430_WKUPDEP_TIMER6_TESLA_MASK BITFIELD(2, 2)
2073
2074/* Used by PM_ABE_TIMER7_WKDEP */
2075#define OMAP4430_WKUPDEP_TIMER7_MPU_SHIFT 0
2076#define OMAP4430_WKUPDEP_TIMER7_MPU_MASK BITFIELD(0, 0)
2077
2078/* Used by PM_ABE_TIMER7_WKDEP */
2079#define OMAP4430_WKUPDEP_TIMER7_TESLA_SHIFT 2
2080#define OMAP4430_WKUPDEP_TIMER7_TESLA_MASK BITFIELD(2, 2)
2081
2082/* Used by PM_ABE_TIMER8_WKDEP */
2083#define OMAP4430_WKUPDEP_TIMER8_MPU_SHIFT 0
2084#define OMAP4430_WKUPDEP_TIMER8_MPU_MASK BITFIELD(0, 0)
2085
2086/* Used by PM_ABE_TIMER8_WKDEP */
2087#define OMAP4430_WKUPDEP_TIMER8_TESLA_SHIFT 2
2088#define OMAP4430_WKUPDEP_TIMER8_TESLA_MASK BITFIELD(2, 2)
2089
2090/* Used by PM_L4PER_UART1_WKDEP */
2091#define OMAP4430_WKUPDEP_UART1_MPU_SHIFT 0
2092#define OMAP4430_WKUPDEP_UART1_MPU_MASK BITFIELD(0, 0)
2093
2094/* Used by PM_L4PER_UART1_WKDEP */
2095#define OMAP4430_WKUPDEP_UART1_SDMA_SHIFT 3
2096#define OMAP4430_WKUPDEP_UART1_SDMA_MASK BITFIELD(3, 3)
2097
2098/* Used by PM_L4PER_UART2_WKDEP */
2099#define OMAP4430_WKUPDEP_UART2_MPU_SHIFT 0
2100#define OMAP4430_WKUPDEP_UART2_MPU_MASK BITFIELD(0, 0)
2101
2102/* Used by PM_L4PER_UART2_WKDEP */
2103#define OMAP4430_WKUPDEP_UART2_SDMA_SHIFT 3
2104#define OMAP4430_WKUPDEP_UART2_SDMA_MASK BITFIELD(3, 3)
2105
2106/* Used by PM_L4PER_UART3_WKDEP */
2107#define OMAP4430_WKUPDEP_UART3_DUCATI_SHIFT 1
2108#define OMAP4430_WKUPDEP_UART3_DUCATI_MASK BITFIELD(1, 1)
2109
2110/* Used by PM_L4PER_UART3_WKDEP */
2111#define OMAP4430_WKUPDEP_UART3_MPU_SHIFT 0
2112#define OMAP4430_WKUPDEP_UART3_MPU_MASK BITFIELD(0, 0)
2113
2114/* Used by PM_L4PER_UART3_WKDEP */
2115#define OMAP4430_WKUPDEP_UART3_SDMA_SHIFT 3
2116#define OMAP4430_WKUPDEP_UART3_SDMA_MASK BITFIELD(3, 3)
2117
2118/* Used by PM_L4PER_UART3_WKDEP */
2119#define OMAP4430_WKUPDEP_UART3_TESLA_SHIFT 2
2120#define OMAP4430_WKUPDEP_UART3_TESLA_MASK BITFIELD(2, 2)
2121
2122/* Used by PM_L4PER_UART4_WKDEP */
2123#define OMAP4430_WKUPDEP_UART4_MPU_SHIFT 0
2124#define OMAP4430_WKUPDEP_UART4_MPU_MASK BITFIELD(0, 0)
2125
2126/* Used by PM_L4PER_UART4_WKDEP */
2127#define OMAP4430_WKUPDEP_UART4_SDMA_SHIFT 3
2128#define OMAP4430_WKUPDEP_UART4_SDMA_MASK BITFIELD(3, 3)
2129
2130/* Used by PM_L3INIT_UNIPRO1_WKDEP */
2131#define OMAP4430_WKUPDEP_UNIPRO1_DUCATI_SHIFT 1
2132#define OMAP4430_WKUPDEP_UNIPRO1_DUCATI_MASK BITFIELD(1, 1)
2133
2134/* Used by PM_L3INIT_UNIPRO1_WKDEP */
2135#define OMAP4430_WKUPDEP_UNIPRO1_MPU_SHIFT 0
2136#define OMAP4430_WKUPDEP_UNIPRO1_MPU_MASK BITFIELD(0, 0)
2137
2138/* Used by PM_L3INIT_USB_HOST_WKDEP */
2139#define OMAP4430_WKUPDEP_USB_HOST_DUCATI_SHIFT 1
2140#define OMAP4430_WKUPDEP_USB_HOST_DUCATI_MASK BITFIELD(1, 1)
2141
2142/* Used by PM_L3INIT_USB_HOST_FS_WKDEP */
2143#define OMAP4430_WKUPDEP_USB_HOST_FS_DUCATI_SHIFT 1
2144#define OMAP4430_WKUPDEP_USB_HOST_FS_DUCATI_MASK BITFIELD(1, 1)
2145
2146/* Used by PM_L3INIT_USB_HOST_FS_WKDEP */
2147#define OMAP4430_WKUPDEP_USB_HOST_FS_MPU_SHIFT 0
2148#define OMAP4430_WKUPDEP_USB_HOST_FS_MPU_MASK BITFIELD(0, 0)
2149
2150/* Used by PM_L3INIT_USB_HOST_WKDEP */
2151#define OMAP4430_WKUPDEP_USB_HOST_MPU_SHIFT 0
2152#define OMAP4430_WKUPDEP_USB_HOST_MPU_MASK BITFIELD(0, 0)
2153
2154/* Used by PM_L3INIT_USB_OTG_WKDEP */
2155#define OMAP4430_WKUPDEP_USB_OTG_DUCATI_SHIFT 1
2156#define OMAP4430_WKUPDEP_USB_OTG_DUCATI_MASK BITFIELD(1, 1)
2157
2158/* Used by PM_L3INIT_USB_OTG_WKDEP */
2159#define OMAP4430_WKUPDEP_USB_OTG_MPU_SHIFT 0
2160#define OMAP4430_WKUPDEP_USB_OTG_MPU_MASK BITFIELD(0, 0)
2161
2162/* Used by PM_L3INIT_USB_TLL_WKDEP */
2163#define OMAP4430_WKUPDEP_USB_TLL_DUCATI_SHIFT 1
2164#define OMAP4430_WKUPDEP_USB_TLL_DUCATI_MASK BITFIELD(1, 1)
2165
2166/* Used by PM_L3INIT_USB_TLL_WKDEP */
2167#define OMAP4430_WKUPDEP_USB_TLL_MPU_SHIFT 0
2168#define OMAP4430_WKUPDEP_USB_TLL_MPU_MASK BITFIELD(0, 0)
2169
2170/* Used by PM_WKUP_USIM_WKDEP */
2171#define OMAP4430_WKUPDEP_USIM_MPU_SHIFT 0
2172#define OMAP4430_WKUPDEP_USIM_MPU_MASK BITFIELD(0, 0)
2173
2174/* Used by PM_WKUP_USIM_WKDEP */
2175#define OMAP4430_WKUPDEP_USIM_SDMA_SHIFT 3
2176#define OMAP4430_WKUPDEP_USIM_SDMA_MASK BITFIELD(3, 3)
2177
2178/* Used by PM_WKUP_WDT2_WKDEP */
2179#define OMAP4430_WKUPDEP_WDT2_DUCATI_SHIFT 1
2180#define OMAP4430_WKUPDEP_WDT2_DUCATI_MASK BITFIELD(1, 1)
2181
2182/* Used by PM_WKUP_WDT2_WKDEP */
2183#define OMAP4430_WKUPDEP_WDT2_MPU_SHIFT 0
2184#define OMAP4430_WKUPDEP_WDT2_MPU_MASK BITFIELD(0, 0)
2185
2186/* Used by PM_ABE_WDT3_WKDEP */
2187#define OMAP4430_WKUPDEP_WDT3_MPU_SHIFT 0
2188#define OMAP4430_WKUPDEP_WDT3_MPU_MASK BITFIELD(0, 0)
2189
2190/* Used by PM_L3INIT_HSI_WKDEP */
2191#define OMAP4430_WKUPDEP_WGM_HSI_WAKE_MPU_SHIFT 8
2192#define OMAP4430_WKUPDEP_WGM_HSI_WAKE_MPU_MASK BITFIELD(8, 8)
2193
2194/* Used by PM_L3INIT_XHPI_WKDEP */
2195#define OMAP4430_WKUPDEP_XHPI_DUCATI_SHIFT 1
2196#define OMAP4430_WKUPDEP_XHPI_DUCATI_MASK BITFIELD(1, 1)
2197
2198/* Used by PRM_IO_PMCTRL */
2199#define OMAP4430_WUCLK_CTRL_SHIFT 8
2200#define OMAP4430_WUCLK_CTRL_MASK BITFIELD(8, 8)
2201
2202/* Used by PRM_IO_PMCTRL */
2203#define OMAP4430_WUCLK_STATUS_SHIFT 9
2204#define OMAP4430_WUCLK_STATUS_MASK BITFIELD(9, 9)
2205#endif
diff --git a/arch/arm/mach-omap2/prm.h b/arch/arm/mach-omap2/prm.h
index 03c467c35f54..5fba2aa8932c 100644
--- a/arch/arm/mach-omap2/prm.h
+++ b/arch/arm/mach-omap2/prm.h
@@ -4,8 +4,8 @@
4/* 4/*
5 * OMAP2/3 Power/Reset Management (PRM) register definitions 5 * OMAP2/3 Power/Reset Management (PRM) register definitions
6 * 6 *
7 * Copyright (C) 2007 Texas Instruments, Inc. 7 * Copyright (C) 2007-2009 Texas Instruments, Inc.
8 * Copyright (C) 2007 Nokia Corporation 8 * Copyright (C) 2009 Nokia Corporation
9 * 9 *
10 * Written by Paul Walmsley 10 * Written by Paul Walmsley
11 * 11 *
@@ -17,11 +17,17 @@
17#include "prcm-common.h" 17#include "prcm-common.h"
18 18
19#define OMAP2420_PRM_REGADDR(module, reg) \ 19#define OMAP2420_PRM_REGADDR(module, reg) \
20 OMAP2_IO_ADDRESS(OMAP2420_PRM_BASE + (module) + (reg)) 20 OMAP2_L4_IO_ADDRESS(OMAP2420_PRM_BASE + (module) + (reg))
21#define OMAP2430_PRM_REGADDR(module, reg) \ 21#define OMAP2430_PRM_REGADDR(module, reg) \
22 OMAP2_IO_ADDRESS(OMAP2430_PRM_BASE + (module) + (reg)) 22 OMAP2_L4_IO_ADDRESS(OMAP2430_PRM_BASE + (module) + (reg))
23#define OMAP34XX_PRM_REGADDR(module, reg) \ 23#define OMAP34XX_PRM_REGADDR(module, reg) \
24 OMAP2_IO_ADDRESS(OMAP3430_PRM_BASE + (module) + (reg)) 24 OMAP2_L4_IO_ADDRESS(OMAP3430_PRM_BASE + (module) + (reg))
25#define OMAP44XX_PRM_REGADDR(module, reg) \
26 OMAP2_L4_IO_ADDRESS(OMAP4430_PRM_BASE + (module) + (reg))
27#define OMAP44XX_CHIRONSS_REGADDR(module, reg) \
28 OMAP2_L4_IO_ADDRESS(OMAP4430_CHIRONSS_BASE + (module) + (reg))
29
30#include "prm44xx.h"
25 31
26/* 32/*
27 * Architecture-specific global PRM registers 33 * Architecture-specific global PRM registers
@@ -173,9 +179,11 @@
173 179
174/* Registers appearing on both 24xx and 34xx */ 180/* Registers appearing on both 24xx and 34xx */
175 181
176#define RM_RSTCTRL 0x0050 182#define OMAP2_RM_RSTCTRL 0x0050
177#define RM_RSTTIME 0x0054 183#define OMAP2_RM_RSTTIME 0x0054
178#define RM_RSTST 0x0058 184#define OMAP2_RM_RSTST 0x0058
185#define OMAP2_PM_PWSTCTRL 0x00e0
186#define OMAP2_PM_PWSTST 0x00e4
179 187
180#define PM_WKEN 0x00a0 188#define PM_WKEN 0x00a0
181#define PM_WKEN1 PM_WKEN 189#define PM_WKEN1 PM_WKEN
@@ -185,8 +193,6 @@
185#define PM_EVGENCTRL 0x00d4 193#define PM_EVGENCTRL 0x00d4
186#define PM_EVGENONTIM 0x00d8 194#define PM_EVGENONTIM 0x00d8
187#define PM_EVGENOFFTIM 0x00dc 195#define PM_EVGENOFFTIM 0x00dc
188#define PM_PWSTCTRL 0x00e0
189#define PM_PWSTST 0x00e4
190 196
191/* Omap2 specific registers */ 197/* Omap2 specific registers */
192#define OMAP24XX_PM_WKEN2 0x00a4 198#define OMAP24XX_PM_WKEN2 0x00a4
@@ -214,6 +220,13 @@
214#define OMAP3430_PRM_IRQSTATUS_IVA2 0x00f8 220#define OMAP3430_PRM_IRQSTATUS_IVA2 0x00f8
215#define OMAP3430_PRM_IRQENABLE_IVA2 0x00fc 221#define OMAP3430_PRM_IRQENABLE_IVA2 0x00fc
216 222
223/* Omap4 specific registers */
224#define OMAP4_RM_RSTCTRL 0x0000
225#define OMAP4_RM_RSTTIME 0x0004
226#define OMAP4_RM_RSTST 0x0008
227#define OMAP4_PM_PWSTCTRL 0x0000
228#define OMAP4_PM_PWSTST 0x0004
229
217 230
218#ifndef __ASSEMBLER__ 231#ifndef __ASSEMBLER__
219 232
diff --git a/arch/arm/mach-omap2/prm44xx.h b/arch/arm/mach-omap2/prm44xx.h
new file mode 100644
index 000000000000..adb2558bb121
--- /dev/null
+++ b/arch/arm/mach-omap2/prm44xx.h
@@ -0,0 +1,411 @@
1/*
2 * OMAP44xx PRM instance offset macros
3 *
4 * Copyright (C) 2009 Texas Instruments, Inc.
5 * Copyright (C) 2009 Nokia Corporation
6 *
7 * Paul Walmsley (paul@pwsan.com)
8 * Rajendra Nayak (rnayak@ti.com)
9 * Benoit Cousson (b-cousson@ti.com)
10 *
11 * This file is automatically generated from the OMAP hardware databases.
12 * We respectfully ask that any modifications to this file be coordinated
13 * with the public linux-omap@vger.kernel.org mailing list and the
14 * authors above to ensure that the autogeneration scripts are kept
15 * up-to-date with the file contents.
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License version 2 as
19 * published by the Free Software Foundation.
20 */
21
22#ifndef __ARCH_ARM_MACH_OMAP2_PRM44XX_H
23#define __ARCH_ARM_MACH_OMAP2_PRM44XX_H
24
25
26/* PRM */
27
28
29/* PRM.OCP_SOCKET_PRM register offsets */
30#define OMAP4430_REVISION_PRM OMAP44XX_PRM_REGADDR(OMAP4430_PRM_OCP_SOCKET_MOD, 0x0000)
31#define OMAP4430_PRM_IRQSTATUS_MPU OMAP44XX_PRM_REGADDR(OMAP4430_PRM_OCP_SOCKET_MOD, 0x0010)
32#define OMAP4430_PRM_IRQSTATUS_MPU_2 OMAP44XX_PRM_REGADDR(OMAP4430_PRM_OCP_SOCKET_MOD, 0x0014)
33#define OMAP4430_PRM_IRQENABLE_MPU OMAP44XX_PRM_REGADDR(OMAP4430_PRM_OCP_SOCKET_MOD, 0x0018)
34#define OMAP4430_PRM_IRQENABLE_MPU_2 OMAP44XX_PRM_REGADDR(OMAP4430_PRM_OCP_SOCKET_MOD, 0x001c)
35#define OMAP4430_PRM_IRQSTATUS_DUCATI OMAP44XX_PRM_REGADDR(OMAP4430_PRM_OCP_SOCKET_MOD, 0x0020)
36#define OMAP4430_PRM_IRQENABLE_DUCATI OMAP44XX_PRM_REGADDR(OMAP4430_PRM_OCP_SOCKET_MOD, 0x0028)
37#define OMAP4430_PRM_IRQSTATUS_TESLA OMAP44XX_PRM_REGADDR(OMAP4430_PRM_OCP_SOCKET_MOD, 0x0030)
38#define OMAP4430_PRM_IRQENABLE_TESLA OMAP44XX_PRM_REGADDR(OMAP4430_PRM_OCP_SOCKET_MOD, 0x0038)
39#define OMAP4430_PRM_PRM_PROFILING_CLKCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_OCP_SOCKET_MOD, 0x0040)
40
41/* PRM.CKGEN_PRM register offsets */
42#define OMAP4430_CM_ABE_DSS_SYS_CLKSEL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CKGEN_MOD, 0x0000)
43#define OMAP4430_CM_DPLL_SYS_REF_CLKSEL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CKGEN_MOD, 0x0004)
44#define OMAP4430_CM_L4_WKUP_CLKSEL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CKGEN_MOD, 0x0008)
45#define OMAP4430_CM_ABE_PLL_REF_CLKSEL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CKGEN_MOD, 0x000c)
46#define OMAP4430_CM_SYS_CLKSEL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CKGEN_MOD, 0x0010)
47
48/* PRM.MPU_PRM register offsets */
49#define OMAP4430_PM_MPU_PWRSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_MPU_MOD, 0x0000)
50#define OMAP4430_PM_MPU_PWRSTST OMAP44XX_PRM_REGADDR(OMAP4430_PRM_MPU_MOD, 0x0004)
51#define OMAP4430_RM_MPU_RSTST OMAP44XX_PRM_REGADDR(OMAP4430_PRM_MPU_MOD, 0x0014)
52#define OMAP4430_RM_MPU_MPU_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_MPU_MOD, 0x0024)
53
54/* PRM.TESLA_PRM register offsets */
55#define OMAP4430_PM_TESLA_PWRSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_TESLA_MOD, 0x0000)
56#define OMAP4430_PM_TESLA_PWRSTST OMAP44XX_PRM_REGADDR(OMAP4430_PRM_TESLA_MOD, 0x0004)
57#define OMAP4430_RM_TESLA_RSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_TESLA_MOD, 0x0010)
58#define OMAP4430_RM_TESLA_RSTST OMAP44XX_PRM_REGADDR(OMAP4430_PRM_TESLA_MOD, 0x0014)
59#define OMAP4430_RM_TESLA_TESLA_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_TESLA_MOD, 0x0024)
60
61/* PRM.ABE_PRM register offsets */
62#define OMAP4430_PM_ABE_PWRSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0000)
63#define OMAP4430_PM_ABE_PWRSTST OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0004)
64#define OMAP4430_RM_ABE_AESS_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x002c)
65#define OMAP4430_PM_ABE_PDM_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0030)
66#define OMAP4430_RM_ABE_PDM_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0034)
67#define OMAP4430_PM_ABE_DMIC_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0038)
68#define OMAP4430_RM_ABE_DMIC_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x003c)
69#define OMAP4430_PM_ABE_MCASP_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0040)
70#define OMAP4430_RM_ABE_MCASP_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0044)
71#define OMAP4430_PM_ABE_MCBSP1_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0048)
72#define OMAP4430_RM_ABE_MCBSP1_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x004c)
73#define OMAP4430_PM_ABE_MCBSP2_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0050)
74#define OMAP4430_RM_ABE_MCBSP2_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0054)
75#define OMAP4430_PM_ABE_MCBSP3_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0058)
76#define OMAP4430_RM_ABE_MCBSP3_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x005c)
77#define OMAP4430_PM_ABE_SLIMBUS_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0060)
78#define OMAP4430_RM_ABE_SLIMBUS_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0064)
79#define OMAP4430_PM_ABE_TIMER5_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0068)
80#define OMAP4430_RM_ABE_TIMER5_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x006c)
81#define OMAP4430_PM_ABE_TIMER6_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0070)
82#define OMAP4430_RM_ABE_TIMER6_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0074)
83#define OMAP4430_PM_ABE_TIMER7_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0078)
84#define OMAP4430_RM_ABE_TIMER7_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x007c)
85#define OMAP4430_PM_ABE_TIMER8_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0080)
86#define OMAP4430_RM_ABE_TIMER8_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0084)
87#define OMAP4430_PM_ABE_WDT3_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x0088)
88#define OMAP4430_RM_ABE_WDT3_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ABE_MOD, 0x008c)
89
90/* PRM.ALWAYS_ON_PRM register offsets */
91#define OMAP4430_RM_ALWON_MDMINTC_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ALWAYS_ON_MOD, 0x0024)
92#define OMAP4430_PM_ALWON_SR_MPU_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ALWAYS_ON_MOD, 0x0028)
93#define OMAP4430_RM_ALWON_SR_MPU_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ALWAYS_ON_MOD, 0x002c)
94#define OMAP4430_PM_ALWON_SR_IVA_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ALWAYS_ON_MOD, 0x0030)
95#define OMAP4430_RM_ALWON_SR_IVA_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ALWAYS_ON_MOD, 0x0034)
96#define OMAP4430_PM_ALWON_SR_CORE_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ALWAYS_ON_MOD, 0x0038)
97#define OMAP4430_RM_ALWON_SR_CORE_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_ALWAYS_ON_MOD, 0x003c)
98
99/* PRM.CORE_PRM register offsets */
100#define OMAP4430_PM_CORE_PWRSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0000)
101#define OMAP4430_PM_CORE_PWRSTST OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0004)
102#define OMAP4430_RM_L3_1_L3_1_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0024)
103#define OMAP4430_RM_L3_2_L3_2_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0124)
104#define OMAP4430_RM_L3_2_GPMC_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x012c)
105#define OMAP4430_RM_L3_2_OCMC_RAM_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0134)
106#define OMAP4430_RM_DUCATI_RSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0210)
107#define OMAP4430_RM_DUCATI_RSTST OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0214)
108#define OMAP4430_RM_DUCATI_DUCATI_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0224)
109#define OMAP4430_RM_SDMA_SDMA_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0324)
110#define OMAP4430_RM_MEMIF_DMM_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0424)
111#define OMAP4430_RM_MEMIF_EMIF_FW_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x042c)
112#define OMAP4430_RM_MEMIF_EMIF_1_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0434)
113#define OMAP4430_RM_MEMIF_EMIF_2_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x043c)
114#define OMAP4430_RM_MEMIF_DLL_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0444)
115#define OMAP4430_RM_MEMIF_EMIF_H1_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0454)
116#define OMAP4430_RM_MEMIF_EMIF_H2_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x045c)
117#define OMAP4430_RM_MEMIF_DLL_H_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0464)
118#define OMAP4430_RM_D2D_SAD2D_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0524)
119#define OMAP4430_RM_D2D_MODEM_ICR_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x052c)
120#define OMAP4430_RM_D2D_SAD2D_FW_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0534)
121#define OMAP4430_RM_L4CFG_L4_CFG_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0624)
122#define OMAP4430_RM_L4CFG_HW_SEM_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x062c)
123#define OMAP4430_RM_L4CFG_MAILBOX_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0634)
124#define OMAP4430_RM_L4CFG_SAR_ROM_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x063c)
125#define OMAP4430_RM_L3INSTR_L3_3_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0724)
126#define OMAP4430_RM_L3INSTR_L3_INSTR_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x072c)
127#define OMAP4430_RM_L3INSTR_OCP_WP1_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CORE_MOD, 0x0744)
128
129/* PRM.IVAHD_PRM register offsets */
130#define OMAP4430_PM_IVAHD_PWRSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_IVAHD_MOD, 0x0000)
131#define OMAP4430_PM_IVAHD_PWRSTST OMAP44XX_PRM_REGADDR(OMAP4430_PRM_IVAHD_MOD, 0x0004)
132#define OMAP4430_RM_IVAHD_RSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_IVAHD_MOD, 0x0010)
133#define OMAP4430_RM_IVAHD_RSTST OMAP44XX_PRM_REGADDR(OMAP4430_PRM_IVAHD_MOD, 0x0014)
134#define OMAP4430_RM_IVAHD_IVAHD_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_IVAHD_MOD, 0x0024)
135#define OMAP4430_RM_IVAHD_SL2_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_IVAHD_MOD, 0x002c)
136
137/* PRM.CAM_PRM register offsets */
138#define OMAP4430_PM_CAM_PWRSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CAM_MOD, 0x0000)
139#define OMAP4430_PM_CAM_PWRSTST OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CAM_MOD, 0x0004)
140#define OMAP4430_RM_CAM_ISS_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CAM_MOD, 0x0024)
141#define OMAP4430_RM_CAM_FDIF_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CAM_MOD, 0x002c)
142
143/* PRM.DSS_PRM register offsets */
144#define OMAP4430_PM_DSS_PWRSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DSS_MOD, 0x0000)
145#define OMAP4430_PM_DSS_PWRSTST OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DSS_MOD, 0x0004)
146#define OMAP4430_PM_DSS_DSS_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DSS_MOD, 0x0020)
147#define OMAP4430_RM_DSS_DSS_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DSS_MOD, 0x0024)
148#define OMAP4430_RM_DSS_DEISS_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DSS_MOD, 0x002c)
149
150/* PRM.GFX_PRM register offsets */
151#define OMAP4430_PM_GFX_PWRSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_GFX_MOD, 0x0000)
152#define OMAP4430_PM_GFX_PWRSTST OMAP44XX_PRM_REGADDR(OMAP4430_PRM_GFX_MOD, 0x0004)
153#define OMAP4430_RM_GFX_GFX_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_GFX_MOD, 0x0024)
154
155/* PRM.L3INIT_PRM register offsets */
156#define OMAP4430_PM_L3INIT_PWRSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x0000)
157#define OMAP4430_PM_L3INIT_PWRSTST OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x0004)
158#define OMAP4430_PM_L3INIT_MMC1_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x0028)
159#define OMAP4430_RM_L3INIT_MMC1_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x002c)
160#define OMAP4430_PM_L3INIT_MMC2_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x0030)
161#define OMAP4430_RM_L3INIT_MMC2_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x0034)
162#define OMAP4430_PM_L3INIT_HSI_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x0038)
163#define OMAP4430_RM_L3INIT_HSI_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x003c)
164#define OMAP4430_PM_L3INIT_UNIPRO1_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x0040)
165#define OMAP4430_RM_L3INIT_UNIPRO1_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x0044)
166#define OMAP4430_PM_L3INIT_USB_HOST_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x0058)
167#define OMAP4430_RM_L3INIT_USB_HOST_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x005c)
168#define OMAP4430_PM_L3INIT_USB_OTG_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x0060)
169#define OMAP4430_RM_L3INIT_USB_OTG_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x0064)
170#define OMAP4430_PM_L3INIT_USB_TLL_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x0068)
171#define OMAP4430_RM_L3INIT_USB_TLL_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x006c)
172#define OMAP4430_RM_L3INIT_P1500_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x007c)
173#define OMAP4430_RM_L3INIT_EMAC_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x0084)
174#define OMAP4430_PM_L3INIT_SATA_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x0088)
175#define OMAP4430_RM_L3INIT_SATA_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x008c)
176#define OMAP4430_RM_L3INIT_TPPSS_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x0094)
177#define OMAP4430_PM_L3INIT_PCIESS_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x0098)
178#define OMAP4430_RM_L3INIT_PCIESS_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x009c)
179#define OMAP4430_RM_L3INIT_CCPTX_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x00ac)
180#define OMAP4430_PM_L3INIT_XHPI_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x00c0)
181#define OMAP4430_RM_L3INIT_XHPI_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x00c4)
182#define OMAP4430_PM_L3INIT_MMC6_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x00c8)
183#define OMAP4430_RM_L3INIT_MMC6_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x00cc)
184#define OMAP4430_PM_L3INIT_USB_HOST_FS_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x00d0)
185#define OMAP4430_RM_L3INIT_USB_HOST_FS_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x00d4)
186#define OMAP4430_RM_L3INIT_USBPHYOCP2SCP_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L3INIT_MOD, 0x00e4)
187
188/* PRM.L4PER_PRM register offsets */
189#define OMAP4430_PM_L4PER_PWRSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0000)
190#define OMAP4430_PM_L4PER_PWRSTST OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0004)
191#define OMAP4430_RM_L4PER_ADC_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0024)
192#define OMAP4430_PM_L4PER_DMTIMER10_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0028)
193#define OMAP4430_RM_L4PER_DMTIMER10_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x002c)
194#define OMAP4430_PM_L4PER_DMTIMER11_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0030)
195#define OMAP4430_RM_L4PER_DMTIMER11_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0034)
196#define OMAP4430_PM_L4PER_DMTIMER2_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0038)
197#define OMAP4430_RM_L4PER_DMTIMER2_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x003c)
198#define OMAP4430_PM_L4PER_DMTIMER3_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0040)
199#define OMAP4430_RM_L4PER_DMTIMER3_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0044)
200#define OMAP4430_PM_L4PER_DMTIMER4_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0048)
201#define OMAP4430_RM_L4PER_DMTIMER4_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x004c)
202#define OMAP4430_PM_L4PER_DMTIMER9_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0050)
203#define OMAP4430_RM_L4PER_DMTIMER9_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0054)
204#define OMAP4430_RM_L4PER_ELM_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x005c)
205#define OMAP4430_PM_L4PER_GPIO2_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0060)
206#define OMAP4430_RM_L4PER_GPIO2_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0064)
207#define OMAP4430_PM_L4PER_GPIO3_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0068)
208#define OMAP4430_RM_L4PER_GPIO3_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x006c)
209#define OMAP4430_PM_L4PER_GPIO4_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0070)
210#define OMAP4430_RM_L4PER_GPIO4_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0074)
211#define OMAP4430_PM_L4PER_GPIO5_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0078)
212#define OMAP4430_RM_L4PER_GPIO5_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x007c)
213#define OMAP4430_PM_L4PER_GPIO6_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0080)
214#define OMAP4430_RM_L4PER_GPIO6_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0084)
215#define OMAP4430_RM_L4PER_HDQ1W_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x008c)
216#define OMAP4430_PM_L4PER_HECC1_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0090)
217#define OMAP4430_RM_L4PER_HECC1_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0094)
218#define OMAP4430_PM_L4PER_HECC2_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0098)
219#define OMAP4430_RM_L4PER_HECC2_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x009c)
220#define OMAP4430_PM_L4PER_I2C1_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00a0)
221#define OMAP4430_RM_L4PER_I2C1_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00a4)
222#define OMAP4430_PM_L4PER_I2C2_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00a8)
223#define OMAP4430_RM_L4PER_I2C2_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00ac)
224#define OMAP4430_PM_L4PER_I2C3_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00b0)
225#define OMAP4430_RM_L4PER_I2C3_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00b4)
226#define OMAP4430_PM_L4PER_I2C4_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00b8)
227#define OMAP4430_RM_L4PER_I2C4_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00bc)
228#define OMAP4430_RM_L4PER_L4_PER_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00c0)
229#define OMAP4430_PM_L4PER_MCASP2_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00d0)
230#define OMAP4430_RM_L4PER_MCASP2_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00d4)
231#define OMAP4430_PM_L4PER_MCASP3_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00d8)
232#define OMAP4430_RM_L4PER_MCASP3_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00dc)
233#define OMAP4430_PM_L4PER_MCBSP4_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00e0)
234#define OMAP4430_RM_L4PER_MCBSP4_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00e4)
235#define OMAP4430_RM_L4PER_MGATE_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00ec)
236#define OMAP4430_PM_L4PER_MCSPI1_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00f0)
237#define OMAP4430_RM_L4PER_MCSPI1_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00f4)
238#define OMAP4430_PM_L4PER_MCSPI2_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00f8)
239#define OMAP4430_RM_L4PER_MCSPI2_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x00fc)
240#define OMAP4430_PM_L4PER_MCSPI3_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0100)
241#define OMAP4430_RM_L4PER_MCSPI3_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0104)
242#define OMAP4430_PM_L4PER_MCSPI4_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0108)
243#define OMAP4430_RM_L4PER_MCSPI4_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x010c)
244#define OMAP4430_PM_L4PER_MMCSD3_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0120)
245#define OMAP4430_RM_L4PER_MMCSD3_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0124)
246#define OMAP4430_PM_L4PER_MMCSD4_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0128)
247#define OMAP4430_RM_L4PER_MMCSD4_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x012c)
248#define OMAP4430_RM_L4PER_MSPROHG_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0134)
249#define OMAP4430_PM_L4PER_SLIMBUS2_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0138)
250#define OMAP4430_RM_L4PER_SLIMBUS2_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x013c)
251#define OMAP4430_PM_L4PER_UART1_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0140)
252#define OMAP4430_RM_L4PER_UART1_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0144)
253#define OMAP4430_PM_L4PER_UART2_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0148)
254#define OMAP4430_RM_L4PER_UART2_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x014c)
255#define OMAP4430_PM_L4PER_UART3_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0150)
256#define OMAP4430_RM_L4PER_UART3_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0154)
257#define OMAP4430_PM_L4PER_UART4_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0158)
258#define OMAP4430_RM_L4PER_UART4_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x015c)
259#define OMAP4430_PM_L4PER_MMCSD5_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0160)
260#define OMAP4430_RM_L4PER_MMCSD5_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0164)
261#define OMAP4430_PM_L4PER_I2C5_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x0168)
262#define OMAP4430_RM_L4PER_I2C5_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x016c)
263#define OMAP4430_RM_L4SEC_AES1_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x01a4)
264#define OMAP4430_RM_L4SEC_AES2_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x01ac)
265#define OMAP4430_RM_L4SEC_DES3DES_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x01b4)
266#define OMAP4430_RM_L4SEC_PKAEIP29_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x01bc)
267#define OMAP4430_RM_L4SEC_RNG_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x01c4)
268#define OMAP4430_RM_L4SEC_SHA2MD51_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x01cc)
269#define OMAP4430_RM_L4SEC_CRYPTODMA_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_L4PER_MOD, 0x01dc)
270
271/* PRM.CEFUSE_PRM register offsets */
272#define OMAP4430_PM_CEFUSE_PWRSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CEFUSE_MOD, 0x0000)
273#define OMAP4430_PM_CEFUSE_PWRSTST OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CEFUSE_MOD, 0x0004)
274#define OMAP4430_RM_CEFUSE_CEFUSE_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_CEFUSE_MOD, 0x0024)
275
276/* PRM.WKUP_PRM register offsets */
277#define OMAP4430_RM_WKUP_L4WKUP_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x0024)
278#define OMAP4430_RM_WKUP_WDT1_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x002c)
279#define OMAP4430_PM_WKUP_WDT2_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x0030)
280#define OMAP4430_RM_WKUP_WDT2_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x0034)
281#define OMAP4430_PM_WKUP_GPIO1_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x0038)
282#define OMAP4430_RM_WKUP_GPIO1_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x003c)
283#define OMAP4430_PM_WKUP_TIMER1_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x0040)
284#define OMAP4430_RM_WKUP_TIMER1_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x0044)
285#define OMAP4430_PM_WKUP_TIMER12_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x0048)
286#define OMAP4430_RM_WKUP_TIMER12_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x004c)
287#define OMAP4430_RM_WKUP_SYNCTIMER_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x0054)
288#define OMAP4430_PM_WKUP_USIM_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x0058)
289#define OMAP4430_RM_WKUP_USIM_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x005c)
290#define OMAP4430_RM_WKUP_SARRAM_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x0064)
291#define OMAP4430_PM_WKUP_KEYBOARD_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x0078)
292#define OMAP4430_RM_WKUP_KEYBOARD_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x007c)
293#define OMAP4430_PM_WKUP_RTC_WKDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x0080)
294#define OMAP4430_RM_WKUP_RTC_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_MOD, 0x0084)
295
296/* PRM.WKUP_CM register offsets */
297#define OMAP4430_CM_WKUP_CLKSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_CM_MOD, 0x0000)
298#define OMAP4430_CM_WKUP_L4WKUP_CLKCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_CM_MOD, 0x0020)
299#define OMAP4430_CM_WKUP_WDT1_CLKCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_CM_MOD, 0x0028)
300#define OMAP4430_CM_WKUP_WDT2_CLKCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_CM_MOD, 0x0030)
301#define OMAP4430_CM_WKUP_GPIO1_CLKCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_CM_MOD, 0x0038)
302#define OMAP4430_CM_WKUP_TIMER1_CLKCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_CM_MOD, 0x0040)
303#define OMAP4430_CM_WKUP_TIMER12_CLKCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_CM_MOD, 0x0048)
304#define OMAP4430_CM_WKUP_SYNCTIMER_CLKCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_CM_MOD, 0x0050)
305#define OMAP4430_CM_WKUP_USIM_CLKCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_CM_MOD, 0x0058)
306#define OMAP4430_CM_WKUP_SARRAM_CLKCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_CM_MOD, 0x0060)
307#define OMAP4430_CM_WKUP_KEYBOARD_CLKCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_CM_MOD, 0x0078)
308#define OMAP4430_CM_WKUP_RTC_CLKCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_CM_MOD, 0x0080)
309#define OMAP4430_CM_WKUP_BANDGAP_CLKCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_WKUP_CM_MOD, 0x0088)
310
311/* PRM.EMU_PRM register offsets */
312#define OMAP4430_PM_EMU_PWRSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_EMU_MOD, 0x0000)
313#define OMAP4430_PM_EMU_PWRSTST OMAP44XX_PRM_REGADDR(OMAP4430_PRM_EMU_MOD, 0x0004)
314#define OMAP4430_RM_EMU_DEBUGSS_CONTEXT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_EMU_MOD, 0x0024)
315
316/* PRM.EMU_CM register offsets */
317#define OMAP4430_CM_EMU_CLKSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_EMU_CM_MOD, 0x0000)
318#define OMAP4430_CM_EMU_DYNAMICDEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_EMU_CM_MOD, 0x0008)
319#define OMAP4430_CM_EMU_DEBUGSS_CLKCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_EMU_CM_MOD, 0x0020)
320
321/* PRM.DEVICE_PRM register offsets */
322#define OMAP4430_PRM_RSTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0000)
323#define OMAP4430_PRM_RSTST OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0004)
324#define OMAP4430_PRM_RSTTIME OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0008)
325#define OMAP4430_PRM_CLKREQCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x000c)
326#define OMAP4430_PRM_VOLTCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0010)
327#define OMAP4430_PRM_PWRREQCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0014)
328#define OMAP4430_PRM_PSCON_COUNT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0018)
329#define OMAP4430_PRM_IO_COUNT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x001c)
330#define OMAP4430_PRM_IO_PMCTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0020)
331#define OMAP4430_PRM_VOLTSETUP_WARMRESET OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0024)
332#define OMAP4430_PRM_VOLTSETUP_CORE_OFF OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0028)
333#define OMAP4430_PRM_VOLTSETUP_MPU_OFF OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x002c)
334#define OMAP4430_PRM_VOLTSETUP_IVA_OFF OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0030)
335#define OMAP4430_PRM_VOLTSETUP_CORE_RET_SLEEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0034)
336#define OMAP4430_PRM_VOLTSETUP_MPU_RET_SLEEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0038)
337#define OMAP4430_PRM_VOLTSETUP_IVA_RET_SLEEP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x003c)
338#define OMAP4430_PRM_VP_CORE_CONFIG OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0040)
339#define OMAP4430_PRM_VP_CORE_STATUS OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0044)
340#define OMAP4430_PRM_VP_CORE_VLIMITTO OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0048)
341#define OMAP4430_PRM_VP_CORE_VOLTAGE OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x004c)
342#define OMAP4430_PRM_VP_CORE_VSTEPMAX OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0050)
343#define OMAP4430_PRM_VP_CORE_VSTEPMIN OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0054)
344#define OMAP4430_PRM_VP_MPU_CONFIG OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0058)
345#define OMAP4430_PRM_VP_MPU_STATUS OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x005c)
346#define OMAP4430_PRM_VP_MPU_VLIMITTO OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0060)
347#define OMAP4430_PRM_VP_MPU_VOLTAGE OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0064)
348#define OMAP4430_PRM_VP_MPU_VSTEPMAX OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0068)
349#define OMAP4430_PRM_VP_MPU_VSTEPMIN OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x006c)
350#define OMAP4430_PRM_VP_IVA_CONFIG OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0070)
351#define OMAP4430_PRM_VP_IVA_STATUS OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0074)
352#define OMAP4430_PRM_VP_IVA_VLIMITTO OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0078)
353#define OMAP4430_PRM_VP_IVA_VOLTAGE OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x007c)
354#define OMAP4430_PRM_VP_IVA_VSTEPMAX OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0080)
355#define OMAP4430_PRM_VP_IVA_VSTEPMIN OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0084)
356#define OMAP4430_PRM_VC_SMPS_SA OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0088)
357#define OMAP4430_PRM_VC_VAL_SMPS_RA_VOL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x008c)
358#define OMAP4430_PRM_VC_VAL_SMPS_RA_CMD OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0090)
359#define OMAP4430_PRM_VC_VAL_CMD_VDD_CORE_L OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0094)
360#define OMAP4430_PRM_VC_VAL_CMD_VDD_MPU_L OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x0098)
361#define OMAP4430_PRM_VC_VAL_CMD_VDD_IVA_L OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x009c)
362#define OMAP4430_PRM_VC_VAL_BYPASS OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00a0)
363#define OMAP4430_PRM_VC_CFG_CHANNEL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00a4)
364#define OMAP4430_PRM_VC_CFG_I2C_MODE OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00a8)
365#define OMAP4430_PRM_VC_CFG_I2C_CLK OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00ac)
366#define OMAP4430_PRM_SRAM_COUNT OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00b0)
367#define OMAP4430_PRM_SRAM_WKUP_SETUP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00b4)
368#define OMAP4430_PRM_LDO_SRAM_CORE_SETUP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00b8)
369#define OMAP4430_PRM_LDO_SRAM_CORE_CTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00bc)
370#define OMAP4430_PRM_LDO_SRAM_MPU_SETUP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00c0)
371#define OMAP4430_PRM_LDO_SRAM_MPU_CTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00c4)
372#define OMAP4430_PRM_LDO_SRAM_IVA_SETUP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00c8)
373#define OMAP4430_PRM_LDO_SRAM_IVA_CTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00cc)
374#define OMAP4430_PRM_LDO_ABB_MPU_SETUP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00d0)
375#define OMAP4430_PRM_LDO_ABB_MPU_CTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00d4)
376#define OMAP4430_PRM_LDO_ABB_IVA_SETUP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00d8)
377#define OMAP4430_PRM_LDO_ABB_IVA_CTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00dc)
378#define OMAP4430_PRM_LDO_BANDGAP_CTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00e0)
379#define OMAP4430_PRM_DEVICE_OFF_CTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00e4)
380#define OMAP4430_PRM_PHASE1_CNDP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00e8)
381#define OMAP4430_PRM_PHASE2A_CNDP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00ec)
382#define OMAP4430_PRM_PHASE2B_CNDP OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00f0)
383#define OMAP4430_PRM_MODEM_IF_CTRL OMAP44XX_PRM_REGADDR(OMAP4430_PRM_DEVICE_MOD, 0x00f4)
384
385/* CHIRON_PRCM */
386
387
388/* CHIRON_PRCM.CHIRONSS_OCP_SOCKET_PRCM register offsets */
389#define OMAP4430_REVISION_PRCM OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_OCP_SOCKET_PRCM_MOD, 0x0000)
390
391/* CHIRON_PRCM.CHIRONSS_DEVICE_PRM register offsets */
392#define OMAP4430_CHIRON_PRCM_PRM_RSTST OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_DEVICE_PRM_MOD, 0x0000)
393
394/* CHIRON_PRCM.CHIRONSS_CPU0 register offsets */
395#define OMAP4430_PM_PDA_CPU0_PWRSTCTRL OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0000)
396#define OMAP4430_PM_PDA_CPU0_PWRSTST OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0004)
397#define OMAP4430_RM_PDA_CPU0_CPU0_CONTEXT OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0008)
398#define OMAP4430_RM_PDA_CPU0_CPU0_RSTCTRL OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x000c)
399#define OMAP4430_RM_PDA_CPU0_CPU0_RSTST OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0010)
400#define OMAP4430_CM_PDA_CPU0_CPU0_CLKCTRL OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0014)
401#define OMAP4430_CM_PDA_CPU0_CLKSTCTRL OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU0_MOD, 0x0018)
402
403/* CHIRON_PRCM.CHIRONSS_CPU1 register offsets */
404#define OMAP4430_PM_PDA_CPU1_PWRSTCTRL OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0000)
405#define OMAP4430_PM_PDA_CPU1_PWRSTST OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0004)
406#define OMAP4430_RM_PDA_CPU1_CPU1_CONTEXT OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0008)
407#define OMAP4430_RM_PDA_CPU1_CPU1_RSTCTRL OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x000c)
408#define OMAP4430_RM_PDA_CPU1_CPU1_RSTST OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0010)
409#define OMAP4430_CM_PDA_CPU1_CPU1_CLKCTRL OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0014)
410#define OMAP4430_CM_PDA_CPU1_CLKSTCTRL OMAP44XX_CHIRONSS_REGADDR(OMAP4430_CHIRONSS_CHIRONSS_CPU1_MOD, 0x0018)
411#endif
diff --git a/arch/arm/mach-omap2/sdram-hynix-h8mbx00u0mer-0em.h b/arch/arm/mach-omap2/sdram-hynix-h8mbx00u0mer-0em.h
new file mode 100644
index 000000000000..8bfaf342a028
--- /dev/null
+++ b/arch/arm/mach-omap2/sdram-hynix-h8mbx00u0mer-0em.h
@@ -0,0 +1,51 @@
1/*
2 * SDRC register values for the Hynix H8MBX00U0MER-0EM
3 *
4 * Copyright (C) 2009 Texas Instruments, Inc.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#ifndef __ARCH_ARM_MACH_OMAP2_SDRAM_HYNIX_H8MBX00U0MER0EM
12#define __ARCH_ARM_MACH_OMAP2_SDRAM_HYNIX_H8MBX00U0MER0EM
13
14#include <plat/sdrc.h>
15
16/* Hynix H8MBX00U0MER-0EM */
17static struct omap_sdrc_params h8mbx00u0mer0em_sdrc_params[] = {
18 [0] = {
19 .rate = 200000000,
20 .actim_ctrla = 0xa2e1b4c6,
21 .actim_ctrlb = 0x0002131c,
22 .rfr_ctrl = 0x0005e601,
23 .mr = 0x00000032,
24 },
25 [1] = {
26 .rate = 166000000,
27 .actim_ctrla = 0x629db4c6,
28 .actim_ctrlb = 0x00012214,
29 .rfr_ctrl = 0x0004dc01,
30 .mr = 0x00000032,
31 },
32 [2] = {
33 .rate = 100000000,
34 .actim_ctrla = 0x51912284,
35 .actim_ctrlb = 0x0002120e,
36 .rfr_ctrl = 0x0002d101,
37 .mr = 0x00000022,
38 },
39 [3] = {
40 .rate = 83000000,
41 .actim_ctrla = 0x31512283,
42 .actim_ctrlb = 0x0001220a,
43 .rfr_ctrl = 0x00025501,
44 .mr = 0x00000022,
45 },
46 [4] = {
47 .rate = 0
48 },
49};
50
51#endif
diff --git a/arch/arm/mach-omap2/sdram-micron-mt46h32m32lf-6.h b/arch/arm/mach-omap2/sdram-micron-mt46h32m32lf-6.h
index 02e1c2d4705f..a391b4939f74 100644
--- a/arch/arm/mach-omap2/sdram-micron-mt46h32m32lf-6.h
+++ b/arch/arm/mach-omap2/sdram-micron-mt46h32m32lf-6.h
@@ -14,7 +14,7 @@
14#ifndef ARCH_ARM_MACH_OMAP2_SDRAM_MICRON_MT46H32M32LF 14#ifndef ARCH_ARM_MACH_OMAP2_SDRAM_MICRON_MT46H32M32LF
15#define ARCH_ARM_MACH_OMAP2_SDRAM_MICRON_MT46H32M32LF 15#define ARCH_ARM_MACH_OMAP2_SDRAM_MICRON_MT46H32M32LF
16 16
17#include <mach/sdrc.h> 17#include <plat/sdrc.h>
18 18
19/* Micron MT46H32M32LF-6 */ 19/* Micron MT46H32M32LF-6 */
20/* XXX Using ARE = 0x1 (no autorefresh burst) -- can this be changed? */ 20/* XXX Using ARE = 0x1 (no autorefresh burst) -- can this be changed? */
diff --git a/arch/arm/mach-omap2/sdram-numonyx-m65kxxxxam.h b/arch/arm/mach-omap2/sdram-numonyx-m65kxxxxam.h
new file mode 100644
index 000000000000..cd4352917022
--- /dev/null
+++ b/arch/arm/mach-omap2/sdram-numonyx-m65kxxxxam.h
@@ -0,0 +1,51 @@
1/*
2 * SDRC register values for the Numonyx M65KXXXXAM
3 *
4 * Copyright (C) 2009 Integration Software and Electronic Engineering.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#ifndef __ARCH_ARM_MACH_OMAP2_SDRAM_NUMONYX_M65KXXXXAM
12#define __ARCH_ARM_MACH_OMAP2_SDRAM_NUMONYX_M65KXXXXAM
13
14#include <plat/sdrc.h>
15
16/* Numonyx M65KXXXXAM */
17static struct omap_sdrc_params m65kxxxxam_sdrc_params[] = {
18 [0] = {
19 .rate = 200000000,
20 .actim_ctrla = 0xe321d4c6,
21 .actim_ctrlb = 0x00022328,
22 .rfr_ctrl = 0x0005e601,
23 .mr = 0x00000032,
24 },
25 [1] = {
26 .rate = 166000000,
27 .actim_ctrla = 0xba9dc485,
28 .actim_ctrlb = 0x00022321,
29 .rfr_ctrl = 0x0004dc01,
30 .mr = 0x00000032,
31 },
32 [2] = {
33 .rate = 133000000,
34 .actim_ctrla = 0x9a19b485,
35 .actim_ctrlb = 0x0002231b,
36 .rfr_ctrl = 0x0003de01,
37 .mr = 0x00000032,
38 },
39 [3] = {
40 .rate = 83000000,
41 .actim_ctrla = 0x594ca242,
42 .actim_ctrlb = 0x00022310,
43 .rfr_ctrl = 0x00025501,
44 .mr = 0x00000032,
45 },
46 [4] = {
47 .rate = 0
48 },
49};
50
51#endif
diff --git a/arch/arm/mach-omap2/sdram-qimonda-hyb18m512160af-6.h b/arch/arm/mach-omap2/sdram-qimonda-hyb18m512160af-6.h
index 3751d293cb1f..0e518a72831f 100644
--- a/arch/arm/mach-omap2/sdram-qimonda-hyb18m512160af-6.h
+++ b/arch/arm/mach-omap2/sdram-qimonda-hyb18m512160af-6.h
@@ -14,7 +14,7 @@
14#ifndef ARCH_ARM_MACH_OMAP2_SDRAM_QIMONDA_HYB18M512160AF6 14#ifndef ARCH_ARM_MACH_OMAP2_SDRAM_QIMONDA_HYB18M512160AF6
15#define ARCH_ARM_MACH_OMAP2_SDRAM_QIMONDA_HYB18M512160AF6 15#define ARCH_ARM_MACH_OMAP2_SDRAM_QIMONDA_HYB18M512160AF6
16 16
17#include <mach/sdrc.h> 17#include <plat/sdrc.h>
18 18
19/* Qimonda HYB18M512160AF-6 */ 19/* Qimonda HYB18M512160AF-6 */
20static struct omap_sdrc_params hyb18m512160af6_sdrc_params[] = { 20static struct omap_sdrc_params hyb18m512160af6_sdrc_params[] = {
diff --git a/arch/arm/mach-omap2/sdrc.c b/arch/arm/mach-omap2/sdrc.c
index 9e3bd4fa7810..4c65f5628b39 100644
--- a/arch/arm/mach-omap2/sdrc.c
+++ b/arch/arm/mach-omap2/sdrc.c
@@ -23,13 +23,13 @@
23#include <linux/clk.h> 23#include <linux/clk.h>
24#include <linux/io.h> 24#include <linux/io.h>
25 25
26#include <mach/common.h> 26#include <plat/common.h>
27#include <mach/clock.h> 27#include <plat/clock.h>
28#include <mach/sram.h> 28#include <plat/sram.h>
29 29
30#include "prm.h" 30#include "prm.h"
31 31
32#include <mach/sdrc.h> 32#include <plat/sdrc.h>
33#include "sdrc.h" 33#include "sdrc.h"
34 34
35static struct omap_sdrc_params *sdrc_init_params_cs0, *sdrc_init_params_cs1; 35static struct omap_sdrc_params *sdrc_init_params_cs0, *sdrc_init_params_cs1;
@@ -37,12 +37,38 @@ static struct omap_sdrc_params *sdrc_init_params_cs0, *sdrc_init_params_cs1;
37void __iomem *omap2_sdrc_base; 37void __iomem *omap2_sdrc_base;
38void __iomem *omap2_sms_base; 38void __iomem *omap2_sms_base;
39 39
40struct omap2_sms_regs {
41 u32 sms_sysconfig;
42};
43
44static struct omap2_sms_regs sms_context;
45
40/* SDRC_POWER register bits */ 46/* SDRC_POWER register bits */
41#define SDRC_POWER_EXTCLKDIS_SHIFT 3 47#define SDRC_POWER_EXTCLKDIS_SHIFT 3
42#define SDRC_POWER_PWDENA_SHIFT 2 48#define SDRC_POWER_PWDENA_SHIFT 2
43#define SDRC_POWER_PAGEPOLICY_SHIFT 0 49#define SDRC_POWER_PAGEPOLICY_SHIFT 0
44 50
45/** 51/**
52 * omap2_sms_save_context - Save SMS registers
53 *
54 * Save SMS registers that need to be restored after off mode.
55 */
56void omap2_sms_save_context(void)
57{
58 sms_context.sms_sysconfig = sms_read_reg(SMS_SYSCONFIG);
59}
60
61/**
62 * omap2_sms_restore_context - Restore SMS registers
63 *
64 * Restore SMS registers that need to be Restored after off mode.
65 */
66void omap2_sms_restore_context(void)
67{
68 sms_write_reg(sms_context.sms_sysconfig, SMS_SYSCONFIG);
69}
70
71/**
46 * omap2_sdrc_get_params - return SDRC register values for a given clock rate 72 * omap2_sdrc_get_params - return SDRC register values for a given clock rate
47 * @r: SDRC clock rate (in Hz) 73 * @r: SDRC clock rate (in Hz)
48 * @sdrc_cs0: chip select 0 ram timings ** 74 * @sdrc_cs0: chip select 0 ram timings **
@@ -93,8 +119,15 @@ int omap2_sdrc_get_params(unsigned long r,
93 119
94void __init omap2_set_globals_sdrc(struct omap_globals *omap2_globals) 120void __init omap2_set_globals_sdrc(struct omap_globals *omap2_globals)
95{ 121{
96 omap2_sdrc_base = omap2_globals->sdrc; 122 /* Static mapping, never released */
97 omap2_sms_base = omap2_globals->sms; 123 if (omap2_globals->sdrc) {
124 omap2_sdrc_base = ioremap(omap2_globals->sdrc, SZ_64K);
125 WARN_ON(!omap2_sdrc_base);
126 }
127 if (omap2_globals->sms) {
128 omap2_sms_base = ioremap(omap2_globals->sms, SZ_64K);
129 WARN_ON(!omap2_sms_base);
130 }
98} 131}
99 132
100/** 133/**
@@ -132,4 +165,21 @@ void __init omap2_sdrc_init(struct omap_sdrc_params *sdrc_cs0,
132 l = (1 << SDRC_POWER_EXTCLKDIS_SHIFT) | 165 l = (1 << SDRC_POWER_EXTCLKDIS_SHIFT) |
133 (1 << SDRC_POWER_PAGEPOLICY_SHIFT); 166 (1 << SDRC_POWER_PAGEPOLICY_SHIFT);
134 sdrc_write_reg(l, SDRC_POWER); 167 sdrc_write_reg(l, SDRC_POWER);
168 omap2_sms_save_context();
135} 169}
170
171void omap2_sms_write_rot_control(u32 val, unsigned ctx)
172{
173 sms_write_reg(val, SMS_ROT_CONTROL(ctx));
174}
175
176void omap2_sms_write_rot_size(u32 val, unsigned ctx)
177{
178 sms_write_reg(val, SMS_ROT_SIZE(ctx));
179}
180
181void omap2_sms_write_rot_physical_ba(u32 val, unsigned ctx)
182{
183 sms_write_reg(val, SMS_ROT_PHYSICAL_BA(ctx));
184}
185
diff --git a/arch/arm/mach-omap2/sdrc.h b/arch/arm/mach-omap2/sdrc.h
index 0837eda5f2b6..68f57bb67fc5 100644
--- a/arch/arm/mach-omap2/sdrc.h
+++ b/arch/arm/mach-omap2/sdrc.h
@@ -15,9 +15,12 @@
15 */ 15 */
16#undef DEBUG 16#undef DEBUG
17 17
18#include <mach/sdrc.h> 18#include <plat/sdrc.h>
19 19
20#ifndef __ASSEMBLER__ 20#ifndef __ASSEMBLER__
21
22#include <linux/io.h>
23
21extern void __iomem *omap2_sdrc_base; 24extern void __iomem *omap2_sdrc_base;
22extern void __iomem *omap2_sms_base; 25extern void __iomem *omap2_sms_base;
23 26
@@ -48,9 +51,28 @@ static inline u32 sms_read_reg(u16 reg)
48 return __raw_readl(OMAP_SMS_REGADDR(reg)); 51 return __raw_readl(OMAP_SMS_REGADDR(reg));
49} 52}
50#else 53#else
51#define OMAP242X_SDRC_REGADDR(reg) OMAP2_IO_ADDRESS(OMAP2420_SDRC_BASE + (reg)) 54#define OMAP242X_SDRC_REGADDR(reg) \
52#define OMAP243X_SDRC_REGADDR(reg) OMAP2_IO_ADDRESS(OMAP243X_SDRC_BASE + (reg)) 55 OMAP2_L3_IO_ADDRESS(OMAP2420_SDRC_BASE + (reg))
53#define OMAP34XX_SDRC_REGADDR(reg) OMAP2_IO_ADDRESS(OMAP343X_SDRC_BASE + (reg)) 56#define OMAP243X_SDRC_REGADDR(reg) \
57 OMAP2_L3_IO_ADDRESS(OMAP243X_SDRC_BASE + (reg))
58#define OMAP34XX_SDRC_REGADDR(reg) \
59 OMAP2_L3_IO_ADDRESS(OMAP343X_SDRC_BASE + (reg))
54#endif /* __ASSEMBLER__ */ 60#endif /* __ASSEMBLER__ */
55 61
62/* Minimum frequency that the SDRC DLL can lock at */
63#define MIN_SDRC_DLL_LOCK_FREQ 83000000
64
65/* Scale factor for fixed-point arith in omap3_core_dpll_m2_set_rate() */
66#define SDRC_MPURATE_SCALE 8
67
68/* 2^SDRC_MPURATE_BASE_SHIFT: MPU MHz that SDRC_MPURATE_LOOPS is defined for */
69#define SDRC_MPURATE_BASE_SHIFT 9
70
71/*
72 * SDRC_MPURATE_LOOPS: Number of MPU loops to execute at
73 * 2^MPURATE_BASE_SHIFT MHz for SDRC to stabilize
74 */
75#define SDRC_MPURATE_LOOPS 96
76
77
56#endif 78#endif
diff --git a/arch/arm/mach-omap2/sdrc2xxx.c b/arch/arm/mach-omap2/sdrc2xxx.c
index feaec7eaf6bd..0f4d27aef44d 100644
--- a/arch/arm/mach-omap2/sdrc2xxx.c
+++ b/arch/arm/mach-omap2/sdrc2xxx.c
@@ -24,13 +24,13 @@
24#include <linux/clk.h> 24#include <linux/clk.h>
25#include <linux/io.h> 25#include <linux/io.h>
26 26
27#include <mach/common.h> 27#include <plat/common.h>
28#include <mach/clock.h> 28#include <plat/clock.h>
29#include <mach/sram.h> 29#include <plat/sram.h>
30 30
31#include "prm.h" 31#include "prm.h"
32#include "clock.h" 32#include "clock.h"
33#include <mach/sdrc.h> 33#include <plat/sdrc.h>
34#include "sdrc.h" 34#include "sdrc.h"
35 35
36/* Memory timing, DLL mode flags */ 36/* Memory timing, DLL mode flags */
diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c
index 54dfeb5d5667..3771254dfa81 100644
--- a/arch/arm/mach-omap2/serial.c
+++ b/arch/arm/mach-omap2/serial.c
@@ -23,19 +23,27 @@
23#include <linux/serial_reg.h> 23#include <linux/serial_reg.h>
24#include <linux/clk.h> 24#include <linux/clk.h>
25#include <linux/io.h> 25#include <linux/io.h>
26#include <linux/delay.h>
26 27
27#include <mach/common.h> 28#include <plat/common.h>
28#include <mach/board.h> 29#include <plat/board.h>
29#include <mach/clock.h> 30#include <plat/clock.h>
30#include <mach/control.h> 31#include <plat/control.h>
31 32
32#include "prm.h" 33#include "prm.h"
33#include "pm.h" 34#include "pm.h"
34#include "prm-regbits-34xx.h" 35#include "prm-regbits-34xx.h"
35 36
37#define UART_OMAP_NO_EMPTY_FIFO_READ_IP_REV 0x52
36#define UART_OMAP_WER 0x17 /* Wake-up enable register */ 38#define UART_OMAP_WER 0x17 /* Wake-up enable register */
37 39
38#define DEFAULT_TIMEOUT (5 * HZ) 40/*
41 * NOTE: By default the serial timeout is disabled as it causes lost characters
42 * over the serial ports. This means that the UART clocks will stay on until
43 * disabled via sysfs. This also causes that any deeper omap sleep states are
44 * blocked.
45 */
46#define DEFAULT_TIMEOUT 0
39 47
40struct omap_uart_state { 48struct omap_uart_state {
41 int num; 49 int num;
@@ -73,8 +81,6 @@ static LIST_HEAD(uart_list);
73 81
74static struct plat_serial8250_port serial_platform_data0[] = { 82static struct plat_serial8250_port serial_platform_data0[] = {
75 { 83 {
76 .membase = OMAP2_IO_ADDRESS(OMAP_UART1_BASE),
77 .mapbase = OMAP_UART1_BASE,
78 .irq = 72, 84 .irq = 72,
79 .flags = UPF_BOOT_AUTOCONF, 85 .flags = UPF_BOOT_AUTOCONF,
80 .iotype = UPIO_MEM, 86 .iotype = UPIO_MEM,
@@ -87,8 +93,6 @@ static struct plat_serial8250_port serial_platform_data0[] = {
87 93
88static struct plat_serial8250_port serial_platform_data1[] = { 94static struct plat_serial8250_port serial_platform_data1[] = {
89 { 95 {
90 .membase = OMAP2_IO_ADDRESS(OMAP_UART2_BASE),
91 .mapbase = OMAP_UART2_BASE,
92 .irq = 73, 96 .irq = 73,
93 .flags = UPF_BOOT_AUTOCONF, 97 .flags = UPF_BOOT_AUTOCONF,
94 .iotype = UPIO_MEM, 98 .iotype = UPIO_MEM,
@@ -101,8 +105,6 @@ static struct plat_serial8250_port serial_platform_data1[] = {
101 105
102static struct plat_serial8250_port serial_platform_data2[] = { 106static struct plat_serial8250_port serial_platform_data2[] = {
103 { 107 {
104 .membase = OMAP2_IO_ADDRESS(OMAP_UART3_BASE),
105 .mapbase = OMAP_UART3_BASE,
106 .irq = 74, 108 .irq = 74,
107 .flags = UPF_BOOT_AUTOCONF, 109 .flags = UPF_BOOT_AUTOCONF,
108 .iotype = UPIO_MEM, 110 .iotype = UPIO_MEM,
@@ -113,11 +115,8 @@ static struct plat_serial8250_port serial_platform_data2[] = {
113 } 115 }
114}; 116};
115 117
116#ifdef CONFIG_ARCH_OMAP4
117static struct plat_serial8250_port serial_platform_data3[] = { 118static struct plat_serial8250_port serial_platform_data3[] = {
118 { 119 {
119 .membase = OMAP2_IO_ADDRESS(OMAP_UART4_BASE),
120 .mapbase = OMAP_UART4_BASE,
121 .irq = 70, 120 .irq = 70,
122 .flags = UPF_BOOT_AUTOCONF, 121 .flags = UPF_BOOT_AUTOCONF,
123 .iotype = UPIO_MEM, 122 .iotype = UPIO_MEM,
@@ -127,7 +126,22 @@ static struct plat_serial8250_port serial_platform_data3[] = {
127 .flags = 0 126 .flags = 0
128 } 127 }
129}; 128};
130#endif 129
130void __init omap2_set_globals_uart(struct omap_globals *omap2_globals)
131{
132 serial_platform_data0[0].mapbase = omap2_globals->uart1_phys;
133 serial_platform_data1[0].mapbase = omap2_globals->uart2_phys;
134 serial_platform_data2[0].mapbase = omap2_globals->uart3_phys;
135 serial_platform_data3[0].mapbase = omap2_globals->uart4_phys;
136}
137
138static inline unsigned int __serial_read_reg(struct uart_port *up,
139 int offset)
140{
141 offset <<= up->regshift;
142 return (unsigned int)__raw_readb(up->membase + offset);
143}
144
131static inline unsigned int serial_read_reg(struct plat_serial8250_port *up, 145static inline unsigned int serial_read_reg(struct plat_serial8250_port *up,
132 int offset) 146 int offset)
133{ 147{
@@ -135,6 +149,13 @@ static inline unsigned int serial_read_reg(struct plat_serial8250_port *up,
135 return (unsigned int)__raw_readb(up->membase + offset); 149 return (unsigned int)__raw_readb(up->membase + offset);
136} 150}
137 151
152static inline void __serial_write_reg(struct uart_port *up, int offset,
153 int value)
154{
155 offset <<= up->regshift;
156 __raw_writeb(value, up->membase + offset);
157}
158
138static inline void serial_write_reg(struct plat_serial8250_port *p, int offset, 159static inline void serial_write_reg(struct plat_serial8250_port *p, int offset,
139 int value) 160 int value)
140{ 161{
@@ -159,8 +180,6 @@ static inline void __init omap_uart_reset(struct omap_uart_state *uart)
159 180
160#if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP3) 181#if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP3)
161 182
162static int enable_off_mode; /* to be removed by full off-mode patches */
163
164static void omap_uart_save_context(struct omap_uart_state *uart) 183static void omap_uart_save_context(struct omap_uart_state *uart)
165{ 184{
166 u16 lcr = 0; 185 u16 lcr = 0;
@@ -420,7 +439,8 @@ static void omap_uart_idle_init(struct omap_uart_state *uart)
420 uart->timeout = DEFAULT_TIMEOUT; 439 uart->timeout = DEFAULT_TIMEOUT;
421 setup_timer(&uart->timer, omap_uart_idle_timer, 440 setup_timer(&uart->timer, omap_uart_idle_timer,
422 (unsigned long) uart); 441 (unsigned long) uart);
423 mod_timer(&uart->timer, jiffies + uart->timeout); 442 if (uart->timeout)
443 mod_timer(&uart->timer, jiffies + uart->timeout);
424 omap_uart_smart_idle_enable(uart, 0); 444 omap_uart_smart_idle_enable(uart, 0);
425 445
426 if (cpu_is_omap34xx()) { 446 if (cpu_is_omap34xx()) {
@@ -518,7 +538,7 @@ static ssize_t sleep_timeout_store(struct device *dev,
518 unsigned int value; 538 unsigned int value;
519 539
520 if (sscanf(buf, "%u", &value) != 1) { 540 if (sscanf(buf, "%u", &value) != 1) {
521 printk(KERN_ERR "sleep_timeout_store: Invalid value\n"); 541 dev_err(dev, "sleep_timeout_store: Invalid value\n");
522 return -EINVAL; 542 return -EINVAL;
523 } 543 }
524 544
@@ -539,7 +559,7 @@ static inline void omap_uart_idle_init(struct omap_uart_state *uart) {}
539#define DEV_CREATE_FILE(dev, attr) 559#define DEV_CREATE_FILE(dev, attr)
540#endif /* CONFIG_PM */ 560#endif /* CONFIG_PM */
541 561
542static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS] = { 562static struct omap_uart_state omap_uart[] = {
543 { 563 {
544 .pdev = { 564 .pdev = {
545 .name = "serial8250", 565 .name = "serial8250",
@@ -565,7 +585,7 @@ static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS] = {
565 }, 585 },
566 }, 586 },
567 }, 587 },
568#ifdef CONFIG_ARCH_OMAP4 588#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
569 { 589 {
570 .pdev = { 590 .pdev = {
571 .name = "serial8250", 591 .name = "serial8250",
@@ -578,34 +598,87 @@ static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS] = {
578#endif 598#endif
579}; 599};
580 600
601/*
602 * Override the default 8250 read handler: mem_serial_in()
603 * Empty RX fifo read causes an abort on omap3630 and omap4
604 * This function makes sure that an empty rx fifo is not read on these silicons
605 * (OMAP1/2/3430 are not affected)
606 */
607static unsigned int serial_in_override(struct uart_port *up, int offset)
608{
609 if (UART_RX == offset) {
610 unsigned int lsr;
611 lsr = __serial_read_reg(up, UART_LSR);
612 if (!(lsr & UART_LSR_DR))
613 return -EPERM;
614 }
615
616 return __serial_read_reg(up, offset);
617}
618
619static void serial_out_override(struct uart_port *up, int offset, int value)
620{
621 unsigned int status, tmout = 10000;
622
623 status = __serial_read_reg(up, UART_LSR);
624 while (!(status & UART_LSR_THRE)) {
625 /* Wait up to 10ms for the character(s) to be sent. */
626 if (--tmout == 0)
627 break;
628 udelay(1);
629 status = __serial_read_reg(up, UART_LSR);
630 }
631 __serial_write_reg(up, offset, value);
632}
581void __init omap_serial_early_init(void) 633void __init omap_serial_early_init(void)
582{ 634{
583 int i; 635 int i, nr_ports;
584 char name[16]; 636 char name[16];
585 637
638 if (!(cpu_is_omap3630() || cpu_is_omap4430()))
639 nr_ports = 3;
640 else
641 nr_ports = ARRAY_SIZE(omap_uart);
642
586 /* 643 /*
587 * Make sure the serial ports are muxed on at this point. 644 * Make sure the serial ports are muxed on at this point.
588 * You have to mux them off in device drivers later on 645 * You have to mux them off in device drivers later on
589 * if not needed. 646 * if not needed.
590 */ 647 */
591 648
592 for (i = 0; i < OMAP_MAX_NR_PORTS; i++) { 649 for (i = 0; i < nr_ports; i++) {
593 struct omap_uart_state *uart = &omap_uart[i]; 650 struct omap_uart_state *uart = &omap_uart[i];
594 struct platform_device *pdev = &uart->pdev; 651 struct platform_device *pdev = &uart->pdev;
595 struct device *dev = &pdev->dev; 652 struct device *dev = &pdev->dev;
596 struct plat_serial8250_port *p = dev->platform_data; 653 struct plat_serial8250_port *p = dev->platform_data;
597 654
598 sprintf(name, "uart%d_ick", i+1); 655 /* Don't map zero-based physical address */
656 if (p->mapbase == 0) {
657 dev_warn(dev, "no physical address for uart#%d,"
658 " so skipping early_init...\n", i);
659 continue;
660 }
661 /*
662 * Module 4KB + L4 interconnect 4KB
663 * Static mapping, never released
664 */
665 p->membase = ioremap(p->mapbase, SZ_8K);
666 if (!p->membase) {
667 dev_err(dev, "ioremap failed for uart%i\n", i + 1);
668 continue;
669 }
670
671 sprintf(name, "uart%d_ick", i + 1);
599 uart->ick = clk_get(NULL, name); 672 uart->ick = clk_get(NULL, name);
600 if (IS_ERR(uart->ick)) { 673 if (IS_ERR(uart->ick)) {
601 printk(KERN_ERR "Could not get uart%d_ick\n", i+1); 674 dev_err(dev, "Could not get uart%d_ick\n", i + 1);
602 uart->ick = NULL; 675 uart->ick = NULL;
603 } 676 }
604 677
605 sprintf(name, "uart%d_fck", i+1); 678 sprintf(name, "uart%d_fck", i+1);
606 uart->fck = clk_get(NULL, name); 679 uart->fck = clk_get(NULL, name);
607 if (IS_ERR(uart->fck)) { 680 if (IS_ERR(uart->fck)) {
608 printk(KERN_ERR "Could not get uart%d_fck\n", i+1); 681 dev_err(dev, "Could not get uart%d_fck\n", i + 1);
609 uart->fck = NULL; 682 uart->fck = NULL;
610 } 683 }
611 684
@@ -618,33 +691,90 @@ void __init omap_serial_early_init(void)
618 uart->num = i; 691 uart->num = i;
619 p->private_data = uart; 692 p->private_data = uart;
620 uart->p = p; 693 uart->p = p;
621 list_add_tail(&uart->node, &uart_list);
622 694
623 if (cpu_is_omap44xx()) 695 if (cpu_is_omap44xx())
624 p->irq += 32; 696 p->irq += 32;
625
626 omap_uart_enable_clocks(uart);
627 } 697 }
628} 698}
629 699
630void __init omap_serial_init(void) 700/**
701 * omap_serial_init_port() - initialize single serial port
702 * @port: serial port number (0-3)
703 *
704 * This function initialies serial driver for given @port only.
705 * Platforms can call this function instead of omap_serial_init()
706 * if they don't plan to use all available UARTs as serial ports.
707 *
708 * Don't mix calls to omap_serial_init_port() and omap_serial_init(),
709 * use only one of the two.
710 */
711void __init omap_serial_init_port(int port)
631{ 712{
632 int i; 713 struct omap_uart_state *uart;
714 struct platform_device *pdev;
715 struct device *dev;
633 716
634 for (i = 0; i < OMAP_MAX_NR_PORTS; i++) { 717 BUG_ON(port < 0);
635 struct omap_uart_state *uart = &omap_uart[i]; 718 BUG_ON(port >= ARRAY_SIZE(omap_uart));
636 struct platform_device *pdev = &uart->pdev;
637 struct device *dev = &pdev->dev;
638 719
639 omap_uart_reset(uart); 720 uart = &omap_uart[port];
640 omap_uart_idle_init(uart); 721 pdev = &uart->pdev;
722 dev = &pdev->dev;
641 723
642 if (WARN_ON(platform_device_register(pdev))) 724 /* Don't proceed if there's no clocks available */
643 continue; 725 if (unlikely(!uart->ick || !uart->fck)) {
644 if ((cpu_is_omap34xx() && uart->padconf) || 726 WARN(1, "%s: can't init uart%d, no clocks available\n",
645 (uart->wk_en && uart->wk_mask)) { 727 kobject_name(&dev->kobj), port);
646 device_init_wakeup(dev, true); 728 return;
647 DEV_CREATE_FILE(dev, &dev_attr_sleep_timeout);
648 }
649 } 729 }
730
731 omap_uart_enable_clocks(uart);
732
733 omap_uart_reset(uart);
734 omap_uart_idle_init(uart);
735
736 list_add_tail(&uart->node, &uart_list);
737
738 if (WARN_ON(platform_device_register(pdev)))
739 return;
740
741 if ((cpu_is_omap34xx() && uart->padconf) ||
742 (uart->wk_en && uart->wk_mask)) {
743 device_init_wakeup(dev, true);
744 DEV_CREATE_FILE(dev, &dev_attr_sleep_timeout);
745 }
746
747 /*
748 * omap44xx: Never read empty UART fifo
749 * omap3xxx: Never read empty UART fifo on UARTs
750 * with IP rev >=0x52
751 */
752 if (cpu_is_omap44xx()) {
753 uart->p->serial_in = serial_in_override;
754 uart->p->serial_out = serial_out_override;
755 } else if ((serial_read_reg(uart->p, UART_OMAP_MVER) & 0xFF)
756 >= UART_OMAP_NO_EMPTY_FIFO_READ_IP_REV) {
757 uart->p->serial_in = serial_in_override;
758 uart->p->serial_out = serial_out_override;
759 }
760}
761
762/**
763 * omap_serial_init() - intialize all supported serial ports
764 *
765 * Initializes all available UARTs as serial ports. Platforms
766 * can call this function when they want to have default behaviour
767 * for serial ports (e.g initialize them all as serial ports).
768 */
769void __init omap_serial_init(void)
770{
771 int i, nr_ports;
772
773 if (!(cpu_is_omap3630() || cpu_is_omap4430()))
774 nr_ports = 3;
775 else
776 nr_ports = ARRAY_SIZE(omap_uart);
777
778 for (i = 0; i < nr_ports; i++)
779 omap_serial_init_port(i);
650} 780}
diff --git a/arch/arm/mach-omap2/sleep24xx.S b/arch/arm/mach-omap2/sleep24xx.S
index 130aadbfa083..c7780cc8d919 100644
--- a/arch/arm/mach-omap2/sleep24xx.S
+++ b/arch/arm/mach-omap2/sleep24xx.S
@@ -29,7 +29,7 @@
29#include <asm/assembler.h> 29#include <asm/assembler.h>
30#include <mach/io.h> 30#include <mach/io.h>
31 31
32#include <mach/omap24xx.h> 32#include <plat/omap24xx.h>
33 33
34#include "sdrc.h" 34#include "sdrc.h"
35 35
diff --git a/arch/arm/mach-omap2/sleep34xx.S b/arch/arm/mach-omap2/sleep34xx.S
index e5e2553e79a6..d522cd70bf53 100644
--- a/arch/arm/mach-omap2/sleep34xx.S
+++ b/arch/arm/mach-omap2/sleep34xx.S
@@ -27,22 +27,68 @@
27#include <linux/linkage.h> 27#include <linux/linkage.h>
28#include <asm/assembler.h> 28#include <asm/assembler.h>
29#include <mach/io.h> 29#include <mach/io.h>
30#include <mach/control.h> 30#include <plat/control.h>
31 31
32#include "cm.h"
32#include "prm.h" 33#include "prm.h"
33#include "sdrc.h" 34#include "sdrc.h"
34 35
36#define SDRC_SCRATCHPAD_SEM_V 0xfa00291c
37
35#define PM_PREPWSTST_CORE_V OMAP34XX_PRM_REGADDR(CORE_MOD, \ 38#define PM_PREPWSTST_CORE_V OMAP34XX_PRM_REGADDR(CORE_MOD, \
36 OMAP3430_PM_PREPWSTST) 39 OMAP3430_PM_PREPWSTST)
40#define PM_PREPWSTST_CORE_P 0x48306AE8
37#define PM_PREPWSTST_MPU_V OMAP34XX_PRM_REGADDR(MPU_MOD, \ 41#define PM_PREPWSTST_MPU_V OMAP34XX_PRM_REGADDR(MPU_MOD, \
38 OMAP3430_PM_PREPWSTST) 42 OMAP3430_PM_PREPWSTST)
39#define PM_PWSTCTRL_MPU_P OMAP34XX_PRM_REGADDR(MPU_MOD, PM_PWSTCTRL) 43#define PM_PWSTCTRL_MPU_P OMAP3430_PRM_BASE + MPU_MOD + OMAP2_PM_PWSTCTRL
44#define CM_IDLEST1_CORE_V OMAP34XX_CM_REGADDR(CORE_MOD, CM_IDLEST1)
45#define SRAM_BASE_P 0x40200000
46#define CONTROL_STAT 0x480022F0
40#define SCRATCHPAD_MEM_OFFS 0x310 /* Move this as correct place is 47#define SCRATCHPAD_MEM_OFFS 0x310 /* Move this as correct place is
41 * available */ 48 * available */
42#define SCRATCHPAD_BASE_P OMAP343X_CTRL_REGADDR(\ 49#define SCRATCHPAD_BASE_P (OMAP343X_CTRL_BASE + OMAP343X_CONTROL_MEM_WKUP\
43 OMAP343X_CONTROL_MEM_WKUP +\ 50 + SCRATCHPAD_MEM_OFFS)
44 SCRATCHPAD_MEM_OFFS)
45#define SDRC_POWER_V OMAP34XX_SDRC_REGADDR(SDRC_POWER) 51#define SDRC_POWER_V OMAP34XX_SDRC_REGADDR(SDRC_POWER)
52#define SDRC_SYSCONFIG_P (OMAP343X_SDRC_BASE + SDRC_SYSCONFIG)
53#define SDRC_MR_0_P (OMAP343X_SDRC_BASE + SDRC_MR_0)
54#define SDRC_EMR2_0_P (OMAP343X_SDRC_BASE + SDRC_EMR2_0)
55#define SDRC_MANUAL_0_P (OMAP343X_SDRC_BASE + SDRC_MANUAL_0)
56#define SDRC_MR_1_P (OMAP343X_SDRC_BASE + SDRC_MR_1)
57#define SDRC_EMR2_1_P (OMAP343X_SDRC_BASE + SDRC_EMR2_1)
58#define SDRC_MANUAL_1_P (OMAP343X_SDRC_BASE + SDRC_MANUAL_1)
59#define SDRC_DLLA_STATUS_V OMAP34XX_SDRC_REGADDR(SDRC_DLLA_STATUS)
60#define SDRC_DLLA_CTRL_V OMAP34XX_SDRC_REGADDR(SDRC_DLLA_CTRL)
61
62 .text
63/* Function to aquire the semaphore in scratchpad */
64ENTRY(lock_scratchpad_sem)
65 stmfd sp!, {lr} @ save registers on stack
66wait_sem:
67 mov r0,#1
68 ldr r1, sdrc_scratchpad_sem
69wait_loop:
70 ldr r2, [r1] @ load the lock value
71 cmp r2, r0 @ is the lock free ?
72 beq wait_loop @ not free...
73 swp r2, r0, [r1] @ semaphore free so lock it and proceed
74 cmp r2, r0 @ did we succeed ?
75 beq wait_sem @ no - try again
76 ldmfd sp!, {pc} @ restore regs and return
77sdrc_scratchpad_sem:
78 .word SDRC_SCRATCHPAD_SEM_V
79ENTRY(lock_scratchpad_sem_sz)
80 .word . - lock_scratchpad_sem
81
82 .text
83/* Function to release the scratchpad semaphore */
84ENTRY(unlock_scratchpad_sem)
85 stmfd sp!, {lr} @ save registers on stack
86 ldr r3, sdrc_scratchpad_sem
87 mov r2,#0
88 str r2,[r3]
89 ldmfd sp!, {pc} @ restore regs and return
90ENTRY(unlock_scratchpad_sem_sz)
91 .word . - unlock_scratchpad_sem
46 92
47 .text 93 .text
48/* Function call to get the restore pointer for resume from OFF */ 94/* Function call to get the restore pointer for resume from OFF */
@@ -51,7 +97,93 @@ ENTRY(get_restore_pointer)
51 adr r0, restore 97 adr r0, restore
52 ldmfd sp!, {pc} @ restore regs and return 98 ldmfd sp!, {pc} @ restore regs and return
53ENTRY(get_restore_pointer_sz) 99ENTRY(get_restore_pointer_sz)
54 .word . - get_restore_pointer_sz 100 .word . - get_restore_pointer
101
102 .text
103/* Function call to get the restore pointer for for ES3 to resume from OFF */
104ENTRY(get_es3_restore_pointer)
105 stmfd sp!, {lr} @ save registers on stack
106 adr r0, restore_es3
107 ldmfd sp!, {pc} @ restore regs and return
108ENTRY(get_es3_restore_pointer_sz)
109 .word . - get_es3_restore_pointer
110
111ENTRY(es3_sdrc_fix)
112 ldr r4, sdrc_syscfg @ get config addr
113 ldr r5, [r4] @ get value
114 tst r5, #0x100 @ is part access blocked
115 it eq
116 biceq r5, r5, #0x100 @ clear bit if set
117 str r5, [r4] @ write back change
118 ldr r4, sdrc_mr_0 @ get config addr
119 ldr r5, [r4] @ get value
120 str r5, [r4] @ write back change
121 ldr r4, sdrc_emr2_0 @ get config addr
122 ldr r5, [r4] @ get value
123 str r5, [r4] @ write back change
124 ldr r4, sdrc_manual_0 @ get config addr
125 mov r5, #0x2 @ autorefresh command
126 str r5, [r4] @ kick off refreshes
127 ldr r4, sdrc_mr_1 @ get config addr
128 ldr r5, [r4] @ get value
129 str r5, [r4] @ write back change
130 ldr r4, sdrc_emr2_1 @ get config addr
131 ldr r5, [r4] @ get value
132 str r5, [r4] @ write back change
133 ldr r4, sdrc_manual_1 @ get config addr
134 mov r5, #0x2 @ autorefresh command
135 str r5, [r4] @ kick off refreshes
136 bx lr
137sdrc_syscfg:
138 .word SDRC_SYSCONFIG_P
139sdrc_mr_0:
140 .word SDRC_MR_0_P
141sdrc_emr2_0:
142 .word SDRC_EMR2_0_P
143sdrc_manual_0:
144 .word SDRC_MANUAL_0_P
145sdrc_mr_1:
146 .word SDRC_MR_1_P
147sdrc_emr2_1:
148 .word SDRC_EMR2_1_P
149sdrc_manual_1:
150 .word SDRC_MANUAL_1_P
151ENTRY(es3_sdrc_fix_sz)
152 .word . - es3_sdrc_fix
153
154/* Function to call rom code to save secure ram context */
155ENTRY(save_secure_ram_context)
156 stmfd sp!, {r1-r12, lr} @ save registers on stack
157save_secure_ram_debug:
158 /* b save_secure_ram_debug */ @ enable to debug save code
159 adr r3, api_params @ r3 points to parameters
160 str r0, [r3,#0x4] @ r0 has sdram address
161 ldr r12, high_mask
162 and r3, r3, r12
163 ldr r12, sram_phy_addr_mask
164 orr r3, r3, r12
165 mov r0, #25 @ set service ID for PPA
166 mov r12, r0 @ copy secure service ID in r12
167 mov r1, #0 @ set task id for ROM code in r1
168 mov r2, #4 @ set some flags in r2, r6
169 mov r6, #0xff
170 mcr p15, 0, r0, c7, c10, 4 @ data write barrier
171 mcr p15, 0, r0, c7, c10, 5 @ data memory barrier
172 .word 0xE1600071 @ call SMI monitor (smi #1)
173 nop
174 nop
175 nop
176 nop
177 ldmfd sp!, {r1-r12, pc}
178sram_phy_addr_mask:
179 .word SRAM_BASE_P
180high_mask:
181 .word 0xffff
182api_params:
183 .word 0x4, 0x0, 0x0, 0x1, 0x1
184ENTRY(save_secure_ram_context_sz)
185 .word . - save_secure_ram_context
186
55/* 187/*
56 * Forces OMAP into idle state 188 * Forces OMAP into idle state
57 * 189 *
@@ -92,11 +224,29 @@ loop:
92 nop 224 nop
93 nop 225 nop
94 nop 226 nop
95 bl i_dll_wait 227 bl wait_sdrc_ok
96 228
97 ldmfd sp!, {r0-r12, pc} @ restore regs and return 229 ldmfd sp!, {r0-r12, pc} @ restore regs and return
230restore_es3:
231 /*b restore_es3*/ @ Enable to debug restore code
232 ldr r5, pm_prepwstst_core_p
233 ldr r4, [r5]
234 and r4, r4, #0x3
235 cmp r4, #0x0 @ Check if previous power state of CORE is OFF
236 bne restore
237 adr r0, es3_sdrc_fix
238 ldr r1, sram_base
239 ldr r2, es3_sdrc_fix_sz
240 mov r2, r2, ror #2
241copy_to_sram:
242 ldmia r0!, {r3} @ val = *src
243 stmia r1!, {r3} @ *dst = val
244 subs r2, r2, #0x1 @ num_words--
245 bne copy_to_sram
246 ldr r1, sram_base
247 blx r1
98restore: 248restore:
99 /* b restore*/ @ Enable to debug restore code 249 /* b restore*/ @ Enable to debug restore code
100 /* Check what was the reason for mpu reset and store the reason in r9*/ 250 /* Check what was the reason for mpu reset and store the reason in r9*/
101 /* 1 - Only L1 and logic lost */ 251 /* 1 - Only L1 and logic lost */
102 /* 2 - Only L2 lost - In this case, we wont be here */ 252 /* 2 - Only L2 lost - In this case, we wont be here */
@@ -108,9 +258,65 @@ restore:
108 moveq r9, #0x3 @ MPU OFF => L1 and L2 lost 258 moveq r9, #0x3 @ MPU OFF => L1 and L2 lost
109 movne r9, #0x1 @ Only L1 and L2 lost => avoid L2 invalidation 259 movne r9, #0x1 @ Only L1 and L2 lost => avoid L2 invalidation
110 bne logic_l1_restore 260 bne logic_l1_restore
261 ldr r0, control_stat
262 ldr r1, [r0]
263 and r1, #0x700
264 cmp r1, #0x300
265 beq l2_inv_gp
266 mov r0, #40 @ set service ID for PPA
267 mov r12, r0 @ copy secure Service ID in r12
268 mov r1, #0 @ set task id for ROM code in r1
269 mov r2, #4 @ set some flags in r2, r6
270 mov r6, #0xff
271 adr r3, l2_inv_api_params @ r3 points to dummy parameters
272 mcr p15, 0, r0, c7, c10, 4 @ data write barrier
273 mcr p15, 0, r0, c7, c10, 5 @ data memory barrier
274 .word 0xE1600071 @ call SMI monitor (smi #1)
275 /* Write to Aux control register to set some bits */
276 mov r0, #42 @ set service ID for PPA
277 mov r12, r0 @ copy secure Service ID in r12
278 mov r1, #0 @ set task id for ROM code in r1
279 mov r2, #4 @ set some flags in r2, r6
280 mov r6, #0xff
281 ldr r4, scratchpad_base
282 ldr r3, [r4, #0xBC] @ r3 points to parameters
283 mcr p15, 0, r0, c7, c10, 4 @ data write barrier
284 mcr p15, 0, r0, c7, c10, 5 @ data memory barrier
285 .word 0xE1600071 @ call SMI monitor (smi #1)
286
287#ifdef CONFIG_OMAP3_L2_AUX_SECURE_SAVE_RESTORE
288 /* Restore L2 aux control register */
289 @ set service ID for PPA
290 mov r0, #CONFIG_OMAP3_L2_AUX_SECURE_SERVICE_SET_ID
291 mov r12, r0 @ copy service ID in r12
292 mov r1, #0 @ set task ID for ROM code in r1
293 mov r2, #4 @ set some flags in r2, r6
294 mov r6, #0xff
295 ldr r4, scratchpad_base
296 ldr r3, [r4, #0xBC]
297 adds r3, r3, #8 @ r3 points to parameters
298 mcr p15, 0, r0, c7, c10, 4 @ data write barrier
299 mcr p15, 0, r0, c7, c10, 5 @ data memory barrier
300 .word 0xE1600071 @ call SMI monitor (smi #1)
301#endif
302 b logic_l1_restore
303l2_inv_api_params:
304 .word 0x1, 0x00
305l2_inv_gp:
111 /* Execute smi to invalidate L2 cache */ 306 /* Execute smi to invalidate L2 cache */
112 mov r12, #0x1 @ set up to invalide L2 307 mov r12, #0x1 @ set up to invalide L2
113smi: .word 0xE1600070 @ Call SMI monitor (smieq) 308smi: .word 0xE1600070 @ Call SMI monitor (smieq)
309 /* Write to Aux control register to set some bits */
310 ldr r4, scratchpad_base
311 ldr r3, [r4,#0xBC]
312 ldr r0, [r3,#4]
313 mov r12, #0x3
314 .word 0xE1600070 @ Call SMI monitor (smieq)
315 ldr r4, scratchpad_base
316 ldr r3, [r4,#0xBC]
317 ldr r0, [r3,#12]
318 mov r12, #0x2
319 .word 0xE1600070 @ Call SMI monitor (smieq)
114logic_l1_restore: 320logic_l1_restore:
115 mov r1, #0 321 mov r1, #0
116 /* Invalidate all instruction caches to PoU 322 /* Invalidate all instruction caches to PoU
@@ -119,6 +325,7 @@ logic_l1_restore:
119 325
120 ldr r4, scratchpad_base 326 ldr r4, scratchpad_base
121 ldr r3, [r4,#0xBC] 327 ldr r3, [r4,#0xBC]
328 adds r3, r3, #16
122 ldmia r3!, {r4-r6} 329 ldmia r3!, {r4-r6}
123 mov sp, r4 330 mov sp, r4
124 msr spsr_cxsf, r5 331 msr spsr_cxsf, r5
@@ -235,6 +442,11 @@ usettbr0:
235save_context_wfi: 442save_context_wfi:
236 /*b save_context_wfi*/ @ enable to debug save code 443 /*b save_context_wfi*/ @ enable to debug save code
237 mov r8, r0 /* Store SDRAM address in r8 */ 444 mov r8, r0 /* Store SDRAM address in r8 */
445 mrc p15, 0, r5, c1, c0, 1 @ Read Auxiliary Control Register
446 mov r4, #0x1 @ Number of parameters for restore call
447 stmia r8!, {r4-r5} @ Push parameters for restore call
448 mrc p15, 1, r5, c9, c0, 2 @ Read L2 AUX ctrl register
449 stmia r8!, {r4-r5} @ Push parameters for restore call
238 /* Check what that target sleep state is:stored in r1*/ 450 /* Check what that target sleep state is:stored in r1*/
239 /* 1 - Only L1 and logic lost */ 451 /* 1 - Only L1 and logic lost */
240 /* 2 - Only L2 lost */ 452 /* 2 - Only L2 lost */
@@ -391,33 +603,55 @@ skip_l2_inval:
391 nop 603 nop
392 nop 604 nop
393 nop 605 nop
394 bl i_dll_wait 606 bl wait_sdrc_ok
395 /* restore regs and return */ 607 /* restore regs and return */
396 ldmfd sp!, {r0-r12, pc} 608 ldmfd sp!, {r0-r12, pc}
397 609
398i_dll_wait: 610/* Make sure SDRC accesses are ok */
399 ldr r4, clk_stabilize_delay 611wait_sdrc_ok:
612 ldr r4, cm_idlest1_core
613 ldr r5, [r4]
614 and r5, r5, #0x2
615 cmp r5, #0
616 bne wait_sdrc_ok
617 ldr r4, sdrc_power
618 ldr r5, [r4]
619 bic r5, r5, #0x40
620 str r5, [r4]
621wait_dll_lock:
622 /* Is dll in lock mode? */
623 ldr r4, sdrc_dlla_ctrl
624 ldr r5, [r4]
625 tst r5, #0x4
626 bxne lr
627 /* wait till dll locks */
628 ldr r4, sdrc_dlla_status
629 ldr r5, [r4]
630 and r5, r5, #0x4
631 cmp r5, #0x4
632 bne wait_dll_lock
633 bx lr
400 634
401i_dll_delay: 635cm_idlest1_core:
402 subs r4, r4, #0x1 636 .word CM_IDLEST1_CORE_V
403 bne i_dll_delay 637sdrc_dlla_status:
404 ldr r4, sdrc_power 638 .word SDRC_DLLA_STATUS_V
405 ldr r5, [r4] 639sdrc_dlla_ctrl:
406 bic r5, r5, #0x40 640 .word SDRC_DLLA_CTRL_V
407 str r5, [r4]
408 bx lr
409pm_prepwstst_core: 641pm_prepwstst_core:
410 .word PM_PREPWSTST_CORE_V 642 .word PM_PREPWSTST_CORE_V
643pm_prepwstst_core_p:
644 .word PM_PREPWSTST_CORE_P
411pm_prepwstst_mpu: 645pm_prepwstst_mpu:
412 .word PM_PREPWSTST_MPU_V 646 .word PM_PREPWSTST_MPU_V
413pm_pwstctrl_mpu: 647pm_pwstctrl_mpu:
414 .word PM_PWSTCTRL_MPU_P 648 .word PM_PWSTCTRL_MPU_P
415scratchpad_base: 649scratchpad_base:
416 .word SCRATCHPAD_BASE_P 650 .word SCRATCHPAD_BASE_P
651sram_base:
652 .word SRAM_BASE_P + 0x8000
417sdrc_power: 653sdrc_power:
418 .word SDRC_POWER_V 654 .word SDRC_POWER_V
419context_mem:
420 .word 0x803E3E14
421clk_stabilize_delay: 655clk_stabilize_delay:
422 .word 0x000001FF 656 .word 0x000001FF
423assoc_mask: 657assoc_mask:
@@ -432,5 +666,7 @@ table_entry:
432 .word 0x00000C02 666 .word 0x00000C02
433cache_pred_disable_mask: 667cache_pred_disable_mask:
434 .word 0xFFFFE7FB 668 .word 0xFFFFE7FB
669control_stat:
670 .word CONTROL_STAT
435ENTRY(omap34xx_cpu_suspend_sz) 671ENTRY(omap34xx_cpu_suspend_sz)
436 .word . - omap34xx_cpu_suspend 672 .word . - omap34xx_cpu_suspend
diff --git a/arch/arm/mach-omap2/sram242x.S b/arch/arm/mach-omap2/sram242x.S
index 9b62208658bc..92e6e1a12af8 100644
--- a/arch/arm/mach-omap2/sram242x.S
+++ b/arch/arm/mach-omap2/sram242x.S
@@ -128,7 +128,7 @@ omap242x_sdi_prcm_voltctrl:
128prcm_mask_val: 128prcm_mask_val:
129 .word 0xFFFF3FFC 129 .word 0xFFFF3FFC
130omap242x_sdi_timer_32ksynct_cr: 130omap242x_sdi_timer_32ksynct_cr:
131 .word OMAP2_IO_ADDRESS(OMAP2420_32KSYNCT_BASE + 0x010) 131 .word OMAP2_L4_IO_ADDRESS(OMAP2420_32KSYNCT_BASE + 0x010)
132ENTRY(omap242x_sram_ddr_init_sz) 132ENTRY(omap242x_sram_ddr_init_sz)
133 .word . - omap242x_sram_ddr_init 133 .word . - omap242x_sram_ddr_init
134 134
@@ -224,7 +224,7 @@ omap242x_srs_prcm_voltctrl:
224ddr_prcm_mask_val: 224ddr_prcm_mask_val:
225 .word 0xFFFF3FFC 225 .word 0xFFFF3FFC
226omap242x_srs_timer_32ksynct: 226omap242x_srs_timer_32ksynct:
227 .word OMAP2_IO_ADDRESS(OMAP2420_32KSYNCT_BASE + 0x010) 227 .word OMAP2_L4_IO_ADDRESS(OMAP2420_32KSYNCT_BASE + 0x010)
228 228
229ENTRY(omap242x_sram_reprogram_sdrc_sz) 229ENTRY(omap242x_sram_reprogram_sdrc_sz)
230 .word . - omap242x_sram_reprogram_sdrc 230 .word . - omap242x_sram_reprogram_sdrc
diff --git a/arch/arm/mach-omap2/sram243x.S b/arch/arm/mach-omap2/sram243x.S
index df2cd9277c00..ab4973695c71 100644
--- a/arch/arm/mach-omap2/sram243x.S
+++ b/arch/arm/mach-omap2/sram243x.S
@@ -128,7 +128,7 @@ omap243x_sdi_prcm_voltctrl:
128prcm_mask_val: 128prcm_mask_val:
129 .word 0xFFFF3FFC 129 .word 0xFFFF3FFC
130omap243x_sdi_timer_32ksynct_cr: 130omap243x_sdi_timer_32ksynct_cr:
131 .word OMAP2_IO_ADDRESS(OMAP2430_32KSYNCT_BASE + 0x010) 131 .word OMAP2_L4_IO_ADDRESS(OMAP2430_32KSYNCT_BASE + 0x010)
132ENTRY(omap243x_sram_ddr_init_sz) 132ENTRY(omap243x_sram_ddr_init_sz)
133 .word . - omap243x_sram_ddr_init 133 .word . - omap243x_sram_ddr_init
134 134
@@ -224,7 +224,7 @@ omap243x_srs_prcm_voltctrl:
224ddr_prcm_mask_val: 224ddr_prcm_mask_val:
225 .word 0xFFFF3FFC 225 .word 0xFFFF3FFC
226omap243x_srs_timer_32ksynct: 226omap243x_srs_timer_32ksynct:
227 .word OMAP2_IO_ADDRESS(OMAP2430_32KSYNCT_BASE + 0x010) 227 .word OMAP2_L4_IO_ADDRESS(OMAP2430_32KSYNCT_BASE + 0x010)
228 228
229ENTRY(omap243x_sram_reprogram_sdrc_sz) 229ENTRY(omap243x_sram_reprogram_sdrc_sz)
230 .word . - omap243x_sram_reprogram_sdrc 230 .word . - omap243x_sram_reprogram_sdrc
diff --git a/arch/arm/mach-omap2/sram34xx.S b/arch/arm/mach-omap2/sram34xx.S
index 82aa4a3d160c..de99ba2a57ab 100644
--- a/arch/arm/mach-omap2/sram34xx.S
+++ b/arch/arm/mach-omap2/sram34xx.S
@@ -91,8 +91,19 @@
91 * new SDRC_ACTIM_CTRL_B_1 register contents 91 * new SDRC_ACTIM_CTRL_B_1 register contents
92 * new SDRC_MR_1 register value 92 * new SDRC_MR_1 register value
93 * 93 *
94 * If the param SDRC_RFR_CTRL_1 is 0, the parameters 94 * If the param SDRC_RFR_CTRL_1 is 0, the parameters are not programmed into
95 * are not programmed into the SDRC CS1 registers 95 * the SDRC CS1 registers
96 *
97 * NOTE: This code no longer attempts to program the SDRC AC timing and MR
98 * registers. This is because the code currently cannot ensure that all
99 * L3 initiators (e.g., sDMA, IVA, DSS DISPC, etc.) are not accessing the
100 * SDRAM when the registers are written. If the registers are changed while
101 * an initiator is accessing SDRAM, memory can be corrupted and/or the SDRC
102 * may enter an unpredictable state. In the future, the intent is to
103 * re-enable this code in cases where we can ensure that no initiators are
104 * touching the SDRAM. Until that time, users who know that their use case
105 * can satisfy the above requirement can enable the CONFIG_OMAP3_SDRC_AC_TIMING
106 * option.
96 */ 107 */
97ENTRY(omap3_sram_configure_core_dpll) 108ENTRY(omap3_sram_configure_core_dpll)
98 stmfd sp!, {r1-r12, lr} @ store regs to stack 109 stmfd sp!, {r1-r12, lr} @ store regs to stack
@@ -219,6 +230,7 @@ configure_sdrc:
219 ldr r12, omap_sdrc_rfr_ctrl_0_val @ fetch value from SRAM 230 ldr r12, omap_sdrc_rfr_ctrl_0_val @ fetch value from SRAM
220 ldr r11, omap3_sdrc_rfr_ctrl_0 @ fetch addr from SRAM 231 ldr r11, omap3_sdrc_rfr_ctrl_0 @ fetch addr from SRAM
221 str r12, [r11] @ store 232 str r12, [r11] @ store
233#ifdef CONFIG_OMAP3_SDRC_AC_TIMING
222 ldr r12, omap_sdrc_actim_ctrl_a_0_val 234 ldr r12, omap_sdrc_actim_ctrl_a_0_val
223 ldr r11, omap3_sdrc_actim_ctrl_a_0 235 ldr r11, omap3_sdrc_actim_ctrl_a_0
224 str r12, [r11] 236 str r12, [r11]
@@ -228,11 +240,13 @@ configure_sdrc:
228 ldr r12, omap_sdrc_mr_0_val 240 ldr r12, omap_sdrc_mr_0_val
229 ldr r11, omap3_sdrc_mr_0 241 ldr r11, omap3_sdrc_mr_0
230 str r12, [r11] 242 str r12, [r11]
243#endif
231 ldr r12, omap_sdrc_rfr_ctrl_1_val 244 ldr r12, omap_sdrc_rfr_ctrl_1_val
232 cmp r12, #0 @ if SDRC_RFR_CTRL_1 is 0, 245 cmp r12, #0 @ if SDRC_RFR_CTRL_1 is 0,
233 beq skip_cs1_prog @ do not program cs1 params 246 beq skip_cs1_prog @ do not program cs1 params
234 ldr r11, omap3_sdrc_rfr_ctrl_1 247 ldr r11, omap3_sdrc_rfr_ctrl_1
235 str r12, [r11] 248 str r12, [r11]
249#ifdef CONFIG_OMAP3_SDRC_AC_TIMING
236 ldr r12, omap_sdrc_actim_ctrl_a_1_val 250 ldr r12, omap_sdrc_actim_ctrl_a_1_val
237 ldr r11, omap3_sdrc_actim_ctrl_a_1 251 ldr r11, omap3_sdrc_actim_ctrl_a_1
238 str r12, [r11] 252 str r12, [r11]
@@ -242,6 +256,7 @@ configure_sdrc:
242 ldr r12, omap_sdrc_mr_1_val 256 ldr r12, omap_sdrc_mr_1_val
243 ldr r11, omap3_sdrc_mr_1 257 ldr r11, omap3_sdrc_mr_1
244 str r12, [r11] 258 str r12, [r11]
259#endif
245skip_cs1_prog: 260skip_cs1_prog:
246 ldr r12, [r11] @ posted-write barrier for SDRC 261 ldr r12, [r11] @ posted-write barrier for SDRC
247 bx lr 262 bx lr
diff --git a/arch/arm/mach-omap2/timer-gp.c b/arch/arm/mach-omap2/timer-gp.c
index e2338c0aebcf..74fbed8491f2 100644
--- a/arch/arm/mach-omap2/timer-gp.c
+++ b/arch/arm/mach-omap2/timer-gp.c
@@ -37,7 +37,7 @@
37#include <linux/clockchips.h> 37#include <linux/clockchips.h>
38 38
39#include <asm/mach/time.h> 39#include <asm/mach/time.h>
40#include <mach/dmtimer.h> 40#include <plat/dmtimer.h>
41#include <asm/localtimer.h> 41#include <asm/localtimer.h>
42 42
43/* MAX_GPTIMER_ID: number of GPTIMERs on the chip */ 43/* MAX_GPTIMER_ID: number of GPTIMERs on the chip */
@@ -47,6 +47,7 @@ static struct omap_dm_timer *gptimer;
47static struct clock_event_device clockevent_gpt; 47static struct clock_event_device clockevent_gpt;
48static u8 __initdata gptimer_id = 1; 48static u8 __initdata gptimer_id = 1;
49static u8 __initdata inited; 49static u8 __initdata inited;
50struct omap_dm_timer *gptimer_wakeup;
50 51
51static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id) 52static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id)
52{ 53{
@@ -84,8 +85,6 @@ static void omap2_gp_timer_set_mode(enum clock_event_mode mode,
84 case CLOCK_EVT_MODE_PERIODIC: 85 case CLOCK_EVT_MODE_PERIODIC:
85 period = clk_get_rate(omap_dm_timer_get_fclk(gptimer)) / HZ; 86 period = clk_get_rate(omap_dm_timer_get_fclk(gptimer)) / HZ;
86 period -= 1; 87 period -= 1;
87 if (cpu_is_omap44xx())
88 period = 0xff; /* FIXME: */
89 omap_dm_timer_set_load_start(gptimer, 1, 0xffffffff - period); 88 omap_dm_timer_set_load_start(gptimer, 1, 0xffffffff - period);
90 break; 89 break;
91 case CLOCK_EVT_MODE_ONESHOT: 90 case CLOCK_EVT_MODE_ONESHOT:
@@ -134,6 +133,7 @@ static void __init omap2_gp_clockevent_init(void)
134 133
135 gptimer = omap_dm_timer_request_specific(gptimer_id); 134 gptimer = omap_dm_timer_request_specific(gptimer_id);
136 BUG_ON(gptimer == NULL); 135 BUG_ON(gptimer == NULL);
136 gptimer_wakeup = gptimer;
137 137
138#if defined(CONFIG_OMAP_32K_TIMER) 138#if defined(CONFIG_OMAP_32K_TIMER)
139 src = OMAP_TIMER_SRC_32_KHZ; 139 src = OMAP_TIMER_SRC_32_KHZ;
@@ -148,9 +148,6 @@ static void __init omap2_gp_clockevent_init(void)
148 "timer-gp: omap_dm_timer_set_source() failed\n"); 148 "timer-gp: omap_dm_timer_set_source() failed\n");
149 149
150 tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer)); 150 tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer));
151 if (cpu_is_omap44xx())
152 /* Assuming 32kHz clk is driving GPT1 */
153 tick_rate = 32768; /* FIXME: */
154 151
155 pr_info("OMAP clockevent source: GPTIMER%d at %u Hz\n", 152 pr_info("OMAP clockevent source: GPTIMER%d at %u Hz\n",
156 gptimer_id, tick_rate); 153 gptimer_id, tick_rate);
@@ -231,7 +228,8 @@ static void __init omap2_gp_clocksource_init(void)
231static void __init omap2_gp_timer_init(void) 228static void __init omap2_gp_timer_init(void)
232{ 229{
233#ifdef CONFIG_LOCAL_TIMERS 230#ifdef CONFIG_LOCAL_TIMERS
234 twd_base = OMAP2_IO_ADDRESS(OMAP44XX_LOCAL_TWD_BASE); 231 twd_base = ioremap(OMAP44XX_LOCAL_TWD_BASE, SZ_256);
232 BUG_ON(!twd_base);
235#endif 233#endif
236 omap_dm_timer_init(); 234 omap_dm_timer_init();
237 235
diff --git a/arch/arm/mach-omap2/timer-mpu.c b/arch/arm/mach-omap2/timer-mpu.c
index c1a650a9910f..954682e64399 100644
--- a/arch/arm/mach-omap2/timer-mpu.c
+++ b/arch/arm/mach-omap2/timer-mpu.c
@@ -28,7 +28,7 @@
28 */ 28 */
29void __cpuinit local_timer_setup(struct clock_event_device *evt) 29void __cpuinit local_timer_setup(struct clock_event_device *evt)
30{ 30{
31 evt->irq = INT_44XX_LOCALTIMER_IRQ; 31 evt->irq = OMAP44XX_IRQ_LOCALTIMER;
32 twd_timer_setup(evt); 32 twd_timer_setup(evt);
33} 33}
34 34
diff --git a/arch/arm/mach-omap2/usb-ehci.c b/arch/arm/mach-omap2/usb-ehci.c
new file mode 100644
index 000000000000..ee9f548d5d81
--- /dev/null
+++ b/arch/arm/mach-omap2/usb-ehci.c
@@ -0,0 +1,238 @@
1/*
2 * linux/arch/arm/mach-omap2/usb-ehci.c
3 *
4 * This file will contain the board specific details for the
5 * Synopsys EHCI host controller on OMAP3430
6 *
7 * Copyright (C) 2007 Texas Instruments
8 * Author: Vikram Pandita <vikram.pandita@ti.com>
9 *
10 * Generalization by:
11 * Felipe Balbi <felipe.balbi@nokia.com>
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License version 2 as
15 * published by the Free Software Foundation.
16 */
17
18#include <linux/types.h>
19#include <linux/errno.h>
20#include <linux/delay.h>
21#include <linux/platform_device.h>
22#include <linux/clk.h>
23#include <asm/io.h>
24#include <plat/mux.h>
25
26#include <mach/hardware.h>
27#include <mach/irqs.h>
28#include <plat/usb.h>
29
30#include "mux.h"
31
32#if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_EHCI_HCD_MODULE)
33
34static struct resource ehci_resources[] = {
35 {
36 .start = OMAP34XX_EHCI_BASE,
37 .end = OMAP34XX_EHCI_BASE + SZ_1K - 1,
38 .flags = IORESOURCE_MEM,
39 },
40 {
41 .start = OMAP34XX_UHH_CONFIG_BASE,
42 .end = OMAP34XX_UHH_CONFIG_BASE + SZ_1K - 1,
43 .flags = IORESOURCE_MEM,
44 },
45 {
46 .start = OMAP34XX_USBTLL_BASE,
47 .end = OMAP34XX_USBTLL_BASE + SZ_4K - 1,
48 .flags = IORESOURCE_MEM,
49 },
50 { /* general IRQ */
51 .start = INT_34XX_EHCI_IRQ,
52 .flags = IORESOURCE_IRQ,
53 }
54};
55
56static u64 ehci_dmamask = ~(u32)0;
57static struct platform_device ehci_device = {
58 .name = "ehci-omap",
59 .id = 0,
60 .dev = {
61 .dma_mask = &ehci_dmamask,
62 .coherent_dma_mask = 0xffffffff,
63 .platform_data = NULL,
64 },
65 .num_resources = ARRAY_SIZE(ehci_resources),
66 .resource = ehci_resources,
67};
68
69/* MUX settings for EHCI pins */
70/*
71 * setup_ehci_io_mux - initialize IO pad mux for USBHOST
72 */
73static void setup_ehci_io_mux(const enum ehci_hcd_omap_mode *port_mode)
74{
75 switch (port_mode[0]) {
76 case EHCI_HCD_OMAP_MODE_PHY:
77 omap_mux_init_signal("hsusb1_stp", OMAP_PIN_OUTPUT);
78 omap_mux_init_signal("hsusb1_clk", OMAP_PIN_OUTPUT);
79 omap_mux_init_signal("hsusb1_dir", OMAP_PIN_INPUT_PULLDOWN);
80 omap_mux_init_signal("hsusb1_nxt", OMAP_PIN_INPUT_PULLDOWN);
81 omap_mux_init_signal("hsusb1_data0", OMAP_PIN_INPUT_PULLDOWN);
82 omap_mux_init_signal("hsusb1_data1", OMAP_PIN_INPUT_PULLDOWN);
83 omap_mux_init_signal("hsusb1_data2", OMAP_PIN_INPUT_PULLDOWN);
84 omap_mux_init_signal("hsusb1_data3", OMAP_PIN_INPUT_PULLDOWN);
85 omap_mux_init_signal("hsusb1_data4", OMAP_PIN_INPUT_PULLDOWN);
86 omap_mux_init_signal("hsusb1_data5", OMAP_PIN_INPUT_PULLDOWN);
87 omap_mux_init_signal("hsusb1_data6", OMAP_PIN_INPUT_PULLDOWN);
88 omap_mux_init_signal("hsusb1_data7", OMAP_PIN_INPUT_PULLDOWN);
89 break;
90 case EHCI_HCD_OMAP_MODE_TLL:
91 omap_mux_init_signal("hsusb1_tll_stp",
92 OMAP_PIN_INPUT_PULLUP);
93 omap_mux_init_signal("hsusb1_tll_clk",
94 OMAP_PIN_INPUT_PULLDOWN);
95 omap_mux_init_signal("hsusb1_tll_dir",
96 OMAP_PIN_INPUT_PULLDOWN);
97 omap_mux_init_signal("hsusb1_tll_nxt",
98 OMAP_PIN_INPUT_PULLDOWN);
99 omap_mux_init_signal("hsusb1_tll_data0",
100 OMAP_PIN_INPUT_PULLDOWN);
101 omap_mux_init_signal("hsusb1_tll_data1",
102 OMAP_PIN_INPUT_PULLDOWN);
103 omap_mux_init_signal("hsusb1_tll_data2",
104 OMAP_PIN_INPUT_PULLDOWN);
105 omap_mux_init_signal("hsusb1_tll_data3",
106 OMAP_PIN_INPUT_PULLDOWN);
107 omap_mux_init_signal("hsusb1_tll_data4",
108 OMAP_PIN_INPUT_PULLDOWN);
109 omap_mux_init_signal("hsusb1_tll_data5",
110 OMAP_PIN_INPUT_PULLDOWN);
111 omap_mux_init_signal("hsusb1_tll_data6",
112 OMAP_PIN_INPUT_PULLDOWN);
113 omap_mux_init_signal("hsusb1_tll_data7",
114 OMAP_PIN_INPUT_PULLDOWN);
115 break;
116 case EHCI_HCD_OMAP_MODE_UNKNOWN:
117 /* FALLTHROUGH */
118 default:
119 break;
120 }
121
122 switch (port_mode[1]) {
123 case EHCI_HCD_OMAP_MODE_PHY:
124 omap_mux_init_signal("hsusb2_stp", OMAP_PIN_OUTPUT);
125 omap_mux_init_signal("hsusb2_clk", OMAP_PIN_OUTPUT);
126 omap_mux_init_signal("hsusb2_dir", OMAP_PIN_INPUT_PULLDOWN);
127 omap_mux_init_signal("hsusb2_nxt", OMAP_PIN_INPUT_PULLDOWN);
128 omap_mux_init_signal("hsusb2_data0",
129 OMAP_PIN_INPUT_PULLDOWN);
130 omap_mux_init_signal("hsusb2_data1",
131 OMAP_PIN_INPUT_PULLDOWN);
132 omap_mux_init_signal("hsusb2_data2",
133 OMAP_PIN_INPUT_PULLDOWN);
134 omap_mux_init_signal("hsusb2_data3",
135 OMAP_PIN_INPUT_PULLDOWN);
136 omap_mux_init_signal("hsusb2_data4",
137 OMAP_PIN_INPUT_PULLDOWN);
138 omap_mux_init_signal("hsusb2_data5",
139 OMAP_PIN_INPUT_PULLDOWN);
140 omap_mux_init_signal("hsusb2_data6",
141 OMAP_PIN_INPUT_PULLDOWN);
142 omap_mux_init_signal("hsusb2_data7",
143 OMAP_PIN_INPUT_PULLDOWN);
144 break;
145 case EHCI_HCD_OMAP_MODE_TLL:
146 omap_mux_init_signal("hsusb2_tll_stp",
147 OMAP_PIN_INPUT_PULLUP);
148 omap_mux_init_signal("hsusb2_tll_clk",
149 OMAP_PIN_INPUT_PULLDOWN);
150 omap_mux_init_signal("hsusb2_tll_dir",
151 OMAP_PIN_INPUT_PULLDOWN);
152 omap_mux_init_signal("hsusb2_tll_nxt",
153 OMAP_PIN_INPUT_PULLDOWN);
154 omap_mux_init_signal("hsusb2_tll_data0",
155 OMAP_PIN_INPUT_PULLDOWN);
156 omap_mux_init_signal("hsusb2_tll_data1",
157 OMAP_PIN_INPUT_PULLDOWN);
158 omap_mux_init_signal("hsusb2_tll_data2",
159 OMAP_PIN_INPUT_PULLDOWN);
160 omap_mux_init_signal("hsusb2_tll_data3",
161 OMAP_PIN_INPUT_PULLDOWN);
162 omap_mux_init_signal("hsusb2_tll_data4",
163 OMAP_PIN_INPUT_PULLDOWN);
164 omap_mux_init_signal("hsusb2_tll_data5",
165 OMAP_PIN_INPUT_PULLDOWN);
166 omap_mux_init_signal("hsusb2_tll_data6",
167 OMAP_PIN_INPUT_PULLDOWN);
168 omap_mux_init_signal("hsusb2_tll_data7",
169 OMAP_PIN_INPUT_PULLDOWN);
170 break;
171 case EHCI_HCD_OMAP_MODE_UNKNOWN:
172 /* FALLTHROUGH */
173 default:
174 break;
175 }
176
177 switch (port_mode[2]) {
178 case EHCI_HCD_OMAP_MODE_PHY:
179 printk(KERN_WARNING "Port3 can't be used in PHY mode\n");
180 break;
181 case EHCI_HCD_OMAP_MODE_TLL:
182 omap_mux_init_signal("hsusb3_tll_stp",
183 OMAP_PIN_INPUT_PULLUP);
184 omap_mux_init_signal("hsusb3_tll_clk",
185 OMAP_PIN_INPUT_PULLDOWN);
186 omap_mux_init_signal("hsusb3_tll_dir",
187 OMAP_PIN_INPUT_PULLDOWN);
188 omap_mux_init_signal("hsusb3_tll_nxt",
189 OMAP_PIN_INPUT_PULLDOWN);
190 omap_mux_init_signal("hsusb3_tll_data0",
191 OMAP_PIN_INPUT_PULLDOWN);
192 omap_mux_init_signal("hsusb3_tll_data1",
193 OMAP_PIN_INPUT_PULLDOWN);
194 omap_mux_init_signal("hsusb3_tll_data2",
195 OMAP_PIN_INPUT_PULLDOWN);
196 omap_mux_init_signal("hsusb3_tll_data3",
197 OMAP_PIN_INPUT_PULLDOWN);
198 omap_mux_init_signal("hsusb3_tll_data4",
199 OMAP_PIN_INPUT_PULLDOWN);
200 omap_mux_init_signal("hsusb3_tll_data5",
201 OMAP_PIN_INPUT_PULLDOWN);
202 omap_mux_init_signal("hsusb3_tll_data6",
203 OMAP_PIN_INPUT_PULLDOWN);
204 omap_mux_init_signal("hsusb3_tll_data7",
205 OMAP_PIN_INPUT_PULLDOWN);
206 break;
207 case EHCI_HCD_OMAP_MODE_UNKNOWN:
208 /* FALLTHROUGH */
209 default:
210 break;
211 }
212
213 return;
214}
215
216void __init usb_ehci_init(const struct ehci_hcd_omap_platform_data *pdata)
217{
218 platform_device_add_data(&ehci_device, pdata, sizeof(*pdata));
219
220 /* Setup Pin IO MUX for EHCI */
221 if (cpu_is_omap34xx())
222 setup_ehci_io_mux(pdata->port_mode);
223
224 if (platform_device_register(&ehci_device) < 0) {
225 printk(KERN_ERR "Unable to register HS-USB (EHCI) device\n");
226 return;
227 }
228}
229
230#else
231
232void __init usb_ehci_init(const struct ehci_hcd_omap_platform_data *pdata)
233
234{
235}
236
237#endif /* CONFIG_USB_EHCI_HCD */
238
diff --git a/arch/arm/mach-omap2/usb-musb.c b/arch/arm/mach-omap2/usb-musb.c
index 1145a2562b0f..6d41fa7b2ce8 100644
--- a/arch/arm/mach-omap2/usb-musb.c
+++ b/arch/arm/mach-omap2/usb-musb.c
@@ -28,8 +28,8 @@
28 28
29#include <mach/hardware.h> 29#include <mach/hardware.h>
30#include <mach/irqs.h> 30#include <mach/irqs.h>
31#include <mach/mux.h> 31#include <plat/mux.h>
32#include <mach/usb.h> 32#include <plat/usb.h>
33 33
34#ifdef CONFIG_USB_MUSB_SOC 34#ifdef CONFIG_USB_MUSB_SOC
35 35
@@ -47,70 +47,11 @@ static struct resource musb_resources[] = {
47 }, 47 },
48}; 48};
49 49
50static int clk_on;
51
52static int musb_set_clock(struct clk *clk, int state)
53{
54 if (state) {
55 if (clk_on > 0)
56 return -ENODEV;
57
58 clk_enable(clk);
59 clk_on = 1;
60 } else {
61 if (clk_on == 0)
62 return -ENODEV;
63
64 clk_disable(clk);
65 clk_on = 0;
66 }
67
68 return 0;
69}
70
71static struct musb_hdrc_eps_bits musb_eps[] = {
72 { "ep1_tx", 10, },
73 { "ep1_rx", 10, },
74 { "ep2_tx", 9, },
75 { "ep2_rx", 9, },
76 { "ep3_tx", 3, },
77 { "ep3_rx", 3, },
78 { "ep4_tx", 3, },
79 { "ep4_rx", 3, },
80 { "ep5_tx", 3, },
81 { "ep5_rx", 3, },
82 { "ep6_tx", 3, },
83 { "ep6_rx", 3, },
84 { "ep7_tx", 3, },
85 { "ep7_rx", 3, },
86 { "ep8_tx", 2, },
87 { "ep8_rx", 2, },
88 { "ep9_tx", 2, },
89 { "ep9_rx", 2, },
90 { "ep10_tx", 2, },
91 { "ep10_rx", 2, },
92 { "ep11_tx", 2, },
93 { "ep11_rx", 2, },
94 { "ep12_tx", 2, },
95 { "ep12_rx", 2, },
96 { "ep13_tx", 2, },
97 { "ep13_rx", 2, },
98 { "ep14_tx", 2, },
99 { "ep14_rx", 2, },
100 { "ep15_tx", 2, },
101 { "ep15_rx", 2, },
102};
103
104static struct musb_hdrc_config musb_config = { 50static struct musb_hdrc_config musb_config = {
105 .multipoint = 1, 51 .multipoint = 1,
106 .dyn_fifo = 1, 52 .dyn_fifo = 1,
107 .soft_con = 1,
108 .dma = 1,
109 .num_eps = 16, 53 .num_eps = 16,
110 .dma_channels = 7,
111 .dma_req_chan = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3),
112 .ram_bits = 12, 54 .ram_bits = 12,
113 .eps_bits = musb_eps,
114}; 55};
115 56
116static struct musb_hdrc_platform_data musb_plat = { 57static struct musb_hdrc_platform_data musb_plat = {
@@ -122,7 +63,6 @@ static struct musb_hdrc_platform_data musb_plat = {
122 .mode = MUSB_PERIPHERAL, 63 .mode = MUSB_PERIPHERAL,
123#endif 64#endif
124 /* .clock is set dynamically */ 65 /* .clock is set dynamically */
125 .set_clock = musb_set_clock,
126 .config = &musb_config, 66 .config = &musb_config,
127 67
128 /* REVISIT charge pump on TWL4030 can supply up to 68 /* REVISIT charge pump on TWL4030 can supply up to
@@ -146,28 +86,34 @@ static struct platform_device musb_device = {
146 .resource = musb_resources, 86 .resource = musb_resources,
147}; 87};
148 88
149void __init usb_musb_init(void) 89void __init usb_musb_init(struct omap_musb_board_data *board_data)
150{ 90{
151 if (cpu_is_omap243x()) 91 if (cpu_is_omap243x()) {
152 musb_resources[0].start = OMAP243X_HS_BASE; 92 musb_resources[0].start = OMAP243X_HS_BASE;
153 else 93 } else if (cpu_is_omap34xx()) {
154 musb_resources[0].start = OMAP34XX_HSUSB_OTG_BASE; 94 musb_resources[0].start = OMAP34XX_HSUSB_OTG_BASE;
155 musb_resources[0].end = musb_resources[0].start + SZ_8K - 1; 95 } else if (cpu_is_omap44xx()) {
96 musb_resources[0].start = OMAP44XX_HSUSB_OTG_BASE;
97 musb_resources[1].start = OMAP44XX_IRQ_HS_USB_MC_N;
98 musb_resources[2].start = OMAP44XX_IRQ_HS_USB_DMA_N;
99 }
100 musb_resources[0].end = musb_resources[0].start + SZ_4K - 1;
156 101
157 /* 102 /*
158 * REVISIT: This line can be removed once all the platforms using 103 * REVISIT: This line can be removed once all the platforms using
159 * musb_core.c have been converted to use use clkdev. 104 * musb_core.c have been converted to use use clkdev.
160 */ 105 */
161 musb_plat.clock = "ick"; 106 musb_plat.clock = "ick";
107 musb_plat.board_data = board_data;
108 musb_plat.power = board_data->power >> 1;
109 musb_plat.mode = board_data->mode;
162 110
163 if (platform_device_register(&musb_device) < 0) { 111 if (platform_device_register(&musb_device) < 0)
164 printk(KERN_ERR "Unable to register HS-USB (MUSB) device\n"); 112 printk(KERN_ERR "Unable to register HS-USB (MUSB) device\n");
165 return;
166 }
167} 113}
168 114
169#else 115#else
170void __init usb_musb_init(void) 116void __init usb_musb_init(struct omap_musb_board_data *board_data)
171{ 117{
172} 118}
173#endif /* CONFIG_USB_MUSB_SOC */ 119#endif /* CONFIG_USB_MUSB_SOC */
diff --git a/arch/arm/mach-omap2/usb-tusb6010.c b/arch/arm/mach-omap2/usb-tusb6010.c
index 8622c24cd270..10a2013c1104 100644
--- a/arch/arm/mach-omap2/usb-tusb6010.c
+++ b/arch/arm/mach-omap2/usb-tusb6010.c
@@ -16,8 +16,8 @@
16 16
17#include <linux/usb/musb.h> 17#include <linux/usb/musb.h>
18 18
19#include <mach/gpmc.h> 19#include <plat/gpmc.h>
20#include <mach/mux.h> 20#include <plat/mux.h>
21 21
22 22
23static u8 async_cs, sync_cs; 23static u8 async_cs, sync_cs;