0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/module.h>
0011 #include <linux/kernel.h>
0012 #include <linux/interrupt.h>
0013 #include <linux/init.h>
0014 #include <linux/platform_device.h>
0015 #include <linux/clk.h>
0016 #include <linux/gpio.h>
0017 #include <linux/smc91x.h>
0018 #include <linux/pwm.h>
0019 #include <linux/pwm_backlight.h>
0020
0021 #include <asm/mach-types.h>
0022 #include <asm/mach/arch.h>
0023
0024 #include "pxa930.h"
0025 #include <linux/platform_data/video-pxafb.h>
0026 #include <linux/platform_data/keypad-pxa27x.h>
0027
0028 #include "devices.h"
0029 #include "generic.h"
0030
0031
0032 static mfp_cfg_t tavorevb_mfp_cfg[] __initdata = {
0033
0034 DF_nCS1_nCS3,
0035 GPIO47_GPIO,
0036
0037
0038 GPIO23_LCD_DD0,
0039 GPIO24_LCD_DD1,
0040 GPIO25_LCD_DD2,
0041 GPIO26_LCD_DD3,
0042 GPIO27_LCD_DD4,
0043 GPIO28_LCD_DD5,
0044 GPIO29_LCD_DD6,
0045 GPIO44_LCD_DD7,
0046 GPIO21_LCD_CS,
0047 GPIO22_LCD_CS2,
0048
0049 GPIO17_LCD_FCLK_RD,
0050 GPIO18_LCD_LCLK_A0,
0051 GPIO19_LCD_PCLK_WR,
0052
0053
0054 GPIO43_PWM3,
0055 GPIO32_PWM0,
0056
0057
0058 GPIO0_KP_MKIN_0,
0059 GPIO2_KP_MKIN_1,
0060 GPIO4_KP_MKIN_2,
0061 GPIO6_KP_MKIN_3,
0062 GPIO8_KP_MKIN_4,
0063 GPIO10_KP_MKIN_5,
0064 GPIO12_KP_MKIN_6,
0065 GPIO1_KP_MKOUT_0,
0066 GPIO3_KP_MKOUT_1,
0067 GPIO5_KP_MKOUT_2,
0068 GPIO7_KP_MKOUT_3,
0069 GPIO9_KP_MKOUT_4,
0070 GPIO11_KP_MKOUT_5,
0071 GPIO13_KP_MKOUT_6,
0072
0073 GPIO14_KP_DKIN_2,
0074 GPIO15_KP_DKIN_3,
0075 };
0076
0077 #define TAVOREVB_ETH_PHYS (0x14000000)
0078
0079 static struct resource smc91x_resources[] = {
0080 [0] = {
0081 .start = (TAVOREVB_ETH_PHYS + 0x300),
0082 .end = (TAVOREVB_ETH_PHYS + 0xfffff),
0083 .flags = IORESOURCE_MEM,
0084 },
0085 [1] = {
0086 .start = PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO47)),
0087 .end = PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO47)),
0088 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
0089 }
0090 };
0091
0092 static struct smc91x_platdata tavorevb_smc91x_info = {
0093 .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT | SMC91X_USE_DMA,
0094 };
0095
0096 static struct platform_device smc91x_device = {
0097 .name = "smc91x",
0098 .id = 0,
0099 .num_resources = ARRAY_SIZE(smc91x_resources),
0100 .resource = smc91x_resources,
0101 .dev = {
0102 .platform_data = &tavorevb_smc91x_info,
0103 },
0104 };
0105
0106 #if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
0107 static const unsigned int tavorevb_matrix_key_map[] = {
0108
0109 KEY(0, 4, KEY_A), KEY(0, 5, KEY_B), KEY(0, 6, KEY_C),
0110 KEY(1, 4, KEY_E), KEY(1, 5, KEY_F), KEY(1, 6, KEY_G),
0111 KEY(2, 4, KEY_I), KEY(2, 5, KEY_J), KEY(2, 6, KEY_K),
0112 KEY(3, 4, KEY_M), KEY(3, 5, KEY_N), KEY(3, 6, KEY_O),
0113 KEY(4, 5, KEY_R), KEY(4, 6, KEY_S),
0114 KEY(5, 4, KEY_U), KEY(5, 4, KEY_V), KEY(5, 6, KEY_W),
0115
0116 KEY(6, 4, KEY_Y), KEY(6, 5, KEY_Z),
0117
0118 KEY(0, 3, KEY_0), KEY(2, 0, KEY_1), KEY(2, 1, KEY_2), KEY(2, 2, KEY_3),
0119 KEY(2, 3, KEY_4), KEY(1, 0, KEY_5), KEY(1, 1, KEY_6), KEY(1, 2, KEY_7),
0120 KEY(1, 3, KEY_8), KEY(0, 2, KEY_9),
0121
0122 KEY(6, 6, KEY_SPACE),
0123 KEY(0, 0, KEY_KPASTERISK),
0124 KEY(0, 1, KEY_KPDOT),
0125
0126 KEY(4, 1, KEY_UP),
0127 KEY(4, 3, KEY_DOWN),
0128 KEY(4, 0, KEY_LEFT),
0129 KEY(4, 2, KEY_RIGHT),
0130 KEY(6, 0, KEY_HOME),
0131 KEY(3, 2, KEY_END),
0132 KEY(6, 1, KEY_DELETE),
0133 KEY(5, 2, KEY_BACK),
0134 KEY(6, 3, KEY_CAPSLOCK),
0135
0136 KEY(4, 4, KEY_ENTER),
0137 KEY(6, 2, KEY_ENTER),
0138
0139 KEY(3, 1, KEY_SEND),
0140 KEY(5, 3, KEY_RECORD),
0141 KEY(5, 0, KEY_VOLUMEUP),
0142 KEY(5, 1, KEY_VOLUMEDOWN),
0143
0144 KEY(3, 0, KEY_F22),
0145 KEY(3, 3, KEY_F23),
0146 };
0147
0148 static struct matrix_keymap_data tavorevb_matrix_keymap_data = {
0149 .keymap = tavorevb_matrix_key_map,
0150 .keymap_size = ARRAY_SIZE(tavorevb_matrix_key_map),
0151 };
0152
0153 static struct pxa27x_keypad_platform_data tavorevb_keypad_info = {
0154 .matrix_key_rows = 7,
0155 .matrix_key_cols = 7,
0156 .matrix_keymap_data = &tavorevb_matrix_keymap_data,
0157 .debounce_interval = 30,
0158 };
0159
0160 static void __init tavorevb_init_keypad(void)
0161 {
0162 pxa_set_keypad_info(&tavorevb_keypad_info);
0163 }
0164 #else
0165 static inline void tavorevb_init_keypad(void) {}
0166 #endif
0167
0168 #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
0169 static struct pwm_lookup tavorevb_pwm_lookup[] = {
0170 PWM_LOOKUP("pxa27x-pwm.0", 1, "pwm-backlight.0", NULL, 100000,
0171 PWM_POLARITY_NORMAL),
0172 PWM_LOOKUP("pxa27x-pwm.0", 0, "pwm-backlight.1", NULL, 100000,
0173 PWM_POLARITY_NORMAL),
0174 };
0175
0176 static struct platform_pwm_backlight_data tavorevb_backlight_data[] = {
0177 [0] = {
0178
0179 .max_brightness = 100,
0180 .dft_brightness = 100,
0181 },
0182 [1] = {
0183
0184 .max_brightness = 100,
0185 .dft_brightness = 100,
0186 },
0187 };
0188
0189 static struct platform_device tavorevb_backlight_devices[] = {
0190 [0] = {
0191 .name = "pwm-backlight",
0192 .id = 0,
0193 .dev = {
0194 .platform_data = &tavorevb_backlight_data[0],
0195 },
0196 },
0197 [1] = {
0198 .name = "pwm-backlight",
0199 .id = 1,
0200 .dev = {
0201 .platform_data = &tavorevb_backlight_data[1],
0202 },
0203 },
0204 };
0205
0206 static uint16_t panel_init[] = {
0207
0208 SMART_CMD(0x00),
0209 SMART_CMD_NOOP,
0210 SMART_DELAY(1),
0211
0212 SMART_CMD(0x00),
0213 SMART_CMD_NOOP,
0214 SMART_DELAY(1),
0215
0216 SMART_CMD(0x00),
0217 SMART_CMD_NOOP,
0218 SMART_DELAY(1),
0219
0220
0221 SMART_CMD(0x00),
0222 SMART_CMD(0x1D),
0223 SMART_DAT(0x00),
0224 SMART_DAT(0x05),
0225 SMART_DELAY(1),
0226
0227
0228 SMART_CMD(0x00),
0229 SMART_CMD(0x00),
0230 SMART_DAT(0x00),
0231 SMART_DAT(0x01),
0232 SMART_CMD(0x00),
0233 SMART_CMD(0x01),
0234 SMART_DAT(0x01),
0235 SMART_DAT(0x27),
0236 SMART_CMD(0x00),
0237 SMART_CMD(0x02),
0238 SMART_DAT(0x02),
0239 SMART_DAT(0x00),
0240 SMART_CMD(0x00),
0241 SMART_CMD(0x03),
0242 SMART_DAT(0x01),
0243 SMART_DAT(0x30),
0244 SMART_CMD(0x07),
0245 SMART_CMD(0x00),
0246 SMART_DAT(0x00),
0247 SMART_DAT(0x03),
0248 SMART_CMD(0x00),
0249
0250
0251 SMART_CMD(0x07),
0252 SMART_DAT(0x40),
0253 SMART_DAT(0x00),
0254 SMART_CMD(0x00),
0255 SMART_CMD(0x08),
0256 SMART_DAT(0x03),
0257 SMART_DAT(0x02),
0258 SMART_CMD(0x00),
0259 SMART_CMD(0x0C),
0260 SMART_DAT(0x00),
0261 SMART_DAT(0x00),
0262 SMART_CMD(0x00),
0263 SMART_CMD(0x0D),
0264 SMART_DAT(0x00),
0265 SMART_DAT(0x10),
0266 SMART_CMD(0x00),
0267 SMART_CMD(0x12),
0268 SMART_DAT(0x03),
0269 SMART_DAT(0x02),
0270 SMART_CMD(0x00),
0271 SMART_CMD(0x13),
0272 SMART_DAT(0x01),
0273 SMART_DAT(0x02),
0274 SMART_CMD(0x00),
0275 SMART_CMD(0x14),
0276 SMART_DAT(0x00),
0277 SMART_DAT(0x00),
0278 SMART_CMD(0x00),
0279 SMART_CMD(0x15),
0280 SMART_DAT(0x20),
0281 SMART_DAT(0x00),
0282 SMART_CMD(0x00),
0283 SMART_CMD(0x1C),
0284 SMART_DAT(0x00),
0285 SMART_DAT(0x00),
0286 SMART_CMD(0x03),
0287 SMART_CMD(0x00),
0288 SMART_DAT(0x04),
0289 SMART_DAT(0x03),
0290 SMART_CMD(0x03),
0291 SMART_CMD(0x01),
0292 SMART_DAT(0x03),
0293 SMART_DAT(0x04),
0294 SMART_CMD(0x03),
0295 SMART_CMD(0x02),
0296 SMART_DAT(0x04),
0297 SMART_DAT(0x03),
0298 SMART_CMD(0x03),
0299 SMART_CMD(0x03),
0300 SMART_DAT(0x03),
0301 SMART_DAT(0x03),
0302 SMART_CMD(0x03),
0303 SMART_CMD(0x04),
0304 SMART_DAT(0x01),
0305 SMART_DAT(0x01),
0306 SMART_CMD(0x03),
0307 SMART_CMD(0x05),
0308 SMART_DAT(0x00),
0309 SMART_DAT(0x00),
0310 SMART_CMD(0x04),
0311 SMART_CMD(0x02),
0312 SMART_DAT(0x00),
0313 SMART_DAT(0x00),
0314 SMART_CMD(0x04),
0315 SMART_CMD(0x03),
0316 SMART_DAT(0x01),
0317 SMART_DAT(0x3F),
0318 SMART_DELAY(0),
0319
0320
0321 SMART_CMD(0x04),
0322 SMART_CMD(0x06),
0323 SMART_DAT(0x00),
0324 SMART_DAT(0x00),
0325 SMART_CMD(0x04),
0326 SMART_CMD(0x07),
0327 SMART_DAT(0x00),
0328 SMART_DAT(0xEF),
0329 SMART_CMD(0x04),
0330 SMART_CMD(0x08),
0331 SMART_DAT(0x00),
0332 SMART_DAT(0x00),
0333 SMART_CMD(0x04),
0334 SMART_CMD(0x09),
0335 SMART_DAT(0x01),
0336 SMART_DAT(0x3F),
0337 SMART_CMD(0x02),
0338 SMART_CMD(0x00),
0339 SMART_DAT(0x00),
0340 SMART_DAT(0x00),
0341 SMART_CMD(0x02),
0342 SMART_CMD(0x01),
0343 SMART_DAT(0x00),
0344 SMART_DAT(0x00),
0345 };
0346
0347 static uint16_t panel_on[] = {
0348
0349 SMART_CMD(0x01),
0350 SMART_CMD(0x02),
0351 SMART_DAT(0x07),
0352 SMART_DAT(0x7D),
0353 SMART_CMD(0x01),
0354 SMART_CMD(0x03),
0355 SMART_DAT(0x00),
0356 SMART_DAT(0x05),
0357 SMART_CMD(0x01),
0358 SMART_CMD(0x04),
0359 SMART_DAT(0x00),
0360 SMART_DAT(0x00),
0361 SMART_CMD(0x01),
0362 SMART_CMD(0x05),
0363 SMART_DAT(0x00),
0364 SMART_DAT(0x15),
0365 SMART_CMD(0x01),
0366 SMART_CMD(0x00),
0367 SMART_DAT(0xC0),
0368 SMART_DAT(0x10),
0369 SMART_DELAY(30),
0370
0371
0372 SMART_CMD(0x01),
0373 SMART_CMD(0x01),
0374 SMART_DAT(0x00),
0375 SMART_DAT(0x01),
0376 SMART_CMD(0x01),
0377 SMART_CMD(0x00),
0378 SMART_DAT(0xFF),
0379 SMART_DAT(0xFE),
0380 SMART_DELAY(150),
0381 };
0382
0383 static uint16_t panel_off[] = {
0384 SMART_CMD(0x00),
0385 SMART_CMD(0x1E),
0386 SMART_DAT(0x00),
0387 SMART_DAT(0x0A),
0388 SMART_CMD(0x01),
0389 SMART_CMD(0x00),
0390 SMART_DAT(0xFF),
0391 SMART_DAT(0xEE),
0392 SMART_CMD(0x01),
0393 SMART_CMD(0x00),
0394 SMART_DAT(0xF8),
0395 SMART_DAT(0x12),
0396 SMART_CMD(0x01),
0397 SMART_CMD(0x00),
0398 SMART_DAT(0xE8),
0399 SMART_DAT(0x11),
0400 SMART_CMD(0x01),
0401 SMART_CMD(0x00),
0402 SMART_DAT(0xC0),
0403 SMART_DAT(0x11),
0404 SMART_CMD(0x01),
0405 SMART_CMD(0x00),
0406 SMART_DAT(0x40),
0407 SMART_DAT(0x11),
0408 SMART_CMD(0x01),
0409 SMART_CMD(0x00),
0410 SMART_DAT(0x00),
0411 SMART_DAT(0x10),
0412 };
0413
0414 static uint16_t update_framedata[] = {
0415
0416 SMART_CMD(0x02),
0417 SMART_CMD(0x02),
0418
0419
0420 SMART_CMD_WRITE_FRAME,
0421 };
0422
0423 static void ltm020d550_lcd_power(int on, struct fb_var_screeninfo *var)
0424 {
0425 struct fb_info *info = container_of(var, struct fb_info, var);
0426
0427 if (on) {
0428 pxafb_smart_queue(info, ARRAY_AND_SIZE(panel_init));
0429 pxafb_smart_queue(info, ARRAY_AND_SIZE(panel_on));
0430 } else {
0431 pxafb_smart_queue(info, ARRAY_AND_SIZE(panel_off));
0432 }
0433
0434 if (pxafb_smart_flush(info))
0435 pr_err("%s: timed out\n", __func__);
0436 }
0437
0438 static void ltm020d550_update(struct fb_info *info)
0439 {
0440 pxafb_smart_queue(info, ARRAY_AND_SIZE(update_framedata));
0441 pxafb_smart_flush(info);
0442 }
0443
0444 static struct pxafb_mode_info toshiba_ltm020d550_modes[] = {
0445 [0] = {
0446 .xres = 240,
0447 .yres = 320,
0448 .bpp = 16,
0449 .a0csrd_set_hld = 30,
0450 .a0cswr_set_hld = 30,
0451 .wr_pulse_width = 30,
0452 .rd_pulse_width = 170,
0453 .op_hold_time = 30,
0454 .cmd_inh_time = 60,
0455
0456
0457 .sync = FB_SYNC_HOR_HIGH_ACT |
0458 FB_SYNC_VERT_HIGH_ACT,
0459 },
0460 };
0461
0462 static struct pxafb_mach_info tavorevb_lcd_info = {
0463 .modes = toshiba_ltm020d550_modes,
0464 .num_modes = 1,
0465 .lcd_conn = LCD_SMART_PANEL_8BPP | LCD_PCLK_EDGE_FALL,
0466 .pxafb_lcd_power = ltm020d550_lcd_power,
0467 .smart_update = ltm020d550_update,
0468 };
0469
0470 static void __init tavorevb_init_lcd(void)
0471 {
0472 pwm_add_table(tavorevb_pwm_lookup, ARRAY_SIZE(tavorevb_pwm_lookup));
0473 platform_device_register(&tavorevb_backlight_devices[0]);
0474 platform_device_register(&tavorevb_backlight_devices[1]);
0475 pxa_set_fb_info(NULL, &tavorevb_lcd_info);
0476 }
0477 #else
0478 static inline void tavorevb_init_lcd(void) {}
0479 #endif
0480
0481 static void __init tavorevb_init(void)
0482 {
0483
0484 pxa3xx_mfp_config(ARRAY_AND_SIZE(tavorevb_mfp_cfg));
0485
0486 pxa_set_ffuart_info(NULL);
0487 pxa_set_btuart_info(NULL);
0488 pxa_set_stuart_info(NULL);
0489
0490 platform_device_register(&smc91x_device);
0491
0492 tavorevb_init_lcd();
0493 tavorevb_init_keypad();
0494 }
0495
0496 MACHINE_START(TAVOREVB, "PXA930 Evaluation Board (aka TavorEVB)")
0497
0498 .atag_offset = 0x100,
0499 .map_io = pxa3xx_map_io,
0500 .nr_irqs = PXA_NR_IRQS,
0501 .init_irq = pxa3xx_init_irq,
0502 .handle_irq = pxa3xx_handle_irq,
0503 .init_time = pxa_timer_init,
0504 .init_machine = tavorevb_init,
0505 .restart = pxa_restart,
0506 MACHINE_END