821171cf6b7dfbed55ced2ac437afdd783c453ed
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-omap2 / pdata-quirks.c
1 /*
2  * Legacy platform_data quirks
3  *
4  * Copyright (C) 2013 Texas Instruments
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10 #include <linux/clk.h>
11 #include <linux/davinci_emac.h>
12 #include <linux/gpio.h>
13 #include <linux/init.h>
14 #include <linux/kernel.h>
15 #include <linux/of_platform.h>
16 #include <linux/ti_wilink_st.h>
17
18 #include <linux/platform_data/pinctrl-single.h>
19 #include <linux/platform_data/iommu-omap.h>
20
21 #include "common.h"
22 #include "common-board-devices.h"
23 #include "dss-common.h"
24 #include "control.h"
25 #include "omap_device.h"
26 #include "omap-secure.h"
27 #include "soc.h"
28
29 struct pdata_init {
30         const char *compatible;
31         void (*fn)(void);
32 };
33
34 struct of_dev_auxdata omap_auxdata_lookup[];
35 static struct twl4030_gpio_platform_data twl_gpio_auxdata;
36
37 #ifdef CONFIG_MACH_NOKIA_N8X0
38 static void __init omap2420_n8x0_legacy_init(void)
39 {
40         omap_auxdata_lookup[0].platform_data = n8x0_legacy_init();
41 }
42 #else
43 #define omap2420_n8x0_legacy_init       NULL
44 #endif
45
46 #ifdef CONFIG_ARCH_OMAP3
47 /*
48  * Configures GPIOs 126, 127 and 129 to 1.8V mode instead of 3.0V
49  * mode for MMC1 in case bootloader did not configure things.
50  * Note that if the pins are used for MMC1, pbias-regulator
51  * manages the IO voltage.
52  */
53 static void __init omap3_gpio126_127_129(void)
54 {
55         u32 reg;
56
57         reg = omap_ctrl_readl(OMAP343X_CONTROL_PBIAS_LITE);
58         reg &= ~OMAP343X_PBIASLITEVMODE1;
59         reg |= OMAP343X_PBIASLITEPWRDNZ1;
60         omap_ctrl_writel(reg, OMAP343X_CONTROL_PBIAS_LITE);
61         if (cpu_is_omap3630()) {
62                 reg = omap_ctrl_readl(OMAP34XX_CONTROL_WKUP_CTRL);
63                 reg |= OMAP36XX_GPIO_IO_PWRDNZ;
64                 omap_ctrl_writel(reg, OMAP34XX_CONTROL_WKUP_CTRL);
65         }
66 }
67
68 static void __init hsmmc2_internal_input_clk(void)
69 {
70         u32 reg;
71
72         reg = omap_ctrl_readl(OMAP343X_CONTROL_DEVCONF1);
73         reg |= OMAP2_MMCSDIO2ADPCLKISEL;
74         omap_ctrl_writel(reg, OMAP343X_CONTROL_DEVCONF1);
75 }
76
77 static struct iommu_platform_data omap3_iommu_pdata = {
78         .reset_name = "mmu",
79         .assert_reset = omap_device_assert_hardreset,
80         .deassert_reset = omap_device_deassert_hardreset,
81 };
82
83 static int omap3_sbc_t3730_twl_callback(struct device *dev,
84                                            unsigned gpio,
85                                            unsigned ngpio)
86 {
87         int res;
88
89         res = gpio_request_one(gpio + 2, GPIOF_OUT_INIT_HIGH,
90                                "wlan pwr");
91         if (res)
92                 return res;
93
94         gpio_export(gpio, 0);
95
96         return 0;
97 }
98
99 static void __init omap3_sbc_t3x_usb_hub_init(int gpio, char *hub_name)
100 {
101         int err = gpio_request_one(gpio, GPIOF_OUT_INIT_LOW, hub_name);
102
103         if (err) {
104                 pr_err("SBC-T3x: %s reset gpio request failed: %d\n",
105                         hub_name, err);
106                 return;
107         }
108
109         gpio_export(gpio, 0);
110
111         udelay(10);
112         gpio_set_value(gpio, 1);
113         msleep(1);
114 }
115
116 static void __init omap3_sbc_t3730_twl_init(void)
117 {
118         twl_gpio_auxdata.setup = omap3_sbc_t3730_twl_callback;
119 }
120
121 static void __init omap3_sbc_t3730_legacy_init(void)
122 {
123         omap3_sbc_t3x_usb_hub_init(167, "sb-t35 usb hub");
124 }
125
126 static void __init omap3_sbc_t3530_legacy_init(void)
127 {
128         omap3_sbc_t3x_usb_hub_init(167, "sb-t35 usb hub");
129 }
130
131 struct ti_st_plat_data wilink_pdata = {
132         .nshutdown_gpio = 137,
133         .dev_name = "/dev/ttyO1",
134         .flow_cntrl = 1,
135         .baud_rate = 300000,
136 };
137
138 static struct platform_device wl18xx_device = {
139         .name   = "kim",
140         .id     = -1,
141         .dev    = {
142                 .platform_data = &wilink_pdata,
143         }
144 };
145
146 static struct platform_device btwilink_device = {
147         .name   = "btwilink",
148         .id     = -1,
149 };
150
151 static void __init omap3_igep0020_rev_f_legacy_init(void)
152 {
153         platform_device_register(&wl18xx_device);
154         platform_device_register(&btwilink_device);
155 }
156
157 static void __init omap3_igep0030_rev_g_legacy_init(void)
158 {
159         platform_device_register(&wl18xx_device);
160         platform_device_register(&btwilink_device);
161 }
162
163 static void __init omap3_evm_legacy_init(void)
164 {
165         hsmmc2_internal_input_clk();
166 }
167
168 static void am35xx_enable_emac_int(void)
169 {
170         u32 v;
171
172         v = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
173         v |= (AM35XX_CPGMAC_C0_RX_PULSE_CLR | AM35XX_CPGMAC_C0_TX_PULSE_CLR |
174               AM35XX_CPGMAC_C0_MISC_PULSE_CLR | AM35XX_CPGMAC_C0_RX_THRESH_CLR);
175         omap_ctrl_writel(v, AM35XX_CONTROL_LVL_INTR_CLEAR);
176         omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); /* OCP barrier */
177 }
178
179 static void am35xx_disable_emac_int(void)
180 {
181         u32 v;
182
183         v = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
184         v |= (AM35XX_CPGMAC_C0_RX_PULSE_CLR | AM35XX_CPGMAC_C0_TX_PULSE_CLR);
185         omap_ctrl_writel(v, AM35XX_CONTROL_LVL_INTR_CLEAR);
186         omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); /* OCP barrier */
187 }
188
189 static struct emac_platform_data am35xx_emac_pdata = {
190         .interrupt_enable       = am35xx_enable_emac_int,
191         .interrupt_disable      = am35xx_disable_emac_int,
192 };
193
194 static void __init am35xx_emac_reset(void)
195 {
196         u32 v;
197
198         v = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
199         v &= ~AM35XX_CPGMACSS_SW_RST;
200         omap_ctrl_writel(v, AM35XX_CONTROL_IP_SW_RESET);
201         omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET); /* OCP barrier */
202 }
203
204 static struct gpio cm_t3517_wlan_gpios[] __initdata = {
205         { 56,   GPIOF_OUT_INIT_HIGH,    "wlan pwr" },
206         { 4,    GPIOF_OUT_INIT_HIGH,    "xcvr noe" },
207 };
208
209 static void __init omap3_sbc_t3517_wifi_init(void)
210 {
211         int err = gpio_request_array(cm_t3517_wlan_gpios,
212                                 ARRAY_SIZE(cm_t3517_wlan_gpios));
213         if (err) {
214                 pr_err("SBC-T3517: wl12xx gpios request failed: %d\n", err);
215                 return;
216         }
217
218         gpio_export(cm_t3517_wlan_gpios[0].gpio, 0);
219         gpio_export(cm_t3517_wlan_gpios[1].gpio, 0);
220
221         msleep(100);
222         gpio_set_value(cm_t3517_wlan_gpios[1].gpio, 0);
223 }
224
225 static void __init omap3_sbc_t3517_legacy_init(void)
226 {
227         omap3_sbc_t3x_usb_hub_init(152, "cm-t3517 usb hub");
228         omap3_sbc_t3x_usb_hub_init(98, "sb-t35 usb hub");
229         am35xx_emac_reset();
230         hsmmc2_internal_input_clk();
231         omap3_sbc_t3517_wifi_init();
232 }
233
234 static void __init am3517_evm_legacy_init(void)
235 {
236         am35xx_emac_reset();
237 }
238
239 static struct platform_device omap3_rom_rng_device = {
240         .name           = "omap3-rom-rng",
241         .id             = -1,
242         .dev    = {
243                 .platform_data  = rx51_secure_rng_call,
244         },
245 };
246
247 static void __init nokia_n900_legacy_init(void)
248 {
249         hsmmc2_internal_input_clk();
250
251         if (omap_type() == OMAP2_DEVICE_TYPE_SEC) {
252                 if (IS_ENABLED(CONFIG_ARM_ERRATA_430973)) {
253                         pr_info("RX-51: Enabling ARM errata 430973 workaround\n");
254                         /* set IBE to 1 */
255                         rx51_secure_update_aux_cr(BIT(6), 0);
256                 } else {
257                         pr_warn("RX-51: Not enabling ARM errata 430973 workaround\n");
258                         pr_warn("Thumb binaries may crash randomly without this workaround\n");
259                 }
260
261                 pr_info("RX-51: Registring OMAP3 HWRNG device\n");
262                 platform_device_register(&omap3_rom_rng_device);
263
264         }
265 }
266
267 static void __init omap3_tao3530_legacy_init(void)
268 {
269         hsmmc2_internal_input_clk();
270 }
271 #endif /* CONFIG_ARCH_OMAP3 */
272
273 #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5)
274 static struct iommu_platform_data omap4_iommu_pdata = {
275         .reset_name = "mmu_cache",
276         .assert_reset = omap_device_assert_hardreset,
277         .deassert_reset = omap_device_deassert_hardreset,
278 };
279 #endif
280
281 #ifdef CONFIG_SOC_OMAP5
282 static void __init omap5_uevm_legacy_init(void)
283 {
284 }
285 #endif
286
287 static struct pcs_pdata pcs_pdata;
288
289 void omap_pcs_legacy_init(int irq, void (*rearm)(void))
290 {
291         pcs_pdata.irq = irq;
292         pcs_pdata.rearm = rearm;
293 }
294
295 /*
296  * GPIOs for TWL are initialized by the I2C bus and need custom
297  * handing until DSS has device tree bindings.
298  */
299 void omap_auxdata_legacy_init(struct device *dev)
300 {
301         if (dev->platform_data)
302                 return;
303
304         if (strcmp("twl4030-gpio", dev_name(dev)))
305                 return;
306
307         dev->platform_data = &twl_gpio_auxdata;
308 }
309
310 /*
311  * Few boards still need auxdata populated before we populate
312  * the dev entries in of_platform_populate().
313  */
314 static struct pdata_init auxdata_quirks[] __initdata = {
315 #ifdef CONFIG_SOC_OMAP2420
316         { "nokia,n800", omap2420_n8x0_legacy_init, },
317         { "nokia,n810", omap2420_n8x0_legacy_init, },
318         { "nokia,n810-wimax", omap2420_n8x0_legacy_init, },
319 #endif
320 #ifdef CONFIG_ARCH_OMAP3
321         { "compulab,omap3-sbc-t3730", omap3_sbc_t3730_twl_init, },
322 #endif
323         { /* sentinel */ },
324 };
325
326 struct of_dev_auxdata omap_auxdata_lookup[] __initdata = {
327 #ifdef CONFIG_MACH_NOKIA_N8X0
328         OF_DEV_AUXDATA("ti,omap2420-mmc", 0x4809c000, "mmci-omap.0", NULL),
329         OF_DEV_AUXDATA("menelaus", 0x72, "1-0072", &n8x0_menelaus_platform_data),
330         OF_DEV_AUXDATA("tlv320aic3x", 0x18, "2-0018", &n810_aic33_data),
331 #endif
332 #ifdef CONFIG_ARCH_OMAP3
333         OF_DEV_AUXDATA("ti,omap3-padconf", 0x48002030, "48002030.pinmux", &pcs_pdata),
334         OF_DEV_AUXDATA("ti,omap3-padconf", 0x480025a0, "480025a0.pinmux", &pcs_pdata),
335         OF_DEV_AUXDATA("ti,omap3-padconf", 0x48002a00, "48002a00.pinmux", &pcs_pdata),
336         OF_DEV_AUXDATA("ti,omap2-iommu", 0x5d000000, "5d000000.mmu",
337                        &omap3_iommu_pdata),
338         /* Only on am3517 */
339         OF_DEV_AUXDATA("ti,davinci_mdio", 0x5c030000, "davinci_mdio.0", NULL),
340         OF_DEV_AUXDATA("ti,am3517-emac", 0x5c000000, "davinci_emac.0",
341                        &am35xx_emac_pdata),
342 #endif
343 #ifdef CONFIG_ARCH_OMAP4
344         OF_DEV_AUXDATA("ti,omap4-padconf", 0x4a100040, "4a100040.pinmux", &pcs_pdata),
345         OF_DEV_AUXDATA("ti,omap4-padconf", 0x4a31e040, "4a31e040.pinmux", &pcs_pdata),
346 #endif
347 #ifdef CONFIG_SOC_OMAP5
348         OF_DEV_AUXDATA("ti,omap5-padconf", 0x4a002840, "4a002840.pinmux", &pcs_pdata),
349         OF_DEV_AUXDATA("ti,omap5-padconf", 0x4ae0c840, "4ae0c840.pinmux", &pcs_pdata),
350 #endif
351 #ifdef CONFIG_SOC_DRA7XX
352         OF_DEV_AUXDATA("ti,dra7-padconf", 0x4a003400, "4a003400.pinmux", &pcs_pdata),
353 #endif
354 #ifdef CONFIG_SOC_AM43XX
355         OF_DEV_AUXDATA("ti,am437-padconf", 0x44e10800, "44e10800.pinmux", &pcs_pdata),
356 #endif
357 #if defined(CONFIG_ARCH_OMAP4) || defined(CONFIG_SOC_OMAP5)
358         OF_DEV_AUXDATA("ti,omap4-iommu", 0x4a066000, "4a066000.mmu",
359                        &omap4_iommu_pdata),
360         OF_DEV_AUXDATA("ti,omap4-iommu", 0x55082000, "55082000.mmu",
361                        &omap4_iommu_pdata),
362 #endif
363         { /* sentinel */ },
364 };
365
366 /*
367  * Few boards still need to initialize some legacy devices with
368  * platform data until the drivers support device tree.
369  */
370 static struct pdata_init pdata_quirks[] __initdata = {
371 #ifdef CONFIG_ARCH_OMAP3
372         { "compulab,omap3-sbc-t3517", omap3_sbc_t3517_legacy_init, },
373         { "compulab,omap3-sbc-t3530", omap3_sbc_t3530_legacy_init, },
374         { "compulab,omap3-sbc-t3730", omap3_sbc_t3730_legacy_init, },
375         { "nokia,omap3-n900", nokia_n900_legacy_init, },
376         { "nokia,omap3-n9", hsmmc2_internal_input_clk, },
377         { "nokia,omap3-n950", hsmmc2_internal_input_clk, },
378         { "isee,omap3-igep0020-rev-f", omap3_igep0020_rev_f_legacy_init, },
379         { "isee,omap3-igep0030-rev-g", omap3_igep0030_rev_g_legacy_init, },
380         { "logicpd,dm3730-torpedo-devkit", omap3_gpio126_127_129, },
381         { "ti,omap3-evm-37xx", omap3_evm_legacy_init, },
382         { "ti,am3517-evm", am3517_evm_legacy_init, },
383         { "technexion,omap3-tao3530", omap3_tao3530_legacy_init, },
384 #endif
385 #ifdef CONFIG_SOC_OMAP5
386         { "ti,omap5-uevm", omap5_uevm_legacy_init, },
387 #endif
388         { /* sentinel */ },
389 };
390
391 static void pdata_quirks_check(struct pdata_init *quirks)
392 {
393         while (quirks->compatible) {
394                 if (of_machine_is_compatible(quirks->compatible)) {
395                         if (quirks->fn)
396                                 quirks->fn();
397                         break;
398                 }
399                 quirks++;
400         }
401 }
402
403 void __init pdata_quirks_init(const struct of_device_id *omap_dt_match_table)
404 {
405         omap_sdrc_init(NULL, NULL);
406         pdata_quirks_check(auxdata_quirks);
407         of_platform_populate(NULL, omap_dt_match_table,
408                              omap_auxdata_lookup, NULL);
409         pdata_quirks_check(pdata_quirks);
410 }