2 * linux/arch/arm/mach-omap2/board-n800.c
4 * Copyright (C) 2005-2007 Nokia Corporation
5 * Author: Juha Yrjola <juha.yrjola@nokia.com>
7 * Modified from mach-omap2/board-generic.c
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
14 #include <linux/kernel.h>
15 #include <linux/init.h>
16 #include <linux/clk.h>
17 #include <linux/device.h>
18 #include <linux/platform_device.h>
19 #include <linux/spi/spi.h>
20 #include <linux/spi/tsc2301.h>
21 #include <linux/spi/tsc2005.h>
22 #include <linux/input.h>
23 #include <linux/delay.h>
24 #include <linux/interrupt.h>
25 #include <linux/irq.h>
26 #include <linux/i2c.h>
27 #include <linux/i2c/lm8323.h>
28 #include <asm/hardware.h>
29 #include <asm/mach-types.h>
30 #include <asm/mach/arch.h>
31 #include <asm/mach/map.h>
32 #include <asm/arch/gpio.h>
33 #include <asm/arch/usb.h>
34 #include <asm/arch/board.h>
35 #include <asm/arch/common.h>
36 #include <asm/arch/mcspi.h>
37 #include <asm/arch/menelaus.h>
38 #include <asm/arch/lcd_mipid.h>
39 #include <asm/arch/clock.h>
40 #include <asm/arch/gpio-switch.h>
41 #include <asm/arch/omapfb.h>
42 #include <asm/arch/blizzard.h>
44 #include <../drivers/cbus/tahvo.h>
45 #include <../drivers/media/video/tcm825x.h>
47 #define N800_BLIZZARD_POWERDOWN_GPIO 15
48 #define N800_STI_GPIO 62
49 #define N800_KEYB_IRQ_GPIO 109
50 #define N800_DAV_IRQ_GPIO 103
51 #define N800_TSC2301_RESET_GPIO 118
53 #ifdef CONFIG_MACH_NOKIA_N810
54 static s16 rx44_keymap
[LM8323_KEYMAP_SIZE
] = {
59 [0x05] = KEY_BACKSPACE
,
71 [0x14] = KEY_APOSTROPHE
,
78 [0x1c] = KEY_LEFTSHIFT
, /* Actually, this is both shift keys */
82 [0x22] = KEY_SEMICOLON
,
90 [0x32] = KEY_RIGHTCTRL
,
110 [0x75] = KEY_KPENTER
,
113 static struct lm8323_platform_data lm8323_pdata
= {
114 .repeat
= 0, /* Repeat is handled in userspace for now. */
115 .keymap
= rx44_keymap
,
117 .name
= "Internal keyboard",
118 .pwm1_name
= "keyboard",
119 .pwm2_name
= "cover",
123 void __init
nokia_n800_init_irq(void)
125 omap2_init_common_hw();
129 #ifdef CONFIG_OMAP_STI
130 if (omap_request_gpio(N800_STI_GPIO
) < 0) {
131 printk(KERN_ERR
"Failed to request GPIO %d for STI\n",
136 omap_set_gpio_direction(N800_STI_GPIO
, 0);
137 omap_set_gpio_dataout(N800_STI_GPIO
, 0);
141 #if defined(CONFIG_MENELAUS) && defined(CONFIG_SENSORS_TMP105)
143 static int n800_tmp105_set_power(int enable
)
145 return menelaus_set_vaux(enable
? 2800 : 0);
150 #define n800_tmp105_set_power NULL
154 static struct omap_uart_config n800_uart_config __initdata
= {
155 .enabled_uarts
= (1 << 0) | (1 << 2),
158 #include "../../../drivers/cbus/retu.h"
160 static struct omap_fbmem_config n800_fbmem0_config __initdata
= {
164 static struct omap_fbmem_config n800_fbmem1_config __initdata
= {
168 static struct omap_fbmem_config n800_fbmem2_config __initdata
= {
172 static struct omap_tmp105_config n800_tmp105_config __initdata
= {
173 .tmp105_irq_pin
= 125,
174 .set_power
= n800_tmp105_set_power
,
177 static void mipid_shutdown(struct mipid_platform_data
*pdata
)
179 if (pdata
->nreset_gpio
!= -1) {
180 pr_info("shutdown LCD\n");
181 omap_set_gpio_dataout(pdata
->nreset_gpio
, 0);
186 static struct mipid_platform_data n800_mipid_platform_data
= {
187 .shutdown
= mipid_shutdown
,
190 static void __init
mipid_dev_init(void)
192 const struct omap_lcd_config
*conf
;
194 conf
= omap_get_config(OMAP_TAG_LCD
, struct omap_lcd_config
);
196 n800_mipid_platform_data
.nreset_gpio
= conf
->nreset_gpio
;
197 n800_mipid_platform_data
.data_lines
= conf
->data_lines
;
205 static int blizzard_get_clocks(void)
207 blizzard
.sys_ck
= clk_get(0, "osc_ck");
208 if (IS_ERR(blizzard
.sys_ck
)) {
209 printk(KERN_ERR
"can't get Blizzard clock\n");
210 return PTR_ERR(blizzard
.sys_ck
);
215 static unsigned long blizzard_get_clock_rate(struct device
*dev
)
217 return clk_get_rate(blizzard
.sys_ck
);
220 static void blizzard_enable_clocks(int enable
)
223 clk_enable(blizzard
.sys_ck
);
225 clk_disable(blizzard
.sys_ck
);
228 static void blizzard_power_up(struct device
*dev
)
230 /* Vcore to 1.475V */
231 tahvo_set_clear_reg_bits(0x07, 0, 0xf);
234 blizzard_enable_clocks(1);
235 omap_set_gpio_dataout(N800_BLIZZARD_POWERDOWN_GPIO
, 1);
238 static void blizzard_power_down(struct device
*dev
)
240 omap_set_gpio_dataout(N800_BLIZZARD_POWERDOWN_GPIO
, 0);
241 blizzard_enable_clocks(0);
243 /* Vcore to 1.005V */
244 tahvo_set_clear_reg_bits(0x07, 0xf, 0);
247 static struct blizzard_platform_data n800_blizzard_data
= {
248 .power_up
= blizzard_power_up
,
249 .power_down
= blizzard_power_down
,
250 .get_clock_rate
= blizzard_get_clock_rate
,
254 static void __init
blizzard_dev_init(void)
258 r
= omap_request_gpio(N800_BLIZZARD_POWERDOWN_GPIO
);
261 omap_set_gpio_direction(N800_BLIZZARD_POWERDOWN_GPIO
, 0);
262 omap_set_gpio_dataout(N800_BLIZZARD_POWERDOWN_GPIO
, 1);
264 blizzard_get_clocks();
265 omapfb_set_ctrl_platform_data(&n800_blizzard_data
);
268 static struct omap_mmc_config n800_mmc_config __initdata
= {
275 extern struct omap_mmc_platform_data n800_mmc_data
;
277 static struct omap_board_config_kernel n800_config
[] __initdata
= {
278 { OMAP_TAG_UART
, &n800_uart_config
},
279 { OMAP_TAG_FBMEM
, &n800_fbmem0_config
},
280 { OMAP_TAG_FBMEM
, &n800_fbmem1_config
},
281 { OMAP_TAG_FBMEM
, &n800_fbmem2_config
},
282 { OMAP_TAG_TMP105
, &n800_tmp105_config
},
283 { OMAP_TAG_MMC
, &n800_mmc_config
},
286 static struct tsc2301_platform_data tsc2301_config
= {
287 .reset_gpio
= N800_TSC2301_RESET_GPIO
,
289 -1, /* Event for bit 0 */
290 KEY_UP
, /* Event for bit 1 (up) */
291 KEY_F5
, /* Event for bit 2 (home) */
292 -1, /* Event for bit 3 */
293 KEY_LEFT
, /* Event for bit 4 (left) */
294 KEY_ENTER
, /* Event for bit 5 (enter) */
295 KEY_RIGHT
, /* Event for bit 6 (right) */
296 -1, /* Event for bit 7 */
297 KEY_ESC
, /* Event for bit 8 (cycle) */
298 KEY_DOWN
, /* Event for bit 9 (down) */
299 KEY_F4
, /* Event for bit 10 (menu) */
300 -1, /* Event for bit 11 */
301 KEY_F8
, /* Event for bit 12 (Zoom-) */
302 KEY_F6
, /* Event for bit 13 (FS) */
303 KEY_F7
, /* Event for bit 14 (Zoom+) */
304 -1, /* Event for bit 15 */
307 .keyb_name
= "Internal keypad",
310 static void tsc2301_dev_init(void)
313 int gpio
= N800_KEYB_IRQ_GPIO
;
315 r
= gpio_request(gpio
, "tsc2301 KBD IRQ");
317 gpio_direction_input(gpio
);
318 tsc2301_config
.keyb_int
= OMAP_GPIO_IRQ(gpio
);
320 printk(KERN_ERR
"unable to get KBD GPIO");
323 gpio
= N800_DAV_IRQ_GPIO
;
324 r
= gpio_request(gpio
, "tsc2301 DAV IRQ");
326 gpio_direction_input(gpio
);
327 tsc2301_config
.dav_int
= OMAP_GPIO_IRQ(gpio
);
329 printk(KERN_ERR
"unable to get DAV GPIO");
333 static int __init
tea5761_dev_init(void)
335 const struct omap_tea5761_config
*info
;
338 info
= omap_get_config(OMAP_TAG_TEA5761
, struct omap_tea5761_config
);
340 enable_gpio
= info
->enable_gpio
;
343 pr_debug("Enabling tea5761 at GPIO %d\n",
346 if (omap_request_gpio(enable_gpio
) < 0) {
347 printk(KERN_ERR
"Can't request GPIO %d\n",
352 omap_set_gpio_direction(enable_gpio
, 0);
354 omap_set_gpio_dataout(enable_gpio
, 1);
360 static struct omap2_mcspi_device_config tsc2301_mcspi_config
= {
365 static struct omap2_mcspi_device_config mipid_mcspi_config
= {
370 static struct omap2_mcspi_device_config cx3110x_mcspi_config
= {
375 #ifdef CONFIG_TOUCHSCREEN_TSC2005
376 static struct tsc2005_platform_data tsc2005_config
= {
381 static struct omap2_mcspi_device_config tsc2005_mcspi_config
= {
387 static struct spi_board_info n800_spi_board_info
[] __initdata
= {
389 .modalias
= "lcd_mipid",
392 .max_speed_hz
= 4000000,
393 .controller_data
= &mipid_mcspi_config
,
394 .platform_data
= &n800_mipid_platform_data
,
396 .modalias
= "cx3110x",
399 .max_speed_hz
= 48000000,
400 .controller_data
= &cx3110x_mcspi_config
,
403 .modalias
= "tsc2301",
406 .max_speed_hz
= 6000000,
407 .controller_data
= &tsc2301_mcspi_config
,
408 .platform_data
= &tsc2301_config
,
412 static struct spi_board_info n810_spi_board_info
[] __initdata
= {
414 .modalias
= "lcd_mipid",
417 .max_speed_hz
= 4000000,
418 .controller_data
= &mipid_mcspi_config
,
419 .platform_data
= &n800_mipid_platform_data
,
422 .modalias
= "cx3110x",
425 .max_speed_hz
= 48000000,
426 .controller_data
= &cx3110x_mcspi_config
,
429 .modalias
= "tsc2005",
432 .max_speed_hz
= 6000000,
433 .controller_data
= &tsc2005_mcspi_config
,
434 .platform_data
= &tsc2005_config
,
438 static void __init
tsc2005_set_config(void)
440 const struct omap_lcd_config
*conf
;
442 conf
= omap_get_config(OMAP_TAG_LCD
, struct omap_lcd_config
);
444 #ifdef CONFIG_TOUCHSCREEN_TSC2005
445 if (strcmp(conf
->panel_name
, "lph8923") == 0) {
446 tsc2005_config
.ts_x_plate_ohm
= 180;
447 tsc2005_config
.ts_hw_avg
= 0;
448 tsc2005_config
.ts_ignore_last
= 0;
449 tsc2005_config
.ts_touch_pressure
= 1500;
450 tsc2005_config
.ts_stab_time
= 100;
451 tsc2005_config
.ts_pressure_max
= 2048;
452 tsc2005_config
.ts_pressure_fudge
= 2;
453 tsc2005_config
.ts_x_max
= 4096;
454 tsc2005_config
.ts_x_fudge
= 4;
455 tsc2005_config
.ts_y_max
= 4096;
456 tsc2005_config
.ts_y_fudge
= 7;
457 } else if (strcmp(conf
->panel_name
, "ls041y3") == 0) {
458 tsc2005_config
.ts_x_plate_ohm
= 280;
459 tsc2005_config
.ts_hw_avg
= 0;
460 tsc2005_config
.ts_ignore_last
= 0;
461 tsc2005_config
.ts_touch_pressure
= 1500;
462 tsc2005_config
.ts_stab_time
= 1000;
463 tsc2005_config
.ts_pressure_max
= 2048;
464 tsc2005_config
.ts_pressure_fudge
= 2;
465 tsc2005_config
.ts_x_max
= 4096;
466 tsc2005_config
.ts_x_fudge
= 4;
467 tsc2005_config
.ts_y_max
= 4096;
468 tsc2005_config
.ts_y_fudge
= 7;
470 printk(KERN_ERR
"Unknown panel type, set default "
471 "touchscreen configuration\n");
472 tsc2005_config
.ts_x_plate_ohm
= 200;
473 tsc2005_config
.ts_stab_time
= 100;
479 #if defined(CONFIG_CBUS_RETU) && defined(CONFIG_LEDS_OMAP_PWM)
481 void retu_keypad_led_set_power(struct omap_pwm_led_platform_data
*self
,
485 retu_write_reg(RETU_REG_CTRL_SET
, 1 << 6);
487 retu_write_reg(RETU_REG_CTRL_SET
, 1 << 3);
489 retu_write_reg(RETU_REG_CTRL_CLR
, (1 << 6) | (1 << 3));
493 static struct omap_pwm_led_platform_data n800_keypad_led_data
= {
495 .intensity_timer
= 10,
497 .set_power
= retu_keypad_led_set_power
,
500 static struct platform_device n800_keypad_led_device
= {
501 .name
= "omap_pwm_led",
504 .platform_data
= &n800_keypad_led_data
,
509 #if defined(CONFIG_TOUCHSCREEN_TSC2301)
510 static void __init
n800_ts_set_config(void)
512 const struct omap_lcd_config
*conf
;
514 conf
= omap_get_config(OMAP_TAG_LCD
, struct omap_lcd_config
);
516 if (strcmp(conf
->panel_name
, "lph8923") == 0) {
517 tsc2301_config
.ts_x_plate_ohm
= 180;
518 tsc2301_config
.ts_hw_avg
= 8;
519 tsc2301_config
.ts_max_pressure
= 2048;
520 tsc2301_config
.ts_touch_pressure
= 400;
521 tsc2301_config
.ts_stab_time
= 100;
522 tsc2301_config
.ts_pressure_fudge
= 2;
523 tsc2301_config
.ts_x_max
= 4096;
524 tsc2301_config
.ts_x_fudge
= 4;
525 tsc2301_config
.ts_y_max
= 4096;
526 tsc2301_config
.ts_y_fudge
= 7;
527 } else if (strcmp(conf
->panel_name
, "ls041y3") == 0) {
528 tsc2301_config
.ts_x_plate_ohm
= 280;
529 tsc2301_config
.ts_hw_avg
= 8;
530 tsc2301_config
.ts_touch_pressure
= 400;
531 tsc2301_config
.ts_max_pressure
= 2048;
532 tsc2301_config
.ts_stab_time
= 1000;
533 tsc2301_config
.ts_pressure_fudge
= 2;
534 tsc2301_config
.ts_x_max
= 4096;
535 tsc2301_config
.ts_x_fudge
= 4;
536 tsc2301_config
.ts_y_max
= 4096;
537 tsc2301_config
.ts_y_fudge
= 7;
539 printk(KERN_ERR
"Unknown panel type, set default "
540 "touchscreen configuration\n");
541 tsc2301_config
.ts_x_plate_ohm
= 200;
542 tsc2301_config
.ts_stab_time
= 100;
547 static inline void n800_ts_set_config(void)
552 static struct omap_gpio_switch n800_gpio_switches
[] __initdata
= {
556 .debounce_rising
= 100,
557 .debounce_falling
= 0,
558 .notify
= n800_mmc_slot1_cover_handler
,
563 .debounce_rising
= 200,
564 .debounce_falling
= 200,
568 .debounce_rising
= 200,
569 .debounce_falling
= 200,
573 .debounce_rising
= 100,
574 .debounce_falling
= 100,
578 static struct platform_device
*n800_devices
[] __initdata
= {
579 #if defined(CONFIG_CBUS_RETU) && defined(CONFIG_LEDS_OMAP_PWM)
580 &n800_keypad_led_device
,
584 #ifdef CONFIG_MENELAUS
585 static int n800_auto_sleep_regulators(void)
590 val
= EN_VPLL_SLEEP
| EN_VMMC_SLEEP \
591 | EN_VAUX_SLEEP
| EN_VIO_SLEEP \
592 | EN_VMEM_SLEEP
| EN_DC3_SLEEP \
593 | EN_VC_SLEEP
| EN_DC2_SLEEP
;
595 ret
= menelaus_set_regulator_sleep(1, val
);
597 printk(KERN_ERR
"Could not set regulators to sleep on "
598 "menelaus: %u\n", ret
);
604 static int n800_auto_voltage_scale(void)
608 ret
= menelaus_set_vcore_hw(1400, 1050);
610 printk(KERN_ERR
"Could not set VCORE voltage on "
611 "menelaus: %u\n", ret
);
617 static int n800_menelaus_init(struct device
*dev
)
621 ret
= n800_auto_voltage_scale();
624 ret
= n800_auto_sleep_regulators();
630 static struct menelaus_platform_data n800_menelaus_platform_data
= {
631 .late_init
= n800_menelaus_init
,
635 static struct i2c_board_info __initdata n800_i2c_board_info_1
[] = {
637 I2C_BOARD_INFO("menelaus", 0x72),
638 .irq
= INT_24XX_SYS_NIRQ
,
639 .platform_data
= &n800_menelaus_platform_data
,
643 extern struct tcm825x_platform_data n800_tcm825x_platform_data
;
645 static struct i2c_board_info __initdata_or_module n800_i2c_board_info_2
[] = {
646 #if defined (CONFIG_VIDEO_TCM825X) || defined (CONFIG_VIDEO_TCM825X_MODULE)
648 I2C_BOARD_INFO(TCM825X_NAME
, TCM825X_I2C_ADDR
),
649 .platform_data
= &n800_tcm825x_platform_data
,
652 #if defined(CONFIG_RADIO_TEA5761) || defined(CONFIG_RADIO_TEA5761_MODULE)
654 I2C_BOARD_INFO("tea5761", 0x10),
657 #ifdef CONFIG_MACH_NOKIA_N810
659 I2C_BOARD_INFO("lm8323", 0x45),
660 .irq
= OMAP_GPIO_IRQ(109),
661 .platform_data
= &lm8323_pdata
,
665 I2C_BOARD_INFO("tsl2563", 0x29),
668 I2C_BOARD_INFO("lp5521", 0x32),
672 void __init
nokia_n800_common_init(void)
674 platform_add_devices(n800_devices
, ARRAY_SIZE(n800_devices
));
682 if (machine_is_nokia_n800())
683 spi_register_board_info(n800_spi_board_info
,
684 ARRAY_SIZE(n800_spi_board_info
));
685 if (machine_is_nokia_n810()) {
686 tsc2005_set_config();
687 spi_register_board_info(n810_spi_board_info
,
688 ARRAY_SIZE(n810_spi_board_info
));
691 omap_register_i2c_bus(1, 400, n800_i2c_board_info_1
,
692 ARRAY_SIZE(n800_i2c_board_info_1
));
693 omap_register_i2c_bus(2, 400, n800_i2c_board_info_2
,
694 ARRAY_SIZE(n800_i2c_board_info_2
));
699 static void __init
nokia_n800_init(void)
701 nokia_n800_common_init();
703 n800_audio_init(&tsc2301_config
);
704 n800_ts_set_config();
707 omap_register_gpio_switches(n800_gpio_switches
,
708 ARRAY_SIZE(n800_gpio_switches
));
711 void __init
nokia_n800_map_io(void)
713 omap_board_config
= n800_config
;
714 omap_board_config_size
= ARRAY_SIZE(n800_config
);
716 omap2_set_globals_242x();
717 omap2_map_common_io();
720 MACHINE_START(NOKIA_N800
, "Nokia N800")
721 .phys_io
= 0x48000000,
722 .io_pg_offst
= ((0xd8000000) >> 18) & 0xfffc,
723 .boot_params
= 0x80000100,
724 .map_io
= nokia_n800_map_io
,
725 .init_irq
= nokia_n800_init_irq
,
726 .init_machine
= nokia_n800_init
,
727 .timer
= &omap_timer
,