blob: d6f7e39ea68754b26bb37b1016bc05b144bef46d [file] [log] [blame]
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +00001/*
2 * linux/arch/mips/jz4740/board-qi_lb60.c
3 *
4 * QI_LB60 board support
5 *
6 * Copyright (c) 2009 Qi Hardware inc.,
7 * Author: Xiangfu Liu <xiangfu@qi-hardware.com>
Lars-Peter Clausenfe749aa2010-11-04 23:25:56 +01008 * Copyright 2010, Lars-Peter Clausen <lars@metafoo.de>
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +00009 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 or later
12 * as published by the Free Software Foundation.
13 */
14
15#include <linux/kernel.h>
16#include <linux/init.h>
17#include <linux/gpio.h>
Linus Walleij0a6d3152014-07-24 20:08:55 +020018#include <linux/gpio/machine.h>
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +000019
20#include <linux/input.h>
21#include <linux/gpio_keys.h>
22#include <linux/input/matrix_keypad.h>
23#include <linux/spi/spi.h>
24#include <linux/spi/spi_gpio.h>
25#include <linux/power_supply.h>
26#include <linux/power/jz4740-battery.h>
Lars-Peter Clausen0b4cf182011-02-08 03:43:53 +010027#include <linux/power/gpio-charger.h>
Thierry Reding0503b692015-10-05 13:31:17 +020028#include <linux/pwm.h>
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +000029
Alban Bedel5b235dc2015-09-04 14:29:16 +020030#include <asm/mach-jz4740/gpio.h>
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +000031#include <asm/mach-jz4740/jz4740_fb.h>
32#include <asm/mach-jz4740/jz4740_mmc.h>
33#include <asm/mach-jz4740/jz4740_nand.h>
34
35#include <linux/regulator/fixed.h>
36#include <linux/regulator/machine.h>
37
38#include <linux/leds_pwm.h>
39
40#include <asm/mach-jz4740/platform.h>
41
42#include "clock.h"
43
44static bool is_avt2;
45
46/* GPIOs */
47#define QI_LB60_GPIO_SD_CD JZ_GPIO_PORTD(0)
48#define QI_LB60_GPIO_SD_VCC_EN_N JZ_GPIO_PORTD(2)
49
50#define QI_LB60_GPIO_KEYOUT(x) (JZ_GPIO_PORTC(10) + (x))
51#define QI_LB60_GPIO_KEYIN(x) (JZ_GPIO_PORTD(18) + (x))
52#define QI_LB60_GPIO_KEYIN8 JZ_GPIO_PORTD(26)
53
54/* NAND */
55static struct nand_ecclayout qi_lb60_ecclayout_1gb = {
Lars-Peter Clausenc8fb4022011-02-08 03:43:54 +010056 .eccbytes = 36,
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +000057 .eccpos = {
Ralf Baechle70342282013-01-22 12:59:30 +010058 6, 7, 8, 9, 10, 11, 12, 13,
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +000059 14, 15, 16, 17, 18, 19, 20, 21,
60 22, 23, 24, 25, 26, 27, 28, 29,
61 30, 31, 32, 33, 34, 35, 36, 37,
62 38, 39, 40, 41
Lars-Peter Clausenc8fb4022011-02-08 03:43:54 +010063 },
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +000064 .oobfree = {
65 { .offset = 2, .length = 4 },
66 { .offset = 42, .length = 22 }
67 },
68};
69
70/* Early prototypes of the QI LB60 had only 1GB of NAND.
Lucas De Marchi25985ed2011-03-30 22:57:33 -030071 * In order to support these devices as well the partition and ecc layout is
Uwe Kleine-Königb5950762010-11-01 15:38:34 -040072 * initialized depending on the NAND size */
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +000073static struct mtd_partition qi_lb60_partitions_1gb[] = {
74 {
75 .name = "NAND BOOT partition",
76 .offset = 0 * 0x100000,
77 .size = 4 * 0x100000,
78 },
79 {
80 .name = "NAND KERNEL partition",
81 .offset = 4 * 0x100000,
82 .size = 4 * 0x100000,
83 },
84 {
85 .name = "NAND ROOTFS partition",
86 .offset = 8 * 0x100000,
87 .size = (504 + 512) * 0x100000,
88 },
89};
90
91static struct nand_ecclayout qi_lb60_ecclayout_2gb = {
Lars-Peter Clausenc8fb4022011-02-08 03:43:54 +010092 .eccbytes = 72,
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +000093 .eccpos = {
94 12, 13, 14, 15, 16, 17, 18, 19,
95 20, 21, 22, 23, 24, 25, 26, 27,
96 28, 29, 30, 31, 32, 33, 34, 35,
97 36, 37, 38, 39, 40, 41, 42, 43,
98 44, 45, 46, 47, 48, 49, 50, 51,
99 52, 53, 54, 55, 56, 57, 58, 59,
100 60, 61, 62, 63, 64, 65, 66, 67,
101 68, 69, 70, 71, 72, 73, 74, 75,
102 76, 77, 78, 79, 80, 81, 82, 83
Lars-Peter Clausenc8fb4022011-02-08 03:43:54 +0100103 },
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000104 .oobfree = {
105 { .offset = 2, .length = 10 },
106 { .offset = 84, .length = 44 },
107 },
108};
109
110static struct mtd_partition qi_lb60_partitions_2gb[] = {
111 {
112 .name = "NAND BOOT partition",
113 .offset = 0 * 0x100000,
114 .size = 4 * 0x100000,
115 },
116 {
117 .name = "NAND KERNEL partition",
118 .offset = 4 * 0x100000,
119 .size = 4 * 0x100000,
120 },
121 {
122 .name = "NAND ROOTFS partition",
123 .offset = 8 * 0x100000,
124 .size = (504 + 512 + 1024) * 0x100000,
125 },
126};
127
128static void qi_lb60_nand_ident(struct platform_device *pdev,
129 struct nand_chip *chip, struct mtd_partition **partitions,
130 int *num_partitions)
131{
132 if (chip->page_shift == 12) {
133 chip->ecc.layout = &qi_lb60_ecclayout_2gb;
134 *partitions = qi_lb60_partitions_2gb;
135 *num_partitions = ARRAY_SIZE(qi_lb60_partitions_2gb);
136 } else {
137 chip->ecc.layout = &qi_lb60_ecclayout_1gb;
138 *partitions = qi_lb60_partitions_1gb;
139 *num_partitions = ARRAY_SIZE(qi_lb60_partitions_1gb);
140 }
141}
142
143static struct jz_nand_platform_data qi_lb60_nand_pdata = {
144 .ident_callback = qi_lb60_nand_ident,
Maarten ter Huurne56635d72012-03-29 19:17:02 +0200145 .banks = { 1 },
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000146};
147
Lars-Peter Clausencd145af2014-12-02 20:48:26 +0100148static struct gpiod_lookup_table qi_lb60_nand_gpio_table = {
149 .dev_id = "jz4740-nand.0",
150 .table = {
151 GPIO_LOOKUP("Bank C", 30, "busy", 0),
152 { },
153 },
154};
155
156
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000157/* Keyboard*/
158
159#define KEY_QI_QI KEY_F13
160#define KEY_QI_UPRED KEY_RIGHTALT
161#define KEY_QI_VOLUP KEY_VOLUMEUP
162#define KEY_QI_VOLDOWN KEY_VOLUMEDOWN
163#define KEY_QI_FN KEY_LEFTCTRL
164
165static const uint32_t qi_lb60_keymap[] = {
166 KEY(0, 0, KEY_F1), /* S2 */
167 KEY(0, 1, KEY_F2), /* S3 */
168 KEY(0, 2, KEY_F3), /* S4 */
169 KEY(0, 3, KEY_F4), /* S5 */
170 KEY(0, 4, KEY_F5), /* S6 */
171 KEY(0, 5, KEY_F6), /* S7 */
172 KEY(0, 6, KEY_F7), /* S8 */
173
174 KEY(1, 0, KEY_Q), /* S10 */
175 KEY(1, 1, KEY_W), /* S11 */
176 KEY(1, 2, KEY_E), /* S12 */
177 KEY(1, 3, KEY_R), /* S13 */
178 KEY(1, 4, KEY_T), /* S14 */
179 KEY(1, 5, KEY_Y), /* S15 */
180 KEY(1, 6, KEY_U), /* S16 */
181 KEY(1, 7, KEY_I), /* S17 */
182 KEY(2, 0, KEY_A), /* S18 */
183 KEY(2, 1, KEY_S), /* S19 */
184 KEY(2, 2, KEY_D), /* S20 */
185 KEY(2, 3, KEY_F), /* S21 */
186 KEY(2, 4, KEY_G), /* S22 */
187 KEY(2, 5, KEY_H), /* S23 */
188 KEY(2, 6, KEY_J), /* S24 */
189 KEY(2, 7, KEY_K), /* S25 */
190 KEY(3, 0, KEY_ESC), /* S26 */
191 KEY(3, 1, KEY_Z), /* S27 */
192 KEY(3, 2, KEY_X), /* S28 */
193 KEY(3, 3, KEY_C), /* S29 */
194 KEY(3, 4, KEY_V), /* S30 */
195 KEY(3, 5, KEY_B), /* S31 */
196 KEY(3, 6, KEY_N), /* S32 */
197 KEY(3, 7, KEY_M), /* S33 */
198 KEY(4, 0, KEY_TAB), /* S34 */
199 KEY(4, 1, KEY_CAPSLOCK), /* S35 */
200 KEY(4, 2, KEY_BACKSLASH), /* S36 */
201 KEY(4, 3, KEY_APOSTROPHE), /* S37 */
202 KEY(4, 4, KEY_COMMA), /* S38 */
203 KEY(4, 5, KEY_DOT), /* S39 */
204 KEY(4, 6, KEY_SLASH), /* S40 */
205 KEY(4, 7, KEY_UP), /* S41 */
206 KEY(5, 0, KEY_O), /* S42 */
207 KEY(5, 1, KEY_L), /* S43 */
208 KEY(5, 2, KEY_EQUAL), /* S44 */
209 KEY(5, 3, KEY_QI_UPRED), /* S45 */
210 KEY(5, 4, KEY_SPACE), /* S46 */
211 KEY(5, 5, KEY_QI_QI), /* S47 */
212 KEY(5, 6, KEY_RIGHTCTRL), /* S48 */
213 KEY(5, 7, KEY_LEFT), /* S49 */
214 KEY(6, 0, KEY_F8), /* S50 */
215 KEY(6, 1, KEY_P), /* S51 */
216 KEY(6, 2, KEY_BACKSPACE),/* S52 */
217 KEY(6, 3, KEY_ENTER), /* S53 */
218 KEY(6, 4, KEY_QI_VOLUP), /* S54 */
219 KEY(6, 5, KEY_QI_VOLDOWN), /* S55 */
220 KEY(6, 6, KEY_DOWN), /* S56 */
221 KEY(6, 7, KEY_RIGHT), /* S57 */
222
223 KEY(7, 0, KEY_LEFTSHIFT), /* S58 */
Ralf Baechle70342282013-01-22 12:59:30 +0100224 KEY(7, 1, KEY_LEFTALT), /* S59 */
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000225 KEY(7, 2, KEY_QI_FN), /* S60 */
226};
227
228static const struct matrix_keymap_data qi_lb60_keymap_data = {
229 .keymap = qi_lb60_keymap,
230 .keymap_size = ARRAY_SIZE(qi_lb60_keymap),
231};
232
233static const unsigned int qi_lb60_keypad_cols[] = {
234 QI_LB60_GPIO_KEYOUT(0),
235 QI_LB60_GPIO_KEYOUT(1),
236 QI_LB60_GPIO_KEYOUT(2),
237 QI_LB60_GPIO_KEYOUT(3),
238 QI_LB60_GPIO_KEYOUT(4),
239 QI_LB60_GPIO_KEYOUT(5),
240 QI_LB60_GPIO_KEYOUT(6),
241 QI_LB60_GPIO_KEYOUT(7),
242};
243
244static const unsigned int qi_lb60_keypad_rows[] = {
245 QI_LB60_GPIO_KEYIN(0),
246 QI_LB60_GPIO_KEYIN(1),
247 QI_LB60_GPIO_KEYIN(2),
248 QI_LB60_GPIO_KEYIN(3),
249 QI_LB60_GPIO_KEYIN(4),
250 QI_LB60_GPIO_KEYIN(5),
Lars-Peter Clausenfe749aa2010-11-04 23:25:56 +0100251 QI_LB60_GPIO_KEYIN(6),
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000252 QI_LB60_GPIO_KEYIN8,
253};
254
255static struct matrix_keypad_platform_data qi_lb60_pdata = {
256 .keymap_data = &qi_lb60_keymap_data,
257 .col_gpios = qi_lb60_keypad_cols,
258 .row_gpios = qi_lb60_keypad_rows,
259 .num_col_gpios = ARRAY_SIZE(qi_lb60_keypad_cols),
260 .num_row_gpios = ARRAY_SIZE(qi_lb60_keypad_rows),
261 .col_scan_delay_us = 10,
262 .debounce_ms = 10,
263 .wakeup = 1,
264 .active_low = 1,
265};
266
267static struct platform_device qi_lb60_keypad = {
268 .name = "matrix-keypad",
269 .id = -1,
270 .dev = {
271 .platform_data = &qi_lb60_pdata,
272 },
273};
274
275/* Display */
276static struct fb_videomode qi_lb60_video_modes[] = {
277 {
278 .name = "320x240",
279 .xres = 320,
280 .yres = 240,
281 .refresh = 30,
282 .left_margin = 140,
283 .right_margin = 273,
284 .upper_margin = 20,
285 .lower_margin = 2,
286 .hsync_len = 1,
287 .vsync_len = 1,
288 .sync = 0,
289 .vmode = FB_VMODE_NONINTERLACED,
290 },
291};
292
293static struct jz4740_fb_platform_data qi_lb60_fb_pdata = {
294 .width = 60,
295 .height = 45,
296 .num_modes = ARRAY_SIZE(qi_lb60_video_modes),
297 .modes = qi_lb60_video_modes,
298 .bpp = 24,
299 .lcd_type = JZ_LCD_TYPE_8BIT_SERIAL,
300 .pixclk_falling_edge = 1,
301};
302
303struct spi_gpio_platform_data spigpio_platform_data = {
304 .sck = JZ_GPIO_PORTC(23),
305 .mosi = JZ_GPIO_PORTC(22),
306 .miso = -1,
307 .num_chipselect = 1,
308};
309
310static struct platform_device spigpio_device = {
311 .name = "spi_gpio",
312 .id = 1,
313 .dev = {
314 .platform_data = &spigpio_platform_data,
315 },
316};
317
318static struct spi_board_info qi_lb60_spi_board_info[] = {
319 {
320 .modalias = "ili8960",
321 .controller_data = (void *)JZ_GPIO_PORTC(21),
322 .chip_select = 0,
323 .bus_num = 1,
324 .max_speed_hz = 30 * 1000,
325 .mode = SPI_3WIRE,
326 },
327};
328
329/* Battery */
330static struct jz_battery_platform_data qi_lb60_battery_pdata = {
Ralf Baechle70342282013-01-22 12:59:30 +0100331 .gpio_charge = JZ_GPIO_PORTC(27),
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000332 .gpio_charge_active_low = 1,
333 .info = {
334 .name = "battery",
335 .technology = POWER_SUPPLY_TECHNOLOGY_LIPO,
336 .voltage_max_design = 4200000,
337 .voltage_min_design = 3600000,
338 },
339};
340
341/* GPIO Key: power */
342static struct gpio_keys_button qi_lb60_gpio_keys_buttons[] = {
343 [0] = {
344 .code = KEY_POWER,
345 .gpio = JZ_GPIO_PORTD(29),
346 .active_low = 1,
347 .desc = "Power",
348 .wakeup = 1,
349 },
350};
351
352static struct gpio_keys_platform_data qi_lb60_gpio_keys_data = {
353 .nbuttons = ARRAY_SIZE(qi_lb60_gpio_keys_buttons),
354 .buttons = qi_lb60_gpio_keys_buttons,
355};
356
357static struct platform_device qi_lb60_gpio_keys = {
Ralf Baechle70342282013-01-22 12:59:30 +0100358 .name = "gpio-keys",
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000359 .id = -1,
360 .dev = {
361 .platform_data = &qi_lb60_gpio_keys_data,
362 }
363};
364
365static struct jz4740_mmc_platform_data qi_lb60_mmc_pdata = {
366 .gpio_card_detect = QI_LB60_GPIO_SD_CD,
367 .gpio_read_only = -1,
368 .gpio_power = QI_LB60_GPIO_SD_VCC_EN_N,
369 .power_active_low = 1,
370};
371
372/* OHCI */
373static struct regulator_consumer_supply avt2_usb_regulator_consumer =
374 REGULATOR_SUPPLY("vbus", "jz4740-ohci");
375
376static struct regulator_init_data avt2_usb_regulator_init_data = {
377 .num_consumer_supplies = 1,
378 .consumer_supplies = &avt2_usb_regulator_consumer,
379 .constraints = {
380 .name = "USB power",
381 .min_uV = 5000000,
382 .max_uV = 5000000,
383 .valid_modes_mask = REGULATOR_MODE_NORMAL,
384 .valid_ops_mask = REGULATOR_CHANGE_STATUS,
385 },
386};
387
388static struct fixed_voltage_config avt2_usb_regulator_data = {
389 .supply_name = "USB power",
390 .microvolts = 5000000,
391 .gpio = JZ_GPIO_PORTB(17),
392 .init_data = &avt2_usb_regulator_init_data,
393};
394
395static struct platform_device avt2_usb_regulator_device = {
396 .name = "reg-fixed-voltage",
397 .id = -1,
398 .dev = {
399 .platform_data = &avt2_usb_regulator_data,
400 }
401};
402
Thierry Reding0503b692015-10-05 13:31:17 +0200403static struct pwm_lookup qi_lb60_pwm_lookup[] = {
404 PWM_LOOKUP("jz4740-pwm", 4, "pwm-beeper", NULL, 0,
405 PWM_POLARITY_NORMAL),
406};
407
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000408/* beeper */
409static struct platform_device qi_lb60_pwm_beeper = {
410 .name = "pwm-beeper",
411 .id = -1,
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000412};
413
Lars-Peter Clausen0b4cf182011-02-08 03:43:53 +0100414/* charger */
415static char *qi_lb60_batteries[] = {
416 "battery",
417};
418
419static struct gpio_charger_platform_data qi_lb60_charger_pdata = {
420 .name = "usb",
421 .type = POWER_SUPPLY_TYPE_USB,
422 .gpio = JZ_GPIO_PORTD(28),
423 .gpio_active_low = 1,
424 .supplied_to = qi_lb60_batteries,
425 .num_supplicants = ARRAY_SIZE(qi_lb60_batteries),
426};
427
428static struct platform_device qi_lb60_charger_device = {
429 .name = "gpio-charger",
430 .dev = {
431 .platform_data = &qi_lb60_charger_pdata,
432 },
433};
434
Axel Linb33005f32012-01-06 11:30:10 +0800435/* audio */
436static struct platform_device qi_lb60_audio_device = {
437 .name = "qi-lb60-audio",
438 .id = -1,
439};
Lars-Peter Clausen0b4cf182011-02-08 03:43:53 +0100440
Lars-Peter Clausen218e18a2014-04-22 22:46:35 +0200441static struct gpiod_lookup_table qi_lb60_audio_gpio_table = {
442 .dev_id = "qi-lb60-audio",
443 .table = {
444 GPIO_LOOKUP("Bank B", 29, "snd", 0),
445 GPIO_LOOKUP("Bank D", 4, "amp", 0),
446 { },
447 },
448};
449
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000450static struct platform_device *jz_platform_devices[] __initdata = {
451 &jz4740_udc_device,
Apelete Seketelic330fd92013-12-19 22:11:43 +0100452 &jz4740_udc_xceiv_device,
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000453 &jz4740_mmc_device,
454 &jz4740_nand_device,
455 &qi_lb60_keypad,
456 &spigpio_device,
457 &jz4740_framebuffer_device,
458 &jz4740_pcm_device,
459 &jz4740_i2s_device,
460 &jz4740_codec_device,
461 &jz4740_rtc_device,
462 &jz4740_adc_device,
Thierry Redingf6b8a572012-08-22 10:01:24 +0200463 &jz4740_pwm_device,
Lars-Peter Clausencdcb90a2013-05-30 18:25:03 +0200464 &jz4740_dma_device,
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000465 &qi_lb60_gpio_keys,
466 &qi_lb60_pwm_beeper,
Lars-Peter Clausen0b4cf182011-02-08 03:43:53 +0100467 &qi_lb60_charger_device,
Axel Linb33005f32012-01-06 11:30:10 +0800468 &qi_lb60_audio_device,
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000469};
470
471static void __init board_gpio_setup(void)
472{
473 /* We only need to enable/disable pullup here for pins used in generic
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300474 * drivers. Everything else is done by the drivers themselves. */
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000475 jz_gpio_disable_pullup(QI_LB60_GPIO_SD_VCC_EN_N);
476 jz_gpio_disable_pullup(QI_LB60_GPIO_SD_CD);
477}
478
479static int __init qi_lb60_init_platform_devices(void)
480{
481 jz4740_framebuffer_device.dev.platform_data = &qi_lb60_fb_pdata;
482 jz4740_nand_device.dev.platform_data = &qi_lb60_nand_pdata;
483 jz4740_adc_device.dev.platform_data = &qi_lb60_battery_pdata;
484 jz4740_mmc_device.dev.platform_data = &qi_lb60_mmc_pdata;
485
Lars-Peter Clausen218e18a2014-04-22 22:46:35 +0200486 gpiod_add_lookup_table(&qi_lb60_audio_gpio_table);
Lars-Peter Clausencd145af2014-12-02 20:48:26 +0100487 gpiod_add_lookup_table(&qi_lb60_nand_gpio_table);
Lars-Peter Clausen218e18a2014-04-22 22:46:35 +0200488
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000489 spi_register_board_info(qi_lb60_spi_board_info,
490 ARRAY_SIZE(qi_lb60_spi_board_info));
491
492 if (is_avt2) {
493 platform_device_register(&avt2_usb_regulator_device);
494 platform_device_register(&jz4740_usb_ohci_device);
495 }
496
Thierry Reding0503b692015-10-05 13:31:17 +0200497 pwm_add_table(qi_lb60_pwm_lookup, ARRAY_SIZE(qi_lb60_pwm_lookup));
498
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000499 return platform_add_devices(jz_platform_devices,
500 ARRAY_SIZE(jz_platform_devices));
501
502}
503
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000504static __init int board_avt2(char *str)
505{
506 qi_lb60_mmc_pdata.card_detect_active_low = 1;
507 is_avt2 = true;
508
509 return 1;
510}
511__setup("avt2", board_avt2);
512
513static int __init qi_lb60_board_setup(void)
514{
515 printk(KERN_INFO "Qi Hardware JZ4740 QI %s setup\n",
516 is_avt2 ? "AVT2" : "LB60");
517
518 board_gpio_setup();
519
520 if (qi_lb60_init_platform_devices())
Ralf Baechleab75dc02011-11-17 15:07:31 +0000521 panic("Failed to initialize platform devices");
Lars-Peter Clausene6b78c42010-07-17 11:16:29 +0000522
523 return 0;
524}
525arch_initcall(qi_lb60_board_setup);