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/input.h>
22 #include <linux/delay.h>
23 #include <linux/interrupt.h>
24 #include <linux/irq.h>
25 #include <linux/i2c.h>
26 #include <asm/hardware.h>
27 #include <asm/mach-types.h>
28 #include <asm/mach/arch.h>
29 #include <asm/mach/map.h>
30 #include <asm/arch/gpio.h>
31 #include <asm/arch/usb.h>
32 #include <asm/arch/board.h>
33 #include <asm/arch/common.h>
34 #include <asm/arch/mcspi.h>
35 #include <asm/arch/menelaus.h>
36 #include <asm/arch/lcd_mipid.h>
37 #include <asm/arch/clock.h>
38 #include <asm/arch/gpio-switch.h>
39 #include <asm/arch/omapfb.h>
40 #include <asm/arch/blizzard.h>
42 #include <../drivers/cbus/tahvo.h>
43 #include <../drivers/media/video/tcm825x.h>
45 #define N800_BLIZZARD_POWERDOWN_GPIO 15
46 #define N800_STI_GPIO 62
47 #define N800_KEYB_IRQ_GPIO 109
48 #define N800_DAV_IRQ_GPIO 103
49 #define N800_TSC2301_RESET_GPIO 118
51 void __init nokia_n800_init_irq(void)
53 omap2_init_common_hw();
57 #ifdef CONFIG_OMAP_STI
58 if (omap_request_gpio(N800_STI_GPIO) < 0) {
59 printk(KERN_ERR "Failed to request GPIO %d for STI\n",
64 omap_set_gpio_direction(N800_STI_GPIO, 0);
65 omap_set_gpio_dataout(N800_STI_GPIO, 0);
69 #if defined(CONFIG_MENELAUS) && defined(CONFIG_SENSORS_TMP105)
71 static int n800_tmp105_set_power(int enable)
73 return menelaus_set_vaux(enable ? 2800 : 0);
78 #define n800_tmp105_set_power NULL
82 static struct omap_uart_config n800_uart_config __initdata = {
83 .enabled_uarts = (1 << 0) | (1 << 2),
86 #include "../../../drivers/cbus/retu.h"
88 static struct omap_fbmem_config n800_fbmem0_config __initdata = {
92 static struct omap_fbmem_config n800_fbmem1_config __initdata = {
96 static struct omap_fbmem_config n800_fbmem2_config __initdata = {
100 static struct omap_tmp105_config n800_tmp105_config __initdata = {
101 .tmp105_irq_pin = 125,
102 .set_power = n800_tmp105_set_power,
105 static void mipid_shutdown(struct mipid_platform_data *pdata)
107 if (pdata->nreset_gpio != -1) {
108 pr_info("shutdown LCD\n");
109 omap_set_gpio_dataout(pdata->nreset_gpio, 0);
114 static struct mipid_platform_data n800_mipid_platform_data = {
115 .shutdown = mipid_shutdown,
118 static void __init mipid_dev_init(void)
120 const struct omap_lcd_config *conf;
122 conf = omap_get_config(OMAP_TAG_LCD, struct omap_lcd_config);
124 n800_mipid_platform_data.nreset_gpio = conf->nreset_gpio;
125 n800_mipid_platform_data.data_lines = conf->data_lines;
133 static int blizzard_get_clocks(void)
135 blizzard.sys_ck = clk_get(0, "osc_ck");
136 if (IS_ERR(blizzard.sys_ck)) {
137 printk(KERN_ERR "can't get Blizzard clock\n");
138 return PTR_ERR(blizzard.sys_ck);
143 static unsigned long blizzard_get_clock_rate(struct device *dev)
145 return clk_get_rate(blizzard.sys_ck);
148 static void blizzard_enable_clocks(int enable)
151 clk_enable(blizzard.sys_ck);
153 clk_disable(blizzard.sys_ck);
156 static void blizzard_power_up(struct device *dev)
158 /* Vcore to 1.475V */
159 tahvo_set_clear_reg_bits(0x07, 0, 0xf);
162 blizzard_enable_clocks(1);
163 omap_set_gpio_dataout(N800_BLIZZARD_POWERDOWN_GPIO, 1);
166 static void blizzard_power_down(struct device *dev)
168 omap_set_gpio_dataout(N800_BLIZZARD_POWERDOWN_GPIO, 0);
169 blizzard_enable_clocks(0);
171 /* Vcore to 1.005V */
172 tahvo_set_clear_reg_bits(0x07, 0xf, 0);
175 static struct blizzard_platform_data n800_blizzard_data = {
176 .power_up = blizzard_power_up,
177 .power_down = blizzard_power_down,
178 .get_clock_rate = blizzard_get_clock_rate,
182 static void __init blizzard_dev_init(void)
186 r = omap_request_gpio(N800_BLIZZARD_POWERDOWN_GPIO);
189 omap_set_gpio_direction(N800_BLIZZARD_POWERDOWN_GPIO, 0);
190 omap_set_gpio_dataout(N800_BLIZZARD_POWERDOWN_GPIO, 1);
192 blizzard_get_clocks();
193 omapfb_set_ctrl_platform_data(&n800_blizzard_data);
196 static struct omap_mmc_config n800_mmc_config __initdata = {
203 extern struct omap_mmc_platform_data n800_mmc_data;
205 static struct omap_board_config_kernel n800_config[] __initdata = {
206 { OMAP_TAG_UART, &n800_uart_config },
207 { OMAP_TAG_FBMEM, &n800_fbmem0_config },
208 { OMAP_TAG_FBMEM, &n800_fbmem1_config },
209 { OMAP_TAG_FBMEM, &n800_fbmem2_config },
210 { OMAP_TAG_TMP105, &n800_tmp105_config },
211 { OMAP_TAG_MMC, &n800_mmc_config },
214 static struct tsc2301_platform_data tsc2301_config = {
215 .reset_gpio = N800_TSC2301_RESET_GPIO,
217 -1, /* Event for bit 0 */
218 KEY_UP, /* Event for bit 1 (up) */
219 KEY_F5, /* Event for bit 2 (home) */
220 -1, /* Event for bit 3 */
221 KEY_LEFT, /* Event for bit 4 (left) */
222 KEY_ENTER, /* Event for bit 5 (enter) */
223 KEY_RIGHT, /* Event for bit 6 (right) */
224 -1, /* Event for bit 7 */
225 KEY_ESC, /* Event for bit 8 (cycle) */
226 KEY_DOWN, /* Event for bit 9 (down) */
227 KEY_F4, /* Event for bit 10 (menu) */
228 -1, /* Event for bit 11 */
229 KEY_F8, /* Event for bit 12 (Zoom-) */
230 KEY_F6, /* Event for bit 13 (FS) */
231 KEY_F7, /* Event for bit 14 (Zoom+) */
232 -1, /* Event for bit 15 */
237 static void tsc2301_dev_init(void)
240 int gpio = N800_KEYB_IRQ_GPIO;
242 r = gpio_request(gpio, "tsc2301 KBD IRQ");
244 gpio_direction_input(gpio);
245 tsc2301_config.keyb_int = OMAP_GPIO_IRQ(gpio);
247 printk(KERN_ERR "unable to get KBD GPIO");
250 gpio = N800_DAV_IRQ_GPIO;
251 r = gpio_request(gpio, "tsc2301 DAV IRQ");
253 gpio_direction_input(gpio);
254 tsc2301_config.dav_int = OMAP_GPIO_IRQ(gpio);
256 printk(KERN_ERR "unable to get DAV GPIO");
260 static struct omap2_mcspi_device_config tsc2301_mcspi_config = {
265 static struct omap2_mcspi_device_config mipid_mcspi_config = {
270 static struct omap2_mcspi_device_config cx3110x_mcspi_config = {
275 static struct spi_board_info n800_spi_board_info[] __initdata = {
277 .modalias = "lcd_mipid",
280 .max_speed_hz = 4000000,
281 .controller_data= &mipid_mcspi_config,
282 .platform_data = &n800_mipid_platform_data,
284 .modalias = "cx3110x",
287 .max_speed_hz = 48000000,
288 .controller_data= &cx3110x_mcspi_config,
290 .modalias = "tsc2301",
293 .max_speed_hz = 6000000,
294 .controller_data= &tsc2301_mcspi_config,
295 .platform_data = &tsc2301_config,
299 #if defined(CONFIG_CBUS_RETU) && defined(CONFIG_LEDS_OMAP_PWM)
301 void retu_keypad_led_set_power(struct omap_pwm_led_platform_data *self,
305 retu_write_reg(RETU_REG_CTRL_SET, 1 << 6);
307 retu_write_reg(RETU_REG_CTRL_SET, 1 << 3);
309 retu_write_reg(RETU_REG_CTRL_CLR, (1 << 6) | (1 << 3));
313 static struct omap_pwm_led_platform_data n800_keypad_led_data = {
315 .intensity_timer = 10,
317 .set_power = retu_keypad_led_set_power,
320 static struct platform_device n800_keypad_led_device = {
321 .name = "omap_pwm_led",
324 .platform_data = &n800_keypad_led_data,
329 #if defined(CONFIG_TOUCHSCREEN_TSC2301)
330 static void __init n800_ts_set_config(void)
332 const struct omap_lcd_config *conf;
334 conf = omap_get_config(OMAP_TAG_LCD, struct omap_lcd_config);
336 if (strcmp(conf->panel_name, "lph8923") == 0) {
337 tsc2301_config.ts_x_plate_ohm = 180;
338 tsc2301_config.ts_hw_avg = 8;
339 tsc2301_config.ts_max_pressure = 2048;
340 tsc2301_config.ts_touch_pressure = 400;
341 tsc2301_config.ts_stab_time = 100;
342 tsc2301_config.ts_pressure_fudge = 2;
343 tsc2301_config.ts_x_max = 4096;
344 tsc2301_config.ts_x_fudge = 4;
345 tsc2301_config.ts_y_max = 4096;
346 tsc2301_config.ts_y_fudge = 7;
347 } else if (strcmp(conf->panel_name, "ls041y3") == 0) {
348 tsc2301_config.ts_x_plate_ohm = 280;
349 tsc2301_config.ts_hw_avg = 8;
350 tsc2301_config.ts_touch_pressure = 400;
351 tsc2301_config.ts_max_pressure = 2048;
352 tsc2301_config.ts_stab_time = 1000;
353 tsc2301_config.ts_pressure_fudge = 2;
354 tsc2301_config.ts_x_max = 4096;
355 tsc2301_config.ts_x_fudge = 4;
356 tsc2301_config.ts_y_max = 4096;
357 tsc2301_config.ts_y_fudge = 7;
359 printk(KERN_ERR "Unknown panel type, set default "
360 "touchscreen configuration\n");
361 tsc2301_config.ts_x_plate_ohm = 200;
362 tsc2301_config.ts_stab_time = 100;
367 static inline void n800_ts_set_config(void)
372 static struct omap_gpio_switch n800_gpio_switches[] __initdata = {
376 .debounce_rising = 100,
377 .debounce_falling = 0,
378 .notify = n800_mmc_slot1_cover_handler,
383 .debounce_rising = 200,
384 .debounce_falling = 200,
388 .debounce_rising = 200,
389 .debounce_falling = 200,
393 .debounce_rising = 100,
394 .debounce_falling = 100,
398 static struct platform_device *n800_devices[] __initdata = {
399 #if defined(CONFIG_CBUS_RETU) && defined(CONFIG_LEDS_OMAP_PWM)
400 &n800_keypad_led_device,
404 #ifdef CONFIG_MENELAUS
405 static int n800_auto_sleep_regulators(void)
410 val = EN_VPLL_SLEEP | EN_VMMC_SLEEP \
411 | EN_VAUX_SLEEP | EN_VIO_SLEEP \
412 | EN_VMEM_SLEEP | EN_DC3_SLEEP \
413 | EN_VC_SLEEP | EN_DC2_SLEEP;
415 ret = menelaus_set_regulator_sleep(1, val);
417 printk(KERN_ERR "Could not set regulators to sleep on "
418 "menelaus: %u\n", ret);
424 static int n800_auto_voltage_scale(void)
428 ret = menelaus_set_vcore_hw(1400, 1050);
430 printk(KERN_ERR "Could not set VCORE voltage on "
431 "menelaus: %u\n", ret);
437 static int n800_menelaus_init(struct device *dev)
441 ret = n800_auto_voltage_scale();
444 ret = n800_auto_sleep_regulators();
450 static struct menelaus_platform_data n800_menelaus_platform_data = {
451 .late_init = n800_menelaus_init,
455 static struct i2c_board_info __initdata n800_i2c_board_info_1[] = {
457 I2C_BOARD_INFO("menelaus", 0x72),
458 .irq = INT_24XX_SYS_NIRQ,
459 .platform_data = &n800_menelaus_platform_data,
463 extern struct tcm825x_platform_data n800_tcm825x_platform_data;
465 static struct i2c_board_info __initdata n800_i2c_board_info_2[] = {
466 #if defined (CONFIG_VIDEO_TCM825X) || defined (CONFIG_VIDEO_TCM825X_MODULE)
468 I2C_BOARD_INFO(TCM825X_NAME, TCM825X_I2C_ADDR),
469 .platform_data = &n800_tcm825x_platform_data,
474 void __init nokia_n800_common_init(void)
476 platform_add_devices(n800_devices, ARRAY_SIZE(n800_devices));
484 spi_register_board_info(n800_spi_board_info,
485 ARRAY_SIZE(n800_spi_board_info));
487 omap_register_i2c_bus(1, 400, n800_i2c_board_info_1,
488 ARRAY_SIZE(n800_i2c_board_info_1));
489 omap_register_i2c_bus(2, 400, n800_i2c_board_info_2,
490 ARRAY_SIZE(n800_i2c_board_info_2));
495 static void __init nokia_n800_init(void)
497 nokia_n800_common_init();
499 n800_audio_init(&tsc2301_config);
500 n800_ts_set_config();
502 omap_register_gpio_switches(n800_gpio_switches,
503 ARRAY_SIZE(n800_gpio_switches));
506 void __init nokia_n800_map_io(void)
508 omap_board_config = n800_config;
509 omap_board_config_size = ARRAY_SIZE(n800_config);
511 omap2_set_globals_242x();
512 omap2_map_common_io();
515 MACHINE_START(NOKIA_N800, "Nokia N800")
516 .phys_io = 0x48000000,
517 .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc,
518 .boot_params = 0x80000100,
519 .map_io = nokia_n800_map_io,
520 .init_irq = nokia_n800_init_irq,
521 .init_machine = nokia_n800_init,
522 .timer = &omap_timer,