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

palmtx.c (9627B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Hardware definitions for PalmTX
      4 *
      5 * Author:     Marek Vasut <marek.vasut@gmail.com>
      6 *
      7 * Based on work of:
      8 *		Alex Osborne <ato@meshy.org>
      9 *		Cristiano P. <cristianop@users.sourceforge.net>
     10 *		Jan Herman <2hp@seznam.cz>
     11 *		Michal Hrusecky
     12 *
     13 * (find more info at www.hackndev.com)
     14 */
     15
     16#include <linux/platform_device.h>
     17#include <linux/delay.h>
     18#include <linux/irq.h>
     19#include <linux/gpio_keys.h>
     20#include <linux/input.h>
     21#include <linux/pda_power.h>
     22#include <linux/pwm_backlight.h>
     23#include <linux/gpio.h>
     24#include <linux/wm97xx.h>
     25#include <linux/power_supply.h>
     26#include <linux/mtd/platnand.h>
     27#include <linux/mtd/mtd.h>
     28#include <linux/mtd/physmap.h>
     29
     30#include <asm/mach-types.h>
     31#include <asm/mach/arch.h>
     32#include <asm/mach/map.h>
     33
     34#include "pxa27x.h"
     35#include <linux/platform_data/asoc-pxa.h>
     36#include "palmtx.h"
     37#include <linux/platform_data/mmc-pxamci.h>
     38#include <linux/platform_data/video-pxafb.h>
     39#include <linux/platform_data/irda-pxaficp.h>
     40#include <linux/platform_data/keypad-pxa27x.h>
     41#include "udc.h"
     42#include <linux/platform_data/asoc-palm27x.h>
     43#include "palm27x.h"
     44
     45#include "generic.h"
     46#include "devices.h"
     47
     48/******************************************************************************
     49 * Pin configuration
     50 ******************************************************************************/
     51static unsigned long palmtx_pin_config[] __initdata = {
     52	/* MMC */
     53	GPIO32_MMC_CLK,
     54	GPIO92_MMC_DAT_0,
     55	GPIO109_MMC_DAT_1,
     56	GPIO110_MMC_DAT_2,
     57	GPIO111_MMC_DAT_3,
     58	GPIO112_MMC_CMD,
     59	GPIO14_GPIO,	/* SD detect */
     60	GPIO114_GPIO,	/* SD power */
     61	GPIO115_GPIO,	/* SD r/o switch */
     62
     63	/* AC97 */
     64	GPIO28_AC97_BITCLK,
     65	GPIO29_AC97_SDATA_IN_0,
     66	GPIO30_AC97_SDATA_OUT,
     67	GPIO31_AC97_SYNC,
     68	GPIO89_AC97_SYSCLK,
     69	GPIO95_AC97_nRESET,
     70
     71	/* IrDA */
     72	GPIO40_GPIO,	/* ir disable */
     73	GPIO46_FICP_RXD,
     74	GPIO47_FICP_TXD,
     75
     76	/* PWM */
     77	GPIO16_PWM0_OUT,
     78
     79	/* USB */
     80	GPIO13_GPIO,	/* usb detect */
     81	GPIO93_GPIO,	/* usb power */
     82
     83	/* PCMCIA */
     84	GPIO48_nPOE,
     85	GPIO49_nPWE,
     86	GPIO50_nPIOR,
     87	GPIO51_nPIOW,
     88	GPIO85_nPCE_1,
     89	GPIO54_nPCE_2,
     90	GPIO79_PSKTSEL,
     91	GPIO55_nPREG,
     92	GPIO56_nPWAIT,
     93	GPIO57_nIOIS16,
     94	GPIO94_GPIO,	/* wifi power 1 */
     95	GPIO108_GPIO,	/* wifi power 2 */
     96	GPIO116_GPIO,	/* wifi ready */
     97
     98	/* MATRIX KEYPAD */
     99	GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
    100	GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
    101	GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
    102	GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
    103	GPIO103_KP_MKOUT_0,
    104	GPIO104_KP_MKOUT_1,
    105	GPIO105_KP_MKOUT_2,
    106
    107	/* LCD */
    108	GPIOxx_LCD_TFT_16BPP,
    109
    110	/* FFUART */
    111	GPIO34_FFUART_RXD,
    112	GPIO39_FFUART_TXD,
    113
    114	/* NAND */
    115	GPIO15_nCS_1,
    116	GPIO18_RDY,
    117
    118	/* MISC. */
    119	GPIO10_GPIO,	/* hotsync button */
    120	GPIO12_GPIO,	/* power detect */
    121	GPIO107_GPIO,	/* earphone detect */
    122};
    123
    124/******************************************************************************
    125 * NOR Flash
    126 ******************************************************************************/
    127#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
    128static struct mtd_partition palmtx_partitions[] = {
    129	{
    130		.name		= "Flash",
    131		.offset		= 0x00000000,
    132		.size		= MTDPART_SIZ_FULL,
    133		.mask_flags	= 0
    134	}
    135};
    136
    137static struct physmap_flash_data palmtx_flash_data[] = {
    138	{
    139		.width		= 2,			/* bankwidth in bytes */
    140		.parts		= palmtx_partitions,
    141		.nr_parts	= ARRAY_SIZE(palmtx_partitions)
    142	}
    143};
    144
    145static struct resource palmtx_flash_resource = {
    146	.start	= PXA_CS0_PHYS,
    147	.end	= PXA_CS0_PHYS + SZ_8M - 1,
    148	.flags	= IORESOURCE_MEM,
    149};
    150
    151static struct platform_device palmtx_flash = {
    152	.name		= "physmap-flash",
    153	.id		= 0,
    154	.resource	= &palmtx_flash_resource,
    155	.num_resources	= 1,
    156	.dev 		= {
    157		.platform_data = palmtx_flash_data,
    158	},
    159};
    160
    161static void __init palmtx_nor_init(void)
    162{
    163	platform_device_register(&palmtx_flash);
    164}
    165#else
    166static inline void palmtx_nor_init(void) {}
    167#endif
    168
    169/******************************************************************************
    170 * GPIO keyboard
    171 ******************************************************************************/
    172#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
    173static const unsigned int palmtx_matrix_keys[] = {
    174	KEY(0, 0, KEY_POWER),
    175	KEY(0, 1, KEY_F1),
    176	KEY(0, 2, KEY_ENTER),
    177
    178	KEY(1, 0, KEY_F2),
    179	KEY(1, 1, KEY_F3),
    180	KEY(1, 2, KEY_F4),
    181
    182	KEY(2, 0, KEY_UP),
    183	KEY(2, 2, KEY_DOWN),
    184
    185	KEY(3, 0, KEY_RIGHT),
    186	KEY(3, 2, KEY_LEFT),
    187};
    188
    189static struct matrix_keymap_data palmtx_matrix_keymap_data = {
    190	.keymap			= palmtx_matrix_keys,
    191	.keymap_size		= ARRAY_SIZE(palmtx_matrix_keys),
    192};
    193
    194static struct pxa27x_keypad_platform_data palmtx_keypad_platform_data = {
    195	.matrix_key_rows	= 4,
    196	.matrix_key_cols	= 3,
    197	.matrix_keymap_data	= &palmtx_matrix_keymap_data,
    198
    199	.debounce_interval	= 30,
    200};
    201
    202static void __init palmtx_kpc_init(void)
    203{
    204	pxa_set_keypad_info(&palmtx_keypad_platform_data);
    205}
    206#else
    207static inline void palmtx_kpc_init(void) {}
    208#endif
    209
    210/******************************************************************************
    211 * GPIO keys
    212 ******************************************************************************/
    213#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
    214static struct gpio_keys_button palmtx_pxa_buttons[] = {
    215	{KEY_F8, GPIO_NR_PALMTX_HOTSYNC_BUTTON_N, 1, "HotSync Button" },
    216};
    217
    218static struct gpio_keys_platform_data palmtx_pxa_keys_data = {
    219	.buttons	= palmtx_pxa_buttons,
    220	.nbuttons	= ARRAY_SIZE(palmtx_pxa_buttons),
    221};
    222
    223static struct platform_device palmtx_pxa_keys = {
    224	.name	= "gpio-keys",
    225	.id	= -1,
    226	.dev	= {
    227		.platform_data = &palmtx_pxa_keys_data,
    228	},
    229};
    230
    231static void __init palmtx_keys_init(void)
    232{
    233	platform_device_register(&palmtx_pxa_keys);
    234}
    235#else
    236static inline void palmtx_keys_init(void) {}
    237#endif
    238
    239/******************************************************************************
    240 * NAND Flash
    241 ******************************************************************************/
    242#if defined(CONFIG_MTD_NAND_PLATFORM) || \
    243	defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
    244static void palmtx_nand_cmd_ctl(struct nand_chip *this, int cmd,
    245				unsigned int ctrl)
    246{
    247	char __iomem *nandaddr = this->legacy.IO_ADDR_W;
    248
    249	if (cmd == NAND_CMD_NONE)
    250		return;
    251
    252	if (ctrl & NAND_CLE)
    253		writeb(cmd, PALMTX_NAND_CLE_VIRT);
    254	else if (ctrl & NAND_ALE)
    255		writeb(cmd, PALMTX_NAND_ALE_VIRT);
    256	else
    257		writeb(cmd, nandaddr);
    258}
    259
    260static struct mtd_partition palmtx_partition_info[] = {
    261	[0] = {
    262		.name	= "palmtx-0",
    263		.offset	= 0,
    264		.size	= MTDPART_SIZ_FULL
    265	},
    266};
    267
    268struct platform_nand_data palmtx_nand_platdata = {
    269	.chip	= {
    270		.nr_chips		= 1,
    271		.chip_offset		= 0,
    272		.nr_partitions		= ARRAY_SIZE(palmtx_partition_info),
    273		.partitions		= palmtx_partition_info,
    274		.chip_delay		= 20,
    275	},
    276	.ctrl	= {
    277		.cmd_ctrl	= palmtx_nand_cmd_ctl,
    278	},
    279};
    280
    281static struct resource palmtx_nand_resource[] = {
    282	[0]	= {
    283		.start	= PXA_CS1_PHYS,
    284		.end	= PXA_CS1_PHYS + SZ_1M - 1,
    285		.flags	= IORESOURCE_MEM,
    286	},
    287};
    288
    289static struct platform_device palmtx_nand = {
    290	.name		= "gen_nand",
    291	.num_resources	= ARRAY_SIZE(palmtx_nand_resource),
    292	.resource	= palmtx_nand_resource,
    293	.id		= -1,
    294	.dev		= {
    295		.platform_data	= &palmtx_nand_platdata,
    296	}
    297};
    298
    299static void __init palmtx_nand_init(void)
    300{
    301	platform_device_register(&palmtx_nand);
    302}
    303#else
    304static inline void palmtx_nand_init(void) {}
    305#endif
    306
    307/******************************************************************************
    308 * Machine init
    309 ******************************************************************************/
    310static struct map_desc palmtx_io_desc[] __initdata = {
    311{
    312	.virtual	= (unsigned long)PALMTX_PCMCIA_VIRT,
    313	.pfn		= __phys_to_pfn(PALMTX_PCMCIA_PHYS),
    314	.length		= PALMTX_PCMCIA_SIZE,
    315	.type		= MT_DEVICE,
    316}, {
    317	.virtual	= (unsigned long)PALMTX_NAND_ALE_VIRT,
    318	.pfn		= __phys_to_pfn(PALMTX_NAND_ALE_PHYS),
    319	.length		= SZ_1M,
    320	.type		= MT_DEVICE,
    321}, {
    322	.virtual	= (unsigned long)PALMTX_NAND_CLE_VIRT,
    323	.pfn		= __phys_to_pfn(PALMTX_NAND_CLE_PHYS),
    324	.length		= SZ_1M,
    325	.type		= MT_DEVICE,
    326}
    327};
    328
    329static void __init palmtx_map_io(void)
    330{
    331	pxa27x_map_io();
    332	iotable_init(palmtx_io_desc, ARRAY_SIZE(palmtx_io_desc));
    333}
    334
    335static struct gpiod_lookup_table palmtx_mci_gpio_table = {
    336	.dev_id = "pxa2xx-mci.0",
    337	.table = {
    338		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTX_SD_DETECT_N,
    339			    "cd", GPIO_ACTIVE_LOW),
    340		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTX_SD_READONLY,
    341			    "wp", GPIO_ACTIVE_LOW),
    342		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTX_SD_POWER,
    343			    "power", GPIO_ACTIVE_HIGH),
    344		{ },
    345	},
    346};
    347
    348static struct gpiod_lookup_table palmtx_wm97xx_touch_gpio_table = {
    349	.dev_id = "wm97xx-touch",
    350	.table = {
    351		GPIO_LOOKUP("gpio-pxa", 27, "touch", GPIO_ACTIVE_HIGH),
    352		{ },
    353	},
    354};
    355
    356static void __init palmtx_init(void)
    357{
    358	pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config));
    359	pxa_set_ffuart_info(NULL);
    360	pxa_set_btuart_info(NULL);
    361	pxa_set_stuart_info(NULL);
    362
    363	palm27x_mmc_init(&palmtx_mci_gpio_table);
    364	gpiod_add_lookup_table(&palmtx_wm97xx_touch_gpio_table);
    365	palm27x_pm_init(PALMTX_STR_BASE);
    366	palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
    367	palm27x_udc_init(GPIO_NR_PALMTX_USB_DETECT_N,
    368			GPIO_NR_PALMTX_USB_PULLUP, 1);
    369	palm27x_irda_init(GPIO_NR_PALMTX_IR_DISABLE);
    370	palm27x_ac97_init(PALMTX_BAT_MIN_VOLTAGE, PALMTX_BAT_MAX_VOLTAGE,
    371			GPIO_NR_PALMTX_EARPHONE_DETECT, 95);
    372	palm27x_pwm_init(GPIO_NR_PALMTX_BL_POWER, GPIO_NR_PALMTX_LCD_POWER);
    373	palm27x_power_init(GPIO_NR_PALMTX_POWER_DETECT, -1);
    374	palm27x_pmic_init();
    375	palmtx_kpc_init();
    376	palmtx_keys_init();
    377	palmtx_nor_init();
    378	palmtx_nand_init();
    379}
    380
    381MACHINE_START(PALMTX, "Palm T|X")
    382	.atag_offset	= 0x100,
    383	.map_io		= palmtx_map_io,
    384	.nr_irqs	= PXA_NR_IRQS,
    385	.init_irq	= pxa27x_init_irq,
    386	.handle_irq	= pxa27x_handle_irq,
    387	.init_time	= pxa_timer_init,
    388	.init_machine	= palmtx_init,
    389	.restart	= pxa_restart,
    390MACHINE_END