^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * linux/arch/arm/mach-pxa/tavorevb.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Support for the Marvell PXA930 Evaluation Board
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (C) 2007-2008 Marvell International Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/platform_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/clk.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/gpio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/smc91x.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/pwm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/pwm_backlight.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <asm/mach-types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <asm/mach/arch.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include "pxa930.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/platform_data/video-pxafb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/platform_data/keypad-pxa27x.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include "devices.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include "generic.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) /* Tavor EVB MFP configurations */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) static mfp_cfg_t tavorevb_mfp_cfg[] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) /* Ethernet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) DF_nCS1_nCS3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) GPIO47_GPIO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) /* LCD */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) GPIO23_LCD_DD0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) GPIO24_LCD_DD1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) GPIO25_LCD_DD2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) GPIO26_LCD_DD3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) GPIO27_LCD_DD4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) GPIO28_LCD_DD5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) GPIO29_LCD_DD6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) GPIO44_LCD_DD7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) GPIO21_LCD_CS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) GPIO22_LCD_CS2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) GPIO17_LCD_FCLK_RD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) GPIO18_LCD_LCLK_A0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) GPIO19_LCD_PCLK_WR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) /* LCD Backlight */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) GPIO43_PWM3, /* primary backlight */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) GPIO32_PWM0, /* secondary backlight */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) /* Keypad */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) GPIO0_KP_MKIN_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) GPIO2_KP_MKIN_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) GPIO4_KP_MKIN_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) GPIO6_KP_MKIN_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) GPIO8_KP_MKIN_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) GPIO10_KP_MKIN_5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) GPIO12_KP_MKIN_6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) GPIO1_KP_MKOUT_0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) GPIO3_KP_MKOUT_1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) GPIO5_KP_MKOUT_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) GPIO7_KP_MKOUT_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) GPIO9_KP_MKOUT_4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) GPIO11_KP_MKOUT_5,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) GPIO13_KP_MKOUT_6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) GPIO14_KP_DKIN_2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) GPIO15_KP_DKIN_3,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define TAVOREVB_ETH_PHYS (0x14000000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) static struct resource smc91x_resources[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) [0] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .start = (TAVOREVB_ETH_PHYS + 0x300),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) .end = (TAVOREVB_ETH_PHYS + 0xfffff),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) .flags = IORESOURCE_MEM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) [1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) .start = PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO47)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) .end = PXA_GPIO_TO_IRQ(mfp_to_gpio(MFP_PIN_GPIO47)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) static struct smc91x_platdata tavorevb_smc91x_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT | SMC91X_USE_DMA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) static struct platform_device smc91x_device = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) .name = "smc91x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) .id = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) .num_resources = ARRAY_SIZE(smc91x_resources),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) .resource = smc91x_resources,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) .platform_data = &tavorevb_smc91x_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) static const unsigned int tavorevb_matrix_key_map[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) /* KEY(row, col, key_code) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) KEY(0, 4, KEY_A), KEY(0, 5, KEY_B), KEY(0, 6, KEY_C),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) KEY(1, 4, KEY_E), KEY(1, 5, KEY_F), KEY(1, 6, KEY_G),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) KEY(2, 4, KEY_I), KEY(2, 5, KEY_J), KEY(2, 6, KEY_K),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) KEY(3, 4, KEY_M), KEY(3, 5, KEY_N), KEY(3, 6, KEY_O),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) KEY(4, 5, KEY_R), KEY(4, 6, KEY_S),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) KEY(5, 4, KEY_U), KEY(5, 4, KEY_V), KEY(5, 6, KEY_W),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) KEY(6, 4, KEY_Y), KEY(6, 5, KEY_Z),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) KEY(0, 3, KEY_0), KEY(2, 0, KEY_1), KEY(2, 1, KEY_2), KEY(2, 2, KEY_3),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) KEY(2, 3, KEY_4), KEY(1, 0, KEY_5), KEY(1, 1, KEY_6), KEY(1, 2, KEY_7),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) KEY(1, 3, KEY_8), KEY(0, 2, KEY_9),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) KEY(6, 6, KEY_SPACE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) KEY(0, 0, KEY_KPASTERISK), /* * */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) KEY(0, 1, KEY_KPDOT), /* # */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) KEY(4, 1, KEY_UP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) KEY(4, 3, KEY_DOWN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) KEY(4, 0, KEY_LEFT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) KEY(4, 2, KEY_RIGHT),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) KEY(6, 0, KEY_HOME),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) KEY(3, 2, KEY_END),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) KEY(6, 1, KEY_DELETE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) KEY(5, 2, KEY_BACK),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) KEY(6, 3, KEY_CAPSLOCK), /* KEY_LEFTSHIFT), */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) KEY(4, 4, KEY_ENTER), /* scroll push */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) KEY(6, 2, KEY_ENTER), /* keypad action */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) KEY(3, 1, KEY_SEND),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) KEY(5, 3, KEY_RECORD),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) KEY(5, 0, KEY_VOLUMEUP),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) KEY(5, 1, KEY_VOLUMEDOWN),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) KEY(3, 0, KEY_F22), /* soft1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) KEY(3, 3, KEY_F23), /* soft2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) static struct matrix_keymap_data tavorevb_matrix_keymap_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) .keymap = tavorevb_matrix_key_map,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) .keymap_size = ARRAY_SIZE(tavorevb_matrix_key_map),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) static struct pxa27x_keypad_platform_data tavorevb_keypad_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) .matrix_key_rows = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) .matrix_key_cols = 7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) .matrix_keymap_data = &tavorevb_matrix_keymap_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) .debounce_interval = 30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) static void __init tavorevb_init_keypad(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) pxa_set_keypad_info(&tavorevb_keypad_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) static inline void tavorevb_init_keypad(void) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #endif /* CONFIG_KEYBOARD_PXA27x || CONFIG_KEYBOARD_PXA27x_MODULE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) static struct pwm_lookup tavorevb_pwm_lookup[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) PWM_LOOKUP("pxa27x-pwm.0", 1, "pwm-backlight.0", NULL, 100000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) PWM_POLARITY_NORMAL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) PWM_LOOKUP("pxa27x-pwm.0", 0, "pwm-backlight.1", NULL, 100000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) PWM_POLARITY_NORMAL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) static struct platform_pwm_backlight_data tavorevb_backlight_data[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) [0] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) /* primary backlight */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) .max_brightness = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) .dft_brightness = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) [1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) /* secondary backlight */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) .max_brightness = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) .dft_brightness = 100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) static struct platform_device tavorevb_backlight_devices[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) [0] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) .name = "pwm-backlight",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) .id = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) .platform_data = &tavorevb_backlight_data[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) [1] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) .name = "pwm-backlight",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) .id = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) .dev = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) .platform_data = &tavorevb_backlight_data[1],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) static uint16_t panel_init[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) /* DSTB OUT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) SMART_CMD_NOOP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) SMART_DELAY(1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) SMART_CMD_NOOP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) SMART_DELAY(1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) SMART_CMD_NOOP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) SMART_DELAY(1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) /* STB OUT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) SMART_CMD(0x1D),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) SMART_DAT(0x05),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) SMART_DELAY(1),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) /* P-ON Init sequence */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) SMART_CMD(0x00), /* OSC ON */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) SMART_DAT(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) SMART_CMD(0x01), /* SOURCE DRIVER SHIFT DIRECTION and display RAM setting */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) SMART_DAT(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) SMART_DAT(0x27),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) SMART_CMD(0x02), /* LINE INV */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) SMART_DAT(0x02),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) SMART_CMD(0x03), /* IF mode(1) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) SMART_DAT(0x01), /* 8bit smart mode(8-8),high speed write mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) SMART_DAT(0x30),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) SMART_CMD(0x07),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) SMART_CMD(0x00), /* RAM Write Mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) SMART_DAT(0x03),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) /* DISPLAY Setting, 262K, fixed(NO scroll), no split screen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) SMART_CMD(0x07),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) SMART_DAT(0x40), /* 16/18/19 BPP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) SMART_CMD(0x08), /* BP, FP Seting, BP=2H, FP=3H */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) SMART_DAT(0x03),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) SMART_DAT(0x02),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) SMART_CMD(0x0C), /* IF mode(2), using internal clock & MPU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) SMART_CMD(0x0D), /* Frame setting, 1Min. Frequence, 16CLK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) SMART_DAT(0x10),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) SMART_CMD(0x12), /* Timing(1),ASW W=4CLK, ASW ST=1CLK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) SMART_DAT(0x03),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) SMART_DAT(0x02),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) SMART_CMD(0x13), /* Timing(2),OEV ST=0.5CLK, OEV ED=1CLK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) SMART_DAT(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) SMART_DAT(0x02),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) SMART_CMD(0x14), /* Timing(3), ASW HOLD=0.5CLK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) SMART_CMD(0x15), /* Timing(4), CKV ST=0CLK, CKV ED=1CLK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) SMART_DAT(0x20),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) SMART_CMD(0x1C),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) SMART_CMD(0x03),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) SMART_DAT(0x04),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) SMART_DAT(0x03),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) SMART_CMD(0x03),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) SMART_CMD(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) SMART_DAT(0x03),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) SMART_DAT(0x04),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) SMART_CMD(0x03),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) SMART_CMD(0x02),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) SMART_DAT(0x04),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) SMART_DAT(0x03),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) SMART_CMD(0x03),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) SMART_CMD(0x03),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) SMART_DAT(0x03),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) SMART_DAT(0x03),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) SMART_CMD(0x03),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) SMART_CMD(0x04),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) SMART_DAT(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) SMART_DAT(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) SMART_CMD(0x03),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) SMART_CMD(0x05),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) SMART_CMD(0x04),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) SMART_CMD(0x02),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) SMART_CMD(0x04),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) SMART_CMD(0x03),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) SMART_DAT(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) SMART_DAT(0x3F),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) SMART_DELAY(0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) /* DISP RAM setting: 240*320 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) SMART_CMD(0x04), /* HADDR, START 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) SMART_CMD(0x06),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) SMART_DAT(0x00), /* x1,3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) SMART_CMD(0x04), /* HADDR, END 4 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) SMART_CMD(0x07),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) SMART_DAT(0xEF), /* x2, 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) SMART_CMD(0x04), /* VADDR, START 8 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) SMART_CMD(0x08),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) SMART_DAT(0x00), /* y1, 10 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) SMART_DAT(0x00), /* y1, 11 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) SMART_CMD(0x04), /* VADDR, END 12 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) SMART_CMD(0x09),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) SMART_DAT(0x01), /* y2, 14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) SMART_DAT(0x3F), /* y2, 15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) SMART_CMD(0x02), /* RAM ADDR SETTING 16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) SMART_DAT(0x00), /* x1, 19 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) SMART_CMD(0x02), /* RAM ADDR SETTING 20 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) SMART_CMD(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) SMART_DAT(0x00), /* y1, 22 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) SMART_DAT(0x00), /* y1, 23 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) static uint16_t panel_on[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) /* Power-IC ON */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) SMART_CMD(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) SMART_CMD(0x02),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) SMART_DAT(0x07),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) SMART_DAT(0x7D),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) SMART_CMD(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) SMART_CMD(0x03),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) SMART_DAT(0x05),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) SMART_CMD(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) SMART_CMD(0x04),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) SMART_CMD(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) SMART_CMD(0x05),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) SMART_DAT(0x15),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) SMART_CMD(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) SMART_DAT(0xC0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) SMART_DAT(0x10),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) SMART_DELAY(30),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) /* DISP ON */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) SMART_CMD(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) SMART_CMD(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) SMART_DAT(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) SMART_CMD(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) SMART_DAT(0xFF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) SMART_DAT(0xFE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) SMART_DELAY(150),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) static uint16_t panel_off[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) SMART_CMD(0x1E),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) SMART_DAT(0x0A),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) SMART_CMD(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) SMART_DAT(0xFF),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) SMART_DAT(0xEE),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) SMART_CMD(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) SMART_DAT(0xF8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) SMART_DAT(0x12),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) SMART_CMD(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) SMART_DAT(0xE8),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) SMART_DAT(0x11),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) SMART_CMD(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) SMART_DAT(0xC0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) SMART_DAT(0x11),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) SMART_CMD(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) SMART_DAT(0x40),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) SMART_DAT(0x11),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) SMART_CMD(0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) SMART_CMD(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) SMART_DAT(0x00),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) SMART_DAT(0x10),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) static uint16_t update_framedata[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) /* write ram */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) SMART_CMD(0x02),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) SMART_CMD(0x02),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) /* write frame data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) SMART_CMD_WRITE_FRAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) static void ltm020d550_lcd_power(int on, struct fb_var_screeninfo *var)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) struct fb_info *info = container_of(var, struct fb_info, var);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) if (on) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) pxafb_smart_queue(info, ARRAY_AND_SIZE(panel_init));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) pxafb_smart_queue(info, ARRAY_AND_SIZE(panel_on));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) pxafb_smart_queue(info, ARRAY_AND_SIZE(panel_off));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) if (pxafb_smart_flush(info))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) pr_err("%s: timed out\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) static void ltm020d550_update(struct fb_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) pxafb_smart_queue(info, ARRAY_AND_SIZE(update_framedata));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) pxafb_smart_flush(info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) static struct pxafb_mode_info toshiba_ltm020d550_modes[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) [0] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) .xres = 240,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) .yres = 320,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) .bpp = 16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) .a0csrd_set_hld = 30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) .a0cswr_set_hld = 30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) .wr_pulse_width = 30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) .rd_pulse_width = 170,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) .op_hold_time = 30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) .cmd_inh_time = 60,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) /* L_LCLK_A0 and L_LCLK_RD active low */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) .sync = FB_SYNC_HOR_HIGH_ACT |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) FB_SYNC_VERT_HIGH_ACT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) static struct pxafb_mach_info tavorevb_lcd_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) .modes = toshiba_ltm020d550_modes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) .num_modes = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) .lcd_conn = LCD_SMART_PANEL_8BPP | LCD_PCLK_EDGE_FALL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) .pxafb_lcd_power = ltm020d550_lcd_power,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) .smart_update = ltm020d550_update,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) static void __init tavorevb_init_lcd(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) pwm_add_table(tavorevb_pwm_lookup, ARRAY_SIZE(tavorevb_pwm_lookup));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) platform_device_register(&tavorevb_backlight_devices[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) platform_device_register(&tavorevb_backlight_devices[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) pxa_set_fb_info(NULL, &tavorevb_lcd_info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) static inline void tavorevb_init_lcd(void) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) #endif /* CONFIG_FB_PXA || CONFIG_FB_PXA_MODULE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) static void __init tavorevb_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) /* initialize MFP configurations */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) pxa3xx_mfp_config(ARRAY_AND_SIZE(tavorevb_mfp_cfg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) pxa_set_ffuart_info(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) pxa_set_btuart_info(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) pxa_set_stuart_info(NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) platform_device_register(&smc91x_device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) tavorevb_init_lcd();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) tavorevb_init_keypad();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) MACHINE_START(TAVOREVB, "PXA930 Evaluation Board (aka TavorEVB)")
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) /* Maintainer: Eric Miao <eric.miao@marvell.com> */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) .atag_offset = 0x100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) .map_io = pxa3xx_map_io,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) .nr_irqs = PXA_NR_IRQS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) .init_irq = pxa3xx_init_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) .handle_irq = pxa3xx_handle_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) .init_time = pxa_timer_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) .init_machine = tavorevb_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) .restart = pxa_restart,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) MACHINE_END