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/delay.h>
0018 #include <linux/fb.h>
0019 #include <linux/i2c.h>
0020 #include <linux/platform_data/i2c-pxa.h>
0021 #include <linux/smc91x.h>
0022 #include <linux/mfd/da903x.h>
0023 #include <linux/mtd/mtd.h>
0024 #include <linux/mtd/partitions.h>
0025 #include <linux/mtd/onenand.h>
0026
0027 #include <asm/mach-types.h>
0028 #include <asm/mach/arch.h>
0029 #include <asm/mach/flash.h>
0030
0031 #include "pxa930.h"
0032 #include <linux/platform_data/video-pxafb.h>
0033
0034 #include "devices.h"
0035 #include "generic.h"
0036
0037 #define GPIO_LCD_RESET (16)
0038
0039
0040 static mfp_cfg_t saar_mfp_cfg[] __initdata = {
0041
0042 GPIO23_LCD_DD0,
0043 GPIO24_LCD_DD1,
0044 GPIO25_LCD_DD2,
0045 GPIO26_LCD_DD3,
0046 GPIO27_LCD_DD4,
0047 GPIO28_LCD_DD5,
0048 GPIO29_LCD_DD6,
0049 GPIO44_LCD_DD7,
0050 GPIO21_LCD_CS,
0051 GPIO22_LCD_VSYNC,
0052 GPIO17_LCD_FCLK_RD,
0053 GPIO18_LCD_LCLK_A0,
0054 GPIO19_LCD_PCLK_WR,
0055 GPIO16_GPIO,
0056
0057
0058 DF_nCS1_nCS3,
0059 GPIO97_GPIO,
0060
0061
0062 DF_INT_RnB_ND_INT_RnB,
0063 DF_nRE_nOE_ND_nRE,
0064 DF_nWE_ND_nWE,
0065 DF_CLE_nOE_ND_CLE,
0066 DF_nADV1_ALE_ND_ALE,
0067 DF_nADV2_ALE_nCS3,
0068 DF_nCS0_ND_nCS0,
0069 DF_IO0_ND_IO0,
0070 DF_IO1_ND_IO1,
0071 DF_IO2_ND_IO2,
0072 DF_IO3_ND_IO3,
0073 DF_IO4_ND_IO4,
0074 DF_IO5_ND_IO5,
0075 DF_IO6_ND_IO6,
0076 DF_IO7_ND_IO7,
0077 DF_IO8_ND_IO8,
0078 DF_IO9_ND_IO9,
0079 DF_IO10_ND_IO10,
0080 DF_IO11_ND_IO11,
0081 DF_IO12_ND_IO12,
0082 DF_IO13_ND_IO13,
0083 DF_IO14_ND_IO14,
0084 DF_IO15_ND_IO15,
0085 };
0086
0087 #define SAAR_ETH_PHYS (0x14000000)
0088
0089 static struct resource smc91x_resources[] = {
0090 [0] = {
0091 .start = (SAAR_ETH_PHYS + 0x300),
0092 .end = (SAAR_ETH_PHYS + 0xfffff),
0093 .flags = IORESOURCE_MEM,
0094 },
0095 [1] = {
0096 .start = PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO97)),
0097 .end = PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO97)),
0098 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
0099 }
0100 };
0101
0102 static struct smc91x_platdata saar_smc91x_info = {
0103 .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT | SMC91X_USE_DMA,
0104 };
0105
0106 static struct platform_device smc91x_device = {
0107 .name = "smc91x",
0108 .id = 0,
0109 .num_resources = ARRAY_SIZE(smc91x_resources),
0110 .resource = smc91x_resources,
0111 .dev = {
0112 .platform_data = &saar_smc91x_info,
0113 },
0114 };
0115
0116 #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
0117 static uint16_t lcd_power_on[] = {
0118
0119 SMART_CMD_NOOP,
0120 SMART_CMD(0x00),
0121 SMART_DELAY(0),
0122
0123 SMART_CMD_NOOP,
0124 SMART_CMD(0x00),
0125 SMART_DELAY(0),
0126
0127 SMART_CMD_NOOP,
0128 SMART_CMD(0x00),
0129 SMART_DELAY(0),
0130
0131 SMART_CMD_NOOP,
0132 SMART_CMD(0x00),
0133 SMART_DELAY(10),
0134
0135
0136 SMART_CMD(0x00),
0137 SMART_CMD(0xA4),
0138 SMART_DAT(0x80),
0139 SMART_DAT(0x01),
0140 SMART_DELAY(150),
0141
0142
0143 SMART_CMD(0x00),
0144 SMART_CMD(0x01),
0145 SMART_DAT(0x01),
0146 SMART_DAT(0x00),
0147 SMART_CMD(0x00),
0148 SMART_CMD(0x02),
0149 SMART_DAT(0x07),
0150 SMART_DAT(0x00),
0151 SMART_CMD(0x00),
0152 SMART_CMD(0x03),
0153 SMART_DAT(0xD0),
0154 SMART_DAT(0x30),
0155 SMART_CMD(0x00),
0156 SMART_CMD(0x08),
0157 SMART_DAT(0x08),
0158 SMART_DAT(0x08),
0159 SMART_CMD(0x00),
0160 SMART_CMD(0x09),
0161 SMART_DAT(0x04),
0162 SMART_DAT(0x2F),
0163 SMART_CMD(0x00),
0164 SMART_CMD(0x0A),
0165 SMART_DAT(0x00),
0166 SMART_DAT(0x08),
0167 SMART_CMD(0x00),
0168 SMART_CMD(0x0D),
0169 SMART_DAT(0x00),
0170 SMART_DAT(0x08),
0171 SMART_CMD(0x00),
0172 SMART_CMD(0x60),
0173 SMART_DAT(0x27),
0174 SMART_DAT(0x00),
0175 SMART_CMD(0x00),
0176 SMART_CMD(0x61),
0177 SMART_DAT(0x00),
0178 SMART_DAT(0x01),
0179 SMART_CMD(0x00),
0180 SMART_CMD(0x30),
0181 SMART_DAT(0x07),
0182 SMART_DAT(0x07),
0183 SMART_CMD(0x00),
0184 SMART_CMD(0x31),
0185 SMART_DAT(0x00),
0186 SMART_DAT(0x07),
0187 SMART_CMD(0x00),
0188 SMART_CMD(0x32),
0189 SMART_DAT(0x04),
0190 SMART_DAT(0x00),
0191 SMART_CMD(0x00),
0192 SMART_CMD(0x33),
0193 SMART_DAT(0x03),
0194 SMART_DAT(0x03),
0195 SMART_CMD(0x00),
0196 SMART_CMD(0x34),
0197 SMART_DAT(0x00),
0198 SMART_DAT(0x00),
0199 SMART_CMD(0x00),
0200 SMART_CMD(0x35),
0201 SMART_DAT(0x02),
0202 SMART_DAT(0x05),
0203 SMART_CMD(0x00),
0204 SMART_CMD(0x36),
0205 SMART_DAT(0x1F),
0206 SMART_DAT(0x1F),
0207 SMART_CMD(0x00),
0208 SMART_CMD(0x37),
0209 SMART_DAT(0x07),
0210 SMART_DAT(0x07),
0211 SMART_CMD(0x00),
0212 SMART_CMD(0x38),
0213 SMART_DAT(0x00),
0214 SMART_DAT(0x07),
0215 SMART_CMD(0x00),
0216 SMART_CMD(0x39),
0217 SMART_DAT(0x04),
0218 SMART_DAT(0x00),
0219 SMART_CMD(0x00),
0220 SMART_CMD(0x3A),
0221 SMART_DAT(0x03),
0222 SMART_DAT(0x03),
0223 SMART_CMD(0x00),
0224 SMART_CMD(0x3B),
0225 SMART_DAT(0x00),
0226 SMART_DAT(0x00),
0227 SMART_CMD(0x00),
0228 SMART_CMD(0x3C),
0229 SMART_DAT(0x02),
0230 SMART_DAT(0x05),
0231 SMART_CMD(0x00),
0232 SMART_CMD(0x3D),
0233 SMART_DAT(0x1F),
0234 SMART_DAT(0x1F),
0235 SMART_CMD(0x00),
0236 SMART_CMD(0x07),
0237 SMART_DAT(0x00),
0238 SMART_DAT(0x01),
0239 SMART_CMD(0x00),
0240 SMART_CMD(0x17),
0241 SMART_DAT(0x00),
0242 SMART_DAT(0x01),
0243 SMART_CMD(0x00),
0244 SMART_CMD(0x10),
0245 SMART_DAT(0x10),
0246 SMART_DAT(0xB0),
0247 SMART_CMD(0x00),
0248 SMART_CMD(0x11),
0249 SMART_DAT(0x01),
0250 SMART_DAT(0x30),
0251 SMART_CMD(0x00),
0252 SMART_CMD(0x12),
0253 SMART_DAT(0x01),
0254 SMART_DAT(0x9E),
0255 SMART_CMD(0x00),
0256 SMART_CMD(0x13),
0257 SMART_DAT(0x17),
0258 SMART_DAT(0x00),
0259 SMART_CMD(0x00),
0260 SMART_CMD(0x12),
0261 SMART_DAT(0x01),
0262 SMART_DAT(0xBE),
0263 SMART_DELAY(100),
0264
0265
0266 SMART_CMD(0x00),
0267 SMART_CMD(0x20),
0268 SMART_DAT(0x00),
0269 SMART_DAT(0x00),
0270 SMART_CMD(0x00),
0271 SMART_CMD(0x21),
0272 SMART_DAT(0x00),
0273 SMART_DAT(0x00),
0274 SMART_CMD(0x00),
0275 SMART_CMD(0x50),
0276 SMART_DAT(0x00),
0277 SMART_DAT(0x00),
0278 SMART_CMD(0x00),
0279 SMART_CMD(0x51),
0280 SMART_DAT(0x00),
0281 SMART_DAT(0xEF),
0282 SMART_CMD(0x00),
0283 SMART_CMD(0x52),
0284 SMART_DAT(0x00),
0285 SMART_DAT(0x00),
0286 SMART_CMD(0x00),
0287 SMART_CMD(0x53),
0288 SMART_DAT(0x01),
0289 SMART_DAT(0x3F),
0290 SMART_CMD(0x00),
0291 SMART_CMD(0x90),
0292 SMART_DAT(0x00),
0293 SMART_DAT(0x1A),
0294 SMART_CMD(0x00),
0295 SMART_CMD(0x92),
0296 SMART_DAT(0x04),
0297 SMART_DAT(0x00),
0298 SMART_CMD(0x00),
0299 SMART_CMD(0x93),
0300 SMART_DAT(0x00),
0301 SMART_DAT(0x05),
0302 SMART_DELAY(20),
0303 };
0304
0305 static uint16_t lcd_panel_on[] = {
0306 SMART_CMD(0x00),
0307 SMART_CMD(0x07),
0308 SMART_DAT(0x00),
0309 SMART_DAT(0x21),
0310 SMART_DELAY(1),
0311
0312 SMART_CMD(0x00),
0313 SMART_CMD(0x07),
0314 SMART_DAT(0x00),
0315 SMART_DAT(0x61),
0316 SMART_DELAY(100),
0317
0318 SMART_CMD(0x00),
0319 SMART_CMD(0x07),
0320 SMART_DAT(0x01),
0321 SMART_DAT(0x73),
0322 SMART_DELAY(1),
0323 };
0324
0325 static uint16_t lcd_panel_off[] = {
0326 SMART_CMD(0x00),
0327 SMART_CMD(0x07),
0328 SMART_DAT(0x00),
0329 SMART_DAT(0x72),
0330 SMART_DELAY(40),
0331
0332 SMART_CMD(0x00),
0333 SMART_CMD(0x07),
0334 SMART_DAT(0x00),
0335 SMART_DAT(0x01),
0336 SMART_DELAY(1),
0337
0338 SMART_CMD(0x00),
0339 SMART_CMD(0x07),
0340 SMART_DAT(0x00),
0341 SMART_DAT(0x00),
0342 SMART_DELAY(1),
0343 };
0344
0345 static uint16_t lcd_power_off[] = {
0346 SMART_CMD(0x00),
0347 SMART_CMD(0x10),
0348 SMART_DAT(0x00),
0349 SMART_DAT(0x80),
0350
0351 SMART_CMD(0x00),
0352 SMART_CMD(0x11),
0353 SMART_DAT(0x01),
0354 SMART_DAT(0x60),
0355
0356 SMART_CMD(0x00),
0357 SMART_CMD(0x12),
0358 SMART_DAT(0x01),
0359 SMART_DAT(0xAE),
0360 SMART_DELAY(40),
0361
0362 SMART_CMD(0x00),
0363 SMART_CMD(0x10),
0364 SMART_DAT(0x00),
0365 SMART_DAT(0x00),
0366 };
0367
0368 static uint16_t update_framedata[] = {
0369
0370 SMART_CMD(0x00),
0371 SMART_CMD(0x20),
0372 SMART_DAT(0x00),
0373 SMART_DAT(0x00),
0374 SMART_CMD(0x00),
0375 SMART_CMD(0x21),
0376 SMART_DAT(0x00),
0377 SMART_DAT(0x00),
0378 SMART_CMD(0x00),
0379 SMART_CMD(0x50),
0380 SMART_DAT(0x00),
0381 SMART_DAT(0x00),
0382 SMART_CMD(0x00),
0383 SMART_CMD(0x51),
0384 SMART_DAT(0x00),
0385 SMART_DAT(0xEF),
0386 SMART_CMD(0x00),
0387 SMART_CMD(0x52),
0388 SMART_DAT(0x00),
0389 SMART_DAT(0x00),
0390 SMART_CMD(0x00),
0391 SMART_CMD(0x53),
0392 SMART_DAT(0x01),
0393 SMART_DAT(0x3F),
0394
0395
0396 SMART_CMD_WAIT_FOR_VSYNC,
0397
0398
0399 SMART_CMD(0x00),
0400 SMART_CMD(0x22),
0401
0402
0403 SMART_CMD_WRITE_FRAME,
0404 };
0405
0406 static void ltm022a97a_lcd_power(int on, struct fb_var_screeninfo *var)
0407 {
0408 static int pin_requested = 0;
0409 struct fb_info *info = container_of(var, struct fb_info, var);
0410 int err;
0411
0412 if (!pin_requested) {
0413 err = gpio_request(GPIO_LCD_RESET, "lcd reset");
0414 if (err) {
0415 pr_err("failed to request gpio for LCD reset\n");
0416 return;
0417 }
0418
0419 gpio_direction_output(GPIO_LCD_RESET, 0);
0420 pin_requested = 1;
0421 }
0422
0423 if (on) {
0424 gpio_set_value(GPIO_LCD_RESET, 0); msleep(100);
0425 gpio_set_value(GPIO_LCD_RESET, 1); msleep(10);
0426
0427 pxafb_smart_queue(info, ARRAY_AND_SIZE(lcd_power_on));
0428 pxafb_smart_queue(info, ARRAY_AND_SIZE(lcd_panel_on));
0429 } else {
0430 pxafb_smart_queue(info, ARRAY_AND_SIZE(lcd_panel_off));
0431 pxafb_smart_queue(info, ARRAY_AND_SIZE(lcd_power_off));
0432 }
0433
0434 err = pxafb_smart_flush(info);
0435 if (err)
0436 pr_err("%s: timed out\n", __func__);
0437 }
0438
0439 static void ltm022a97a_update(struct fb_info *info)
0440 {
0441 pxafb_smart_queue(info, ARRAY_AND_SIZE(update_framedata));
0442 pxafb_smart_flush(info);
0443 }
0444
0445 static struct pxafb_mode_info toshiba_ltm022a97a_modes[] = {
0446 [0] = {
0447 .xres = 240,
0448 .yres = 320,
0449 .bpp = 16,
0450 .a0csrd_set_hld = 30,
0451 .a0cswr_set_hld = 30,
0452 .wr_pulse_width = 30,
0453 .rd_pulse_width = 30,
0454 .op_hold_time = 30,
0455 .cmd_inh_time = 60,
0456
0457
0458 .sync = FB_SYNC_HOR_HIGH_ACT |
0459 FB_SYNC_VERT_HIGH_ACT,
0460 },
0461 };
0462
0463 static struct pxafb_mach_info saar_lcd_info = {
0464 .modes = toshiba_ltm022a97a_modes,
0465 .num_modes = 1,
0466 .lcd_conn = LCD_SMART_PANEL_8BPP | LCD_PCLK_EDGE_FALL,
0467 .pxafb_lcd_power = ltm022a97a_lcd_power,
0468 .smart_update = ltm022a97a_update,
0469 };
0470
0471 static void __init saar_init_lcd(void)
0472 {
0473 pxa_set_fb_info(NULL, &saar_lcd_info);
0474 }
0475 #else
0476 static inline void saar_init_lcd(void) {}
0477 #endif
0478
0479 #if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
0480 static struct da9034_backlight_pdata saar_da9034_backlight = {
0481 .output_current = 4,
0482 };
0483
0484 static struct da903x_subdev_info saar_da9034_subdevs[] = {
0485 [0] = {
0486 .name = "da903x-backlight",
0487 .id = DA9034_ID_WLED,
0488 .platform_data = &saar_da9034_backlight,
0489 },
0490 };
0491
0492 static struct da903x_platform_data saar_da9034_info = {
0493 .num_subdevs = ARRAY_SIZE(saar_da9034_subdevs),
0494 .subdevs = saar_da9034_subdevs,
0495 };
0496
0497 static struct i2c_board_info saar_i2c_info[] = {
0498 [0] = {
0499 .type = "da9034",
0500 .addr = 0x34,
0501 .platform_data = &saar_da9034_info,
0502 .irq = PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO83)),
0503 },
0504 };
0505
0506 static void __init saar_init_i2c(void)
0507 {
0508 pxa_set_i2c_info(NULL);
0509 i2c_register_board_info(0, ARRAY_AND_SIZE(saar_i2c_info));
0510 }
0511 #else
0512 static inline void saar_init_i2c(void) {}
0513 #endif
0514
0515 #if defined(CONFIG_MTD_ONENAND) || defined(CONFIG_MTD_ONENAND_MODULE)
0516 static struct mtd_partition saar_onenand_partitions[] = {
0517 {
0518 .name = "bootloader",
0519 .offset = 0,
0520 .size = SZ_1M,
0521 .mask_flags = MTD_WRITEABLE,
0522 }, {
0523 .name = "reserved",
0524 .offset = MTDPART_OFS_APPEND,
0525 .size = SZ_128K,
0526 .mask_flags = MTD_WRITEABLE,
0527 }, {
0528 .name = "reserved",
0529 .offset = MTDPART_OFS_APPEND,
0530 .size = SZ_8M,
0531 .mask_flags = MTD_WRITEABLE,
0532 }, {
0533 .name = "kernel",
0534 .offset = MTDPART_OFS_APPEND,
0535 .size = (SZ_2M + SZ_1M),
0536 .mask_flags = 0,
0537 }, {
0538 .name = "filesystem",
0539 .offset = MTDPART_OFS_APPEND,
0540 .size = SZ_32M + SZ_16M,
0541 .mask_flags = 0,
0542 }
0543 };
0544
0545 static struct onenand_platform_data saar_onenand_info = {
0546 .parts = saar_onenand_partitions,
0547 .nr_parts = ARRAY_SIZE(saar_onenand_partitions),
0548 };
0549
0550 #define SMC_CS0_PHYS_BASE (0x10000000)
0551
0552 static struct resource saar_resource_onenand[] = {
0553 [0] = {
0554 .start = SMC_CS0_PHYS_BASE,
0555 .end = SMC_CS0_PHYS_BASE + SZ_1M,
0556 .flags = IORESOURCE_MEM,
0557 },
0558 };
0559
0560 static struct platform_device saar_device_onenand = {
0561 .name = "onenand-flash",
0562 .id = -1,
0563 .dev = {
0564 .platform_data = &saar_onenand_info,
0565 },
0566 .resource = saar_resource_onenand,
0567 .num_resources = ARRAY_SIZE(saar_resource_onenand),
0568 };
0569
0570 static void __init saar_init_onenand(void)
0571 {
0572 platform_device_register(&saar_device_onenand);
0573 }
0574 #else
0575 static void __init saar_init_onenand(void) {}
0576 #endif
0577
0578 static void __init saar_init(void)
0579 {
0580
0581 pxa3xx_mfp_config(ARRAY_AND_SIZE(saar_mfp_cfg));
0582
0583 pxa_set_ffuart_info(NULL);
0584 pxa_set_btuart_info(NULL);
0585 pxa_set_stuart_info(NULL);
0586
0587 platform_device_register(&smc91x_device);
0588 saar_init_onenand();
0589
0590 saar_init_i2c();
0591 saar_init_lcd();
0592 }
0593
0594 MACHINE_START(SAAR, "PXA930 Handheld Platform (aka SAAR)")
0595
0596 .atag_offset = 0x100,
0597 .map_io = pxa3xx_map_io,
0598 .nr_irqs = PXA_NR_IRQS,
0599 .init_irq = pxa3xx_init_irq,
0600 .handle_irq = pxa3xx_handle_irq,
0601 .init_time = pxa_timer_init,
0602 .init_machine = saar_init,
0603 .restart = pxa_restart,
0604 MACHINE_END