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

collie.c (10952B)


      1/*
      2 * linux/arch/arm/mach-sa1100/collie.c
      3 *
      4 * May be copied or modified under the terms of the GNU General Public
      5 * License.  See linux/COPYING for more information.
      6 *
      7 * This file contains all Collie-specific tweaks.
      8 *
      9 * This program is free software; you can redistribute it and/or modify
     10 * it under the terms of the GNU General Public License version 2 as
     11 * published by the Free Software Foundation.
     12 *
     13 * ChangeLog:
     14 *  2006 Pavel Machek <pavel@ucw.cz>
     15 *  03-06-2004 John Lenz <lenz@cs.wisc.edu>
     16 *  06-04-2002 Chris Larson <kergoth@digitalnemesis.net>
     17 *  04-16-2001 Lineo Japan,Inc. ...
     18 */
     19
     20#include <linux/init.h>
     21#include <linux/kernel.h>
     22#include <linux/tty.h>
     23#include <linux/delay.h>
     24#include <linux/platform_data/sa11x0-serial.h>
     25#include <linux/platform_device.h>
     26#include <linux/mfd/ucb1x00.h>
     27#include <linux/mtd/mtd.h>
     28#include <linux/mtd/partitions.h>
     29#include <linux/timer.h>
     30#include <linux/gpio_keys.h>
     31#include <linux/input.h>
     32#include <linux/gpio.h>
     33#include <linux/gpio/machine.h>
     34#include <linux/power/gpio-charger.h>
     35
     36#include <video/sa1100fb.h>
     37
     38#include <mach/hardware.h>
     39#include <asm/mach-types.h>
     40#include <asm/page.h>
     41#include <asm/setup.h>
     42#include <mach/collie.h>
     43
     44#include <asm/mach/arch.h>
     45#include <asm/mach/flash.h>
     46#include <asm/mach/map.h>
     47#include <linux/platform_data/irda-sa11x0.h>
     48
     49#include <asm/hardware/scoop.h>
     50#include <asm/mach/sharpsl_param.h>
     51#include <asm/hardware/locomo.h>
     52#include <linux/platform_data/mfd-mcp-sa11x0.h>
     53#include <mach/irqs.h>
     54
     55#include "generic.h"
     56
     57static struct resource collie_scoop_resources[] = {
     58	[0] = DEFINE_RES_MEM(0x40800000, SZ_4K),
     59};
     60
     61static struct scoop_config collie_scoop_setup = {
     62	.io_dir 	= COLLIE_SCOOP_IO_DIR,
     63	.io_out		= COLLIE_SCOOP_IO_OUT,
     64	.gpio_base	= COLLIE_SCOOP_GPIO_BASE,
     65};
     66
     67struct platform_device colliescoop_device = {
     68	.name		= "sharp-scoop",
     69	.id		= -1,
     70	.dev		= {
     71 		.platform_data	= &collie_scoop_setup,
     72	},
     73	.num_resources	= ARRAY_SIZE(collie_scoop_resources),
     74	.resource	= collie_scoop_resources,
     75};
     76
     77static struct scoop_pcmcia_dev collie_pcmcia_scoop[] = {
     78	{
     79	.dev		= &colliescoop_device.dev,
     80	.irq		= COLLIE_IRQ_GPIO_CF_IRQ,
     81	.cd_irq		= COLLIE_IRQ_GPIO_CF_CD,
     82	.cd_irq_str	= "PCMCIA0 CD",
     83	},
     84};
     85
     86static struct scoop_pcmcia_config collie_pcmcia_config = {
     87	.devs		= &collie_pcmcia_scoop[0],
     88	.num_devs	= 1,
     89};
     90
     91static struct ucb1x00_plat_data collie_ucb1x00_data = {
     92	.gpio_base	= COLLIE_TC35143_GPIO_BASE,
     93};
     94
     95static struct mcp_plat_data collie_mcp_data = {
     96	.mccr0		= MCCR0_ADM | MCCR0_ExtClk,
     97	.sclk_rate	= 9216000,
     98	.codec_pdata	= &collie_ucb1x00_data,
     99};
    100
    101/* Battery management GPIOs */
    102static struct gpiod_lookup_table collie_battery_gpiod_table = {
    103	/* the MCP codec mcp0 has the ucb1x00 as attached device */
    104	.dev_id = "ucb1x00",
    105	.table = {
    106		/* This is found on the main GPIO on the SA1100 */
    107		GPIO_LOOKUP("gpio", COLLIE_GPIO_CO,
    108			    "main battery full", GPIO_ACTIVE_HIGH),
    109		GPIO_LOOKUP("gpio", COLLIE_GPIO_MAIN_BAT_LOW,
    110			    "main battery low", GPIO_ACTIVE_HIGH),
    111		/*
    112		 * This is GPIO 0 on the Scoop expander, which is registered
    113		 * from common/scoop.c with this gpio chip label.
    114		 */
    115		GPIO_LOOKUP("sharp-scoop", 0,
    116			    "main charge on", GPIO_ACTIVE_HIGH),
    117		{ },
    118	},
    119};
    120
    121static int collie_ir_startup(struct device *dev)
    122{
    123	int rc = gpio_request(COLLIE_GPIO_IR_ON, "IrDA");
    124	if (rc)
    125		return rc;
    126	rc = gpio_direction_output(COLLIE_GPIO_IR_ON, 1);
    127
    128	if (!rc)
    129		return 0;
    130
    131	gpio_free(COLLIE_GPIO_IR_ON);
    132	return rc;
    133}
    134
    135static void collie_ir_shutdown(struct device *dev)
    136{
    137	gpio_free(COLLIE_GPIO_IR_ON);
    138}
    139
    140static int collie_ir_set_power(struct device *dev, unsigned int state)
    141{
    142	gpio_set_value(COLLIE_GPIO_IR_ON, !state);
    143	return 0;
    144}
    145
    146static struct irda_platform_data collie_ir_data = {
    147	.startup = collie_ir_startup,
    148	.shutdown = collie_ir_shutdown,
    149	.set_power = collie_ir_set_power,
    150};
    151
    152/*
    153 * Collie AC IN
    154 */
    155static struct gpiod_lookup_table collie_power_gpiod_table = {
    156	.dev_id = "gpio-charger",
    157	.table = {
    158		GPIO_LOOKUP("gpio", COLLIE_GPIO_AC_IN,
    159			    NULL, GPIO_ACTIVE_HIGH),
    160		{ },
    161	},
    162};
    163
    164static char *collie_ac_supplied_to[] = {
    165	"main-battery",
    166	"backup-battery",
    167};
    168
    169static struct gpio_charger_platform_data collie_power_data = {
    170	.name			= "charger",
    171	.type			= POWER_SUPPLY_TYPE_MAINS,
    172	.supplied_to		= collie_ac_supplied_to,
    173	.num_supplicants	= ARRAY_SIZE(collie_ac_supplied_to),
    174};
    175
    176static struct platform_device collie_power_device = {
    177	.name			= "gpio-charger",
    178	.id			= -1,
    179	.dev.platform_data	= &collie_power_data,
    180};
    181
    182#ifdef CONFIG_SHARP_LOCOMO
    183/*
    184 * low-level UART features.
    185 */
    186struct platform_device collie_locomo_device;
    187
    188static void collie_uart_set_mctrl(struct uart_port *port, u_int mctrl)
    189{
    190	if (mctrl & TIOCM_RTS)
    191		locomo_gpio_write(&collie_locomo_device.dev, LOCOMO_GPIO_RTS, 0);
    192	else
    193		locomo_gpio_write(&collie_locomo_device.dev, LOCOMO_GPIO_RTS, 1);
    194
    195	if (mctrl & TIOCM_DTR)
    196		locomo_gpio_write(&collie_locomo_device.dev, LOCOMO_GPIO_DTR, 0);
    197	else
    198		locomo_gpio_write(&collie_locomo_device.dev, LOCOMO_GPIO_DTR, 1);
    199}
    200
    201static u_int collie_uart_get_mctrl(struct uart_port *port)
    202{
    203	int ret = TIOCM_CD;
    204	unsigned int r;
    205
    206	r = locomo_gpio_read_output(&collie_locomo_device.dev, LOCOMO_GPIO_CTS & LOCOMO_GPIO_DSR);
    207	if (r == -ENODEV)
    208		return ret;
    209	if (r & LOCOMO_GPIO_CTS)
    210		ret |= TIOCM_CTS;
    211	if (r & LOCOMO_GPIO_DSR)
    212		ret |= TIOCM_DSR;
    213
    214	return ret;
    215}
    216
    217static struct sa1100_port_fns collie_port_fns __initdata = {
    218	.set_mctrl	= collie_uart_set_mctrl,
    219	.get_mctrl	= collie_uart_get_mctrl,
    220};
    221
    222static int collie_uart_probe(struct locomo_dev *dev)
    223{
    224	return 0;
    225}
    226
    227static struct locomo_driver collie_uart_driver = {
    228	.drv = {
    229		.name = "collie_uart",
    230	},
    231	.devid	= LOCOMO_DEVID_UART,
    232	.probe	= collie_uart_probe,
    233};
    234
    235static int __init collie_uart_init(void)
    236{
    237	return locomo_driver_register(&collie_uart_driver);
    238}
    239device_initcall(collie_uart_init);
    240
    241#endif
    242
    243
    244static struct resource locomo_resources[] = {
    245	[0] = DEFINE_RES_MEM(0x40000000, SZ_8K),
    246	[1] = DEFINE_RES_IRQ(IRQ_GPIO25),
    247};
    248
    249static struct locomo_platform_data locomo_info = {
    250	.irq_base	= IRQ_BOARD_START,
    251};
    252
    253struct platform_device collie_locomo_device = {
    254	.name		= "locomo",
    255	.id		= 0,
    256	.dev		= {
    257		.platform_data	= &locomo_info,
    258	},
    259	.num_resources	= ARRAY_SIZE(locomo_resources),
    260	.resource	= locomo_resources,
    261};
    262
    263static struct gpio_keys_button collie_gpio_keys[] = {
    264	{
    265		.type	= EV_PWR,
    266		.code	= KEY_RESERVED,
    267		.gpio	= COLLIE_GPIO_ON_KEY,
    268		.desc	= "On key",
    269		.wakeup	= 1,
    270		.active_low = 1,
    271	},
    272	{
    273		.type	= EV_PWR,
    274		.code	= KEY_WAKEUP,
    275		.gpio	= COLLIE_GPIO_WAKEUP,
    276		.desc	= "Sync",
    277		.wakeup = 1,
    278		.active_low = 1,
    279	},
    280};
    281
    282static struct gpio_keys_platform_data collie_gpio_keys_data = {
    283	.buttons	= collie_gpio_keys,
    284	.nbuttons	= ARRAY_SIZE(collie_gpio_keys),
    285};
    286
    287static struct platform_device collie_gpio_keys_device = {
    288	.name	= "gpio-keys",
    289	.id	= -1,
    290	.dev	= {
    291		.platform_data = &collie_gpio_keys_data,
    292	},
    293};
    294
    295static struct platform_device *devices[] __initdata = {
    296	&collie_locomo_device,
    297	&colliescoop_device,
    298	&collie_power_device,
    299	&collie_gpio_keys_device,
    300};
    301
    302static struct mtd_partition collie_partitions[] = {
    303	{
    304		.name		= "bootloader",
    305		.offset 	= 0,
    306		.size		= 0x000C0000,
    307		.mask_flags	= MTD_WRITEABLE
    308	}, {
    309		.name		= "kernel",
    310		.offset 	= MTDPART_OFS_APPEND,
    311		.size		= 0x00100000,
    312	}, {
    313		.name		= "rootfs",
    314		.offset 	= MTDPART_OFS_APPEND,
    315		.size		= 0x00e20000,
    316	}, {
    317		.name		= "bootblock",
    318		.offset		= MTDPART_OFS_APPEND,
    319		.size		= 0x00020000,
    320		.mask_flags	= MTD_WRITEABLE
    321	}
    322};
    323
    324static int collie_flash_init(void)
    325{
    326	int rc = gpio_request(COLLIE_GPIO_VPEN, "flash Vpp enable");
    327	if (rc)
    328		return rc;
    329
    330	rc = gpio_direction_output(COLLIE_GPIO_VPEN, 1);
    331	if (rc)
    332		gpio_free(COLLIE_GPIO_VPEN);
    333
    334	return rc;
    335}
    336
    337static void collie_set_vpp(int vpp)
    338{
    339	gpio_set_value(COLLIE_GPIO_VPEN, vpp);
    340}
    341
    342static void collie_flash_exit(void)
    343{
    344	gpio_free(COLLIE_GPIO_VPEN);
    345}
    346
    347static struct flash_platform_data collie_flash_data = {
    348	.map_name	= "cfi_probe",
    349	.init		= collie_flash_init,
    350	.set_vpp	= collie_set_vpp,
    351	.exit		= collie_flash_exit,
    352	.parts		= collie_partitions,
    353	.nr_parts	= ARRAY_SIZE(collie_partitions),
    354};
    355
    356static struct resource collie_flash_resources[] = {
    357	DEFINE_RES_MEM(SA1100_CS0_PHYS, SZ_32M),
    358};
    359
    360static struct sa1100fb_mach_info collie_lcd_info = {
    361	.pixclock	= 171521,	.bpp		= 16,
    362	.xres		= 320,		.yres		= 240,
    363
    364	.hsync_len	= 5,		.vsync_len	= 1,
    365	.left_margin	= 11,		.upper_margin	= 2,
    366	.right_margin	= 30,		.lower_margin	= 0,
    367
    368	.sync		= FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
    369
    370	.lccr0		= LCCR0_Color | LCCR0_Sngl | LCCR0_Act,
    371	.lccr3		= LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2),
    372
    373#ifdef CONFIG_BACKLIGHT_LOCOMO
    374	.lcd_power	= locomolcd_power
    375#endif
    376};
    377
    378static void __init collie_init(void)
    379{
    380	int ret = 0;
    381
    382	/* cpu initialize */
    383	GAFR = GPIO_SSP_TXD | GPIO_SSP_SCLK | GPIO_SSP_SFRM | GPIO_SSP_CLK |
    384		GPIO_MCP_CLK | GPIO_32_768kHz;
    385
    386	GPDR = GPIO_LDD8 | GPIO_LDD9 | GPIO_LDD10 | GPIO_LDD11 | GPIO_LDD12 |
    387		GPIO_LDD13 | GPIO_LDD14 | GPIO_LDD15 | GPIO_SSP_TXD |
    388		GPIO_SSP_SCLK | GPIO_SSP_SFRM | GPIO_SDLC_SCLK |
    389		_COLLIE_GPIO_UCB1x00_RESET | _COLLIE_GPIO_nMIC_ON |
    390		_COLLIE_GPIO_nREMOCON_ON | GPIO_32_768kHz;
    391
    392	PPDR = PPC_LDD0 | PPC_LDD1 | PPC_LDD2 | PPC_LDD3 | PPC_LDD4 | PPC_LDD5 |
    393		PPC_LDD6 | PPC_LDD7 | PPC_L_PCLK | PPC_L_LCLK | PPC_L_FCLK | PPC_L_BIAS |
    394		PPC_TXD1 | PPC_TXD2 | PPC_TXD3 | PPC_TXD4 | PPC_SCLK | PPC_SFRM;
    395
    396	PWER = 0;
    397
    398	PGSR = _COLLIE_GPIO_nREMOCON_ON;
    399
    400	PSDR = PPC_RXD1 | PPC_RXD2 | PPC_RXD3 | PPC_RXD4;
    401
    402	PCFR = PCFR_OPDE;
    403
    404	GPSR |= _COLLIE_GPIO_UCB1x00_RESET;
    405
    406	sa11x0_ppc_configure_mcp();
    407
    408
    409	platform_scoop_config = &collie_pcmcia_config;
    410
    411	gpiod_add_lookup_table(&collie_power_gpiod_table);
    412	gpiod_add_lookup_table(&collie_battery_gpiod_table);
    413
    414	ret = platform_add_devices(devices, ARRAY_SIZE(devices));
    415	if (ret) {
    416		printk(KERN_WARNING "collie: Unable to register LoCoMo device\n");
    417	}
    418
    419	sa11x0_register_lcd(&collie_lcd_info);
    420	sa11x0_register_mtd(&collie_flash_data, collie_flash_resources,
    421			    ARRAY_SIZE(collie_flash_resources));
    422	sa11x0_register_mcp(&collie_mcp_data);
    423	sa11x0_register_irda(&collie_ir_data);
    424
    425	sharpsl_save_param();
    426}
    427
    428static struct map_desc collie_io_desc[] __initdata = {
    429	{	/* 32M main flash (cs0) */
    430		.virtual	= 0xe8000000,
    431		.pfn		= __phys_to_pfn(0x00000000),
    432		.length		= 0x02000000,
    433		.type		= MT_DEVICE
    434	}, {	/* 32M boot flash (cs1) */
    435		.virtual	= 0xea000000,
    436		.pfn		= __phys_to_pfn(0x08000000),
    437		.length		= 0x02000000,
    438		.type		= MT_DEVICE
    439	}
    440};
    441
    442static void __init collie_map_io(void)
    443{
    444	sa1100_map_io();
    445	iotable_init(collie_io_desc, ARRAY_SIZE(collie_io_desc));
    446
    447#ifdef CONFIG_SHARP_LOCOMO
    448	sa1100_register_uart_fns(&collie_port_fns);
    449#endif
    450	sa1100_register_uart(0, 3);
    451	sa1100_register_uart(1, 1);
    452}
    453
    454MACHINE_START(COLLIE, "Sharp-Collie")
    455	.map_io		= collie_map_io,
    456	.nr_irqs	= SA1100_NR_IRQS,
    457	.init_irq	= sa1100_init_irq,
    458	.init_time	= sa1100_timer_init,
    459	.init_machine	= collie_init,
    460	.init_late	= sa11x0_init_late,
    461	.restart	= sa11x0_restart,
    462MACHINE_END