ARM: S5PV210: Add keypad device to the GONI board
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-s5pv210 / mach-goni.c
1 /* linux/arch/arm/mach-s5pv210/mach-goni.c
2  *
3  * Copyright (c) 2010 Samsung Electronics Co., Ltd.
4  *              http://www.samsung.com/
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9 */
10
11 #include <linux/kernel.h>
12 #include <linux/types.h>
13 #include <linux/init.h>
14 #include <linux/serial_core.h>
15 #include <linux/fb.h>
16 #include <linux/i2c.h>
17 #include <linux/i2c-gpio.h>
18 #include <linux/mfd/max8998.h>
19 #include <linux/gpio_keys.h>
20 #include <linux/input.h>
21 #include <linux/gpio.h>
22
23 #include <asm/mach/arch.h>
24 #include <asm/mach/map.h>
25 #include <asm/setup.h>
26 #include <asm/mach-types.h>
27
28 #include <mach/map.h>
29 #include <mach/regs-clock.h>
30 #include <mach/regs-fb.h>
31
32 #include <plat/gpio-cfg.h>
33 #include <plat/regs-serial.h>
34 #include <plat/s5pv210.h>
35 #include <plat/devs.h>
36 #include <plat/cpu.h>
37 #include <plat/fb.h>
38 #include <plat/keypad.h>
39 #include <plat/sdhci.h>
40
41 /* Following are default values for UCON, ULCON and UFCON UART registers */
42 #define GONI_UCON_DEFAULT       (S3C2410_UCON_TXILEVEL |        \
43                                  S3C2410_UCON_RXILEVEL |        \
44                                  S3C2410_UCON_TXIRQMODE |       \
45                                  S3C2410_UCON_RXIRQMODE |       \
46                                  S3C2410_UCON_RXFIFO_TOI |      \
47                                  S3C2443_UCON_RXERR_IRQEN)
48
49 #define GONI_ULCON_DEFAULT      S3C2410_LCON_CS8
50
51 #define GONI_UFCON_DEFAULT      S3C2410_UFCON_FIFOMODE
52
53 static struct s3c2410_uartcfg goni_uartcfgs[] __initdata = {
54         [0] = {
55                 .hwport         = 0,
56                 .flags          = 0,
57                 .ucon           = GONI_UCON_DEFAULT,
58                 .ulcon          = GONI_ULCON_DEFAULT,
59                 .ufcon          = GONI_UFCON_DEFAULT |
60                         S5PV210_UFCON_TXTRIG256 | S5PV210_UFCON_RXTRIG256,
61         },
62         [1] = {
63                 .hwport         = 1,
64                 .flags          = 0,
65                 .ucon           = GONI_UCON_DEFAULT,
66                 .ulcon          = GONI_ULCON_DEFAULT,
67                 .ufcon          = GONI_UFCON_DEFAULT |
68                         S5PV210_UFCON_TXTRIG64 | S5PV210_UFCON_RXTRIG64,
69         },
70         [2] = {
71                 .hwport         = 2,
72                 .flags          = 0,
73                 .ucon           = GONI_UCON_DEFAULT,
74                 .ulcon          = GONI_ULCON_DEFAULT,
75                 .ufcon          = GONI_UFCON_DEFAULT |
76                         S5PV210_UFCON_TXTRIG16 | S5PV210_UFCON_RXTRIG16,
77         },
78         [3] = {
79                 .hwport         = 3,
80                 .flags          = 0,
81                 .ucon           = GONI_UCON_DEFAULT,
82                 .ulcon          = GONI_ULCON_DEFAULT,
83                 .ufcon          = GONI_UFCON_DEFAULT |
84                         S5PV210_UFCON_TXTRIG16 | S5PV210_UFCON_RXTRIG16,
85         },
86 };
87
88 /* Frame Buffer */
89 static struct s3c_fb_pd_win goni_fb_win0 = {
90         .win_mode = {
91                 .pixclock = 1000000000000ULL / ((16+16+2+480)*(28+3+2+800)*55),
92                 .left_margin    = 16,
93                 .right_margin   = 16,
94                 .upper_margin   = 3,
95                 .lower_margin   = 28,
96                 .hsync_len      = 2,
97                 .vsync_len      = 2,
98                 .xres           = 480,
99                 .yres           = 800,
100                 .refresh        = 55,
101         },
102         .max_bpp        = 32,
103         .default_bpp    = 16,
104 };
105
106 static struct s3c_fb_platdata goni_lcd_pdata __initdata = {
107         .win[0]         = &goni_fb_win0,
108         .vidcon0        = VIDCON0_VIDOUT_RGB | VIDCON0_PNRMODE_RGB |
109                           VIDCON0_CLKSEL_LCD,
110         .vidcon1        = VIDCON1_INV_VCLK | VIDCON1_INV_VDEN
111                           | VIDCON1_INV_HSYNC | VIDCON1_INV_VSYNC,
112         .setup_gpio     = s5pv210_fb_gpio_setup_24bpp,
113 };
114
115 /* KEYPAD */
116 static uint32_t keymap[] __initdata = {
117         /* KEY(row, col, keycode) */
118         KEY(0, 1, KEY_MENU),            /* Send */
119         KEY(0, 2, KEY_BACK),            /* End */
120         KEY(1, 1, KEY_CONFIG),          /* Half shot */
121         KEY(1, 2, KEY_VOLUMEUP),
122         KEY(2, 1, KEY_CAMERA),          /* Full shot */
123         KEY(2, 2, KEY_VOLUMEDOWN),
124 };
125
126 static struct matrix_keymap_data keymap_data __initdata = {
127         .keymap         = keymap,
128         .keymap_size    = ARRAY_SIZE(keymap),
129 };
130
131 static struct samsung_keypad_platdata keypad_data __initdata = {
132         .keymap_data    = &keymap_data,
133         .rows           = 3,
134         .cols           = 3,
135 };
136
137 /* MAX8998 regulators */
138 #if defined(CONFIG_REGULATOR_MAX8998) || defined(CONFIG_REGULATOR_MAX8998_MODULE)
139
140 static struct regulator_init_data goni_ldo2_data = {
141         .constraints    = {
142                 .name           = "VALIVE_1.1V",
143                 .min_uV         = 1100000,
144                 .max_uV         = 1100000,
145                 .apply_uV       = 1,
146                 .always_on      = 1,
147                 .state_mem      = {
148                         .enabled = 1,
149                 },
150         },
151 };
152
153 static struct regulator_init_data goni_ldo3_data = {
154         .constraints    = {
155                 .name           = "VUSB/MIPI_1.1V",
156                 .min_uV         = 1100000,
157                 .max_uV         = 1100000,
158                 .apply_uV       = 1,
159                 .always_on      = 1,
160         },
161 };
162
163 static struct regulator_init_data goni_ldo4_data = {
164         .constraints    = {
165                 .name           = "VDAC_3.3V",
166                 .min_uV         = 3300000,
167                 .max_uV         = 3300000,
168                 .apply_uV       = 1,
169         },
170 };
171
172 static struct regulator_init_data goni_ldo5_data = {
173         .constraints    = {
174                 .name           = "VTF_2.8V",
175                 .min_uV         = 2800000,
176                 .max_uV         = 2800000,
177                 .apply_uV       = 1,
178         },
179 };
180
181 static struct regulator_init_data goni_ldo6_data = {
182         .constraints    = {
183                 .name           = "VCC_3.3V",
184                 .min_uV         = 3300000,
185                 .max_uV         = 3300000,
186                 .apply_uV       = 1,
187         },
188 };
189
190 static struct regulator_init_data goni_ldo7_data = {
191         .constraints    = {
192                 .name           = "VLCD_1.8V",
193                 .min_uV         = 1800000,
194                 .max_uV         = 1800000,
195                 .apply_uV       = 1,
196                 .always_on      = 1,
197         },
198 };
199
200 static struct regulator_init_data goni_ldo8_data = {
201         .constraints    = {
202                 .name           = "VUSB/VADC_3.3V",
203                 .min_uV         = 3300000,
204                 .max_uV         = 3300000,
205                 .apply_uV       = 1,
206                 .always_on      = 1,
207         },
208 };
209
210 static struct regulator_init_data goni_ldo9_data = {
211         .constraints    = {
212                 .name           = "VCC/VCAM_2.8V",
213                 .min_uV         = 2800000,
214                 .max_uV         = 2800000,
215                 .apply_uV       = 1,
216                 .always_on      = 1,
217         },
218 };
219
220 static struct regulator_init_data goni_ldo10_data = {
221         .constraints    = {
222                 .name           = "VPLL_1.1V",
223                 .min_uV         = 1100000,
224                 .max_uV         = 1100000,
225                 .apply_uV       = 1,
226                 .boot_on        = 1,
227         },
228 };
229
230 static struct regulator_init_data goni_ldo11_data = {
231         .constraints    = {
232                 .name           = "CAM_IO_2.8V",
233                 .min_uV         = 2800000,
234                 .max_uV         = 2800000,
235                 .apply_uV       = 1,
236                 .always_on      = 1,
237         },
238 };
239
240 static struct regulator_init_data goni_ldo12_data = {
241         .constraints    = {
242                 .name           = "CAM_ISP_1.2V",
243                 .min_uV         = 1200000,
244                 .max_uV         = 1200000,
245                 .apply_uV       = 1,
246                 .always_on      = 1,
247         },
248 };
249
250 static struct regulator_init_data goni_ldo13_data = {
251         .constraints    = {
252                 .name           = "CAM_A_2.8V",
253                 .min_uV         = 2800000,
254                 .max_uV         = 2800000,
255                 .apply_uV       = 1,
256                 .always_on      = 1,
257         },
258 };
259
260 static struct regulator_init_data goni_ldo14_data = {
261         .constraints    = {
262                 .name           = "CAM_CIF_1.8V",
263                 .min_uV         = 1800000,
264                 .max_uV         = 1800000,
265                 .apply_uV       = 1,
266                 .always_on      = 1,
267         },
268 };
269
270 static struct regulator_init_data goni_ldo15_data = {
271         .constraints    = {
272                 .name           = "CAM_AF_3.3V",
273                 .min_uV         = 3300000,
274                 .max_uV         = 3300000,
275                 .apply_uV       = 1,
276                 .always_on      = 1,
277         },
278 };
279
280 static struct regulator_init_data goni_ldo16_data = {
281         .constraints    = {
282                 .name           = "VMIPI_1.8V",
283                 .min_uV         = 1800000,
284                 .max_uV         = 1800000,
285                 .apply_uV       = 1,
286                 .always_on      = 1,
287         },
288 };
289
290 static struct regulator_init_data goni_ldo17_data = {
291         .constraints    = {
292                 .name           = "VCC_3.0V_LCD",
293                 .min_uV         = 3000000,
294                 .max_uV         = 3000000,
295                 .apply_uV       = 1,
296                 .always_on      = 1,
297         },
298 };
299
300 /* BUCK */
301 static struct regulator_consumer_supply buck1_consumer[] = {
302         {       .supply = "vddarm", },
303 };
304
305 static struct regulator_consumer_supply buck2_consumer[] = {
306         {       .supply = "vddint", },
307 };
308
309 static struct regulator_init_data goni_buck1_data = {
310         .constraints    = {
311                 .name           = "VARM_1.2V",
312                 .min_uV         = 1200000,
313                 .max_uV         = 1200000,
314                 .apply_uV       = 1,
315                 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
316                                   REGULATOR_CHANGE_STATUS,
317         },
318         .num_consumer_supplies  = ARRAY_SIZE(buck1_consumer),
319         .consumer_supplies      = buck1_consumer,
320 };
321
322 static struct regulator_init_data goni_buck2_data = {
323         .constraints    = {
324                 .name           = "VINT_1.2V",
325                 .min_uV         = 1200000,
326                 .max_uV         = 1200000,
327                 .apply_uV       = 1,
328                 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
329                                   REGULATOR_CHANGE_STATUS,
330         },
331         .num_consumer_supplies  = ARRAY_SIZE(buck2_consumer),
332         .consumer_supplies      = buck2_consumer,
333 };
334
335 static struct regulator_init_data goni_buck3_data = {
336         .constraints    = {
337                 .name           = "VCC_1.8V",
338                 .min_uV         = 1800000,
339                 .max_uV         = 1800000,
340                 .apply_uV       = 1,
341                 .state_mem      = {
342                         .enabled = 1,
343                 },
344         },
345 };
346
347 static struct regulator_init_data goni_buck4_data = {
348         .constraints    = {
349                 .name           = "CAM_CORE_1.2V",
350                 .min_uV         = 1200000,
351                 .max_uV         = 1200000,
352                 .apply_uV       = 1,
353                 .always_on      = 1,
354         },
355 };
356
357 static struct max8998_regulator_data goni_regulators[] = {
358         { MAX8998_LDO2,  &goni_ldo2_data },
359         { MAX8998_LDO3,  &goni_ldo3_data },
360         { MAX8998_LDO4,  &goni_ldo4_data },
361         { MAX8998_LDO5,  &goni_ldo5_data },
362         { MAX8998_LDO6,  &goni_ldo6_data },
363         { MAX8998_LDO7,  &goni_ldo7_data },
364         { MAX8998_LDO8,  &goni_ldo8_data },
365         { MAX8998_LDO9,  &goni_ldo9_data },
366         { MAX8998_LDO10, &goni_ldo10_data },
367         { MAX8998_LDO11, &goni_ldo11_data },
368         { MAX8998_LDO12, &goni_ldo12_data },
369         { MAX8998_LDO13, &goni_ldo13_data },
370         { MAX8998_LDO14, &goni_ldo14_data },
371         { MAX8998_LDO15, &goni_ldo15_data },
372         { MAX8998_LDO16, &goni_ldo16_data },
373         { MAX8998_LDO17, &goni_ldo17_data },
374         { MAX8998_BUCK1, &goni_buck1_data },
375         { MAX8998_BUCK2, &goni_buck2_data },
376         { MAX8998_BUCK3, &goni_buck3_data },
377         { MAX8998_BUCK4, &goni_buck4_data },
378 };
379
380 static struct max8998_platform_data goni_max8998_pdata = {
381         .num_regulators = ARRAY_SIZE(goni_regulators),
382         .regulators     = goni_regulators,
383 };
384 #endif
385
386 /* GPIO I2C PMIC */
387 #define AP_I2C_GPIO_PMIC_BUS_4  4
388 static struct i2c_gpio_platform_data goni_i2c_gpio_pmic_data = {
389         .sda_pin        = S5PV210_GPJ4(0),      /* XMSMCSN */
390         .scl_pin        = S5PV210_GPJ4(3),      /* XMSMIRQN */
391 };
392
393 static struct platform_device goni_i2c_gpio_pmic = {
394         .name           = "i2c-gpio",
395         .id             = AP_I2C_GPIO_PMIC_BUS_4,
396         .dev            = {
397                 .platform_data  = &goni_i2c_gpio_pmic_data,
398         },
399 };
400
401 static struct i2c_board_info i2c_gpio_pmic_devs[] __initdata = {
402 #if defined(CONFIG_REGULATOR_MAX8998) || defined(CONFIG_REGULATOR_MAX8998_MODULE)
403         {
404                 /* 0xCC when SRAD = 0 */
405                 I2C_BOARD_INFO("max8998", 0xCC >> 1),
406                 .platform_data = &goni_max8998_pdata,
407         },
408 #endif
409 };
410
411 /* PMIC Power button */
412 static struct gpio_keys_button goni_gpio_keys_table[] = {
413         {
414                 .code           = KEY_POWER,
415                 .gpio           = S5PV210_GPH2(6),
416                 .desc           = "gpio-keys: KEY_POWER",
417                 .type           = EV_KEY,
418                 .active_low     = 1,
419                 .wakeup         = 1,
420                 .debounce_interval = 1,
421         },
422 };
423
424 static struct gpio_keys_platform_data goni_gpio_keys_data = {
425         .buttons        = goni_gpio_keys_table,
426         .nbuttons       = ARRAY_SIZE(goni_gpio_keys_table),
427 };
428
429 static struct platform_device goni_device_gpiokeys = {
430         .name = "gpio-keys",
431         .dev = {
432                 .platform_data = &goni_gpio_keys_data,
433         },
434 };
435
436 static void __init goni_pmic_init(void)
437 {
438         /* AP_PMIC_IRQ: EINT7 */
439         s3c_gpio_cfgpin(S5PV210_GPH0(7), S3C_GPIO_SFN(0xf));
440         s3c_gpio_setpull(S5PV210_GPH0(7), S3C_GPIO_PULL_UP);
441
442         /* nPower: EINT22 */
443         s3c_gpio_cfgpin(S5PV210_GPH2(6), S3C_GPIO_SFN(0xf));
444         s3c_gpio_setpull(S5PV210_GPH2(6), S3C_GPIO_PULL_UP);
445 }
446
447 /* MoviNAND */
448 static struct s3c_sdhci_platdata goni_hsmmc0_data __initdata = {
449         .max_width              = 4,
450         .cd_type                = S3C_SDHCI_CD_PERMANENT,
451 };
452
453 /* Wireless LAN */
454 static struct s3c_sdhci_platdata goni_hsmmc1_data __initdata = {
455         .max_width              = 4,
456         .cd_type                = S3C_SDHCI_CD_EXTERNAL,
457         /* ext_cd_{init,cleanup} callbacks will be added later */
458 };
459
460 /* External Flash */
461 #define GONI_EXT_FLASH_EN       S5PV210_MP05(4)
462 #define GONI_EXT_FLASH_CD       S5PV210_GPH3(4)
463 static struct s3c_sdhci_platdata goni_hsmmc2_data __initdata = {
464         .max_width              = 4,
465         .cd_type                = S3C_SDHCI_CD_GPIO,
466         .ext_cd_gpio            = GONI_EXT_FLASH_CD,
467         .ext_cd_gpio_invert     = 1,
468 };
469
470 static void goni_setup_sdhci(void)
471 {
472         gpio_request(GONI_EXT_FLASH_EN, "FLASH_EN");
473         gpio_direction_output(GONI_EXT_FLASH_EN, 1);
474
475         s3c_sdhci0_set_platdata(&goni_hsmmc0_data);
476         s3c_sdhci1_set_platdata(&goni_hsmmc1_data);
477         s3c_sdhci2_set_platdata(&goni_hsmmc2_data);
478 };
479
480 static struct platform_device *goni_devices[] __initdata = {
481         &s3c_device_fb,
482         &s5p_device_onenand,
483         &goni_i2c_gpio_pmic,
484         &goni_device_gpiokeys,
485         &s5p_device_fimc0,
486         &s5p_device_fimc1,
487         &s5p_device_fimc2,
488         &s3c_device_hsmmc0,
489         &s3c_device_hsmmc1,
490         &s3c_device_hsmmc2,
491         &samsung_device_keypad,
492 };
493
494 static void __init goni_map_io(void)
495 {
496         s5p_init_io(NULL, 0, S5P_VA_CHIPID);
497         s3c24xx_init_clocks(24000000);
498         s3c24xx_init_uarts(goni_uartcfgs, ARRAY_SIZE(goni_uartcfgs));
499 }
500
501 static void __init goni_machine_init(void)
502 {
503         /* PMIC */
504         goni_pmic_init();
505         i2c_register_board_info(AP_I2C_GPIO_PMIC_BUS_4, i2c_gpio_pmic_devs,
506                         ARRAY_SIZE(i2c_gpio_pmic_devs));
507         /* SDHCI */
508         goni_setup_sdhci();
509
510         /* FB */
511         s3c_fb_set_platdata(&goni_lcd_pdata);
512
513         /* KEYPAD */
514         samsung_keypad_set_platdata(&keypad_data);
515
516         platform_add_devices(goni_devices, ARRAY_SIZE(goni_devices));
517 }
518
519 MACHINE_START(GONI, "GONI")
520         /* Maintainers: Kyungmin Park <kyungmin.park@samsung.com> */
521         .phys_io        = S3C_PA_UART & 0xfff00000,
522         .io_pg_offst    = (((u32)S3C_VA_UART) >> 18) & 0xfffc,
523         .boot_params    = S5P_PA_SDRAM + 0x100,
524         .init_irq       = s5pv210_init_irq,
525         .map_io         = goni_map_io,
526         .init_machine   = goni_machine_init,
527         .timer          = &s3c24xx_timer,
528 MACHINE_END