1/* 2 * linux/arch/arm/mach-omap1/board-nokia770.c 3 * 4 * Modified from board-generic.c 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/gpio.h> 11#include <linux/kernel.h> 12#include <linux/init.h> 13#include <linux/mutex.h> 14#include <linux/platform_device.h> 15#include <linux/input.h> 16#include <linux/clk.h> 17#include <linux/omapfb.h> 18 19#include <linux/spi/spi.h> 20#include <linux/spi/ads7846.h> 21#include <linux/workqueue.h> 22#include <linux/delay.h> 23 24#include <asm/mach-types.h> 25#include <asm/mach/arch.h> 26#include <asm/mach/map.h> 27 28#include <plat/mux.h> 29#include <plat/usb.h> 30#include <plat/board.h> 31#include <plat/keypad.h> 32#include <plat/lcd_mipid.h> 33#include <plat/mmc.h> 34#include <plat/clock.h> 35 36#include <mach/hardware.h> 37 38#include "common.h" 39 40#define ADS7846_PENDOWN_GPIO 15 41 42static const unsigned int nokia770_keymap[] = { 43 KEY(1, 0, GROUP_0 | KEY_UP), 44 KEY(2, 0, GROUP_1 | KEY_F5), 45 KEY(0, 1, GROUP_0 | KEY_LEFT), 46 KEY(1, 1, GROUP_0 | KEY_ENTER), 47 KEY(2, 1, GROUP_0 | KEY_RIGHT), 48 KEY(0, 2, GROUP_1 | KEY_ESC), 49 KEY(1, 2, GROUP_0 | KEY_DOWN), 50 KEY(2, 2, GROUP_1 | KEY_F4), 51 KEY(0, 3, GROUP_2 | KEY_F7), 52 KEY(1, 3, GROUP_2 | KEY_F8), 53 KEY(2, 3, GROUP_2 | KEY_F6), 54}; 55 56static struct resource nokia770_kp_resources[] = { 57 [0] = { 58 .start = INT_KEYBOARD, 59 .end = INT_KEYBOARD, 60 .flags = IORESOURCE_IRQ, 61 }, 62}; 63 64static const struct matrix_keymap_data nokia770_keymap_data = { 65 .keymap = nokia770_keymap, 66 .keymap_size = ARRAY_SIZE(nokia770_keymap), 67}; 68 69static struct omap_kp_platform_data nokia770_kp_data = { 70 .rows = 8, 71 .cols = 8, 72 .keymap_data = &nokia770_keymap_data, 73 .delay = 4, 74}; 75 76static struct platform_device nokia770_kp_device = { 77 .name = "omap-keypad", 78 .id = -1, 79 .dev = { 80 .platform_data = &nokia770_kp_data, 81 }, 82 .num_resources = ARRAY_SIZE(nokia770_kp_resources), 83 .resource = nokia770_kp_resources, 84}; 85 86static struct platform_device *nokia770_devices[] __initdata = { 87 &nokia770_kp_device, 88}; 89 90static void mipid_shutdown(struct mipid_platform_data *pdata) 91{ 92 if (pdata->nreset_gpio != -1) { 93 printk(KERN_INFO "shutdown LCD\n"); 94 gpio_set_value(pdata->nreset_gpio, 0); 95 msleep(120); 96 } 97} 98 99static struct mipid_platform_data nokia770_mipid_platform_data = { 100 .shutdown = mipid_shutdown, 101}; 102 103static struct omap_lcd_config nokia770_lcd_config __initdata = { 104 .ctrl_name = "hwa742", 105}; 106 107static void __init mipid_dev_init(void) 108{ 109 nokia770_mipid_platform_data.nreset_gpio = 13; 110 nokia770_mipid_platform_data.data_lines = 16; 111 112 omapfb_set_lcd_config(&nokia770_lcd_config); 113} 114 115static void __init ads7846_dev_init(void) 116{ 117 if (gpio_request(ADS7846_PENDOWN_GPIO, "ADS7846 pendown") < 0) 118 printk(KERN_ERR "can't get ads7846 pen down GPIO\n"); 119} 120 121static int ads7846_get_pendown_state(void) 122{ 123 return !gpio_get_value(ADS7846_PENDOWN_GPIO); 124} 125 126static struct ads7846_platform_data nokia770_ads7846_platform_data __initdata = { 127 .x_max = 0x0fff, 128 .y_max = 0x0fff, 129 .x_plate_ohms = 180, 130 .pressure_max = 255, 131 .debounce_max = 10, 132 .debounce_tol = 3, 133 .debounce_rep = 1, 134 .get_pendown_state = ads7846_get_pendown_state, 135}; 136 137static struct spi_board_info nokia770_spi_board_info[] __initdata = { 138 [0] = { 139 .modalias = "lcd_mipid", 140 .bus_num = 2, 141 .chip_select = 3, 142 .max_speed_hz = 12000000, 143 .platform_data = &nokia770_mipid_platform_data, 144 }, 145 [1] = { 146 .modalias = "ads7846", 147 .bus_num = 2, 148 .chip_select = 0, 149 .max_speed_hz = 2500000, 150 .platform_data = &nokia770_ads7846_platform_data, 151 }, 152}; 153 154static void __init hwa742_dev_init(void) 155{ 156 clk_add_alias("hwa_sys_ck", NULL, "bclk", NULL); 157} 158 159/* assume no Mini-AB port */ 160 161static struct omap_usb_config nokia770_usb_config __initdata = { 162 .otg = 1, 163 .register_host = 1, 164 .register_dev = 1, 165 .hmc_mode = 16, 166 .pins[0] = 6, 167}; 168 169#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) 170 171#define NOKIA770_GPIO_MMC_POWER 41 172#define NOKIA770_GPIO_MMC_SWITCH 23 173 174static int nokia770_mmc_set_power(struct device *dev, int slot, int power_on, 175 int vdd) 176{ 177 gpio_set_value(NOKIA770_GPIO_MMC_POWER, power_on); 178 return 0; 179} 180 181static int nokia770_mmc_get_cover_state(struct device *dev, int slot) 182{ 183 return gpio_get_value(NOKIA770_GPIO_MMC_SWITCH); 184} 185 186static struct omap_mmc_platform_data nokia770_mmc2_data = { 187 .nr_slots = 1, 188 .dma_mask = 0xffffffff, 189 .max_freq = 12000000, 190 .slots[0] = { 191 .set_power = nokia770_mmc_set_power, 192 .get_cover_state = nokia770_mmc_get_cover_state, 193 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 194 .name = "mmcblk", 195 }, 196}; 197 198static struct omap_mmc_platform_data *nokia770_mmc_data[OMAP16XX_NR_MMC]; 199 200static void __init nokia770_mmc_init(void) 201{ 202 int ret; 203 204 ret = gpio_request(NOKIA770_GPIO_MMC_POWER, "MMC power"); 205 if (ret < 0) 206 return; 207 gpio_direction_output(NOKIA770_GPIO_MMC_POWER, 0); 208 209 ret = gpio_request(NOKIA770_GPIO_MMC_SWITCH, "MMC cover"); 210 if (ret < 0) { 211 gpio_free(NOKIA770_GPIO_MMC_POWER); 212 return; 213 } 214 gpio_direction_input(NOKIA770_GPIO_MMC_SWITCH); 215 216 /* Only the second MMC controller is used */ 217 nokia770_mmc_data[1] = &nokia770_mmc2_data; 218 omap1_init_mmc(nokia770_mmc_data, OMAP16XX_NR_MMC); 219} 220 221#else 222static inline void nokia770_mmc_init(void) 223{ 224} 225#endif 226 227static void __init omap_nokia770_init(void) 228{ 229 /* On Nokia 770, the SleepX signal is masked with an 230 * MPUIO line by default. It has to be unmasked for it 231 * to become functional */ 232 233 /* SleepX mask direction */ 234 omap_writew((omap_readw(0xfffb5008) & ~2), 0xfffb5008); 235 /* Unmask SleepX signal */ 236 omap_writew((omap_readw(0xfffb5004) & ~2), 0xfffb5004); 237 238 platform_add_devices(nokia770_devices, ARRAY_SIZE(nokia770_devices)); 239 nokia770_spi_board_info[1].irq = gpio_to_irq(15); 240 spi_register_board_info(nokia770_spi_board_info, 241 ARRAY_SIZE(nokia770_spi_board_info)); 242 omap_serial_init(); 243 omap_register_i2c_bus(1, 100, NULL, 0); 244 hwa742_dev_init(); 245 ads7846_dev_init(); 246 mipid_dev_init(); 247 omap1_usb_init(&nokia770_usb_config); 248 nokia770_mmc_init(); 249} 250 251MACHINE_START(NOKIA770, "Nokia 770") 252 .atag_offset = 0x100, 253 .map_io = omap16xx_map_io, 254 .init_early = omap1_init_early, 255 .reserve = omap_reserve, 256 .init_irq = omap1_init_irq, 257 .init_machine = omap_nokia770_init, 258 .timer = &omap1_timer, 259 .restart = omap1_restart, 260MACHINE_END 261