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

palmte2.c (10466B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Hardware definitions for Palm Tungsten|E2
      4 *
      5 * Author:
      6 *	Carlos Eduardo Medaglia Dyonisio <cadu@nerdfeliz.com>
      7 *
      8 * Rewrite for mainline:
      9 *	Marek Vasut <marek.vasut@gmail.com>
     10 *
     11 * (find more info at www.hackndev.com)
     12 */
     13
     14#include <linux/platform_device.h>
     15#include <linux/delay.h>
     16#include <linux/irq.h>
     17#include <linux/gpio_keys.h>
     18#include <linux/gpio/machine.h>
     19#include <linux/input.h>
     20#include <linux/pda_power.h>
     21#include <linux/pwm.h>
     22#include <linux/pwm_backlight.h>
     23#include <linux/gpio.h>
     24#include <linux/wm97xx.h>
     25#include <linux/power_supply.h>
     26
     27#include <asm/mach-types.h>
     28#include <asm/mach/arch.h>
     29#include <asm/mach/map.h>
     30
     31#include "pxa25x.h"
     32#include <linux/platform_data/asoc-pxa.h>
     33#include "palmte2.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 "udc.h"
     38#include <linux/platform_data/asoc-palm27x.h>
     39
     40#include "generic.h"
     41#include "devices.h"
     42
     43/******************************************************************************
     44 * Pin configuration
     45 ******************************************************************************/
     46static unsigned long palmte2_pin_config[] __initdata = {
     47	/* MMC */
     48	GPIO6_MMC_CLK,
     49	GPIO8_MMC_CS0,
     50	GPIO10_GPIO,	/* SD detect */
     51	GPIO55_GPIO,	/* SD power */
     52	GPIO51_GPIO,	/* SD r/o switch */
     53
     54	/* AC97 */
     55	GPIO28_AC97_BITCLK,
     56	GPIO29_AC97_SDATA_IN_0,
     57	GPIO30_AC97_SDATA_OUT,
     58	GPIO31_AC97_SYNC,
     59
     60	/* PWM */
     61	GPIO16_PWM0_OUT,
     62
     63	/* USB */
     64	GPIO15_GPIO,	/* usb detect */
     65	GPIO53_GPIO,	/* usb power */
     66
     67	/* IrDA */
     68	GPIO48_GPIO,	/* ir disable */
     69	GPIO46_FICP_RXD,
     70	GPIO47_FICP_TXD,
     71
     72	/* LCD */
     73	GPIOxx_LCD_TFT_16BPP,
     74
     75	/* GPIO KEYS */
     76	GPIO5_GPIO,	/* notes */
     77	GPIO7_GPIO,	/* tasks */
     78	GPIO11_GPIO,	/* calendar */
     79	GPIO13_GPIO,	/* contacts */
     80	GPIO14_GPIO,	/* center */
     81	GPIO19_GPIO,	/* left */
     82	GPIO20_GPIO,	/* right */
     83	GPIO21_GPIO,	/* down */
     84	GPIO22_GPIO,	/* up */
     85
     86	/* MISC */
     87	GPIO1_RST,	/* reset */
     88	GPIO4_GPIO,	/* Hotsync button */
     89	GPIO9_GPIO,	/* power detect */
     90	GPIO15_GPIO,	/* earphone detect */
     91	GPIO37_GPIO,	/* LCD power */
     92	GPIO56_GPIO,	/* Backlight power */
     93};
     94
     95/******************************************************************************
     96 * SD/MMC card controller
     97 ******************************************************************************/
     98static struct pxamci_platform_data palmte2_mci_platform_data = {
     99	.ocr_mask		= MMC_VDD_32_33 | MMC_VDD_33_34,
    100};
    101
    102static struct gpiod_lookup_table palmte2_mci_gpio_table = {
    103	.dev_id = "pxa2xx-mci.0",
    104	.table = {
    105		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTE2_SD_DETECT_N,
    106			    "cd", GPIO_ACTIVE_LOW),
    107		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTE2_SD_READONLY,
    108			    "wp", GPIO_ACTIVE_LOW),
    109		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTE2_SD_POWER,
    110			    "power", GPIO_ACTIVE_HIGH),
    111		{ },
    112	},
    113};
    114
    115#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
    116/******************************************************************************
    117 * GPIO keys
    118 ******************************************************************************/
    119static struct gpio_keys_button palmte2_pxa_buttons[] = {
    120	{KEY_F1,	GPIO_NR_PALMTE2_KEY_CONTACTS,	1, "Contacts" },
    121	{KEY_F2,	GPIO_NR_PALMTE2_KEY_CALENDAR,	1, "Calendar" },
    122	{KEY_F3,	GPIO_NR_PALMTE2_KEY_TASKS,	1, "Tasks" },
    123	{KEY_F4,	GPIO_NR_PALMTE2_KEY_NOTES,	1, "Notes" },
    124	{KEY_ENTER,	GPIO_NR_PALMTE2_KEY_CENTER,	1, "Center" },
    125	{KEY_LEFT,	GPIO_NR_PALMTE2_KEY_LEFT,	1, "Left" },
    126	{KEY_RIGHT,	GPIO_NR_PALMTE2_KEY_RIGHT,	1, "Right" },
    127	{KEY_DOWN,	GPIO_NR_PALMTE2_KEY_DOWN,	1, "Down" },
    128	{KEY_UP,	GPIO_NR_PALMTE2_KEY_UP,		1, "Up" },
    129};
    130
    131static struct gpio_keys_platform_data palmte2_pxa_keys_data = {
    132	.buttons	= palmte2_pxa_buttons,
    133	.nbuttons	= ARRAY_SIZE(palmte2_pxa_buttons),
    134};
    135
    136static struct platform_device palmte2_pxa_keys = {
    137	.name	= "gpio-keys",
    138	.id	= -1,
    139	.dev	= {
    140		.platform_data = &palmte2_pxa_keys_data,
    141	},
    142};
    143#endif
    144
    145/******************************************************************************
    146 * Backlight
    147 ******************************************************************************/
    148static struct pwm_lookup palmte2_pwm_lookup[] = {
    149	PWM_LOOKUP("pxa25x-pwm.0", 0, "pwm-backlight.0", NULL,
    150		   PALMTE2_PERIOD_NS, PWM_POLARITY_NORMAL),
    151};
    152
    153static struct gpio palmte_bl_gpios[] = {
    154	{ GPIO_NR_PALMTE2_BL_POWER, GPIOF_INIT_LOW, "Backlight power" },
    155	{ GPIO_NR_PALMTE2_LCD_POWER, GPIOF_INIT_LOW, "LCD power" },
    156};
    157
    158static int palmte2_backlight_init(struct device *dev)
    159{
    160	return gpio_request_array(ARRAY_AND_SIZE(palmte_bl_gpios));
    161}
    162
    163static int palmte2_backlight_notify(struct device *dev, int brightness)
    164{
    165	gpio_set_value(GPIO_NR_PALMTE2_BL_POWER, brightness);
    166	gpio_set_value(GPIO_NR_PALMTE2_LCD_POWER, brightness);
    167	return brightness;
    168}
    169
    170static void palmte2_backlight_exit(struct device *dev)
    171{
    172	gpio_free_array(ARRAY_AND_SIZE(palmte_bl_gpios));
    173}
    174
    175static struct platform_pwm_backlight_data palmte2_backlight_data = {
    176	.max_brightness	= PALMTE2_MAX_INTENSITY,
    177	.dft_brightness	= PALMTE2_MAX_INTENSITY,
    178	.init		= palmte2_backlight_init,
    179	.notify		= palmte2_backlight_notify,
    180	.exit		= palmte2_backlight_exit,
    181};
    182
    183static struct platform_device palmte2_backlight = {
    184	.name	= "pwm-backlight",
    185	.dev	= {
    186		.parent		= &pxa25x_device_pwm0.dev,
    187		.platform_data	= &palmte2_backlight_data,
    188	},
    189};
    190
    191/******************************************************************************
    192 * IrDA
    193 ******************************************************************************/
    194static struct pxaficp_platform_data palmte2_ficp_platform_data = {
    195	.gpio_pwdown		= GPIO_NR_PALMTE2_IR_DISABLE,
    196	.transceiver_cap	= IR_SIRMODE | IR_OFF,
    197};
    198
    199/******************************************************************************
    200 * UDC
    201 ******************************************************************************/
    202static struct gpiod_lookup_table palmte2_udc_gpiod_table = {
    203	.dev_id = "gpio-vbus",
    204	.table = {
    205		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTE2_USB_DETECT_N,
    206			    "vbus", GPIO_ACTIVE_LOW),
    207		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTE2_USB_PULLUP,
    208			    "pullup", GPIO_ACTIVE_HIGH),
    209		{ },
    210	},
    211};
    212
    213static struct platform_device palmte2_gpio_vbus = {
    214	.name	= "gpio-vbus",
    215	.id	= -1,
    216};
    217
    218/******************************************************************************
    219 * Power supply
    220 ******************************************************************************/
    221static int power_supply_init(struct device *dev)
    222{
    223	int ret;
    224
    225	ret = gpio_request(GPIO_NR_PALMTE2_POWER_DETECT, "CABLE_STATE_AC");
    226	if (ret)
    227		goto err1;
    228	ret = gpio_direction_input(GPIO_NR_PALMTE2_POWER_DETECT);
    229	if (ret)
    230		goto err2;
    231
    232	return 0;
    233
    234err2:
    235	gpio_free(GPIO_NR_PALMTE2_POWER_DETECT);
    236err1:
    237	return ret;
    238}
    239
    240static int palmte2_is_ac_online(void)
    241{
    242	return gpio_get_value(GPIO_NR_PALMTE2_POWER_DETECT);
    243}
    244
    245static void power_supply_exit(struct device *dev)
    246{
    247	gpio_free(GPIO_NR_PALMTE2_POWER_DETECT);
    248}
    249
    250static char *palmte2_supplicants[] = {
    251	"main-battery",
    252};
    253
    254static struct pda_power_pdata power_supply_info = {
    255	.init            = power_supply_init,
    256	.is_ac_online    = palmte2_is_ac_online,
    257	.exit            = power_supply_exit,
    258	.supplied_to     = palmte2_supplicants,
    259	.num_supplicants = ARRAY_SIZE(palmte2_supplicants),
    260};
    261
    262static struct platform_device power_supply = {
    263	.name = "pda-power",
    264	.id   = -1,
    265	.dev  = {
    266		.platform_data = &power_supply_info,
    267	},
    268};
    269
    270/******************************************************************************
    271 * WM97xx audio, battery
    272 ******************************************************************************/
    273static struct wm97xx_batt_pdata palmte2_batt_pdata = {
    274	.batt_aux	= WM97XX_AUX_ID3,
    275	.temp_aux	= WM97XX_AUX_ID2,
    276	.max_voltage	= PALMTE2_BAT_MAX_VOLTAGE,
    277	.min_voltage	= PALMTE2_BAT_MIN_VOLTAGE,
    278	.batt_mult	= 1000,
    279	.batt_div	= 414,
    280	.temp_mult	= 1,
    281	.temp_div	= 1,
    282	.batt_tech	= POWER_SUPPLY_TECHNOLOGY_LIPO,
    283	.batt_name	= "main-batt",
    284};
    285
    286static struct wm97xx_pdata palmte2_wm97xx_pdata = {
    287	.batt_pdata	= &palmte2_batt_pdata,
    288};
    289
    290static pxa2xx_audio_ops_t palmte2_ac97_pdata = {
    291	.codec_pdata	= { &palmte2_wm97xx_pdata, },
    292};
    293
    294static struct palm27x_asoc_info palmte2_asoc_pdata = {
    295	.jack_gpio	= GPIO_NR_PALMTE2_EARPHONE_DETECT,
    296};
    297
    298static struct platform_device palmte2_asoc = {
    299	.name = "palm27x-asoc",
    300	.id   = -1,
    301	.dev  = {
    302		.platform_data = &palmte2_asoc_pdata,
    303	},
    304};
    305
    306/******************************************************************************
    307 * Framebuffer
    308 ******************************************************************************/
    309static struct pxafb_mode_info palmte2_lcd_modes[] = {
    310{
    311	.pixclock	= 77757,
    312	.xres		= 320,
    313	.yres		= 320,
    314	.bpp		= 16,
    315
    316	.left_margin	= 28,
    317	.right_margin	= 7,
    318	.upper_margin	= 7,
    319	.lower_margin	= 5,
    320
    321	.hsync_len	= 4,
    322	.vsync_len	= 1,
    323},
    324};
    325
    326static struct pxafb_mach_info palmte2_lcd_screen = {
    327	.modes		= palmte2_lcd_modes,
    328	.num_modes	= ARRAY_SIZE(palmte2_lcd_modes),
    329	.lcd_conn	= LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
    330};
    331
    332/******************************************************************************
    333 * Machine init
    334 ******************************************************************************/
    335static struct platform_device *devices[] __initdata = {
    336#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
    337	&palmte2_pxa_keys,
    338#endif
    339	&palmte2_backlight,
    340	&power_supply,
    341	&palmte2_asoc,
    342	&palmte2_gpio_vbus,
    343};
    344
    345/* setup udc GPIOs initial state */
    346static void __init palmte2_udc_init(void)
    347{
    348	if (!gpio_request(GPIO_NR_PALMTE2_USB_PULLUP, "UDC Vbus")) {
    349		gpio_direction_output(GPIO_NR_PALMTE2_USB_PULLUP, 1);
    350		gpio_free(GPIO_NR_PALMTE2_USB_PULLUP);
    351	}
    352}
    353
    354static void __init palmte2_init(void)
    355{
    356	pxa2xx_mfp_config(ARRAY_AND_SIZE(palmte2_pin_config));
    357
    358	pxa_set_ffuart_info(NULL);
    359	pxa_set_btuart_info(NULL);
    360	pxa_set_stuart_info(NULL);
    361
    362	pxa_set_fb_info(NULL, &palmte2_lcd_screen);
    363	gpiod_add_lookup_table(&palmte2_mci_gpio_table);
    364	pxa_set_mci_info(&palmte2_mci_platform_data);
    365	palmte2_udc_init();
    366	pxa_set_ac97_info(&palmte2_ac97_pdata);
    367	pxa_set_ficp_info(&palmte2_ficp_platform_data);
    368
    369	pwm_add_table(palmte2_pwm_lookup, ARRAY_SIZE(palmte2_pwm_lookup));
    370	gpiod_add_lookup_table(&palmte2_udc_gpiod_table);
    371	platform_add_devices(devices, ARRAY_SIZE(devices));
    372}
    373
    374MACHINE_START(PALMTE2, "Palm Tungsten|E2")
    375	.atag_offset	= 0x100,
    376	.map_io		= pxa25x_map_io,
    377	.nr_irqs	= PXA_NR_IRQS,
    378	.init_irq	= pxa25x_init_irq,
    379	.handle_irq	= pxa25x_handle_irq,
    380	.init_time	= pxa_timer_init,
    381	.init_machine	= palmte2_init,
    382	.restart	= pxa_restart,
    383MACHINE_END