cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

tavorevb.c (11662B)


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