Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  *  linux/arch/arm/mach-pxa/tavorevb.c
0004  *
0005  *  Support for the Marvell PXA930 Evaluation Board
0006  *
0007  *  Copyright (C) 2007-2008 Marvell International Ltd.
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 /* Tavor EVB MFP configurations */
0032 static mfp_cfg_t tavorevb_mfp_cfg[] __initdata = {
0033     /* Ethernet */
0034     DF_nCS1_nCS3,
0035     GPIO47_GPIO,
0036 
0037     /* LCD */
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     /* LCD Backlight */
0054     GPIO43_PWM3,    /* primary backlight */
0055     GPIO32_PWM0,    /* secondary backlight */
0056 
0057     /* Keypad */
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     /* KEY(row, col, key_code) */
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),    /* KEY_LEFTSHIFT), */
0135 
0136     KEY(4, 4, KEY_ENTER),       /* scroll push */
0137     KEY(6, 2, KEY_ENTER),       /* keypad action */
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), /* soft1 */
0145     KEY(3, 3, KEY_F23), /* soft2 */
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 /* CONFIG_KEYBOARD_PXA27x || CONFIG_KEYBOARD_PXA27x_MODULE */
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         /* primary backlight */
0179         .max_brightness = 100,
0180         .dft_brightness = 100,
0181     },
0182     [1] = {
0183         /* secondary backlight */
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     /* DSTB OUT */
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     /* STB OUT */
0221     SMART_CMD(0x00),
0222     SMART_CMD(0x1D),
0223     SMART_DAT(0x00),
0224     SMART_DAT(0x05),
0225     SMART_DELAY(1),
0226 
0227     /* P-ON Init sequence */
0228     SMART_CMD(0x00), /* OSC ON */
0229     SMART_CMD(0x00),
0230     SMART_DAT(0x00),
0231     SMART_DAT(0x01),
0232     SMART_CMD(0x00),
0233     SMART_CMD(0x01), /* SOURCE DRIVER SHIFT DIRECTION and display RAM setting */
0234     SMART_DAT(0x01),
0235     SMART_DAT(0x27),
0236     SMART_CMD(0x00),
0237     SMART_CMD(0x02), /* LINE INV */
0238     SMART_DAT(0x02),
0239     SMART_DAT(0x00),
0240     SMART_CMD(0x00),
0241     SMART_CMD(0x03), /* IF mode(1) */
0242     SMART_DAT(0x01), /* 8bit smart mode(8-8),high speed write mode */
0243     SMART_DAT(0x30),
0244     SMART_CMD(0x07),
0245     SMART_CMD(0x00), /* RAM Write Mode */
0246     SMART_DAT(0x00),
0247     SMART_DAT(0x03),
0248     SMART_CMD(0x00),
0249 
0250     /* DISPLAY Setting,  262K, fixed(NO scroll), no split screen */
0251     SMART_CMD(0x07),
0252     SMART_DAT(0x40), /* 16/18/19 BPP */
0253     SMART_DAT(0x00),
0254     SMART_CMD(0x00),
0255     SMART_CMD(0x08), /* BP, FP Seting, BP=2H, FP=3H */
0256     SMART_DAT(0x03),
0257     SMART_DAT(0x02),
0258     SMART_CMD(0x00),
0259     SMART_CMD(0x0C), /* IF mode(2), using internal clock & MPU */
0260     SMART_DAT(0x00),
0261     SMART_DAT(0x00),
0262     SMART_CMD(0x00),
0263     SMART_CMD(0x0D), /* Frame setting, 1Min. Frequence, 16CLK */
0264     SMART_DAT(0x00),
0265     SMART_DAT(0x10),
0266     SMART_CMD(0x00),
0267     SMART_CMD(0x12), /* Timing(1),ASW W=4CLK, ASW ST=1CLK */
0268     SMART_DAT(0x03),
0269     SMART_DAT(0x02),
0270     SMART_CMD(0x00),
0271     SMART_CMD(0x13), /* Timing(2),OEV ST=0.5CLK, OEV ED=1CLK */
0272     SMART_DAT(0x01),
0273     SMART_DAT(0x02),
0274     SMART_CMD(0x00),
0275     SMART_CMD(0x14), /* Timing(3), ASW HOLD=0.5CLK */
0276     SMART_DAT(0x00),
0277     SMART_DAT(0x00),
0278     SMART_CMD(0x00),
0279     SMART_CMD(0x15), /* Timing(4), CKV ST=0CLK, CKV ED=1CLK */
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     /* DISP RAM setting: 240*320 */
0321     SMART_CMD(0x04), /* HADDR, START 0 */
0322     SMART_CMD(0x06),
0323     SMART_DAT(0x00),
0324     SMART_DAT(0x00), /* x1,3 */
0325     SMART_CMD(0x04), /* HADDR,  END   4 */
0326     SMART_CMD(0x07),
0327     SMART_DAT(0x00),
0328     SMART_DAT(0xEF), /* x2, 7 */
0329     SMART_CMD(0x04), /* VADDR, START 8 */
0330     SMART_CMD(0x08),
0331     SMART_DAT(0x00), /* y1, 10 */
0332     SMART_DAT(0x00), /* y1, 11 */
0333     SMART_CMD(0x04), /* VADDR, END 12 */
0334     SMART_CMD(0x09),
0335     SMART_DAT(0x01), /* y2, 14 */
0336     SMART_DAT(0x3F), /* y2, 15 */
0337     SMART_CMD(0x02), /* RAM ADDR SETTING 16 */
0338     SMART_CMD(0x00),
0339     SMART_DAT(0x00),
0340     SMART_DAT(0x00), /* x1, 19 */
0341     SMART_CMD(0x02), /* RAM ADDR SETTING 20 */
0342     SMART_CMD(0x01),
0343     SMART_DAT(0x00), /* y1, 22 */
0344     SMART_DAT(0x00), /* y1, 23 */
0345 };
0346 
0347 static uint16_t panel_on[] = {
0348     /* Power-IC ON */
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     /* DISP ON */
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     /* write ram */
0416     SMART_CMD(0x02),
0417     SMART_CMD(0x02),
0418 
0419     /* write frame data */
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         /* L_LCLK_A0 and L_LCLK_RD active low */
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 /* CONFIG_FB_PXA || CONFIG_FB_PXA_MODULE */
0480 
0481 static void __init tavorevb_init(void)
0482 {
0483     /* initialize MFP configurations */
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     /* Maintainer: Eric Miao <eric.miao@marvell.com> */
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