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

palmld.c (9852B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Hardware definitions for Palm LifeDrive
      4 *
      5 * Author:     Marek Vasut <marek.vasut@gmail.com>
      6 *
      7 * Based on work of:
      8 *		Alex Osborne <ato@meshy.org>
      9 *
     10 * (find more info at www.hackndev.com)
     11 */
     12
     13#include <linux/platform_device.h>
     14#include <linux/delay.h>
     15#include <linux/irq.h>
     16#include <linux/gpio_keys.h>
     17#include <linux/input.h>
     18#include <linux/pda_power.h>
     19#include <linux/pwm_backlight.h>
     20#include <linux/gpio.h>
     21#include <linux/wm97xx.h>
     22#include <linux/power_supply.h>
     23#include <linux/mtd/mtd.h>
     24#include <linux/mtd/partitions.h>
     25#include <linux/mtd/physmap.h>
     26
     27#include <asm/mach-types.h>
     28#include <asm/mach/arch.h>
     29#include <asm/mach/map.h>
     30
     31#include "pxa27x.h"
     32#include "palmld.h"
     33#include <linux/platform_data/asoc-pxa.h>
     34#include <linux/platform_data/mmc-pxamci.h>
     35#include <linux/platform_data/video-pxafb.h>
     36#include <linux/platform_data/irda-pxaficp.h>
     37#include <linux/platform_data/keypad-pxa27x.h>
     38#include <linux/platform_data/asoc-palm27x.h>
     39#include "palm27x.h"
     40
     41#include "generic.h"
     42#include "devices.h"
     43
     44/******************************************************************************
     45 * Pin configuration
     46 ******************************************************************************/
     47static unsigned long palmld_pin_config[] __initdata = {
     48	/* MMC */
     49	GPIO32_MMC_CLK,
     50	GPIO92_MMC_DAT_0,
     51	GPIO109_MMC_DAT_1,
     52	GPIO110_MMC_DAT_2,
     53	GPIO111_MMC_DAT_3,
     54	GPIO112_MMC_CMD,
     55	GPIO14_GPIO,	/* SD detect */
     56	GPIO114_GPIO,	/* SD power */
     57	GPIO116_GPIO,	/* SD r/o switch */
     58
     59	/* AC97 */
     60	GPIO28_AC97_BITCLK,
     61	GPIO29_AC97_SDATA_IN_0,
     62	GPIO30_AC97_SDATA_OUT,
     63	GPIO31_AC97_SYNC,
     64	GPIO89_AC97_SYSCLK,
     65	GPIO95_AC97_nRESET,
     66
     67	/* IrDA */
     68	GPIO108_GPIO,	/* ir disable */
     69	GPIO46_FICP_RXD,
     70	GPIO47_FICP_TXD,
     71
     72	/* MATRIX KEYPAD */
     73	GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
     74	GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
     75	GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
     76	GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
     77	GPIO103_KP_MKOUT_0,
     78	GPIO104_KP_MKOUT_1,
     79	GPIO105_KP_MKOUT_2,
     80
     81	/* LCD */
     82	GPIOxx_LCD_TFT_16BPP,
     83
     84	/* PWM */
     85	GPIO16_PWM0_OUT,
     86
     87	/* GPIO KEYS */
     88	GPIO10_GPIO,	/* hotsync button */
     89	GPIO12_GPIO,	/* power switch */
     90	GPIO15_GPIO,	/* lock switch */
     91
     92	/* LEDs */
     93	GPIO52_GPIO,	/* green led */
     94	GPIO94_GPIO,	/* orange led */
     95
     96	/* PCMCIA */
     97	GPIO48_nPOE,
     98	GPIO49_nPWE,
     99	GPIO50_nPIOR,
    100	GPIO51_nPIOW,
    101	GPIO85_nPCE_1,
    102	GPIO54_nPCE_2,
    103	GPIO79_PSKTSEL,
    104	GPIO55_nPREG,
    105	GPIO56_nPWAIT,
    106	GPIO57_nIOIS16,
    107	GPIO36_GPIO,	/* wifi power */
    108	GPIO38_GPIO,	/* wifi ready */
    109	GPIO81_GPIO,	/* wifi reset */
    110
    111	/* FFUART */
    112	GPIO34_FFUART_RXD,
    113	GPIO39_FFUART_TXD,
    114
    115	/* HDD */
    116	GPIO98_GPIO,	/* HDD reset */
    117	GPIO115_GPIO,	/* HDD power */
    118
    119	/* MISC */
    120	GPIO13_GPIO,	/* earphone detect */
    121};
    122
    123/******************************************************************************
    124 * NOR Flash
    125 ******************************************************************************/
    126#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
    127static struct mtd_partition palmld_partitions[] = {
    128	{
    129		.name		= "Flash",
    130		.offset		= 0x00000000,
    131		.size		= MTDPART_SIZ_FULL,
    132		.mask_flags	= 0
    133	}
    134};
    135
    136static struct physmap_flash_data palmld_flash_data[] = {
    137	{
    138		.width		= 2,			/* bankwidth in bytes */
    139		.parts		= palmld_partitions,
    140		.nr_parts	= ARRAY_SIZE(palmld_partitions)
    141	}
    142};
    143
    144static struct resource palmld_flash_resource = {
    145	.start	= PXA_CS0_PHYS,
    146	.end	= PXA_CS0_PHYS + SZ_4M - 1,
    147	.flags	= IORESOURCE_MEM,
    148};
    149
    150static struct platform_device palmld_flash = {
    151	.name		= "physmap-flash",
    152	.id		= 0,
    153	.resource	= &palmld_flash_resource,
    154	.num_resources	= 1,
    155	.dev 		= {
    156		.platform_data = palmld_flash_data,
    157	},
    158};
    159
    160static void __init palmld_nor_init(void)
    161{
    162	platform_device_register(&palmld_flash);
    163}
    164#else
    165static inline void palmld_nor_init(void) {}
    166#endif
    167
    168/******************************************************************************
    169 * GPIO keyboard
    170 ******************************************************************************/
    171#if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
    172static const unsigned int palmld_matrix_keys[] = {
    173	KEY(0, 1, KEY_F2),
    174	KEY(0, 2, KEY_UP),
    175
    176	KEY(1, 0, KEY_F3),
    177	KEY(1, 1, KEY_F4),
    178	KEY(1, 2, KEY_RIGHT),
    179
    180	KEY(2, 0, KEY_F1),
    181	KEY(2, 1, KEY_F5),
    182	KEY(2, 2, KEY_DOWN),
    183
    184	KEY(3, 0, KEY_F6),
    185	KEY(3, 1, KEY_ENTER),
    186	KEY(3, 2, KEY_LEFT),
    187};
    188
    189static struct matrix_keymap_data palmld_matrix_keymap_data = {
    190	.keymap			= palmld_matrix_keys,
    191	.keymap_size		= ARRAY_SIZE(palmld_matrix_keys),
    192};
    193
    194static struct pxa27x_keypad_platform_data palmld_keypad_platform_data = {
    195	.matrix_key_rows	= 4,
    196	.matrix_key_cols	= 3,
    197	.matrix_keymap_data	= &palmld_matrix_keymap_data,
    198
    199	.debounce_interval	= 30,
    200};
    201
    202static void __init palmld_kpc_init(void)
    203{
    204	pxa_set_keypad_info(&palmld_keypad_platform_data);
    205}
    206#else
    207static inline void palmld_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 palmld_pxa_buttons[] = {
    215	{KEY_F8, GPIO_NR_PALMLD_HOTSYNC_BUTTON_N, 1, "HotSync Button" },
    216	{KEY_F9, GPIO_NR_PALMLD_LOCK_SWITCH, 0, "Lock Switch" },
    217	{KEY_POWER, GPIO_NR_PALMLD_POWER_SWITCH, 0, "Power Switch" },
    218};
    219
    220static struct gpio_keys_platform_data palmld_pxa_keys_data = {
    221	.buttons	= palmld_pxa_buttons,
    222	.nbuttons	= ARRAY_SIZE(palmld_pxa_buttons),
    223};
    224
    225static struct platform_device palmld_pxa_keys = {
    226	.name	= "gpio-keys",
    227	.id	= -1,
    228	.dev	= {
    229		.platform_data = &palmld_pxa_keys_data,
    230	},
    231};
    232
    233static void __init palmld_keys_init(void)
    234{
    235	platform_device_register(&palmld_pxa_keys);
    236}
    237#else
    238static inline void palmld_keys_init(void) {}
    239#endif
    240
    241/******************************************************************************
    242 * LEDs
    243 ******************************************************************************/
    244#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
    245struct gpio_led gpio_leds[] = {
    246{
    247	.name			= "palmld:green:led",
    248	.default_trigger	= "none",
    249	.gpio			= GPIO_NR_PALMLD_LED_GREEN,
    250}, {
    251	.name			= "palmld:amber:led",
    252	.default_trigger	= "none",
    253	.gpio			= GPIO_NR_PALMLD_LED_AMBER,
    254},
    255};
    256
    257static struct gpio_led_platform_data gpio_led_info = {
    258	.leds		= gpio_leds,
    259	.num_leds	= ARRAY_SIZE(gpio_leds),
    260};
    261
    262static struct platform_device palmld_leds = {
    263	.name	= "leds-gpio",
    264	.id	= -1,
    265	.dev	= {
    266		.platform_data	= &gpio_led_info,
    267	}
    268};
    269
    270static void __init palmld_leds_init(void)
    271{
    272	platform_device_register(&palmld_leds);
    273}
    274#else
    275static inline void palmld_leds_init(void) {}
    276#endif
    277
    278/******************************************************************************
    279 * HDD
    280 ******************************************************************************/
    281#if defined(CONFIG_PATA_PALMLD) || defined(CONFIG_PATA_PALMLD_MODULE)
    282static struct resource palmld_ide_resources[] = {
    283	DEFINE_RES_MEM(PALMLD_IDE_PHYS, 0x1000),
    284};
    285
    286static struct platform_device palmld_ide_device = {
    287	.name		= "pata_palmld",
    288	.id		= -1,
    289	.resource	= palmld_ide_resources,
    290	.num_resources	= ARRAY_SIZE(palmld_ide_resources),
    291};
    292
    293static struct gpiod_lookup_table palmld_ide_gpio_table = {
    294	.dev_id = "pata_palmld",
    295	.table = {
    296		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMLD_IDE_PWEN,
    297			    "power", GPIO_ACTIVE_HIGH),
    298		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMLD_IDE_RESET,
    299			    "reset", GPIO_ACTIVE_LOW),
    300		{ },
    301	},
    302};
    303
    304static void __init palmld_ide_init(void)
    305{
    306	gpiod_add_lookup_table(&palmld_ide_gpio_table);
    307	platform_device_register(&palmld_ide_device);
    308}
    309#else
    310static inline void palmld_ide_init(void) {}
    311#endif
    312
    313/******************************************************************************
    314 * Machine init
    315 ******************************************************************************/
    316static struct map_desc palmld_io_desc[] __initdata = {
    317{
    318	.virtual	= PALMLD_IDE_VIRT,
    319	.pfn		= __phys_to_pfn(PALMLD_IDE_PHYS),
    320	.length		= PALMLD_IDE_SIZE,
    321	.type		= MT_DEVICE
    322},
    323{
    324	.virtual	= PALMLD_USB_VIRT,
    325	.pfn		= __phys_to_pfn(PALMLD_USB_PHYS),
    326	.length		= PALMLD_USB_SIZE,
    327	.type		= MT_DEVICE
    328},
    329};
    330
    331static void __init palmld_map_io(void)
    332{
    333	pxa27x_map_io();
    334	iotable_init(palmld_io_desc, ARRAY_SIZE(palmld_io_desc));
    335}
    336
    337static struct gpiod_lookup_table palmld_mci_gpio_table = {
    338	.dev_id = "pxa2xx-mci.0",
    339	.table = {
    340		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMLD_SD_DETECT_N,
    341			    "cd", GPIO_ACTIVE_LOW),
    342		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMLD_SD_READONLY,
    343			    "wp", GPIO_ACTIVE_LOW),
    344		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMLD_SD_POWER,
    345			    "power", GPIO_ACTIVE_HIGH),
    346		{ },
    347	},
    348};
    349
    350static struct gpiod_lookup_table palmld_wm97xx_touch_gpio_table = {
    351	.dev_id = "wm97xx-touch",
    352	.table = {
    353		GPIO_LOOKUP("gpio-pxa", 27, "touch", GPIO_ACTIVE_HIGH),
    354		{ },
    355	},
    356};
    357
    358static void __init palmld_init(void)
    359{
    360	pxa2xx_mfp_config(ARRAY_AND_SIZE(palmld_pin_config));
    361	pxa_set_ffuart_info(NULL);
    362	pxa_set_btuart_info(NULL);
    363	pxa_set_stuart_info(NULL);
    364
    365	palm27x_mmc_init(&palmld_mci_gpio_table);
    366	gpiod_add_lookup_table(&palmld_wm97xx_touch_gpio_table);
    367	palm27x_pm_init(PALMLD_STR_BASE);
    368	palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
    369	palm27x_irda_init(GPIO_NR_PALMLD_IR_DISABLE);
    370	palm27x_ac97_init(PALMLD_BAT_MIN_VOLTAGE, PALMLD_BAT_MAX_VOLTAGE,
    371			GPIO_NR_PALMLD_EARPHONE_DETECT, 95);
    372	palm27x_pwm_init(GPIO_NR_PALMLD_BL_POWER, GPIO_NR_PALMLD_LCD_POWER);
    373	palm27x_power_init(GPIO_NR_PALMLD_POWER_DETECT,
    374			GPIO_NR_PALMLD_USB_DETECT_N);
    375	palm27x_pmic_init();
    376	palmld_kpc_init();
    377	palmld_keys_init();
    378	palmld_nor_init();
    379	palmld_leds_init();
    380	palmld_ide_init();
    381}
    382
    383MACHINE_START(PALMLD, "Palm LifeDrive")
    384	.atag_offset	= 0x100,
    385	.map_io		= palmld_map_io,
    386	.nr_irqs	= PXA_NR_IRQS,
    387	.init_irq	= pxa27x_init_irq,
    388	.handle_irq	= pxa27x_handle_irq,
    389	.init_time	= pxa_timer_init,
    390	.init_machine	= palmld_init,
    391	.restart	= pxa_restart,
    392MACHINE_END