Root/target/linux/omap35xx/patches-2.6.32/002-OMAP.patch

1--- a/arch/arm/Kconfig
2+++ b/arch/arm/Kconfig
3@@ -1511,6 +1511,10 @@ source "net/Kconfig"
4 
5 source "drivers/Kconfig"
6 
7+if ARCH_OMAP
8+source "drivers/cbus/Kconfig"
9+endif
10+
11 source "fs/Kconfig"
12 
13 source "arch/arm/Kconfig.debug"
14--- a/arch/arm/mach-omap1/board-fsample.c
15+++ b/arch/arm/mach-omap1/board-fsample.c
16@@ -107,7 +107,7 @@ static struct resource smc91x_resources[
17         .flags = IORESOURCE_MEM,
18     },
19     [1] = {
20- .start = INT_730_MPU_EXT_NIRQ,
21+ .start = INT_7XX_MPU_EXT_NIRQ,
22         .end = 0,
23         .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
24     },
25@@ -196,8 +196,8 @@ static struct platform_device smc91x_dev
26 
27 static struct resource kp_resources[] = {
28     [0] = {
29- .start = INT_730_MPUIO_KEYPAD,
30- .end = INT_730_MPUIO_KEYPAD,
31+ .start = INT_7XX_MPUIO_KEYPAD,
32+ .end = INT_7XX_MPUIO_KEYPAD,
33         .flags = IORESOURCE_IRQ,
34     },
35 };
36@@ -309,7 +309,7 @@ static void __init omap_fsample_map_io(v
37     /*
38      * Hold GSM Reset until needed
39      */
40- omap_writew(omap_readw(OMAP730_DSP_M_CTL) & ~1, OMAP730_DSP_M_CTL);
41+ omap_writew(omap_readw(OMAP7XX_DSP_M_CTL) & ~1, OMAP7XX_DSP_M_CTL);
42 
43     /*
44      * UARTs -> done automagically by 8250 driver
45@@ -320,21 +320,21 @@ static void __init omap_fsample_map_io(v
46      */
47 
48     /* Flash: CS0 timings setup */
49- omap_writel(0x0000fff3, OMAP730_FLASH_CFG_0);
50- omap_writel(0x00000088, OMAP730_FLASH_ACFG_0);
51+ omap_writel(0x0000fff3, OMAP7XX_FLASH_CFG_0);
52+ omap_writel(0x00000088, OMAP7XX_FLASH_ACFG_0);
53 
54     /*
55      * Ethernet support through the debug board
56      * CS1 timings setup
57      */
58- omap_writel(0x0000fff3, OMAP730_FLASH_CFG_1);
59- omap_writel(0x00000000, OMAP730_FLASH_ACFG_1);
60+ omap_writel(0x0000fff3, OMAP7XX_FLASH_CFG_1);
61+ omap_writel(0x00000000, OMAP7XX_FLASH_ACFG_1);
62 
63     /*
64      * Configure MPU_EXT_NIRQ IO in IO_CONF9 register,
65      * It is used as the Ethernet controller interrupt
66      */
67- omap_writel(omap_readl(OMAP730_IO_CONF_9) & 0x1FFFFFFF, OMAP730_IO_CONF_9);
68+ omap_writel(omap_readl(OMAP7XX_IO_CONF_9) & 0x1FFFFFFF, OMAP7XX_IO_CONF_9);
69 }
70 
71 MACHINE_START(OMAP_FSAMPLE, "OMAP730 F-Sample")
72--- a/arch/arm/mach-omap1/board-perseus2.c
73+++ b/arch/arm/mach-omap1/board-perseus2.c
74@@ -74,7 +74,7 @@ static struct resource smc91x_resources[
75         .flags = IORESOURCE_MEM,
76     },
77     [1] = {
78- .start = INT_730_MPU_EXT_NIRQ,
79+ .start = INT_7XX_MPU_EXT_NIRQ,
80         .end = 0,
81         .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
82     },
83@@ -163,8 +163,8 @@ static struct platform_device smc91x_dev
84 
85 static struct resource kp_resources[] = {
86     [0] = {
87- .start = INT_730_MPUIO_KEYPAD,
88- .end = INT_730_MPUIO_KEYPAD,
89+ .start = INT_7XX_MPUIO_KEYPAD,
90+ .end = INT_7XX_MPUIO_KEYPAD,
91         .flags = IORESOURCE_IRQ,
92     },
93 };
94@@ -270,7 +270,7 @@ static void __init omap_perseus2_map_io(
95     /*
96      * Hold GSM Reset until needed
97      */
98- omap_writew(omap_readw(OMAP730_DSP_M_CTL) & ~1, OMAP730_DSP_M_CTL);
99+ omap_writew(omap_readw(OMAP7XX_DSP_M_CTL) & ~1, OMAP7XX_DSP_M_CTL);
100 
101     /*
102      * UARTs -> done automagically by 8250 driver
103@@ -281,21 +281,21 @@ static void __init omap_perseus2_map_io(
104      */
105 
106     /* Flash: CS0 timings setup */
107- omap_writel(0x0000fff3, OMAP730_FLASH_CFG_0);
108- omap_writel(0x00000088, OMAP730_FLASH_ACFG_0);
109+ omap_writel(0x0000fff3, OMAP7XX_FLASH_CFG_0);
110+ omap_writel(0x00000088, OMAP7XX_FLASH_ACFG_0);
111 
112     /*
113      * Ethernet support through the debug board
114      * CS1 timings setup
115      */
116- omap_writel(0x0000fff3, OMAP730_FLASH_CFG_1);
117- omap_writel(0x00000000, OMAP730_FLASH_ACFG_1);
118+ omap_writel(0x0000fff3, OMAP7XX_FLASH_CFG_1);
119+ omap_writel(0x00000000, OMAP7XX_FLASH_ACFG_1);
120 
121     /*
122      * Configure MPU_EXT_NIRQ IO in IO_CONF9 register,
123      * It is used as the Ethernet controller interrupt
124      */
125- omap_writel(omap_readl(OMAP730_IO_CONF_9) & 0x1FFFFFFF, OMAP730_IO_CONF_9);
126+ omap_writel(omap_readl(OMAP7XX_IO_CONF_9) & 0x1FFFFFFF, OMAP7XX_IO_CONF_9);
127 }
128 
129 MACHINE_START(OMAP_PERSEUS2, "OMAP730 Perseus2")
130--- a/arch/arm/mach-omap1/clock.c
131+++ b/arch/arm/mach-omap1/clock.c
132@@ -69,13 +69,13 @@ struct omap_clk {
133     }
134 
135 #define CK_310 (1 << 0)
136-#define CK_730 (1 << 1)
137+#define CK_7XX (1 << 1)
138 #define CK_1510 (1 << 2)
139 #define CK_16XX (1 << 3)
140 
141 static struct omap_clk omap_clks[] = {
142     /* non-ULPD clocks */
143- CLK(NULL, "ck_ref", &ck_ref, CK_16XX | CK_1510 | CK_310),
144+ CLK(NULL, "ck_ref", &ck_ref, CK_16XX | CK_1510 | CK_310 | CK_7XX),
145     CLK(NULL, "ck_dpll1", &ck_dpll1, CK_16XX | CK_1510 | CK_310),
146     /* CK_GEN1 clocks */
147     CLK(NULL, "ck_dpll1out", &ck_dpll1out.clk, CK_16XX),
148@@ -83,7 +83,7 @@ static struct omap_clk omap_clks[] = {
149     CLK(NULL, "arm_ck", &arm_ck, CK_16XX | CK_1510 | CK_310),
150     CLK(NULL, "armper_ck", &armper_ck.clk, CK_16XX | CK_1510 | CK_310),
151     CLK(NULL, "arm_gpio_ck", &arm_gpio_ck, CK_1510 | CK_310),
152- CLK(NULL, "armxor_ck", &armxor_ck.clk, CK_16XX | CK_1510 | CK_310),
153+ CLK(NULL, "armxor_ck", &armxor_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),
154     CLK(NULL, "armtim_ck", &armtim_ck.clk, CK_16XX | CK_1510 | CK_310),
155     CLK("omap_wdt", "fck", &armwdt_ck.clk, CK_16XX | CK_1510 | CK_310),
156     CLK("omap_wdt", "ick", &armper_ck.clk, CK_16XX),
157@@ -97,7 +97,7 @@ static struct omap_clk omap_clks[] = {
158     CLK(NULL, "dspxor_ck", &dspxor_ck, CK_16XX | CK_1510 | CK_310),
159     CLK(NULL, "dsptim_ck", &dsptim_ck, CK_16XX | CK_1510 | CK_310),
160     /* CK_GEN3 clocks */
161- CLK(NULL, "tc_ck", &tc_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_730),
162+ CLK(NULL, "tc_ck", &tc_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),
163     CLK(NULL, "tipb_ck", &tipb_ck, CK_1510 | CK_310),
164     CLK(NULL, "l3_ocpi_ck", &l3_ocpi_ck, CK_16XX),
165     CLK(NULL, "tc1_ck", &tc1_ck, CK_16XX),
166@@ -108,7 +108,7 @@ static struct omap_clk omap_clks[] = {
167     CLK(NULL, "lb_ck", &lb_ck.clk, CK_1510 | CK_310),
168     CLK(NULL, "rhea1_ck", &rhea1_ck, CK_16XX),
169     CLK(NULL, "rhea2_ck", &rhea2_ck, CK_16XX),
170- CLK(NULL, "lcd_ck", &lcd_ck_16xx, CK_16XX | CK_730),
171+ CLK(NULL, "lcd_ck", &lcd_ck_16xx, CK_16XX | CK_7XX),
172     CLK(NULL, "lcd_ck", &lcd_ck_1510.clk, CK_1510 | CK_310),
173     /* ULPD clocks */
174     CLK(NULL, "uart1_ck", &uart1_1510, CK_1510 | CK_310),
175@@ -398,7 +398,7 @@ static int omap1_select_table_rate(struc
176      * Reprogramming the DPLL is tricky, it must be done from SRAM.
177      * (on 730, bit 13 must always be 1)
178      */
179- if (cpu_is_omap730())
180+ if (cpu_is_omap7xx())
181         omap_sram_reprogram_clock(ptr->dpllctl_val, ptr->ckctl_val | 0x2000);
182     else
183         omap_sram_reprogram_clock(ptr->dpllctl_val, ptr->ckctl_val);
184@@ -783,8 +783,8 @@ int __init omap1_clk_init(void)
185         cpu_mask |= CK_16XX;
186     if (cpu_is_omap1510())
187         cpu_mask |= CK_1510;
188- if (cpu_is_omap730())
189- cpu_mask |= CK_730;
190+ if (cpu_is_omap7xx())
191+ cpu_mask |= CK_7XX;
192     if (cpu_is_omap310())
193         cpu_mask |= CK_310;
194 
195@@ -800,7 +800,7 @@ int __init omap1_clk_init(void)
196             crystal_type = info->system_clock_type;
197     }
198 
199-#if defined(CONFIG_ARCH_OMAP730)
200+#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
201     ck_ref.rate = 13000000;
202 #elif defined(CONFIG_ARCH_OMAP16XX)
203     if (crystal_type == 2)
204@@ -847,7 +847,7 @@ int __init omap1_clk_init(void)
205         printk(KERN_ERR "System frequencies not set. Check your config.\n");
206         /* Guess sane values (60MHz) */
207         omap_writew(0x2290, DPLL_CTL);
208- omap_writew(cpu_is_omap730() ? 0x3005 : 0x1005, ARM_CKCTL);
209+ omap_writew(cpu_is_omap7xx() ? 0x3005 : 0x1005, ARM_CKCTL);
210         ck_dpll1.rate = 60000000;
211     }
212 #endif
213@@ -862,7 +862,7 @@ int __init omap1_clk_init(void)
214 
215 #if defined(CONFIG_MACH_OMAP_PERSEUS2) || defined(CONFIG_MACH_OMAP_FSAMPLE)
216     /* Select slicer output as OMAP input clock */
217- omap_writew(omap_readw(OMAP730_PCC_UPLD_CTRL) & ~0x1, OMAP730_PCC_UPLD_CTRL);
218+ omap_writew(omap_readw(OMAP7XX_PCC_UPLD_CTRL) & ~0x1, OMAP7XX_PCC_UPLD_CTRL);
219 #endif
220 
221     /* Amstrad Delta wants BCLK high when inactive */
222@@ -873,7 +873,7 @@ int __init omap1_clk_init(void)
223 
224     /* Turn off DSP and ARM_TIMXO. Make sure ARM_INTHCK is not divided */
225     /* (on 730, bit 13 must not be cleared) */
226- if (cpu_is_omap730())
227+ if (cpu_is_omap7xx())
228         omap_writew(omap_readw(ARM_CKCTL) & 0x2fff, ARM_CKCTL);
229     else
230         omap_writew(omap_readw(ARM_CKCTL) & 0x0fff, ARM_CKCTL);
231--- a/arch/arm/mach-omap1/io.c
232+++ b/arch/arm/mach-omap1/io.c
233@@ -36,33 +36,17 @@ static struct map_desc omap_io_desc[] __
234     }
235 };
236 
237-#ifdef CONFIG_ARCH_OMAP730
238-static struct map_desc omap730_io_desc[] __initdata = {
239+#if defined (CONFIG_ARCH_OMAP730) || defined (CONFIG_ARCH_OMAP850)
240+static struct map_desc omap7xx_io_desc[] __initdata = {
241     {
242- .virtual = OMAP730_DSP_BASE,
243- .pfn = __phys_to_pfn(OMAP730_DSP_START),
244- .length = OMAP730_DSP_SIZE,
245+ .virtual = OMAP7XX_DSP_BASE,
246+ .pfn = __phys_to_pfn(OMAP7XX_DSP_START),
247+ .length = OMAP7XX_DSP_SIZE,
248         .type = MT_DEVICE
249     }, {
250- .virtual = OMAP730_DSPREG_BASE,
251- .pfn = __phys_to_pfn(OMAP730_DSPREG_START),
252- .length = OMAP730_DSPREG_SIZE,
253- .type = MT_DEVICE
254- }
255-};
256-#endif
257-
258-#ifdef CONFIG_ARCH_OMAP850
259-static struct map_desc omap850_io_desc[] __initdata = {
260- {
261- .virtual = OMAP850_DSP_BASE,
262- .pfn = __phys_to_pfn(OMAP850_DSP_START),
263- .length = OMAP850_DSP_SIZE,
264- .type = MT_DEVICE
265- }, {
266- .virtual = OMAP850_DSPREG_BASE,
267- .pfn = __phys_to_pfn(OMAP850_DSPREG_START),
268- .length = OMAP850_DSPREG_SIZE,
269+ .virtual = OMAP7XX_DSPREG_BASE,
270+ .pfn = __phys_to_pfn(OMAP7XX_DSPREG_START),
271+ .length = OMAP7XX_DSPREG_SIZE,
272         .type = MT_DEVICE
273     }
274 };
275@@ -120,18 +104,11 @@ void __init omap1_map_common_io(void)
276      */
277     omap_check_revision();
278 
279-#ifdef CONFIG_ARCH_OMAP730
280- if (cpu_is_omap730()) {
281- iotable_init(omap730_io_desc, ARRAY_SIZE(omap730_io_desc));
282- }
283-#endif
284-
285-#ifdef CONFIG_ARCH_OMAP850
286- if (cpu_is_omap850()) {
287- iotable_init(omap850_io_desc, ARRAY_SIZE(omap850_io_desc));
288+#if defined (CONFIG_ARCH_OMAP730) || defined (CONFIG_ARCH_OMAP850)
289+ if (cpu_is_omap7xx()) {
290+ iotable_init(omap7xx_io_desc, ARRAY_SIZE(omap7xx_io_desc));
291     }
292 #endif
293-
294 #ifdef CONFIG_ARCH_OMAP15XX
295     if (cpu_is_omap15xx()) {
296         iotable_init(omap1510_io_desc, ARRAY_SIZE(omap1510_io_desc));
297--- a/arch/arm/mach-omap1/irq.c
298+++ b/arch/arm/mach-omap1/irq.c
299@@ -137,16 +137,8 @@ static void omap_irq_set_cfg(int irq, in
300     irq_bank_writel(val, bank, offset);
301 }
302 
303-#ifdef CONFIG_ARCH_OMAP730
304-static struct omap_irq_bank omap730_irq_banks[] = {
305- { .base_reg = OMAP_IH1_BASE, .trigger_map = 0xb3f8e22f },
306- { .base_reg = OMAP_IH2_BASE, .trigger_map = 0xfdb9c1f2 },
307- { .base_reg = OMAP_IH2_BASE + 0x100, .trigger_map = 0x800040f3 },
308-};
309-#endif
310-
311-#ifdef CONFIG_ARCH_OMAP850
312-static struct omap_irq_bank omap850_irq_banks[] = {
313+#if defined (CONFIG_ARCH_OMAP730) || defined (CONFIG_ARCH_OMAP850)
314+static struct omap_irq_bank omap7xx_irq_banks[] = {
315     { .base_reg = OMAP_IH1_BASE, .trigger_map = 0xb3f8e22f },
316     { .base_reg = OMAP_IH2_BASE, .trigger_map = 0xfdb9c1f2 },
317     { .base_reg = OMAP_IH2_BASE + 0x100, .trigger_map = 0x800040f3 },
318@@ -186,16 +178,10 @@ void __init omap_init_irq(void)
319 {
320     int i, j;
321 
322-#ifdef CONFIG_ARCH_OMAP730
323- if (cpu_is_omap730()) {
324- irq_banks = omap730_irq_banks;
325- irq_bank_count = ARRAY_SIZE(omap730_irq_banks);
326- }
327-#endif
328-#ifdef CONFIG_ARCH_OMAP850
329- if (cpu_is_omap850()) {
330- irq_banks = omap850_irq_banks;
331- irq_bank_count = ARRAY_SIZE(omap850_irq_banks);
332+#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
333+ if (cpu_is_omap7xx()) {
334+ irq_banks = omap7xx_irq_banks;
335+ irq_bank_count = ARRAY_SIZE(omap7xx_irq_banks);
336     }
337 #endif
338 #ifdef CONFIG_ARCH_OMAP15XX
339@@ -247,10 +233,8 @@ void __init omap_init_irq(void)
340 
341     /* Unmask level 2 handler */
342 
343- if (cpu_is_omap730())
344- omap_unmask_irq(INT_730_IH2_IRQ);
345- else if (cpu_is_omap850())
346- omap_unmask_irq(INT_850_IH2_IRQ);
347+ if (cpu_is_omap7xx())
348+ omap_unmask_irq(INT_7XX_IH2_IRQ);
349     else if (cpu_is_omap15xx())
350         omap_unmask_irq(INT_1510_IH2_IRQ);
351     else if (cpu_is_omap16xx())
352--- a/arch/arm/mach-omap1/mcbsp.c
353+++ b/arch/arm/mach-omap1/mcbsp.c
354@@ -79,29 +79,29 @@ static struct omap_mcbsp_ops omap1_mcbsp
355     .free = omap1_mcbsp_free,
356 };
357 
358-#ifdef CONFIG_ARCH_OMAP730
359-static struct omap_mcbsp_platform_data omap730_mcbsp_pdata[] = {
360+#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
361+static struct omap_mcbsp_platform_data omap7xx_mcbsp_pdata[] = {
362     {
363- .phys_base = OMAP730_MCBSP1_BASE,
364+ .phys_base = OMAP7XX_MCBSP1_BASE,
365         .dma_rx_sync = OMAP_DMA_MCBSP1_RX,
366         .dma_tx_sync = OMAP_DMA_MCBSP1_TX,
367- .rx_irq = INT_730_McBSP1RX,
368- .tx_irq = INT_730_McBSP1TX,
369+ .rx_irq = INT_7XX_McBSP1RX,
370+ .tx_irq = INT_7XX_McBSP1TX,
371         .ops = &omap1_mcbsp_ops,
372     },
373     {
374- .phys_base = OMAP730_MCBSP2_BASE,
375+ .phys_base = OMAP7XX_MCBSP2_BASE,
376         .dma_rx_sync = OMAP_DMA_MCBSP3_RX,
377         .dma_tx_sync = OMAP_DMA_MCBSP3_TX,
378- .rx_irq = INT_730_McBSP2RX,
379- .tx_irq = INT_730_McBSP2TX,
380+ .rx_irq = INT_7XX_McBSP2RX,
381+ .tx_irq = INT_7XX_McBSP2TX,
382         .ops = &omap1_mcbsp_ops,
383     },
384 };
385-#define OMAP730_MCBSP_PDATA_SZ ARRAY_SIZE(omap730_mcbsp_pdata)
386+#define OMAP7XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap7xx_mcbsp_pdata)
387 #else
388-#define omap730_mcbsp_pdata NULL
389-#define OMAP730_MCBSP_PDATA_SZ 0
390+#define omap7xx_mcbsp_pdata NULL
391+#define OMAP7XX_MCBSP_PDATA_SZ 0
392 #endif
393 
394 #ifdef CONFIG_ARCH_OMAP15XX
395@@ -172,8 +172,8 @@ static struct omap_mcbsp_platform_data o
396 
397 int __init omap1_mcbsp_init(void)
398 {
399- if (cpu_is_omap730())
400- omap_mcbsp_count = OMAP730_MCBSP_PDATA_SZ;
401+ if (cpu_is_omap7xx())
402+ omap_mcbsp_count = OMAP7XX_MCBSP_PDATA_SZ;
403     if (cpu_is_omap15xx())
404         omap_mcbsp_count = OMAP15XX_MCBSP_PDATA_SZ;
405     if (cpu_is_omap16xx())
406@@ -184,9 +184,9 @@ int __init omap1_mcbsp_init(void)
407     if (!mcbsp_ptr)
408         return -ENOMEM;
409 
410- if (cpu_is_omap730())
411- omap_mcbsp_register_board_cfg(omap730_mcbsp_pdata,
412- OMAP730_MCBSP_PDATA_SZ);
413+ if (cpu_is_omap7xx())
414+ omap_mcbsp_register_board_cfg(omap7xx_mcbsp_pdata,
415+ OMAP7XX_MCBSP_PDATA_SZ);
416 
417     if (cpu_is_omap15xx())
418         omap_mcbsp_register_board_cfg(omap15xx_mcbsp_pdata,
419--- a/arch/arm/mach-omap1/mux.c
420+++ b/arch/arm/mach-omap1/mux.c
421@@ -35,47 +35,28 @@
422 
423 static struct omap_mux_cfg arch_mux_cfg;
424 
425-#ifdef CONFIG_ARCH_OMAP730
426-static struct pin_config __initdata_or_module omap730_pins[] = {
427-MUX_CFG_730("E2_730_KBR0", 12, 21, 0, 20, 1, 0)
428-MUX_CFG_730("J7_730_KBR1", 12, 25, 0, 24, 1, 0)
429-MUX_CFG_730("E1_730_KBR2", 12, 29, 0, 28, 1, 0)
430-MUX_CFG_730("F3_730_KBR3", 13, 1, 0, 0, 1, 0)
431-MUX_CFG_730("D2_730_KBR4", 13, 5, 0, 4, 1, 0)
432-MUX_CFG_730("C2_730_KBC0", 13, 9, 0, 8, 1, 0)
433-MUX_CFG_730("D3_730_KBC1", 13, 13, 0, 12, 1, 0)
434-MUX_CFG_730("E4_730_KBC2", 13, 17, 0, 16, 1, 0)
435-MUX_CFG_730("F4_730_KBC3", 13, 21, 0, 20, 1, 0)
436-MUX_CFG_730("E3_730_KBC4", 13, 25, 0, 24, 1, 0)
437-
438-MUX_CFG_730("AA17_730_USB_DM", 2, 21, 0, 20, 0, 0)
439-MUX_CFG_730("W16_730_USB_PU_EN", 2, 25, 0, 24, 0, 0)
440-MUX_CFG_730("W17_730_USB_VBUSI", 2, 29, 0, 28, 0, 0)
441+#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
442+static struct pin_config __initdata_or_module omap7xx_pins[] = {
443+MUX_CFG_7XX("E2_7XX_KBR0", 12, 21, 0, 20, 1, 0)
444+MUX_CFG_7XX("J7_7XX_KBR1", 12, 25, 0, 24, 1, 0)
445+MUX_CFG_7XX("E1_7XX_KBR2", 12, 29, 0, 28, 1, 0)
446+MUX_CFG_7XX("F3_7XX_KBR3", 13, 1, 0, 0, 1, 0)
447+MUX_CFG_7XX("D2_7XX_KBR4", 13, 5, 0, 4, 1, 0)
448+MUX_CFG_7XX("C2_7XX_KBC0", 13, 9, 0, 8, 1, 0)
449+MUX_CFG_7XX("D3_7XX_KBC1", 13, 13, 0, 12, 1, 0)
450+MUX_CFG_7XX("E4_7XX_KBC2", 13, 17, 0, 16, 1, 0)
451+MUX_CFG_7XX("F4_7XX_KBC3", 13, 21, 0, 20, 1, 0)
452+MUX_CFG_7XX("E3_7XX_KBC4", 13, 25, 0, 24, 1, 0)
453+
454+MUX_CFG_7XX("AA17_7XX_USB_DM", 2, 21, 0, 20, 0, 0)
455+MUX_CFG_7XX("W16_7XX_USB_PU_EN", 2, 25, 0, 24, 0, 0)
456+MUX_CFG_7XX("W17_7XX_USB_VBUSI", 2, 29, 0, 28, 0, 0)
457 };
458-#define OMAP730_PINS_SZ ARRAY_SIZE(omap730_pins)
459+#define OMAP7XX_PINS_SZ ARRAY_SIZE(omap7xx_pins)
460 #else
461-#define omap730_pins NULL
462-#define OMAP730_PINS_SZ 0
463-#endif /* CONFIG_ARCH_OMAP730 */
464-
465-#ifdef CONFIG_ARCH_OMAP850
466-struct pin_config __initdata_or_module omap850_pins[] = {
467-MUX_CFG_850("E2_850_KBR0", 12, 21, 0, 20, 1, 0)
468-MUX_CFG_850("J7_850_KBR1", 12, 25, 0, 24, 1, 0)
469-MUX_CFG_850("E1_850_KBR2", 12, 29, 0, 28, 1, 0)
470-MUX_CFG_850("F3_850_KBR3", 13, 1, 0, 0, 1, 0)
471-MUX_CFG_850("D2_850_KBR4", 13, 5, 0, 4, 1, 0)
472-MUX_CFG_850("C2_850_KBC0", 13, 9, 0, 8, 1, 0)
473-MUX_CFG_850("D3_850_KBC1", 13, 13, 0, 12, 1, 0)
474-MUX_CFG_850("E4_850_KBC2", 13, 17, 0, 16, 1, 0)
475-MUX_CFG_850("F4_850_KBC3", 13, 21, 0, 20, 1, 0)
476-MUX_CFG_850("E3_850_KBC4", 13, 25, 0, 24, 1, 0)
477-
478-MUX_CFG_850("AA17_850_USB_DM", 2, 21, 0, 20, 0, 0)
479-MUX_CFG_850("W16_850_USB_PU_EN", 2, 25, 0, 24, 0, 0)
480-MUX_CFG_850("W17_850_USB_VBUSI", 2, 29, 0, 28, 0, 0)
481-};
482-#endif
483+#define omap7xx_pins NULL
484+#define OMAP7XX_PINS_SZ 0
485+#endif /* CONFIG_ARCH_OMAP730 || CONFIG_ARCH_OMAP850 */
486 
487 #if defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX)
488 static struct pin_config __initdata_or_module omap1xxx_pins[] = {
489@@ -438,11 +419,6 @@ int __init_or_module omap1_cfg_reg(const
490             printk(" %s (0x%08x) = 0x%08x -> 0x%08x\n",
491                    cfg->pull_name, cfg->pull_reg, pull_orig, pull);
492     }
493-
494-#ifdef CONFIG_ARCH_OMAP850
495- omap_mux_register(omap850_pins, ARRAY_SIZE(omap850_pins));
496-#endif
497-
498 #endif
499 
500 #ifdef CONFIG_OMAP_MUX_ERRORS
501@@ -454,9 +430,9 @@ int __init_or_module omap1_cfg_reg(const
502 
503 int __init omap1_mux_init(void)
504 {
505- if (cpu_is_omap730()) {
506- arch_mux_cfg.pins = omap730_pins;
507- arch_mux_cfg.size = OMAP730_PINS_SZ;
508+ if (cpu_is_omap7xx()) {
509+ arch_mux_cfg.pins = omap7xx_pins;
510+ arch_mux_cfg.size = OMAP7XX_PINS_SZ;
511         arch_mux_cfg.cfg_reg = omap1_cfg_reg;
512     }
513 
514--- a/arch/arm/mach-omap1/pm.c
515+++ b/arch/arm/mach-omap1/pm.c
516@@ -62,7 +62,7 @@
517 static unsigned int arm_sleep_save[ARM_SLEEP_SAVE_SIZE];
518 static unsigned short dsp_sleep_save[DSP_SLEEP_SAVE_SIZE];
519 static unsigned short ulpd_sleep_save[ULPD_SLEEP_SAVE_SIZE];
520-static unsigned int mpui730_sleep_save[MPUI730_SLEEP_SAVE_SIZE];
521+static unsigned int mpui7xx_sleep_save[MPUI7XX_SLEEP_SAVE_SIZE];
522 static unsigned int mpui1510_sleep_save[MPUI1510_SLEEP_SAVE_SIZE];
523 static unsigned int mpui1610_sleep_save[MPUI1610_SLEEP_SAVE_SIZE];
524 
525@@ -183,9 +183,9 @@ static void omap_pm_wakeup_setup(void)
526      * drivers must still separately call omap_set_gpio_wakeup() to
527      * wake up to a GPIO interrupt.
528      */
529- if (cpu_is_omap730())
530- level1_wake = OMAP_IRQ_BIT(INT_730_GPIO_BANK1) |
531- OMAP_IRQ_BIT(INT_730_IH2_IRQ);
532+ if (cpu_is_omap7xx())
533+ level1_wake = OMAP_IRQ_BIT(INT_7XX_GPIO_BANK1) |
534+ OMAP_IRQ_BIT(INT_7XX_IH2_IRQ);
535     else if (cpu_is_omap15xx())
536         level1_wake = OMAP_IRQ_BIT(INT_GPIO_BANK1) |
537             OMAP_IRQ_BIT(INT_1510_IH2_IRQ);
538@@ -195,10 +195,10 @@ static void omap_pm_wakeup_setup(void)
539 
540     omap_writel(~level1_wake, OMAP_IH1_MIR);
541 
542- if (cpu_is_omap730()) {
543+ if (cpu_is_omap7xx()) {
544         omap_writel(~level2_wake, OMAP_IH2_0_MIR);
545- omap_writel(~(OMAP_IRQ_BIT(INT_730_WAKE_UP_REQ) |
546- OMAP_IRQ_BIT(INT_730_MPUIO_KEYPAD)),
547+ omap_writel(~(OMAP_IRQ_BIT(INT_7XX_WAKE_UP_REQ) |
548+ OMAP_IRQ_BIT(INT_7XX_MPUIO_KEYPAD)),
549                 OMAP_IH2_1_MIR);
550     } else if (cpu_is_omap15xx()) {
551         level2_wake |= OMAP_IRQ_BIT(INT_KEYBOARD);
552@@ -253,15 +253,15 @@ void omap1_pm_suspend(void)
553      * Save interrupt, MPUI, ARM and UPLD control registers.
554      */
555 
556- if (cpu_is_omap730()) {
557- MPUI730_SAVE(OMAP_IH1_MIR);
558- MPUI730_SAVE(OMAP_IH2_0_MIR);
559- MPUI730_SAVE(OMAP_IH2_1_MIR);
560- MPUI730_SAVE(MPUI_CTRL);
561- MPUI730_SAVE(MPUI_DSP_BOOT_CONFIG);
562- MPUI730_SAVE(MPUI_DSP_API_CONFIG);
563- MPUI730_SAVE(EMIFS_CONFIG);
564- MPUI730_SAVE(EMIFF_SDRAM_CONFIG);
565+ if (cpu_is_omap7xx()) {
566+ MPUI7XX_SAVE(OMAP_IH1_MIR);
567+ MPUI7XX_SAVE(OMAP_IH2_0_MIR);
568+ MPUI7XX_SAVE(OMAP_IH2_1_MIR);
569+ MPUI7XX_SAVE(MPUI_CTRL);
570+ MPUI7XX_SAVE(MPUI_DSP_BOOT_CONFIG);
571+ MPUI7XX_SAVE(MPUI_DSP_API_CONFIG);
572+ MPUI7XX_SAVE(EMIFS_CONFIG);
573+ MPUI7XX_SAVE(EMIFF_SDRAM_CONFIG);
574 
575     } else if (cpu_is_omap15xx()) {
576         MPUI1510_SAVE(OMAP_IH1_MIR);
577@@ -306,7 +306,7 @@ void omap1_pm_suspend(void)
578     omap_writew(omap_readw(ARM_RSTCT1) & ~(1 << DSP_EN), ARM_RSTCT1);
579 
580         /* shut down dsp_ck */
581- if (!cpu_is_omap730())
582+ if (!cpu_is_omap7xx())
583         omap_writew(omap_readw(ARM_CKCTL) & ~(1 << EN_DSPCK), ARM_CKCTL);
584 
585     /* temporarily enabling api_ck to access DSP registers */
586@@ -383,12 +383,12 @@ void omap1_pm_suspend(void)
587     ULPD_RESTORE(ULPD_CLOCK_CTRL);
588     ULPD_RESTORE(ULPD_STATUS_REQ);
589 
590- if (cpu_is_omap730()) {
591- MPUI730_RESTORE(EMIFS_CONFIG);
592- MPUI730_RESTORE(EMIFF_SDRAM_CONFIG);
593- MPUI730_RESTORE(OMAP_IH1_MIR);
594- MPUI730_RESTORE(OMAP_IH2_0_MIR);
595- MPUI730_RESTORE(OMAP_IH2_1_MIR);
596+ if (cpu_is_omap7xx()) {
597+ MPUI7XX_RESTORE(EMIFS_CONFIG);
598+ MPUI7XX_RESTORE(EMIFF_SDRAM_CONFIG);
599+ MPUI7XX_RESTORE(OMAP_IH1_MIR);
600+ MPUI7XX_RESTORE(OMAP_IH2_0_MIR);
601+ MPUI7XX_RESTORE(OMAP_IH2_1_MIR);
602     } else if (cpu_is_omap15xx()) {
603         MPUI1510_RESTORE(MPUI_CTRL);
604         MPUI1510_RESTORE(MPUI_DSP_BOOT_CONFIG);
605@@ -461,13 +461,13 @@ static int omap_pm_read_proc(
606     ULPD_SAVE(ULPD_DPLL_CTRL);
607     ULPD_SAVE(ULPD_POWER_CTRL);
608 
609- if (cpu_is_omap730()) {
610- MPUI730_SAVE(MPUI_CTRL);
611- MPUI730_SAVE(MPUI_DSP_STATUS);
612- MPUI730_SAVE(MPUI_DSP_BOOT_CONFIG);
613- MPUI730_SAVE(MPUI_DSP_API_CONFIG);
614- MPUI730_SAVE(EMIFF_SDRAM_CONFIG);
615- MPUI730_SAVE(EMIFS_CONFIG);
616+ if (cpu_is_omap7xx()) {
617+ MPUI7XX_SAVE(MPUI_CTRL);
618+ MPUI7XX_SAVE(MPUI_DSP_STATUS);
619+ MPUI7XX_SAVE(MPUI_DSP_BOOT_CONFIG);
620+ MPUI7XX_SAVE(MPUI_DSP_API_CONFIG);
621+ MPUI7XX_SAVE(EMIFF_SDRAM_CONFIG);
622+ MPUI7XX_SAVE(EMIFS_CONFIG);
623     } else if (cpu_is_omap15xx()) {
624         MPUI1510_SAVE(MPUI_CTRL);
625         MPUI1510_SAVE(MPUI_DSP_STATUS);
626@@ -517,20 +517,20 @@ static int omap_pm_read_proc(
627            ULPD_SHOW(ULPD_STATUS_REQ),
628            ULPD_SHOW(ULPD_POWER_CTRL));
629 
630- if (cpu_is_omap730()) {
631+ if (cpu_is_omap7xx()) {
632             my_buffer_offset += sprintf(my_base + my_buffer_offset,
633- "MPUI730_CTRL_REG 0x%-8x \n"
634- "MPUI730_DSP_STATUS_REG: 0x%-8x \n"
635- "MPUI730_DSP_BOOT_CONFIG_REG: 0x%-8x \n"
636- "MPUI730_DSP_API_CONFIG_REG: 0x%-8x \n"
637- "MPUI730_SDRAM_CONFIG_REG: 0x%-8x \n"
638- "MPUI730_EMIFS_CONFIG_REG: 0x%-8x \n",
639- MPUI730_SHOW(MPUI_CTRL),
640- MPUI730_SHOW(MPUI_DSP_STATUS),
641- MPUI730_SHOW(MPUI_DSP_BOOT_CONFIG),
642- MPUI730_SHOW(MPUI_DSP_API_CONFIG),
643- MPUI730_SHOW(EMIFF_SDRAM_CONFIG),
644- MPUI730_SHOW(EMIFS_CONFIG));
645+ "MPUI7XX_CTRL_REG 0x%-8x \n"
646+ "MPUI7XX_DSP_STATUS_REG: 0x%-8x \n"
647+ "MPUI7XX_DSP_BOOT_CONFIG_REG: 0x%-8x \n"
648+ "MPUI7XX_DSP_API_CONFIG_REG: 0x%-8x \n"
649+ "MPUI7XX_SDRAM_CONFIG_REG: 0x%-8x \n"
650+ "MPUI7XX_EMIFS_CONFIG_REG: 0x%-8x \n",
651+ MPUI7XX_SHOW(MPUI_CTRL),
652+ MPUI7XX_SHOW(MPUI_DSP_STATUS),
653+ MPUI7XX_SHOW(MPUI_DSP_BOOT_CONFIG),
654+ MPUI7XX_SHOW(MPUI_DSP_API_CONFIG),
655+ MPUI7XX_SHOW(EMIFF_SDRAM_CONFIG),
656+ MPUI7XX_SHOW(EMIFS_CONFIG));
657         } else if (cpu_is_omap15xx()) {
658             my_buffer_offset += sprintf(my_base + my_buffer_offset,
659                "MPUI1510_CTRL_REG 0x%-8x \n"
660@@ -668,9 +668,9 @@ static int __init omap_pm_init(void)
661      * These routines need to be in SRAM as that's the only
662      * memory the MPU can see when it wakes up.
663      */
664- if (cpu_is_omap730()) {
665- omap_sram_suspend = omap_sram_push(omap730_cpu_suspend,
666- omap730_cpu_suspend_sz);
667+ if (cpu_is_omap7xx()) {
668+ omap_sram_suspend = omap_sram_push(omap7xx_cpu_suspend,
669+ omap7xx_cpu_suspend_sz);
670     } else if (cpu_is_omap15xx()) {
671         omap_sram_suspend = omap_sram_push(omap1510_cpu_suspend,
672                            omap1510_cpu_suspend_sz);
673@@ -686,8 +686,8 @@ static int __init omap_pm_init(void)
674 
675     pm_idle = omap1_pm_idle;
676 
677- if (cpu_is_omap730())
678- setup_irq(INT_730_WAKE_UP_REQ, &omap_wakeup_irq);
679+ if (cpu_is_omap7xx())
680+ setup_irq(INT_7XX_WAKE_UP_REQ, &omap_wakeup_irq);
681     else if (cpu_is_omap16xx())
682         setup_irq(INT_1610_WAKE_UP_REQ, &omap_wakeup_irq);
683 
684@@ -700,8 +700,8 @@ static int __init omap_pm_init(void)
685     omap_writew(ULPD_POWER_CTRL_REG_VAL, ULPD_POWER_CTRL);
686 
687     /* Configure IDLECT3 */
688- if (cpu_is_omap730())
689- omap_writel(OMAP730_IDLECT3_VAL, OMAP730_IDLECT3);
690+ if (cpu_is_omap7xx())
691+ omap_writel(OMAP7XX_IDLECT3_VAL, OMAP7XX_IDLECT3);
692     else if (cpu_is_omap16xx())
693         omap_writel(OMAP1610_IDLECT3_VAL, OMAP1610_IDLECT3);
694 
695--- a/arch/arm/mach-omap1/pm.h
696+++ b/arch/arm/mach-omap1/pm.h
697@@ -98,13 +98,14 @@
698 #define OMAP1610_IDLECT3 0xfffece24
699 #define OMAP1610_IDLE_LOOP_REQUEST 0x0400
700 
701-#define OMAP730_IDLECT1_SLEEP_VAL 0x16c7
702-#define OMAP730_IDLECT2_SLEEP_VAL 0x09c7
703-#define OMAP730_IDLECT3_VAL 0x3f
704-#define OMAP730_IDLECT3 0xfffece24
705-#define OMAP730_IDLE_LOOP_REQUEST 0x0C00
706+#define OMAP7XX_IDLECT1_SLEEP_VAL 0x16c7
707+#define OMAP7XX_IDLECT2_SLEEP_VAL 0x09c7
708+#define OMAP7XX_IDLECT3_VAL 0x3f
709+#define OMAP7XX_IDLECT3 0xfffece24
710+#define OMAP7XX_IDLE_LOOP_REQUEST 0x0C00
711 
712 #if !defined(CONFIG_ARCH_OMAP730) && \
713+ !defined(CONFIG_ARCH_OMAP850) && \
714     !defined(CONFIG_ARCH_OMAP15XX) && \
715     !defined(CONFIG_ARCH_OMAP16XX)
716 #warning "Power management for this processor not implemented yet"
717@@ -122,17 +123,17 @@ extern void allow_idle_sleep(void);
718 extern void omap1_pm_idle(void);
719 extern void omap1_pm_suspend(void);
720 
721-extern void omap730_cpu_suspend(unsigned short, unsigned short);
722+extern void omap7xx_cpu_suspend(unsigned short, unsigned short);
723 extern void omap1510_cpu_suspend(unsigned short, unsigned short);
724 extern void omap1610_cpu_suspend(unsigned short, unsigned short);
725-extern void omap730_idle_loop_suspend(void);
726+extern void omap7xx_idle_loop_suspend(void);
727 extern void omap1510_idle_loop_suspend(void);
728 extern void omap1610_idle_loop_suspend(void);
729 
730-extern unsigned int omap730_cpu_suspend_sz;
731+extern unsigned int omap7xx_cpu_suspend_sz;
732 extern unsigned int omap1510_cpu_suspend_sz;
733 extern unsigned int omap1610_cpu_suspend_sz;
734-extern unsigned int omap730_idle_loop_suspend_sz;
735+extern unsigned int omap7xx_idle_loop_suspend_sz;
736 extern unsigned int omap1510_idle_loop_suspend_sz;
737 extern unsigned int omap1610_idle_loop_suspend_sz;
738 
739@@ -155,9 +156,9 @@ extern void omap_serial_wake_trigger(int
740 #define ULPD_RESTORE(x) omap_writew((ulpd_sleep_save[ULPD_SLEEP_SAVE_##x]), (x))
741 #define ULPD_SHOW(x) ulpd_sleep_save[ULPD_SLEEP_SAVE_##x]
742 
743-#define MPUI730_SAVE(x) mpui730_sleep_save[MPUI730_SLEEP_SAVE_##x] = omap_readl(x)
744-#define MPUI730_RESTORE(x) omap_writel((mpui730_sleep_save[MPUI730_SLEEP_SAVE_##x]), (x))
745-#define MPUI730_SHOW(x) mpui730_sleep_save[MPUI730_SLEEP_SAVE_##x]
746+#define MPUI7XX_SAVE(x) mpui7xx_sleep_save[MPUI7XX_SLEEP_SAVE_##x] = omap_readl(x)
747+#define MPUI7XX_RESTORE(x) omap_writel((mpui7xx_sleep_save[MPUI7XX_SLEEP_SAVE_##x]), (x))
748+#define MPUI7XX_SHOW(x) mpui7xx_sleep_save[MPUI7XX_SLEEP_SAVE_##x]
749 
750 #define MPUI1510_SAVE(x) mpui1510_sleep_save[MPUI1510_SLEEP_SAVE_##x] = omap_readl(x)
751 #define MPUI1510_RESTORE(x) omap_writel((mpui1510_sleep_save[MPUI1510_SLEEP_SAVE_##x]), (x))
752@@ -232,24 +233,24 @@ enum mpui1510_save_state {
753 #endif
754 };
755 
756-enum mpui730_save_state {
757- MPUI730_SLEEP_SAVE_START = 0,
758+enum mpui7xx_save_state {
759+ MPUI7XX_SLEEP_SAVE_START = 0,
760     /*
761      * MPUI registers 32 bits
762      */
763- MPUI730_SLEEP_SAVE_MPUI_CTRL,
764- MPUI730_SLEEP_SAVE_MPUI_DSP_BOOT_CONFIG,
765- MPUI730_SLEEP_SAVE_MPUI_DSP_API_CONFIG,
766- MPUI730_SLEEP_SAVE_MPUI_DSP_STATUS,
767- MPUI730_SLEEP_SAVE_EMIFF_SDRAM_CONFIG,
768- MPUI730_SLEEP_SAVE_EMIFS_CONFIG,
769- MPUI730_SLEEP_SAVE_OMAP_IH1_MIR,
770- MPUI730_SLEEP_SAVE_OMAP_IH2_0_MIR,
771- MPUI730_SLEEP_SAVE_OMAP_IH2_1_MIR,
772-#if defined(CONFIG_ARCH_OMAP730)
773- MPUI730_SLEEP_SAVE_SIZE
774+ MPUI7XX_SLEEP_SAVE_MPUI_CTRL,
775+ MPUI7XX_SLEEP_SAVE_MPUI_DSP_BOOT_CONFIG,
776+ MPUI7XX_SLEEP_SAVE_MPUI_DSP_API_CONFIG,
777+ MPUI7XX_SLEEP_SAVE_MPUI_DSP_STATUS,
778+ MPUI7XX_SLEEP_SAVE_EMIFF_SDRAM_CONFIG,
779+ MPUI7XX_SLEEP_SAVE_EMIFS_CONFIG,
780+ MPUI7XX_SLEEP_SAVE_OMAP_IH1_MIR,
781+ MPUI7XX_SLEEP_SAVE_OMAP_IH2_0_MIR,
782+ MPUI7XX_SLEEP_SAVE_OMAP_IH2_1_MIR,
783+#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
784+ MPUI7XX_SLEEP_SAVE_SIZE
785 #else
786- MPUI730_SLEEP_SAVE_SIZE = 0
787+ MPUI7XX_SLEEP_SAVE_SIZE = 0
788 #endif
789 };
790 
791--- a/arch/arm/mach-omap1/serial.c
792+++ b/arch/arm/mach-omap1/serial.c
793@@ -64,7 +64,6 @@ static void __init omap_serial_reset(str
794 
795 static struct plat_serial8250_port serial_platform_data[] = {
796     {
797- .membase = OMAP1_IO_ADDRESS(OMAP_UART1_BASE),
798         .mapbase = OMAP_UART1_BASE,
799         .irq = INT_UART1,
800         .flags = UPF_BOOT_AUTOCONF,
801@@ -73,7 +72,6 @@ static struct plat_serial8250_port seria
802         .uartclk = OMAP16XX_BASE_BAUD * 16,
803     },
804     {
805- .membase = OMAP1_IO_ADDRESS(OMAP_UART2_BASE),
806         .mapbase = OMAP_UART2_BASE,
807         .irq = INT_UART2,
808         .flags = UPF_BOOT_AUTOCONF,
809@@ -82,7 +80,6 @@ static struct plat_serial8250_port seria
810         .uartclk = OMAP16XX_BASE_BAUD * 16,
811     },
812     {
813- .membase = OMAP1_IO_ADDRESS(OMAP_UART3_BASE),
814         .mapbase = OMAP_UART3_BASE,
815         .irq = INT_UART3,
816         .flags = UPF_BOOT_AUTOCONF,
817@@ -90,7 +87,6 @@ static struct plat_serial8250_port seria
818         .regshift = 2,
819         .uartclk = OMAP16XX_BASE_BAUD * 16,
820     },
821- { },
822 };
823 
824 static struct platform_device serial_device = {
825@@ -110,18 +106,11 @@ void __init omap_serial_init(void)
826 {
827     int i;
828 
829- if (cpu_is_omap730()) {
830+ if (cpu_is_omap7xx()) {
831         serial_platform_data[0].regshift = 0;
832         serial_platform_data[1].regshift = 0;
833- serial_platform_data[0].irq = INT_730_UART_MODEM_1;
834- serial_platform_data[1].irq = INT_730_UART_MODEM_IRDA_2;
835- }
836-
837- if (cpu_is_omap850()) {
838- serial_platform_data[0].regshift = 0;
839- serial_platform_data[1].regshift = 0;
840- serial_platform_data[0].irq = INT_850_UART_MODEM_1;
841- serial_platform_data[1].irq = INT_850_UART_MODEM_IRDA_2;
842+ serial_platform_data[0].irq = INT_7XX_UART_MODEM_1;
843+ serial_platform_data[1].irq = INT_7XX_UART_MODEM_IRDA_2;
844     }
845 
846     if (cpu_is_omap15xx()) {
847--- a/arch/arm/mach-omap1/sleep.S
848+++ b/arch/arm/mach-omap1/sleep.S
849@@ -1,7 +1,7 @@
850 /*
851  * linux/arch/arm/mach-omap1/sleep.S
852  *
853- * Low-level OMAP730/1510/1610 sleep/wakeUp support
854+ * Low-level OMAP7XX/1510/1610 sleep/wakeUp support
855  *
856  * Initial SA1110 code:
857  * Copyright (c) 2001 Cliff Brake <cbrake@accelent.com>
858@@ -57,8 +57,8 @@
859  *
860  */
861 
862-#if defined(CONFIG_ARCH_OMAP730)
863-ENTRY(omap730_cpu_suspend)
864+#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
865+ENTRY(omap7xx_cpu_suspend)
866 
867     @ save registers on stack
868     stmfd sp!, {r0 - r12, lr}
869@@ -91,13 +91,13 @@ ENTRY(omap730_cpu_suspend)
870 
871     @ turn off clock domains
872     @ do not disable PERCK (0x04)
873- mov r5, #OMAP730_IDLECT2_SLEEP_VAL & 0xff
874- orr r5, r5, #OMAP730_IDLECT2_SLEEP_VAL & 0xff00
875+ mov r5, #OMAP7XX_IDLECT2_SLEEP_VAL & 0xff
876+ orr r5, r5, #OMAP7XX_IDLECT2_SLEEP_VAL & 0xff00
877     strh r5, [r4, #ARM_IDLECT2_ASM_OFFSET & 0xff]
878 
879     @ request ARM idle
880- mov r3, #OMAP730_IDLECT1_SLEEP_VAL & 0xff
881- orr r3, r3, #OMAP730_IDLECT1_SLEEP_VAL & 0xff00
882+ mov r3, #OMAP7XX_IDLECT1_SLEEP_VAL & 0xff
883+ orr r3, r3, #OMAP7XX_IDLECT1_SLEEP_VAL & 0xff00
884     strh r3, [r4, #ARM_IDLECT1_ASM_OFFSET & 0xff]
885 
886     @ disable instruction cache
887@@ -113,7 +113,7 @@ ENTRY(omap730_cpu_suspend)
888     mov r2, #0
889     mcr p15, 0, r2, c7, c0, 4 @ wait for interrupt
890 /*
891- * omap730_cpu_suspend()'s resume point.
892+ * omap7xx_cpu_suspend()'s resume point.
893  *
894  * It will just start executing here, so we'll restore stuff from the
895  * stack.
896@@ -132,9 +132,9 @@ ENTRY(omap730_cpu_suspend)
897     @ restore regs and return
898     ldmfd sp!, {r0 - r12, pc}
899 
900-ENTRY(omap730_cpu_suspend_sz)
901- .word . - omap730_cpu_suspend
902-#endif /* CONFIG_ARCH_OMAP730 */
903+ENTRY(omap7xx_cpu_suspend_sz)
904+ .word . - omap7xx_cpu_suspend
905+#endif /* CONFIG_ARCH_OMAP730 || CONFIG_ARCH_OMAP850 */
906 
907 #ifdef CONFIG_ARCH_OMAP15XX
908 ENTRY(omap1510_cpu_suspend)
909--- a/arch/arm/mach-omap2/Makefile
910+++ b/arch/arm/mach-omap2/Makefile
911@@ -80,6 +80,7 @@ obj-$(CONFIG_MACH_OMAP_4430SDP) += boar
912 # Platform specific device init code
913 obj-y += usb-musb.o
914 obj-$(CONFIG_MACH_OMAP2_TUSB6010) += usb-tusb6010.o
915+obj-y += usb-ehci.o
916 
917 onenand-$(CONFIG_MTD_ONENAND_OMAP2) := gpmc-onenand.o
918 obj-y += $(onenand-m) $(onenand-y)
919--- a/arch/arm/mach-omap2/board-2430sdp.c
920+++ b/arch/arm/mach-omap2/board-2430sdp.c
921@@ -221,7 +221,7 @@ static void __init omap_2430sdp_map_io(v
922 MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board")
923     /* Maintainer: Syed Khasim - Texas Instruments Inc */
924     .phys_io = 0x48000000,
925- .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
926+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
927     .boot_params = 0x80000100,
928     .map_io = omap_2430sdp_map_io,
929     .init_irq = omap_2430sdp_init_irq,
930--- a/arch/arm/mach-omap2/board-3430sdp.c
931+++ b/arch/arm/mach-omap2/board-3430sdp.c
932@@ -618,6 +618,18 @@ static void enable_board_wakeup_source(v
933     omap_cfg_reg(AF26_34XX_SYS_NIRQ); /* T2 interrupt line (keypad) */
934 }
935 
936+static struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
937+
938+ .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
939+ .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
940+ .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
941+
942+ .phy_reset = true,
943+ .reset_gpio_port[0] = 57,
944+ .reset_gpio_port[1] = 61,
945+ .reset_gpio_port[2] = -EINVAL
946+};
947+
948 static void __init omap_3430sdp_init(void)
949 {
950     omap3430_i2c_init();
951@@ -635,6 +647,7 @@ static void __init omap_3430sdp_init(voi
952     board_smc91x_init();
953     sdp3430_display_init();
954     enable_board_wakeup_source();
955+ usb_ehci_init(&ehci_pdata);
956 }
957 
958 static void __init omap_3430sdp_map_io(void)
959@@ -646,7 +659,7 @@ static void __init omap_3430sdp_map_io(v
960 MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board")
961     /* Maintainer: Syed Khasim - Texas Instruments Inc */
962     .phys_io = 0x48000000,
963- .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
964+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
965     .boot_params = 0x80000100,
966     .map_io = omap_3430sdp_map_io,
967     .init_irq = omap_3430sdp_init_irq,
968--- a/arch/arm/mach-omap2/board-4430sdp.c
969+++ b/arch/arm/mach-omap2/board-4430sdp.c
970@@ -52,8 +52,17 @@ static struct omap_board_config_kernel s
971 
972 static void __init gic_init_irq(void)
973 {
974- gic_dist_init(0, OMAP2_IO_ADDRESS(OMAP44XX_GIC_DIST_BASE), 29);
975- gic_cpu_init(0, OMAP2_IO_ADDRESS(OMAP44XX_GIC_CPU_BASE));
976+ void __iomem *base;
977+
978+ /* Static mapping, never released */
979+ base = ioremap(OMAP44XX_GIC_DIST_BASE, SZ_4K);
980+ BUG_ON(!base);
981+ gic_dist_init(0, base, 29);
982+
983+ /* Static mapping, never released */
984+ base = ioremap(OMAP44XX_GIC_CPU_BASE, SZ_256);
985+ BUG_ON(!base);
986+ gic_cpu_init(0, OMAP44XX_GIC_CPU_BASE);
987 }
988 
989 static void __init omap_4430sdp_init_irq(void)
990@@ -84,7 +93,7 @@ static void __init omap_4430sdp_map_io(v
991 MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board")
992     /* Maintainer: Santosh Shilimkar - Texas Instruments Inc */
993     .phys_io = 0x48000000,
994- .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
995+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
996     .boot_params = 0x80000100,
997     .map_io = omap_4430sdp_map_io,
998     .init_irq = omap_4430sdp_init_irq,
999--- a/arch/arm/mach-omap2/board-apollon.c
1000+++ b/arch/arm/mach-omap2/board-apollon.c
1001@@ -333,7 +333,7 @@ static void __init omap_apollon_map_io(v
1002 MACHINE_START(OMAP_APOLLON, "OMAP24xx Apollon")
1003     /* Maintainer: Kyungmin Park <kyungmin.park@samsung.com> */
1004     .phys_io = 0x48000000,
1005- .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
1006+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
1007     .boot_params = 0x80000100,
1008     .map_io = omap_apollon_map_io,
1009     .init_irq = omap_apollon_init_irq,
1010--- a/arch/arm/mach-omap2/board-generic.c
1011+++ b/arch/arm/mach-omap2/board-generic.c
1012@@ -56,7 +56,7 @@ static void __init omap_generic_map_io(v
1013 MACHINE_START(OMAP_GENERIC, "Generic OMAP24xx")
1014     /* Maintainer: Paul Mundt <paul.mundt@nokia.com> */
1015     .phys_io = 0x48000000,
1016- .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
1017+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
1018     .boot_params = 0x80000100,
1019     .map_io = omap_generic_map_io,
1020     .init_irq = omap_generic_init_irq,
1021--- a/arch/arm/mach-omap2/board-h4.c
1022+++ b/arch/arm/mach-omap2/board-h4.c
1023@@ -376,7 +376,7 @@ static void __init omap_h4_map_io(void)
1024 MACHINE_START(OMAP_H4, "OMAP2420 H4 board")
1025     /* Maintainer: Paul Mundt <paul.mundt@nokia.com> */
1026     .phys_io = 0x48000000,
1027- .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
1028+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
1029     .boot_params = 0x80000100,
1030     .map_io = omap_h4_map_io,
1031     .init_irq = omap_h4_init_irq,
1032--- a/arch/arm/mach-omap2/board-ldp.c
1033+++ b/arch/arm/mach-omap2/board-ldp.c
1034@@ -399,7 +399,7 @@ static void __init omap_ldp_map_io(void)
1035 
1036 MACHINE_START(OMAP_LDP, "OMAP LDP board")
1037     .phys_io = 0x48000000,
1038- .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
1039+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
1040     .boot_params = 0x80000100,
1041     .map_io = omap_ldp_map_io,
1042     .init_irq = omap_ldp_init_irq,
1043--- a/arch/arm/mach-omap2/board-n8x0.c
1044+++ b/arch/arm/mach-omap2/board-n8x0.c
1045@@ -121,7 +121,7 @@ static void __init n8x0_init_machine(voi
1046 
1047 MACHINE_START(NOKIA_N800, "Nokia N800")
1048     .phys_io = 0x48000000,
1049- .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
1050+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
1051     .boot_params = 0x80000100,
1052     .map_io = n8x0_map_io,
1053     .init_irq = n8x0_init_irq,
1054@@ -131,7 +131,7 @@ MACHINE_END
1055 
1056 MACHINE_START(NOKIA_N810, "Nokia N810")
1057     .phys_io = 0x48000000,
1058- .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
1059+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
1060     .boot_params = 0x80000100,
1061     .map_io = n8x0_map_io,
1062     .init_irq = n8x0_init_irq,
1063@@ -141,7 +141,7 @@ MACHINE_END
1064 
1065 MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX")
1066     .phys_io = 0x48000000,
1067- .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
1068+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
1069     .boot_params = 0x80000100,
1070     .map_io = n8x0_map_io,
1071     .init_irq = n8x0_init_irq,
1072--- a/arch/arm/mach-omap2/board-omap3beagle.c
1073+++ b/arch/arm/mach-omap2/board-omap3beagle.c
1074@@ -400,6 +400,18 @@ static void __init omap3beagle_flash_ini
1075     }
1076 }
1077 
1078+static struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
1079+
1080+ .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
1081+ .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
1082+ .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
1083+
1084+ .phy_reset = true,
1085+ .reset_gpio_port[0] = -EINVAL,
1086+ .reset_gpio_port[1] = 147,
1087+ .reset_gpio_port[2] = -EINVAL
1088+};
1089+
1090 static void __init omap3_beagle_init(void)
1091 {
1092     omap3_beagle_i2c_init();
1093@@ -413,6 +425,7 @@ static void __init omap3_beagle_init(voi
1094     gpio_direction_output(170, true);
1095 
1096     usb_musb_init();
1097+ usb_ehci_init(&ehci_pdata);
1098     omap3beagle_flash_init();
1099 
1100     /* Ensure SDRC pins are mux'd for self-refresh */
1101@@ -429,7 +442,7 @@ static void __init omap3_beagle_map_io(v
1102 MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board")
1103     /* Maintainer: Syed Mohammed Khasim - http://beagleboard.org */
1104     .phys_io = 0x48000000,
1105- .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
1106+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
1107     .boot_params = 0x80000100,
1108     .map_io = omap3_beagle_map_io,
1109     .init_irq = omap3_beagle_init_irq,
1110--- a/arch/arm/mach-omap2/board-omap3evm.c
1111+++ b/arch/arm/mach-omap2/board-omap3evm.c
1112@@ -297,6 +297,18 @@ static struct platform_device *omap3_evm
1113     &omap3evm_smc911x_device,
1114 };
1115 
1116+static struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
1117+
1118+ .port_mode[0] = EHCI_HCD_OMAP_MODE_UNKNOWN,
1119+ .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
1120+ .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
1121+
1122+ .phy_reset = true,
1123+ .reset_gpio_port[0] = -EINVAL,
1124+ .reset_gpio_port[1] = 135,
1125+ .reset_gpio_port[2] = -EINVAL
1126+};
1127+
1128 static void __init omap3_evm_init(void)
1129 {
1130     omap3_evm_i2c_init();
1131@@ -312,6 +324,9 @@ static void __init omap3_evm_init(void)
1132     usb_nop_xceiv_register();
1133 #endif
1134     usb_musb_init();
1135+ /* Setup EHCI phy reset padconfig */
1136+ omap_cfg_reg(AF4_34XX_GPIO135_OUT);
1137+ usb_ehci_init(&ehci_pdata);
1138     ads7846_dev_init();
1139 }
1140 
1141@@ -324,7 +339,7 @@ static void __init omap3_evm_map_io(void
1142 MACHINE_START(OMAP3EVM, "OMAP3 EVM")
1143     /* Maintainer: Syed Mohammed Khasim - Texas Instruments */
1144     .phys_io = 0x48000000,
1145- .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
1146+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
1147     .boot_params = 0x80000100,
1148     .map_io = omap3_evm_map_io,
1149     .init_irq = omap3_evm_init_irq,
1150--- a/arch/arm/mach-omap2/board-omap3pandora.c
1151+++ b/arch/arm/mach-omap2/board-omap3pandora.c
1152@@ -387,6 +387,18 @@ static struct platform_device *omap3pand
1153     &pandora_keys_gpio,
1154 };
1155 
1156+static struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
1157+
1158+ .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
1159+ .port_mode[1] = EHCI_HCD_OMAP_MODE_UNKNOWN,
1160+ .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
1161+
1162+ .phy_reset = true,
1163+ .reset_gpio_port[0] = 16,
1164+ .reset_gpio_port[1] = -EINVAL,
1165+ .reset_gpio_port[2] = -EINVAL
1166+};
1167+
1168 static void __init omap3pandora_init(void)
1169 {
1170     omap3pandora_i2c_init();
1171@@ -396,6 +408,7 @@ static void __init omap3pandora_init(voi
1172     spi_register_board_info(omap3pandora_spi_board_info,
1173             ARRAY_SIZE(omap3pandora_spi_board_info));
1174     omap3pandora_ads7846_init();
1175+ usb_ehci_init(&ehci_pdata);
1176     pandora_keys_gpio_init();
1177     usb_musb_init();
1178 
1179@@ -412,7 +425,7 @@ static void __init omap3pandora_map_io(v
1180 
1181 MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console")
1182     .phys_io = 0x48000000,
1183- .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
1184+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
1185     .boot_params = 0x80000100,
1186     .map_io = omap3pandora_map_io,
1187     .init_irq = omap3pandora_init_irq,
1188--- a/arch/arm/mach-omap2/board-overo.c
1189+++ b/arch/arm/mach-omap2/board-overo.c
1190@@ -384,6 +384,18 @@ static struct platform_device *overo_dev
1191     &overo_lcd_device,
1192 };
1193 
1194+static struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
1195+ .port_mode[0] = EHCI_HCD_OMAP_MODE_UNKNOWN,
1196+ .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
1197+ .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
1198+
1199+ .phy_reset = true,
1200+ .reset_gpio_port[0] = -EINVAL,
1201+ .reset_gpio_port[1] = OVERO_GPIO_USBH_NRESET,
1202+ .reset_gpio_port[2] = -EINVAL
1203+};
1204+
1205+
1206 static void __init overo_init(void)
1207 {
1208     overo_i2c_init();
1209@@ -391,6 +403,7 @@ static void __init overo_init(void)
1210     omap_serial_init();
1211     overo_flash_init();
1212     usb_musb_init();
1213+ usb_ehci_init(&ehci_pdata);
1214     overo_ads7846_init();
1215     overo_init_smsc911x();
1216 
1217@@ -433,14 +446,6 @@ static void __init overo_init(void)
1218     else
1219         printk(KERN_ERR "could not obtain gpio for "
1220                     "OVERO_GPIO_USBH_CPEN\n");
1221-
1222- if ((gpio_request(OVERO_GPIO_USBH_NRESET,
1223- "OVERO_GPIO_USBH_NRESET") == 0) &&
1224- (gpio_direction_output(OVERO_GPIO_USBH_NRESET, 1) == 0))
1225- gpio_export(OVERO_GPIO_USBH_NRESET, 0);
1226- else
1227- printk(KERN_ERR "could not obtain gpio for "
1228- "OVERO_GPIO_USBH_NRESET\n");
1229 }
1230 
1231 static void __init overo_map_io(void)
1232@@ -451,7 +456,7 @@ static void __init overo_map_io(void)
1233 
1234 MACHINE_START(OVERO, "Gumstix Overo")
1235     .phys_io = 0x48000000,
1236- .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
1237+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
1238     .boot_params = 0x80000100,
1239     .map_io = overo_map_io,
1240     .init_irq = overo_init_irq,
1241--- a/arch/arm/mach-omap2/board-rx51.c
1242+++ b/arch/arm/mach-omap2/board-rx51.c
1243@@ -84,7 +84,7 @@ static void __init rx51_map_io(void)
1244 MACHINE_START(NOKIA_RX51, "Nokia RX-51 board")
1245     /* Maintainer: Lauri Leukkunen <lauri.leukkunen@nokia.com> */
1246     .phys_io = 0x48000000,
1247- .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
1248+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
1249     .boot_params = 0x80000100,
1250     .map_io = rx51_map_io,
1251     .init_irq = rx51_init_irq,
1252--- a/arch/arm/mach-omap2/board-zoom2.c
1253+++ b/arch/arm/mach-omap2/board-zoom2.c
1254@@ -282,7 +282,7 @@ static void __init omap_zoom2_map_io(voi
1255 
1256 MACHINE_START(OMAP_ZOOM2, "OMAP Zoom2 board")
1257     .phys_io = 0x48000000,
1258- .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
1259+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
1260     .boot_params = 0x80000100,
1261     .map_io = omap_zoom2_map_io,
1262     .init_irq = omap_zoom2_init_irq,
1263--- a/arch/arm/mach-omap2/cm.h
1264+++ b/arch/arm/mach-omap2/cm.h
1265@@ -17,11 +17,11 @@
1266 #include "prcm-common.h"
1267 
1268 #define OMAP2420_CM_REGADDR(module, reg) \
1269- OMAP2_IO_ADDRESS(OMAP2420_CM_BASE + (module) + (reg))
1270+ OMAP2_L4_IO_ADDRESS(OMAP2420_CM_BASE + (module) + (reg))
1271 #define OMAP2430_CM_REGADDR(module, reg) \
1272- OMAP2_IO_ADDRESS(OMAP2430_CM_BASE + (module) + (reg))
1273+ OMAP2_L4_IO_ADDRESS(OMAP2430_CM_BASE + (module) + (reg))
1274 #define OMAP34XX_CM_REGADDR(module, reg) \
1275- OMAP2_IO_ADDRESS(OMAP3430_CM_BASE + (module) + (reg))
1276+ OMAP2_L4_IO_ADDRESS(OMAP3430_CM_BASE + (module) + (reg))
1277 
1278 /*
1279  * Architecture-specific global CM registers
1280--- a/arch/arm/mach-omap2/id.c
1281+++ b/arch/arm/mach-omap2/id.c
1282@@ -28,6 +28,7 @@
1283 static struct omap_chip_id omap_chip;
1284 static unsigned int omap_revision;
1285 
1286+u32 omap3_features;
1287 
1288 unsigned int omap_rev(void)
1289 {
1290@@ -155,12 +156,37 @@ void __init omap24xx_check_revision(void
1291     pr_info("\n");
1292 }
1293 
1294-void __init omap34xx_check_revision(void)
1295+#define OMAP3_CHECK_FEATURE(status,feat) \
1296+ if (((status & OMAP3_ ##feat## _MASK) \
1297+ >> OMAP3_ ##feat## _SHIFT) != FEAT_ ##feat## _NONE) { \
1298+ omap3_features |= OMAP3_HAS_ ##feat; \
1299+ }
1300+
1301+void __init omap3_check_features(void)
1302+{
1303+ u32 status;
1304+
1305+ omap3_features = 0;
1306+
1307+ status = omap_ctrl_readl(OMAP3_CONTROL_OMAP_STATUS);
1308+
1309+ OMAP3_CHECK_FEATURE(status, L2CACHE);
1310+ OMAP3_CHECK_FEATURE(status, IVA);
1311+ OMAP3_CHECK_FEATURE(status, SGX);
1312+ OMAP3_CHECK_FEATURE(status, NEON);
1313+ OMAP3_CHECK_FEATURE(status, ISP);
1314+
1315+ /*
1316+ * TODO: Get additional info (where applicable)
1317+ * e.g. Size of L2 cache.
1318+ */
1319+}
1320+
1321+void __init omap3_check_revision(void)
1322 {
1323     u32 cpuid, idcode;
1324     u16 hawkeye;
1325     u8 rev;
1326- char *rev_name = "ES1.0";
1327 
1328     /*
1329      * We cannot access revision registers on ES1.0.
1330@@ -170,7 +196,7 @@ void __init omap34xx_check_revision(void
1331     cpuid = read_cpuid(CPUID_ID);
1332     if ((((cpuid >> 4) & 0xfff) == 0xc08) && ((cpuid & 0xf) == 0x0)) {
1333         omap_revision = OMAP3430_REV_ES1_0;
1334- goto out;
1335+ return;
1336     }
1337 
1338     /*
1339@@ -183,33 +209,111 @@ void __init omap34xx_check_revision(void
1340     hawkeye = (idcode >> 12) & 0xffff;
1341     rev = (idcode >> 28) & 0xff;
1342 
1343- if (hawkeye == 0xb7ae) {
1344+ switch (hawkeye) {
1345+ case 0xb7ae:
1346+ /* Handle 34xx/35xx devices */
1347         switch (rev) {
1348- case 0:
1349+ case 0: /* Take care of early samples */
1350+ case 1:
1351             omap_revision = OMAP3430_REV_ES2_0;
1352- rev_name = "ES2.0";
1353             break;
1354         case 2:
1355             omap_revision = OMAP3430_REV_ES2_1;
1356- rev_name = "ES2.1";
1357             break;
1358         case 3:
1359             omap_revision = OMAP3430_REV_ES3_0;
1360- rev_name = "ES3.0";
1361             break;
1362         case 4:
1363             omap_revision = OMAP3430_REV_ES3_1;
1364- rev_name = "ES3.1";
1365             break;
1366         default:
1367             /* Use the latest known revision as default */
1368             omap_revision = OMAP3430_REV_ES3_1;
1369- rev_name = "Unknown revision\n";
1370         }
1371+ break;
1372+ case 0xb891:
1373+ /* Handle 36xx devices */
1374+ switch (rev) {
1375+ case 0:
1376+ omap_revision = OMAP3630_REV_ES1_0;
1377+ break;
1378+ default:
1379+ /* Use the latest known revision as default */
1380+ omap_revision = OMAP3630_REV_ES1_0;
1381+ }
1382+ break;
1383+ default:
1384+ /* Unknown default to latest silicon rev as default*/
1385+ omap_revision = OMAP3630_REV_ES1_0;
1386     }
1387+}
1388 
1389-out:
1390- pr_info("OMAP%04x %s\n", omap_rev() >> 16, rev_name);
1391+#define OMAP3_SHOW_FEATURE(feat) \
1392+ if (omap3_has_ ##feat()) { \
1393+ pr_info (" - "#feat" : Y"); \
1394+ } else { \
1395+ pr_info (" - "#feat" : N"); \
1396+ }
1397+
1398+void __init omap3_cpuinfo(void)
1399+{
1400+ u8 rev = GET_OMAP_REVISION();
1401+ char cpu_name[16], cpu_rev[16];
1402+
1403+ /* OMAP3430 and OMAP3530 are assumed to be same.
1404+ *
1405+ * OMAP3525, OMAP3515 and OMAP3503 can be detected only based
1406+ * on available features. Upon detection, update the CPU id
1407+ * and CPU class bits.
1408+ */
1409+ if (cpu_is_omap3630())
1410+ strcpy(cpu_name, "3630");
1411+ else if (omap3_has_iva() && omap3_has_sgx())
1412+ strcpy(cpu_name, "3430/3530");
1413+ else if (omap3_has_sgx()) {
1414+ omap_revision = OMAP3525_REV(rev);
1415+ strcpy(cpu_name, "3525");
1416+ }
1417+ else if (omap3_has_iva()) {
1418+ omap_revision = OMAP3515_REV(rev);
1419+ strcpy(cpu_name, "3515");
1420+ }
1421+ else {
1422+ omap_revision = OMAP3503_REV(rev);
1423+ strcpy(cpu_name, "3503");
1424+ }
1425+
1426+ switch (rev) {
1427+ case OMAP_REVBITS_00:
1428+ strcpy(cpu_rev, "1.0");
1429+ break;
1430+ case OMAP_REVBITS_10:
1431+ strcpy(cpu_rev, "2.0");
1432+ break;
1433+ case OMAP_REVBITS_20:
1434+ strcpy(cpu_rev, "2.1");
1435+ break;
1436+ case OMAP_REVBITS_30:
1437+ strcpy(cpu_rev, "3.0");
1438+ break;
1439+ case OMAP_REVBITS_40:
1440+ strcpy(cpu_rev, "3.1");
1441+ break;
1442+ default:
1443+ /* Use the latest known revision as default */
1444+ strcpy(cpu_rev, "3.1");
1445+ }
1446+
1447+ /*
1448+ * Print verbose information
1449+ */
1450+ pr_info("OMAP%s ES%s\n", cpu_name, cpu_rev);
1451+
1452+ OMAP3_SHOW_FEATURE(l2cache);
1453+ OMAP3_SHOW_FEATURE(iva);
1454+ OMAP3_SHOW_FEATURE(sgx);
1455+ OMAP3_SHOW_FEATURE(neon);
1456+ OMAP3_SHOW_FEATURE(isp);
1457 }
1458 
1459 /*
1460@@ -223,8 +327,11 @@ void __init omap2_check_revision(void)
1461      */
1462     if (cpu_is_omap24xx())
1463         omap24xx_check_revision();
1464- else if (cpu_is_omap34xx())
1465- omap34xx_check_revision();
1466+ else if (cpu_is_omap34xx()) {
1467+ omap3_check_features();
1468+ omap3_check_revision();
1469+ omap3_cpuinfo();
1470+ }
1471     else if (cpu_is_omap44xx()) {
1472         printk(KERN_INFO "FIXME: CPU revision = OMAP4430\n");
1473         return;
1474--- a/arch/arm/mach-omap2/io.c
1475+++ b/arch/arm/mach-omap2/io.c
1476@@ -204,6 +204,24 @@ static struct map_desc omap44xx_io_desc[
1477         .type = MT_DEVICE,
1478     },
1479     {
1480+ .virtual = OMAP44XX_EMIF1_VIRT,
1481+ .pfn = __phys_to_pfn(OMAP44XX_EMIF1_PHYS),
1482+ .length = OMAP44XX_EMIF1_SIZE,
1483+ .type = MT_DEVICE,
1484+ },
1485+ {
1486+ .virtual = OMAP44XX_EMIF2_VIRT,
1487+ .pfn = __phys_to_pfn(OMAP44XX_EMIF2_PHYS),
1488+ .length = OMAP44XX_EMIF2_SIZE,
1489+ .type = MT_DEVICE,
1490+ },
1491+ {
1492+ .virtual = OMAP44XX_DMM_VIRT,
1493+ .pfn = __phys_to_pfn(OMAP44XX_DMM_PHYS),
1494+ .length = OMAP44XX_DMM_SIZE,
1495+ .type = MT_DEVICE,
1496+ },
1497+ {
1498         .virtual = L4_PER_44XX_VIRT,
1499         .pfn = __phys_to_pfn(L4_PER_44XX_PHYS),
1500         .length = L4_PER_44XX_SIZE,
1501--- a/arch/arm/mach-omap2/irq.c
1502+++ b/arch/arm/mach-omap2/irq.c
1503@@ -178,12 +178,20 @@ void __init omap_init_irq(void)
1504     int i;
1505 
1506     for (i = 0; i < ARRAY_SIZE(irq_banks); i++) {
1507+ unsigned long base;
1508         struct omap_irq_bank *bank = irq_banks + i;
1509 
1510         if (cpu_is_omap24xx())
1511- bank->base_reg = OMAP2_IO_ADDRESS(OMAP24XX_IC_BASE);
1512+ base = OMAP24XX_IC_BASE;
1513         else if (cpu_is_omap34xx())
1514- bank->base_reg = OMAP2_IO_ADDRESS(OMAP34XX_IC_BASE);
1515+ base = OMAP34XX_IC_BASE;
1516+
1517+ /* Static mapping, never released */
1518+ bank->base_reg = ioremap(base, SZ_4K);
1519+ if (!bank->base_reg) {
1520+ printk(KERN_ERR "Could not ioremap irq bank%i\n", i);
1521+ continue;
1522+ }
1523 
1524         omap_irq_bank_init_one(bank);
1525 
1526--- a/arch/arm/mach-omap2/omap-smp.c
1527+++ b/arch/arm/mach-omap2/omap-smp.c
1528@@ -26,11 +26,11 @@
1529 #include <mach/hardware.h>
1530 
1531 /* Registers used for communicating startup information */
1532-#define OMAP4_AUXCOREBOOT_REG0 (OMAP44XX_VA_WKUPGEN_BASE + 0x800)
1533-#define OMAP4_AUXCOREBOOT_REG1 (OMAP44XX_VA_WKUPGEN_BASE + 0x804)
1534+static void __iomem *omap4_auxcoreboot_reg0;
1535+static void __iomem *omap4_auxcoreboot_reg1;
1536 
1537 /* SCU base address */
1538-static void __iomem *scu_base = OMAP44XX_VA_SCU_BASE;
1539+static void __iomem *scu_base;
1540 
1541 /*
1542  * Use SCU config register to count number of cores
1543@@ -46,6 +46,8 @@ static DEFINE_SPINLOCK(boot_lock);
1544 
1545 void __cpuinit platform_secondary_init(unsigned int cpu)
1546 {
1547+ void __iomem *gic_cpu_base;
1548+
1549     trace_hardirqs_off();
1550 
1551     /*
1552@@ -54,7 +56,10 @@ void __cpuinit platform_secondary_init(u
1553      * for us: do so
1554      */
1555 
1556- gic_cpu_init(0, OMAP2_IO_ADDRESS(OMAP44XX_GIC_CPU_BASE));
1557+ /* Static mapping, never released */
1558+ gic_cpu_base = ioremap(OMAP44XX_GIC_CPU_BASE, SZ_256);
1559+ BUG_ON(!gic_cpu_base);
1560+ gic_cpu_init(0, gic_cpu_base);
1561 
1562     /*
1563      * Synchronise with the boot thread.
1564@@ -79,7 +84,7 @@ int __cpuinit boot_secondary(unsigned in
1565      * the AuxCoreBoot1 register is updated with cpu state
1566      * A barrier is added to ensure that write buffer is drained
1567      */
1568- __raw_writel(cpu, OMAP4_AUXCOREBOOT_REG1);
1569+ __raw_writel(cpu, omap4_auxcoreboot_reg1);
1570     smp_wmb();
1571 
1572     timeout = jiffies + (1 * HZ);
1573@@ -104,7 +109,7 @@ static void __init wakeup_secondary(void
1574      * A barrier is added to ensure that write buffer is drained
1575      */
1576     __raw_writel(virt_to_phys(omap_secondary_startup), \
1577- OMAP4_AUXCOREBOOT_REG0);
1578+ omap4_auxcoreboot_reg0);
1579     smp_wmb();
1580 
1581     /*
1582@@ -130,6 +135,7 @@ void __init smp_prepare_cpus(unsigned in
1583 {
1584     unsigned int ncores = get_core_count();
1585     unsigned int cpu = smp_processor_id();
1586+ void __iomem *omap4_wkupgen_base;
1587     int i;
1588 
1589     /* sanity check */
1590@@ -161,6 +167,16 @@ void __init smp_prepare_cpus(unsigned in
1591     for (i = 0; i < max_cpus; i++)
1592         set_cpu_present(i, true);
1593 
1594+ /* Never released */
1595+ omap4_wkupgen_base = ioremap(OMAP44XX_WKUPGEN_BASE, SZ_4K);
1596+ BUG_ON(!omap4_wkupgen_base);
1597+ omap4_auxcoreboot_reg0 = omap4_wkupgen_base + 0x800;
1598+ omap4_auxcoreboot_reg0 = omap4_wkupgen_base + 0x804;
1599+
1600+ /* Never released */
1601+ scu_base = ioremap(OMAP44XX_GIC_CPU_BASE, SZ_256);
1602+ BUG_ON(!scu_base);
1603+
1604     if (max_cpus > 1) {
1605         /*
1606          * Enable the local timer or broadcast device for the
1607--- a/arch/arm/mach-omap2/omap_hwmod.c
1608+++ b/arch/arm/mach-omap2/omap_hwmod.c
1609@@ -496,6 +496,7 @@ static void __iomem *_find_mpu_rt_base(s
1610     struct omap_hwmod_addr_space *mem;
1611     int i;
1612     int found = 0;
1613+ void __iomem *va_start;
1614 
1615     if (!oh || oh->slaves_cnt == 0)
1616         return NULL;
1617@@ -509,16 +510,20 @@ static void __iomem *_find_mpu_rt_base(s
1618         }
1619     }
1620 
1621- /* XXX use ioremap() instead? */
1622-
1623- if (found)
1624+ if (found) {
1625+ va_start = ioremap(mem->pa_start, mem->pa_end - mem->pa_start);
1626+ if (!va_start) {
1627+ pr_err("omap_hwmod: %s: Could not ioremap\n", oh->name);
1628+ return NULL;
1629+ }
1630         pr_debug("omap_hwmod: %s: MPU register target at va %p\n",
1631- oh->name, OMAP2_IO_ADDRESS(mem->pa_start));
1632- else
1633+ oh->name, va_start);
1634+ } else {
1635         pr_debug("omap_hwmod: %s: no MPU register target found\n",
1636              oh->name);
1637+ }
1638 
1639- return (found) ? OMAP2_IO_ADDRESS(mem->pa_start) : NULL;
1640+ return (found) ? va_start : NULL;
1641 }
1642 
1643 /**
1644@@ -1148,6 +1153,7 @@ int omap_hwmod_unregister(struct omap_hw
1645     pr_debug("omap_hwmod: %s: unregistering\n", oh->name);
1646 
1647     mutex_lock(&omap_hwmod_mutex);
1648+ iounmap(oh->_rt_va);
1649     list_del(&oh->node);
1650     mutex_unlock(&omap_hwmod_mutex);
1651 
1652--- a/arch/arm/mach-omap2/pm-debug.c
1653+++ b/arch/arm/mach-omap2/pm-debug.c
1654@@ -51,7 +51,8 @@ int omap2_pm_debug;
1655     regs[reg_count++].val = __raw_readl(reg)
1656 #define DUMP_INTC_REG(reg, off) \
1657     regs[reg_count].name = #reg; \
1658- regs[reg_count++].val = __raw_readl(OMAP2_IO_ADDRESS(0x480fe000 + (off)))
1659+ regs[reg_count++].val = \
1660+ __raw_readl(OMAP2_L4_IO_ADDRESS(0x480fe000 + (off)))
1661 
1662 static int __init pm_dbg_init(void);
1663 
1664--- a/arch/arm/mach-omap2/prm.h
1665+++ b/arch/arm/mach-omap2/prm.h
1666@@ -17,11 +17,11 @@
1667 #include "prcm-common.h"
1668 
1669 #define OMAP2420_PRM_REGADDR(module, reg) \
1670- OMAP2_IO_ADDRESS(OMAP2420_PRM_BASE + (module) + (reg))
1671+ OMAP2_L4_IO_ADDRESS(OMAP2420_PRM_BASE + (module) + (reg))
1672 #define OMAP2430_PRM_REGADDR(module, reg) \
1673- OMAP2_IO_ADDRESS(OMAP2430_PRM_BASE + (module) + (reg))
1674+ OMAP2_L4_IO_ADDRESS(OMAP2430_PRM_BASE + (module) + (reg))
1675 #define OMAP34XX_PRM_REGADDR(module, reg) \
1676- OMAP2_IO_ADDRESS(OMAP3430_PRM_BASE + (module) + (reg))
1677+ OMAP2_L4_IO_ADDRESS(OMAP3430_PRM_BASE + (module) + (reg))
1678 
1679 /*
1680  * Architecture-specific global PRM registers
1681--- a/arch/arm/mach-omap2/sdrc.h
1682+++ b/arch/arm/mach-omap2/sdrc.h
1683@@ -48,9 +48,12 @@ static inline u32 sms_read_reg(u16 reg)
1684     return __raw_readl(OMAP_SMS_REGADDR(reg));
1685 }
1686 #else
1687-#define OMAP242X_SDRC_REGADDR(reg) OMAP2_IO_ADDRESS(OMAP2420_SDRC_BASE + (reg))
1688-#define OMAP243X_SDRC_REGADDR(reg) OMAP2_IO_ADDRESS(OMAP243X_SDRC_BASE + (reg))
1689-#define OMAP34XX_SDRC_REGADDR(reg) OMAP2_IO_ADDRESS(OMAP343X_SDRC_BASE + (reg))
1690+#define OMAP242X_SDRC_REGADDR(reg) \
1691+ OMAP2_L3_IO_ADDRESS(OMAP2420_SDRC_BASE + (reg))
1692+#define OMAP243X_SDRC_REGADDR(reg) \
1693+ OMAP2_L3_IO_ADDRESS(OMAP243X_SDRC_BASE + (reg))
1694+#define OMAP34XX_SDRC_REGADDR(reg) \
1695+ OMAP2_L3_IO_ADDRESS(OMAP343X_SDRC_BASE + (reg))
1696 #endif /* __ASSEMBLER__ */
1697 
1698 #endif
1699--- a/arch/arm/mach-omap2/serial.c
1700+++ b/arch/arm/mach-omap2/serial.c
1701@@ -73,7 +73,6 @@ static LIST_HEAD(uart_list);
1702 
1703 static struct plat_serial8250_port serial_platform_data0[] = {
1704     {
1705- .membase = OMAP2_IO_ADDRESS(OMAP_UART1_BASE),
1706         .mapbase = OMAP_UART1_BASE,
1707         .irq = 72,
1708         .flags = UPF_BOOT_AUTOCONF,
1709@@ -87,7 +86,6 @@ static struct plat_serial8250_port seria
1710 
1711 static struct plat_serial8250_port serial_platform_data1[] = {
1712     {
1713- .membase = OMAP2_IO_ADDRESS(OMAP_UART2_BASE),
1714         .mapbase = OMAP_UART2_BASE,
1715         .irq = 73,
1716         .flags = UPF_BOOT_AUTOCONF,
1717@@ -101,7 +99,6 @@ static struct plat_serial8250_port seria
1718 
1719 static struct plat_serial8250_port serial_platform_data2[] = {
1720     {
1721- .membase = OMAP2_IO_ADDRESS(OMAP_UART3_BASE),
1722         .mapbase = OMAP_UART3_BASE,
1723         .irq = 74,
1724         .flags = UPF_BOOT_AUTOCONF,
1725@@ -116,7 +113,6 @@ static struct plat_serial8250_port seria
1726 #ifdef CONFIG_ARCH_OMAP4
1727 static struct plat_serial8250_port serial_platform_data3[] = {
1728     {
1729- .membase = OMAP2_IO_ADDRESS(OMAP_UART4_BASE),
1730         .mapbase = OMAP_UART4_BASE,
1731         .irq = 70,
1732         .flags = UPF_BOOT_AUTOCONF,
1733@@ -539,7 +535,7 @@ static inline void omap_uart_idle_init(s
1734 #define DEV_CREATE_FILE(dev, attr)
1735 #endif /* CONFIG_PM */
1736 
1737-static struct omap_uart_state omap_uart[OMAP_MAX_NR_PORTS] = {
1738+static struct omap_uart_state omap_uart[] = {
1739     {
1740         .pdev = {
1741             .name = "serial8250",
1742@@ -589,12 +585,22 @@ void __init omap_serial_early_init(void)
1743      * if not needed.
1744      */
1745 
1746- for (i = 0; i < OMAP_MAX_NR_PORTS; i++) {
1747+ for (i = 0; i < ARRAY_SIZE(omap_uart); i++) {
1748         struct omap_uart_state *uart = &omap_uart[i];
1749         struct platform_device *pdev = &uart->pdev;
1750         struct device *dev = &pdev->dev;
1751         struct plat_serial8250_port *p = dev->platform_data;
1752 
1753+ /*
1754+ * Module 4KB + L4 interconnect 4KB
1755+ * Static mapping, never released
1756+ */
1757+ p->membase = ioremap(p->mapbase, SZ_8K);
1758+ if (!p->membase) {
1759+ printk(KERN_ERR "ioremap failed for uart%i\n", i + 1);
1760+ continue;
1761+ }
1762+
1763         sprintf(name, "uart%d_ick", i+1);
1764         uart->ick = clk_get(NULL, name);
1765         if (IS_ERR(uart->ick)) {
1766@@ -631,7 +637,7 @@ void __init omap_serial_init(void)
1767 {
1768     int i;
1769 
1770- for (i = 0; i < OMAP_MAX_NR_PORTS; i++) {
1771+ for (i = 0; i < ARRAY_SIZE(omap_uart); i++) {
1772         struct omap_uart_state *uart = &omap_uart[i];
1773         struct platform_device *pdev = &uart->pdev;
1774         struct device *dev = &pdev->dev;
1775--- a/arch/arm/mach-omap2/sram242x.S
1776+++ b/arch/arm/mach-omap2/sram242x.S
1777@@ -128,7 +128,7 @@ omap242x_sdi_prcm_voltctrl:
1778 prcm_mask_val:
1779     .word 0xFFFF3FFC
1780 omap242x_sdi_timer_32ksynct_cr:
1781- .word OMAP2_IO_ADDRESS(OMAP2420_32KSYNCT_BASE + 0x010)
1782+ .word OMAP2_L4_IO_ADDRESS(OMAP2420_32KSYNCT_BASE + 0x010)
1783 ENTRY(omap242x_sram_ddr_init_sz)
1784     .word . - omap242x_sram_ddr_init
1785 
1786@@ -224,7 +224,7 @@ omap242x_srs_prcm_voltctrl:
1787 ddr_prcm_mask_val:
1788     .word 0xFFFF3FFC
1789 omap242x_srs_timer_32ksynct:
1790- .word OMAP2_IO_ADDRESS(OMAP2420_32KSYNCT_BASE + 0x010)
1791+ .word OMAP2_L4_IO_ADDRESS(OMAP2420_32KSYNCT_BASE + 0x010)
1792 
1793 ENTRY(omap242x_sram_reprogram_sdrc_sz)
1794     .word . - omap242x_sram_reprogram_sdrc
1795--- a/arch/arm/mach-omap2/sram243x.S
1796+++ b/arch/arm/mach-omap2/sram243x.S
1797@@ -128,7 +128,7 @@ omap243x_sdi_prcm_voltctrl:
1798 prcm_mask_val:
1799     .word 0xFFFF3FFC
1800 omap243x_sdi_timer_32ksynct_cr:
1801- .word OMAP2_IO_ADDRESS(OMAP2430_32KSYNCT_BASE + 0x010)
1802+ .word OMAP2_L4_IO_ADDRESS(OMAP2430_32KSYNCT_BASE + 0x010)
1803 ENTRY(omap243x_sram_ddr_init_sz)
1804     .word . - omap243x_sram_ddr_init
1805 
1806@@ -224,7 +224,7 @@ omap243x_srs_prcm_voltctrl:
1807 ddr_prcm_mask_val:
1808     .word 0xFFFF3FFC
1809 omap243x_srs_timer_32ksynct:
1810- .word OMAP2_IO_ADDRESS(OMAP2430_32KSYNCT_BASE + 0x010)
1811+ .word OMAP2_L4_IO_ADDRESS(OMAP2430_32KSYNCT_BASE + 0x010)
1812 
1813 ENTRY(omap243x_sram_reprogram_sdrc_sz)
1814     .word . - omap243x_sram_reprogram_sdrc
1815--- a/arch/arm/mach-omap2/timer-gp.c
1816+++ b/arch/arm/mach-omap2/timer-gp.c
1817@@ -231,7 +231,8 @@ static void __init omap2_gp_clocksource_
1818 static void __init omap2_gp_timer_init(void)
1819 {
1820 #ifdef CONFIG_LOCAL_TIMERS
1821- twd_base = OMAP2_IO_ADDRESS(OMAP44XX_LOCAL_TWD_BASE);
1822+ twd_base = ioremap(OMAP44XX_LOCAL_TWD_BASE, SZ_256);
1823+ BUG_ON(!twd_base);
1824 #endif
1825     omap_dm_timer_init();
1826 
1827--- /dev/null
1828+++ b/arch/arm/mach-omap2/usb-ehci.c
1829@@ -0,0 +1,192 @@
1830+/*
1831+ * linux/arch/arm/mach-omap2/usb-ehci.c
1832+ *
1833+ * This file will contain the board specific details for the
1834+ * Synopsys EHCI host controller on OMAP3430
1835+ *
1836+ * Copyright (C) 2007 Texas Instruments
1837+ * Author: Vikram Pandita <vikram.pandita@ti.com>
1838+ *
1839+ * Generalization by:
1840+ * Felipe Balbi <felipe.balbi@nokia.com>
1841+ *
1842+ * This program is free software; you can redistribute it and/or modify
1843+ * it under the terms of the GNU General Public License version 2 as
1844+ * published by the Free Software Foundation.
1845+ */
1846+
1847+#include <linux/types.h>
1848+#include <linux/errno.h>
1849+#include <linux/delay.h>
1850+#include <linux/platform_device.h>
1851+#include <linux/clk.h>
1852+#include <asm/io.h>
1853+#include <mach/mux.h>
1854+
1855+#include <mach/hardware.h>
1856+#include <mach/irqs.h>
1857+#include <mach/usb.h>
1858+
1859+#if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_EHCI_HCD_MODULE)
1860+
1861+static struct resource ehci_resources[] = {
1862+ {
1863+ .start = OMAP34XX_EHCI_BASE,
1864+ .end = OMAP34XX_EHCI_BASE + SZ_1K - 1,
1865+ .flags = IORESOURCE_MEM,
1866+ },
1867+ {
1868+ .start = OMAP34XX_UHH_CONFIG_BASE,
1869+ .end = OMAP34XX_UHH_CONFIG_BASE + SZ_1K - 1,
1870+ .flags = IORESOURCE_MEM,
1871+ },
1872+ {
1873+ .start = OMAP34XX_USBTLL_BASE,
1874+ .end = OMAP34XX_USBTLL_BASE + SZ_4K - 1,
1875+ .flags = IORESOURCE_MEM,
1876+ },
1877+ { /* general IRQ */
1878+ .start = INT_34XX_EHCI_IRQ,
1879+ .flags = IORESOURCE_IRQ,
1880+ }
1881+};
1882+
1883+static u64 ehci_dmamask = ~(u32)0;
1884+static struct platform_device ehci_device = {
1885+ .name = "ehci-omap",
1886+ .id = 0,
1887+ .dev = {
1888+ .dma_mask = &ehci_dmamask,
1889+ .coherent_dma_mask = 0xffffffff,
1890+ .platform_data = NULL,
1891+ },
1892+ .num_resources = ARRAY_SIZE(ehci_resources),
1893+ .resource = ehci_resources,
1894+};
1895+
1896+/* MUX settings for EHCI pins */
1897+/*
1898+ * setup_ehci_io_mux - initialize IO pad mux for USBHOST
1899+ */
1900+static void setup_ehci_io_mux(enum ehci_hcd_omap_mode *port_mode)
1901+{
1902+ switch (port_mode[0]) {
1903+ case EHCI_HCD_OMAP_MODE_PHY:
1904+ omap_cfg_reg(Y9_3430_USB1HS_PHY_STP);
1905+ omap_cfg_reg(Y8_3430_USB1HS_PHY_CLK);
1906+ omap_cfg_reg(AA14_3430_USB1HS_PHY_DIR);
1907+ omap_cfg_reg(AA11_3430_USB1HS_PHY_NXT);
1908+ omap_cfg_reg(W13_3430_USB1HS_PHY_DATA0);
1909+ omap_cfg_reg(W12_3430_USB1HS_PHY_DATA1);
1910+ omap_cfg_reg(W11_3430_USB1HS_PHY_DATA2);
1911+ omap_cfg_reg(Y11_3430_USB1HS_PHY_DATA3);
1912+ omap_cfg_reg(W9_3430_USB1HS_PHY_DATA4);
1913+ omap_cfg_reg(Y12_3430_USB1HS_PHY_DATA5);
1914+ omap_cfg_reg(W8_3430_USB1HS_PHY_DATA6);
1915+ omap_cfg_reg(Y13_3430_USB1HS_PHY_DATA7);
1916+ break;
1917+ case EHCI_HCD_OMAP_MODE_TLL:
1918+ omap_cfg_reg(Y9_3430_USB1HS_TLL_STP);
1919+ omap_cfg_reg(Y8_3430_USB1HS_TLL_CLK);
1920+ omap_cfg_reg(AA14_3430_USB1HS_TLL_DIR);
1921+ omap_cfg_reg(AA11_3430_USB1HS_TLL_NXT);
1922+ omap_cfg_reg(W13_3430_USB1HS_TLL_DATA0);
1923+ omap_cfg_reg(W12_3430_USB1HS_TLL_DATA1);
1924+ omap_cfg_reg(W11_3430_USB1HS_TLL_DATA2);
1925+ omap_cfg_reg(Y11_3430_USB1HS_TLL_DATA3);
1926+ omap_cfg_reg(W9_3430_USB1HS_TLL_DATA4);
1927+ omap_cfg_reg(Y12_3430_USB1HS_TLL_DATA5);
1928+ omap_cfg_reg(W8_3430_USB1HS_TLL_DATA6);
1929+ omap_cfg_reg(Y13_3430_USB1HS_TLL_DATA7);
1930+ break;
1931+ case EHCI_HCD_OMAP_MODE_UNKNOWN:
1932+ /* FALLTHROUGH */
1933+ default:
1934+ break;
1935+ }
1936+
1937+ switch (port_mode[1]) {
1938+ case EHCI_HCD_OMAP_MODE_PHY:
1939+ omap_cfg_reg(AA10_3430_USB2HS_PHY_STP);
1940+ omap_cfg_reg(AA8_3430_USB2HS_PHY_CLK);
1941+ omap_cfg_reg(AA9_3430_USB2HS_PHY_DIR);
1942+ omap_cfg_reg(AB11_3430_USB2HS_PHY_NXT);
1943+ omap_cfg_reg(AB10_3430_USB2HS_PHY_DATA0);
1944+ omap_cfg_reg(AB9_3430_USB2HS_PHY_DATA1);
1945+ omap_cfg_reg(W3_3430_USB2HS_PHY_DATA2);
1946+ omap_cfg_reg(T4_3430_USB2HS_PHY_DATA3);
1947+ omap_cfg_reg(T3_3430_USB2HS_PHY_DATA4);
1948+ omap_cfg_reg(R3_3430_USB2HS_PHY_DATA5);
1949+ omap_cfg_reg(R4_3430_USB2HS_PHY_DATA6);
1950+ omap_cfg_reg(T2_3430_USB2HS_PHY_DATA7);
1951+ break;
1952+ case EHCI_HCD_OMAP_MODE_TLL:
1953+ omap_cfg_reg(AA10_3430_USB2HS_TLL_STP);
1954+ omap_cfg_reg(AA8_3430_USB2HS_TLL_CLK);
1955+ omap_cfg_reg(AA9_3430_USB2HS_TLL_DIR);
1956+ omap_cfg_reg(AB11_3430_USB2HS_TLL_NXT);
1957+ omap_cfg_reg(AB10_3430_USB2HS_TLL_DATA0);
1958+ omap_cfg_reg(AB9_3430_USB2HS_TLL_DATA1);
1959+ omap_cfg_reg(W3_3430_USB2HS_TLL_DATA2);
1960+ omap_cfg_reg(T4_3430_USB2HS_TLL_DATA3);
1961+ omap_cfg_reg(T3_3430_USB2HS_TLL_DATA4);
1962+ omap_cfg_reg(R3_3430_USB2HS_TLL_DATA5);
1963+ omap_cfg_reg(R4_3430_USB2HS_TLL_DATA6);
1964+ omap_cfg_reg(T2_3430_USB2HS_TLL_DATA7);
1965+ break;
1966+ case EHCI_HCD_OMAP_MODE_UNKNOWN:
1967+ /* FALLTHROUGH */
1968+ default:
1969+ break;
1970+ }
1971+
1972+ switch (port_mode[2]) {
1973+ case EHCI_HCD_OMAP_MODE_PHY:
1974+ printk(KERN_WARNING "Port3 can't be used in PHY mode\n");
1975+ break;
1976+ case EHCI_HCD_OMAP_MODE_TLL:
1977+ omap_cfg_reg(AB3_3430_USB3HS_TLL_STP);
1978+ omap_cfg_reg(AA6_3430_USB3HS_TLL_CLK);
1979+ omap_cfg_reg(AA3_3430_USB3HS_TLL_DIR);
1980+ omap_cfg_reg(Y3_3430_USB3HS_TLL_NXT);
1981+ omap_cfg_reg(AA5_3430_USB3HS_TLL_DATA0);
1982+ omap_cfg_reg(Y4_3430_USB3HS_TLL_DATA1);
1983+ omap_cfg_reg(Y5_3430_USB3HS_TLL_DATA2);
1984+ omap_cfg_reg(W5_3430_USB3HS_TLL_DATA3);
1985+ omap_cfg_reg(AB12_3430_USB3HS_TLL_DATA4);
1986+ omap_cfg_reg(AB13_3430_USB3HS_TLL_DATA5);
1987+ omap_cfg_reg(AA13_3430_USB3HS_TLL_DATA6);
1988+ omap_cfg_reg(AA12_3430_USB3HS_TLL_DATA7);
1989+ break;
1990+ case EHCI_HCD_OMAP_MODE_UNKNOWN:
1991+ /* FALLTHROUGH */
1992+ default:
1993+ break;
1994+ }
1995+
1996+ return;
1997+}
1998+
1999+void __init usb_ehci_init(struct ehci_hcd_omap_platform_data *pdata)
2000+{
2001+ platform_device_add_data(&ehci_device, pdata, sizeof(*pdata));
2002+
2003+ /* Setup Pin IO MUX for EHCI */
2004+ if (cpu_is_omap34xx())
2005+ setup_ehci_io_mux(pdata->port_mode);
2006+
2007+ if (platform_device_register(&ehci_device) < 0) {
2008+ printk(KERN_ERR "Unable to register HS-USB (EHCI) device\n");
2009+ return;
2010+ }
2011+}
2012+
2013+#else
2014+
2015+void __init usb_ehci_init(struct ehci_hcd_omap_platform_data *pdata)
2016+
2017+{
2018+}
2019+
2020+#endif /* CONFIG_USB_EHCI_HCD */
2021+
2022--- a/arch/arm/plat-omap/common.c
2023+++ b/arch/arm/plat-omap/common.c
2024@@ -224,12 +224,12 @@ static void __init __omap2_set_globals(s
2025 
2026 static struct omap_globals omap242x_globals = {
2027     .class = OMAP242X_CLASS,
2028- .tap = OMAP2_IO_ADDRESS(0x48014000),
2029- .sdrc = OMAP2_IO_ADDRESS(OMAP2420_SDRC_BASE),
2030- .sms = OMAP2_IO_ADDRESS(OMAP2420_SMS_BASE),
2031- .ctrl = OMAP2_IO_ADDRESS(OMAP2420_CTRL_BASE),
2032- .prm = OMAP2_IO_ADDRESS(OMAP2420_PRM_BASE),
2033- .cm = OMAP2_IO_ADDRESS(OMAP2420_CM_BASE),
2034+ .tap = OMAP2_L4_IO_ADDRESS(0x48014000),
2035+ .sdrc = OMAP2_L3_IO_ADDRESS(OMAP2420_SDRC_BASE),
2036+ .sms = OMAP2_L3_IO_ADDRESS(OMAP2420_SMS_BASE),
2037+ .ctrl = OMAP2_L4_IO_ADDRESS(OMAP2420_CTRL_BASE),
2038+ .prm = OMAP2_L4_IO_ADDRESS(OMAP2420_PRM_BASE),
2039+ .cm = OMAP2_L4_IO_ADDRESS(OMAP2420_CM_BASE),
2040 };
2041 
2042 void __init omap2_set_globals_242x(void)
2043@@ -242,12 +242,12 @@ void __init omap2_set_globals_242x(void)
2044 
2045 static struct omap_globals omap243x_globals = {
2046     .class = OMAP243X_CLASS,
2047- .tap = OMAP2_IO_ADDRESS(0x4900a000),
2048- .sdrc = OMAP2_IO_ADDRESS(OMAP243X_SDRC_BASE),
2049- .sms = OMAP2_IO_ADDRESS(OMAP243X_SMS_BASE),
2050- .ctrl = OMAP2_IO_ADDRESS(OMAP243X_CTRL_BASE),
2051- .prm = OMAP2_IO_ADDRESS(OMAP2430_PRM_BASE),
2052- .cm = OMAP2_IO_ADDRESS(OMAP2430_CM_BASE),
2053+ .tap = OMAP2_L4_IO_ADDRESS(0x4900a000),
2054+ .sdrc = OMAP2_L3_IO_ADDRESS(OMAP243X_SDRC_BASE),
2055+ .sms = OMAP2_L3_IO_ADDRESS(OMAP243X_SMS_BASE),
2056+ .ctrl = OMAP2_L4_IO_ADDRESS(OMAP243X_CTRL_BASE),
2057+ .prm = OMAP2_L4_IO_ADDRESS(OMAP2430_PRM_BASE),
2058+ .cm = OMAP2_L4_IO_ADDRESS(OMAP2430_CM_BASE),
2059 };
2060 
2061 void __init omap2_set_globals_243x(void)
2062@@ -260,12 +260,12 @@ void __init omap2_set_globals_243x(void)
2063 
2064 static struct omap_globals omap343x_globals = {
2065     .class = OMAP343X_CLASS,
2066- .tap = OMAP2_IO_ADDRESS(0x4830A000),
2067- .sdrc = OMAP2_IO_ADDRESS(OMAP343X_SDRC_BASE),
2068- .sms = OMAP2_IO_ADDRESS(OMAP343X_SMS_BASE),
2069- .ctrl = OMAP2_IO_ADDRESS(OMAP343X_CTRL_BASE),
2070- .prm = OMAP2_IO_ADDRESS(OMAP3430_PRM_BASE),
2071- .cm = OMAP2_IO_ADDRESS(OMAP3430_CM_BASE),
2072+ .tap = OMAP2_L4_IO_ADDRESS(0x4830A000),
2073+ .sdrc = OMAP2_L3_IO_ADDRESS(OMAP343X_SDRC_BASE),
2074+ .sms = OMAP2_L3_IO_ADDRESS(OMAP343X_SMS_BASE),
2075+ .ctrl = OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE),
2076+ .prm = OMAP2_L4_IO_ADDRESS(OMAP3430_PRM_BASE),
2077+ .cm = OMAP2_L4_IO_ADDRESS(OMAP3430_CM_BASE),
2078 };
2079 
2080 void __init omap2_set_globals_343x(void)
2081@@ -277,10 +277,10 @@ void __init omap2_set_globals_343x(void)
2082 #if defined(CONFIG_ARCH_OMAP4)
2083 static struct omap_globals omap4_globals = {
2084     .class = OMAP443X_CLASS,
2085- .tap = OMAP2_IO_ADDRESS(0x4830a000),
2086- .ctrl = OMAP2_IO_ADDRESS(OMAP443X_CTRL_BASE),
2087- .prm = OMAP2_IO_ADDRESS(OMAP4430_PRM_BASE),
2088- .cm = OMAP2_IO_ADDRESS(OMAP4430_CM_BASE),
2089+ .tap = OMAP2_L4_IO_ADDRESS(0x4830a000),
2090+ .ctrl = OMAP2_L4_IO_ADDRESS(OMAP443X_CTRL_BASE),
2091+ .prm = OMAP2_L4_IO_ADDRESS(OMAP4430_PRM_BASE),
2092+ .cm = OMAP2_L4_IO_ADDRESS(OMAP4430_CM_BASE),
2093 };
2094 
2095 void __init omap2_set_globals_443x(void)
2096--- a/arch/arm/plat-omap/devices.c
2097+++ b/arch/arm/plat-omap/devices.c
2098@@ -113,17 +113,17 @@ static void omap_init_kp(void)
2099         omap_cfg_reg(E19_1610_KBR4);
2100         omap_cfg_reg(N19_1610_KBR5);
2101     } else if (machine_is_omap_perseus2() || machine_is_omap_fsample()) {
2102- omap_cfg_reg(E2_730_KBR0);
2103- omap_cfg_reg(J7_730_KBR1);
2104- omap_cfg_reg(E1_730_KBR2);
2105- omap_cfg_reg(F3_730_KBR3);
2106- omap_cfg_reg(D2_730_KBR4);
2107-
2108- omap_cfg_reg(C2_730_KBC0);
2109- omap_cfg_reg(D3_730_KBC1);
2110- omap_cfg_reg(E4_730_KBC2);
2111- omap_cfg_reg(F4_730_KBC3);
2112- omap_cfg_reg(E3_730_KBC4);
2113+ omap_cfg_reg(E2_7XX_KBR0);
2114+ omap_cfg_reg(J7_7XX_KBR1);
2115+ omap_cfg_reg(E1_7XX_KBR2);
2116+ omap_cfg_reg(F3_7XX_KBR3);
2117+ omap_cfg_reg(D2_7XX_KBR4);
2118+
2119+ omap_cfg_reg(C2_7XX_KBC0);
2120+ omap_cfg_reg(D3_7XX_KBC1);
2121+ omap_cfg_reg(E4_7XX_KBC2);
2122+ omap_cfg_reg(F4_7XX_KBC3);
2123+ omap_cfg_reg(E3_7XX_KBC4);
2124     } else if (machine_is_omap_h4()) {
2125         omap_cfg_reg(T19_24XX_KBR0);
2126         omap_cfg_reg(R19_24XX_KBR1);
2127--- a/arch/arm/plat-omap/dma.c
2128+++ b/arch/arm/plat-omap/dma.c
2129@@ -2359,40 +2359,46 @@ EXPORT_SYMBOL(omap_stop_lcd_dma);
2130 
2131 static int __init omap_init_dma(void)
2132 {
2133+ unsigned long base;
2134     int ch, r;
2135 
2136     if (cpu_class_is_omap1()) {
2137- omap_dma_base = OMAP1_IO_ADDRESS(OMAP1_DMA_BASE);
2138+ base = OMAP1_DMA_BASE;
2139         dma_lch_count = OMAP1_LOGICAL_DMA_CH_COUNT;
2140     } else if (cpu_is_omap24xx()) {
2141- omap_dma_base = OMAP2_IO_ADDRESS(OMAP24XX_DMA4_BASE);
2142+ base = OMAP24XX_DMA4_BASE;
2143         dma_lch_count = OMAP_DMA4_LOGICAL_DMA_CH_COUNT;
2144     } else if (cpu_is_omap34xx()) {
2145- omap_dma_base = OMAP2_IO_ADDRESS(OMAP34XX_DMA4_BASE);
2146+ base = OMAP34XX_DMA4_BASE;
2147         dma_lch_count = OMAP_DMA4_LOGICAL_DMA_CH_COUNT;
2148     } else if (cpu_is_omap44xx()) {
2149- omap_dma_base = OMAP2_IO_ADDRESS(OMAP44XX_DMA4_BASE);
2150+ base = OMAP44XX_DMA4_BASE;
2151         dma_lch_count = OMAP_DMA4_LOGICAL_DMA_CH_COUNT;
2152     } else {
2153         pr_err("DMA init failed for unsupported omap\n");
2154         return -ENODEV;
2155     }
2156 
2157+ omap_dma_base = ioremap(base, SZ_4K);
2158+ BUG_ON(!omap_dma_base);
2159+
2160     if (cpu_class_is_omap2() && omap_dma_reserve_channels
2161             && (omap_dma_reserve_channels <= dma_lch_count))
2162         dma_lch_count = omap_dma_reserve_channels;
2163 
2164     dma_chan = kzalloc(sizeof(struct omap_dma_lch) * dma_lch_count,
2165                 GFP_KERNEL);
2166- if (!dma_chan)
2167- return -ENOMEM;
2168+ if (!dma_chan) {
2169+ r = -ENOMEM;
2170+ goto out_unmap;
2171+ }
2172 
2173     if (cpu_class_is_omap2()) {
2174         dma_linked_lch = kzalloc(sizeof(struct dma_link_info) *
2175                         dma_lch_count, GFP_KERNEL);
2176         if (!dma_linked_lch) {
2177- kfree(dma_chan);
2178- return -ENOMEM;
2179+ r = -ENOMEM;
2180+ goto out_free;
2181         }
2182     }
2183 
2184@@ -2466,7 +2472,7 @@ static int __init omap_init_dma(void)
2185                 for (i = 0; i < ch; i++)
2186                     free_irq(omap1_dma_irq[i],
2187                          (void *) (i + 1));
2188- return r;
2189+ goto out_free;
2190             }
2191         }
2192     }
2193@@ -2508,11 +2514,19 @@ static int __init omap_init_dma(void)
2194                    "(error %d)\n", r);
2195             for (i = 0; i < dma_chan_count; i++)
2196                 free_irq(omap1_dma_irq[i], (void *) (i + 1));
2197- return r;
2198+ goto out_free;
2199         }
2200     }
2201 
2202     return 0;
2203+
2204+out_free:
2205+ kfree(dma_chan);
2206+
2207+out_unmap:
2208+ iounmap(omap_dma_base);
2209+
2210+ return r;
2211 }
2212 
2213 arch_initcall(omap_init_dma);
2214--- a/arch/arm/plat-omap/dmtimer.c
2215+++ b/arch/arm/plat-omap/dmtimer.c
2216@@ -742,16 +742,17 @@ EXPORT_SYMBOL_GPL(omap_dm_timers_active)
2217 int __init omap_dm_timer_init(void)
2218 {
2219     struct omap_dm_timer *timer;
2220- int i;
2221+ int i, map_size = SZ_8K; /* Module 4KB + L4 4KB except on omap1 */
2222 
2223     if (!(cpu_is_omap16xx() || cpu_class_is_omap2()))
2224         return -ENODEV;
2225 
2226     spin_lock_init(&dm_timer_lock);
2227 
2228- if (cpu_class_is_omap1())
2229+ if (cpu_class_is_omap1()) {
2230         dm_timers = omap1_dm_timers;
2231- else if (cpu_is_omap24xx()) {
2232+ map_size = SZ_2K;
2233+ } else if (cpu_is_omap24xx()) {
2234         dm_timers = omap2_dm_timers;
2235         dm_source_names = omap2_dm_source_names;
2236         dm_source_clocks = omap2_dm_source_clocks;
2237@@ -774,10 +775,11 @@ int __init omap_dm_timer_init(void)
2238 
2239     for (i = 0; i < dm_timer_count; i++) {
2240         timer = &dm_timers[i];
2241- if (cpu_class_is_omap1())
2242- timer->io_base = OMAP1_IO_ADDRESS(timer->phys_base);
2243- else
2244- timer->io_base = OMAP2_IO_ADDRESS(timer->phys_base);
2245+
2246+ /* Static mapping, never released */
2247+ timer->io_base = ioremap(timer->phys_base, map_size);
2248+ BUG_ON(!timer->io_base);
2249+
2250 #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \
2251                     defined(CONFIG_ARCH_OMAP4)
2252         if (cpu_class_is_omap2()) {
2253--- a/arch/arm/plat-omap/gpio.c
2254+++ b/arch/arm/plat-omap/gpio.c
2255@@ -31,7 +31,7 @@
2256 /*
2257  * OMAP1510 GPIO registers
2258  */
2259-#define OMAP1510_GPIO_BASE OMAP1_IO_ADDRESS(0xfffce000)
2260+#define OMAP1510_GPIO_BASE 0xfffce000
2261 #define OMAP1510_GPIO_DATA_INPUT 0x00
2262 #define OMAP1510_GPIO_DATA_OUTPUT 0x04
2263 #define OMAP1510_GPIO_DIR_CONTROL 0x08
2264@@ -45,10 +45,10 @@
2265 /*
2266  * OMAP1610 specific GPIO registers
2267  */
2268-#define OMAP1610_GPIO1_BASE OMAP1_IO_ADDRESS(0xfffbe400)
2269-#define OMAP1610_GPIO2_BASE OMAP1_IO_ADDRESS(0xfffbec00)
2270-#define OMAP1610_GPIO3_BASE OMAP1_IO_ADDRESS(0xfffbb400)
2271-#define OMAP1610_GPIO4_BASE OMAP1_IO_ADDRESS(0xfffbbc00)
2272+#define OMAP1610_GPIO1_BASE 0xfffbe400
2273+#define OMAP1610_GPIO2_BASE 0xfffbec00
2274+#define OMAP1610_GPIO3_BASE 0xfffbb400
2275+#define OMAP1610_GPIO4_BASE 0xfffbbc00
2276 #define OMAP1610_GPIO_REVISION 0x0000
2277 #define OMAP1610_GPIO_SYSCONFIG 0x0010
2278 #define OMAP1610_GPIO_SYSSTATUS 0x0014
2279@@ -68,52 +68,36 @@
2280 #define OMAP1610_GPIO_SET_DATAOUT 0x00f0
2281 
2282 /*
2283- * OMAP730 specific GPIO registers
2284+ * OMAP7XX specific GPIO registers
2285  */
2286-#define OMAP730_GPIO1_BASE OMAP1_IO_ADDRESS(0xfffbc000)
2287-#define OMAP730_GPIO2_BASE OMAP1_IO_ADDRESS(0xfffbc800)
2288-#define OMAP730_GPIO3_BASE OMAP1_IO_ADDRESS(0xfffbd000)
2289-#define OMAP730_GPIO4_BASE OMAP1_IO_ADDRESS(0xfffbd800)
2290-#define OMAP730_GPIO5_BASE OMAP1_IO_ADDRESS(0xfffbe000)
2291-#define OMAP730_GPIO6_BASE OMAP1_IO_ADDRESS(0xfffbe800)
2292-#define OMAP730_GPIO_DATA_INPUT 0x00
2293-#define OMAP730_GPIO_DATA_OUTPUT 0x04
2294-#define OMAP730_GPIO_DIR_CONTROL 0x08
2295-#define OMAP730_GPIO_INT_CONTROL 0x0c
2296-#define OMAP730_GPIO_INT_MASK 0x10
2297-#define OMAP730_GPIO_INT_STATUS 0x14
2298+#define OMAP7XX_GPIO1_BASE 0xfffbc000
2299+#define OMAP7XX_GPIO2_BASE 0xfffbc800
2300+#define OMAP7XX_GPIO3_BASE 0xfffbd000
2301+#define OMAP7XX_GPIO4_BASE 0xfffbd800
2302+#define OMAP7XX_GPIO5_BASE 0xfffbe000
2303+#define OMAP7XX_GPIO6_BASE 0xfffbe800
2304+#define OMAP7XX_GPIO_DATA_INPUT 0x00
2305+#define OMAP7XX_GPIO_DATA_OUTPUT 0x04
2306+#define OMAP7XX_GPIO_DIR_CONTROL 0x08
2307+#define OMAP7XX_GPIO_INT_CONTROL 0x0c
2308+#define OMAP7XX_GPIO_INT_MASK 0x10
2309+#define OMAP7XX_GPIO_INT_STATUS 0x14
2310 
2311-/*
2312- * OMAP850 specific GPIO registers
2313- */
2314-#define OMAP850_GPIO1_BASE OMAP1_IO_ADDRESS(0xfffbc000)
2315-#define OMAP850_GPIO2_BASE OMAP1_IO_ADDRESS(0xfffbc800)
2316-#define OMAP850_GPIO3_BASE OMAP1_IO_ADDRESS(0xfffbd000)
2317-#define OMAP850_GPIO4_BASE OMAP1_IO_ADDRESS(0xfffbd800)
2318-#define OMAP850_GPIO5_BASE OMAP1_IO_ADDRESS(0xfffbe000)
2319-#define OMAP850_GPIO6_BASE OMAP1_IO_ADDRESS(0xfffbe800)
2320-#define OMAP850_GPIO_DATA_INPUT 0x00
2321-#define OMAP850_GPIO_DATA_OUTPUT 0x04
2322-#define OMAP850_GPIO_DIR_CONTROL 0x08
2323-#define OMAP850_GPIO_INT_CONTROL 0x0c
2324-#define OMAP850_GPIO_INT_MASK 0x10
2325-#define OMAP850_GPIO_INT_STATUS 0x14
2326-
2327-#define OMAP1_MPUIO_VBASE OMAP1_IO_ADDRESS(OMAP1_MPUIO_BASE)
2328+#define OMAP1_MPUIO_VBASE OMAP1_MPUIO_BASE
2329 
2330 /*
2331  * omap24xx specific GPIO registers
2332  */
2333-#define OMAP242X_GPIO1_BASE OMAP2_IO_ADDRESS(0x48018000)
2334-#define OMAP242X_GPIO2_BASE OMAP2_IO_ADDRESS(0x4801a000)
2335-#define OMAP242X_GPIO3_BASE OMAP2_IO_ADDRESS(0x4801c000)
2336-#define OMAP242X_GPIO4_BASE OMAP2_IO_ADDRESS(0x4801e000)
2337-
2338-#define OMAP243X_GPIO1_BASE OMAP2_IO_ADDRESS(0x4900C000)
2339-#define OMAP243X_GPIO2_BASE OMAP2_IO_ADDRESS(0x4900E000)
2340-#define OMAP243X_GPIO3_BASE OMAP2_IO_ADDRESS(0x49010000)
2341-#define OMAP243X_GPIO4_BASE OMAP2_IO_ADDRESS(0x49012000)
2342-#define OMAP243X_GPIO5_BASE OMAP2_IO_ADDRESS(0x480B6000)
2343+#define OMAP242X_GPIO1_BASE 0x48018000
2344+#define OMAP242X_GPIO2_BASE 0x4801a000
2345+#define OMAP242X_GPIO3_BASE 0x4801c000
2346+#define OMAP242X_GPIO4_BASE 0x4801e000
2347+
2348+#define OMAP243X_GPIO1_BASE 0x4900C000
2349+#define OMAP243X_GPIO2_BASE 0x4900E000
2350+#define OMAP243X_GPIO3_BASE 0x49010000
2351+#define OMAP243X_GPIO4_BASE 0x49012000
2352+#define OMAP243X_GPIO5_BASE 0x480B6000
2353 
2354 #define OMAP24XX_GPIO_REVISION 0x0000
2355 #define OMAP24XX_GPIO_SYSCONFIG 0x0010
2356@@ -170,24 +154,25 @@
2357  * omap34xx specific GPIO registers
2358  */
2359 
2360-#define OMAP34XX_GPIO1_BASE OMAP2_IO_ADDRESS(0x48310000)
2361-#define OMAP34XX_GPIO2_BASE OMAP2_IO_ADDRESS(0x49050000)
2362-#define OMAP34XX_GPIO3_BASE OMAP2_IO_ADDRESS(0x49052000)
2363-#define OMAP34XX_GPIO4_BASE OMAP2_IO_ADDRESS(0x49054000)
2364-#define OMAP34XX_GPIO5_BASE OMAP2_IO_ADDRESS(0x49056000)
2365-#define OMAP34XX_GPIO6_BASE OMAP2_IO_ADDRESS(0x49058000)
2366+#define OMAP34XX_GPIO1_BASE 0x48310000
2367+#define OMAP34XX_GPIO2_BASE 0x49050000
2368+#define OMAP34XX_GPIO3_BASE 0x49052000
2369+#define OMAP34XX_GPIO4_BASE 0x49054000
2370+#define OMAP34XX_GPIO5_BASE 0x49056000
2371+#define OMAP34XX_GPIO6_BASE 0x49058000
2372 
2373 /*
2374  * OMAP44XX specific GPIO registers
2375  */
2376-#define OMAP44XX_GPIO1_BASE OMAP2_IO_ADDRESS(0x4a310000)
2377-#define OMAP44XX_GPIO2_BASE OMAP2_IO_ADDRESS(0x48055000)
2378-#define OMAP44XX_GPIO3_BASE OMAP2_IO_ADDRESS(0x48057000)
2379-#define OMAP44XX_GPIO4_BASE OMAP2_IO_ADDRESS(0x48059000)
2380-#define OMAP44XX_GPIO5_BASE OMAP2_IO_ADDRESS(0x4805B000)
2381-#define OMAP44XX_GPIO6_BASE OMAP2_IO_ADDRESS(0x4805D000)
2382+#define OMAP44XX_GPIO1_BASE 0x4a310000
2383+#define OMAP44XX_GPIO2_BASE 0x48055000
2384+#define OMAP44XX_GPIO3_BASE 0x48057000
2385+#define OMAP44XX_GPIO4_BASE 0x48059000
2386+#define OMAP44XX_GPIO5_BASE 0x4805B000
2387+#define OMAP44XX_GPIO6_BASE 0x4805D000
2388 
2389 struct gpio_bank {
2390+ unsigned long pbase;
2391     void __iomem *base;
2392     u16 irq;
2393     u16 virtual_irq_start;
2394@@ -215,96 +200,111 @@ struct gpio_bank {
2395 #define METHOD_MPUIO 0
2396 #define METHOD_GPIO_1510 1
2397 #define METHOD_GPIO_1610 2
2398-#define METHOD_GPIO_730 3
2399-#define METHOD_GPIO_850 4
2400+#define METHOD_GPIO_7XX 3
2401 #define METHOD_GPIO_24XX 5
2402 
2403 #ifdef CONFIG_ARCH_OMAP16XX
2404 static struct gpio_bank gpio_bank_1610[5] = {
2405- { OMAP1_MPUIO_VBASE, INT_MPUIO, IH_MPUIO_BASE, METHOD_MPUIO},
2406- { OMAP1610_GPIO1_BASE, INT_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_1610 },
2407- { OMAP1610_GPIO2_BASE, INT_1610_GPIO_BANK2, IH_GPIO_BASE + 16, METHOD_GPIO_1610 },
2408- { OMAP1610_GPIO3_BASE, INT_1610_GPIO_BANK3, IH_GPIO_BASE + 32, METHOD_GPIO_1610 },
2409- { OMAP1610_GPIO4_BASE, INT_1610_GPIO_BANK4, IH_GPIO_BASE + 48, METHOD_GPIO_1610 },
2410+ { OMAP1_MPUIO_VBASE, 0, INT_MPUIO, IH_MPUIO_BASE,
2411+ METHOD_MPUIO },
2412+ { OMAP1610_GPIO1_BASE, 0, INT_GPIO_BANK1, IH_GPIO_BASE,
2413+ METHOD_GPIO_1610 },
2414+ { OMAP1610_GPIO2_BASE, 0, INT_1610_GPIO_BANK2, IH_GPIO_BASE + 16,
2415+ METHOD_GPIO_1610 },
2416+ { OMAP1610_GPIO3_BASE, 0, INT_1610_GPIO_BANK3, IH_GPIO_BASE + 32,
2417+ METHOD_GPIO_1610 },
2418+ { OMAP1610_GPIO4_BASE, 0, INT_1610_GPIO_BANK4, IH_GPIO_BASE + 48,
2419+ METHOD_GPIO_1610 },
2420 };
2421 #endif
2422 
2423 #ifdef CONFIG_ARCH_OMAP15XX
2424 static struct gpio_bank gpio_bank_1510[2] = {
2425- { OMAP1_MPUIO_VBASE, INT_MPUIO, IH_MPUIO_BASE, METHOD_MPUIO },
2426- { OMAP1510_GPIO_BASE, INT_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_1510 }
2427-};
2428-#endif
2429-
2430-#ifdef CONFIG_ARCH_OMAP730
2431-static struct gpio_bank gpio_bank_730[7] = {
2432- { OMAP1_MPUIO_VBASE, INT_730_MPUIO, IH_MPUIO_BASE, METHOD_MPUIO },
2433- { OMAP730_GPIO1_BASE, INT_730_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_730 },
2434- { OMAP730_GPIO2_BASE, INT_730_GPIO_BANK2, IH_GPIO_BASE + 32, METHOD_GPIO_730 },
2435- { OMAP730_GPIO3_BASE, INT_730_GPIO_BANK3, IH_GPIO_BASE + 64, METHOD_GPIO_730 },
2436- { OMAP730_GPIO4_BASE, INT_730_GPIO_BANK4, IH_GPIO_BASE + 96, METHOD_GPIO_730 },
2437- { OMAP730_GPIO5_BASE, INT_730_GPIO_BANK5, IH_GPIO_BASE + 128, METHOD_GPIO_730 },
2438- { OMAP730_GPIO6_BASE, INT_730_GPIO_BANK6, IH_GPIO_BASE + 160, METHOD_GPIO_730 },
2439+ { OMAP1_MPUIO_VBASE, 0, INT_MPUIO, IH_MPUIO_BASE,
2440+ METHOD_MPUIO },
2441+ { OMAP1510_GPIO_BASE, 0, INT_GPIO_BANK1, IH_GPIO_BASE,
2442+ METHOD_GPIO_1510 }
2443 };
2444 #endif
2445 
2446-#ifdef CONFIG_ARCH_OMAP850
2447-static struct gpio_bank gpio_bank_850[7] = {
2448- { OMAP1_MPUIO_VBASE, INT_850_MPUIO, IH_MPUIO_BASE, METHOD_MPUIO },
2449- { OMAP850_GPIO1_BASE, INT_850_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_850 },
2450- { OMAP850_GPIO2_BASE, INT_850_GPIO_BANK2, IH_GPIO_BASE + 32, METHOD_GPIO_850 },
2451- { OMAP850_GPIO3_BASE, INT_850_GPIO_BANK3, IH_GPIO_BASE + 64, METHOD_GPIO_850 },
2452- { OMAP850_GPIO4_BASE, INT_850_GPIO_BANK4, IH_GPIO_BASE + 96, METHOD_GPIO_850 },
2453- { OMAP850_GPIO5_BASE, INT_850_GPIO_BANK5, IH_GPIO_BASE + 128, METHOD_GPIO_850 },
2454- { OMAP850_GPIO6_BASE, INT_850_GPIO_BANK6, IH_GPIO_BASE + 160, METHOD_GPIO_850 },
2455+#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
2456+static struct gpio_bank gpio_bank_7xx[7] = {
2457+ { OMAP1_MPUIO_VBASE, 0, INT_7XX_MPUIO, IH_MPUIO_BASE,
2458+ METHOD_MPUIO },
2459+ { OMAP7XX_GPIO1_BASE, 0, INT_7XX_GPIO_BANK1, IH_GPIO_BASE,
2460+ METHOD_GPIO_7XX },
2461+ { OMAP7XX_GPIO2_BASE, 0, INT_7XX_GPIO_BANK2, IH_GPIO_BASE + 32,
2462+ METHOD_GPIO_7XX },
2463+ { OMAP7XX_GPIO3_BASE, 0, INT_7XX_GPIO_BANK3, IH_GPIO_BASE + 64,
2464+ METHOD_GPIO_7XX },
2465+ { OMAP7XX_GPIO4_BASE, 0, INT_7XX_GPIO_BANK4, IH_GPIO_BASE + 96,
2466+ METHOD_GPIO_7XX },
2467+ { OMAP7XX_GPIO5_BASE, 0, INT_7XX_GPIO_BANK5, IH_GPIO_BASE + 128,
2468+ METHOD_GPIO_7XX },
2469+ { OMAP7XX_GPIO6_BASE, 0, INT_7XX_GPIO_BANK6, IH_GPIO_BASE + 160,
2470+ METHOD_GPIO_7XX },
2471 };
2472 #endif
2473 
2474-
2475 #ifdef CONFIG_ARCH_OMAP24XX
2476 
2477 static struct gpio_bank gpio_bank_242x[4] = {
2478- { OMAP242X_GPIO1_BASE, INT_24XX_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_24XX },
2479- { OMAP242X_GPIO2_BASE, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32, METHOD_GPIO_24XX },
2480- { OMAP242X_GPIO3_BASE, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64, METHOD_GPIO_24XX },
2481- { OMAP242X_GPIO4_BASE, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96, METHOD_GPIO_24XX },
2482+ { OMAP242X_GPIO1_BASE, 0, INT_24XX_GPIO_BANK1, IH_GPIO_BASE,
2483+ METHOD_GPIO_24XX },
2484+ { OMAP242X_GPIO2_BASE, 0, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32,
2485+ METHOD_GPIO_24XX },
2486+ { OMAP242X_GPIO3_BASE, 0, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64,
2487+ METHOD_GPIO_24XX },
2488+ { OMAP242X_GPIO4_BASE, 0, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96,
2489+ METHOD_GPIO_24XX },
2490 };
2491 
2492 static struct gpio_bank gpio_bank_243x[5] = {
2493- { OMAP243X_GPIO1_BASE, INT_24XX_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_24XX },
2494- { OMAP243X_GPIO2_BASE, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32, METHOD_GPIO_24XX },
2495- { OMAP243X_GPIO3_BASE, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64, METHOD_GPIO_24XX },
2496- { OMAP243X_GPIO4_BASE, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96, METHOD_GPIO_24XX },
2497- { OMAP243X_GPIO5_BASE, INT_24XX_GPIO_BANK5, IH_GPIO_BASE + 128, METHOD_GPIO_24XX },
2498+ { OMAP243X_GPIO1_BASE, 0, INT_24XX_GPIO_BANK1, IH_GPIO_BASE,
2499+ METHOD_GPIO_24XX },
2500+ { OMAP243X_GPIO2_BASE, 0, INT_24XX_GPIO_BANK2, IH_GPIO_BASE + 32,
2501+ METHOD_GPIO_24XX },
2502+ { OMAP243X_GPIO3_BASE, 0, INT_24XX_GPIO_BANK3, IH_GPIO_BASE + 64,
2503+ METHOD_GPIO_24XX },
2504+ { OMAP243X_GPIO4_BASE, 0, INT_24XX_GPIO_BANK4, IH_GPIO_BASE + 96,
2505+ METHOD_GPIO_24XX },
2506+ { OMAP243X_GPIO5_BASE, 0, INT_24XX_GPIO_BANK5, IH_GPIO_BASE + 128,
2507+ METHOD_GPIO_24XX },
2508 };
2509 
2510 #endif
2511 
2512 #ifdef CONFIG_ARCH_OMAP34XX
2513 static struct gpio_bank gpio_bank_34xx[6] = {
2514- { OMAP34XX_GPIO1_BASE, INT_34XX_GPIO_BANK1, IH_GPIO_BASE, METHOD_GPIO_24XX },
2515- { OMAP34XX_GPIO2_BASE, INT_34XX_GPIO_BANK2, IH_GPIO_BASE + 32, METHOD_GPIO_24XX },
2516- { OMAP34XX_GPIO3_BASE, INT_34XX_GPIO_BANK3, IH_GPIO_BASE + 64, METHOD_GPIO_24XX },
2517- { OMAP34XX_GPIO4_BASE, INT_34XX_GPIO_BANK4, IH_GPIO_BASE + 96, METHOD_GPIO_24XX },
2518- { OMAP34XX_GPIO5_BASE, INT_34XX_GPIO_BANK5, IH_GPIO_BASE + 128, METHOD_GPIO_24XX },
2519- { OMAP34XX_GPIO6_BASE, INT_34XX_GPIO_BANK6, IH_GPIO_BASE + 160, METHOD_GPIO_24XX },
2520+ { OMAP34XX_GPIO1_BASE, 0, INT_34XX_GPIO_BANK1, IH_GPIO_BASE,
2521+ METHOD_GPIO_24XX },
2522+ { OMAP34XX_GPIO2_BASE, 0, INT_34XX_GPIO_BANK2, IH_GPIO_BASE + 32,
2523+ METHOD_GPIO_24XX },
2524+ { OMAP34XX_GPIO3_BASE, 0, INT_34XX_GPIO_BANK3, IH_GPIO_BASE + 64,
2525+ METHOD_GPIO_24XX },
2526+ { OMAP34XX_GPIO4_BASE, 0, INT_34XX_GPIO_BANK4, IH_GPIO_BASE + 96,
2527+ METHOD_GPIO_24XX },
2528+ { OMAP34XX_GPIO5_BASE, 0, INT_34XX_GPIO_BANK5, IH_GPIO_BASE + 128,
2529+ METHOD_GPIO_24XX },
2530+ { OMAP34XX_GPIO6_BASE, 0, INT_34XX_GPIO_BANK6, IH_GPIO_BASE + 160,
2531+ METHOD_GPIO_24XX },
2532 };
2533 
2534 #endif
2535 
2536 #ifdef CONFIG_ARCH_OMAP4
2537 static struct gpio_bank gpio_bank_44xx[6] = {
2538- { OMAP44XX_GPIO1_BASE, INT_44XX_GPIO_BANK1, IH_GPIO_BASE, \
2539+ { OMAP44XX_GPIO1_BASE, 0, INT_44XX_GPIO_BANK1, IH_GPIO_BASE,
2540         METHOD_GPIO_24XX },
2541- { OMAP44XX_GPIO2_BASE, INT_44XX_GPIO_BANK2, IH_GPIO_BASE + 32, \
2542+ { OMAP44XX_GPIO2_BASE, 0, INT_44XX_GPIO_BANK2, IH_GPIO_BASE + 32,
2543         METHOD_GPIO_24XX },
2544- { OMAP44XX_GPIO3_BASE, INT_44XX_GPIO_BANK3, IH_GPIO_BASE + 64, \
2545+ { OMAP44XX_GPIO3_BASE, 0, INT_44XX_GPIO_BANK3, IH_GPIO_BASE + 64,
2546         METHOD_GPIO_24XX },
2547- { OMAP44XX_GPIO4_BASE, INT_44XX_GPIO_BANK4, IH_GPIO_BASE + 96, \
2548+ { OMAP44XX_GPIO4_BASE, 0, INT_44XX_GPIO_BANK4, IH_GPIO_BASE + 96,
2549         METHOD_GPIO_24XX },
2550- { OMAP44XX_GPIO5_BASE, INT_44XX_GPIO_BANK5, IH_GPIO_BASE + 128, \
2551+ { OMAP44XX_GPIO5_BASE, 0, INT_44XX_GPIO_BANK5, IH_GPIO_BASE + 128,
2552         METHOD_GPIO_24XX },
2553- { OMAP44XX_GPIO6_BASE, INT_44XX_GPIO_BANK6, IH_GPIO_BASE + 160, \
2554+ { OMAP44XX_GPIO6_BASE, 0, INT_44XX_GPIO_BANK6, IH_GPIO_BASE + 160,
2555         METHOD_GPIO_24XX },
2556 };
2557 
2558@@ -402,14 +402,9 @@ static void _set_gpio_direction(struct g
2559         reg += OMAP1610_GPIO_DIRECTION;
2560         break;
2561 #endif
2562-#ifdef CONFIG_ARCH_OMAP730
2563- case METHOD_GPIO_730:
2564- reg += OMAP730_GPIO_DIR_CONTROL;
2565- break;
2566-#endif
2567-#ifdef CONFIG_ARCH_OMAP850
2568- case METHOD_GPIO_850:
2569- reg += OMAP850_GPIO_DIR_CONTROL;
2570+#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
2571+ case METHOD_GPIO_7XX:
2572+ reg += OMAP7XX_GPIO_DIR_CONTROL;
2573         break;
2574 #endif
2575 #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
2576@@ -469,19 +464,9 @@ static void _set_gpio_dataout(struct gpi
2577         l = 1 << gpio;
2578         break;
2579 #endif
2580-#ifdef CONFIG_ARCH_OMAP730
2581- case METHOD_GPIO_730:
2582- reg += OMAP730_GPIO_DATA_OUTPUT;
2583- l = __raw_readl(reg);
2584- if (enable)
2585- l |= 1 << gpio;
2586- else
2587- l &= ~(1 << gpio);
2588- break;
2589-#endif
2590-#ifdef CONFIG_ARCH_OMAP850
2591- case METHOD_GPIO_850:
2592- reg += OMAP850_GPIO_DATA_OUTPUT;
2593+#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
2594+ case METHOD_GPIO_7XX:
2595+ reg += OMAP7XX_GPIO_DATA_OUTPUT;
2596         l = __raw_readl(reg);
2597         if (enable)
2598             l |= 1 << gpio;
2599@@ -537,14 +522,9 @@ static int _get_gpio_datain(struct gpio_
2600         reg += OMAP1610_GPIO_DATAIN;
2601         break;
2602 #endif
2603-#ifdef CONFIG_ARCH_OMAP730
2604- case METHOD_GPIO_730:
2605- reg += OMAP730_GPIO_DATA_INPUT;
2606- break;
2607-#endif
2608-#ifdef CONFIG_ARCH_OMAP850
2609- case METHOD_GPIO_850:
2610- reg += OMAP850_GPIO_DATA_INPUT;
2611+#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
2612+ case METHOD_GPIO_7XX:
2613+ reg += OMAP7XX_GPIO_DATA_INPUT;
2614         break;
2615 #endif
2616 #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
2617@@ -588,14 +568,9 @@ static int _get_gpio_dataout(struct gpio
2618         reg += OMAP1610_GPIO_DATAOUT;
2619         break;
2620 #endif
2621-#ifdef CONFIG_ARCH_OMAP730
2622- case METHOD_GPIO_730:
2623- reg += OMAP730_GPIO_DATA_OUTPUT;
2624- break;
2625-#endif
2626-#ifdef CONFIG_ARCH_OMAP850
2627- case METHOD_GPIO_850:
2628- reg += OMAP850_GPIO_DATA_OUTPUT;
2629+#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
2630+ case METHOD_GPIO_7XX:
2631+ reg += OMAP7XX_GPIO_DATA_OUTPUT;
2632         break;
2633 #endif
2634 #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \
2635@@ -797,21 +772,9 @@ static int _set_gpio_triggering(struct g
2636             __raw_writel(1 << gpio, bank->base + OMAP1610_GPIO_CLEAR_WAKEUPENA);
2637         break;
2638 #endif
2639-#ifdef CONFIG_ARCH_OMAP730
2640- case METHOD_GPIO_730:
2641- reg += OMAP730_GPIO_INT_CONTROL;
2642- l = __raw_readl(reg);
2643- if (trigger & IRQ_TYPE_EDGE_RISING)
2644- l |= 1 << gpio;
2645- else if (trigger & IRQ_TYPE_EDGE_FALLING)
2646- l &= ~(1 << gpio);
2647- else
2648- goto bad;
2649- break;
2650-#endif
2651-#ifdef CONFIG_ARCH_OMAP850
2652- case METHOD_GPIO_850:
2653- reg += OMAP850_GPIO_INT_CONTROL;
2654+#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
2655+ case METHOD_GPIO_7XX:
2656+ reg += OMAP7XX_GPIO_INT_CONTROL;
2657         l = __raw_readl(reg);
2658         if (trigger & IRQ_TYPE_EDGE_RISING)
2659             l |= 1 << gpio;
2660@@ -897,14 +860,9 @@ static void _clear_gpio_irqbank(struct g
2661         reg += OMAP1610_GPIO_IRQSTATUS1;
2662         break;
2663 #endif
2664-#ifdef CONFIG_ARCH_OMAP730
2665- case METHOD_GPIO_730:
2666- reg += OMAP730_GPIO_INT_STATUS;
2667- break;
2668-#endif
2669-#ifdef CONFIG_ARCH_OMAP850
2670- case METHOD_GPIO_850:
2671- reg += OMAP850_GPIO_INT_STATUS;
2672+#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
2673+ case METHOD_GPIO_7XX:
2674+ reg += OMAP7XX_GPIO_INT_STATUS;
2675         break;
2676 #endif
2677 #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
2678@@ -971,16 +929,9 @@ static u32 _get_gpio_irqbank_mask(struct
2679         mask = 0xffff;
2680         break;
2681 #endif
2682-#ifdef CONFIG_ARCH_OMAP730
2683- case METHOD_GPIO_730:
2684- reg += OMAP730_GPIO_INT_MASK;
2685- mask = 0xffffffff;
2686- inv = 1;
2687- break;
2688-#endif
2689-#ifdef CONFIG_ARCH_OMAP850
2690- case METHOD_GPIO_850:
2691- reg += OMAP850_GPIO_INT_MASK;
2692+#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
2693+ case METHOD_GPIO_7XX:
2694+ reg += OMAP7XX_GPIO_INT_MASK;
2695         mask = 0xffffffff;
2696         inv = 1;
2697         break;
2698@@ -1044,19 +995,9 @@ static void _enable_gpio_irqbank(struct
2699         l = gpio_mask;
2700         break;
2701 #endif
2702-#ifdef CONFIG_ARCH_OMAP730
2703- case METHOD_GPIO_730:
2704- reg += OMAP730_GPIO_INT_MASK;
2705- l = __raw_readl(reg);
2706- if (enable)
2707- l &= ~(gpio_mask);
2708- else
2709- l |= gpio_mask;
2710- break;
2711-#endif
2712-#ifdef CONFIG_ARCH_OMAP850
2713- case METHOD_GPIO_850:
2714- reg += OMAP850_GPIO_INT_MASK;
2715+#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
2716+ case METHOD_GPIO_7XX:
2717+ reg += OMAP7XX_GPIO_INT_MASK;
2718         l = __raw_readl(reg);
2719         if (enable)
2720             l &= ~(gpio_mask);
2721@@ -1249,13 +1190,9 @@ static void gpio_irq_handler(unsigned in
2722     if (bank->method == METHOD_GPIO_1610)
2723         isr_reg = bank->base + OMAP1610_GPIO_IRQSTATUS1;
2724 #endif
2725-#ifdef CONFIG_ARCH_OMAP730
2726- if (bank->method == METHOD_GPIO_730)
2727- isr_reg = bank->base + OMAP730_GPIO_INT_STATUS;
2728-#endif
2729-#ifdef CONFIG_ARCH_OMAP850
2730- if (bank->method == METHOD_GPIO_850)
2731- isr_reg = bank->base + OMAP850_GPIO_INT_STATUS;
2732+#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
2733+ if (bank->method == METHOD_GPIO_7XX)
2734+ isr_reg = bank->base + OMAP7XX_GPIO_INT_STATUS;
2735 #endif
2736 #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
2737     if (bank->method == METHOD_GPIO_24XX)
2738@@ -1524,11 +1461,8 @@ static int gpio_is_input(struct gpio_ban
2739     case METHOD_GPIO_1610:
2740         reg += OMAP1610_GPIO_DIRECTION;
2741         break;
2742- case METHOD_GPIO_730:
2743- reg += OMAP730_GPIO_DIR_CONTROL;
2744- break;
2745- case METHOD_GPIO_850:
2746- reg += OMAP850_GPIO_DIR_CONTROL;
2747+ case METHOD_GPIO_7XX:
2748+ reg += OMAP7XX_GPIO_DIR_CONTROL;
2749         break;
2750     case METHOD_GPIO_24XX:
2751         reg += OMAP24XX_GPIO_OE;
2752@@ -1607,6 +1541,23 @@ static struct clk * gpio5_fck;
2753 static struct clk *gpio_iclks[OMAP34XX_NR_GPIOS];
2754 #endif
2755 
2756+static void __init omap_gpio_show_rev(void)
2757+{
2758+ u32 rev;
2759+
2760+ if (cpu_is_omap16xx())
2761+ rev = __raw_readw(gpio_bank[1].base + OMAP1610_GPIO_REVISION);
2762+ else if (cpu_is_omap24xx() || cpu_is_omap34xx())
2763+ rev = __raw_readl(gpio_bank[0].base + OMAP24XX_GPIO_REVISION);
2764+ else if (cpu_is_omap44xx())
2765+ rev = __raw_readl(gpio_bank[0].base + OMAP4_GPIO_REVISION);
2766+ else
2767+ return;
2768+
2769+ printk(KERN_INFO "OMAP GPIO hardware version %d.%d\n",
2770+ (rev >> 4) & 0x0f, rev & 0x0f);
2771+}
2772+
2773 /* This lock class tells lockdep that GPIO irqs are in a different
2774  * category than their parents, so it won't report false recursion.
2775  */
2776@@ -1617,6 +1568,7 @@ static int __init _omap_gpio_init(void)
2777     int i;
2778     int gpio = 0;
2779     struct gpio_bank *bank;
2780+ int bank_size = SZ_8K; /* Module 4KB + L4 4KB except on omap1 */
2781     char clk_name[11];
2782 
2783     initialized = 1;
2784@@ -1679,77 +1631,45 @@ static int __init _omap_gpio_init(void)
2785 
2786 #ifdef CONFIG_ARCH_OMAP15XX
2787     if (cpu_is_omap15xx()) {
2788- printk(KERN_INFO "OMAP1510 GPIO hardware\n");
2789         gpio_bank_count = 2;
2790         gpio_bank = gpio_bank_1510;
2791+ bank_size = SZ_2K;
2792     }
2793 #endif
2794 #if defined(CONFIG_ARCH_OMAP16XX)
2795     if (cpu_is_omap16xx()) {
2796- u32 rev;
2797-
2798         gpio_bank_count = 5;
2799         gpio_bank = gpio_bank_1610;
2800- rev = __raw_readw(gpio_bank[1].base + OMAP1610_GPIO_REVISION);
2801- printk(KERN_INFO "OMAP GPIO hardware version %d.%d\n",
2802- (rev >> 4) & 0x0f, rev & 0x0f);
2803+ bank_size = SZ_2K;
2804     }
2805 #endif
2806-#ifdef CONFIG_ARCH_OMAP730
2807- if (cpu_is_omap730()) {
2808- printk(KERN_INFO "OMAP730 GPIO hardware\n");
2809- gpio_bank_count = 7;
2810- gpio_bank = gpio_bank_730;
2811- }
2812-#endif
2813-#ifdef CONFIG_ARCH_OMAP850
2814- if (cpu_is_omap850()) {
2815- printk(KERN_INFO "OMAP850 GPIO hardware\n");
2816+#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
2817+ if (cpu_is_omap7xx()) {
2818         gpio_bank_count = 7;
2819- gpio_bank = gpio_bank_850;
2820+ gpio_bank = gpio_bank_7xx;
2821+ bank_size = SZ_2K;
2822     }
2823 #endif
2824-
2825 #ifdef CONFIG_ARCH_OMAP24XX
2826     if (cpu_is_omap242x()) {
2827- int rev;
2828-
2829         gpio_bank_count = 4;
2830         gpio_bank = gpio_bank_242x;
2831- rev = __raw_readl(gpio_bank[0].base + OMAP24XX_GPIO_REVISION);
2832- printk(KERN_INFO "OMAP242x GPIO hardware version %d.%d\n",
2833- (rev >> 4) & 0x0f, rev & 0x0f);
2834     }
2835     if (cpu_is_omap243x()) {
2836- int rev;
2837-
2838         gpio_bank_count = 5;
2839         gpio_bank = gpio_bank_243x;
2840- rev = __raw_readl(gpio_bank[0].base + OMAP24XX_GPIO_REVISION);
2841- printk(KERN_INFO "OMAP243x GPIO hardware version %d.%d\n",
2842- (rev >> 4) & 0x0f, rev & 0x0f);
2843     }
2844 #endif
2845 #ifdef CONFIG_ARCH_OMAP34XX
2846     if (cpu_is_omap34xx()) {
2847- int rev;
2848-
2849         gpio_bank_count = OMAP34XX_NR_GPIOS;
2850         gpio_bank = gpio_bank_34xx;
2851- rev = __raw_readl(gpio_bank[0].base + OMAP24XX_GPIO_REVISION);
2852- printk(KERN_INFO "OMAP34xx GPIO hardware version %d.%d\n",
2853- (rev >> 4) & 0x0f, rev & 0x0f);
2854     }
2855 #endif
2856 #ifdef CONFIG_ARCH_OMAP4
2857     if (cpu_is_omap44xx()) {
2858- int rev;
2859-
2860         gpio_bank_count = OMAP34XX_NR_GPIOS;
2861         gpio_bank = gpio_bank_44xx;
2862- rev = __raw_readl(gpio_bank[0].base + OMAP4_GPIO_REVISION);
2863- printk(KERN_INFO "OMAP44xx GPIO hardware version %d.%d\n",
2864- (rev >> 4) & 0x0f, rev & 0x0f);
2865     }
2866 #endif
2867     for (i = 0; i < gpio_bank_count; i++) {
2868@@ -1757,6 +1677,14 @@ static int __init _omap_gpio_init(void)
2869 
2870         bank = &gpio_bank[i];
2871         spin_lock_init(&bank->lock);
2872+
2873+ /* Static mapping, never released */
2874+ bank->base = ioremap(bank->pbase, bank_size);
2875+ if (!bank->base) {
2876+ printk(KERN_ERR "Could not ioremap gpio bank%i\n", i);
2877+ continue;
2878+ }
2879+
2880         if (bank_is_mpuio(bank))
2881             __raw_writew(0xffff, bank->base + OMAP_MPUIO_GPIO_MASKIT);
2882         if (cpu_is_omap15xx() && bank->method == METHOD_GPIO_1510) {
2883@@ -1768,11 +1696,11 @@ static int __init _omap_gpio_init(void)
2884             __raw_writew(0xffff, bank->base + OMAP1610_GPIO_IRQSTATUS1);
2885             __raw_writew(0x0014, bank->base + OMAP1610_GPIO_SYSCONFIG);
2886         }
2887- if (cpu_is_omap7xx() && bank->method == METHOD_GPIO_730) {
2888- __raw_writel(0xffffffff, bank->base + OMAP730_GPIO_INT_MASK);
2889- __raw_writel(0x00000000, bank->base + OMAP730_GPIO_INT_STATUS);
2890+ if (cpu_is_omap7xx() && bank->method == METHOD_GPIO_7XX) {
2891+ __raw_writel(0xffffffff, bank->base + OMAP7XX_GPIO_INT_MASK);
2892+ __raw_writel(0x00000000, bank->base + OMAP7XX_GPIO_INT_STATUS);
2893 
2894- gpio_count = 32; /* 730 has 32-bit GPIOs */
2895+ gpio_count = 32; /* 7xx has 32-bit GPIOs */
2896         }
2897 
2898 #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX) || \
2899@@ -1862,6 +1790,8 @@ static int __init _omap_gpio_init(void)
2900     if (cpu_is_omap34xx())
2901         omap_writel(1 << 0, 0x48306814);
2902 
2903+ omap_gpio_show_rev();
2904+
2905     return 0;
2906 }
2907 
2908@@ -2160,8 +2090,7 @@ static int dbg_gpio_show(struct seq_file
2909 
2910         if (bank_is_mpuio(bank))
2911             gpio = OMAP_MPUIO(0);
2912- else if (cpu_class_is_omap2() || cpu_is_omap730() ||
2913- cpu_is_omap850())
2914+ else if (cpu_class_is_omap2() || cpu_is_omap7xx())
2915             bankwidth = 32;
2916 
2917         for (j = 0; j < bankwidth; j++, gpio++, mask <<= 1) {
2918--- a/arch/arm/plat-omap/include/mach/control.h
2919+++ b/arch/arm/plat-omap/include/mach/control.h
2920@@ -20,15 +20,18 @@
2921 
2922 #ifndef __ASSEMBLY__
2923 #define OMAP242X_CTRL_REGADDR(reg) \
2924- OMAP2_IO_ADDRESS(OMAP242X_CTRL_BASE + (reg))
2925+ OMAP2_L4_IO_ADDRESS(OMAP242X_CTRL_BASE + (reg))
2926 #define OMAP243X_CTRL_REGADDR(reg) \
2927- OMAP2_IO_ADDRESS(OMAP243X_CTRL_BASE + (reg))
2928+ OMAP2_L4_IO_ADDRESS(OMAP243X_CTRL_BASE + (reg))
2929 #define OMAP343X_CTRL_REGADDR(reg) \
2930- OMAP2_IO_ADDRESS(OMAP343X_CTRL_BASE + (reg))
2931+ OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE + (reg))
2932 #else
2933-#define OMAP242X_CTRL_REGADDR(reg) OMAP2_IO_ADDRESS(OMAP242X_CTRL_BASE + (reg))
2934-#define OMAP243X_CTRL_REGADDR(reg) OMAP2_IO_ADDRESS(OMAP243X_CTRL_BASE + (reg))
2935-#define OMAP343X_CTRL_REGADDR(reg) OMAP2_IO_ADDRESS(OMAP343X_CTRL_BASE + (reg))
2936+#define OMAP242X_CTRL_REGADDR(reg) \
2937+ OMAP2_L4_IO_ADDRESS(OMAP242X_CTRL_BASE + (reg))
2938+#define OMAP243X_CTRL_REGADDR(reg) \
2939+ OMAP2_L4_IO_ADDRESS(OMAP243X_CTRL_BASE + (reg))
2940+#define OMAP343X_CTRL_REGADDR(reg) \
2941+ OMAP2_L4_IO_ADDRESS(OMAP343X_CTRL_BASE + (reg))
2942 #endif /* __ASSEMBLY__ */
2943 
2944 /*
2945@@ -202,6 +205,40 @@
2946 #define OMAP3_PADCONF_WAKEUPEVENT0 (1 << 15)
2947 #define OMAP3_PADCONF_WAKEUPENABLE0 (1 << 14)
2948 
2949+/*
2950+ * CONTROL OMAP STATUS register to identify OMAP3 features
2951+ */
2952+#define OMAP3_CONTROL_OMAP_STATUS 0x044c
2953+
2954+#define OMAP3_SGX_SHIFT 13
2955+#define OMAP3_SGX_MASK (3 << OMAP3_SGX_SHIFT)
2956+#define FEAT_SGX_FULL 0
2957+#define FEAT_SGX_HALF 1
2958+#define FEAT_SGX_NONE 2
2959+
2960+#define OMAP3_IVA_SHIFT 12
2961+#define OMAP3_IVA_MASK (1 << OMAP3_SGX_SHIFT)
2962+#define FEAT_IVA 0
2963+#define FEAT_IVA_NONE 1
2964+
2965+#define OMAP3_L2CACHE_SHIFT 10
2966+#define OMAP3_L2CACHE_MASK (3 << OMAP3_L2CACHE_SHIFT)
2967+#define FEAT_L2CACHE_NONE 0
2968+#define FEAT_L2CACHE_64KB 1
2969+#define FEAT_L2CACHE_128KB 2
2970+#define FEAT_L2CACHE_256KB 3
2971+
2972+#define OMAP3_ISP_SHIFT 5
2973+#define OMAP3_ISP_MASK (1<< OMAP3_ISP_SHIFT)
2974+#define FEAT_ISP 0
2975+#define FEAT_ISP_NONE 1
2976+
2977+#define OMAP3_NEON_SHIFT 4
2978+#define OMAP3_NEON_MASK (1<< OMAP3_NEON_SHIFT)
2979+#define FEAT_NEON 0
2980+#define FEAT_NEON_NONE 1
2981+
2982+
2983 #ifndef __ASSEMBLY__
2984 #if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) || \
2985         defined(CONFIG_ARCH_OMAP4)
2986--- a/arch/arm/plat-omap/include/mach/cpu.h
2987+++ b/arch/arm/plat-omap/include/mach/cpu.h
2988@@ -30,6 +30,8 @@
2989 #ifndef __ASM_ARCH_OMAP_CPU_H
2990 #define __ASM_ARCH_OMAP_CPU_H
2991 
2992+#include <linux/bitops.h>
2993+
2994 /*
2995  * Omap device type i.e. EMU/HS/TST/GP/BAD
2996  */
2997@@ -57,6 +59,23 @@ struct omap_chip_id {
2998 unsigned int omap_rev(void);
2999 
3000 /*
3001+ * Define CPU revision bits
3002+ *
3003+ * Verbose meaning of the revision bits may be different for a silicon
3004+ * family. This difference can be handled separately.
3005+ */
3006+#define OMAP_REVBITS_00 0x00
3007+#define OMAP_REVBITS_10 0x10
3008+#define OMAP_REVBITS_20 0x20
3009+#define OMAP_REVBITS_30 0x30
3010+#define OMAP_REVBITS_40 0x40
3011+
3012+/*
3013+ * Get the CPU revision for OMAP devices
3014+ */
3015+#define GET_OMAP_REVISION() ((omap_rev() >> 8) & 0xff)
3016+
3017+/*
3018  * Test if multicore OMAP support is needed
3019  */
3020 #undef MULTI_OMAP1
3021@@ -161,6 +180,7 @@ IS_OMAP_CLASS(34xx, 0x34)
3022 IS_OMAP_SUBCLASS(242x, 0x242)
3023 IS_OMAP_SUBCLASS(243x, 0x243)
3024 IS_OMAP_SUBCLASS(343x, 0x343)
3025+IS_OMAP_SUBCLASS(363x, 0x363)
3026 
3027 #define cpu_is_omap7xx() 0
3028 #define cpu_is_omap15xx() 0
3029@@ -301,7 +321,12 @@ IS_OMAP_TYPE(3430, 0x3430)
3030 #define cpu_is_omap2422() 0
3031 #define cpu_is_omap2423() 0
3032 #define cpu_is_omap2430() 0
3033+#define cpu_is_omap3503() 0
3034+#define cpu_is_omap3515() 0
3035+#define cpu_is_omap3525() 0
3036+#define cpu_is_omap3530() 0
3037 #define cpu_is_omap3430() 0
3038+#define cpu_is_omap3630() 0
3039 
3040 /*
3041  * Whether we have MULTI_OMAP1 or not, we still need to distinguish
3042@@ -351,7 +376,23 @@ IS_OMAP_TYPE(3430, 0x3430)
3043 
3044 #if defined(CONFIG_ARCH_OMAP34XX)
3045 # undef cpu_is_omap3430
3046+# undef cpu_is_omap3503
3047+# undef cpu_is_omap3515
3048+# undef cpu_is_omap3525
3049+# undef cpu_is_omap3530
3050 # define cpu_is_omap3430() is_omap3430()
3051+# define cpu_is_omap3503 (cpu_is_omap3430() && \
3052+ (!omap3_has_iva()) && \
3053+ (!omap3_has_sgx()))
3054+# define cpu_is_omap3515 (cpu_is_omap3430() && \
3055+ (omap3_has_iva()) && \
3056+ (!omap3_has_sgx()))
3057+# define cpu_is_omap3525 (cpu_is_omap3430() && \
3058+ (omap3_has_sgx()) && \
3059+ (!omap3_has_iva()))
3060+# define cpu_is_omap3530 (cpu_is_omap3430())
3061+# undef cpu_is_omap3630
3062+# define cpu_is_omap3630() is_omap363x()
3063 #endif
3064 
3065 # if defined(CONFIG_ARCH_OMAP4)
3066@@ -382,6 +423,14 @@ IS_OMAP_TYPE(3430, 0x3430)
3067 #define OMAP3430_REV_ES3_0 0x34303034
3068 #define OMAP3430_REV_ES3_1 0x34304034
3069 
3070+#define OMAP3630_REV_ES1_0 0x36300034
3071+
3072+#define OMAP35XX_CLASS 0x35000034
3073+#define OMAP3503_REV(v) (OMAP35XX_CLASS | (0x3503 << 16) | (v << 12))
3074+#define OMAP3515_REV(v) (OMAP35XX_CLASS | (0x3515 << 16) | (v << 12))
3075+#define OMAP3525_REV(v) (OMAP35XX_CLASS | (0x3525 << 16) | (v << 12))
3076+#define OMAP3530_REV(v) (OMAP35XX_CLASS | (0x3530 << 16) | (v << 12))
3077+
3078 #define OMAP443X_CLASS 0x44300034
3079 
3080 /*
3081@@ -423,4 +472,27 @@ IS_OMAP_TYPE(3430, 0x3430)
3082 int omap_chip_is(struct omap_chip_id oci);
3083 void omap2_check_revision(void);
3084 
3085+/*
3086+ * Runtime detection of OMAP3 features
3087+ */
3088+extern u32 omap3_features;
3089+
3090+#define OMAP3_HAS_L2CACHE BIT(0)
3091+#define OMAP3_HAS_IVA BIT(1)
3092+#define OMAP3_HAS_SGX BIT(2)
3093+#define OMAP3_HAS_NEON BIT(3)
3094+#define OMAP3_HAS_ISP BIT(4)
3095+
3096+#define OMAP3_HAS_FEATURE(feat,flag) \
3097+static inline unsigned int omap3_has_ ##feat(void) \
3098+{ \
3099+ return (omap3_features & OMAP3_HAS_ ##flag); \
3100+} \
3101+
3102+OMAP3_HAS_FEATURE(l2cache, L2CACHE)
3103+OMAP3_HAS_FEATURE(sgx, SGX)
3104+OMAP3_HAS_FEATURE(iva, IVA)
3105+OMAP3_HAS_FEATURE(neon, NEON)
3106+OMAP3_HAS_FEATURE(isp, ISP)
3107+
3108 #endif
3109--- a/arch/arm/plat-omap/include/mach/debug-macro.S
3110+++ b/arch/arm/plat-omap/include/mach/debug-macro.S
3111@@ -27,7 +27,7 @@
3112 
3113 #elif CONFIG_ARCH_OMAP2
3114         moveq \rx, #0x48000000 @ physical base address
3115- movne \rx, #0xd8000000 @ virtual base
3116+ movne \rx, #0xfa000000 @ virtual base
3117         orr \rx, \rx, #0x0006a000
3118 #ifdef CONFIG_OMAP_LL_DEBUG_UART2
3119         add \rx, \rx, #0x00002000 @ UART 2
3120@@ -38,7 +38,7 @@
3121 
3122 #elif defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
3123         moveq \rx, #0x48000000 @ physical base address
3124- movne \rx, #0xd8000000 @ virtual base
3125+ movne \rx, #0xfa000000 @ virtual base
3126         orr \rx, \rx, #0x0006a000
3127 #ifdef CONFIG_OMAP_LL_DEBUG_UART2
3128         add \rx, \rx, #0x00002000 @ UART 2
3129--- a/arch/arm/plat-omap/include/mach/entry-macro.S
3130+++ b/arch/arm/plat-omap/include/mach/entry-macro.S
3131@@ -17,11 +17,11 @@
3132 
3133 #if defined(CONFIG_ARCH_OMAP1)
3134 
3135-#if defined(CONFIG_ARCH_OMAP730) && \
3136+#if (defined(CONFIG_ARCH_OMAP730)||defined(CONFIG_ARCH_OMAP850)) && \
3137     (defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX))
3138-#error "FIXME: OMAP730 doesn't support multiple-OMAP"
3139-#elif defined(CONFIG_ARCH_OMAP730)
3140-#define INT_IH2_IRQ INT_730_IH2_IRQ
3141+#error "FIXME: OMAP7XX doesn't support multiple-OMAP"
3142+#elif defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
3143+#define INT_IH2_IRQ INT_7XX_IH2_IRQ
3144 #elif defined(CONFIG_ARCH_OMAP15XX)
3145 #define INT_IH2_IRQ INT_1510_IH2_IRQ
3146 #elif defined(CONFIG_ARCH_OMAP16XX)
3147@@ -68,9 +68,9 @@
3148 
3149 /* REVISIT: This should be set dynamically if CONFIG_MULTI_OMAP2 is selected */
3150 #if defined(CONFIG_ARCH_OMAP2420) || defined(CONFIG_ARCH_OMAP2430)
3151-#define OMAP2_VA_IC_BASE OMAP2_IO_ADDRESS(OMAP24XX_IC_BASE)
3152+#define OMAP2_VA_IC_BASE OMAP2_L4_IO_ADDRESS(OMAP24XX_IC_BASE)
3153 #elif defined(CONFIG_ARCH_OMAP34XX)
3154-#define OMAP2_VA_IC_BASE OMAP2_IO_ADDRESS(OMAP34XX_IC_BASE)
3155+#define OMAP2_VA_IC_BASE OMAP2_L4_IO_ADDRESS(OMAP34XX_IC_BASE)
3156 #endif
3157 #if defined(CONFIG_ARCH_OMAP4)
3158 #include <mach/omap44xx.h>
3159@@ -104,6 +104,8 @@
3160 
3161         .endm
3162 #else
3163+#define OMAP44XX_VA_GIC_CPU_BASE OMAP2_L4_IO_ADDRESS(OMAP44XX_GIC_CPU_BASE)
3164+
3165         /*
3166          * The interrupt numbering scheme is defined in the
3167          * interrupt controller spec. To wit:
3168--- a/arch/arm/plat-omap/include/mach/hardware.h
3169+++ b/arch/arm/plat-omap/include/mach/hardware.h
3170@@ -280,7 +280,7 @@
3171  * ---------------------------------------------------------------------------
3172  */
3173 
3174-#include "omap730.h"
3175+#include "omap7xx.h"
3176 #include "omap1510.h"
3177 #include "omap16xx.h"
3178 #include "omap24xx.h"
3179--- a/arch/arm/plat-omap/include/mach/io.h
3180+++ b/arch/arm/plat-omap/include/mach/io.h
3181@@ -63,8 +63,24 @@
3182 #define OMAP1_IO_OFFSET 0x01000000 /* Virtual IO = 0xfefb0000 */
3183 #define OMAP1_IO_ADDRESS(pa) IOMEM((pa) - OMAP1_IO_OFFSET)
3184 
3185-#define OMAP2_IO_OFFSET 0x90000000
3186-#define OMAP2_IO_ADDRESS(pa) IOMEM((pa) + OMAP2_IO_OFFSET) /* L3 and L4 */
3187+#define OMAP2_L3_IO_OFFSET 0x90000000
3188+#define OMAP2_L3_IO_ADDRESS(pa) IOMEM((pa) + OMAP2_L3_IO_OFFSET) /* L3 */
3189+
3190+
3191+#define OMAP2_L4_IO_OFFSET 0xb2000000
3192+#define OMAP2_L4_IO_ADDRESS(pa) IOMEM((pa) + OMAP2_L4_IO_OFFSET) /* L4 */
3193+
3194+#define OMAP4_L3_IO_OFFSET 0xb4000000
3195+#define OMAP4_L3_IO_ADDRESS(pa) IOMEM((pa) + OMAP4_L3_IO_OFFSET) /* L3 */
3196+
3197+#define OMAP4_L3_PER_IO_OFFSET 0xb1100000
3198+#define OMAP4_L3_PER_IO_ADDRESS(pa) IOMEM((pa) + OMAP4_L3_PER_IO_OFFSET)
3199+
3200+#define OMAP4_GPMC_IO_OFFSET 0xa9000000
3201+#define OMAP4_GPMC_IO_ADDRESS(pa) IOMEM((pa) + OMAP4_GPMC_IO_OFFSET)
3202+
3203+#define OMAP2_EMU_IO_OFFSET 0xaa800000 /* Emulation */
3204+#define OMAP2_EMU_IO_ADDRESS(pa) IOMEM((pa) + OMAP2_EMU_IO_OFFSET)
3205 
3206 /*
3207  * ----------------------------------------------------------------------------
3208@@ -83,24 +99,27 @@
3209  */
3210 
3211 /* We map both L3 and L4 on OMAP2 */
3212-#define L3_24XX_PHYS L3_24XX_BASE /* 0x68000000 */
3213-#define L3_24XX_VIRT 0xf8000000
3214+#define L3_24XX_PHYS L3_24XX_BASE /* 0x68000000 --> 0xf8000000*/
3215+#define L3_24XX_VIRT (L3_24XX_PHYS + OMAP2_L3_IO_OFFSET)
3216 #define L3_24XX_SIZE SZ_1M /* 44kB of 128MB used, want 1MB sect */
3217-#define L4_24XX_PHYS L4_24XX_BASE /* 0x48000000 */
3218-#define L4_24XX_VIRT 0xd8000000
3219+#define L4_24XX_PHYS L4_24XX_BASE /* 0x48000000 --> 0xfa000000 */
3220+#define L4_24XX_VIRT (L4_24XX_PHYS + OMAP2_L4_IO_OFFSET)
3221 #define L4_24XX_SIZE SZ_1M /* 1MB of 128MB used, want 1MB sect */
3222 
3223-#define L4_WK_243X_PHYS L4_WK_243X_BASE /* 0x49000000 */
3224-#define L4_WK_243X_VIRT 0xd9000000
3225+#define L4_WK_243X_PHYS L4_WK_243X_BASE /* 0x49000000 --> 0xfb000000 */
3226+#define L4_WK_243X_VIRT (L4_WK_243X_PHYS + OMAP2_L4_IO_OFFSET)
3227 #define L4_WK_243X_SIZE SZ_1M
3228-#define OMAP243X_GPMC_PHYS OMAP243X_GPMC_BASE /* 0x49000000 */
3229-#define OMAP243X_GPMC_VIRT 0xFE000000
3230+#define OMAP243X_GPMC_PHYS OMAP243X_GPMC_BASE
3231+#define OMAP243X_GPMC_VIRT (OMAP243X_GPMC_PHYS + OMAP2_L3_IO_OFFSET)
3232+ /* 0x6e000000 --> 0xfe000000 */
3233 #define OMAP243X_GPMC_SIZE SZ_1M
3234 #define OMAP243X_SDRC_PHYS OMAP243X_SDRC_BASE
3235-#define OMAP243X_SDRC_VIRT 0xFD000000
3236+ /* 0x6D000000 --> 0xfd000000 */
3237+#define OMAP243X_SDRC_VIRT (OMAP243X_SDRC_PHYS + OMAP2_L3_IO_OFFSET)
3238 #define OMAP243X_SDRC_SIZE SZ_1M
3239 #define OMAP243X_SMS_PHYS OMAP243X_SMS_BASE
3240-#define OMAP243X_SMS_VIRT 0xFC000000
3241+ /* 0x6c000000 --> 0xfc000000 */
3242+#define OMAP243X_SMS_VIRT (OMAP243X_SMS_PHYS + OMAP2_L3_IO_OFFSET)
3243 #define OMAP243X_SMS_SIZE SZ_1M
3244 
3245 /* DSP */
3246@@ -121,12 +140,12 @@
3247  */
3248 
3249 /* We map both L3 and L4 on OMAP3 */
3250-#define L3_34XX_PHYS L3_34XX_BASE /* 0x68000000 */
3251-#define L3_34XX_VIRT 0xf8000000
3252+#define L3_34XX_PHYS L3_34XX_BASE /* 0x68000000 --> 0xf8000000 */
3253+#define L3_34XX_VIRT (L3_34XX_PHYS + OMAP2_L3_IO_OFFSET)
3254 #define L3_34XX_SIZE SZ_1M /* 44kB of 128MB used, want 1MB sect */
3255 
3256-#define L4_34XX_PHYS L4_34XX_BASE /* 0x48000000 */
3257-#define L4_34XX_VIRT 0xd8000000
3258+#define L4_34XX_PHYS L4_34XX_BASE /* 0x48000000 --> 0xfa000000 */
3259+#define L4_34XX_VIRT (L4_34XX_PHYS + OMAP2_L4_IO_OFFSET)
3260 #define L4_34XX_SIZE SZ_4M /* 1MB of 128MB used, want 1MB sect */
3261 
3262 /*
3263@@ -134,28 +153,33 @@
3264  * VPOM3430 was not working for Int controller
3265  */
3266 
3267-#define L4_WK_34XX_PHYS L4_WK_34XX_BASE /* 0x48300000 */
3268-#define L4_WK_34XX_VIRT 0xd8300000
3269+#define L4_WK_34XX_PHYS L4_WK_34XX_BASE /* 0x48300000 --> 0xfa300000 */
3270+#define L4_WK_34XX_VIRT (L4_WK_34XX_PHYS + OMAP2_L4_IO_OFFSET)
3271 #define L4_WK_34XX_SIZE SZ_1M
3272 
3273-#define L4_PER_34XX_PHYS L4_PER_34XX_BASE /* 0x49000000 */
3274-#define L4_PER_34XX_VIRT 0xd9000000
3275+#define L4_PER_34XX_PHYS L4_PER_34XX_BASE
3276+ /* 0x49000000 --> 0xfb000000 */
3277+#define L4_PER_34XX_VIRT (L4_PER_34XX_PHYS + OMAP2_L4_IO_OFFSET)
3278 #define L4_PER_34XX_SIZE SZ_1M
3279 
3280-#define L4_EMU_34XX_PHYS L4_EMU_34XX_BASE /* 0x54000000 */
3281-#define L4_EMU_34XX_VIRT 0xe4000000
3282-#define L4_EMU_34XX_SIZE SZ_64M
3283-
3284-#define OMAP34XX_GPMC_PHYS OMAP34XX_GPMC_BASE /* 0x6E000000 */
3285-#define OMAP34XX_GPMC_VIRT 0xFE000000
3286+#define L4_EMU_34XX_PHYS L4_EMU_34XX_BASE
3287+ /* 0x54000000 --> 0xfe800000 */
3288+#define L4_EMU_34XX_VIRT (L4_EMU_34XX_PHYS + OMAP2_EMU_IO_OFFSET)
3289+#define L4_EMU_34XX_SIZE SZ_8M
3290+
3291+#define OMAP34XX_GPMC_PHYS OMAP34XX_GPMC_BASE
3292+ /* 0x6e000000 --> 0xfe000000 */
3293+#define OMAP34XX_GPMC_VIRT (OMAP34XX_GPMC_PHYS + OMAP2_L3_IO_OFFSET)
3294 #define OMAP34XX_GPMC_SIZE SZ_1M
3295 
3296-#define OMAP343X_SMS_PHYS OMAP343X_SMS_BASE /* 0x6C000000 */
3297-#define OMAP343X_SMS_VIRT 0xFC000000
3298+#define OMAP343X_SMS_PHYS OMAP343X_SMS_BASE
3299+ /* 0x6c000000 --> 0xfc000000 */
3300+#define OMAP343X_SMS_VIRT (OMAP343X_SMS_PHYS + OMAP2_L3_IO_OFFSET)
3301 #define OMAP343X_SMS_SIZE SZ_1M
3302 
3303-#define OMAP343X_SDRC_PHYS OMAP343X_SDRC_BASE /* 0x6D000000 */
3304-#define OMAP343X_SDRC_VIRT 0xFD000000
3305+#define OMAP343X_SDRC_PHYS OMAP343X_SDRC_BASE
3306+ /* 0x6D000000 --> 0xfd000000 */
3307+#define OMAP343X_SDRC_VIRT (OMAP343X_SDRC_PHYS + OMAP2_L3_IO_OFFSET)
3308 #define OMAP343X_SDRC_SIZE SZ_1M
3309 
3310 /* DSP */
3311@@ -176,32 +200,54 @@
3312  */
3313 
3314 /* We map both L3 and L4 on OMAP4 */
3315-#define L3_44XX_PHYS L3_44XX_BASE
3316-#define L3_44XX_VIRT 0xd4000000
3317+#define L3_44XX_PHYS L3_44XX_BASE /* 0x44000000 --> 0xf8000000 */
3318+#define L3_44XX_VIRT (L3_44XX_PHYS + OMAP4_L3_IO_OFFSET)
3319 #define L3_44XX_SIZE SZ_1M
3320 
3321-#define L4_44XX_PHYS L4_44XX_BASE
3322-#define L4_44XX_VIRT 0xda000000
3323+#define L4_44XX_PHYS L4_44XX_BASE /* 0x4a000000 --> 0xfc000000 */
3324+#define L4_44XX_VIRT (L4_44XX_PHYS + OMAP2_L4_IO_OFFSET)
3325 #define L4_44XX_SIZE SZ_4M
3326 
3327 
3328-#define L4_WK_44XX_PHYS L4_WK_44XX_BASE
3329-#define L4_WK_44XX_VIRT 0xda300000
3330+#define L4_WK_44XX_PHYS L4_WK_44XX_BASE /* 0x4a300000 --> 0xfc300000 */
3331+#define L4_WK_44XX_VIRT (L4_WK_44XX_PHYS + OMAP2_L4_IO_OFFSET)
3332 #define L4_WK_44XX_SIZE SZ_1M
3333 
3334 #define L4_PER_44XX_PHYS L4_PER_44XX_BASE
3335-#define L4_PER_44XX_VIRT 0xd8000000
3336+ /* 0x48000000 --> 0xfa000000 */
3337+#define L4_PER_44XX_VIRT (L4_PER_44XX_PHYS + OMAP2_L4_IO_OFFSET)
3338 #define L4_PER_44XX_SIZE SZ_4M
3339 
3340+#define L4_ABE_44XX_PHYS L4_ABE_44XX_BASE
3341+ /* 0x49000000 --> 0xfb000000 */
3342+#define L4_ABE_44XX_VIRT (L4_ABE_44XX_PHYS + OMAP2_L4_IO_OFFSET)
3343+#define L4_ABE_44XX_SIZE SZ_1M
3344+
3345 #define L4_EMU_44XX_PHYS L4_EMU_44XX_BASE
3346-#define L4_EMU_44XX_VIRT 0xe4000000
3347-#define L4_EMU_44XX_SIZE SZ_64M
3348+ /* 0x54000000 --> 0xfe800000 */
3349+#define L4_EMU_44XX_VIRT (L4_EMU_44XX_PHYS + OMAP2_EMU_IO_OFFSET)
3350+#define L4_EMU_44XX_SIZE SZ_8M
3351 
3352 #define OMAP44XX_GPMC_PHYS OMAP44XX_GPMC_BASE
3353-#define OMAP44XX_GPMC_VIRT 0xe0000000
3354+ /* 0x50000000 --> 0xf9000000 */
3355+#define OMAP44XX_GPMC_VIRT (OMAP44XX_GPMC_PHYS + OMAP4_GPMC_IO_OFFSET)
3356 #define OMAP44XX_GPMC_SIZE SZ_1M
3357 
3358 
3359+#define OMAP44XX_EMIF1_PHYS OMAP44XX_EMIF1_BASE
3360+ /* 0x4c000000 --> 0xfd100000 */
3361+#define OMAP44XX_EMIF1_VIRT (OMAP44XX_EMIF1_PHYS + OMAP4_L3_PER_IO_OFFSET)
3362+#define OMAP44XX_EMIF1_SIZE SZ_1M
3363+
3364+#define OMAP44XX_EMIF2_PHYS OMAP44XX_EMIF2_BASE
3365+ /* 0x4d000000 --> 0xfd200000 */
3366+#define OMAP44XX_EMIF2_VIRT (OMAP44XX_EMIF2_PHYS + OMAP4_L3_PER_IO_OFFSET)
3367+#define OMAP44XX_EMIF2_SIZE SZ_1M
3368+
3369+#define OMAP44XX_DMM_PHYS OMAP44XX_DMM_BASE
3370+ /* 0x4e000000 --> 0xfd300000 */
3371+#define OMAP44XX_DMM_VIRT (OMAP44XX_DMM_PHYS + OMAP4_L3_PER_IO_OFFSET)
3372+#define OMAP44XX_DMM_SIZE SZ_1M
3373 /*
3374  * ----------------------------------------------------------------------------
3375  * Omap specific register access
3376--- a/arch/arm/plat-omap/include/mach/irqs.h
3377+++ b/arch/arm/plat-omap/include/mach/irqs.h
3378@@ -86,49 +86,26 @@
3379 #define INT_1610_SSR_FIFO_0 29
3380 
3381 /*
3382- * OMAP-730 specific IRQ numbers for interrupt handler 1
3383+ * OMAP-7xx specific IRQ numbers for interrupt handler 1
3384  */
3385-#define INT_730_IH2_FIQ 0
3386-#define INT_730_IH2_IRQ 1
3387-#define INT_730_USB_NON_ISO 2
3388-#define INT_730_USB_ISO 3
3389-#define INT_730_ICR 4
3390-#define INT_730_EAC 5
3391-#define INT_730_GPIO_BANK1 6
3392-#define INT_730_GPIO_BANK2 7
3393-#define INT_730_GPIO_BANK3 8
3394-#define INT_730_McBSP2TX 10
3395-#define INT_730_McBSP2RX 11
3396-#define INT_730_McBSP2RX_OVF 12
3397-#define INT_730_LCD_LINE 14
3398-#define INT_730_GSM_PROTECT 15
3399-#define INT_730_TIMER3 16
3400-#define INT_730_GPIO_BANK5 17
3401-#define INT_730_GPIO_BANK6 18
3402-#define INT_730_SPGIO_WR 29
3403-
3404-/*
3405- * OMAP-850 specific IRQ numbers for interrupt handler 1
3406- */
3407-#define INT_850_IH2_FIQ 0
3408-#define INT_850_IH2_IRQ 1
3409-#define INT_850_USB_NON_ISO 2
3410-#define INT_850_USB_ISO 3
3411-#define INT_850_ICR 4
3412-#define INT_850_EAC 5
3413-#define INT_850_GPIO_BANK1 6
3414-#define INT_850_GPIO_BANK2 7
3415-#define INT_850_GPIO_BANK3 8
3416-#define INT_850_McBSP2TX 10
3417-#define INT_850_McBSP2RX 11
3418-#define INT_850_McBSP2RX_OVF 12
3419-#define INT_850_LCD_LINE 14
3420-#define INT_850_GSM_PROTECT 15
3421-#define INT_850_TIMER3 16
3422-#define INT_850_GPIO_BANK5 17
3423-#define INT_850_GPIO_BANK6 18
3424-#define INT_850_SPGIO_WR 29
3425-
3426+#define INT_7XX_IH2_FIQ 0
3427+#define INT_7XX_IH2_IRQ 1
3428+#define INT_7XX_USB_NON_ISO 2
3429+#define INT_7XX_USB_ISO 3
3430+#define INT_7XX_ICR 4
3431+#define INT_7XX_EAC 5
3432+#define INT_7XX_GPIO_BANK1 6
3433+#define INT_7XX_GPIO_BANK2 7
3434+#define INT_7XX_GPIO_BANK3 8
3435+#define INT_7XX_McBSP2TX 10
3436+#define INT_7XX_McBSP2RX 11
3437+#define INT_7XX_McBSP2RX_OVF 12
3438+#define INT_7XX_LCD_LINE 14
3439+#define INT_7XX_GSM_PROTECT 15
3440+#define INT_7XX_TIMER3 16
3441+#define INT_7XX_GPIO_BANK5 17
3442+#define INT_7XX_GPIO_BANK6 18
3443+#define INT_7XX_SPGIO_WR 29
3444 
3445 /*
3446  * IRQ numbers for interrupt handler 2
3447@@ -206,120 +183,62 @@
3448 #define INT_1610_SHA1MD5 (91 + IH2_BASE)
3449 
3450 /*
3451- * OMAP-730 specific IRQ numbers for interrupt handler 2
3452- */
3453-#define INT_730_HW_ERRORS (0 + IH2_BASE)
3454-#define INT_730_NFIQ_PWR_FAIL (1 + IH2_BASE)
3455-#define INT_730_CFCD (2 + IH2_BASE)
3456-#define INT_730_CFIREQ (3 + IH2_BASE)
3457-#define INT_730_I2C (4 + IH2_BASE)
3458-#define INT_730_PCC (5 + IH2_BASE)
3459-#define INT_730_MPU_EXT_NIRQ (6 + IH2_BASE)
3460-#define INT_730_SPI_100K_1 (7 + IH2_BASE)
3461-#define INT_730_SYREN_SPI (8 + IH2_BASE)
3462-#define INT_730_VLYNQ (9 + IH2_BASE)
3463-#define INT_730_GPIO_BANK4 (10 + IH2_BASE)
3464-#define INT_730_McBSP1TX (11 + IH2_BASE)
3465-#define INT_730_McBSP1RX (12 + IH2_BASE)
3466-#define INT_730_McBSP1RX_OF (13 + IH2_BASE)
3467-#define INT_730_UART_MODEM_IRDA_2 (14 + IH2_BASE)
3468-#define INT_730_UART_MODEM_1 (15 + IH2_BASE)
3469-#define INT_730_MCSI (16 + IH2_BASE)
3470-#define INT_730_uWireTX (17 + IH2_BASE)
3471-#define INT_730_uWireRX (18 + IH2_BASE)
3472-#define INT_730_SMC_CD (19 + IH2_BASE)
3473-#define INT_730_SMC_IREQ (20 + IH2_BASE)
3474-#define INT_730_HDQ_1WIRE (21 + IH2_BASE)
3475-#define INT_730_TIMER32K (22 + IH2_BASE)
3476-#define INT_730_MMC_SDIO (23 + IH2_BASE)
3477-#define INT_730_UPLD (24 + IH2_BASE)
3478-#define INT_730_USB_HHC_1 (27 + IH2_BASE)
3479-#define INT_730_USB_HHC_2 (28 + IH2_BASE)
3480-#define INT_730_USB_GENI (29 + IH2_BASE)
3481-#define INT_730_USB_OTG (30 + IH2_BASE)
3482-#define INT_730_CAMERA_IF (31 + IH2_BASE)
3483-#define INT_730_RNG (32 + IH2_BASE)
3484-#define INT_730_DUAL_MODE_TIMER (33 + IH2_BASE)
3485-#define INT_730_DBB_RF_EN (34 + IH2_BASE)
3486-#define INT_730_MPUIO_KEYPAD (35 + IH2_BASE)
3487-#define INT_730_SHA1_MD5 (36 + IH2_BASE)
3488-#define INT_730_SPI_100K_2 (37 + IH2_BASE)
3489-#define INT_730_RNG_IDLE (38 + IH2_BASE)
3490-#define INT_730_MPUIO (39 + IH2_BASE)
3491-#define INT_730_LLPC_LCD_CTRL_CAN_BE_OFF (40 + IH2_BASE)
3492-#define INT_730_LLPC_OE_FALLING (41 + IH2_BASE)
3493-#define INT_730_LLPC_OE_RISING (42 + IH2_BASE)
3494-#define INT_730_LLPC_VSYNC (43 + IH2_BASE)
3495-#define INT_730_WAKE_UP_REQ (46 + IH2_BASE)
3496-#define INT_730_DMA_CH6 (53 + IH2_BASE)
3497-#define INT_730_DMA_CH7 (54 + IH2_BASE)
3498-#define INT_730_DMA_CH8 (55 + IH2_BASE)
3499-#define INT_730_DMA_CH9 (56 + IH2_BASE)
3500-#define INT_730_DMA_CH10 (57 + IH2_BASE)
3501-#define INT_730_DMA_CH11 (58 + IH2_BASE)
3502-#define INT_730_DMA_CH12 (59 + IH2_BASE)
3503-#define INT_730_DMA_CH13 (60 + IH2_BASE)
3504-#define INT_730_DMA_CH14 (61 + IH2_BASE)
3505-#define INT_730_DMA_CH15 (62 + IH2_BASE)
3506-#define INT_730_NAND (63 + IH2_BASE)
3507-
3508-/*
3509- * OMAP-850 specific IRQ numbers for interrupt handler 2
3510+ * OMAP-7xx specific IRQ numbers for interrupt handler 2
3511  */
3512-#define INT_850_HW_ERRORS (0 + IH2_BASE)
3513-#define INT_850_NFIQ_PWR_FAIL (1 + IH2_BASE)
3514-#define INT_850_CFCD (2 + IH2_BASE)
3515-#define INT_850_CFIREQ (3 + IH2_BASE)
3516-#define INT_850_I2C (4 + IH2_BASE)
3517-#define INT_850_PCC (5 + IH2_BASE)
3518-#define INT_850_MPU_EXT_NIRQ (6 + IH2_BASE)
3519-#define INT_850_SPI_100K_1 (7 + IH2_BASE)
3520-#define INT_850_SYREN_SPI (8 + IH2_BASE)
3521-#define INT_850_VLYNQ (9 + IH2_BASE)
3522-#define INT_850_GPIO_BANK4 (10 + IH2_BASE)
3523-#define INT_850_McBSP1TX (11 + IH2_BASE)
3524-#define INT_850_McBSP1RX (12 + IH2_BASE)
3525-#define INT_850_McBSP1RX_OF (13 + IH2_BASE)
3526-#define INT_850_UART_MODEM_IRDA_2 (14 + IH2_BASE)
3527-#define INT_850_UART_MODEM_1 (15 + IH2_BASE)
3528-#define INT_850_MCSI (16 + IH2_BASE)
3529-#define INT_850_uWireTX (17 + IH2_BASE)
3530-#define INT_850_uWireRX (18 + IH2_BASE)
3531-#define INT_850_SMC_CD (19 + IH2_BASE)
3532-#define INT_850_SMC_IREQ (20 + IH2_BASE)
3533-#define INT_850_HDQ_1WIRE (21 + IH2_BASE)
3534-#define INT_850_TIMER32K (22 + IH2_BASE)
3535-#define INT_850_MMC_SDIO (23 + IH2_BASE)
3536-#define INT_850_UPLD (24 + IH2_BASE)
3537-#define INT_850_USB_HHC_1 (27 + IH2_BASE)
3538-#define INT_850_USB_HHC_2 (28 + IH2_BASE)
3539-#define INT_850_USB_GENI (29 + IH2_BASE)
3540-#define INT_850_USB_OTG (30 + IH2_BASE)
3541-#define INT_850_CAMERA_IF (31 + IH2_BASE)
3542-#define INT_850_RNG (32 + IH2_BASE)
3543-#define INT_850_DUAL_MODE_TIMER (33 + IH2_BASE)
3544-#define INT_850_DBB_RF_EN (34 + IH2_BASE)
3545-#define INT_850_MPUIO_KEYPAD (35 + IH2_BASE)
3546-#define INT_850_SHA1_MD5 (36 + IH2_BASE)
3547-#define INT_850_SPI_100K_2 (37 + IH2_BASE)
3548-#define INT_850_RNG_IDLE (38 + IH2_BASE)
3549-#define INT_850_MPUIO (39 + IH2_BASE)
3550-#define INT_850_LLPC_LCD_CTRL_CAN_BE_OFF (40 + IH2_BASE)
3551-#define INT_850_LLPC_OE_FALLING (41 + IH2_BASE)
3552-#define INT_850_LLPC_OE_RISING (42 + IH2_BASE)
3553-#define INT_850_LLPC_VSYNC (43 + IH2_BASE)
3554-#define INT_850_WAKE_UP_REQ (46 + IH2_BASE)
3555-#define INT_850_DMA_CH6 (53 + IH2_BASE)
3556-#define INT_850_DMA_CH7 (54 + IH2_BASE)
3557-#define INT_850_DMA_CH8 (55 + IH2_BASE)
3558-#define INT_850_DMA_CH9 (56 + IH2_BASE)
3559-#define INT_850_DMA_CH10 (57 + IH2_BASE)
3560-#define INT_850_DMA_CH11 (58 + IH2_BASE)
3561-#define INT_850_DMA_CH12 (59 + IH2_BASE)
3562-#define INT_850_DMA_CH13 (60 + IH2_BASE)
3563-#define INT_850_DMA_CH14 (61 + IH2_BASE)
3564-#define INT_850_DMA_CH15 (62 + IH2_BASE)
3565-#define INT_850_NAND (63 + IH2_BASE)
3566+#define INT_7XX_HW_ERRORS (0 + IH2_BASE)
3567+#define INT_7XX_NFIQ_PWR_FAIL (1 + IH2_BASE)
3568+#define INT_7XX_CFCD (2 + IH2_BASE)
3569+#define INT_7XX_CFIREQ (3 + IH2_BASE)
3570+#define INT_7XX_I2C (4 + IH2_BASE)
3571+#define INT_7XX_PCC (5 + IH2_BASE)
3572+#define INT_7XX_MPU_EXT_NIRQ (6 + IH2_BASE)
3573+#define INT_7XX_SPI_100K_1 (7 + IH2_BASE)
3574+#define INT_7XX_SYREN_SPI (8 + IH2_BASE)
3575+#define INT_7XX_VLYNQ (9 + IH2_BASE)
3576+#define INT_7XX_GPIO_BANK4 (10 + IH2_BASE)
3577+#define INT_7XX_McBSP1TX (11 + IH2_BASE)
3578+#define INT_7XX_McBSP1RX (12 + IH2_BASE)
3579+#define INT_7XX_McBSP1RX_OF (13 + IH2_BASE)
3580+#define INT_7XX_UART_MODEM_IRDA_2 (14 + IH2_BASE)
3581+#define INT_7XX_UART_MODEM_1 (15 + IH2_BASE)
3582+#define INT_7XX_MCSI (16 + IH2_BASE)
3583+#define INT_7XX_uWireTX (17 + IH2_BASE)
3584+#define INT_7XX_uWireRX (18 + IH2_BASE)
3585+#define INT_7XX_SMC_CD (19 + IH2_BASE)
3586+#define INT_7XX_SMC_IREQ (20 + IH2_BASE)
3587+#define INT_7XX_HDQ_1WIRE (21 + IH2_BASE)
3588+#define INT_7XX_TIMER32K (22 + IH2_BASE)
3589+#define INT_7XX_MMC_SDIO (23 + IH2_BASE)
3590+#define INT_7XX_UPLD (24 + IH2_BASE)
3591+#define INT_7XX_USB_HHC_1 (27 + IH2_BASE)
3592+#define INT_7XX_USB_HHC_2 (28 + IH2_BASE)
3593+#define INT_7XX_USB_GENI (29 + IH2_BASE)
3594+#define INT_7XX_USB_OTG (30 + IH2_BASE)
3595+#define INT_7XX_CAMERA_IF (31 + IH2_BASE)
3596+#define INT_7XX_RNG (32 + IH2_BASE)
3597+#define INT_7XX_DUAL_MODE_TIMER (33 + IH2_BASE)
3598+#define INT_7XX_DBB_RF_EN (34 + IH2_BASE)
3599+#define INT_7XX_MPUIO_KEYPAD (35 + IH2_BASE)
3600+#define INT_7XX_SHA1_MD5 (36 + IH2_BASE)
3601+#define INT_7XX_SPI_100K_2 (37 + IH2_BASE)
3602+#define INT_7XX_RNG_IDLE (38 + IH2_BASE)
3603+#define INT_7XX_MPUIO (39 + IH2_BASE)
3604+#define INT_7XX_LLPC_LCD_CTRL_CAN_BE_OFF (40 + IH2_BASE)
3605+#define INT_7XX_LLPC_OE_FALLING (41 + IH2_BASE)
3606+#define INT_7XX_LLPC_OE_RISING (42 + IH2_BASE)
3607+#define INT_7XX_LLPC_VSYNC (43 + IH2_BASE)
3608+#define INT_7XX_WAKE_UP_REQ (46 + IH2_BASE)
3609+#define INT_7XX_DMA_CH6 (53 + IH2_BASE)
3610+#define INT_7XX_DMA_CH7 (54 + IH2_BASE)
3611+#define INT_7XX_DMA_CH8 (55 + IH2_BASE)
3612+#define INT_7XX_DMA_CH9 (56 + IH2_BASE)
3613+#define INT_7XX_DMA_CH10 (57 + IH2_BASE)
3614+#define INT_7XX_DMA_CH11 (58 + IH2_BASE)
3615+#define INT_7XX_DMA_CH12 (59 + IH2_BASE)
3616+#define INT_7XX_DMA_CH13 (60 + IH2_BASE)
3617+#define INT_7XX_DMA_CH14 (61 + IH2_BASE)
3618+#define INT_7XX_DMA_CH15 (62 + IH2_BASE)
3619+#define INT_7XX_NAND (63 + IH2_BASE)
3620 
3621 #define INT_24XX_SYS_NIRQ 7
3622 #define INT_24XX_SDMA_IRQ0 12
3623--- a/arch/arm/plat-omap/include/mach/mcbsp.h
3624+++ b/arch/arm/plat-omap/include/mach/mcbsp.h
3625@@ -30,8 +30,8 @@
3626 #include <mach/hardware.h>
3627 #include <mach/clock.h>
3628 
3629-#define OMAP730_MCBSP1_BASE 0xfffb1000
3630-#define OMAP730_MCBSP2_BASE 0xfffb1800
3631+#define OMAP7XX_MCBSP1_BASE 0xfffb1000
3632+#define OMAP7XX_MCBSP2_BASE 0xfffb1800
3633 
3634 #define OMAP1510_MCBSP1_BASE 0xe1011800
3635 #define OMAP1510_MCBSP2_BASE 0xfffb1000
3636@@ -58,7 +58,7 @@
3637 #define OMAP44XX_MCBSP3_BASE 0x49026000
3638 #define OMAP44XX_MCBSP4_BASE 0x48074000
3639 
3640-#if defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP730)
3641+#if defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
3642 
3643 #define OMAP_MCBSP_REG_DRR2 0x00
3644 #define OMAP_MCBSP_REG_DRR1 0x02
3645--- a/arch/arm/plat-omap/include/mach/mux.h
3646+++ b/arch/arm/plat-omap/include/mach/mux.h
3647@@ -51,23 +51,13 @@
3648                     .pu_pd_reg = PU_PD_SEL_##reg, \
3649                     .pu_pd_val = status,
3650 
3651-#define MUX_REG_730(reg, mode_offset, mode) .mux_reg_name = "OMAP730_IO_CONF_"#reg, \
3652- .mux_reg = OMAP730_IO_CONF_##reg, \
3653+#define MUX_REG_7XX(reg, mode_offset, mode) .mux_reg_name = "OMAP7XX_IO_CONF_"#reg, \
3654+ .mux_reg = OMAP7XX_IO_CONF_##reg, \
3655                     .mask_offset = mode_offset, \
3656                     .mask = mode,
3657 
3658-#define PULL_REG_730(reg, bit, status) .pull_name = "OMAP730_IO_CONF_"#reg, \
3659- .pull_reg = OMAP730_IO_CONF_##reg, \
3660- .pull_bit = bit, \
3661- .pull_val = status,
3662-
3663-#define MUX_REG_850(reg, mode_offset, mode) .mux_reg_name = "OMAP850_IO_CONF_"#reg, \
3664- .mux_reg = OMAP850_IO_CONF_##reg, \
3665- .mask_offset = mode_offset, \
3666- .mask = mode,
3667-
3668-#define PULL_REG_850(reg, bit, status) .pull_name = "OMAP850_IO_CONF_"#reg, \
3669- .pull_reg = OMAP850_IO_CONF_##reg, \
3670+#define PULL_REG_7XX(reg, bit, status) .pull_name = "OMAP7XX_IO_CONF_"#reg, \
3671+ .pull_reg = OMAP7XX_IO_CONF_##reg, \
3672                     .pull_bit = bit, \
3673                     .pull_val = status,
3674 
3675@@ -84,21 +74,12 @@
3676 #define PU_PD_REG(reg, status) .pu_pd_reg = PU_PD_SEL_##reg, \
3677                     .pu_pd_val = status,
3678 
3679-#define MUX_REG_730(reg, mode_offset, mode) \
3680- .mux_reg = OMAP730_IO_CONF_##reg, \
3681+#define MUX_REG_7XX(reg, mode_offset, mode) \
3682+ .mux_reg = OMAP7XX_IO_CONF_##reg, \
3683                     .mask_offset = mode_offset, \
3684                     .mask = mode,
3685 
3686-#define PULL_REG_730(reg, bit, status) .pull_reg = OMAP730_IO_CONF_##reg, \
3687- .pull_bit = bit, \
3688- .pull_val = status,
3689-
3690-#define MUX_REG_850(reg, mode_offset, mode) \
3691- .mux_reg = OMAP850_IO_CONF_##reg, \
3692- .mask_offset = mode_offset, \
3693- .mask = mode,
3694-
3695-#define PULL_REG_850(reg, bit, status) .pull_reg = OMAP850_IO_CONF_##reg, \
3696+#define PULL_REG_7XX(reg, bit, status) .pull_reg = OMAP7XX_IO_CONF_##reg, \
3697                     .pull_bit = bit, \
3698                     .pull_val = status,
3699 
3700@@ -118,32 +99,21 @@
3701 
3702 /*
3703  * OMAP730/850 has a slightly different config for the pin mux.
3704- * - config regs are the OMAP730_IO_CONF_x regs (see omap730.h) regs and
3705+ * - config regs are the OMAP7XX_IO_CONF_x regs (see omap730.h) regs and
3706  * not the FUNC_MUX_CTRL_x regs from hardware.h
3707  * - for pull-up/down, only has one enable bit which is is in the same register
3708  * as mux config
3709  */
3710-#define MUX_CFG_730(desc, mux_reg, mode_offset, mode, \
3711+#define MUX_CFG_7XX(desc, mux_reg, mode_offset, mode, \
3712            pull_bit, pull_status, debug_status)\
3713 { \
3714     .name = desc, \
3715     .debug = debug_status, \
3716- MUX_REG_730(mux_reg, mode_offset, mode) \
3717- PULL_REG_730(mux_reg, pull_bit, pull_status) \
3718+ MUX_REG_7XX(mux_reg, mode_offset, mode) \
3719+ PULL_REG_7XX(mux_reg, pull_bit, pull_status) \
3720     PU_PD_REG(NA, 0) \
3721 },
3722 
3723-#define MUX_CFG_850(desc, mux_reg, mode_offset, mode, \
3724- pull_bit, pull_status, debug_status)\
3725-{ \
3726- .name = desc, \
3727- .debug = debug_status, \
3728- MUX_REG_850(mux_reg, mode_offset, mode) \
3729- PULL_REG_850(mux_reg, pull_bit, pull_status) \
3730- PU_PD_REG(NA, 0) \
3731-},
3732-
3733-
3734 #define MUX_CFG_24XX(desc, reg_offset, mode, \
3735                 pull_en, pull_mode, dbg) \
3736 { \
3737@@ -232,45 +202,25 @@ struct pin_config {
3738 
3739 };
3740 
3741-enum omap730_index {
3742+enum omap7xx_index {
3743     /* OMAP 730 keyboard */
3744- E2_730_KBR0,
3745- J7_730_KBR1,
3746- E1_730_KBR2,
3747- F3_730_KBR3,
3748- D2_730_KBR4,
3749- C2_730_KBC0,
3750- D3_730_KBC1,
3751- E4_730_KBC2,
3752- F4_730_KBC3,
3753- E3_730_KBC4,
3754-
3755- /* USB */
3756- AA17_730_USB_DM,
3757- W16_730_USB_PU_EN,
3758- W17_730_USB_VBUSI,
3759-};
3760-
3761-enum omap850_index {
3762- /* OMAP 850 keyboard */
3763- E2_850_KBR0,
3764- J7_850_KBR1,
3765- E1_850_KBR2,
3766- F3_850_KBR3,
3767- D2_850_KBR4,
3768- C2_850_KBC0,
3769- D3_850_KBC1,
3770- E4_850_KBC2,
3771- F4_850_KBC3,
3772- E3_850_KBC4,
3773+ E2_7XX_KBR0,
3774+ J7_7XX_KBR1,
3775+ E1_7XX_KBR2,
3776+ F3_7XX_KBR3,
3777+ D2_7XX_KBR4,
3778+ C2_7XX_KBC0,
3779+ D3_7XX_KBC1,
3780+ E4_7XX_KBC2,
3781+ F4_7XX_KBC3,
3782+ E3_7XX_KBC4,
3783 
3784     /* USB */
3785- AA17_850_USB_DM,
3786- W16_850_USB_PU_EN,
3787- W17_850_USB_VBUSI,
3788+ AA17_7XX_USB_DM,
3789+ W16_7XX_USB_PU_EN,
3790+ W17_7XX_USB_VBUSI,
3791 };
3792 
3793-
3794 enum omap1xxx_index {
3795     /* UART1 (BT_UART_GATING)*/
3796     UART1_TX = 0,
3797--- a/arch/arm/plat-omap/include/mach/omap34xx.h
3798+++ b/arch/arm/plat-omap/include/mach/omap34xx.h
3799@@ -74,8 +74,12 @@
3800 
3801 #define OMAP34XX_IVA_INTC_BASE 0x40000000
3802 #define OMAP34XX_HSUSB_OTG_BASE (L4_34XX_BASE + 0xAB000)
3803-#define OMAP34XX_HSUSB_HOST_BASE (L4_34XX_BASE + 0x64000)
3804 #define OMAP34XX_USBTLL_BASE (L4_34XX_BASE + 0x62000)
3805+#define OMAP34XX_UHH_CONFIG_BASE (L4_34XX_BASE + 0x64000)
3806+#define OMAP34XX_OHCI_BASE (L4_34XX_BASE + 0x64400)
3807+#define OMAP34XX_EHCI_BASE (L4_34XX_BASE + 0x64800)
3808+#define OMAP34XX_SR1_BASE 0x480C9000
3809+#define OMAP34XX_SR2_BASE 0x480CB000
3810 
3811 #define OMAP34XX_MAILBOX_BASE (L4_34XX_BASE + 0x94000)
3812 
3813--- a/arch/arm/plat-omap/include/mach/omap44xx.h
3814+++ b/arch/arm/plat-omap/include/mach/omap44xx.h
3815@@ -22,6 +22,9 @@
3816 #define L4_PER_44XX_BASE 0x48000000
3817 #define L4_EMU_44XX_BASE 0x54000000
3818 #define L3_44XX_BASE 0x44000000
3819+#define OMAP44XX_EMIF1_BASE 0x4c000000
3820+#define OMAP44XX_EMIF2_BASE 0x4d000000
3821+#define OMAP44XX_DMM_BASE 0x4e000000
3822 #define OMAP4430_32KSYNCT_BASE 0x4a304000
3823 #define OMAP4430_CM_BASE 0x4a004000
3824 #define OMAP4430_PRM_BASE 0x48306000
3825@@ -33,14 +36,9 @@
3826 #define IRQ_SIR_IRQ 0x0040
3827 #define OMAP44XX_GIC_DIST_BASE 0x48241000
3828 #define OMAP44XX_GIC_CPU_BASE 0x48240100
3829-#define OMAP44XX_VA_GIC_CPU_BASE OMAP2_IO_ADDRESS(OMAP44XX_GIC_CPU_BASE)
3830 #define OMAP44XX_SCU_BASE 0x48240000
3831-#define OMAP44XX_VA_SCU_BASE OMAP2_IO_ADDRESS(OMAP44XX_SCU_BASE)
3832 #define OMAP44XX_LOCAL_TWD_BASE 0x48240600
3833-#define OMAP44XX_VA_LOCAL_TWD_BASE OMAP2_IO_ADDRESS(OMAP44XX_LOCAL_TWD_BASE)
3834-#define OMAP44XX_LOCAL_TWD_SIZE 0x00000100
3835 #define OMAP44XX_WKUPGEN_BASE 0x48281000
3836-#define OMAP44XX_VA_WKUPGEN_BASE OMAP2_IO_ADDRESS(OMAP44XX_WKUPGEN_BASE)
3837 
3838 #endif /* __ASM_ARCH_OMAP44XX_H */
3839 
3840--- /dev/null
3841+++ b/arch/arm/plat-omap/include/mach/omap7xx.h
3842@@ -0,0 +1,104 @@
3843+/* arch/arm/plat-omap/include/mach/omap7xx.h
3844+ *
3845+ * Hardware definitions for TI OMAP7XX processor.
3846+ *
3847+ * Cleanup for Linux-2.6 by Dirk Behme <dirk.behme@de.bosch.com>
3848+ * Adapted for omap850 by Zebediah C. McClure <zmc@lurian.net>
3849+ * Adapted for omap7xx by Alistair Buxton <a.j.buxton@gmail.com>
3850+ *
3851+ * This program is free software; you can redistribute it and/or modify it
3852+ * under the terms of the GNU General Public License as published by the
3853+ * Free Software Foundation; either version 2 of the License, or (at your
3854+ * option) any later version.
3855+ *
3856+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
3857+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
3858+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
3859+ * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
3860+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
3861+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
3862+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
3863+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3864+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
3865+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3866+ *
3867+ * You should have received a copy of the GNU General Public License along
3868+ * with this program; if not, write to the Free Software Foundation, Inc.,
3869+ * 675 Mass Ave, Cambridge, MA 02139, USA.
3870+ */
3871+
3872+#ifndef __ASM_ARCH_OMAP7XX_H
3873+#define __ASM_ARCH_OMAP7XX_H
3874+
3875+/*
3876+ * ----------------------------------------------------------------------------
3877+ * Base addresses
3878+ * ----------------------------------------------------------------------------
3879+ */
3880+
3881+/* Syntax: XX_BASE = Virtual base address, XX_START = Physical base address */
3882+
3883+#define OMAP7XX_DSP_BASE 0xE0000000
3884+#define OMAP7XX_DSP_SIZE 0x50000
3885+#define OMAP7XX_DSP_START 0xE0000000
3886+
3887+#define OMAP7XX_DSPREG_BASE 0xE1000000
3888+#define OMAP7XX_DSPREG_SIZE SZ_128K
3889+#define OMAP7XX_DSPREG_START 0xE1000000
3890+
3891+/*
3892+ * ----------------------------------------------------------------------------
3893+ * OMAP7XX specific configuration registers
3894+ * ----------------------------------------------------------------------------
3895+ */
3896+#define OMAP7XX_CONFIG_BASE 0xfffe1000
3897+#define OMAP7XX_IO_CONF_0 0xfffe1070
3898+#define OMAP7XX_IO_CONF_1 0xfffe1074
3899+#define OMAP7XX_IO_CONF_2 0xfffe1078
3900+#define OMAP7XX_IO_CONF_3 0xfffe107c
3901+#define OMAP7XX_IO_CONF_4 0xfffe1080
3902+#define OMAP7XX_IO_CONF_5 0xfffe1084
3903+#define OMAP7XX_IO_CONF_6 0xfffe1088
3904+#define OMAP7XX_IO_CONF_7 0xfffe108c
3905+#define OMAP7XX_IO_CONF_8 0xfffe1090
3906+#define OMAP7XX_IO_CONF_9 0xfffe1094
3907+#define OMAP7XX_IO_CONF_10 0xfffe1098
3908+#define OMAP7XX_IO_CONF_11 0xfffe109c
3909+#define OMAP7XX_IO_CONF_12 0xfffe10a0
3910+#define OMAP7XX_IO_CONF_13 0xfffe10a4
3911+
3912+#define OMAP7XX_MODE_1 0xfffe1010
3913+#define OMAP7XX_MODE_2 0xfffe1014
3914+
3915+/* CSMI specials: in terms of base + offset */
3916+#define OMAP7XX_MODE2_OFFSET 0x14
3917+
3918+/*
3919+ * ----------------------------------------------------------------------------
3920+ * OMAP7XX traffic controller configuration registers
3921+ * ----------------------------------------------------------------------------
3922+ */
3923+#define OMAP7XX_FLASH_CFG_0 0xfffecc10
3924+#define OMAP7XX_FLASH_ACFG_0 0xfffecc50
3925+#define OMAP7XX_FLASH_CFG_1 0xfffecc14
3926+#define OMAP7XX_FLASH_ACFG_1 0xfffecc54
3927+
3928+/*
3929+ * ----------------------------------------------------------------------------
3930+ * OMAP7XX DSP control registers
3931+ * ----------------------------------------------------------------------------
3932+ */
3933+#define OMAP7XX_ICR_BASE 0xfffbb800
3934+#define OMAP7XX_DSP_M_CTL 0xfffbb804
3935+#define OMAP7XX_DSP_MMU_BASE 0xfffed200
3936+
3937+/*
3938+ * ----------------------------------------------------------------------------
3939+ * OMAP7XX PCC_UPLD configuration registers
3940+ * ----------------------------------------------------------------------------
3941+ */
3942+#define OMAP7XX_PCC_UPLD_CTRL_BASE (0xfffe0900)
3943+#define OMAP7XX_PCC_UPLD_CTRL (OMAP7XX_PCC_UPLD_CTRL_BASE + 0x00)
3944+
3945+#endif /* __ASM_ARCH_OMAP7XX_H */
3946+
3947--- a/arch/arm/plat-omap/include/mach/sdrc.h
3948+++ b/arch/arm/plat-omap/include/mach/sdrc.h
3949@@ -80,11 +80,11 @@
3950  */
3951 
3952 #define OMAP242X_SMS_REGADDR(reg) \
3953- (void __iomem *)OMAP2_IO_ADDRESS(OMAP2420_SMS_BASE + reg)
3954+ (void __iomem *)OMAP2_L3_IO_ADDRESS(OMAP2420_SMS_BASE + reg)
3955 #define OMAP243X_SMS_REGADDR(reg) \
3956- (void __iomem *)OMAP2_IO_ADDRESS(OMAP243X_SMS_BASE + reg)
3957+ (void __iomem *)OMAP2_L3_IO_ADDRESS(OMAP243X_SMS_BASE + reg)
3958 #define OMAP343X_SMS_REGADDR(reg) \
3959- (void __iomem *)OMAP2_IO_ADDRESS(OMAP343X_SMS_BASE + reg)
3960+ (void __iomem *)OMAP2_L3_IO_ADDRESS(OMAP343X_SMS_BASE + reg)
3961 
3962 /* SMS register offsets - read/write with sms_{read,write}_reg() */
3963 
3964--- a/arch/arm/plat-omap/include/mach/serial.h
3965+++ b/arch/arm/plat-omap/include/mach/serial.h
3966@@ -20,26 +20,22 @@
3967 #define OMAP_UART1_BASE 0xfffb0000
3968 #define OMAP_UART2_BASE 0xfffb0800
3969 #define OMAP_UART3_BASE 0xfffb9800
3970-#define OMAP_MAX_NR_PORTS 3
3971 #elif defined(CONFIG_ARCH_OMAP2)
3972 /* OMAP2 serial ports */
3973 #define OMAP_UART1_BASE 0x4806a000
3974 #define OMAP_UART2_BASE 0x4806c000
3975 #define OMAP_UART3_BASE 0x4806e000
3976-#define OMAP_MAX_NR_PORTS 3
3977 #elif defined(CONFIG_ARCH_OMAP3)
3978 /* OMAP3 serial ports */
3979 #define OMAP_UART1_BASE 0x4806a000
3980 #define OMAP_UART2_BASE 0x4806c000
3981 #define OMAP_UART3_BASE 0x49020000
3982-#define OMAP_MAX_NR_PORTS 3
3983 #elif defined(CONFIG_ARCH_OMAP4)
3984 /* OMAP4 serial ports */
3985 #define OMAP_UART1_BASE 0x4806a000
3986 #define OMAP_UART2_BASE 0x4806c000
3987 #define OMAP_UART3_BASE 0x48020000
3988 #define OMAP_UART4_BASE 0x4806e000
3989-#define OMAP_MAX_NR_PORTS 4
3990 #endif
3991 
3992 #define OMAP1510_BASE_BAUD (12000000/16)
3993--- a/arch/arm/plat-omap/include/mach/uncompress.h
3994+++ b/arch/arm/plat-omap/include/mach/uncompress.h
3995@@ -25,6 +25,7 @@ unsigned int system_rev;
3996 
3997 #define UART_OMAP_MDR1 0x08 /* mode definition register */
3998 #define OMAP_ID_730 0x355F
3999+#define OMAP_ID_850 0x362C
4000 #define ID_MASK 0x7fff
4001 #define check_port(base, shift) ((base[UART_OMAP_MDR1 << shift] & 7) == 0)
4002 #define omap_get_id() ((*(volatile unsigned int *)(0xfffed404)) >> 12) & ID_MASK
4003@@ -53,7 +54,7 @@ static void putc(int c)
4004         /* MMU is not on, so cpu_is_omapXXXX() won't work here */
4005         unsigned int omap_id = omap_get_id();
4006 
4007- if (omap_id == OMAP_ID_730)
4008+ if (omap_id == OMAP_ID_730 || omap_id == OMAP_ID_850)
4009             shift = 0;
4010 
4011         if (check_port(uart, shift))
4012--- a/arch/arm/plat-omap/include/mach/usb.h
4013+++ b/arch/arm/plat-omap/include/mach/usb.h
4014@@ -5,6 +5,21 @@
4015 
4016 #include <mach/board.h>
4017 
4018+#define OMAP3_HS_USB_PORTS 3
4019+enum ehci_hcd_omap_mode {
4020+ EHCI_HCD_OMAP_MODE_UNKNOWN,
4021+ EHCI_HCD_OMAP_MODE_PHY,
4022+ EHCI_HCD_OMAP_MODE_TLL,
4023+};
4024+
4025+struct ehci_hcd_omap_platform_data {
4026+ enum ehci_hcd_omap_mode port_mode[OMAP3_HS_USB_PORTS];
4027+ unsigned phy_reset:1;
4028+
4029+ /* have to be valid if phy_reset is true and portx is in phy mode */
4030+ int reset_gpio_port[OMAP3_HS_USB_PORTS];
4031+};
4032+
4033 /*-------------------------------------------------------------------------*/
4034 
4035 #define OMAP1_OTG_BASE 0xfffb0400
4036@@ -29,6 +44,8 @@
4037 
4038 extern void usb_musb_init(void);
4039 
4040+extern void usb_ehci_init(struct ehci_hcd_omap_platform_data *pdata);
4041+
4042 #endif
4043 
4044 void omap_usb_init(struct omap_usb_config *pdata);
4045--- a/arch/arm/plat-omap/include/mach/vmalloc.h
4046+++ b/arch/arm/plat-omap/include/mach/vmalloc.h
4047@@ -17,5 +17,5 @@
4048  * along with this program; if not, write to the Free Software
4049  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
4050  */
4051-#define VMALLOC_END (PAGE_OFFSET + 0x18000000)
4052+#define VMALLOC_END (PAGE_OFFSET + 0x38000000)
4053 
4054--- a/arch/arm/plat-omap/io.c
4055+++ b/arch/arm/plat-omap/io.c
4056@@ -13,7 +13,7 @@
4057 #include <linux/io.h>
4058 #include <linux/mm.h>
4059 
4060-#include <mach/omap730.h>
4061+#include <mach/omap7xx.h>
4062 #include <mach/omap1510.h>
4063 #include <mach/omap16xx.h>
4064 #include <mach/omap24xx.h>
4065@@ -33,13 +33,13 @@ void __iomem *omap_ioremap(unsigned long
4066         if (BETWEEN(p, OMAP1_IO_PHYS, OMAP1_IO_SIZE))
4067             return XLATE(p, OMAP1_IO_PHYS, OMAP1_IO_VIRT);
4068     }
4069- if (cpu_is_omap730()) {
4070- if (BETWEEN(p, OMAP730_DSP_BASE, OMAP730_DSP_SIZE))
4071- return XLATE(p, OMAP730_DSP_BASE, OMAP730_DSP_START);
4072-
4073- if (BETWEEN(p, OMAP730_DSPREG_BASE, OMAP730_DSPREG_SIZE))
4074- return XLATE(p, OMAP730_DSPREG_BASE,
4075- OMAP730_DSPREG_START);
4076+ if (cpu_is_omap7xx()) {
4077+ if (BETWEEN(p, OMAP7XX_DSP_BASE, OMAP7XX_DSP_SIZE))
4078+ return XLATE(p, OMAP7XX_DSP_BASE, OMAP7XX_DSP_START);
4079+
4080+ if (BETWEEN(p, OMAP7XX_DSPREG_BASE, OMAP7XX_DSPREG_SIZE))
4081+ return XLATE(p, OMAP7XX_DSPREG_BASE,
4082+ OMAP7XX_DSPREG_START);
4083     }
4084     if (cpu_is_omap15xx()) {
4085         if (BETWEEN(p, OMAP1510_DSP_BASE, OMAP1510_DSP_SIZE))
4086@@ -114,6 +114,14 @@ void __iomem *omap_ioremap(unsigned long
4087             return XLATE(p, L4_WK_44XX_PHYS, L4_WK_44XX_VIRT);
4088         if (BETWEEN(p, OMAP44XX_GPMC_PHYS, OMAP44XX_GPMC_SIZE))
4089             return XLATE(p, OMAP44XX_GPMC_PHYS, OMAP44XX_GPMC_VIRT);
4090+ if (BETWEEN(p, OMAP44XX_EMIF1_PHYS, OMAP44XX_EMIF1_SIZE))
4091+ return XLATE(p, OMAP44XX_EMIF1_PHYS, \
4092+ OMAP44XX_EMIF1_VIRT);
4093+ if (BETWEEN(p, OMAP44XX_EMIF2_PHYS, OMAP44XX_EMIF2_SIZE))
4094+ return XLATE(p, OMAP44XX_EMIF2_PHYS, \
4095+ OMAP44XX_EMIF2_VIRT);
4096+ if (BETWEEN(p, OMAP44XX_DMM_PHYS, OMAP44XX_DMM_SIZE))
4097+ return XLATE(p, OMAP44XX_DMM_PHYS, OMAP44XX_DMM_VIRT);
4098         if (BETWEEN(p, L4_PER_44XX_PHYS, L4_PER_44XX_SIZE))
4099             return XLATE(p, L4_PER_44XX_PHYS, L4_PER_44XX_VIRT);
4100         if (BETWEEN(p, L4_EMU_44XX_PHYS, L4_EMU_44XX_SIZE))
4101@@ -142,7 +150,7 @@ u8 omap_readb(u32 pa)
4102     if (cpu_class_is_omap1())
4103         return __raw_readb(OMAP1_IO_ADDRESS(pa));
4104     else
4105- return __raw_readb(OMAP2_IO_ADDRESS(pa));
4106+ return __raw_readb(OMAP2_L4_IO_ADDRESS(pa));
4107 }
4108 EXPORT_SYMBOL(omap_readb);
4109 
4110@@ -151,7 +159,7 @@ u16 omap_readw(u32 pa)
4111     if (cpu_class_is_omap1())
4112         return __raw_readw(OMAP1_IO_ADDRESS(pa));
4113     else
4114- return __raw_readw(OMAP2_IO_ADDRESS(pa));
4115+ return __raw_readw(OMAP2_L4_IO_ADDRESS(pa));
4116 }
4117 EXPORT_SYMBOL(omap_readw);
4118 
4119@@ -160,7 +168,7 @@ u32 omap_readl(u32 pa)
4120     if (cpu_class_is_omap1())
4121         return __raw_readl(OMAP1_IO_ADDRESS(pa));
4122     else
4123- return __raw_readl(OMAP2_IO_ADDRESS(pa));
4124+ return __raw_readl(OMAP2_L4_IO_ADDRESS(pa));
4125 }
4126 EXPORT_SYMBOL(omap_readl);
4127 
4128@@ -169,7 +177,7 @@ void omap_writeb(u8 v, u32 pa)
4129     if (cpu_class_is_omap1())
4130         __raw_writeb(v, OMAP1_IO_ADDRESS(pa));
4131     else
4132- __raw_writeb(v, OMAP2_IO_ADDRESS(pa));
4133+ __raw_writeb(v, OMAP2_L4_IO_ADDRESS(pa));
4134 }
4135 EXPORT_SYMBOL(omap_writeb);
4136 
4137@@ -178,7 +186,7 @@ void omap_writew(u16 v, u32 pa)
4138     if (cpu_class_is_omap1())
4139         __raw_writew(v, OMAP1_IO_ADDRESS(pa));
4140     else
4141- __raw_writew(v, OMAP2_IO_ADDRESS(pa));
4142+ __raw_writew(v, OMAP2_L4_IO_ADDRESS(pa));
4143 }
4144 EXPORT_SYMBOL(omap_writew);
4145 
4146@@ -187,6 +195,6 @@ void omap_writel(u32 v, u32 pa)
4147     if (cpu_class_is_omap1())
4148         __raw_writel(v, OMAP1_IO_ADDRESS(pa));
4149     else
4150- __raw_writel(v, OMAP2_IO_ADDRESS(pa));
4151+ __raw_writel(v, OMAP2_L4_IO_ADDRESS(pa));
4152 }
4153 EXPORT_SYMBOL(omap_writel);
4154--- a/arch/arm/plat-omap/omap_device.c
4155+++ b/arch/arm/plat-omap/omap_device.c
4156@@ -103,21 +103,6 @@
4157 /* Private functions */
4158 
4159 /**
4160- * _read_32ksynct - read the OMAP 32K sync timer
4161- *
4162- * Returns the current value of the 32KiHz synchronization counter.
4163- * XXX this should be generalized to simply read the system clocksource.
4164- * XXX this should be moved to a separate synctimer32k.c file
4165- */
4166-static u32 _read_32ksynct(void)
4167-{
4168- if (!cpu_class_is_omap2())
4169- BUG();
4170-
4171- return __raw_readl(OMAP2_IO_ADDRESS(OMAP_32KSYNCT_BASE + 0x010));
4172-}
4173-
4174-/**
4175  * _omap_device_activate - increase device readiness
4176  * @od: struct omap_device *
4177  * @ignore_lat: increase to latency target (0) or full readiness (1)?
4178@@ -133,13 +118,13 @@ static u32 _read_32ksynct(void)
4179  */
4180 static int _omap_device_activate(struct omap_device *od, u8 ignore_lat)
4181 {
4182- u32 a, b;
4183+ struct timespec a, b, c;
4184 
4185     pr_debug("omap_device: %s: activating\n", od->pdev.name);
4186 
4187     while (od->pm_lat_level > 0) {
4188         struct omap_device_pm_latency *odpl;
4189- int act_lat = 0;
4190+ unsigned long long act_lat = 0;
4191 
4192         od->pm_lat_level--;
4193 
4194@@ -149,20 +134,22 @@ static int _omap_device_activate(struct
4195             (od->dev_wakeup_lat <= od->_dev_wakeup_lat_limit))
4196             break;
4197 
4198- a = _read_32ksynct();
4199+ getnstimeofday(&a);
4200 
4201         /* XXX check return code */
4202         odpl->activate_func(od);
4203 
4204- b = _read_32ksynct();
4205+ getnstimeofday(&b);
4206 
4207- act_lat = (b - a) >> 15; /* 32KiHz cycles to microseconds */
4208+ c = timespec_sub(b, a);
4209+ act_lat = timespec_to_ns(&c) * NSEC_PER_USEC;
4210 
4211         pr_debug("omap_device: %s: pm_lat %d: activate: elapsed time "
4212- "%d usec\n", od->pdev.name, od->pm_lat_level, act_lat);
4213+ "%llu usec\n", od->pdev.name, od->pm_lat_level,
4214+ act_lat);
4215 
4216         WARN(act_lat > odpl->activate_lat, "omap_device: %s.%d: "
4217- "activate step %d took longer than expected (%d > %d)\n",
4218+ "activate step %d took longer than expected (%llu > %d)\n",
4219              od->pdev.name, od->pdev.id, od->pm_lat_level,
4220              act_lat, odpl->activate_lat);
4221 
4222@@ -188,13 +175,13 @@ static int _omap_device_activate(struct
4223  */
4224 static int _omap_device_deactivate(struct omap_device *od, u8 ignore_lat)
4225 {
4226- u32 a, b;
4227+ struct timespec a, b, c;
4228 
4229     pr_debug("omap_device: %s: deactivating\n", od->pdev.name);
4230 
4231     while (od->pm_lat_level < od->pm_lats_cnt) {
4232         struct omap_device_pm_latency *odpl;
4233- int deact_lat = 0;
4234+ unsigned long long deact_lat = 0;
4235 
4236         odpl = od->pm_lats + od->pm_lat_level;
4237 
4238@@ -203,23 +190,24 @@ static int _omap_device_deactivate(struc
4239              od->_dev_wakeup_lat_limit))
4240             break;
4241 
4242- a = _read_32ksynct();
4243+ getnstimeofday(&a);
4244 
4245         /* XXX check return code */
4246         odpl->deactivate_func(od);
4247 
4248- b = _read_32ksynct();
4249+ getnstimeofday(&b);
4250 
4251- deact_lat = (b - a) >> 15; /* 32KiHz cycles to microseconds */
4252+ c = timespec_sub(b, a);
4253+ deact_lat = timespec_to_ns(&c) * NSEC_PER_USEC;
4254 
4255         pr_debug("omap_device: %s: pm_lat %d: deactivate: elapsed time "
4256- "%d usec\n", od->pdev.name, od->pm_lat_level,
4257+ "%llu usec\n", od->pdev.name, od->pm_lat_level,
4258              deact_lat);
4259 
4260         WARN(deact_lat > odpl->deactivate_lat, "omap_device: %s.%d: "
4261- "deactivate step %d took longer than expected (%d > %d)\n",
4262- od->pdev.name, od->pdev.id, od->pm_lat_level,
4263- deact_lat, odpl->deactivate_lat);
4264+ "deactivate step %d took longer than expected "
4265+ "(%llu > %d)\n", od->pdev.name, od->pdev.id,
4266+ od->pm_lat_level, deact_lat, odpl->deactivate_lat);
4267 
4268         od->dev_wakeup_lat += odpl->activate_lat;
4269 
4270--- a/arch/arm/plat-omap/sram.c
4271+++ b/arch/arm/plat-omap/sram.c
4272@@ -42,14 +42,14 @@
4273 #define OMAP1_SRAM_VA VMALLOC_END
4274 #define OMAP2_SRAM_PA 0x40200000
4275 #define OMAP2_SRAM_PUB_PA 0x4020f800
4276-#define OMAP2_SRAM_VA 0xe3000000
4277+#define OMAP2_SRAM_VA 0xfe400000
4278 #define OMAP2_SRAM_PUB_VA (OMAP2_SRAM_VA + 0x800)
4279 #define OMAP3_SRAM_PA 0x40200000
4280-#define OMAP3_SRAM_VA 0xe3000000
4281+#define OMAP3_SRAM_VA 0xfe400000
4282 #define OMAP3_SRAM_PUB_PA 0x40208000
4283 #define OMAP3_SRAM_PUB_VA (OMAP3_SRAM_VA + 0x8000)
4284 #define OMAP4_SRAM_PA 0x40200000 /*0x402f0000*/
4285-#define OMAP4_SRAM_VA 0xd7000000 /*0xd70f0000*/
4286+#define OMAP4_SRAM_VA 0xfe400000 /*0xfe4f0000*/
4287 
4288 #if defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
4289 #define SRAM_BOOTLOADER_SZ 0x00
4290@@ -57,16 +57,16 @@
4291 #define SRAM_BOOTLOADER_SZ 0x80
4292 #endif
4293 
4294-#define OMAP24XX_VA_REQINFOPERM0 OMAP2_IO_ADDRESS(0x68005048)
4295-#define OMAP24XX_VA_READPERM0 OMAP2_IO_ADDRESS(0x68005050)
4296-#define OMAP24XX_VA_WRITEPERM0 OMAP2_IO_ADDRESS(0x68005058)
4297-
4298-#define OMAP34XX_VA_REQINFOPERM0 OMAP2_IO_ADDRESS(0x68012848)
4299-#define OMAP34XX_VA_READPERM0 OMAP2_IO_ADDRESS(0x68012850)
4300-#define OMAP34XX_VA_WRITEPERM0 OMAP2_IO_ADDRESS(0x68012858)
4301-#define OMAP34XX_VA_ADDR_MATCH2 OMAP2_IO_ADDRESS(0x68012880)
4302-#define OMAP34XX_VA_SMS_RG_ATT0 OMAP2_IO_ADDRESS(0x6C000048)
4303-#define OMAP34XX_VA_CONTROL_STAT OMAP2_IO_ADDRESS(0x480022F0)
4304+#define OMAP24XX_VA_REQINFOPERM0 OMAP2_L3_IO_ADDRESS(0x68005048)
4305+#define OMAP24XX_VA_READPERM0 OMAP2_L3_IO_ADDRESS(0x68005050)
4306+#define OMAP24XX_VA_WRITEPERM0 OMAP2_L3_IO_ADDRESS(0x68005058)
4307+
4308+#define OMAP34XX_VA_REQINFOPERM0 OMAP2_L3_IO_ADDRESS(0x68012848)
4309+#define OMAP34XX_VA_READPERM0 OMAP2_L3_IO_ADDRESS(0x68012850)
4310+#define OMAP34XX_VA_WRITEPERM0 OMAP2_L3_IO_ADDRESS(0x68012858)
4311+#define OMAP34XX_VA_ADDR_MATCH2 OMAP2_L3_IO_ADDRESS(0x68012880)
4312+#define OMAP34XX_VA_SMS_RG_ATT0 OMAP2_L3_IO_ADDRESS(0x6C000048)
4313+#define OMAP34XX_VA_CONTROL_STAT OMAP2_L4_IO_ADDRESS(0x480022F0)
4314 
4315 #define GP_DEVICE 0x300
4316 
4317--- a/arch/arm/plat-omap/usb.c
4318+++ b/arch/arm/plat-omap/usb.c
4319@@ -614,8 +614,8 @@ omap_otg_init(struct omap_usb_config *co
4320     if (config->otg || config->register_host) {
4321         syscon &= ~HST_IDLE_EN;
4322         ohci_device.dev.platform_data = config;
4323- if (cpu_is_omap730())
4324- ohci_resources[1].start = INT_730_USB_HHC_1;
4325+ if (cpu_is_omap7xx())
4326+ ohci_resources[1].start = INT_7XX_USB_HHC_1;
4327         status = platform_device_register(&ohci_device);
4328         if (status)
4329             pr_debug("can't register OHCI device, %d\n", status);
4330@@ -626,8 +626,8 @@ omap_otg_init(struct omap_usb_config *co
4331     if (config->otg) {
4332         syscon &= ~OTG_IDLE_EN;
4333         otg_device.dev.platform_data = config;
4334- if (cpu_is_omap730())
4335- otg_resources[1].start = INT_730_USB_OTG;
4336+ if (cpu_is_omap7xx())
4337+ otg_resources[1].start = INT_7XX_USB_OTG;
4338         status = platform_device_register(&otg_device);
4339         if (status)
4340             pr_debug("can't register OTG device, %d\n", status);
4341@@ -731,7 +731,7 @@ static inline void omap_1510_usb_init(st
4342 
4343 void __init omap_usb_init(struct omap_usb_config *pdata)
4344 {
4345- if (cpu_is_omap730() || cpu_is_omap16xx() || cpu_is_omap24xx())
4346+ if (cpu_is_omap7xx() || cpu_is_omap16xx() || cpu_is_omap24xx())
4347         omap_otg_init(pdata);
4348     else if (cpu_is_omap15xx())
4349         omap_1510_usb_init(pdata);
4350--- a/drivers/Makefile
4351+++ b/drivers/Makefile
4352@@ -72,7 +72,7 @@ obj-$(CONFIG_GAMEPORT) += input/gamepor
4353 obj-$(CONFIG_INPUT) += input/
4354 obj-$(CONFIG_I2O) += message/
4355 obj-$(CONFIG_RTC_LIB) += rtc/
4356-obj-y += i2c/ media/
4357+obj-y += i2c/ media/ cbus/
4358 obj-$(CONFIG_PPS) += pps/
4359 obj-$(CONFIG_W1) += w1/
4360 obj-$(CONFIG_POWER_SUPPLY) += power/
4361--- /dev/null
4362+++ b/drivers/cbus/Kconfig
4363@@ -0,0 +1,89 @@
4364+#
4365+# CBUS device configuration
4366+#
4367+
4368+menu "CBUS support"
4369+
4370+config CBUS
4371+ depends on ARCH_OMAP
4372+ bool "CBUS support on OMAP"
4373+ ---help---
4374+ CBUS is a proprietary serial protocol by Nokia. It is mainly
4375+ used for accessing Energy Management auxiliary chips.
4376+
4377+ If you want CBUS support, you should say Y here.
4378+
4379+config CBUS_TAHVO
4380+ depends on CBUS
4381+ bool "Support for Tahvo"
4382+ ---help---
4383+ Tahvo is a mixed signal ASIC with some system features
4384+
4385+ If you want Tahvo support, you should say Y here.
4386+
4387+config CBUS_TAHVO_USER
4388+ depends on CBUS_TAHVO
4389+ bool "Support for Tahvo user space functions"
4390+ ---help---
4391+ If you want support for Tahvo's user space read/write etc. functions,
4392+ you should say Y here.
4393+
4394+config CBUS_TAHVO_USB
4395+ depends on CBUS_TAHVO && USB
4396+ tristate "Support for Tahvo USB transceiver"
4397+ ---help---
4398+ If you want Tahvo support for USB transceiver, say Y or M here.
4399+
4400+config CBUS_TAHVO_USB_HOST_BY_DEFAULT
4401+ depends on CBUS_TAHVO_USB && USB_OTG
4402+ boolean "Device in USB host mode by default"
4403+ ---help---
4404+ Say Y here, if you want the device to enter USB host mode
4405+ by default on bootup.
4406+
4407+config CBUS_RETU
4408+ depends on CBUS
4409+ bool "Support for Retu"
4410+ ---help---
4411+ Retu is a mixed signal ASIC with some system features
4412+
4413+ If you want Retu support, you should say Y here.
4414+
4415+config CBUS_RETU_USER
4416+ depends on CBUS_RETU
4417+ bool "Support for Retu user space functions"
4418+ ---help---
4419+ If you want support for Retu's user space read/write etc. functions,
4420+ you should say Y here.
4421+
4422+config CBUS_RETU_POWERBUTTON
4423+ depends on CBUS_RETU
4424+ bool "Support for Retu power button"
4425+ ---help---
4426+ The power button on Nokia 770 is connected to the Retu ASIC.
4427+
4428+ If you want support for the Retu power button, you should say Y here.
4429+
4430+config CBUS_RETU_RTC
4431+ depends on CBUS_RETU && SYSFS
4432+ tristate "Support for Retu pseudo-RTC"
4433+ ---help---
4434+ Say Y here if you want support for the device that alleges to be an
4435+ RTC in Retu. This will expose a sysfs interface for it.
4436+
4437+config CBUS_RETU_WDT
4438+ depends on CBUS_RETU && SYSFS
4439+ tristate "Support for Retu watchdog timer"
4440+ ---help---
4441+ Say Y here if you want support for the watchdog in Retu. This will
4442+ expose a sysfs interface to grok it.
4443+
4444+config CBUS_RETU_HEADSET
4445+ depends on CBUS_RETU && SYSFS
4446+ tristate "Support for headset detection with Retu/Vilma"
4447+ ---help---
4448+ Say Y here if you want support detecting a headset that's connected
4449+ to Retu/Vilma. Detection state and events are exposed through
4450+ sysfs.
4451+
4452+endmenu
4453--- /dev/null
4454+++ b/drivers/cbus/Makefile
4455@@ -0,0 +1,14 @@
4456+#
4457+# Makefile for CBUS.
4458+#
4459+
4460+obj-$(CONFIG_CBUS) += cbus.o
4461+obj-$(CONFIG_CBUS_TAHVO) += tahvo.o
4462+obj-$(CONFIG_CBUS_RETU) += retu.o
4463+obj-$(CONFIG_CBUS_TAHVO_USB) += tahvo-usb.o
4464+obj-$(CONFIG_CBUS_RETU_POWERBUTTON) += retu-pwrbutton.o
4465+obj-$(CONFIG_CBUS_RETU_RTC) += retu-rtc.o
4466+obj-$(CONFIG_CBUS_RETU_WDT) += retu-wdt.o
4467+obj-$(CONFIG_CBUS_TAHVO_USER) += tahvo-user.o
4468+obj-$(CONFIG_CBUS_RETU_USER) += retu-user.o
4469+obj-$(CONFIG_CBUS_RETU_HEADSET) += retu-headset.o
4470--- /dev/null
4471+++ b/drivers/cbus/cbus.c
4472@@ -0,0 +1,293 @@
4473+/*
4474+ * drivers/cbus/cbus.c
4475+ *
4476+ * Support functions for CBUS serial protocol
4477+ *
4478+ * Copyright (C) 2004, 2005 Nokia Corporation
4479+ *
4480+ * Written by Juha Yrjölä <juha.yrjola@nokia.com>,
4481+ * David Weinehall <david.weinehall@nokia.com>, and
4482+ * Mikko Ylinen <mikko.k.ylinen@nokia.com>
4483+ *
4484+ * This file is subject to the terms and conditions of the GNU General
4485+ * Public License. See the file "COPYING" in the main directory of this
4486+ * archive for more details.
4487+ *
4488+ * This program is distributed in the hope that it will be useful,
4489+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
4490+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4491+ * GNU General Public License for more details.
4492+ *
4493+ * You should have received a copy of the GNU General Public License
4494+ * along with this program; if not, write to the Free Software
4495+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
4496+ */
4497+
4498+#include <linux/device.h>
4499+#include <linux/init.h>
4500+#include <linux/kernel.h>
4501+#include <linux/delay.h>
4502+#include <linux/spinlock.h>
4503+#include <linux/gpio.h>
4504+
4505+#include <mach/board.h>
4506+#include <mach/board-nokia.h>
4507+
4508+#include <asm/io.h>
4509+
4510+#include "cbus.h"
4511+
4512+struct cbus_host *cbus_host = NULL;
4513+
4514+#ifdef CONFIG_ARCH_OMAP1
4515+/* We use our own MPUIO functions to get closer to 1MHz bus speed */
4516+
4517+static inline void cbus_set_gpio_direction(u32 base, int mpuio, int is_input)
4518+{
4519+ u16 w;
4520+
4521+ mpuio &= 0x0f;
4522+ w = __raw_readw(base + OMAP_MPUIO_IO_CNTL);
4523+ if (is_input)
4524+ w |= 1 << mpuio;
4525+ else
4526+ w &= ~(1 << mpuio);
4527+ __raw_writew(w, base + OMAP_MPUIO_IO_CNTL);
4528+
4529+}
4530+
4531+static inline void cbus_set_gpio_dataout(u32 base, int mpuio, int enable)
4532+{
4533+ u16 w;
4534+
4535+ mpuio &= 0x0f;
4536+ w = __raw_readw(base + OMAP_MPUIO_OUTPUT);
4537+ if (enable)
4538+ w |= 1 << mpuio;
4539+ else
4540+ w &= ~(1 << mpuio);
4541+ __raw_writew(w, base + OMAP_MPUIO_OUTPUT);
4542+}
4543+
4544+static inline int cbus_get_gpio_datain(u32 base, int mpuio)
4545+{
4546+ mpuio &= 0x0f;
4547+
4548+ return (__raw_readw(base + OMAP_MPUIO_INPUT_LATCH) & (1 << mpuio)) != 0;
4549+}
4550+
4551+static void cbus_send_bit(struct cbus_host *host, u32 base, int bit,
4552+ int set_to_input)
4553+{
4554+ cbus_set_gpio_dataout(base, host->dat_gpio, bit ? 1 : 0);
4555+ cbus_set_gpio_dataout(base, host->clk_gpio, 1);
4556+
4557+ /* The data bit is read on the rising edge of CLK */
4558+ if (set_to_input)
4559+ cbus_set_gpio_direction(base, host->dat_gpio, 1);
4560+
4561+ cbus_set_gpio_dataout(base, host->clk_gpio, 0);
4562+}
4563+
4564+static u8 cbus_receive_bit(struct cbus_host *host, u32 base)
4565+{
4566+ u8 ret;
4567+
4568+ cbus_set_gpio_dataout(base, host->clk_gpio, 1);
4569+ ret = cbus_get_gpio_datain(base, host->dat_gpio);
4570+ cbus_set_gpio_dataout(base, host->clk_gpio, 0);
4571+
4572+ return ret;
4573+}
4574+
4575+#define cbus_output(base, gpio, val) cbus_set_gpio_direction(base, gpio, 0)
4576+
4577+#else
4578+
4579+#define cbus_output(base, gpio, val) gpio_direction_output(gpio, val)
4580+#define cbus_set_gpio_dataout(base, gpio, enable) gpio_set_value(gpio, enable)
4581+#define cbus_get_gpio_datain(base, int, gpio) gpio_get_value(gpio)
4582+
4583+static void _cbus_send_bit(struct cbus_host *host, int bit, int set_to_input)
4584+{
4585+ gpio_set_value(host->dat_gpio, bit ? 1 : 0);
4586+ gpio_set_value(host->clk_gpio, 1);
4587+
4588+ /* The data bit is read on the rising edge of CLK */
4589+ if (set_to_input)
4590+ gpio_direction_input(host->dat_gpio);
4591+
4592+ gpio_set_value(host->clk_gpio, 0);
4593+}
4594+
4595+static u8 _cbus_receive_bit(struct cbus_host *host)
4596+{
4597+ u8 ret;
4598+
4599+ gpio_set_value(host->clk_gpio, 1);
4600+ ret = gpio_get_value(host->dat_gpio);
4601+ gpio_set_value(host->clk_gpio, 0);
4602+
4603+ return ret;
4604+}
4605+
4606+#define cbus_send_bit(host, base, bit, set_to_input) _cbus_send_bit(host, bit, set_to_input)
4607+#define cbus_receive_bit(host, base) _cbus_receive_bit(host)
4608+
4609+#endif
4610+
4611+static int cbus_transfer(struct cbus_host *host, int dev, int reg, int data)
4612+{
4613+ int i;
4614+ int is_read = 0;
4615+ unsigned long flags;
4616+ u32 base;
4617+
4618+#ifdef CONFIG_ARCH_OMAP1
4619+ base = OMAP1_IO_ADDRESS(OMAP_MPUIO_BASE);
4620+#else
4621+ base = 0;
4622+#endif
4623+
4624+ if (data < 0)
4625+ is_read = 1;
4626+
4627+ /* We don't want interrupts disturbing our transfer */
4628+ spin_lock_irqsave(&host->lock, flags);
4629+
4630+ /* Reset state and start of transfer, SEL stays down during transfer */
4631+ cbus_set_gpio_dataout(base, host->sel_gpio, 0);
4632+
4633+ /* Set the DAT pin to output */
4634+ cbus_output(base, host->dat_gpio, 1);
4635+
4636+ /* Send the device address */
4637+ for (i = 3; i > 0; i--)
4638+ cbus_send_bit(host, base, dev & (1 << (i - 1)), 0);
4639+
4640+ /* Send the rw flag */
4641+ cbus_send_bit(host, base, is_read, 0);
4642+
4643+ /* Send the register address */
4644+ for (i = 5; i > 0; i--) {
4645+ int set_to_input = 0;
4646+
4647+ if (is_read && i == 1)
4648+ set_to_input = 1;
4649+
4650+ cbus_send_bit(host, base, reg & (1 << (i - 1)), set_to_input);
4651+ }
4652+
4653+ if (!is_read) {
4654+ for (i = 16; i > 0; i--)
4655+ cbus_send_bit(host, base, data & (1 << (i - 1)), 0);
4656+ } else {
4657+ cbus_set_gpio_dataout(base, host->clk_gpio, 1);
4658+ data = 0;
4659+
4660+ for (i = 16; i > 0; i--) {
4661+ u8 bit = cbus_receive_bit(host, base);
4662+
4663+ if (bit)
4664+ data |= 1 << (i - 1);
4665+ }
4666+ }
4667+
4668+ /* Indicate end of transfer, SEL goes up until next transfer */
4669+ cbus_set_gpio_dataout(base, host->sel_gpio, 1);
4670+ cbus_set_gpio_dataout(base, host->clk_gpio, 1);
4671+ cbus_set_gpio_dataout(base, host->clk_gpio, 0);
4672+
4673+ spin_unlock_irqrestore(&host->lock, flags);
4674+
4675+ return is_read ? data : 0;
4676+}
4677+
4678+/*
4679+ * Read a given register from the device
4680+ */
4681+int cbus_read_reg(struct cbus_host *host, int dev, int reg)
4682+{
4683+ return cbus_host ? cbus_transfer(host, dev, reg, -1) : -ENODEV;
4684+}
4685+
4686+/*
4687+ * Write to a given register of the device
4688+ */
4689+int cbus_write_reg(struct cbus_host *host, int dev, int reg, u16 val)
4690+{
4691+ return cbus_host ? cbus_transfer(host, dev, reg, (int)val) : -ENODEV;
4692+}
4693+
4694+int __init cbus_bus_init(void)
4695+{
4696+ const struct omap_cbus_config * cbus_config;
4697+ struct cbus_host *chost;
4698+ int ret;
4699+
4700+ chost = kmalloc(sizeof (*chost), GFP_KERNEL);
4701+ if (chost == NULL)
4702+ return -ENOMEM;
4703+
4704+ memset(chost, 0, sizeof (*chost));
4705+
4706+ spin_lock_init(&chost->lock);
4707+
4708+ cbus_config = omap_get_config(OMAP_TAG_CBUS, struct omap_cbus_config);
4709+
4710+ if (cbus_config == NULL) {
4711+ printk(KERN_ERR "cbus: Unable to retrieve config data\n");
4712+ return -ENODATA;
4713+ }
4714+
4715+ chost->clk_gpio = cbus_config->clk_gpio;
4716+ chost->dat_gpio = cbus_config->dat_gpio;
4717+ chost->sel_gpio = cbus_config->sel_gpio;
4718+
4719+#ifdef CONFIG_ARCH_OMAP1
4720+ if (!OMAP_GPIO_IS_MPUIO(chost->clk_gpio) ||
4721+ !OMAP_GPIO_IS_MPUIO(chost->dat_gpio) ||
4722+ !OMAP_GPIO_IS_MPUIO(chost->sel_gpio)) {
4723+ printk(KERN_ERR "cbus: Only MPUIO pins supported\n");
4724+ ret = -ENODEV;
4725+ goto exit1;
4726+ }
4727+#endif
4728+
4729+ if ((ret = gpio_request(chost->clk_gpio, "CBUS clk")) < 0)
4730+ goto exit1;
4731+
4732+ if ((ret = gpio_request(chost->dat_gpio, "CBUS data")) < 0)
4733+ goto exit2;
4734+
4735+ if ((ret = gpio_request(chost->sel_gpio, "CBUS sel")) < 0)
4736+ goto exit3;
4737+
4738+ gpio_direction_output(chost->clk_gpio, 0);
4739+ gpio_direction_input(chost->dat_gpio);
4740+ gpio_direction_output(chost->sel_gpio, 1);
4741+
4742+ gpio_set_value(chost->clk_gpio, 1);
4743+ gpio_set_value(chost->clk_gpio, 0);
4744+
4745+ cbus_host = chost;
4746+
4747+ return 0;
4748+exit3:
4749+ gpio_free(chost->dat_gpio);
4750+exit2:
4751+ gpio_free(chost->clk_gpio);
4752+exit1:
4753+ kfree(chost);
4754+ return ret;
4755+}
4756+
4757+subsys_initcall(cbus_bus_init);
4758+
4759+EXPORT_SYMBOL(cbus_host);
4760+EXPORT_SYMBOL(cbus_read_reg);
4761+EXPORT_SYMBOL(cbus_write_reg);
4762+
4763+MODULE_DESCRIPTION("CBUS serial protocol");
4764+MODULE_LICENSE("GPL");
4765+MODULE_AUTHOR("Juha Yrjölä, David Weinehall, and Mikko Ylinen");
4766--- /dev/null
4767+++ b/drivers/cbus/cbus.h
4768@@ -0,0 +1,36 @@
4769+/*
4770+ * drivers/cbus/cbus.h
4771+ *
4772+ * Copyright (C) 2004, 2005 Nokia Corporation
4773+ *
4774+ * Written by Juha Yrjölä <juha.yrjola@nokia.com> and
4775+ * David Weinehall <david.weinehall@nokia.com>
4776+ *
4777+ * This file is subject to the terms and conditions of the GNU General
4778+ * Public License. See the file "COPYING" in the main directory of this
4779+ * archive for more details.
4780+ *
4781+ * This program is distributed in the hope that it will be useful,
4782+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
4783+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4784+ * GNU General Public License for more details.
4785+ *
4786+ * You should have received a copy of the GNU General Public License
4787+ * along with this program; if not, write to the Free Software
4788+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
4789+ */
4790+
4791+#ifndef __DRIVERS_CBUS_CBUS_H
4792+#define __DRIVERS_CBUS_CBUS_H
4793+
4794+struct cbus_host {
4795+ int clk_gpio, dat_gpio, sel_gpio;
4796+ spinlock_t lock;
4797+};
4798+
4799+extern struct cbus_host *cbus_host;
4800+
4801+extern int cbus_read_reg(struct cbus_host *host, int dev, int reg);
4802+extern int cbus_write_reg(struct cbus_host *host, int dev, int reg, u16 val);
4803+
4804+#endif /* __DRIVERS_CBUS_CBUS_H */
4805--- /dev/null
4806+++ b/drivers/cbus/retu-headset.c
4807@@ -0,0 +1,355 @@
4808+/**
4809+ * Retu/Vilma headset detection
4810+ *
4811+ * Copyright (C) 2006 Nokia Corporation
4812+ *
4813+ * Written by Juha Yrjölä
4814+ *
4815+ * This file is subject to the terms and conditions of the GNU General
4816+ * Public License. See the file "COPYING" in the main directory of this
4817+ * archive for more details.
4818+ *
4819+ * This program is distributed in the hope that it will be useful,
4820+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
4821+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4822+ * GNU General Public License for more details.
4823+ *
4824+ * You should have received a copy of the GNU General Public License
4825+ * along with this program; if not, write to the Free Software
4826+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
4827+ */
4828+
4829+#include <linux/module.h>
4830+#include <linux/init.h>
4831+#include <linux/kernel.h>
4832+#include <linux/delay.h>
4833+#include <linux/input.h>
4834+#include <linux/platform_device.h>
4835+
4836+#include "retu.h"
4837+
4838+#define RETU_ADC_CHANNEL_HOOKDET 0x05
4839+
4840+#define RETU_HEADSET_KEY KEY_PHONE
4841+
4842+struct retu_headset {
4843+ spinlock_t lock;
4844+ struct mutex mutex;
4845+ struct platform_device *pdev;
4846+ struct input_dev *idev;
4847+ unsigned bias_enabled;
4848+ unsigned detection_enabled;
4849+ unsigned pressed;
4850+ struct timer_list enable_timer;
4851+ struct timer_list detect_timer;
4852+};
4853+
4854+static void retu_headset_set_bias(int enable)
4855+{
4856+ if (enable) {
4857+ retu_set_clear_reg_bits(RETU_REG_AUDTXR,
4858+ (1 << 0) | (1 << 1), 0);
4859+ msleep(2);
4860+ retu_set_clear_reg_bits(RETU_REG_AUDTXR, 1 << 3, 0);
4861+ } else {
4862+ retu_set_clear_reg_bits(RETU_REG_AUDTXR, 0,
4863+ (1 << 0) | (1 << 1) | (1 << 3));
4864+ }
4865+}
4866+
4867+static void retu_headset_enable(struct retu_headset *hs)
4868+{
4869+ mutex_lock(&hs->mutex);
4870+ if (!hs->bias_enabled) {
4871+ hs->bias_enabled = 1;
4872+ retu_headset_set_bias(1);
4873+ }
4874+ mutex_unlock(&hs->mutex);
4875+}
4876+
4877+static void retu_headset_disable(struct retu_headset *hs)
4878+{
4879+ mutex_lock(&hs->mutex);
4880+ if (hs->bias_enabled) {
4881+ hs->bias_enabled = 0;
4882+ retu_headset_set_bias(0);
4883+ }
4884+ mutex_unlock(&hs->mutex);
4885+}
4886+
4887+static void retu_headset_det_enable(struct retu_headset *hs)
4888+{
4889+ mutex_lock(&hs->mutex);
4890+ if (!hs->detection_enabled) {
4891+ hs->detection_enabled = 1;
4892+ retu_set_clear_reg_bits(RETU_REG_CC1, (1 << 10) | (1 << 8), 0);
4893+ retu_enable_irq(RETU_INT_HOOK);
4894+ }
4895+ mutex_unlock(&hs->mutex);
4896+}
4897+
4898+static void retu_headset_det_disable(struct retu_headset *hs)
4899+{
4900+ unsigned long flags;
4901+
4902+ mutex_lock(&hs->mutex);
4903+ if (hs->detection_enabled) {
4904+ hs->detection_enabled = 0;
4905+ retu_disable_irq(RETU_INT_HOOK);
4906+ del_timer_sync(&hs->enable_timer);
4907+ del_timer_sync(&hs->detect_timer);
4908+ spin_lock_irqsave(&hs->lock, flags);
4909+ if (hs->pressed)
4910+ input_report_key(hs->idev, RETU_HEADSET_KEY, 0);
4911+ spin_unlock_irqrestore(&hs->lock, flags);
4912+ retu_set_clear_reg_bits(RETU_REG_CC1, 0, (1 << 10) | (1 << 8));
4913+ }
4914+ mutex_unlock(&hs->mutex);
4915+}
4916+
4917+static ssize_t retu_headset_hookdet_show(struct device *dev,
4918+ struct device_attribute *attr,
4919+ char *buf)
4920+{
4921+ int val;
4922+
4923+ val = retu_read_adc(RETU_ADC_CHANNEL_HOOKDET);
4924+ return sprintf(buf, "%d\n", val);
4925+}
4926+
4927+static DEVICE_ATTR(hookdet, S_IRUGO, retu_headset_hookdet_show, NULL);
4928+
4929+static ssize_t retu_headset_enable_show(struct device *dev,
4930+ struct device_attribute *attr,
4931+ char *buf)
4932+{
4933+ struct retu_headset *hs = dev_get_drvdata(dev);
4934+
4935+ return sprintf(buf, "%u\n", hs->bias_enabled);
4936+}
4937+
4938+static ssize_t retu_headset_enable_store(struct device *dev,
4939+ struct device_attribute *attr,
4940+ const char *buf, size_t count)
4941+{
4942+ struct retu_headset *hs = dev_get_drvdata(dev);
4943+ int enable;
4944+
4945+ if (sscanf(buf, "%u", &enable) != 1)
4946+ return -EINVAL;
4947+ if (enable)
4948+ retu_headset_enable(hs);
4949+ else
4950+ retu_headset_disable(hs);
4951+ return count;
4952+}
4953+
4954+static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR | S_IWGRP,
4955+ retu_headset_enable_show, retu_headset_enable_store);
4956+
4957+static ssize_t retu_headset_enable_det_show(struct device *dev,
4958+ struct device_attribute *attr,
4959+ char *buf)
4960+{
4961+ struct retu_headset *hs = dev_get_drvdata(dev);
4962+
4963+ return sprintf(buf, "%u\n", hs->detection_enabled);
4964+}
4965+
4966+static ssize_t retu_headset_enable_det_store(struct device *dev,
4967+ struct device_attribute *attr,
4968+ const char *buf, size_t count)
4969+{
4970+ struct retu_headset *hs = dev_get_drvdata(dev);
4971+ int enable;
4972+
4973+ if (sscanf(buf, "%u", &enable) != 1)
4974+ return -EINVAL;
4975+ if (enable)
4976+ retu_headset_det_enable(hs);
4977+ else
4978+ retu_headset_det_disable(hs);
4979+ return count;
4980+}
4981+
4982+static DEVICE_ATTR(enable_det, S_IRUGO | S_IWUSR | S_IWGRP,
4983+ retu_headset_enable_det_show,
4984+ retu_headset_enable_det_store);
4985+
4986+static void retu_headset_hook_interrupt(unsigned long arg)
4987+{
4988+ struct retu_headset *hs = (struct retu_headset *) arg;
4989+ unsigned long flags;
4990+
4991+ retu_ack_irq(RETU_INT_HOOK);
4992+ spin_lock_irqsave(&hs->lock, flags);
4993+ if (!hs->pressed) {
4994+ /* Headset button was just pressed down. */
4995+ hs->pressed = 1;
4996+ input_report_key(hs->idev, RETU_HEADSET_KEY, 1);
4997+ }
4998+ spin_unlock_irqrestore(&hs->lock, flags);
4999+ retu_set_clear_reg_bits(RETU_REG_CC1, 0, (1 << 10) | (1 << 8));
5000+ mod_timer(&hs->enable_timer, jiffies + msecs_to_jiffies(50));
5001+}
5002+
5003+static void retu_headset_enable_timer(unsigned long arg)
5004+{
5005+ struct retu_headset *hs = (struct retu_headset *) arg;
5006+
5007+ retu_set_clear_reg_bits(RETU_REG_CC1, (1 << 10) | (1 << 8), 0);
5008+ mod_timer(&hs->detect_timer, jiffies + msecs_to_jiffies(350));
5009+}
5010+
5011+static void retu_headset_detect_timer(unsigned long arg)
5012+{
5013+ struct retu_headset *hs = (struct retu_headset *) arg;
5014+ unsigned long flags;
5015+
5016+ spin_lock_irqsave(&hs->lock, flags);
5017+ if (hs->pressed) {
5018+ hs->pressed = 0;
5019+ input_report_key(hs->idev, RETU_HEADSET_KEY, 0);
5020+ }
5021+ spin_unlock_irqrestore(&hs->lock, flags);
5022+}
5023+
5024+static int __init retu_headset_probe(struct platform_device *pdev)
5025+{
5026+ struct retu_headset *hs;
5027+ int r;
5028+
5029+ hs = kzalloc(sizeof(*hs), GFP_KERNEL);
5030+ if (hs == NULL)
5031+ return -ENOMEM;
5032+
5033+ hs->pdev = pdev;
5034+
5035+ hs->idev = input_allocate_device();
5036+ if (hs->idev == NULL) {
5037+ r = -ENOMEM;
5038+ goto err1;
5039+ }
5040+ hs->idev->name = "retu-headset";
5041+ hs->idev->dev.parent = &pdev->dev;
5042+ set_bit(EV_KEY, hs->idev->evbit);
5043+ set_bit(RETU_HEADSET_KEY, hs->idev->keybit);
5044+ r = input_register_device(hs->idev);
5045+ if (r < 0)
5046+ goto err2;
5047+
5048+ r = device_create_file(&pdev->dev, &dev_attr_hookdet);
5049+ if (r < 0)
5050+ goto err3;
5051+ r = device_create_file(&pdev->dev, &dev_attr_enable);
5052+ if (r < 0)
5053+ goto err4;
5054+ r = device_create_file(&pdev->dev, &dev_attr_enable_det);
5055+ if (r < 0)
5056+ goto err5;
5057+ platform_set_drvdata(pdev, hs);
5058+
5059+ spin_lock_init(&hs->lock);
5060+ mutex_init(&hs->mutex);
5061+ setup_timer(&hs->enable_timer, retu_headset_enable_timer,
5062+ (unsigned long) hs);
5063+ setup_timer(&hs->detect_timer, retu_headset_detect_timer,
5064+ (unsigned long) hs);
5065+
5066+ r = retu_request_irq(RETU_INT_HOOK, retu_headset_hook_interrupt,
5067+ (unsigned long) hs, "hookdet");
5068+ if (r != 0) {
5069+ dev_err(&pdev->dev, "hookdet IRQ not available\n");
5070+ goto err6;
5071+ }
5072+ retu_disable_irq(RETU_INT_HOOK);
5073+ return 0;
5074+err6:
5075+ device_remove_file(&pdev->dev, &dev_attr_enable_det);
5076+err5:
5077+ device_remove_file(&pdev->dev, &dev_attr_enable);
5078+err4:
5079+ device_remove_file(&pdev->dev, &dev_attr_hookdet);
5080+err3:
5081+ input_unregister_device(hs->idev);
5082+err2:
5083+ input_free_device(hs->idev);
5084+err1:
5085+ kfree(hs);
5086+ return r;
5087+}
5088+
5089+static int retu_headset_remove(struct platform_device *pdev)
5090+{
5091+ struct retu_headset *hs = platform_get_drvdata(pdev);
5092+
5093+ device_remove_file(&pdev->dev, &dev_attr_hookdet);
5094+ device_remove_file(&pdev->dev, &dev_attr_enable);
5095+ device_remove_file(&pdev->dev, &dev_attr_enable_det);
5096+ retu_headset_disable(hs);
5097+ retu_headset_det_disable(hs);
5098+ retu_free_irq(RETU_INT_HOOK);
5099+ input_unregister_device(hs->idev);
5100+ input_free_device(hs->idev);
5101+ return 0;
5102+}
5103+
5104+static int retu_headset_suspend(struct platform_device *pdev,
5105+ pm_message_t mesg)
5106+{
5107+ struct retu_headset *hs = platform_get_drvdata(pdev);
5108+
5109+ mutex_lock(&hs->mutex);
5110+ if (hs->bias_enabled)
5111+ retu_headset_set_bias(0);
5112+ mutex_unlock(&hs->mutex);
5113+
5114+ return 0;
5115+}
5116+
5117+static int retu_headset_resume(struct platform_device *pdev)
5118+{
5119+ struct retu_headset *hs = platform_get_drvdata(pdev);
5120+
5121+ mutex_lock(&hs->mutex);
5122+ if (hs->bias_enabled)
5123+ retu_headset_set_bias(1);
5124+ mutex_unlock(&hs->mutex);
5125+
5126+ return 0;
5127+}
5128+
5129+static struct platform_driver retu_headset_driver = {
5130+ .probe = retu_headset_probe,
5131+ .remove = retu_headset_remove,
5132+ .suspend = retu_headset_suspend,
5133+ .resume = retu_headset_resume,
5134+ .driver = {
5135+ .name = "retu-headset",
5136+ },
5137+};
5138+
5139+static int __init retu_headset_init(void)
5140+{
5141+ int r;
5142+
5143+ printk(KERN_INFO "Retu/Vilma headset driver initializing\n");
5144+
5145+ r = platform_driver_register(&retu_headset_driver);
5146+ if (r < 0)
5147+ return r;
5148+
5149+ return 0;
5150+}
5151+
5152+static void __exit retu_headset_exit(void)
5153+{
5154+ platform_driver_unregister(&retu_headset_driver);
5155+}
5156+
5157+module_init(retu_headset_init);
5158+module_exit(retu_headset_exit);
5159+
5160+MODULE_DESCRIPTION("Retu/Vilma headset detection");
5161+MODULE_LICENSE("GPL");
5162+MODULE_AUTHOR("Juha Yrjölä");
5163--- /dev/null
5164+++ b/drivers/cbus/retu-pwrbutton.c
5165@@ -0,0 +1,118 @@
5166+/**
5167+ * drivers/cbus/retu-pwrbutton.c
5168+ *
5169+ * Driver for sending retu power button event to input-layer
5170+ *
5171+ * Copyright (C) 2004 Nokia Corporation
5172+ *
5173+ * Written by Ari Saastamoinen <ari.saastamoinen@elektrobit.com>
5174+ *
5175+ * Contact Juha Yrjölä <juha.yrjola@nokia.com>
5176+ *
5177+ * This file is subject to the terms and conditions of the GNU General
5178+ * Public License. See the file "COPYING" in the main directory of this
5179+ * archive for more details.
5180+ *
5181+ * This program is distributed in the hope that it will be useful,
5182+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
5183+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5184+ * GNU General Public License for more details.
5185+ *
5186+ * You should have received a copy of the GNU General Public License
5187+ * along with this program; if not, write to the Free Software
5188+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
5189+ */
5190+
5191+#include <linux/module.h>
5192+#include <linux/init.h>
5193+#include <linux/kernel.h>
5194+#include <linux/errno.h>
5195+#include <linux/input.h>
5196+#include <linux/timer.h>
5197+#include <linux/jiffies.h>
5198+#include <linux/bitops.h>
5199+
5200+#include "retu.h"
5201+
5202+#define RETU_STATUS_PWRONX (1 << 5)
5203+
5204+#define PWRBTN_DELAY 20
5205+#define PWRBTN_UP 0
5206+#define PWRBTN_PRESSED 1
5207+
5208+static int pwrbtn_state;
5209+static struct input_dev *pwrbtn_dev;
5210+static struct timer_list pwrbtn_timer;
5211+
5212+static void retubutton_timer_func(unsigned long arg)
5213+{
5214+ int state;
5215+
5216+ if (retu_read_reg(RETU_REG_STATUS) & RETU_STATUS_PWRONX)
5217+ state = PWRBTN_UP;
5218+ else
5219+ state = PWRBTN_PRESSED;
5220+
5221+ if (pwrbtn_state != state) {
5222+ input_report_key(pwrbtn_dev, KEY_POWER, state);
5223+ pwrbtn_state = state;
5224+ }
5225+}
5226+
5227+/**
5228+ * Interrupt function is called whenever power button key is pressed
5229+ * or released.
5230+ */
5231+static void retubutton_irq(unsigned long arg)
5232+{
5233+ retu_ack_irq(RETU_INT_PWR);
5234+ mod_timer(&pwrbtn_timer, jiffies + msecs_to_jiffies(PWRBTN_DELAY));
5235+}
5236+
5237+/**
5238+ * Init function.
5239+ * Allocates interrupt for power button and registers itself to input layer.
5240+ */
5241+static int __init retubutton_init(void)
5242+{
5243+ int irq;
5244+
5245+ printk(KERN_INFO "Retu power button driver initialized\n");
5246+ irq = RETU_INT_PWR;
5247+
5248+ init_timer(&pwrbtn_timer);
5249+ pwrbtn_timer.function = retubutton_timer_func;
5250+
5251+ if (retu_request_irq(irq, &retubutton_irq, 0, "PwrOnX") < 0) {
5252+ printk(KERN_ERR "%s@%s: Cannot allocate irq\n",
5253+ __FUNCTION__, __FILE__);
5254+ return -EBUSY;
5255+ }
5256+
5257+ pwrbtn_dev = input_allocate_device();
5258+ if (!pwrbtn_dev)
5259+ return -ENOMEM;
5260+
5261+ pwrbtn_dev->evbit[0] = BIT_MASK(EV_KEY);
5262+ pwrbtn_dev->keybit[BIT_WORD(KEY_POWER)] = BIT_MASK(KEY_POWER);
5263+ pwrbtn_dev->name = "retu-pwrbutton";
5264+
5265+ return input_register_device(pwrbtn_dev);
5266+}
5267+
5268+/**
5269+ * Cleanup function which is called when driver is unloaded
5270+ */
5271+static void __exit retubutton_exit(void)
5272+{
5273+ retu_free_irq(RETU_INT_PWR);
5274+ del_timer_sync(&pwrbtn_timer);
5275+ input_unregister_device(pwrbtn_dev);
5276+}
5277+
5278+module_init(retubutton_init);
5279+module_exit(retubutton_exit);
5280+
5281+MODULE_DESCRIPTION("Retu Power Button");
5282+MODULE_LICENSE("GPL");
5283+MODULE_AUTHOR("Ari Saastamoinen");
5284--- /dev/null
5285+++ b/drivers/cbus/retu-rtc.c
5286@@ -0,0 +1,477 @@
5287+/**
5288+ * drivers/cbus/retu-rtc.c
5289+ *
5290+ * Support for Retu RTC
5291+ *
5292+ * Copyright (C) 2004, 2005 Nokia Corporation
5293+ *
5294+ * Written by Paul Mundt <paul.mundt@nokia.com> and
5295+ * Igor Stoppa <igor.stoppa@nokia.com>
5296+ *
5297+ * The Retu RTC is essentially a partial read-only RTC that gives us Retu's
5298+ * idea of what time actually is. It's left as a userspace excercise to map
5299+ * this back to time in the real world and ensure that calibration settings
5300+ * are sane to compensate for any horrible drift (on account of not being able
5301+ * to set the clock to anything).
5302+ *
5303+ * Days are semi-writeable. Namely, Retu will only track 255 days for us
5304+ * consecutively, after which the counter is explicitly stuck at 255 until
5305+ * someone comes along and clears it with a write. In the event that no one
5306+ * comes along and clears it, we no longer have any idea what day it is.
5307+ *
5308+ * This file is subject to the terms and conditions of the GNU General
5309+ * Public License. See the file "COPYING" in the main directory of this
5310+ * archive for more details.
5311+ *
5312+ * This program is distributed in the hope that it will be useful,
5313+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
5314+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5315+ * GNU General Public License for more details.
5316+ *
5317+ * You should have received a copy of the GNU General Public License
5318+ * along with this program; if not, write to the Free Software
5319+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
5320+ */
5321+
5322+#include <linux/device.h>
5323+#include <linux/init.h>
5324+#include <linux/kernel.h>
5325+#include <linux/module.h>
5326+#include <linux/completion.h>
5327+#include <linux/platform_device.h>
5328+#include <linux/mutex.h>
5329+#include <linux/workqueue.h>
5330+
5331+#include "cbus.h"
5332+#include "retu.h"
5333+
5334+static struct mutex retu_rtc_mutex;
5335+static u16 retu_rtc_alarm_expired;
5336+static u16 retu_rtc_reset_occurred;
5337+
5338+static DECLARE_COMPLETION(retu_rtc_exited);
5339+static DECLARE_COMPLETION(retu_rtc_sync);
5340+
5341+static void retu_rtc_barrier(void);
5342+
5343+static void retu_rtc_device_release(struct device *dev)
5344+{
5345+ complete(&retu_rtc_exited);
5346+}
5347+
5348+static ssize_t retu_rtc_time_show(struct device *dev, struct device_attribute *attr,
5349+ char *buf)
5350+{
5351+ u16 dsr, hmr, dsr2;
5352+
5353+ mutex_lock(&retu_rtc_mutex);
5354+
5355+ do {
5356+ u16 dummy;
5357+
5358+ /*
5359+ * Not being in_interrupt() for a retu rtc IRQ, we need to
5360+ * read twice for consistency..
5361+ */
5362+ dummy = retu_read_reg(RETU_REG_RTCDSR);
5363+ dsr = retu_read_reg(RETU_REG_RTCDSR);
5364+
5365+ dummy = retu_read_reg(RETU_REG_RTCHMR);
5366+ hmr = retu_read_reg(RETU_REG_RTCHMR);
5367+
5368+ dummy = retu_read_reg(RETU_REG_RTCDSR);
5369+ dsr2 = retu_read_reg(RETU_REG_RTCDSR);
5370+ } while ((dsr != dsr2));
5371+
5372+ mutex_unlock(&retu_rtc_mutex);
5373+
5374+ /*
5375+ * Format a 32-bit date-string for userspace
5376+ *
5377+ * days | hours | minutes | seconds
5378+ *
5379+ * 8 bits for each.
5380+ *
5381+ * This mostly sucks because days and seconds are tracked in RTCDSR
5382+ * while hours and minutes are tracked in RTCHMR. And yes, there
5383+ * really are no words that can describe an 8 bit day register (or
5384+ * rather, none that will be reprinted here).
5385+ */
5386+ return sprintf(buf, "0x%08x\n", (((dsr >> 8) & 0xff) << 24) |
5387+ (((hmr >> 8) & 0x1f) << 16) |
5388+ ((hmr & 0x3f) << 8) | (dsr & 0x3f));
5389+}
5390+
5391+static ssize_t retu_rtc_time_store(struct device *dev, struct device_attribute *attr,
5392+ const char *buf, size_t count)
5393+{
5394+ mutex_lock(&retu_rtc_mutex);
5395+ /*
5396+ * Writing anything to the day counter forces it to 0
5397+ * The seconds counter would be cleared by resetting the minutes counter,
5398+ * however this won't happen, since we are using the hh:mm counters as
5399+ * a set of free running counters and the day counter as a multiple
5400+ * overflow holder.
5401+ */
5402+
5403+ /* Reset day counter, but keep Temperature Shutdown state */
5404+ retu_write_reg(RETU_REG_RTCDSR,
5405+ retu_read_reg(RETU_REG_RTCDSR) & (1 << 6));
5406+
5407+ mutex_unlock(&retu_rtc_mutex);
5408+
5409+ return count;
5410+}
5411+
5412+static DEVICE_ATTR(time, S_IRUGO | S_IWUSR, retu_rtc_time_show,
5413+ retu_rtc_time_store);
5414+
5415+
5416+static ssize_t retu_rtc_reset_show(struct device *dev, struct device_attribute *attr, char *buf)
5417+{
5418+ /*
5419+ * Returns the status of the rtc
5420+ *
5421+ * 0: no reset has occurred or the status has been cleared
5422+ * 1: a reset has occurred
5423+ *
5424+ * RTC needs to be reset only when both main battery
5425+ * _AND_ backup battery are discharged
5426+ */
5427+ return sprintf(buf, "%u\n", retu_rtc_reset_occurred);
5428+}
5429+
5430+static void retu_rtc_do_reset(void)
5431+{
5432+ u16 ccr1;
5433+
5434+ ccr1 = retu_read_reg(RETU_REG_CC1);
5435+ /* RTC in reset */
5436+ retu_write_reg(RETU_REG_CC1, ccr1 | 0x0001);
5437+ /* RTC in normal operating mode */
5438+ retu_write_reg(RETU_REG_CC1, ccr1 & ~0x0001);
5439+
5440+ retu_rtc_barrier();
5441+ /* Disable alarm and RTC WD */
5442+ retu_write_reg(RETU_REG_RTCHMAR, 0x7f3f);
5443+ /* Set Calibration register to default value */
5444+ retu_write_reg(RETU_REG_RTCCALR, 0x00c0);
5445+
5446+ retu_rtc_alarm_expired = 0;
5447+ retu_rtc_reset_occurred = 1;
5448+}
5449+
5450+static ssize_t retu_rtc_reset_store(struct device *dev, struct device_attribute *attr,
5451+ const char *buf, size_t count)
5452+{
5453+ unsigned choice;
5454+
5455+ if(sscanf(buf, "%u", &choice) != 1)
5456+ return count;
5457+ mutex_lock(&retu_rtc_mutex);
5458+ if (choice == 0)
5459+ retu_rtc_reset_occurred = 0;
5460+ else if (choice == 1)
5461+ retu_rtc_do_reset();
5462+ mutex_unlock(&retu_rtc_mutex);
5463+ return count;
5464+}
5465+
5466+static DEVICE_ATTR(reset, S_IRUGO | S_IWUSR, retu_rtc_reset_show,
5467+ retu_rtc_reset_store);
5468+
5469+static ssize_t retu_rtc_alarm_show(struct device *dev, struct device_attribute *attr,
5470+ char *buf)
5471+{
5472+ u16 chmar;
5473+ ssize_t retval;
5474+
5475+ mutex_lock(&retu_rtc_mutex);
5476+ /*
5477+ * Format a 16-bit date-string for userspace
5478+ *
5479+ * hours | minutes
5480+ * 8 bits for each.
5481+ */
5482+ chmar = retu_read_reg(RETU_REG_RTCHMAR);
5483+ /* No shifting needed, only masking unrelated bits */
5484+ retval = sprintf(buf, "0x%04x\n", chmar & 0x1f3f);
5485+ mutex_unlock(&retu_rtc_mutex);
5486+
5487+ return retval;
5488+}
5489+
5490+static ssize_t retu_rtc_alarm_store(struct device *dev, struct device_attribute *attr,
5491+ const char *buf, size_t count)
5492+{
5493+ u16 chmar;
5494+ unsigned alrm;
5495+ unsigned hours;
5496+ unsigned minutes;
5497+
5498+ mutex_lock(&retu_rtc_mutex);
5499+
5500+ if(sscanf(buf, "%x", &alrm) != 1)
5501+ return count;
5502+ hours = (alrm >> 8) & 0x001f;
5503+ minutes = (alrm >> 0) & 0x003f;
5504+ if ((hours < 24 && minutes < 60) || (hours == 24 && minutes == 60)) {
5505+ /*
5506+ * OK, the time format for the alarm is valid (including the
5507+ * disabling values)
5508+ */
5509+ /* Keeps the RTC watchdog status */
5510+ chmar = retu_read_reg(RETU_REG_RTCHMAR) & 0x6000;
5511+ chmar |= alrm & 0x1f3f; /* Stores the requested alarm */
5512+ retu_rtc_barrier();
5513+ retu_write_reg(RETU_REG_RTCHMAR, chmar);
5514+ /* If the alarm is being disabled */
5515+ if (hours == 24 && minutes == 60) {
5516+ /* disable the interrupt */
5517+ retu_disable_irq(RETU_INT_RTCA);
5518+ retu_rtc_alarm_expired = 0;
5519+ } else
5520+ /* enable the interrupt */
5521+ retu_enable_irq(RETU_INT_RTCA);
5522+ }
5523+ mutex_unlock(&retu_rtc_mutex);
5524+
5525+ return count;
5526+}
5527+
5528+static DEVICE_ATTR(alarm, S_IRUGO | S_IWUSR, retu_rtc_alarm_show,
5529+ retu_rtc_alarm_store);
5530+
5531+static ssize_t retu_rtc_alarm_expired_show(struct device *dev, struct device_attribute *attr,
5532+ char *buf)
5533+{
5534+ ssize_t retval;
5535+
5536+ retval = sprintf(buf, "%u\n", retu_rtc_alarm_expired);
5537+
5538+ return retval;
5539+}
5540+
5541+static ssize_t retu_rtc_alarm_expired_store(struct device *dev, struct device_attribute *attr,
5542+ const char *buf, size_t count)
5543+{
5544+ retu_rtc_alarm_expired = 0;
5545+
5546+ return count;
5547+}
5548+
5549+static DEVICE_ATTR(alarm_expired, S_IRUGO | S_IWUSR, retu_rtc_alarm_expired_show,
5550+ retu_rtc_alarm_expired_store);
5551+
5552+
5553+static ssize_t retu_rtc_cal_show(struct device *dev, struct device_attribute *attr,
5554+ char *buf)
5555+{
5556+ u16 rtccalr1;
5557+
5558+ mutex_lock(&retu_rtc_mutex);
5559+ rtccalr1 = retu_read_reg(RETU_REG_RTCCALR);
5560+ mutex_unlock(&retu_rtc_mutex);
5561+
5562+ /*
5563+ * Shows the status of the Calibration Register.
5564+ *
5565+ * Default, after power loss: 0x0000
5566+ * Default, for R&D: 0x00C0
5567+ * Default, for factory: 0x00??
5568+ *
5569+ */
5570+ return sprintf(buf, "0x%04x\n", rtccalr1 & 0x00ff);
5571+}
5572+
5573+static ssize_t retu_rtc_cal_store(struct device *dev, struct device_attribute *attr,
5574+ const char *buf, size_t count)
5575+{
5576+ unsigned calibration_value;
5577+
5578+ if (sscanf(buf, "%x", &calibration_value) != 1)
5579+ return count;
5580+
5581+ mutex_lock(&retu_rtc_mutex);
5582+ retu_rtc_barrier();
5583+ retu_write_reg(RETU_REG_RTCCALR, calibration_value & 0x00ff);
5584+ mutex_unlock(&retu_rtc_mutex);
5585+
5586+ return count;
5587+}
5588+
5589+static DEVICE_ATTR(cal, S_IRUGO | S_IWUSR, retu_rtc_cal_show,
5590+ retu_rtc_cal_store);
5591+
5592+static struct platform_device retu_rtc_device;
5593+
5594+static void retu_rtca_disable(void)
5595+{
5596+ retu_disable_irq(RETU_INT_RTCA);
5597+ retu_rtc_alarm_expired = 1;
5598+ retu_rtc_barrier();
5599+ retu_write_reg(RETU_REG_RTCHMAR, (24 << 8) | 60);
5600+}
5601+
5602+static void retu_rtca_expired(struct work_struct *unused)
5603+{
5604+ retu_rtca_disable();
5605+ sysfs_notify(&retu_rtc_device.dev.kobj, NULL, "alarm_expired");
5606+}
5607+
5608+DECLARE_WORK(retu_rtca_work, retu_rtca_expired);
5609+
5610+/*
5611+ * RTCHMR RTCHMAR RTCCAL must be accessed within 0.9 s since the seconds
5612+ * interrupt has been signaled in the IDR register
5613+ */
5614+static void retu_rtcs_interrupt(unsigned long unused)
5615+{
5616+ retu_ack_irq(RETU_INT_RTCS);
5617+ complete_all(&retu_rtc_sync);
5618+}
5619+
5620+static void retu_rtca_interrupt(unsigned long unused)
5621+{
5622+ retu_ack_irq(RETU_INT_RTCA);
5623+ schedule_work(&retu_rtca_work);
5624+}
5625+
5626+static int retu_rtc_init_irq(void)
5627+{
5628+ int ret;
5629+
5630+ ret = retu_request_irq(RETU_INT_RTCS, retu_rtcs_interrupt, 0, "RTCS");
5631+ if (ret != 0)
5632+ return ret;
5633+ /*
5634+ * We will take care of enabling and disabling the interrupt
5635+ * elsewhere, so leave it off by default..
5636+ */
5637+ retu_disable_irq(RETU_INT_RTCS);
5638+
5639+ ret = retu_request_irq(RETU_INT_RTCA, retu_rtca_interrupt, 0, "RTCA");
5640+ if (ret != 0) {
5641+ retu_free_irq(RETU_INT_RTCS);
5642+ return ret;
5643+ }
5644+ retu_disable_irq(RETU_INT_RTCA);
5645+
5646+ return 0;
5647+}
5648+
5649+
5650+static int __devinit retu_rtc_probe(struct device *dev)
5651+{
5652+ int r;
5653+
5654+ retu_rtc_alarm_expired = retu_read_reg(RETU_REG_IDR) &
5655+ (0x1 << RETU_INT_RTCA);
5656+
5657+ if ((r = retu_rtc_init_irq()) != 0)
5658+ return r;
5659+
5660+ mutex_init(&retu_rtc_mutex);
5661+
5662+ /* If the calibration register is zero, we've probably lost
5663+ * power */
5664+ if (retu_read_reg(RETU_REG_RTCCALR) & 0x00ff)
5665+ retu_rtc_reset_occurred = 0;
5666+ else
5667+ retu_rtc_do_reset();
5668+
5669+ if ((r = device_create_file(dev, &dev_attr_time)) != 0)
5670+ return r;
5671+ else if ((r = device_create_file(dev, &dev_attr_reset)) != 0)
5672+ goto err_unregister_time;
5673+ else if ((r = device_create_file(dev, &dev_attr_alarm)) != 0)
5674+ goto err_unregister_reset;
5675+ else if ((r = device_create_file(dev, &dev_attr_alarm_expired)) != 0)
5676+ goto err_unregister_alarm;
5677+ else if ((r = device_create_file(dev, &dev_attr_cal)) != 0)
5678+ goto err_unregister_alarm_expired;
5679+ else
5680+ return r;
5681+
5682+err_unregister_alarm_expired:
5683+ device_remove_file(dev, &dev_attr_alarm_expired);
5684+err_unregister_alarm:
5685+ device_remove_file(dev, &dev_attr_alarm);
5686+err_unregister_reset:
5687+ device_remove_file(dev, &dev_attr_reset);
5688+err_unregister_time:
5689+ device_remove_file(dev, &dev_attr_time);
5690+ return r;
5691+}
5692+
5693+static int __devexit retu_rtc_remove(struct device *dev)
5694+{
5695+ retu_disable_irq(RETU_INT_RTCS);
5696+ retu_free_irq(RETU_INT_RTCS);
5697+ retu_free_irq(RETU_INT_RTCA);
5698+ device_remove_file(dev, &dev_attr_cal);
5699+ device_remove_file(dev, &dev_attr_alarm_expired);
5700+ device_remove_file(dev, &dev_attr_alarm);
5701+ device_remove_file(dev, &dev_attr_reset);
5702+ device_remove_file(dev, &dev_attr_time);
5703+ return 0;
5704+}
5705+
5706+static struct device_driver retu_rtc_driver = {
5707+ .name = "retu-rtc",
5708+ .bus = &platform_bus_type,
5709+ .probe = retu_rtc_probe,
5710+ .remove = __devexit_p(retu_rtc_remove),
5711+};
5712+
5713+static struct platform_device retu_rtc_device = {
5714+ .name = "retu-rtc",
5715+ .id = -1,
5716+ .dev = {
5717+ .release = retu_rtc_device_release,
5718+ },
5719+};
5720+
5721+/* This function provides syncronization with the RTCS interrupt handler */
5722+static void retu_rtc_barrier(void)
5723+{
5724+ INIT_COMPLETION(retu_rtc_sync);
5725+ retu_ack_irq(RETU_INT_RTCS);
5726+ retu_enable_irq(RETU_INT_RTCS);
5727+ wait_for_completion(&retu_rtc_sync);
5728+ retu_disable_irq(RETU_INT_RTCS);
5729+}
5730+
5731+static int __init retu_rtc_init(void)
5732+{
5733+ int ret;
5734+
5735+ init_completion(&retu_rtc_exited);
5736+
5737+ if ((ret = driver_register(&retu_rtc_driver)) != 0)
5738+ return ret;
5739+
5740+ if ((ret = platform_device_register(&retu_rtc_device)) != 0)
5741+ goto err_unregister_driver;
5742+
5743+ return 0;
5744+
5745+err_unregister_driver:
5746+ driver_unregister(&retu_rtc_driver);
5747+ return ret;
5748+}
5749+
5750+static void __exit retu_rtc_exit(void)
5751+{
5752+ platform_device_unregister(&retu_rtc_device);
5753+ driver_unregister(&retu_rtc_driver);
5754+
5755+ wait_for_completion(&retu_rtc_exited);
5756+}
5757+
5758+module_init(retu_rtc_init);
5759+module_exit(retu_rtc_exit);
5760+
5761+MODULE_DESCRIPTION("Retu RTC");
5762+MODULE_LICENSE("GPL");
5763+MODULE_AUTHOR("Paul Mundt and Igor Stoppa");
5764--- /dev/null
5765+++ b/drivers/cbus/retu-user.c
5766@@ -0,0 +1,423 @@
5767+/**
5768+ * drivers/cbus/retu-user.c
5769+ *
5770+ * Retu user space interface functions
5771+ *
5772+ * Copyright (C) 2004, 2005 Nokia Corporation
5773+ *
5774+ * Written by Mikko Ylinen <mikko.k.ylinen@nokia.com>
5775+ *
5776+ * This file is subject to the terms and conditions of the GNU General
5777+ * Public License. See the file "COPYING" in the main directory of this
5778+ * archive for more details.
5779+ *
5780+ * This program is distributed in the hope that it will be useful,
5781+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
5782+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5783+ * GNU General Public License for more details.
5784+ *
5785+ * You should have received a copy of the GNU General Public License
5786+ * along with this program; if not, write to the Free Software
5787+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
5788+ */
5789+
5790+#include <linux/types.h>
5791+#include <linux/kernel.h>
5792+#include <linux/interrupt.h>
5793+#include <linux/module.h>
5794+#include <linux/init.h>
5795+#include <linux/fs.h>
5796+#include <linux/miscdevice.h>
5797+#include <linux/poll.h>
5798+#include <linux/list.h>
5799+#include <linux/spinlock.h>
5800+#include <linux/mutex.h>
5801+
5802+#include <asm/uaccess.h>
5803+
5804+#include "retu.h"
5805+
5806+#include "user_retu_tahvo.h"
5807+
5808+/* Maximum size of IRQ node buffer/pool */
5809+#define RETU_MAX_IRQ_BUF_LEN 16
5810+
5811+#define PFX "retu-user: "
5812+
5813+/* Bitmap for marking the interrupt sources as having the handlers */
5814+static u32 retu_irq_bits;
5815+
5816+/* For allowing only one user process to subscribe to the retu interrupts */
5817+static struct file *retu_irq_subscr = NULL;
5818+
5819+/* For poll and IRQ passing */
5820+struct retu_irq {
5821+ u32 id;
5822+ struct list_head node;
5823+};
5824+
5825+static spinlock_t retu_irqs_lock;
5826+static struct retu_irq *retu_irq_block;
5827+static LIST_HEAD(retu_irqs);
5828+static LIST_HEAD(retu_irqs_reserve);
5829+
5830+/* Wait queue - used when user wants to read the device */
5831+DECLARE_WAIT_QUEUE_HEAD(retu_user_waitqueue);
5832+
5833+/* Semaphore to protect irq subscription sequence */
5834+static struct mutex retu_mutex;
5835+
5836+/* This array specifies RETU register types (read/write/toggle) */
5837+static const u8 retu_access_bits[] = {
5838+ 1,
5839+ 4,
5840+ 3,
5841+ 3,
5842+ 1,
5843+ 3,
5844+ 3,
5845+ 0,
5846+ 3,
5847+ 3,
5848+ 3,
5849+ 3,
5850+ 3,
5851+ 3,
5852+ 3,
5853+ 4,
5854+ 4,
5855+ 3,
5856+ 0,
5857+ 0,
5858+ 0,
5859+ 0,
5860+ 1,
5861+ 3,
5862+ 3,
5863+ 3,
5864+ 3,
5865+ 3,
5866+ 3,
5867+ 3,
5868+ 3,
5869+ 3
5870+};
5871+
5872+/*
5873+ * The handler for all RETU interrupts.
5874+ *
5875+ * arg is the interrupt source in RETU.
5876+ */
5877+static void retu_user_irq_handler(unsigned long arg)
5878+{
5879+ struct retu_irq *irq;
5880+
5881+ retu_ack_irq(arg);
5882+
5883+ spin_lock(&retu_irqs_lock);
5884+ if (list_empty(&retu_irqs_reserve)) {
5885+ spin_unlock(&retu_irqs_lock);
5886+ return;
5887+ }
5888+ irq = list_entry((&retu_irqs_reserve)->next, struct retu_irq, node);
5889+ irq->id = arg;
5890+ list_move_tail(&irq->node, &retu_irqs);
5891+ spin_unlock(&retu_irqs_lock);
5892+
5893+ /* wake up waiting thread */
5894+ wake_up(&retu_user_waitqueue);
5895+}
5896+
5897+/*
5898+ * This routine sets up the interrupt handler and marks an interrupt source
5899+ * in RETU as a candidate for signal delivery to the user process.
5900+ */
5901+static int retu_user_subscribe_to_irq(int id, struct file *filp)
5902+{
5903+ int ret;
5904+
5905+ mutex_lock(&retu_mutex);
5906+ if ((retu_irq_subscr != NULL) && (retu_irq_subscr != filp)) {
5907+ mutex_unlock(&retu_mutex);
5908+ return -EBUSY;
5909+ }
5910+ /* Store the file pointer of the first user process registering IRQs */
5911+ retu_irq_subscr = filp;
5912+ mutex_unlock(&retu_mutex);
5913+
5914+ if (retu_irq_bits & (1 << id))
5915+ return 0;
5916+
5917+ ret = retu_request_irq(id, retu_user_irq_handler, id, "");
5918+ if (ret < 0)
5919+ return ret;
5920+
5921+ /* Mark that this interrupt has a handler */
5922+ retu_irq_bits |= 1 << id;
5923+
5924+ return 0;
5925+}
5926+
5927+/*
5928+ * Unregisters all RETU interrupt handlers.
5929+ */
5930+static void retu_unreg_irq_handlers(void)
5931+{
5932+ int id;
5933+
5934+ if (!retu_irq_bits)
5935+ return;
5936+
5937+ for (id = 0; id < MAX_RETU_IRQ_HANDLERS; id++)
5938+ if (retu_irq_bits & (1 << id))
5939+ retu_free_irq(id);
5940+
5941+ retu_irq_bits = 0;
5942+}
5943+
5944+/*
5945+ * Write to RETU register.
5946+ * Returns 0 upon success, a negative error value otherwise.
5947+ */
5948+static int retu_user_write_with_mask(u32 field, u16 value)
5949+{
5950+ u32 mask;
5951+ u32 reg;
5952+ u_short tmp;
5953+ unsigned long flags;
5954+
5955+ mask = MASK(field);
5956+ reg = REG(field);
5957+
5958+ /* Detect bad mask and reg */
5959+ if (mask == 0 || reg > RETU_REG_MAX ||
5960+ retu_access_bits[reg] == READ_ONLY) {
5961+ printk(KERN_ERR PFX "invalid arguments (reg=%#x, mask=%#x)\n",
5962+ reg, mask);
5963+ return -EINVAL;
5964+ }
5965+
5966+ /* Justify value according to mask */
5967+ while (!(mask & 1)) {
5968+ value = value << 1;
5969+ mask = mask >> 1;
5970+ }
5971+
5972+ spin_lock_irqsave(&retu_lock, flags);
5973+ if (retu_access_bits[reg] == TOGGLE) {
5974+ /* No need to detect previous content of register */
5975+ tmp = 0;
5976+ } else {
5977+ /* Read current value of register */
5978+ tmp = retu_read_reg(reg);
5979+ }
5980+
5981+ /* Generate new value */
5982+ tmp = (tmp & ~MASK(field)) | (value & MASK(field));
5983+ /* Write data to RETU */
5984+ retu_write_reg(reg, tmp);
5985+ spin_unlock_irqrestore(&retu_lock, flags);
5986+
5987+ return 0;
5988+}
5989+
5990+/*
5991+ * Read RETU register.
5992+ */
5993+static u32 retu_user_read_with_mask(u32 field)
5994+{
5995+ u_short value;
5996+ u32 mask, reg;
5997+
5998+ mask = MASK(field);
5999+ reg = REG(field);
6000+
6001+ /* Detect bad mask and reg */
6002+ if (mask == 0 || reg > RETU_REG_MAX) {
6003+ printk(KERN_ERR PFX "invalid arguments (reg=%#x, mask=%#x)\n",
6004+ reg, mask);
6005+ return -EINVAL;
6006+ }
6007+
6008+ /* Read the register */
6009+ value = retu_read_reg(reg) & mask;
6010+
6011+ /* Right justify value */
6012+ while (!(mask & 1)) {
6013+ value = value >> 1;
6014+ mask = mask >> 1;
6015+ }
6016+
6017+ return value;
6018+}
6019+
6020+/*
6021+ * Close device
6022+ */
6023+static int retu_close(struct inode *inode, struct file *filp)
6024+{
6025+ /* Unregister all interrupts that have been registered */
6026+ if (retu_irq_subscr == filp) {
6027+ retu_unreg_irq_handlers();
6028+ retu_irq_subscr = NULL;
6029+ }
6030+
6031+ return 0;
6032+}
6033+
6034+/*
6035+ * Device control (ioctl)
6036+ */
6037+static int retu_ioctl(struct inode *inode, struct file *filp,
6038+ unsigned int cmd, unsigned long arg)
6039+{
6040+ struct retu_tahvo_write_parms par;
6041+ int ret;
6042+
6043+ switch (cmd) {
6044+ case URT_IOCT_IRQ_SUBSCR:
6045+ return retu_user_subscribe_to_irq(arg, filp);
6046+ case RETU_IOCH_READ:
6047+ return retu_user_read_with_mask(arg);
6048+ case RETU_IOCX_WRITE:
6049+ ret = copy_from_user(&par, (void __user *) arg, sizeof(par));
6050+ if (ret)
6051+ printk(KERN_ERR "copy_from_user failed: %d\n", ret);
6052+ par.result = retu_user_write_with_mask(par.field, par.value);
6053+ ret = copy_to_user((void __user *) arg, &par, sizeof(par));
6054+ if (ret)
6055+ printk(KERN_ERR "copy_to_user failed: %d\n", ret);
6056+ break;
6057+ case RETU_IOCH_ADC_READ:
6058+ return retu_read_adc(arg);
6059+ default:
6060+ return -ENOIOCTLCMD;
6061+ }
6062+ return 0;
6063+}
6064+
6065+/*
6066+ * Read from device
6067+ */
6068+static ssize_t retu_read(struct file *filp, char *buf, size_t count,
6069+ loff_t * offp)
6070+{
6071+ struct retu_irq *irq;
6072+
6073+ u32 nr, i;
6074+
6075+ /* read not permitted if neither filp nor anyone has registered IRQs */
6076+ if (retu_irq_subscr != filp)
6077+ return -EPERM;
6078+
6079+ if ((count < sizeof(u32)) || ((count % sizeof(u32)) != 0))
6080+ return -EINVAL;
6081+
6082+ nr = count / sizeof(u32);
6083+
6084+ for (i = 0; i < nr; i++) {
6085+ unsigned long flags;
6086+ u32 irq_id;
6087+ int ret;
6088+
6089+ ret = wait_event_interruptible(retu_user_waitqueue,
6090+ !list_empty(&retu_irqs));
6091+ if (ret < 0)
6092+ return ret;
6093+
6094+ spin_lock_irqsave(&retu_irqs_lock, flags);
6095+ irq = list_entry((&retu_irqs)->next, struct retu_irq, node);
6096+ irq_id = irq->id;
6097+ list_move(&irq->node, &retu_irqs_reserve);
6098+ spin_unlock_irqrestore(&retu_irqs_lock, flags);
6099+
6100+ ret = copy_to_user(buf + i * sizeof(irq_id), &irq_id,
6101+ sizeof(irq_id));
6102+ if (ret)
6103+ printk(KERN_ERR "copy_to_user failed: %d\n", ret);
6104+ }
6105+
6106+ return count;
6107+}
6108+
6109+/*
6110+ * Poll method
6111+ */
6112+static unsigned retu_poll(struct file *filp, struct poll_table_struct *pt)
6113+{
6114+ if (!list_empty(&retu_irqs))
6115+ return POLLIN;
6116+
6117+ poll_wait(filp, &retu_user_waitqueue, pt);
6118+
6119+ if (!list_empty(&retu_irqs))
6120+ return POLLIN;
6121+ else
6122+ return 0;
6123+}
6124+
6125+static struct file_operations retu_user_fileops = {
6126+ .owner = THIS_MODULE,
6127+ .ioctl = retu_ioctl,
6128+ .read = retu_read,
6129+ .release = retu_close,
6130+ .poll = retu_poll
6131+};
6132+
6133+static struct miscdevice retu_device = {
6134+ .minor = MISC_DYNAMIC_MINOR,
6135+ .name = "retu",
6136+ .fops = &retu_user_fileops
6137+};
6138+
6139+/*
6140+ * Initialization
6141+ *
6142+ * @return 0 if successful, error value otherwise.
6143+ */
6144+int retu_user_init(void)
6145+{
6146+ struct retu_irq *irq;
6147+ int res, i;
6148+
6149+ irq = kmalloc(sizeof(*irq) * RETU_MAX_IRQ_BUF_LEN, GFP_KERNEL);
6150+ if (irq == NULL) {
6151+ printk(KERN_ERR PFX "kmalloc failed\n");
6152+ return -ENOMEM;
6153+ }
6154+ memset(irq, 0, sizeof(*irq) * RETU_MAX_IRQ_BUF_LEN);
6155+ for (i = 0; i < RETU_MAX_IRQ_BUF_LEN; i++)
6156+ list_add(&irq[i].node, &retu_irqs_reserve);
6157+
6158+ retu_irq_block = irq;
6159+
6160+ spin_lock_init(&retu_irqs_lock);
6161+ mutex_init(&retu_mutex);
6162+
6163+ /* Request a misc device */
6164+ res = misc_register(&retu_device);
6165+ if (res < 0) {
6166+ printk(KERN_ERR PFX "unable to register misc device for %s\n",
6167+ retu_device.name);
6168+ kfree(irq);
6169+ return res;
6170+ }
6171+
6172+ return 0;
6173+}
6174+
6175+/*
6176+ * Cleanup.
6177+ */
6178+void retu_user_cleanup(void)
6179+{
6180+ /* Unregister our misc device */
6181+ misc_deregister(&retu_device);
6182+ /* Unregister and disable all RETU interrupts used by this module */
6183+ retu_unreg_irq_handlers();
6184+ kfree(retu_irq_block);
6185+}
6186+
6187+MODULE_DESCRIPTION("Retu ASIC user space functions");
6188+MODULE_LICENSE("GPL");
6189+MODULE_AUTHOR("Mikko Ylinen");
6190--- /dev/null
6191+++ b/drivers/cbus/retu-wdt.c
6192@@ -0,0 +1,202 @@
6193+/**
6194+ * drivers/cbus/retu-wdt.c
6195+ *
6196+ * Driver for Retu watchdog
6197+ *
6198+ * Copyright (C) 2004, 2005 Nokia Corporation
6199+ *
6200+ * Written by Amit Kucheria <amit.kucheria@nokia.com>
6201+ *
6202+ * This file is subject to the terms and conditions of the GNU General
6203+ * Public License. See the file "COPYING" in the main directory of this
6204+ * archive for more details.
6205+ *
6206+ * This program is distributed in the hope that it will be useful,
6207+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
6208+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6209+ * GNU General Public License for more details.
6210+ *
6211+ * You should have received a copy of the GNU General Public License
6212+ * along with this program; if not, write to the Free Software
6213+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
6214+ */
6215+
6216+#include <linux/kernel.h>
6217+#include <linux/module.h>
6218+#include <linux/device.h>
6219+#include <linux/init.h>
6220+
6221+#include <linux/completion.h>
6222+#include <linux/errno.h>
6223+#include <linux/moduleparam.h>
6224+#include <linux/platform_device.h>
6225+
6226+#include "cbus.h"
6227+#include "retu.h"
6228+
6229+/* Watchdog timeout in seconds */
6230+#define RETU_WDT_MIN_TIMER 0
6231+#define RETU_WDT_DEFAULT_TIMER 32
6232+#define RETU_WDT_MAX_TIMER 63
6233+
6234+static struct completion retu_wdt_completion;
6235+static DEFINE_MUTEX(retu_wdt_mutex);
6236+
6237+/* Current period of watchdog */
6238+static unsigned int period_val = RETU_WDT_DEFAULT_TIMER;
6239+static int counter_param = RETU_WDT_MAX_TIMER;
6240+
6241+static int retu_modify_counter(unsigned int new)
6242+{
6243+ int ret = 0;
6244+
6245+ if (new < RETU_WDT_MIN_TIMER || new > RETU_WDT_MAX_TIMER)
6246+ return -EINVAL;
6247+
6248+ mutex_lock(&retu_wdt_mutex);
6249+
6250+ period_val = new;
6251+ retu_write_reg(RETU_REG_WATCHDOG, (u16)period_val);
6252+
6253+ mutex_unlock(&retu_wdt_mutex);
6254+ return ret;
6255+}
6256+
6257+static ssize_t retu_wdt_period_show(struct device *dev,
6258+ struct device_attribute *attr, char *buf)
6259+{
6260+ /* Show current max counter */
6261+ return sprintf(buf, "%u\n", (u16)period_val);
6262+}
6263+
6264+static ssize_t retu_wdt_period_store(struct device *dev,
6265+ struct device_attribute *attr,
6266+ const char *buf, size_t count)
6267+{
6268+ unsigned int new_period;
6269+ int ret;
6270+
6271+ if (sscanf(buf, "%u", &new_period) != 1) {
6272+ printk(KERN_ALERT "retu_wdt_period_store: Invalid input\n");
6273+ return -EINVAL;
6274+ }
6275+
6276+ ret = retu_modify_counter(new_period);
6277+ if (ret < 0)
6278+ return ret;
6279+
6280+ return strnlen(buf, count);
6281+}
6282+
6283+static ssize_t retu_wdt_counter_show(struct device *dev,
6284+ struct device_attribute *attr, char *buf)
6285+{
6286+ u16 counter;
6287+
6288+ /* Show current value in watchdog counter */
6289+ counter = retu_read_reg(RETU_REG_WATCHDOG);
6290+
6291+ /* Only the 5 LSB are important */
6292+ return snprintf(buf, PAGE_SIZE, "%u\n", (counter & 0x3F));
6293+}
6294+
6295+static DEVICE_ATTR(period, S_IRUGO | S_IWUSR, retu_wdt_period_show, \
6296+ retu_wdt_period_store);
6297+static DEVICE_ATTR(counter, S_IRUGO, retu_wdt_counter_show, NULL);
6298+
6299+static int __devinit retu_wdt_probe(struct device *dev)
6300+{
6301+ int ret;
6302+
6303+ ret = device_create_file(dev, &dev_attr_period);
6304+ if (ret) {
6305+ printk(KERN_ERR "retu_wdt_probe: Error creating "
6306+ "sys device file: period\n");
6307+ return ret;
6308+ }
6309+
6310+ ret = device_create_file(dev, &dev_attr_counter);
6311+ if (ret) {
6312+ device_remove_file(dev, &dev_attr_period);
6313+ printk(KERN_ERR "retu_wdt_probe: Error creating "
6314+ "sys device file: counter\n");
6315+ }
6316+
6317+ return ret;
6318+}
6319+
6320+static int __devexit retu_wdt_remove(struct device *dev)
6321+{
6322+ device_remove_file(dev, &dev_attr_period);
6323+ device_remove_file(dev, &dev_attr_counter);
6324+ return 0;
6325+}
6326+
6327+static void retu_wdt_device_release(struct device *dev)
6328+{
6329+ complete(&retu_wdt_completion);
6330+}
6331+
6332+static struct platform_device retu_wdt_device = {
6333+ .name = "retu-watchdog",
6334+ .id = -1,
6335+ .dev = {
6336+ .release = retu_wdt_device_release,
6337+ },
6338+};
6339+
6340+static struct device_driver retu_wdt_driver = {
6341+ .name = "retu-watchdog",
6342+ .bus = &platform_bus_type,
6343+ .probe = retu_wdt_probe,
6344+ .remove = __devexit_p(retu_wdt_remove),
6345+};
6346+
6347+static int __init retu_wdt_init(void)
6348+{
6349+ int ret;
6350+
6351+ init_completion(&retu_wdt_completion);
6352+
6353+ ret = driver_register(&retu_wdt_driver);
6354+ if (ret)
6355+ return ret;
6356+
6357+ ret = platform_device_register(&retu_wdt_device);
6358+ if (ret)
6359+ goto exit1;
6360+
6361+ /* passed as module parameter? */
6362+ ret = retu_modify_counter(counter_param);
6363+ if (ret == -EINVAL) {
6364+ ret = retu_modify_counter(RETU_WDT_DEFAULT_TIMER);
6365+ printk(KERN_INFO
6366+ "retu_wdt_init: Intializing to default value\n");
6367+ }
6368+
6369+ printk(KERN_INFO "Retu watchdog driver initialized\n");
6370+ return ret;
6371+
6372+exit1:
6373+ driver_unregister(&retu_wdt_driver);
6374+ wait_for_completion(&retu_wdt_completion);
6375+
6376+ return ret;
6377+}
6378+
6379+static void __exit retu_wdt_exit(void)
6380+{
6381+ platform_device_unregister(&retu_wdt_device);
6382+ driver_unregister(&retu_wdt_driver);
6383+
6384+ wait_for_completion(&retu_wdt_completion);
6385+}
6386+
6387+module_init(retu_wdt_init);
6388+module_exit(retu_wdt_exit);
6389+module_param(counter_param, int, 0);
6390+
6391+MODULE_DESCRIPTION("Retu WatchDog");
6392+MODULE_AUTHOR("Amit Kucheria");
6393+MODULE_LICENSE("GPL");
6394+
6395--- /dev/null
6396+++ b/drivers/cbus/retu.c
6397@@ -0,0 +1,467 @@
6398+/**
6399+ * drivers/cbus/retu.c
6400+ *
6401+ * Support functions for Retu ASIC
6402+ *
6403+ * Copyright (C) 2004, 2005 Nokia Corporation
6404+ *
6405+ * Written by Juha Yrjölä <juha.yrjola@nokia.com>,
6406+ * David Weinehall <david.weinehall@nokia.com>, and
6407+ * Mikko Ylinen <mikko.k.ylinen@nokia.com>
6408+ *
6409+ * This file is subject to the terms and conditions of the GNU General
6410+ * Public License. See the file "COPYING" in the main directory of this
6411+ * archive for more details.
6412+ *
6413+ * This program is distributed in the hope that it will be useful,
6414+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
6415+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6416+ * GNU General Public License for more details.
6417+ *
6418+ * You should have received a copy of the GNU General Public License
6419+ * along with this program; if not, write to the Free Software
6420+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
6421+ */
6422+
6423+#include <linux/module.h>
6424+#include <linux/init.h>
6425+
6426+#include <linux/kernel.h>
6427+#include <linux/errno.h>
6428+#include <linux/device.h>
6429+#include <linux/miscdevice.h>
6430+#include <linux/poll.h>
6431+#include <linux/fs.h>
6432+#include <linux/irq.h>
6433+#include <linux/interrupt.h>
6434+#include <linux/platform_device.h>
6435+#include <linux/gpio.h>
6436+
6437+#include <asm/uaccess.h>
6438+
6439+#include <mach/mux.h>
6440+#include <mach/board.h>
6441+#include <mach/board-nokia.h>
6442+
6443+#include "cbus.h"
6444+#include "retu.h"
6445+
6446+#define RETU_ID 0x01
6447+#define PFX "retu: "
6448+
6449+static int retu_initialized;
6450+static int retu_irq_pin;
6451+static int retu_is_vilma;
6452+
6453+static struct tasklet_struct retu_tasklet;
6454+spinlock_t retu_lock = SPIN_LOCK_UNLOCKED;
6455+
6456+static struct completion device_release;
6457+
6458+struct retu_irq_handler_desc {
6459+ int (*func)(unsigned long);
6460+ unsigned long arg;
6461+ char name[8];
6462+};
6463+
6464+static struct retu_irq_handler_desc retu_irq_handlers[MAX_RETU_IRQ_HANDLERS];
6465+
6466+/**
6467+ * retu_read_reg - Read a value from a register in Retu
6468+ * @reg: the register to read from
6469+ *
6470+ * This function returns the contents of the specified register
6471+ */
6472+int retu_read_reg(int reg)
6473+{
6474+ BUG_ON(!retu_initialized);
6475+ return cbus_read_reg(cbus_host, RETU_ID, reg);
6476+}
6477+
6478+/**
6479+ * retu_write_reg - Write a value to a register in Retu
6480+ * @reg: the register to write to
6481+ * @reg: the value to write to the register
6482+ *
6483+ * This function writes a value to the specified register
6484+ */
6485+void retu_write_reg(int reg, u16 val)
6486+{
6487+ BUG_ON(!retu_initialized);
6488+ cbus_write_reg(cbus_host, RETU_ID, reg, val);
6489+}
6490+
6491+void retu_set_clear_reg_bits(int reg, u16 set, u16 clear)
6492+{
6493+ unsigned long flags;
6494+ u16 w;
6495+
6496+ spin_lock_irqsave(&retu_lock, flags);
6497+ w = retu_read_reg(reg);
6498+ w &= ~clear;
6499+ w |= set;
6500+ retu_write_reg(reg, w);
6501+ spin_unlock_irqrestore(&retu_lock, flags);
6502+}
6503+
6504+#define ADC_MAX_CHAN_NUMBER 13
6505+
6506+int retu_read_adc(int channel)
6507+{
6508+ unsigned long flags;
6509+ int res;
6510+
6511+ if (channel < 0 || channel > ADC_MAX_CHAN_NUMBER)
6512+ return -EINVAL;
6513+
6514+ spin_lock_irqsave(&retu_lock, flags);
6515+
6516+ if ((channel == 8) && retu_is_vilma) {
6517+ int scr = retu_read_reg(RETU_REG_ADCSCR);
6518+ int ch = (retu_read_reg(RETU_REG_ADCR) >> 10) & 0xf;
6519+ if (((scr & 0xff) != 0) && (ch != 8))
6520+ retu_write_reg (RETU_REG_ADCSCR, (scr & ~0xff));
6521+ }
6522+
6523+ /* Select the channel and read result */
6524+ retu_write_reg(RETU_REG_ADCR, channel << 10);
6525+ res = retu_read_reg(RETU_REG_ADCR) & 0x3ff;
6526+
6527+ if (retu_is_vilma)
6528+ retu_write_reg(RETU_REG_ADCR, (1 << 13));
6529+
6530+ /* Unlock retu */
6531+ spin_unlock_irqrestore(&retu_lock, flags);
6532+
6533+ return res;
6534+}
6535+
6536+
6537+static u16 retu_disable_bogus_irqs(u16 mask)
6538+{
6539+ int i;
6540+
6541+ for (i = 0; i < MAX_RETU_IRQ_HANDLERS; i++) {
6542+ if (mask & (1 << i))
6543+ continue;
6544+ if (retu_irq_handlers[i].func != NULL)
6545+ continue;
6546+ /* an IRQ was enabled but we don't have a handler for it */
6547+ printk(KERN_INFO PFX "disabling bogus IRQ %d\n", i);
6548+ mask |= (1 << i);
6549+ }
6550+ return mask;
6551+}
6552+
6553+/*
6554+ * Disable given RETU interrupt
6555+ */
6556+void retu_disable_irq(int id)
6557+{
6558+ unsigned long flags;
6559+ u16 mask;
6560+
6561+ spin_lock_irqsave(&retu_lock, flags);
6562+ mask = retu_read_reg(RETU_REG_IMR);
6563+ mask |= 1 << id;
6564+ mask = retu_disable_bogus_irqs(mask);
6565+ retu_write_reg(RETU_REG_IMR, mask);
6566+ spin_unlock_irqrestore(&retu_lock, flags);
6567+}
6568+
6569+/*
6570+ * Enable given RETU interrupt
6571+ */
6572+void retu_enable_irq(int id)
6573+{
6574+ unsigned long flags;
6575+ u16 mask;
6576+
6577+ if (id == 3) {
6578+ printk("Enabling Retu IRQ %d\n", id);
6579+ dump_stack();
6580+ }
6581+ spin_lock_irqsave(&retu_lock, flags);
6582+ mask = retu_read_reg(RETU_REG_IMR);
6583+ mask &= ~(1 << id);
6584+ mask = retu_disable_bogus_irqs(mask);
6585+ retu_write_reg(RETU_REG_IMR, mask);
6586+ spin_unlock_irqrestore(&retu_lock, flags);
6587+}
6588+
6589+/*
6590+ * Acknowledge given RETU interrupt
6591+ */
6592+void retu_ack_irq(int id)
6593+{
6594+ retu_write_reg(RETU_REG_IDR, 1 << id);
6595+}
6596+
6597+/*
6598+ * RETU interrupt handler. Only schedules the tasklet.
6599+ */
6600+static irqreturn_t retu_irq_handler(int irq, void *dev_id)
6601+{
6602+ tasklet_schedule(&retu_tasklet);
6603+ return IRQ_HANDLED;
6604+}
6605+
6606+/*
6607+ * Tasklet handler
6608+ */
6609+static void retu_tasklet_handler(unsigned long data)
6610+{
6611+ struct retu_irq_handler_desc *hnd;
6612+ u16 id;
6613+ u16 im;
6614+ int i;
6615+
6616+ for (;;) {
6617+ id = retu_read_reg(RETU_REG_IDR);
6618+ im = ~retu_read_reg(RETU_REG_IMR);
6619+ id &= im;
6620+
6621+ if (!id)
6622+ break;
6623+
6624+ for (i = 0; id != 0; i++, id >>= 1) {
6625+ if (!(id & 1))
6626+ continue;
6627+ hnd = &retu_irq_handlers[i];
6628+ if (hnd->func == NULL) {
6629+ /* Spurious retu interrupt - disable and ack it */
6630+ printk(KERN_INFO "Spurious Retu interrupt "
6631+ "(id %d)\n", i);
6632+ retu_disable_irq(i);
6633+ retu_ack_irq(i);
6634+ continue;
6635+ }
6636+ hnd->func(hnd->arg);
6637+ /*
6638+ * Don't acknowledge the interrupt here
6639+ * It must be done explicitly
6640+ */
6641+ }
6642+ }
6643+}
6644+
6645+/*
6646+ * Register the handler for a given RETU interrupt source.
6647+ */
6648+int retu_request_irq(int id, void *irq_handler, unsigned long arg, char *name)
6649+{
6650+ struct retu_irq_handler_desc *hnd;
6651+
6652+ if (irq_handler == NULL || id >= MAX_RETU_IRQ_HANDLERS ||
6653+ name == NULL) {
6654+ printk(KERN_ERR PFX "Invalid arguments to %s\n",
6655+ __FUNCTION__);
6656+ return -EINVAL;
6657+ }
6658+ hnd = &retu_irq_handlers[id];
6659+ if (hnd->func != NULL) {
6660+ printk(KERN_ERR PFX "IRQ %d already reserved\n", id);
6661+ return -EBUSY;
6662+ }
6663+ printk(KERN_INFO PFX "Registering interrupt %d for device %s\n",
6664+ id, name);
6665+ hnd->func = irq_handler;
6666+ hnd->arg = arg;
6667+ strlcpy(hnd->name, name, sizeof(hnd->name));
6668+
6669+ retu_ack_irq(id);
6670+ retu_enable_irq(id);
6671+
6672+ return 0;
6673+}
6674+
6675+/*
6676+ * Unregister the handler for a given RETU interrupt source.
6677+ */
6678+void retu_free_irq(int id)
6679+{
6680+ struct retu_irq_handler_desc *hnd;
6681+
6682+ if (id >= MAX_RETU_IRQ_HANDLERS) {
6683+ printk(KERN_ERR PFX "Invalid argument to %s\n",
6684+ __FUNCTION__);
6685+ return;
6686+ }
6687+ hnd = &retu_irq_handlers[id];
6688+ if (hnd->func == NULL) {
6689+ printk(KERN_ERR PFX "IRQ %d already freed\n", id);
6690+ return;
6691+ }
6692+
6693+ retu_disable_irq(id);
6694+ hnd->func = NULL;
6695+}
6696+
6697+/**
6698+ * retu_power_off - Shut down power to system
6699+ *
6700+ * This function puts the system in power off state
6701+ */
6702+static void retu_power_off(void)
6703+{
6704+ /* Ignore power button state */
6705+ retu_write_reg(RETU_REG_CC1, retu_read_reg(RETU_REG_CC1) | 2);
6706+ /* Expire watchdog immediately */
6707+ retu_write_reg(RETU_REG_WATCHDOG, 0);
6708+ /* Wait for poweroff*/
6709+ for (;;);
6710+}
6711+
6712+/**
6713+ * retu_probe - Probe for Retu ASIC
6714+ * @dev: the Retu device
6715+ *
6716+ * Probe for the Retu ASIC and allocate memory
6717+ * for its device-struct if found
6718+ */
6719+static int __devinit retu_probe(struct device *dev)
6720+{
6721+ const struct omap_em_asic_bb5_config * em_asic_config;
6722+ int rev, ret;
6723+
6724+ /* Prepare tasklet */
6725+ tasklet_init(&retu_tasklet, retu_tasklet_handler, 0);
6726+
6727+ em_asic_config = omap_get_config(OMAP_TAG_EM_ASIC_BB5,
6728+ struct omap_em_asic_bb5_config);
6729+ if (em_asic_config == NULL) {
6730+ printk(KERN_ERR PFX "Unable to retrieve config data\n");
6731+ return -ENODATA;
6732+ }
6733+
6734+ retu_irq_pin = em_asic_config->retu_irq_gpio;
6735+
6736+ if ((ret = gpio_request(retu_irq_pin, "RETU irq")) < 0) {
6737+ printk(KERN_ERR PFX "Unable to reserve IRQ GPIO\n");
6738+ return ret;
6739+ }
6740+
6741+ /* Set the pin as input */
6742+ gpio_direction_input(retu_irq_pin);
6743+
6744+ /* Rising edge triggers the IRQ */
6745+ set_irq_type(gpio_to_irq(retu_irq_pin), IRQ_TYPE_EDGE_RISING);
6746+
6747+ retu_initialized = 1;
6748+
6749+ rev = retu_read_reg(RETU_REG_ASICR) & 0xff;
6750+ if (rev & (1 << 7))
6751+ retu_is_vilma = 1;
6752+
6753+ printk(KERN_INFO "%s v%d.%d found\n", retu_is_vilma ? "Vilma" : "Retu",
6754+ (rev >> 4) & 0x07, rev & 0x0f);
6755+
6756+ /* Mask all RETU interrupts */
6757+ retu_write_reg(RETU_REG_IMR, 0xffff);
6758+
6759+ ret = request_irq(gpio_to_irq(retu_irq_pin), retu_irq_handler, 0,
6760+ "retu", 0);
6761+ if (ret < 0) {
6762+ printk(KERN_ERR PFX "Unable to register IRQ handler\n");
6763+ gpio_free(retu_irq_pin);
6764+ return ret;
6765+ }
6766+ set_irq_wake(gpio_to_irq(retu_irq_pin), 1);
6767+
6768+ /* Register power off function */
6769+ pm_power_off = retu_power_off;
6770+
6771+#ifdef CONFIG_CBUS_RETU_USER
6772+ /* Initialize user-space interface */
6773+ if (retu_user_init() < 0) {
6774+ printk(KERN_ERR "Unable to initialize driver\n");
6775+ free_irq(gpio_to_irq(retu_irq_pin), 0);
6776+ gpio_free(retu_irq_pin);
6777+ return ret;
6778+ }
6779+#endif
6780+
6781+ return 0;
6782+}
6783+
6784+static int retu_remove(struct device *dev)
6785+{
6786+#ifdef CONFIG_CBUS_RETU_USER
6787+ retu_user_cleanup();
6788+#endif
6789+ /* Mask all RETU interrupts */
6790+ retu_write_reg(RETU_REG_IMR, 0xffff);
6791+ free_irq(gpio_to_irq(retu_irq_pin), 0);
6792+ gpio_free(retu_irq_pin);
6793+ tasklet_kill(&retu_tasklet);
6794+
6795+ return 0;
6796+}
6797+
6798+static void retu_device_release(struct device *dev)
6799+{
6800+ complete(&device_release);
6801+}
6802+
6803+static struct device_driver retu_driver = {
6804+ .name = "retu",
6805+ .bus = &platform_bus_type,
6806+ .probe = retu_probe,
6807+ .remove = retu_remove,
6808+};
6809+
6810+static struct platform_device retu_device = {
6811+ .name = "retu",
6812+ .id = -1,
6813+ .dev = {
6814+ .release = retu_device_release,
6815+ }
6816+};
6817+
6818+/**
6819+ * retu_init - initialise Retu driver
6820+ *
6821+ * Initialise the Retu driver and return 0 if everything worked ok
6822+ */
6823+static int __init retu_init(void)
6824+{
6825+ int ret = 0;
6826+
6827+ printk(KERN_INFO "Retu/Vilma driver initialising\n");
6828+
6829+ init_completion(&device_release);
6830+
6831+ if ((ret = driver_register(&retu_driver)) < 0)
6832+ return ret;
6833+
6834+ if ((ret = platform_device_register(&retu_device)) < 0) {
6835+ driver_unregister(&retu_driver);
6836+ return ret;
6837+ }
6838+ return 0;
6839+}
6840+
6841+/*
6842+ * Cleanup
6843+ */
6844+static void __exit retu_exit(void)
6845+{
6846+ platform_device_unregister(&retu_device);
6847+ driver_unregister(&retu_driver);
6848+ wait_for_completion(&device_release);
6849+}
6850+
6851+EXPORT_SYMBOL(retu_request_irq);
6852+EXPORT_SYMBOL(retu_free_irq);
6853+EXPORT_SYMBOL(retu_enable_irq);
6854+EXPORT_SYMBOL(retu_disable_irq);
6855+EXPORT_SYMBOL(retu_ack_irq);
6856+EXPORT_SYMBOL(retu_read_reg);
6857+EXPORT_SYMBOL(retu_write_reg);
6858+
6859+subsys_initcall(retu_init);
6860+module_exit(retu_exit);
6861+
6862+MODULE_DESCRIPTION("Retu ASIC control");
6863+MODULE_LICENSE("GPL");
6864+MODULE_AUTHOR("Juha Yrjölä, David Weinehall, and Mikko Ylinen");
6865--- /dev/null
6866+++ b/drivers/cbus/retu.h
6867@@ -0,0 +1,77 @@
6868+/**
6869+ * drivers/cbus/retu.h
6870+ *
6871+ * Copyright (C) 2004, 2005 Nokia Corporation
6872+ *
6873+ * Written by Juha Yrjölä <juha.yrjola@nokia.com> and
6874+ * David Weinehall <david.weinehall@nokia.com>
6875+ *
6876+ * This file is subject to the terms and conditions of the GNU General
6877+ * Public License. See the file "COPYING" in the main directory of this
6878+ * archive for more details.
6879+ *
6880+ * This program is distributed in the hope that it will be useful,
6881+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
6882+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6883+ * GNU General Public License for more details.
6884+
6885+ * You should have received a copy of the GNU General Public License
6886+ * along with this program; if not, write to the Free Software
6887+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
6888+ */
6889+
6890+#ifndef __DRIVERS_CBUS_RETU_H
6891+#define __DRIVERS_CBUS_RETU_H
6892+
6893+#include <linux/types.h>
6894+
6895+/* Registers */
6896+#define RETU_REG_ASICR 0x00 /* ASIC ID & revision */
6897+#define RETU_REG_IDR 0x01 /* Interrupt ID */
6898+#define RETU_REG_IMR 0x02 /* Interrupt mask */
6899+#define RETU_REG_RTCDSR 0x03 /* RTC seconds register */
6900+#define RETU_REG_RTCHMR 0x04 /* RTC hours and minutes register */
6901+#define RETU_REG_RTCHMAR 0x05 /* RTC hours and minutes alarm and time set register */
6902+#define RETU_REG_RTCCALR 0x06 /* RTC calibration register */
6903+#define RETU_REG_ADCR 0x08 /* ADC result */
6904+#define RETU_REG_ADCSCR 0x09 /* ADC sample ctrl */
6905+#define RETU_REG_CC1 0x0d /* Common control register 1 */
6906+#define RETU_REG_CC2 0x0e /* Common control register 2 */
6907+#define RETU_REG_CTRL_CLR 0x0f /* Regulator clear register */
6908+#define RETU_REG_CTRL_SET 0x10 /* Regulator set register */
6909+#define RETU_REG_STATUS 0x16 /* Status register */
6910+#define RETU_REG_WATCHDOG 0x17 /* Watchdog register */
6911+#define RETU_REG_AUDTXR 0x18 /* Audio Codec Tx register */
6912+#define RETU_REG_MAX 0x1f
6913+
6914+/* Interrupt sources */
6915+#define RETU_INT_PWR 0
6916+#define RETU_INT_CHAR 1
6917+#define RETU_INT_RTCS 2
6918+#define RETU_INT_RTCM 3
6919+#define RETU_INT_RTCD 4
6920+#define RETU_INT_RTCA 5
6921+#define RETU_INT_HOOK 6
6922+#define RETU_INT_HEAD 7
6923+#define RETU_INT_ADCS 8
6924+
6925+#define MAX_RETU_IRQ_HANDLERS 16
6926+
6927+int retu_read_reg(int reg);
6928+void retu_write_reg(int reg, u16 val);
6929+void retu_set_clear_reg_bits(int reg, u16 set, u16 clear);
6930+int retu_read_adc(int channel);
6931+int retu_request_irq(int id, void *irq_handler, unsigned long arg, char *name);
6932+void retu_free_irq(int id);
6933+void retu_enable_irq(int id);
6934+void retu_disable_irq(int id);
6935+void retu_ack_irq(int id);
6936+
6937+#ifdef CONFIG_CBUS_RETU_USER
6938+int retu_user_init(void);
6939+void retu_user_cleanup(void);
6940+#endif
6941+
6942+extern spinlock_t retu_lock;
6943+
6944+#endif /* __DRIVERS_CBUS_RETU_H */
6945--- /dev/null
6946+++ b/drivers/cbus/tahvo-usb.c
6947@@ -0,0 +1,777 @@
6948+/**
6949+ * drivers/cbus/tahvo-usb.c
6950+ *
6951+ * Tahvo USB transeiver
6952+ *
6953+ * Copyright (C) 2005-2006 Nokia Corporation
6954+ *
6955+ * Parts copied from drivers/i2c/chips/isp1301_omap.c
6956+ * Copyright (C) 2004 Texas Instruments
6957+ * Copyright (C) 2004 David Brownell
6958+ *
6959+ * Written by Juha Yrjölä <juha.yrjola@nokia.com>,
6960+ * Tony Lindgren <tony@atomide.com>, and
6961+ * Timo Teräs <timo.teras@nokia.com>
6962+ *
6963+ * This file is subject to the terms and conditions of the GNU General
6964+ * Public License. See the file "COPYING" in the main directory of this
6965+ * archive for more details.
6966+ *
6967+ * This program is distributed in the hope that it will be useful,
6968+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
6969+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6970+ * GNU General Public License for more details.
6971+ *
6972+ * You should have received a copy of the GNU General Public License
6973+ * along with this program; if not, write to the Free Software
6974+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
6975+ */
6976+
6977+#include <linux/kernel.h>
6978+#include <linux/module.h>
6979+#include <linux/init.h>
6980+#include <linux/slab.h>
6981+#include <linux/io.h>
6982+#include <linux/interrupt.h>
6983+#include <linux/platform_device.h>
6984+#include <linux/usb/ch9.h>
6985+#include <linux/usb/gadget.h>
6986+#include <linux/usb.h>
6987+#include <linux/usb/otg.h>
6988+#include <linux/i2c.h>
6989+#include <linux/workqueue.h>
6990+#include <linux/kobject.h>
6991+#include <linux/clk.h>
6992+#include <linux/mutex.h>
6993+
6994+#include <asm/irq.h>
6995+#include <mach/usb.h>
6996+
6997+#include "cbus.h"
6998+#include "tahvo.h"
6999+
7000+#define DRIVER_NAME "tahvo-usb"
7001+
7002+#define USBR_SLAVE_CONTROL (1 << 8)
7003+#define USBR_VPPVIO_SW (1 << 7)
7004+#define USBR_SPEED (1 << 6)
7005+#define USBR_REGOUT (1 << 5)
7006+#define USBR_MASTER_SW2 (1 << 4)
7007+#define USBR_MASTER_SW1 (1 << 3)
7008+#define USBR_SLAVE_SW (1 << 2)
7009+#define USBR_NSUSPEND (1 << 1)
7010+#define USBR_SEMODE (1 << 0)
7011+
7012+/* bits in OTG_CTRL */
7013+
7014+/* Bits that are controlled by OMAP OTG and are read-only */
7015+#define OTG_CTRL_OMAP_MASK (OTG_PULLDOWN|OTG_PULLUP|OTG_DRV_VBUS|\
7016+ OTG_PD_VBUS|OTG_PU_VBUS|OTG_PU_ID)
7017+/* Bits that are controlled by transceiver */
7018+#define OTG_CTRL_XCVR_MASK (OTG_ASESSVLD|OTG_BSESSEND|\
7019+ OTG_BSESSVLD|OTG_VBUSVLD|OTG_ID)
7020+/* Bits that are controlled by system */
7021+#define OTG_CTRL_SYS_MASK (OTG_A_BUSREQ|OTG_A_SETB_HNPEN|OTG_B_BUSREQ|\
7022+ OTG_B_HNPEN|OTG_BUSDROP)
7023+
7024+#if defined(CONFIG_USB_OHCI_HCD) && !defined(CONFIG_USB_OTG)
7025+#error tahvo-otg.c does not work with OCHI yet!
7026+#endif
7027+
7028+#define TAHVO_MODE_HOST 0
7029+#define TAHVO_MODE_PERIPHERAL 1
7030+
7031+#ifdef CONFIG_USB_OTG
7032+#define TAHVO_MODE(tu) (tu)->tahvo_mode
7033+#elif defined(CONFIG_USB_GADGET_OMAP)
7034+#define TAHVO_MODE(tu) TAHVO_MODE_PERIPHERAL
7035+#else
7036+#define TAHVO_MODE(tu) TAHVO_MODE_HOST
7037+#endif
7038+
7039+struct tahvo_usb {
7040+ struct platform_device *pt_dev;
7041+ struct otg_transceiver otg;
7042+ int vbus_state;
7043+ struct work_struct irq_work;
7044+ struct mutex serialize;
7045+#ifdef CONFIG_USB_OTG
7046+ int tahvo_mode;
7047+#endif
7048+};
7049+static struct platform_device tahvo_usb_device;
7050+
7051+/*
7052+ * ---------------------------------------------------------------------------
7053+ * OTG related functions
7054+ *
7055+ * These shoud be separated into omap-otg.c driver module, as they are used
7056+ * by various transceivers. These functions are needed in the UDC-only case
7057+ * as well. These functions are copied from GPL isp1301_omap.c
7058+ * ---------------------------------------------------------------------------
7059+ */
7060+static struct platform_device *tahvo_otg_dev;
7061+
7062+static irqreturn_t omap_otg_irq(int irq, void *arg)
7063+{
7064+ struct platform_device *otg_dev = (struct platform_device *) arg;
7065+ struct tahvo_usb *tu = (struct tahvo_usb *) otg_dev->dev.driver_data;
7066+ u16 otg_irq;
7067+
7068+ otg_irq = omap_readw(OTG_IRQ_SRC);
7069+ if (otg_irq & OPRT_CHG) {
7070+ omap_writew(OPRT_CHG, OTG_IRQ_SRC);
7071+ } else if (otg_irq & B_SRP_TMROUT) {
7072+ omap_writew(B_SRP_TMROUT, OTG_IRQ_SRC);
7073+ } else if (otg_irq & B_HNP_FAIL) {
7074+ omap_writew(B_HNP_FAIL, OTG_IRQ_SRC);
7075+ } else if (otg_irq & A_SRP_DETECT) {
7076+ omap_writew(A_SRP_DETECT, OTG_IRQ_SRC);
7077+ } else if (otg_irq & A_REQ_TMROUT) {
7078+ omap_writew(A_REQ_TMROUT, OTG_IRQ_SRC);
7079+ } else if (otg_irq & A_VBUS_ERR) {
7080+ omap_writew(A_VBUS_ERR, OTG_IRQ_SRC);
7081+ } else if (otg_irq & DRIVER_SWITCH) {
7082+ if ((!(omap_readl(OTG_CTRL) & OTG_DRIVER_SEL)) &&
7083+ tu->otg.host && tu->otg.state == OTG_STATE_A_HOST) {
7084+ /* role is host */
7085+ usb_bus_start_enum(tu->otg.host,
7086+ tu->otg.host->otg_port);
7087+ }
7088+ omap_writew(DRIVER_SWITCH, OTG_IRQ_SRC);
7089+ } else
7090+ return IRQ_NONE;
7091+
7092+ return IRQ_HANDLED;
7093+
7094+}
7095+
7096+static int omap_otg_init(void)
7097+{
7098+ u32 l;
7099+
7100+#ifdef CONFIG_USB_OTG
7101+ if (!tahvo_otg_dev) {
7102+ printk("tahvo-usb: no tahvo_otg_dev\n");
7103+ return -ENODEV;
7104+ }
7105+#endif
7106+
7107+ l = omap_readl(OTG_SYSCON_1);
7108+ l &= ~OTG_IDLE_EN;
7109+ omap_writel(l, OTG_SYSCON_1);
7110+ udelay(100);
7111+
7112+ /* some of these values are board-specific... */
7113+ l = omap_readl(OTG_SYSCON_2);
7114+ l |= OTG_EN
7115+ /* for B-device: */
7116+ | SRP_GPDATA /* 9msec Bdev D+ pulse */
7117+ | SRP_GPDVBUS /* discharge after VBUS pulse */
7118+ // | (3 << 24) /* 2msec VBUS pulse */
7119+ /* for A-device: */
7120+ | (0 << 20) /* 200ms nominal A_WAIT_VRISE timer */
7121+ | SRP_DPW /* detect 167+ns SRP pulses */
7122+ | SRP_DATA | SRP_VBUS; /* accept both kinds of SRP pulse */
7123+ omap_writel(l, OTG_SYSCON_2);
7124+
7125+ omap_writew(DRIVER_SWITCH | OPRT_CHG
7126+ | B_SRP_TMROUT | B_HNP_FAIL
7127+ | A_VBUS_ERR | A_SRP_DETECT | A_REQ_TMROUT,
7128+ OTG_IRQ_EN);
7129+ l = omap_readl(OTG_SYSCON_2);
7130+ l |= OTG_EN;
7131+ omap_writel(l, OTG_SYSCON_2);
7132+
7133+ return 0;
7134+}
7135+
7136+static int omap_otg_probe(struct device *dev)
7137+{
7138+ int ret;
7139+
7140+ tahvo_otg_dev = to_platform_device(dev);
7141+ ret = omap_otg_init();
7142+ if (ret != 0) {
7143+ printk(KERN_ERR "tahvo-usb: omap_otg_init failed\n");
7144+ return ret;
7145+ }
7146+
7147+ return request_irq(tahvo_otg_dev->resource[1].start,
7148+ omap_otg_irq, IRQF_DISABLED, DRIVER_NAME,
7149+ &tahvo_usb_device);
7150+}
7151+
7152+static int omap_otg_remove(struct device *dev)
7153+{
7154+ free_irq(tahvo_otg_dev->resource[1].start, &tahvo_usb_device);
7155+ tahvo_otg_dev = NULL;
7156+
7157+ return 0;
7158+}
7159+
7160+struct device_driver omap_otg_driver = {
7161+ .name = "omap_otg",
7162+ .bus = &platform_bus_type,
7163+ .probe = omap_otg_probe,
7164+ .remove = omap_otg_remove,
7165+};
7166+
7167+/*
7168+ * ---------------------------------------------------------------------------
7169+ * Tahvo related functions
7170+ * These are Nokia proprietary code, except for the OTG register settings,
7171+ * which are copied from isp1301.c
7172+ * ---------------------------------------------------------------------------
7173+ */
7174+static ssize_t vbus_state_show(struct device *device,
7175+ struct device_attribute *attr, char *buf)
7176+{
7177+ struct tahvo_usb *tu = (struct tahvo_usb*) device->driver_data;
7178+ return sprintf(buf, "%d\n", tu->vbus_state);
7179+}
7180+static DEVICE_ATTR(vbus_state, 0444, vbus_state_show, NULL);
7181+
7182+int vbus_active = 0;
7183+
7184+#if 0
7185+
7186+static int host_suspend(struct tahvo_usb *tu)
7187+{
7188+ struct device *dev;
7189+
7190+ if (!tu->otg.host)
7191+ return -ENODEV;
7192+
7193+ /* Currently ASSUMES only the OTG port matters;
7194+ * other ports could be active...
7195+ */
7196+ dev = tu->otg.host->controller;
7197+ return dev->driver->suspend(dev, PMSG_SUSPEND);
7198+}
7199+
7200+static int host_resume(struct tahvo_usb *tu)
7201+{
7202+ struct device *dev;
7203+
7204+ if (!tu->otg.host)
7205+ return -ENODEV;
7206+
7207+ dev = tu->otg.host->controller;
7208+ return dev->driver->resume(dev);
7209+}
7210+
7211+#else
7212+
7213+static int host_suspend(struct tahvo_usb *tu)
7214+{
7215+ return 0;
7216+}
7217+
7218+static int host_resume(struct tahvo_usb *tu)
7219+{
7220+ return 0;
7221+}
7222+
7223+#endif
7224+
7225+static void check_vbus_state(struct tahvo_usb *tu)
7226+{
7227+ int reg, prev_state;
7228+
7229+ reg = tahvo_read_reg(TAHVO_REG_IDSR);
7230+ if (reg & 0x01) {
7231+ u32 l;
7232+
7233+ vbus_active = 1;
7234+ switch (tu->otg.state) {
7235+ case OTG_STATE_B_IDLE:
7236+ /* Enable the gadget driver */
7237+ if (tu->otg.gadget)
7238+ usb_gadget_vbus_connect(tu->otg.gadget);
7239+ /* Set B-session valid and not B-sessio ended to indicate
7240+ * Vbus to be ok. */
7241+ l = omap_readl(OTG_CTRL);
7242+ l &= ~OTG_BSESSEND;
7243+ l |= OTG_BSESSVLD;
7244+ omap_writel(l, OTG_CTRL);
7245+
7246+ tu->otg.state = OTG_STATE_B_PERIPHERAL;
7247+ break;
7248+ case OTG_STATE_A_IDLE:
7249+ /* Session is now valid assuming the USB hub is driving Vbus */
7250+ tu->otg.state = OTG_STATE_A_HOST;
7251+ host_resume(tu);
7252+ break;
7253+ default:
7254+ break;
7255+ }
7256+ printk("USB cable connected\n");
7257+ } else {
7258+ switch (tu->otg.state) {
7259+ case OTG_STATE_B_PERIPHERAL:
7260+ if (tu->otg.gadget)
7261+ usb_gadget_vbus_disconnect(tu->otg.gadget);
7262+ tu->otg.state = OTG_STATE_B_IDLE;
7263+ break;
7264+ case OTG_STATE_A_HOST:
7265+ tu->otg.state = OTG_STATE_A_IDLE;
7266+ break;
7267+ default:
7268+ break;
7269+ }
7270+ printk("USB cable disconnected\n");
7271+ vbus_active = 0;
7272+ }
7273+
7274+ prev_state = tu->vbus_state;
7275+ tu->vbus_state = reg & 0x01;
7276+ if (prev_state != tu->vbus_state)
7277+ sysfs_notify(&tu->pt_dev->dev.kobj, NULL, "vbus_state");
7278+}
7279+
7280+static void tahvo_usb_become_host(struct tahvo_usb *tu)
7281+{
7282+ u32 l;
7283+
7284+ /* Clear system and transceiver controlled bits
7285+ * also mark the A-session is always valid */
7286+ omap_otg_init();
7287+
7288+ l = omap_readl(OTG_CTRL);
7289+ l &= ~(OTG_CTRL_XCVR_MASK | OTG_CTRL_SYS_MASK);
7290+ l |= OTG_ASESSVLD;
7291+ omap_writel(l, OTG_CTRL);
7292+
7293+ /* Power up the transceiver in USB host mode */
7294+ tahvo_write_reg(TAHVO_REG_USBR, USBR_REGOUT | USBR_NSUSPEND |
7295+ USBR_MASTER_SW2 | USBR_MASTER_SW1);
7296+ tu->otg.state = OTG_STATE_A_IDLE;
7297+
7298+ check_vbus_state(tu);
7299+}
7300+
7301+static void tahvo_usb_stop_host(struct tahvo_usb *tu)
7302+{
7303+ host_suspend(tu);
7304+ tu->otg.state = OTG_STATE_A_IDLE;
7305+}
7306+
7307+static void tahvo_usb_become_peripheral(struct tahvo_usb *tu)
7308+{
7309+ u32 l;
7310+
7311+ /* Clear system and transceiver controlled bits
7312+ * and enable ID to mark peripheral mode and
7313+ * BSESSEND to mark no Vbus */
7314+ omap_otg_init();
7315+ l = omap_readl(OTG_CTRL);
7316+ l &= ~(OTG_CTRL_XCVR_MASK | OTG_CTRL_SYS_MASK | OTG_BSESSVLD);
7317+ l |= OTG_ID | OTG_BSESSEND;
7318+ omap_writel(l, OTG_CTRL);
7319+
7320+ /* Power up transceiver and set it in USB perhiperal mode */
7321+ tahvo_write_reg(TAHVO_REG_USBR, USBR_SLAVE_CONTROL | USBR_REGOUT | USBR_NSUSPEND | USBR_SLAVE_SW);
7322+ tu->otg.state = OTG_STATE_B_IDLE;
7323+
7324+ check_vbus_state(tu);
7325+}
7326+
7327+static void tahvo_usb_stop_peripheral(struct tahvo_usb *tu)
7328+{
7329+ u32 l;
7330+
7331+ l = omap_readl(OTG_CTRL);
7332+ l &= ~OTG_BSESSVLD;
7333+ l |= OTG_BSESSEND;
7334+ omap_writel(l, OTG_CTRL);
7335+
7336+ if (tu->otg.gadget)
7337+ usb_gadget_vbus_disconnect(tu->otg.gadget);
7338+ tu->otg.state = OTG_STATE_B_IDLE;
7339+
7340+}
7341+
7342+static void tahvo_usb_power_off(struct tahvo_usb *tu)
7343+{
7344+ u32 l;
7345+ int id;
7346+
7347+ /* Disable gadget controller if any */
7348+ if (tu->otg.gadget)
7349+ usb_gadget_vbus_disconnect(tu->otg.gadget);
7350+
7351+ host_suspend(tu);
7352+
7353+ /* Disable OTG and interrupts */
7354+ if (TAHVO_MODE(tu) == TAHVO_MODE_PERIPHERAL)
7355+ id = OTG_ID;
7356+ else
7357+ id = 0;
7358+ l = omap_readl(OTG_CTRL);
7359+ l &= ~(OTG_CTRL_XCVR_MASK | OTG_CTRL_SYS_MASK | OTG_BSESSVLD);
7360+ l |= id | OTG_BSESSEND;
7361+ omap_writel(l, OTG_CTRL);
7362+ omap_writew(0, OTG_IRQ_EN);
7363+
7364+ l = omap_readl(OTG_SYSCON_2);
7365+ l &= ~OTG_EN;
7366+ omap_writel(l, OTG_SYSCON_2);
7367+
7368+ l = omap_readl(OTG_SYSCON_1);
7369+ l |= OTG_IDLE_EN;
7370+ omap_writel(l, OTG_SYSCON_1);
7371+
7372+ /* Power off transceiver */
7373+ tahvo_write_reg(TAHVO_REG_USBR, 0);
7374+ tu->otg.state = OTG_STATE_UNDEFINED;
7375+}
7376+
7377+
7378+static int tahvo_usb_set_power(struct otg_transceiver *dev, unsigned mA)
7379+{
7380+ struct tahvo_usb *tu = container_of(dev, struct tahvo_usb, otg);
7381+
7382+ dev_dbg(&tu->pt_dev->dev, "set_power %d mA\n", mA);
7383+
7384+ if (dev->state == OTG_STATE_B_PERIPHERAL) {
7385+ /* REVISIT: Can Tahvo charge battery from VBUS? */
7386+ }
7387+ return 0;
7388+}
7389+
7390+static int tahvo_usb_set_suspend(struct otg_transceiver *dev, int suspend)
7391+{
7392+ struct tahvo_usb *tu = container_of(dev, struct tahvo_usb, otg);
7393+ u16 w;
7394+
7395+ dev_dbg(&tu->pt_dev->dev, "set_suspend\n");
7396+
7397+ w = tahvo_read_reg(TAHVO_REG_USBR);
7398+ if (suspend)
7399+ w &= ~USBR_NSUSPEND;
7400+ else
7401+ w |= USBR_NSUSPEND;
7402+ tahvo_write_reg(TAHVO_REG_USBR, w);
7403+
7404+ return 0;
7405+}
7406+
7407+static int tahvo_usb_start_srp(struct otg_transceiver *dev)
7408+{
7409+ struct tahvo_usb *tu = container_of(dev, struct tahvo_usb, otg);
7410+ u32 otg_ctrl;
7411+
7412+ dev_dbg(&tu->pt_dev->dev, "start_srp\n");
7413+
7414+ if (!dev || tu->otg.state != OTG_STATE_B_IDLE)
7415+ return -ENODEV;
7416+
7417+ otg_ctrl = omap_readl(OTG_CTRL);
7418+ if (!(otg_ctrl & OTG_BSESSEND))
7419+ return -EINVAL;
7420+
7421+ otg_ctrl |= OTG_B_BUSREQ;
7422+ otg_ctrl &= ~OTG_A_BUSREQ & OTG_CTRL_SYS_MASK;
7423+ omap_writel(otg_ctrl, OTG_CTRL);
7424+ tu->otg.state = OTG_STATE_B_SRP_INIT;
7425+
7426+ return 0;
7427+}
7428+
7429+static int tahvo_usb_start_hnp(struct otg_transceiver *otg)
7430+{
7431+ struct tahvo_usb *tu = container_of(otg, struct tahvo_usb, otg);
7432+
7433+ dev_dbg(&tu->pt_dev->dev, "start_hnp\n");
7434+#ifdef CONFIG_USB_OTG
7435+ /* REVISIT: Add this for OTG */
7436+#endif
7437+ return -EINVAL;
7438+}
7439+
7440+static int tahvo_usb_set_host(struct otg_transceiver *otg, struct usb_bus *host)
7441+{
7442+ struct tahvo_usb *tu = container_of(otg, struct tahvo_usb, otg);
7443+ u32 l;
7444+
7445+ dev_dbg(&tu->pt_dev->dev, "set_host %p\n", host);
7446+
7447+ if (otg == NULL)
7448+ return -ENODEV;
7449+
7450+#if defined(CONFIG_USB_OTG) || !defined(CONFIG_USB_GADGET_OMAP)
7451+
7452+ mutex_lock(&tu->serialize);
7453+
7454+ if (host == NULL) {
7455+ if (TAHVO_MODE(tu) == TAHVO_MODE_HOST)
7456+ tahvo_usb_power_off(tu);
7457+ tu->otg.host = NULL;
7458+ mutex_unlock(&tu->serialize);
7459+ return 0;
7460+ }
7461+
7462+ l = omap_readl(OTG_SYSCON_1);
7463+ l &= ~(OTG_IDLE_EN | HST_IDLE_EN | DEV_IDLE_EN);
7464+ omap_writel(l, OTG_SYSCON_1);
7465+
7466+ if (TAHVO_MODE(tu) == TAHVO_MODE_HOST) {
7467+ tu->otg.host = NULL;
7468+ tahvo_usb_become_host(tu);
7469+ } else
7470+ host_suspend(tu);
7471+
7472+ tu->otg.host = host;
7473+
7474+ mutex_unlock(&tu->serialize);
7475+#else
7476+ /* No host mode configured, so do not allow host controlled to be set */
7477+ return -EINVAL;
7478+#endif
7479+
7480+ return 0;
7481+}
7482+
7483+static int tahvo_usb_set_peripheral(struct otg_transceiver *otg, struct usb_gadget *gadget)
7484+{
7485+ struct tahvo_usb *tu = container_of(otg, struct tahvo_usb, otg);
7486+
7487+ dev_dbg(&tu->pt_dev->dev, "set_peripheral %p\n", gadget);
7488+
7489+ if (!otg)
7490+ return -ENODEV;
7491+
7492+#if defined(CONFIG_USB_OTG) || defined(CONFIG_USB_GADGET_OMAP)
7493+
7494+ mutex_lock(&tu->serialize);
7495+
7496+ if (!gadget) {
7497+ if (TAHVO_MODE(tu) == TAHVO_MODE_PERIPHERAL)
7498+ tahvo_usb_power_off(tu);
7499+ tu->otg.gadget = NULL;
7500+ mutex_unlock(&tu->serialize);
7501+ return 0;
7502+ }
7503+
7504+ tu->otg.gadget = gadget;
7505+ if (TAHVO_MODE(tu) == TAHVO_MODE_PERIPHERAL)
7506+ tahvo_usb_become_peripheral(tu);
7507+
7508+ mutex_unlock(&tu->serialize);
7509+#else
7510+ /* No gadget mode configured, so do not allow host controlled to be set */
7511+ return -EINVAL;
7512+#endif
7513+
7514+ return 0;
7515+}
7516+
7517+static void tahvo_usb_irq_work(struct work_struct *work)
7518+{
7519+ struct tahvo_usb *tu = container_of(work, struct tahvo_usb, irq_work);
7520+
7521+ mutex_lock(&tu->serialize);
7522+ check_vbus_state(tu);
7523+ mutex_unlock(&tu->serialize);
7524+}
7525+
7526+static void tahvo_usb_vbus_interrupt(unsigned long arg)
7527+{
7528+ struct tahvo_usb *tu = (struct tahvo_usb *) arg;
7529+
7530+ tahvo_ack_irq(TAHVO_INT_VBUSON);
7531+ /* Seems we need this to acknowledge the interrupt */
7532+ tahvo_read_reg(TAHVO_REG_IDSR);
7533+ schedule_work(&tu->irq_work);
7534+}
7535+
7536+#ifdef CONFIG_USB_OTG
7537+static ssize_t otg_mode_show(struct device *device,
7538+ struct device_attribute *attr, char *buf)
7539+{
7540+ struct tahvo_usb *tu = (struct tahvo_usb*) device->driver_data;
7541+ switch (tu->tahvo_mode) {
7542+ case TAHVO_MODE_HOST:
7543+ return sprintf(buf, "host\n");
7544+ case TAHVO_MODE_PERIPHERAL:
7545+ return sprintf(buf, "peripheral\n");
7546+ }
7547+ return sprintf(buf, "unknown\n");
7548+}
7549+
7550+static ssize_t otg_mode_store(struct device *device,
7551+ struct device_attribute *attr,
7552+ const char *buf, size_t count)
7553+{
7554+ struct tahvo_usb *tu = (struct tahvo_usb*) device->driver_data;
7555+ int r;
7556+
7557+ r = strlen(buf);
7558+ mutex_lock(&tu->serialize);
7559+ if (strncmp(buf, "host", 4) == 0) {
7560+ if (tu->tahvo_mode == TAHVO_MODE_PERIPHERAL)
7561+ tahvo_usb_stop_peripheral(tu);
7562+ tu->tahvo_mode = TAHVO_MODE_HOST;
7563+ if (tu->otg.host) {
7564+ printk(KERN_INFO "Selected HOST mode: host controller present.\n");
7565+ tahvo_usb_become_host(tu);
7566+ } else {
7567+ printk(KERN_INFO "Selected HOST mode: no host controller, powering off.\n");
7568+ tahvo_usb_power_off(tu);
7569+ }
7570+ } else if (strncmp(buf, "peripheral", 10) == 0) {
7571+ if (tu->tahvo_mode == TAHVO_MODE_HOST)
7572+ tahvo_usb_stop_host(tu);
7573+ tu->tahvo_mode = TAHVO_MODE_PERIPHERAL;
7574+ if (tu->otg.gadget) {
7575+ printk(KERN_INFO "Selected PERIPHERAL mode: gadget driver present.\n");
7576+ tahvo_usb_become_peripheral(tu);
7577+ } else {
7578+ printk(KERN_INFO "Selected PERIPHERAL mode: no gadget driver, powering off.\n");
7579+ tahvo_usb_power_off(tu);
7580+ }
7581+ } else
7582+ r = -EINVAL;
7583+
7584+ mutex_unlock(&tu->serialize);
7585+ return r;
7586+}
7587+
7588+static DEVICE_ATTR(otg_mode, 0644, otg_mode_show, otg_mode_store);
7589+#endif
7590+
7591+static int tahvo_usb_probe(struct device *dev)
7592+{
7593+ struct tahvo_usb *tu;
7594+ int ret;
7595+
7596+ dev_dbg(dev, "probe\n");
7597+
7598+ /* Create driver data */
7599+ tu = kmalloc(sizeof(*tu), GFP_KERNEL);
7600+ if (!tu)
7601+ return -ENOMEM;
7602+ memset(tu, 0, sizeof(*tu));
7603+ tu->pt_dev = container_of(dev, struct platform_device, dev);
7604+#ifdef CONFIG_USB_OTG
7605+ /* Default mode */
7606+#ifdef CONFIG_CBUS_TAHVO_USB_HOST_BY_DEFAULT
7607+ tu->tahvo_mode = TAHVO_MODE_HOST;
7608+#else
7609+ tu->tahvo_mode = TAHVO_MODE_PERIPHERAL;
7610+#endif
7611+#endif
7612+
7613+ INIT_WORK(&tu->irq_work, tahvo_usb_irq_work);
7614+ mutex_init(&tu->serialize);
7615+
7616+ /* Set initial state, so that we generate kevents only on
7617+ * state changes */
7618+ tu->vbus_state = tahvo_read_reg(TAHVO_REG_IDSR) & 0x01;
7619+
7620+ /* We cannot enable interrupt until omap_udc is initialized */
7621+ ret = tahvo_request_irq(TAHVO_INT_VBUSON, tahvo_usb_vbus_interrupt,
7622+ (unsigned long) tu, "vbus_interrupt");
7623+ if (ret != 0) {
7624+ kfree(tu);
7625+ printk(KERN_ERR "Could not register Tahvo interrupt for VBUS\n");
7626+ return ret;
7627+ }
7628+
7629+ /* Attributes */
7630+ ret = device_create_file(dev, &dev_attr_vbus_state);
7631+#ifdef CONFIG_USB_OTG
7632+ ret |= device_create_file(dev, &dev_attr_otg_mode);
7633+#endif
7634+ if (ret)
7635+ printk(KERN_ERR "attribute creation failed: %d\n", ret);
7636+
7637+ /* Create OTG interface */
7638+ tahvo_usb_power_off(tu);
7639+ tu->otg.state = OTG_STATE_UNDEFINED;
7640+ tu->otg.label = DRIVER_NAME;
7641+ tu->otg.set_host = tahvo_usb_set_host;
7642+ tu->otg.set_peripheral = tahvo_usb_set_peripheral;
7643+ tu->otg.set_power = tahvo_usb_set_power;
7644+ tu->otg.set_suspend = tahvo_usb_set_suspend;
7645+ tu->otg.start_srp = tahvo_usb_start_srp;
7646+ tu->otg.start_hnp = tahvo_usb_start_hnp;
7647+
7648+ ret = otg_set_transceiver(&tu->otg);
7649+ if (ret < 0) {
7650+ printk(KERN_ERR "Cannot register USB transceiver\n");
7651+ kfree(tu);
7652+ tahvo_free_irq(TAHVO_INT_VBUSON);
7653+ return ret;
7654+ }
7655+
7656+ dev->driver_data = tu;
7657+
7658+ /* Act upon current vbus state once at startup. A vbus state irq may or
7659+ * may not be generated in addition to this. */
7660+ schedule_work(&tu->irq_work);
7661+ return 0;
7662+}
7663+
7664+static int tahvo_usb_remove(struct device *dev)
7665+{
7666+ dev_dbg(dev, "remove\n");
7667+
7668+ tahvo_free_irq(TAHVO_INT_VBUSON);
7669+ flush_scheduled_work();
7670+ otg_set_transceiver(0);
7671+ device_remove_file(dev, &dev_attr_vbus_state);
7672+#ifdef CONFIG_USB_OTG
7673+ device_remove_file(dev, &dev_attr_otg_mode);
7674+#endif
7675+ return 0;
7676+}
7677+
7678+static struct device_driver tahvo_usb_driver = {
7679+ .name = "tahvo-usb",
7680+ .bus = &platform_bus_type,
7681+ .probe = tahvo_usb_probe,
7682+ .remove = tahvo_usb_remove,
7683+};
7684+
7685+static struct platform_device tahvo_usb_device = {
7686+ .name = "tahvo-usb",
7687+ .id = -1,
7688+};
7689+
7690+static int __init tahvo_usb_init(void)
7691+{
7692+ int ret = 0;
7693+
7694+ printk(KERN_INFO "Tahvo USB transceiver driver initializing\n");
7695+ ret = driver_register(&tahvo_usb_driver);
7696+ if (ret)
7697+ return ret;
7698+ ret = platform_device_register(&tahvo_usb_device);
7699+ if (ret < 0) {
7700+ driver_unregister(&tahvo_usb_driver);
7701+ return ret;
7702+ }
7703+ ret = driver_register(&omap_otg_driver);
7704+ if (ret) {
7705+ platform_device_unregister(&tahvo_usb_device);
7706+ driver_unregister(&tahvo_usb_driver);
7707+ return ret;
7708+ }
7709+ return 0;
7710+}
7711+
7712+subsys_initcall(tahvo_usb_init);
7713+
7714+static void __exit tahvo_usb_exit(void)
7715+{
7716+ driver_unregister(&omap_otg_driver);
7717+ platform_device_unregister(&tahvo_usb_device);
7718+ driver_unregister(&tahvo_usb_driver);
7719+}
7720+module_exit(tahvo_usb_exit);
7721+
7722+MODULE_DESCRIPTION("Tahvo USB OTG Transceiver Driver");
7723+MODULE_LICENSE("GPL");
7724+MODULE_AUTHOR("Juha Yrjölä, Tony Lindgren, and Timo Teräs");
7725--- /dev/null
7726+++ b/drivers/cbus/tahvo-user.c
7727@@ -0,0 +1,405 @@
7728+/**
7729+ * drivers/cbus/tahvo-user.c
7730+ *
7731+ * Tahvo user space interface functions
7732+ *
7733+ * Copyright (C) 2004, 2005 Nokia Corporation
7734+ *
7735+ * Written by Mikko Ylinen <mikko.k.ylinen@nokia.com>
7736+ *
7737+ * This file is subject to the terms and conditions of the GNU General
7738+ * Public License. See the file "COPYING" in the main directory of this
7739+ * archive for more details.
7740+ *
7741+ * This program is distributed in the hope that it will be useful,
7742+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
7743+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7744+ * GNU General Public License for more details.
7745+ *
7746+ * You should have received a copy of the GNU General Public License
7747+ * along with this program; if not, write to the Free Software
7748+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
7749+ */
7750+
7751+#include <linux/types.h>
7752+#include <linux/kernel.h>
7753+#include <linux/interrupt.h>
7754+#include <linux/module.h>
7755+#include <linux/init.h>
7756+#include <linux/fs.h>
7757+#include <linux/miscdevice.h>
7758+#include <linux/poll.h>
7759+#include <linux/list.h>
7760+#include <linux/spinlock.h>
7761+#include <linux/mutex.h>
7762+
7763+#include <asm/uaccess.h>
7764+
7765+#include "tahvo.h"
7766+
7767+#include "user_retu_tahvo.h"
7768+
7769+/* Maximum size of IRQ node buffer/pool */
7770+#define TAHVO_MAX_IRQ_BUF_LEN 16
7771+
7772+#define PFX "tahvo-user: "
7773+
7774+/* Bitmap for marking the interrupt sources as having the handlers */
7775+static u32 tahvo_irq_bits;
7776+
7777+/* For allowing only one user process to subscribe to the tahvo interrupts */
7778+static struct file *tahvo_irq_subscr = NULL;
7779+
7780+/* For poll and IRQ passing */
7781+struct tahvo_irq {
7782+ u32 id;
7783+ struct list_head node;
7784+};
7785+
7786+static spinlock_t tahvo_irqs_lock;
7787+static struct tahvo_irq *tahvo_irq_block;
7788+static LIST_HEAD(tahvo_irqs);
7789+static LIST_HEAD(tahvo_irqs_reserve);
7790+
7791+/* Wait queue - used when user wants to read the device */
7792+DECLARE_WAIT_QUEUE_HEAD(tahvo_user_waitqueue);
7793+
7794+/* Semaphore to protect irq subscription sequence */
7795+static struct mutex tahvo_mutex;
7796+
7797+/* This array specifies TAHVO register types (read/write/toggle) */
7798+static const u8 tahvo_access_bits[] = {
7799+ 1,
7800+ 4,
7801+ 1,
7802+ 3,
7803+ 3,
7804+ 3,
7805+ 3,
7806+ 3,
7807+ 3,
7808+ 3,
7809+ 3,
7810+ 3,
7811+ 3,
7812+ 1
7813+};
7814+
7815+/*
7816+ * The handler for all TAHVO interrupts.
7817+ *
7818+ * arg is the interrupt source in TAHVO.
7819+ */
7820+static void tahvo_user_irq_handler(unsigned long arg)
7821+{
7822+ struct tahvo_irq *irq;
7823+
7824+ /* user has to re-enable the interrupt once ready
7825+ * for receiving them again */
7826+ tahvo_disable_irq(arg);
7827+ tahvo_ack_irq(arg);
7828+
7829+ spin_lock(&tahvo_irqs_lock);
7830+ if (list_empty(&tahvo_irqs_reserve)) {
7831+ spin_unlock(&tahvo_irqs_lock);
7832+ return;
7833+ }
7834+ irq = list_entry((&tahvo_irqs_reserve)->next, struct tahvo_irq, node);
7835+ irq->id = arg;
7836+ list_move_tail(&irq->node, &tahvo_irqs);
7837+ spin_unlock(&tahvo_irqs_lock);
7838+
7839+ /* wake up waiting thread */
7840+ wake_up(&tahvo_user_waitqueue);
7841+}
7842+
7843+/*
7844+ * This routine sets up the interrupt handler and marks an interrupt source
7845+ * in TAHVO as a candidate for signal delivery to the user process.
7846+ */
7847+static int tahvo_user_subscribe_to_irq(int id, struct file *filp)
7848+{
7849+ int ret;
7850+
7851+ mutex_lock(&tahvo_mutex);
7852+ if ((tahvo_irq_subscr != NULL) && (tahvo_irq_subscr != filp)) {
7853+ mutex_unlock(&tahvo_mutex);
7854+ return -EBUSY;
7855+ }
7856+ /* Store the file pointer of the first user process registering IRQs */
7857+ tahvo_irq_subscr = filp;
7858+ mutex_unlock(&tahvo_mutex);
7859+
7860+ if (tahvo_irq_bits & (1 << id))
7861+ return 0;
7862+
7863+ ret = tahvo_request_irq(id, tahvo_user_irq_handler, id, "");
7864+ if (ret < 0)
7865+ return ret;
7866+
7867+ /* Mark that this interrupt has a handler */
7868+ tahvo_irq_bits |= 1 << id;
7869+
7870+ return 0;
7871+}
7872+
7873+/*
7874+ * Unregister all TAHVO interrupt handlers
7875+ */
7876+static void tahvo_unreg_irq_handlers(void)
7877+{
7878+ int id;
7879+
7880+ if (!tahvo_irq_bits)
7881+ return;
7882+
7883+ for (id = 0; id < MAX_TAHVO_IRQ_HANDLERS; id++)
7884+ if (tahvo_irq_bits & (1 << id))
7885+ tahvo_free_irq(id);
7886+
7887+ tahvo_irq_bits = 0;
7888+}
7889+
7890+/*
7891+ * Write to TAHVO register.
7892+ * Returns 0 upon success, a negative error value otherwise.
7893+ */
7894+static int tahvo_user_write_with_mask(u32 field, u16 value)
7895+{
7896+ u32 mask;
7897+ u32 reg;
7898+ u_short tmp;
7899+ unsigned long flags;
7900+
7901+ mask = MASK(field);
7902+ reg = REG(field);
7903+
7904+ /* Detect bad mask and reg */
7905+ if (mask == 0 || reg > TAHVO_REG_MAX ||
7906+ tahvo_access_bits[reg] == READ_ONLY) {
7907+ printk(KERN_ERR PFX "invalid arguments (reg=%#x, mask=%#x)\n",
7908+ reg, mask);
7909+ return -EINVAL;
7910+ }
7911+
7912+ /* Justify value according to mask */
7913+ while (!(mask & 1)) {
7914+ value = value << 1;
7915+ mask = mask >> 1;
7916+ }
7917+
7918+ spin_lock_irqsave(&tahvo_lock, flags);
7919+ if (tahvo_access_bits[reg] == TOGGLE) {
7920+ /* No need to detect previous content of register */
7921+ tmp = 0;
7922+ } else {
7923+ /* Read current value of register */
7924+ tmp = tahvo_read_reg(reg);
7925+ }
7926+ /* Generate a new value */
7927+ tmp = (tmp & ~MASK(field)) | (value & MASK(field));
7928+ /* Write data to TAHVO */
7929+ tahvo_write_reg(reg, tmp);
7930+ spin_unlock_irqrestore(&tahvo_lock, flags);
7931+
7932+ return 0;
7933+}
7934+
7935+/*
7936+ * Read TAHVO register.
7937+ */
7938+static u32 tahvo_user_read_with_mask(u32 field)
7939+{
7940+ u_short value;
7941+ u32 mask, reg;
7942+
7943+ mask = MASK(field);
7944+ reg = REG(field);
7945+
7946+ /* Detect bad mask and reg */
7947+ if (mask == 0 || reg > TAHVO_REG_MAX) {
7948+ printk(KERN_ERR PFX "invalid arguments (reg=%#x, mask=%#x)\n",
7949+ reg, mask);
7950+ return -EINVAL;
7951+ }
7952+
7953+ /* Read the register */
7954+ value = tahvo_read_reg(reg) & mask;
7955+
7956+ /* Right justify value */
7957+ while (!(mask & 1)) {
7958+ value = value >> 1;
7959+ mask = mask >> 1;
7960+ }
7961+
7962+ return value;
7963+}
7964+
7965+/*
7966+ * Close device
7967+ */
7968+static int tahvo_close(struct inode *inode, struct file *filp)
7969+{
7970+ /* Unregister all interrupts that have been registered */
7971+ if (tahvo_irq_subscr == filp) {
7972+ tahvo_unreg_irq_handlers();
7973+ tahvo_irq_subscr = NULL;
7974+ }
7975+
7976+ return 0;
7977+}
7978+
7979+/*
7980+ * Device control (ioctl)
7981+ */
7982+static int tahvo_ioctl(struct inode *inode, struct file *filp,
7983+ unsigned int cmd, unsigned long arg)
7984+{
7985+ struct retu_tahvo_write_parms par;
7986+ int ret;
7987+
7988+ switch (cmd) {
7989+ case URT_IOCT_IRQ_SUBSCR:
7990+ return tahvo_user_subscribe_to_irq(arg, filp);
7991+ case TAHVO_IOCH_READ:
7992+ return tahvo_user_read_with_mask(arg);
7993+ case TAHVO_IOCX_WRITE:
7994+ ret = copy_from_user(&par, (void __user *) arg, sizeof(par));
7995+ if (ret)
7996+ printk(KERN_ERR "copy_from_user failed: %d\n", ret);
7997+ par.result = tahvo_user_write_with_mask(par.field, par.value);
7998+ ret = copy_to_user((void __user *) arg, &par, sizeof(par));
7999+ if (ret)
8000+ printk(KERN_ERR "copy_to_user failed: %d\n", ret);
8001+ break;
8002+ default:
8003+ return -ENOIOCTLCMD;
8004+ }
8005+ return 0;
8006+}
8007+
8008+/*
8009+ * Read from device
8010+ */
8011+static ssize_t tahvo_read(struct file *filp, char *buf, size_t count,
8012+ loff_t * offp)
8013+{
8014+ struct tahvo_irq *irq;
8015+
8016+ u32 nr, i;
8017+
8018+ /* read not permitted if neither filp nor anyone has registered IRQs */
8019+ if (tahvo_irq_subscr != filp)
8020+ return -EPERM;
8021+
8022+ if ((count < sizeof(u32)) || ((count % sizeof(u32)) != 0))
8023+ return -EINVAL;
8024+
8025+ nr = count / sizeof(u32);
8026+
8027+ for (i = 0; i < nr; i++) {
8028+ unsigned long flags;
8029+ u32 irq_id;
8030+ int ret;
8031+
8032+ ret = wait_event_interruptible(tahvo_user_waitqueue,
8033+ !list_empty(&tahvo_irqs));
8034+ if (ret < 0)
8035+ return ret;
8036+
8037+ spin_lock_irqsave(&tahvo_irqs_lock, flags);
8038+ irq = list_entry((&tahvo_irqs)->next, struct tahvo_irq, node);
8039+ irq_id = irq->id;
8040+ list_move(&irq->node, &tahvo_irqs_reserve);
8041+ spin_unlock_irqrestore(&tahvo_irqs_lock, flags);
8042+
8043+ ret = copy_to_user(buf + i * sizeof(irq_id), &irq_id,
8044+ sizeof(irq_id));
8045+ if (ret)
8046+ printk(KERN_ERR "copy_to_user failed: %d\n", ret);
8047+ }
8048+
8049+ return count;
8050+}
8051+
8052+/*
8053+ * Poll method
8054+ */
8055+static unsigned tahvo_poll(struct file *filp, struct poll_table_struct *pt)
8056+{
8057+ if (!list_empty(&tahvo_irqs))
8058+ return POLLIN;
8059+
8060+ poll_wait(filp, &tahvo_user_waitqueue, pt);
8061+
8062+ if (!list_empty(&tahvo_irqs))
8063+ return POLLIN;
8064+ else
8065+ return 0;
8066+}
8067+
8068+static struct file_operations tahvo_user_fileops = {
8069+ .owner = THIS_MODULE,
8070+ .ioctl = tahvo_ioctl,
8071+ .read = tahvo_read,
8072+ .release = tahvo_close,
8073+ .poll = tahvo_poll
8074+};
8075+
8076+static struct miscdevice tahvo_device = {
8077+ .minor = MISC_DYNAMIC_MINOR,
8078+ .name = "tahvo",
8079+ .fops = &tahvo_user_fileops
8080+};
8081+
8082+/*
8083+ * Initialization
8084+ *
8085+ * @return 0 if successful, error value otherwise.
8086+ */
8087+int tahvo_user_init(void)
8088+{
8089+ struct tahvo_irq *irq;
8090+ int res, i;
8091+
8092+ irq = kmalloc(sizeof(*irq) * TAHVO_MAX_IRQ_BUF_LEN, GFP_KERNEL);
8093+ if (irq == NULL) {
8094+ printk(KERN_ERR PFX "kmalloc failed\n");
8095+ return -ENOMEM;
8096+ }
8097+ memset(irq, 0, sizeof(*irq) * TAHVO_MAX_IRQ_BUF_LEN);
8098+ for (i = 0; i < TAHVO_MAX_IRQ_BUF_LEN; i++)
8099+ list_add(&irq[i].node, &tahvo_irqs_reserve);
8100+
8101+ tahvo_irq_block = irq;
8102+
8103+ spin_lock_init(&tahvo_irqs_lock);
8104+ mutex_init(&tahvo_mutex);
8105+
8106+ /* Request a misc device */
8107+ res = misc_register(&tahvo_device);
8108+ if (res < 0) {
8109+ printk(KERN_ERR PFX "unable to register misc device for %s\n",
8110+ tahvo_device.name);
8111+ kfree(irq);
8112+ return res;
8113+ }
8114+
8115+ return 0;
8116+}
8117+
8118+/*
8119+ * Cleanup.
8120+ */
8121+void tahvo_user_cleanup(void)
8122+{
8123+ /* Unregister our misc device */
8124+ misc_deregister(&tahvo_device);
8125+ /* Unregister and disable all TAHVO interrupts */
8126+ tahvo_unreg_irq_handlers();
8127+ kfree(tahvo_irq_block);
8128+}
8129+
8130+MODULE_DESCRIPTION("Tahvo ASIC user space functions");
8131+MODULE_LICENSE("GPL");
8132+MODULE_AUTHOR("Mikko Ylinen");
8133--- /dev/null
8134+++ b/drivers/cbus/tahvo.c
8135@@ -0,0 +1,442 @@
8136+/**
8137+ * drivers/cbus/tahvo.c
8138+ *
8139+ * Support functions for Tahvo ASIC
8140+ *
8141+ * Copyright (C) 2004, 2005 Nokia Corporation
8142+ *
8143+ * Written by Juha Yrjölä <juha.yrjola@nokia.com>,
8144+ * David Weinehall <david.weinehall@nokia.com>, and
8145+ * Mikko Ylinen <mikko.k.ylinen@nokia.com>
8146+ *
8147+ * This file is subject to the terms and conditions of the GNU General
8148+ * Public License. See the file "COPYING" in the main directory of this
8149+ * archive for more details.
8150+ *
8151+ * This program is distributed in the hope that it will be useful,
8152+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
8153+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8154+ * GNU General Public License for more details.
8155+ *
8156+ * You should have received a copy of the GNU General Public License
8157+ * along with this program; if not, write to the Free Software
8158+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
8159+ */
8160+
8161+#include <linux/module.h>
8162+#include <linux/init.h>
8163+
8164+#include <linux/kernel.h>
8165+#include <linux/errno.h>
8166+#include <linux/device.h>
8167+#include <linux/miscdevice.h>
8168+#include <linux/poll.h>
8169+#include <linux/fs.h>
8170+#include <linux/irq.h>
8171+#include <linux/interrupt.h>
8172+#include <linux/platform_device.h>
8173+#include <linux/gpio.h>
8174+
8175+#include <asm/uaccess.h>
8176+
8177+#include <mach/mux.h>
8178+#include <mach/board.h>
8179+#include <mach/board-nokia.h>
8180+
8181+#include "cbus.h"
8182+#include "tahvo.h"
8183+
8184+#define TAHVO_ID 0x02
8185+#define PFX "tahvo: "
8186+
8187+static int tahvo_initialized;
8188+static int tahvo_irq_pin;
8189+static int tahvo_is_betty;
8190+
8191+static struct tasklet_struct tahvo_tasklet;
8192+spinlock_t tahvo_lock = SPIN_LOCK_UNLOCKED;
8193+
8194+static struct completion device_release;
8195+
8196+struct tahvo_irq_handler_desc {
8197+ int (*func)(unsigned long);
8198+ unsigned long arg;
8199+ char name[8];
8200+};
8201+
8202+static struct tahvo_irq_handler_desc tahvo_irq_handlers[MAX_TAHVO_IRQ_HANDLERS];
8203+
8204+/**
8205+ * tahvo_read_reg - Read a value from a register in Tahvo
8206+ * @reg: the register to read from
8207+ *
8208+ * This function returns the contents of the specified register
8209+ */
8210+int tahvo_read_reg(int reg)
8211+{
8212+ BUG_ON(!tahvo_initialized);
8213+ return cbus_read_reg(cbus_host, TAHVO_ID, reg);
8214+}
8215+
8216+/**
8217+ * tahvo_write_reg - Write a value to a register in Tahvo
8218+ * @reg: the register to write to
8219+ * @reg: the value to write to the register
8220+ *
8221+ * This function writes a value to the specified register
8222+ */
8223+void tahvo_write_reg(int reg, u16 val)
8224+{
8225+ BUG_ON(!tahvo_initialized);
8226+ cbus_write_reg(cbus_host, TAHVO_ID, reg, val);
8227+}
8228+
8229+/**
8230+ * tahvo_set_clear_reg_bits - set and clear register bits atomically
8231+ * @reg: the register to write to
8232+ * @bits: the bits to set
8233+ *
8234+ * This function sets and clears the specified Tahvo register bits atomically
8235+ */
8236+void tahvo_set_clear_reg_bits(int reg, u16 set, u16 clear)
8237+{
8238+ unsigned long flags;
8239+ u16 w;
8240+
8241+ spin_lock_irqsave(&tahvo_lock, flags);
8242+ w = tahvo_read_reg(reg);
8243+ w &= ~clear;
8244+ w |= set;
8245+ tahvo_write_reg(reg, w);
8246+ spin_unlock_irqrestore(&tahvo_lock, flags);
8247+}
8248+
8249+/*
8250+ * Disable given TAHVO interrupt
8251+ */
8252+void tahvo_disable_irq(int id)
8253+{
8254+ unsigned long flags;
8255+ u16 mask;
8256+
8257+ spin_lock_irqsave(&tahvo_lock, flags);
8258+ mask = tahvo_read_reg(TAHVO_REG_IMR);
8259+ mask |= 1 << id;
8260+ tahvo_write_reg(TAHVO_REG_IMR, mask);
8261+ spin_unlock_irqrestore(&tahvo_lock, flags);
8262+}
8263+
8264+/*
8265+ * Enable given TAHVO interrupt
8266+ */
8267+void tahvo_enable_irq(int id)
8268+{
8269+ unsigned long flags;
8270+ u16 mask;
8271+
8272+ spin_lock_irqsave(&tahvo_lock, flags);
8273+ mask = tahvo_read_reg(TAHVO_REG_IMR);
8274+ mask &= ~(1 << id);
8275+ tahvo_write_reg(TAHVO_REG_IMR, mask);
8276+ spin_unlock_irqrestore(&tahvo_lock, flags);
8277+}
8278+
8279+/*
8280+ * Acknowledge given TAHVO interrupt
8281+ */
8282+void tahvo_ack_irq(int id)
8283+{
8284+ tahvo_write_reg(TAHVO_REG_IDR, 1 << id);
8285+}
8286+
8287+static int tahvo_7bit_backlight;
8288+
8289+int tahvo_get_backlight_level(void)
8290+{
8291+ int mask;
8292+
8293+ if (tahvo_7bit_backlight)
8294+ mask = 0x7f;
8295+ else
8296+ mask = 0x0f;
8297+ return tahvo_read_reg(TAHVO_REG_LEDPWMR) & mask;
8298+}
8299+
8300+int tahvo_get_max_backlight_level(void)
8301+{
8302+ if (tahvo_7bit_backlight)
8303+ return 0x7f;
8304+ else
8305+ return 0x0f;
8306+}
8307+
8308+void tahvo_set_backlight_level(int level)
8309+{
8310+ int max_level;
8311+
8312+ max_level = tahvo_get_max_backlight_level();
8313+ if (level > max_level)
8314+ level = max_level;
8315+ tahvo_write_reg(TAHVO_REG_LEDPWMR, level);
8316+}
8317+
8318+/*
8319+ * TAHVO interrupt handler. Only schedules the tasklet.
8320+ */
8321+static irqreturn_t tahvo_irq_handler(int irq, void *dev_id)
8322+{
8323+ tasklet_schedule(&tahvo_tasklet);
8324+ return IRQ_HANDLED;
8325+}
8326+
8327+/*
8328+ * Tasklet handler
8329+ */
8330+static void tahvo_tasklet_handler(unsigned long data)
8331+{
8332+ struct tahvo_irq_handler_desc *hnd;
8333+ u16 id;
8334+ u16 im;
8335+ int i;
8336+
8337+ for (;;) {
8338+ id = tahvo_read_reg(TAHVO_REG_IDR);
8339+ im = ~tahvo_read_reg(TAHVO_REG_IMR);
8340+ id &= im;
8341+
8342+ if (!id)
8343+ break;
8344+
8345+ for (i = 0; id != 0; i++, id >>= 1) {
8346+ if (!(id & 1))
8347+ continue;
8348+ hnd = &tahvo_irq_handlers[i];
8349+ if (hnd->func == NULL) {
8350+ /* Spurious tahvo interrupt - just ack it */
8351+ printk(KERN_INFO "Spurious Tahvo interrupt "
8352+ "(id %d)\n", i);
8353+ tahvo_disable_irq(i);
8354+ tahvo_ack_irq(i);
8355+ continue;
8356+ }
8357+ hnd->func(hnd->arg);
8358+ /*
8359+ * Don't acknowledge the interrupt here
8360+ * It must be done explicitly
8361+ */
8362+ }
8363+ }
8364+}
8365+
8366+/*
8367+ * Register the handler for a given TAHVO interrupt source.
8368+ */
8369+int tahvo_request_irq(int id, void *irq_handler, unsigned long arg, char *name)
8370+{
8371+ struct tahvo_irq_handler_desc *hnd;
8372+
8373+ if (irq_handler == NULL || id >= MAX_TAHVO_IRQ_HANDLERS ||
8374+ name == NULL) {
8375+ printk(KERN_ERR PFX "Invalid arguments to %s\n",
8376+ __FUNCTION__);
8377+ return -EINVAL;
8378+ }
8379+ hnd = &tahvo_irq_handlers[id];
8380+ if (hnd->func != NULL) {
8381+ printk(KERN_ERR PFX "IRQ %d already reserved\n", id);
8382+ return -EBUSY;
8383+ }
8384+ printk(KERN_INFO PFX "Registering interrupt %d for device %s\n",
8385+ id, name);
8386+ hnd->func = irq_handler;
8387+ hnd->arg = arg;
8388+ strlcpy(hnd->name, name, sizeof(hnd->name));
8389+
8390+ tahvo_ack_irq(id);
8391+ tahvo_enable_irq(id);
8392+
8393+ return 0;
8394+}
8395+
8396+/*
8397+ * Unregister the handler for a given TAHVO interrupt source.
8398+ */
8399+void tahvo_free_irq(int id)
8400+{
8401+ struct tahvo_irq_handler_desc *hnd;
8402+
8403+ if (id >= MAX_TAHVO_IRQ_HANDLERS) {
8404+ printk(KERN_ERR PFX "Invalid argument to %s\n",
8405+ __FUNCTION__);
8406+ return;
8407+ }
8408+ hnd = &tahvo_irq_handlers[id];
8409+ if (hnd->func == NULL) {
8410+ printk(KERN_ERR PFX "IRQ %d already freed\n", id);
8411+ return;
8412+ }
8413+
8414+ tahvo_disable_irq(id);
8415+ hnd->func = NULL;
8416+}
8417+
8418+/**
8419+ * tahvo_probe - Probe for Tahvo ASIC
8420+ * @dev: the Tahvo device
8421+ *
8422+ * Probe for the Tahvo ASIC and allocate memory
8423+ * for its device-struct if found
8424+ */
8425+static int __devinit tahvo_probe(struct device *dev)
8426+{
8427+ const struct omap_em_asic_bb5_config * em_asic_config;
8428+ int rev, id, ret;
8429+
8430+ /* Prepare tasklet */
8431+ tasklet_init(&tahvo_tasklet, tahvo_tasklet_handler, 0);
8432+
8433+ em_asic_config = omap_get_config(OMAP_TAG_EM_ASIC_BB5,
8434+ struct omap_em_asic_bb5_config);
8435+ if (em_asic_config == NULL) {
8436+ printk(KERN_ERR PFX "Unable to retrieve config data\n");
8437+ return -ENODATA;
8438+ }
8439+
8440+ tahvo_initialized = 1;
8441+
8442+ rev = tahvo_read_reg(TAHVO_REG_ASICR);
8443+
8444+ id = (rev >> 8) & 0xff;
8445+ if (id == 0x03) {
8446+ if ((rev & 0xff) >= 0x50)
8447+ tahvo_7bit_backlight = 1;
8448+ } else if (id == 0x0b) {
8449+ tahvo_is_betty = 1;
8450+ tahvo_7bit_backlight = 1;
8451+ } else {
8452+ printk(KERN_ERR "Tahvo/Betty chip not found");
8453+ return -ENODEV;
8454+ }
8455+
8456+ printk(KERN_INFO "%s v%d.%d found\n", tahvo_is_betty ? "Betty" : "Tahvo",
8457+ (rev >> 4) & 0x0f, rev & 0x0f);
8458+
8459+ tahvo_irq_pin = em_asic_config->tahvo_irq_gpio;
8460+
8461+ if ((ret = gpio_request(tahvo_irq_pin, "TAHVO irq")) < 0) {
8462+ printk(KERN_ERR PFX "Unable to reserve IRQ GPIO\n");
8463+ return ret;
8464+ }
8465+
8466+ /* Set the pin as input */
8467+ gpio_direction_input(tahvo_irq_pin);
8468+
8469+ /* Rising edge triggers the IRQ */
8470+ set_irq_type(gpio_to_irq(tahvo_irq_pin), IRQ_TYPE_EDGE_RISING);
8471+
8472+ /* Mask all TAHVO interrupts */
8473+ tahvo_write_reg(TAHVO_REG_IMR, 0xffff);
8474+
8475+ ret = request_irq(gpio_to_irq(tahvo_irq_pin), tahvo_irq_handler, 0,
8476+ "tahvo", 0);
8477+ if (ret < 0) {
8478+ printk(KERN_ERR PFX "Unable to register IRQ handler\n");
8479+ gpio_free(tahvo_irq_pin);
8480+ return ret;
8481+ }
8482+#ifdef CONFIG_CBUS_TAHVO_USER
8483+ /* Initialize user-space interface */
8484+ if (tahvo_user_init() < 0) {
8485+ printk(KERN_ERR "Unable to initialize driver\n");
8486+ free_irq(gpio_to_irq(tahvo_irq_pin), 0);
8487+ gpio_free(tahvo_irq_pin);
8488+ return ret;
8489+ }
8490+#endif
8491+ return 0;
8492+}
8493+
8494+static int tahvo_remove(struct device *dev)
8495+{
8496+#ifdef CONFIG_CBUS_TAHVO_USER
8497+ tahvo_user_cleanup();
8498+#endif
8499+ /* Mask all TAHVO interrupts */
8500+ tahvo_write_reg(TAHVO_REG_IMR, 0xffff);
8501+ free_irq(gpio_to_irq(tahvo_irq_pin), 0);
8502+ gpio_free(tahvo_irq_pin);
8503+ tasklet_kill(&tahvo_tasklet);
8504+
8505+ return 0;
8506+}
8507+
8508+static void tahvo_device_release(struct device *dev)
8509+{
8510+ complete(&device_release);
8511+}
8512+
8513+static struct device_driver tahvo_driver = {
8514+ .name = "tahvo",
8515+ .bus = &platform_bus_type,
8516+ .probe = tahvo_probe,
8517+ .remove = tahvo_remove,
8518+};
8519+
8520+static struct platform_device tahvo_device = {
8521+ .name = "tahvo",
8522+ .id = -1,
8523+ .dev = {
8524+ .release = tahvo_device_release,
8525+ }
8526+};
8527+
8528+/**
8529+ * tahvo_init - initialise Tahvo driver
8530+ *
8531+ * Initialise the Tahvo driver and return 0 if everything worked ok
8532+ */
8533+static int __init tahvo_init(void)
8534+{
8535+ int ret = 0;
8536+
8537+ printk(KERN_INFO "Tahvo/Betty driver initialising\n");
8538+
8539+ init_completion(&device_release);
8540+
8541+ if ((ret = driver_register(&tahvo_driver)) < 0)
8542+ return ret;
8543+
8544+ if ((ret = platform_device_register(&tahvo_device)) < 0) {
8545+ driver_unregister(&tahvo_driver);
8546+ return ret;
8547+ }
8548+ return 0;
8549+}
8550+
8551+/*
8552+ * Cleanup
8553+ */
8554+static void __exit tahvo_exit(void)
8555+{
8556+ platform_device_unregister(&tahvo_device);
8557+ driver_unregister(&tahvo_driver);
8558+ wait_for_completion(&device_release);
8559+}
8560+
8561+EXPORT_SYMBOL(tahvo_request_irq);
8562+EXPORT_SYMBOL(tahvo_free_irq);
8563+EXPORT_SYMBOL(tahvo_enable_irq);
8564+EXPORT_SYMBOL(tahvo_disable_irq);
8565+EXPORT_SYMBOL(tahvo_ack_irq);
8566+EXPORT_SYMBOL(tahvo_read_reg);
8567+EXPORT_SYMBOL(tahvo_write_reg);
8568+EXPORT_SYMBOL(tahvo_get_backlight_level);
8569+EXPORT_SYMBOL(tahvo_get_max_backlight_level);
8570+EXPORT_SYMBOL(tahvo_set_backlight_level);
8571+
8572+subsys_initcall(tahvo_init);
8573+module_exit(tahvo_exit);
8574+
8575+MODULE_DESCRIPTION("Tahvo ASIC control");
8576+MODULE_LICENSE("GPL");
8577+MODULE_AUTHOR("Juha Yrjölä, David Weinehall, and Mikko Ylinen");
8578--- /dev/null
8579+++ b/drivers/cbus/tahvo.h
8580@@ -0,0 +1,61 @@
8581+/*
8582+ * drivers/cbus/tahvo.h
8583+ *
8584+ * Copyright (C) 2004, 2005 Nokia Corporation
8585+ *
8586+ * Written by Juha Yrjölä <juha.yrjola@nokia.com> and
8587+ * David Weinehall <david.weinehall@nokia.com>
8588+ *
8589+ * This file is subject to the terms and conditions of the GNU General
8590+ * Public License. See the file "COPYING" in the main directory of this
8591+ * archive for more details.
8592+ *
8593+ * This program is distributed in the hope that it will be useful,
8594+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
8595+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8596+ * GNU General Public License for more details.
8597+
8598+ * You should have received a copy of the GNU General Public License
8599+ * along with this program; if not, write to the Free Software
8600+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
8601+ */
8602+
8603+#ifndef __DRIVERS_CBUS_TAHVO_H
8604+#define __DRIVERS_CBUS_TAHVO_H
8605+
8606+#include <linux/types.h>
8607+
8608+/* Registers */
8609+#define TAHVO_REG_ASICR 0x00 /* ASIC ID & revision */
8610+#define TAHVO_REG_IDR 0x01 /* Interrupt ID */
8611+#define TAHVO_REG_IDSR 0x02 /* Interrupt status */
8612+#define TAHVO_REG_IMR 0x03 /* Interrupt mask */
8613+#define TAHVO_REG_LEDPWMR 0x05 /* LED PWM */
8614+#define TAHVO_REG_USBR 0x06 /* USB control */
8615+#define TAHVO_REG_MAX 0x0d
8616+
8617+/* Interrupt sources */
8618+#define TAHVO_INT_VBUSON 0
8619+
8620+#define MAX_TAHVO_IRQ_HANDLERS 8
8621+
8622+int tahvo_read_reg(int reg);
8623+void tahvo_write_reg(int reg, u16 val);
8624+void tahvo_set_clear_reg_bits(int reg, u16 set, u16 clear);
8625+int tahvo_request_irq(int id, void *irq_handler, unsigned long arg, char *name);
8626+void tahvo_free_irq(int id);
8627+void tahvo_enable_irq(int id);
8628+void tahvo_disable_irq(int id);
8629+void tahvo_ack_irq(int id);
8630+int tahvo_get_backlight_level(void);
8631+int tahvo_get_max_backlight_level(void);
8632+void tahvo_set_backlight_level(int level);
8633+
8634+#ifdef CONFIG_CBUS_TAHVO_USER
8635+int tahvo_user_init(void);
8636+void tahvo_user_cleanup(void);
8637+#endif
8638+
8639+extern spinlock_t tahvo_lock;
8640+
8641+#endif /* __DRIVERS_CBUS_TAHVO_H */
8642--- /dev/null
8643+++ b/drivers/cbus/user_retu_tahvo.h
8644@@ -0,0 +1,75 @@
8645+/**
8646+ * drivers/cbus/user_retu_tahvo.h
8647+ *
8648+ * Copyright (C) 2004, 2005 Nokia Corporation
8649+ *
8650+ * Written by Mikko Ylinen <mikko.k.ylinen@nokia.com>
8651+ *
8652+ * Definitions and types used by both retu-user and tahvo-user.
8653+ *
8654+ * This file is subject to the terms and conditions of the GNU General
8655+ * Public License. See the file "COPYING" in the main directory of this
8656+ * archive for more details.
8657+ *
8658+ * This program is distributed in the hope that it will be useful,
8659+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
8660+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8661+ * GNU General Public License for more details.
8662+
8663+ * You should have received a copy of the GNU General Public License
8664+ * along with this program; if not, write to the Free Software
8665+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
8666+ */
8667+
8668+#ifndef _USER_RETU_TAHVO_H
8669+#define _USER_RETU_TAHVO_H
8670+
8671+/* Chip IDs */
8672+#define CHIP_RETU 1
8673+#define CHIP_TAHVO 2
8674+
8675+/* Register access type bits */
8676+#define READ_ONLY 1
8677+#define WRITE_ONLY 2
8678+#define READ_WRITE 3
8679+#define TOGGLE 4
8680+
8681+#define MASK(field) ((u16)(field & 0xFFFF))
8682+#define REG(field) ((u16)((field >> 16) & 0x3F))
8683+
8684+/*** IOCTL definitions. These should be kept in sync with user space **********/
8685+
8686+#define URT_IOC_MAGIC '`'
8687+
8688+/*
8689+ * IOCTL function naming conventions:
8690+ * ==================================
8691+ * 0 -- No argument and return value
8692+ * S -- Set through a pointer
8693+ * T -- Tell directly with the argument value
8694+ * G -- Reply by setting through a pointer
8695+ * Q -- response is on the return value
8696+ * X -- S and G atomically
8697+ * H -- T and Q atomically
8698+ */
8699+
8700+/* General */
8701+#define URT_IOCT_IRQ_SUBSCR _IO(URT_IOC_MAGIC, 0)
8702+
8703+/* RETU */
8704+#define RETU_IOCH_READ _IO(URT_IOC_MAGIC, 1)
8705+#define RETU_IOCX_WRITE _IO(URT_IOC_MAGIC, 2)
8706+#define RETU_IOCH_ADC_READ _IO(URT_IOC_MAGIC, 3)
8707+
8708+/* TAHVO */
8709+#define TAHVO_IOCH_READ _IO(URT_IOC_MAGIC, 4)
8710+#define TAHVO_IOCX_WRITE _IO(URT_IOC_MAGIC, 5)
8711+
8712+/* This structure is used for writing RETU/TAHVO registers */
8713+struct retu_tahvo_write_parms {
8714+ u32 field;
8715+ u16 value;
8716+ u8 result;
8717+};
8718+
8719+#endif
8720--- a/drivers/spi/omap_uwire.c
8721+++ b/drivers/spi/omap_uwire.c
8722@@ -52,7 +52,7 @@
8723 #include <asm/mach-types.h>
8724 
8725 #include <mach/mux.h>
8726-#include <mach/omap730.h> /* OMAP730_IO_CONF registers */
8727+#include <mach/omap7xx.h> /* OMAP7XX_IO_CONF registers */
8728 
8729 
8730 /* FIXME address is now a platform device resource,
8731@@ -504,7 +504,7 @@ static int __init uwire_probe(struct pla
8732     }
8733     clk_enable(uwire->ck);
8734 
8735- if (cpu_is_omap730())
8736+ if (cpu_is_omap7xx())
8737         uwire_idx_shift = 1;
8738     else
8739         uwire_idx_shift = 2;
8740@@ -573,8 +573,8 @@ static int __init omap_uwire_init(void)
8741     }
8742     if (machine_is_omap_perseus2()) {
8743         /* configure pins: MPU_UW_nSCS1, MPU_UW_SDO, MPU_UW_SCLK */
8744- int val = omap_readl(OMAP730_IO_CONF_9) & ~0x00EEE000;
8745- omap_writel(val | 0x00AAA000, OMAP730_IO_CONF_9);
8746+ int val = omap_readl(OMAP7XX_IO_CONF_9) & ~0x00EEE000;
8747+ omap_writel(val | 0x00AAA000, OMAP7XX_IO_CONF_9);
8748     }
8749 
8750     return platform_driver_probe(&uwire_driver, uwire_probe);
8751--- a/drivers/usb/Kconfig
8752+++ b/drivers/usb/Kconfig
8753@@ -60,6 +60,7 @@ config USB_ARCH_HAS_EHCI
8754     default y if ARCH_IXP4XX
8755     default y if ARCH_W90X900
8756     default y if ARCH_AT91SAM9G45
8757+ default y if ARCH_OMAP34XX
8758     default PCI
8759 
8760 # ARM SA1111 chips have a non-PCI based "OHCI-compatible" USB host interface.
8761--- a/drivers/usb/host/ehci-hcd.c
8762+++ b/drivers/usb/host/ehci-hcd.c
8763@@ -1111,6 +1111,11 @@ MODULE_LICENSE ("GPL");
8764 #define PLATFORM_DRIVER ehci_hcd_au1xxx_driver
8765 #endif
8766 
8767+#ifdef CONFIG_ARCH_OMAP34XX
8768+#include "ehci-omap.c"
8769+#define PLATFORM_DRIVER ehci_hcd_omap_driver
8770+#endif
8771+
8772 #ifdef CONFIG_PPC_PS3
8773 #include "ehci-ps3.c"
8774 #define PS3_SYSTEM_BUS_DRIVER ps3_ehci_driver
8775--- /dev/null
8776+++ b/drivers/usb/host/ehci-omap.c
8777@@ -0,0 +1,755 @@
8778+/*
8779+ * ehci-omap.c - driver for USBHOST on OMAP 34xx processor
8780+ *
8781+ * Bus Glue for OMAP34xx USBHOST 3 port EHCI controller
8782+ * Tested on OMAP3430 ES2.0 SDP
8783+ *
8784+ * Copyright (C) 2007-2008 Texas Instruments, Inc.
8785+ * Author: Vikram Pandita <vikram.pandita@ti.com>
8786+ *
8787+ * Copyright (C) 2009 Nokia Corporation
8788+ * Contact: Felipe Balbi <felipe.balbi@nokia.com>
8789+ *
8790+ * Based on "ehci-fsl.c" and "ehci-au1xxx.c" ehci glue layers
8791+ *
8792+ * This program is free software; you can redistribute it and/or modify
8793+ * it under the terms of the GNU General Public License as published by
8794+ * the Free Software Foundation; either version 2 of the License, or
8795+ * (at your option) any later version.
8796+ *
8797+ * This program is distributed in the hope that it will be useful,
8798+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
8799+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8800+ * GNU General Public License for more details.
8801+ *
8802+ * You should have received a copy of the GNU General Public License
8803+ * along with this program; if not, write to the Free Software
8804+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
8805+ *
8806+ * TODO (last updated Feb 23rd, 2009):
8807+ * - add kernel-doc
8808+ * - enable AUTOIDLE
8809+ * - move DPLL5 programming to clock fw
8810+ * - add suspend/resume
8811+ * - move workarounds to board-files
8812+ */
8813+
8814+#include <linux/platform_device.h>
8815+#include <linux/clk.h>
8816+#include <linux/gpio.h>
8817+#include <mach/usb.h>
8818+
8819+/*
8820+ * OMAP USBHOST Register addresses: VIRTUAL ADDRESSES
8821+ * Use ehci_omap_readl()/ehci_omap_writel() functions
8822+ */
8823+
8824+/* TLL Register Set */
8825+#define OMAP_USBTLL_REVISION (0x00)
8826+#define OMAP_USBTLL_SYSCONFIG (0x10)
8827+#define OMAP_USBTLL_SYSCONFIG_CACTIVITY (1 << 8)
8828+#define OMAP_USBTLL_SYSCONFIG_SIDLEMODE (1 << 3)
8829+#define OMAP_USBTLL_SYSCONFIG_ENAWAKEUP (1 << 2)
8830+#define OMAP_USBTLL_SYSCONFIG_SOFTRESET (1 << 1)
8831+#define OMAP_USBTLL_SYSCONFIG_AUTOIDLE (1 << 0)
8832+
8833+#define OMAP_USBTLL_SYSSTATUS (0x14)
8834+#define OMAP_USBTLL_SYSSTATUS_RESETDONE (1 << 0)
8835+
8836+#define OMAP_USBTLL_IRQSTATUS (0x18)
8837+#define OMAP_USBTLL_IRQENABLE (0x1C)
8838+
8839+#define OMAP_TLL_SHARED_CONF (0x30)
8840+#define OMAP_TLL_SHARED_CONF_USB_90D_DDR_EN (1 << 6)
8841+#define OMAP_TLL_SHARED_CONF_USB_180D_SDR_EN (1 << 5)
8842+#define OMAP_TLL_SHARED_CONF_USB_DIVRATION (1 << 2)
8843+#define OMAP_TLL_SHARED_CONF_FCLK_REQ (1 << 1)
8844+#define OMAP_TLL_SHARED_CONF_FCLK_IS_ON (1 << 0)
8845+
8846+#define OMAP_TLL_CHANNEL_CONF(num) (0x040 + 0x004 * num)
8847+#define OMAP_TLL_CHANNEL_CONF_ULPINOBITSTUFF (1 << 11)
8848+#define OMAP_TLL_CHANNEL_CONF_ULPI_ULPIAUTOIDLE (1 << 10)
8849+#define OMAP_TLL_CHANNEL_CONF_UTMIAUTOIDLE (1 << 9)
8850+#define OMAP_TLL_CHANNEL_CONF_ULPIDDRMODE (1 << 8)
8851+#define OMAP_TLL_CHANNEL_CONF_CHANEN (1 << 0)
8852+
8853+#define OMAP_TLL_ULPI_FUNCTION_CTRL(num) (0x804 + 0x100 * num)
8854+#define OMAP_TLL_ULPI_INTERFACE_CTRL(num) (0x807 + 0x100 * num)
8855+#define OMAP_TLL_ULPI_OTG_CTRL(num) (0x80A + 0x100 * num)
8856+#define OMAP_TLL_ULPI_INT_EN_RISE(num) (0x80D + 0x100 * num)
8857+#define OMAP_TLL_ULPI_INT_EN_FALL(num) (0x810 + 0x100 * num)
8858+#define OMAP_TLL_ULPI_INT_STATUS(num) (0x813 + 0x100 * num)
8859+#define OMAP_TLL_ULPI_INT_LATCH(num) (0x814 + 0x100 * num)
8860+#define OMAP_TLL_ULPI_DEBUG(num) (0x815 + 0x100 * num)
8861+#define OMAP_TLL_ULPI_SCRATCH_REGISTER(num) (0x816 + 0x100 * num)
8862+
8863+#define OMAP_TLL_CHANNEL_COUNT 3
8864+#define OMAP_TLL_CHANNEL_1_EN_MASK (1 << 1)
8865+#define OMAP_TLL_CHANNEL_2_EN_MASK (1 << 2)
8866+#define OMAP_TLL_CHANNEL_3_EN_MASK (1 << 4)
8867+
8868+/* UHH Register Set */
8869+#define OMAP_UHH_REVISION (0x00)
8870+#define OMAP_UHH_SYSCONFIG (0x10)
8871+#define OMAP_UHH_SYSCONFIG_MIDLEMODE (1 << 12)
8872+#define OMAP_UHH_SYSCONFIG_CACTIVITY (1 << 8)
8873+#define OMAP_UHH_SYSCONFIG_SIDLEMODE (1 << 3)
8874+#define OMAP_UHH_SYSCONFIG_ENAWAKEUP (1 << 2)
8875+#define OMAP_UHH_SYSCONFIG_SOFTRESET (1 << 1)
8876+#define OMAP_UHH_SYSCONFIG_AUTOIDLE (1 << 0)
8877+
8878+#define OMAP_UHH_SYSSTATUS (0x14)
8879+#define OMAP_UHH_HOSTCONFIG (0x40)
8880+#define OMAP_UHH_HOSTCONFIG_ULPI_BYPASS (1 << 0)
8881+#define OMAP_UHH_HOSTCONFIG_ULPI_P1_BYPASS (1 << 0)
8882+#define OMAP_UHH_HOSTCONFIG_ULPI_P2_BYPASS (1 << 11)
8883+#define OMAP_UHH_HOSTCONFIG_ULPI_P3_BYPASS (1 << 12)
8884+#define OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN (1 << 2)
8885+#define OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN (1 << 3)
8886+#define OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN (1 << 4)
8887+#define OMAP_UHH_HOSTCONFIG_INCRX_ALIGN_EN (1 << 5)
8888+#define OMAP_UHH_HOSTCONFIG_P1_CONNECT_STATUS (1 << 8)
8889+#define OMAP_UHH_HOSTCONFIG_P2_CONNECT_STATUS (1 << 9)
8890+#define OMAP_UHH_HOSTCONFIG_P3_CONNECT_STATUS (1 << 10)
8891+
8892+#define OMAP_UHH_DEBUG_CSR (0x44)
8893+
8894+/* EHCI Register Set */
8895+#define EHCI_INSNREG05_ULPI (0xA4)
8896+#define EHCI_INSNREG05_ULPI_CONTROL_SHIFT 31
8897+#define EHCI_INSNREG05_ULPI_PORTSEL_SHIFT 24
8898+#define EHCI_INSNREG05_ULPI_OPSEL_SHIFT 22
8899+#define EHCI_INSNREG05_ULPI_REGADD_SHIFT 16
8900+#define EHCI_INSNREG05_ULPI_EXTREGADD_SHIFT 8
8901+#define EHCI_INSNREG05_ULPI_WRDATA_SHIFT 0
8902+
8903+/*-------------------------------------------------------------------------*/
8904+
8905+static inline void ehci_omap_writel(void __iomem *base, u32 reg, u32 val)
8906+{
8907+ __raw_writel(val, base + reg);
8908+}
8909+
8910+static inline u32 ehci_omap_readl(void __iomem *base, u32 reg)
8911+{
8912+ return __raw_readl(base + reg);
8913+}
8914+
8915+static inline void ehci_omap_writeb(void __iomem *base, u8 reg, u8 val)
8916+{
8917+ __raw_writeb(val, base + reg);
8918+}
8919+
8920+static inline u8 ehci_omap_readb(void __iomem *base, u8 reg)
8921+{
8922+ return __raw_readb(base + reg);
8923+}
8924+
8925+/*-------------------------------------------------------------------------*/
8926+
8927+struct ehci_hcd_omap {
8928+ struct ehci_hcd *ehci;
8929+ struct device *dev;
8930+
8931+ struct clk *usbhost_ick;
8932+ struct clk *usbhost2_120m_fck;
8933+ struct clk *usbhost1_48m_fck;
8934+ struct clk *usbtll_fck;
8935+ struct clk *usbtll_ick;
8936+
8937+ /* FIXME the following two workarounds are
8938+ * board specific not silicon-specific so these
8939+ * should be moved to board-file instead.
8940+ *
8941+ * Maybe someone from TI will know better which
8942+ * board is affected and needs the workarounds
8943+ * to be applied
8944+ */
8945+
8946+ /* gpio for resetting phy */
8947+ int reset_gpio_port[OMAP3_HS_USB_PORTS];
8948+
8949+ /* phy reset workaround */
8950+ int phy_reset;
8951+
8952+ /* desired phy_mode: TLL, PHY */
8953+ enum ehci_hcd_omap_mode port_mode[OMAP3_HS_USB_PORTS];
8954+
8955+ void __iomem *uhh_base;
8956+ void __iomem *tll_base;
8957+ void __iomem *ehci_base;
8958+};
8959+
8960+/*-------------------------------------------------------------------------*/
8961+
8962+static void omap_usb_utmi_init(struct ehci_hcd_omap *omap, u8 tll_channel_mask)
8963+{
8964+ unsigned reg;
8965+ int i;
8966+
8967+ /* Program the 3 TLL channels upfront */
8968+ for (i = 0; i < OMAP_TLL_CHANNEL_COUNT; i++) {
8969+ reg = ehci_omap_readl(omap->tll_base, OMAP_TLL_CHANNEL_CONF(i));
8970+
8971+ /* Disable AutoIdle, BitStuffing and use SDR Mode */
8972+ reg &= ~(OMAP_TLL_CHANNEL_CONF_UTMIAUTOIDLE
8973+ | OMAP_TLL_CHANNEL_CONF_ULPINOBITSTUFF
8974+ | OMAP_TLL_CHANNEL_CONF_ULPIDDRMODE);
8975+ ehci_omap_writel(omap->tll_base, OMAP_TLL_CHANNEL_CONF(i), reg);
8976+ }
8977+
8978+ /* Program Common TLL register */
8979+ reg = ehci_omap_readl(omap->tll_base, OMAP_TLL_SHARED_CONF);
8980+ reg |= (OMAP_TLL_SHARED_CONF_FCLK_IS_ON
8981+ | OMAP_TLL_SHARED_CONF_USB_DIVRATION
8982+ | OMAP_TLL_SHARED_CONF_USB_180D_SDR_EN);
8983+ reg &= ~OMAP_TLL_SHARED_CONF_USB_90D_DDR_EN;
8984+
8985+ ehci_omap_writel(omap->tll_base, OMAP_TLL_SHARED_CONF, reg);
8986+
8987+ /* Enable channels now */
8988+ for (i = 0; i < OMAP_TLL_CHANNEL_COUNT; i++) {
8989+ reg = ehci_omap_readl(omap->tll_base, OMAP_TLL_CHANNEL_CONF(i));
8990+
8991+ /* Enable only the reg that is needed */
8992+ if (!(tll_channel_mask & 1<<i))
8993+ continue;
8994+
8995+ reg |= OMAP_TLL_CHANNEL_CONF_CHANEN;
8996+ ehci_omap_writel(omap->tll_base, OMAP_TLL_CHANNEL_CONF(i), reg);
8997+
8998+ ehci_omap_writeb(omap->tll_base,
8999+ OMAP_TLL_ULPI_SCRATCH_REGISTER(i), 0xbe);
9000+ dev_dbg(omap->dev, "ULPI_SCRATCH_REG[ch=%d]= 0x%02x\n",
9001+ i+1, ehci_omap_readb(omap->tll_base,
9002+ OMAP_TLL_ULPI_SCRATCH_REGISTER(i)));
9003+ }
9004+}
9005+
9006+/*-------------------------------------------------------------------------*/
9007+
9008+/* omap_start_ehc
9009+ * - Start the TI USBHOST controller
9010+ */
9011+static int omap_start_ehc(struct ehci_hcd_omap *omap, struct usb_hcd *hcd)
9012+{
9013+ unsigned long timeout = jiffies + msecs_to_jiffies(1000);
9014+ u8 tll_ch_mask = 0;
9015+ unsigned reg = 0;
9016+ int ret = 0;
9017+
9018+ dev_dbg(omap->dev, "starting TI EHCI USB Controller\n");
9019+
9020+ /* Enable Clocks for USBHOST */
9021+ omap->usbhost_ick = clk_get(omap->dev, "usbhost_ick");
9022+ if (IS_ERR(omap->usbhost_ick)) {
9023+ ret = PTR_ERR(omap->usbhost_ick);
9024+ goto err_host_ick;
9025+ }
9026+ clk_enable(omap->usbhost_ick);
9027+
9028+ omap->usbhost2_120m_fck = clk_get(omap->dev, "usbhost_120m_fck");
9029+ if (IS_ERR(omap->usbhost2_120m_fck)) {
9030+ ret = PTR_ERR(omap->usbhost2_120m_fck);
9031+ goto err_host_120m_fck;
9032+ }
9033+ clk_enable(omap->usbhost2_120m_fck);
9034+
9035+ omap->usbhost1_48m_fck = clk_get(omap->dev, "usbhost_48m_fck");
9036+ if (IS_ERR(omap->usbhost1_48m_fck)) {
9037+ ret = PTR_ERR(omap->usbhost1_48m_fck);
9038+ goto err_host_48m_fck;
9039+ }
9040+ clk_enable(omap->usbhost1_48m_fck);
9041+
9042+ if (omap->phy_reset) {
9043+ /* Refer: ISSUE1 */
9044+ if (gpio_is_valid(omap->reset_gpio_port[0])) {
9045+ gpio_request(omap->reset_gpio_port[0],
9046+ "USB1 PHY reset");
9047+ gpio_direction_output(omap->reset_gpio_port[0], 0);
9048+ }
9049+
9050+ if (gpio_is_valid(omap->reset_gpio_port[1])) {
9051+ gpio_request(omap->reset_gpio_port[1],
9052+ "USB2 PHY reset");
9053+ gpio_direction_output(omap->reset_gpio_port[1], 0);
9054+ }
9055+
9056+ /* Hold the PHY in RESET for enough time till DIR is high */
9057+ udelay(10);
9058+ }
9059+
9060+ /* Configure TLL for 60Mhz clk for ULPI */
9061+ omap->usbtll_fck = clk_get(omap->dev, "usbtll_fck");
9062+ if (IS_ERR(omap->usbtll_fck)) {
9063+ ret = PTR_ERR(omap->usbtll_fck);
9064+ goto err_tll_fck;
9065+ }
9066+ clk_enable(omap->usbtll_fck);
9067+
9068+ omap->usbtll_ick = clk_get(omap->dev, "usbtll_ick");
9069+ if (IS_ERR(omap->usbtll_ick)) {
9070+ ret = PTR_ERR(omap->usbtll_ick);
9071+ goto err_tll_ick;
9072+ }
9073+ clk_enable(omap->usbtll_ick);
9074+
9075+ /* perform TLL soft reset, and wait until reset is complete */
9076+ ehci_omap_writel(omap->tll_base, OMAP_USBTLL_SYSCONFIG,
9077+ OMAP_USBTLL_SYSCONFIG_SOFTRESET);
9078+
9079+ /* Wait for TLL reset to complete */
9080+ while (!(ehci_omap_readl(omap->tll_base, OMAP_USBTLL_SYSSTATUS)
9081+ & OMAP_USBTLL_SYSSTATUS_RESETDONE)) {
9082+ cpu_relax();
9083+
9084+ if (time_after(jiffies, timeout)) {
9085+ dev_dbg(omap->dev, "operation timed out\n");
9086+ ret = -EINVAL;
9087+ goto err_sys_status;
9088+ }
9089+ }
9090+
9091+ dev_dbg(omap->dev, "TLL RESET DONE\n");
9092+
9093+ /* (1<<3) = no idle mode only for initial debugging */
9094+ ehci_omap_writel(omap->tll_base, OMAP_USBTLL_SYSCONFIG,
9095+ OMAP_USBTLL_SYSCONFIG_ENAWAKEUP |
9096+ OMAP_USBTLL_SYSCONFIG_SIDLEMODE |
9097+ OMAP_USBTLL_SYSCONFIG_CACTIVITY);
9098+
9099+
9100+ /* Put UHH in NoIdle/NoStandby mode */
9101+ reg = ehci_omap_readl(omap->uhh_base, OMAP_UHH_SYSCONFIG);
9102+ reg |= (OMAP_UHH_SYSCONFIG_ENAWAKEUP
9103+ | OMAP_UHH_SYSCONFIG_SIDLEMODE
9104+ | OMAP_UHH_SYSCONFIG_CACTIVITY
9105+ | OMAP_UHH_SYSCONFIG_MIDLEMODE);
9106+ reg &= ~OMAP_UHH_SYSCONFIG_AUTOIDLE;
9107+
9108+ ehci_omap_writel(omap->uhh_base, OMAP_UHH_SYSCONFIG, reg);
9109+
9110+ reg = ehci_omap_readl(omap->uhh_base, OMAP_UHH_HOSTCONFIG);
9111+
9112+ /* setup ULPI bypass and burst configurations */
9113+ reg |= (OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN
9114+ | OMAP_UHH_HOSTCONFIG_INCR8_BURST_EN
9115+ | OMAP_UHH_HOSTCONFIG_INCR16_BURST_EN);
9116+ reg &= ~OMAP_UHH_HOSTCONFIG_INCRX_ALIGN_EN;
9117+
9118+ if (omap->port_mode[0] == EHCI_HCD_OMAP_MODE_UNKNOWN)
9119+ reg &= ~OMAP_UHH_HOSTCONFIG_P1_CONNECT_STATUS;
9120+ if (omap->port_mode[1] == EHCI_HCD_OMAP_MODE_UNKNOWN)
9121+ reg &= ~OMAP_UHH_HOSTCONFIG_P2_CONNECT_STATUS;
9122+ if (omap->port_mode[2] == EHCI_HCD_OMAP_MODE_UNKNOWN)
9123+ reg &= ~OMAP_UHH_HOSTCONFIG_P3_CONNECT_STATUS;
9124+
9125+ /* Bypass the TLL module for PHY mode operation */
9126+ if (omap_rev() <= OMAP3430_REV_ES2_1) {
9127+ dev_dbg(omap->dev, "OMAP3 ES version <= ES2.1 \n");
9128+ if ((omap->port_mode[0] == EHCI_HCD_OMAP_MODE_PHY) ||
9129+ (omap->port_mode[1] == EHCI_HCD_OMAP_MODE_PHY) ||
9130+ (omap->port_mode[2] == EHCI_HCD_OMAP_MODE_PHY))
9131+ reg &= ~OMAP_UHH_HOSTCONFIG_ULPI_BYPASS;
9132+ else
9133+ reg |= OMAP_UHH_HOSTCONFIG_ULPI_BYPASS;
9134+ } else {
9135+ dev_dbg(omap->dev, "OMAP3 ES version > ES2.1\n");
9136+ if (omap->port_mode[0] == EHCI_HCD_OMAP_MODE_PHY)
9137+ reg &= ~OMAP_UHH_HOSTCONFIG_ULPI_P1_BYPASS;
9138+ else if (omap->port_mode[0] == EHCI_HCD_OMAP_MODE_TLL)
9139+ reg |= OMAP_UHH_HOSTCONFIG_ULPI_P1_BYPASS;
9140+
9141+ if (omap->port_mode[1] == EHCI_HCD_OMAP_MODE_PHY)
9142+ reg &= ~OMAP_UHH_HOSTCONFIG_ULPI_P2_BYPASS;
9143+ else if (omap->port_mode[1] == EHCI_HCD_OMAP_MODE_TLL)
9144+ reg |= OMAP_UHH_HOSTCONFIG_ULPI_P2_BYPASS;
9145+
9146+ if (omap->port_mode[2] == EHCI_HCD_OMAP_MODE_PHY)
9147+ reg &= ~OMAP_UHH_HOSTCONFIG_ULPI_P3_BYPASS;
9148+ else if (omap->port_mode[2] == EHCI_HCD_OMAP_MODE_TLL)
9149+ reg |= OMAP_UHH_HOSTCONFIG_ULPI_P3_BYPASS;
9150+
9151+ }
9152+ ehci_omap_writel(omap->uhh_base, OMAP_UHH_HOSTCONFIG, reg);
9153+ dev_dbg(omap->dev, "UHH setup done, uhh_hostconfig=%x\n", reg);
9154+
9155+
9156+ if ((omap->port_mode[0] == EHCI_HCD_OMAP_MODE_TLL) ||
9157+ (omap->port_mode[1] == EHCI_HCD_OMAP_MODE_TLL) ||
9158+ (omap->port_mode[2] == EHCI_HCD_OMAP_MODE_TLL)) {
9159+
9160+ if (omap->port_mode[0] == EHCI_HCD_OMAP_MODE_TLL)
9161+ tll_ch_mask |= OMAP_TLL_CHANNEL_1_EN_MASK;
9162+ if (omap->port_mode[1] == EHCI_HCD_OMAP_MODE_TLL)
9163+ tll_ch_mask |= OMAP_TLL_CHANNEL_2_EN_MASK;
9164+ if (omap->port_mode[2] == EHCI_HCD_OMAP_MODE_TLL)
9165+ tll_ch_mask |= OMAP_TLL_CHANNEL_3_EN_MASK;
9166+
9167+ /* Enable UTMI mode for required TLL channels */
9168+ omap_usb_utmi_init(omap, tll_ch_mask);
9169+ }
9170+
9171+ if (omap->phy_reset) {
9172+ /* Refer ISSUE1:
9173+ * Hold the PHY in RESET for enough time till
9174+ * PHY is settled and ready
9175+ */
9176+ udelay(10);
9177+
9178+ if (gpio_is_valid(omap->reset_gpio_port[0]))
9179+ gpio_set_value(omap->reset_gpio_port[0], 1);
9180+
9181+ if (gpio_is_valid(omap->reset_gpio_port[1]))
9182+ gpio_set_value(omap->reset_gpio_port[1], 1);
9183+ }
9184+
9185+ return 0;
9186+
9187+err_sys_status:
9188+ clk_disable(omap->usbtll_ick);
9189+ clk_put(omap->usbtll_ick);
9190+
9191+err_tll_ick:
9192+ clk_disable(omap->usbtll_fck);
9193+ clk_put(omap->usbtll_fck);
9194+
9195+err_tll_fck:
9196+ clk_disable(omap->usbhost1_48m_fck);
9197+ clk_put(omap->usbhost1_48m_fck);
9198+
9199+ if (omap->phy_reset) {
9200+ if (gpio_is_valid(omap->reset_gpio_port[0]))
9201+ gpio_free(omap->reset_gpio_port[0]);
9202+
9203+ if (gpio_is_valid(omap->reset_gpio_port[1]))
9204+ gpio_free(omap->reset_gpio_port[1]);
9205+ }
9206+
9207+err_host_48m_fck:
9208+ clk_disable(omap->usbhost2_120m_fck);
9209+ clk_put(omap->usbhost2_120m_fck);
9210+
9211+err_host_120m_fck:
9212+ clk_disable(omap->usbhost_ick);
9213+ clk_put(omap->usbhost_ick);
9214+
9215+err_host_ick:
9216+ return ret;
9217+}
9218+
9219+static void omap_stop_ehc(struct ehci_hcd_omap *omap, struct usb_hcd *hcd)
9220+{
9221+ unsigned long timeout = jiffies + msecs_to_jiffies(100);
9222+
9223+ dev_dbg(omap->dev, "stopping TI EHCI USB Controller\n");
9224+
9225+ /* Reset OMAP modules for insmod/rmmod to work */
9226+ ehci_omap_writel(omap->uhh_base, OMAP_UHH_SYSCONFIG,
9227+ OMAP_UHH_SYSCONFIG_SOFTRESET);
9228+ while (!(ehci_omap_readl(omap->uhh_base, OMAP_UHH_SYSSTATUS)
9229+ & (1 << 0))) {
9230+ cpu_relax();
9231+
9232+ if (time_after(jiffies, timeout))
9233+ dev_dbg(omap->dev, "operation timed out\n");
9234+ }
9235+
9236+ while (!(ehci_omap_readl(omap->uhh_base, OMAP_UHH_SYSSTATUS)
9237+ & (1 << 1))) {
9238+ cpu_relax();
9239+
9240+ if (time_after(jiffies, timeout))
9241+ dev_dbg(omap->dev, "operation timed out\n");
9242+ }
9243+
9244+ while (!(ehci_omap_readl(omap->uhh_base, OMAP_UHH_SYSSTATUS)
9245+ & (1 << 2))) {
9246+ cpu_relax();
9247+
9248+ if (time_after(jiffies, timeout))
9249+ dev_dbg(omap->dev, "operation timed out\n");
9250+ }
9251+
9252+ ehci_omap_writel(omap->tll_base, OMAP_USBTLL_SYSCONFIG, (1 << 1));
9253+
9254+ while (!(ehci_omap_readl(omap->tll_base, OMAP_USBTLL_SYSSTATUS)
9255+ & (1 << 0))) {
9256+ cpu_relax();
9257+
9258+ if (time_after(jiffies, timeout))
9259+ dev_dbg(omap->dev, "operation timed out\n");
9260+ }
9261+
9262+ if (omap->usbtll_fck != NULL) {
9263+ clk_disable(omap->usbtll_fck);
9264+ clk_put(omap->usbtll_fck);
9265+ omap->usbtll_fck = NULL;
9266+ }
9267+
9268+ if (omap->usbhost_ick != NULL) {
9269+ clk_disable(omap->usbhost_ick);
9270+ clk_put(omap->usbhost_ick);
9271+ omap->usbhost_ick = NULL;
9272+ }
9273+
9274+ if (omap->usbhost1_48m_fck != NULL) {
9275+ clk_disable(omap->usbhost1_48m_fck);
9276+ clk_put(omap->usbhost1_48m_fck);
9277+ omap->usbhost1_48m_fck = NULL;
9278+ }
9279+
9280+ if (omap->usbhost2_120m_fck != NULL) {
9281+ clk_disable(omap->usbhost2_120m_fck);
9282+ clk_put(omap->usbhost2_120m_fck);
9283+ omap->usbhost2_120m_fck = NULL;
9284+ }
9285+
9286+ if (omap->usbtll_ick != NULL) {
9287+ clk_disable(omap->usbtll_ick);
9288+ clk_put(omap->usbtll_ick);
9289+ omap->usbtll_ick = NULL;
9290+ }
9291+
9292+ if (omap->phy_reset) {
9293+ if (gpio_is_valid(omap->reset_gpio_port[0]))
9294+ gpio_free(omap->reset_gpio_port[0]);
9295+
9296+ if (gpio_is_valid(omap->reset_gpio_port[1]))
9297+ gpio_free(omap->reset_gpio_port[1]);
9298+ }
9299+
9300+ dev_dbg(omap->dev, "Clock to USB host has been disabled\n");
9301+}
9302+
9303+/*-------------------------------------------------------------------------*/
9304+
9305+static const struct hc_driver ehci_omap_hc_driver;
9306+
9307+/* configure so an HC device and id are always provided */
9308+/* always called with process context; sleeping is OK */
9309+
9310+/**
9311+ * ehci_hcd_omap_probe - initialize TI-based HCDs
9312+ *
9313+ * Allocates basic resources for this USB host controller, and
9314+ * then invokes the start() method for the HCD associated with it
9315+ * through the hotplug entry's driver_data.
9316+ */
9317+static int ehci_hcd_omap_probe(struct platform_device *pdev)
9318+{
9319+ struct ehci_hcd_omap_platform_data *pdata = pdev->dev.platform_data;
9320+ struct ehci_hcd_omap *omap;
9321+ struct resource *res;
9322+ struct usb_hcd *hcd;
9323+
9324+ int irq = platform_get_irq(pdev, 0);
9325+ int ret = -ENODEV;
9326+
9327+ if (!pdata) {
9328+ dev_dbg(&pdev->dev, "missing platform_data\n");
9329+ goto err_pdata;
9330+ }
9331+
9332+ if (usb_disabled())
9333+ goto err_disabled;
9334+
9335+ omap = kzalloc(sizeof(*omap), GFP_KERNEL);
9336+ if (!omap) {
9337+ ret = -ENOMEM;
9338+ goto err_create_hcd;
9339+ }
9340+
9341+ hcd = usb_create_hcd(&ehci_omap_hc_driver, &pdev->dev,
9342+ dev_name(&pdev->dev));
9343+ if (!hcd) {
9344+ dev_dbg(&pdev->dev, "failed to create hcd with err %d\n", ret);
9345+ ret = -ENOMEM;
9346+ goto err_create_hcd;
9347+ }
9348+
9349+ platform_set_drvdata(pdev, omap);
9350+ omap->dev = &pdev->dev;
9351+ omap->phy_reset = pdata->phy_reset;
9352+ omap->reset_gpio_port[0] = pdata->reset_gpio_port[0];
9353+ omap->reset_gpio_port[1] = pdata->reset_gpio_port[1];
9354+ omap->reset_gpio_port[2] = pdata->reset_gpio_port[2];
9355+ omap->port_mode[0] = pdata->port_mode[0];
9356+ omap->port_mode[1] = pdata->port_mode[1];
9357+ omap->port_mode[2] = pdata->port_mode[2];
9358+ omap->ehci = hcd_to_ehci(hcd);
9359+ omap->ehci->sbrn = 0x20;
9360+
9361+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
9362+
9363+ hcd->rsrc_start = res->start;
9364+ hcd->rsrc_len = resource_size(res);
9365+
9366+ hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
9367+ if (!hcd->regs) {
9368+ dev_err(&pdev->dev, "EHCI ioremap failed\n");
9369+ ret = -ENOMEM;
9370+ goto err_ioremap;
9371+ }
9372+
9373+ /* we know this is the memory we want, no need to ioremap again */
9374+ omap->ehci->caps = hcd->regs;
9375+ omap->ehci_base = hcd->regs;
9376+
9377+ res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
9378+ omap->uhh_base = ioremap(res->start, resource_size(res));
9379+ if (!omap->uhh_base) {
9380+ dev_err(&pdev->dev, "UHH ioremap failed\n");
9381+ ret = -ENOMEM;
9382+ goto err_uhh_ioremap;
9383+ }
9384+
9385+ res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
9386+ omap->tll_base = ioremap(res->start, resource_size(res));
9387+ if (!omap->tll_base) {
9388+ dev_err(&pdev->dev, "TLL ioremap failed\n");
9389+ ret = -ENOMEM;
9390+ goto err_tll_ioremap;
9391+ }
9392+
9393+ ret = omap_start_ehc(omap, hcd);
9394+ if (ret) {
9395+ dev_dbg(&pdev->dev, "failed to start ehci\n");
9396+ goto err_start;
9397+ }
9398+
9399+ omap->ehci->regs = hcd->regs
9400+ + HC_LENGTH(readl(&omap->ehci->caps->hc_capbase));
9401+
9402+ /* cache this readonly data; minimize chip reads */
9403+ omap->ehci->hcs_params = readl(&omap->ehci->caps->hcs_params);
9404+
9405+ /* SET 1 micro-frame Interrupt interval */
9406+ writel(readl(&omap->ehci->regs->command) | (1 << 16),
9407+ &omap->ehci->regs->command);
9408+
9409+ ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED);
9410+ if (ret) {
9411+ dev_dbg(&pdev->dev, "failed to add hcd with err %d\n", ret);
9412+ goto err_add_hcd;
9413+ }
9414+
9415+ return 0;
9416+
9417+err_add_hcd:
9418+ omap_stop_ehc(omap, hcd);
9419+
9420+err_start:
9421+ iounmap(omap->tll_base);
9422+
9423+err_tll_ioremap:
9424+ iounmap(omap->uhh_base);
9425+
9426+err_uhh_ioremap:
9427+ iounmap(hcd->regs);
9428+
9429+err_ioremap:
9430+ usb_put_hcd(hcd);
9431+
9432+err_create_hcd:
9433+err_disabled:
9434+err_pdata:
9435+ return ret;
9436+}
9437+
9438+/* may be called without controller electrically present */
9439+/* may be called with controller, bus, and devices active */
9440+
9441+/**
9442+ * ehci_hcd_omap_remove - shutdown processing for EHCI HCDs
9443+ * @pdev: USB Host Controller being removed
9444+ *
9445+ * Reverses the effect of usb_ehci_hcd_omap_probe(), first invoking
9446+ * the HCD's stop() method. It is always called from a thread
9447+ * context, normally "rmmod", "apmd", or something similar.
9448+ */
9449+static int ehci_hcd_omap_remove(struct platform_device *pdev)
9450+{
9451+ struct ehci_hcd_omap *omap = platform_get_drvdata(pdev);
9452+ struct usb_hcd *hcd = ehci_to_hcd(omap->ehci);
9453+
9454+ usb_remove_hcd(hcd);
9455+ omap_stop_ehc(omap, hcd);
9456+ iounmap(hcd->regs);
9457+ iounmap(omap->tll_base);
9458+ iounmap(omap->uhh_base);
9459+ usb_put_hcd(hcd);
9460+
9461+ return 0;
9462+}
9463+
9464+static void ehci_hcd_omap_shutdown(struct platform_device *pdev)
9465+{
9466+ struct ehci_hcd_omap *omap = platform_get_drvdata(pdev);
9467+ struct usb_hcd *hcd = ehci_to_hcd(omap->ehci);
9468+
9469+ if (hcd->driver->shutdown)
9470+ hcd->driver->shutdown(hcd);
9471+}
9472+
9473+static struct platform_driver ehci_hcd_omap_driver = {
9474+ .probe = ehci_hcd_omap_probe,
9475+ .remove = ehci_hcd_omap_remove,
9476+ .shutdown = ehci_hcd_omap_shutdown,
9477+ /*.suspend = ehci_hcd_omap_suspend, */
9478+ /*.resume = ehci_hcd_omap_resume, */
9479+ .driver = {
9480+ .name = "ehci-omap",
9481+ }
9482+};
9483+
9484+/*-------------------------------------------------------------------------*/
9485+
9486+static const struct hc_driver ehci_omap_hc_driver = {
9487+ .description = hcd_name,
9488+ .product_desc = "OMAP-EHCI Host Controller",
9489+ .hcd_priv_size = sizeof(struct ehci_hcd),
9490+
9491+ /*
9492+ * generic hardware linkage
9493+ */
9494+ .irq = ehci_irq,
9495+ .flags = HCD_MEMORY | HCD_USB2,
9496+
9497+ /*
9498+ * basic lifecycle operations
9499+ */
9500+ .reset = ehci_init,
9501+ .start = ehci_run,
9502+ .stop = ehci_stop,
9503+ .shutdown = ehci_shutdown,
9504+
9505+ /*
9506+ * managing i/o requests and associated device resources
9507+ */
9508+ .urb_enqueue = ehci_urb_enqueue,
9509+ .urb_dequeue = ehci_urb_dequeue,
9510+ .endpoint_disable = ehci_endpoint_disable,
9511+ .endpoint_reset = ehci_endpoint_reset,
9512+
9513+ /*
9514+ * scheduling support
9515+ */
9516+ .get_frame_number = ehci_get_frame,
9517+
9518+ /*
9519+ * root hub support
9520+ */
9521+ .hub_status_data = ehci_hub_status_data,
9522+ .hub_control = ehci_hub_control,
9523+ .bus_suspend = ehci_bus_suspend,
9524+ .bus_resume = ehci_bus_resume,
9525+
9526+ .clear_tt_buffer_complete = ehci_clear_tt_buffer_complete,
9527+};
9528+
9529+MODULE_ALIAS("platform:omap-ehci");
9530+MODULE_AUTHOR("Texas Instruments, Inc.");
9531+MODULE_AUTHOR("Felipe Balbi <felipe.balbi@nokia.com>");
9532+
9533--- a/drivers/video/omap/dispc.c
9534+++ b/drivers/video/omap/dispc.c
9535@@ -210,6 +210,7 @@ static u32 inline dispc_read_reg(int idx
9536 /* Select RFBI or bypass mode */
9537 static void enable_rfbi_mode(int enable)
9538 {
9539+ void __iomem *rfbi_control;
9540     u32 l;
9541 
9542     l = dispc_read_reg(DISPC_CONTROL);
9543@@ -222,9 +223,15 @@ static void enable_rfbi_mode(int enable)
9544     dispc_write_reg(DISPC_CONTROL, l);
9545 
9546     /* Set bypass mode in RFBI module */
9547- l = __raw_readl(OMAP2_IO_ADDRESS(RFBI_CONTROL));
9548+ rfbi_control = ioremap(RFBI_CONTROL, SZ_1K);
9549+ if (!rfbi_control) {
9550+ pr_err("Unable to ioremap rfbi_control\n");
9551+ return;
9552+ }
9553+ l = __raw_readl(rfbi_control);
9554     l |= enable ? 0 : (1 << 1);
9555- __raw_writel(l, OMAP2_IO_ADDRESS(RFBI_CONTROL));
9556+ __raw_writel(l, rfbi_control);
9557+ iounmap(rfbi_control);
9558 }
9559 
9560 static void set_lcd_data_lines(int data_lines)
9561@@ -1373,6 +1380,7 @@ static int omap_dispc_init(struct omapfb
9562     int r;
9563     u32 l;
9564     struct lcd_panel *panel = fbdev->panel;
9565+ void __iomem *ram_fw_base;
9566     int tmo = 10000;
9567     int skip_init = 0;
9568     int i;
9569@@ -1453,7 +1461,13 @@ static int omap_dispc_init(struct omapfb
9570     }
9571 
9572     /* L3 firewall setting: enable access to OCM RAM */
9573- __raw_writel(0x402000b0, OMAP2_IO_ADDRESS(0x680050a0));
9574+ ram_fw_base = ioremap(0x68005000, SZ_1K);
9575+ if (!ram_fw_base) {
9576+ dev_err(dispc.fbdev->dev, "Cannot ioremap to enable OCM RAM\n");
9577+ goto fail1;
9578+ }
9579+ __raw_writel(0x402000b0, ram_fw_base + 0xa0);
9580+ iounmap(ram_fw_base);
9581 
9582     if ((r = alloc_palette_ram()) < 0)
9583         goto fail2;
9584

Archive Download this file



interactive