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

tosa.c (21481B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 *  Support for Sharp SL-C6000x PDAs
      4 *  Model: (Tosa)
      5 *
      6 *  Copyright (c) 2005 Dirk Opfer
      7 *
      8 *	Based on code written by Sharp/Lineo for 2.4 kernels
      9 */
     10
     11#include <linux/clkdev.h>
     12#include <linux/kernel.h>
     13#include <linux/init.h>
     14#include <linux/platform_device.h>
     15#include <linux/major.h>
     16#include <linux/fs.h>
     17#include <linux/interrupt.h>
     18#include <linux/delay.h>
     19#include <linux/fb.h>
     20#include <linux/mmc/host.h>
     21#include <linux/mfd/tc6393xb.h>
     22#include <linux/mfd/tmio.h>
     23#include <linux/mtd/rawnand.h>
     24#include <linux/mtd/partitions.h>
     25#include <linux/mtd/physmap.h>
     26#include <linux/pm.h>
     27#include <linux/gpio_keys.h>
     28#include <linux/input.h>
     29#include <linux/gpio.h>
     30#include <linux/gpio/machine.h>
     31#include <linux/power/gpio-charger.h>
     32#include <linux/spi/spi.h>
     33#include <linux/spi/pxa2xx_spi.h>
     34#include <linux/input/matrix_keypad.h>
     35#include <linux/platform_data/i2c-pxa.h>
     36#include <linux/reboot.h>
     37#include <linux/memblock.h>
     38
     39#include <asm/setup.h>
     40#include <asm/mach-types.h>
     41
     42#include "pxa25x.h"
     43#include "reset.h"
     44#include <linux/platform_data/irda-pxaficp.h>
     45#include <linux/platform_data/mmc-pxamci.h>
     46#include "udc.h"
     47#include "tosa_bt.h"
     48#include <linux/platform_data/asoc-pxa.h>
     49#include "smemc.h"
     50
     51#include <asm/mach/arch.h>
     52#include "tosa.h"
     53
     54#include <asm/hardware/scoop.h>
     55#include <asm/mach/sharpsl_param.h>
     56
     57#include "generic.h"
     58#include "devices.h"
     59
     60static unsigned long tosa_pin_config[] = {
     61	GPIO78_nCS_2, /* Scoop */
     62	GPIO80_nCS_4, /* tg6393xb */
     63	GPIO33_nCS_5, /* Scoop */
     64
     65	// GPIO76 CARD_VCC_ON1
     66
     67	GPIO19_GPIO, /* Reset out */
     68	GPIO1_RST | WAKEUP_ON_EDGE_FALL,
     69
     70	GPIO0_GPIO | WAKEUP_ON_EDGE_FALL, /* WAKE_UP */
     71	GPIO2_GPIO | WAKEUP_ON_EDGE_BOTH, /* AC_IN */
     72	GPIO3_GPIO | WAKEUP_ON_EDGE_FALL, /* RECORD */
     73	GPIO4_GPIO | WAKEUP_ON_EDGE_FALL, /* SYNC */
     74	GPIO20_GPIO, /* EAR_IN */
     75	GPIO22_GPIO, /* On */
     76
     77	GPIO5_GPIO, /* USB_IN */
     78	GPIO32_GPIO, /* Pen IRQ */
     79
     80	GPIO7_GPIO, /* Jacket Detect */
     81	GPIO14_GPIO, /* BAT0_CRG */
     82	GPIO12_GPIO, /* BAT1_CRG */
     83	GPIO17_GPIO, /* BAT0_LOW */
     84	GPIO84_GPIO, /* BAT1_LOW */
     85	GPIO38_GPIO, /* BAT_LOCK */
     86
     87	GPIO11_3_6MHz,
     88	GPIO15_GPIO, /* TC6393XB IRQ */
     89	GPIO18_RDY,
     90	GPIO27_GPIO, /* LCD Sync */
     91
     92	/* MMC */
     93	GPIO6_MMC_CLK,
     94	GPIO8_MMC_CS0,
     95	GPIO9_GPIO, /* Detect */
     96	GPIO10_GPIO, /* nSD_INT */
     97
     98	/* CF */
     99	GPIO13_GPIO, /* CD_IRQ */
    100	GPIO21_GPIO, /* Main Slot IRQ */
    101	GPIO36_GPIO, /* Jacket Slot IRQ */
    102	GPIO48_nPOE,
    103	GPIO49_nPWE,
    104	GPIO50_nPIOR,
    105	GPIO51_nPIOW,
    106	GPIO52_nPCE_1,
    107	GPIO53_nPCE_2,
    108	GPIO54_nPSKTSEL,
    109	GPIO55_nPREG,
    110	GPIO56_nPWAIT,
    111	GPIO57_nIOIS16,
    112
    113	/* AC97 */
    114	GPIO31_AC97_SYNC,
    115	GPIO30_AC97_SDATA_OUT,
    116	GPIO28_AC97_BITCLK,
    117	GPIO29_AC97_SDATA_IN_0,
    118	// GPIO79 nAUD_IRQ
    119
    120	/* FFUART */
    121	GPIO34_FFUART_RXD,
    122	GPIO35_FFUART_CTS,
    123	GPIO37_FFUART_DSR,
    124	GPIO39_FFUART_TXD,
    125	GPIO40_FFUART_DTR,
    126	GPIO41_FFUART_RTS,
    127
    128	/* BTUART */
    129	GPIO42_BTUART_RXD,
    130	GPIO43_BTUART_TXD,
    131	GPIO44_BTUART_CTS,
    132	GPIO45_BTUART_RTS,
    133
    134	/* Keybd */
    135	GPIO58_GPIO | MFP_LPM_DRIVE_LOW,	/* Column 0 */
    136	GPIO59_GPIO | MFP_LPM_DRIVE_LOW,	/* Column 1 */
    137	GPIO60_GPIO | MFP_LPM_DRIVE_LOW,	/* Column 2 */
    138	GPIO61_GPIO | MFP_LPM_DRIVE_LOW,	/* Column 3 */
    139	GPIO62_GPIO | MFP_LPM_DRIVE_LOW,	/* Column 4 */
    140	GPIO63_GPIO | MFP_LPM_DRIVE_LOW,	/* Column 5 */
    141	GPIO64_GPIO | MFP_LPM_DRIVE_LOW,	/* Column 6 */
    142	GPIO65_GPIO | MFP_LPM_DRIVE_LOW,	/* Column 7 */
    143	GPIO66_GPIO | MFP_LPM_DRIVE_LOW,	/* Column 8 */
    144	GPIO67_GPIO | MFP_LPM_DRIVE_LOW,	/* Column 9 */
    145	GPIO68_GPIO | MFP_LPM_DRIVE_LOW,	/* Column 10 */
    146	GPIO69_GPIO | MFP_LPM_DRIVE_LOW,	/* Row 0 */
    147	GPIO70_GPIO | MFP_LPM_DRIVE_LOW,	/* Row 1 */
    148	GPIO71_GPIO | MFP_LPM_DRIVE_LOW,	/* Row 2 */
    149	GPIO72_GPIO | MFP_LPM_DRIVE_LOW,	/* Row 3 */
    150	GPIO73_GPIO | MFP_LPM_DRIVE_LOW,	/* Row 4 */
    151	GPIO74_GPIO | MFP_LPM_DRIVE_LOW,	/* Row 5 */
    152	GPIO75_GPIO | MFP_LPM_DRIVE_LOW,	/* Row 6 */
    153
    154	/* SPI */
    155	GPIO81_SSP2_CLK_OUT,
    156	GPIO82_SSP2_FRM_OUT,
    157	GPIO83_SSP2_TXD,
    158
    159	/* IrDA is managed in other way */
    160	GPIO46_GPIO,
    161	GPIO47_GPIO,
    162};
    163
    164/*
    165 * SCOOP Device
    166 */
    167static struct resource tosa_scoop_resources[] = {
    168	[0] = {
    169		.start	= TOSA_CF_PHYS,
    170		.end	= TOSA_CF_PHYS + 0xfff,
    171		.flags	= IORESOURCE_MEM,
    172	},
    173};
    174
    175static struct scoop_config tosa_scoop_setup = {
    176	.io_dir 	= TOSA_SCOOP_IO_DIR,
    177	.gpio_base	= TOSA_SCOOP_GPIO_BASE,
    178};
    179
    180static struct platform_device tosascoop_device = {
    181	.name		= "sharp-scoop",
    182	.id		= 0,
    183	.dev		= {
    184 		.platform_data	= &tosa_scoop_setup,
    185	},
    186	.num_resources	= ARRAY_SIZE(tosa_scoop_resources),
    187	.resource	= tosa_scoop_resources,
    188};
    189
    190
    191/*
    192 * SCOOP Device Jacket
    193 */
    194static struct resource tosa_scoop_jc_resources[] = {
    195	[0] = {
    196		.start		= TOSA_SCOOP_PHYS + 0x40,
    197		.end		= TOSA_SCOOP_PHYS + 0xfff,
    198		.flags		= IORESOURCE_MEM,
    199	},
    200};
    201
    202static struct scoop_config tosa_scoop_jc_setup = {
    203	.io_dir 	= TOSA_SCOOP_JC_IO_DIR,
    204	.gpio_base	= TOSA_SCOOP_JC_GPIO_BASE,
    205};
    206
    207static struct platform_device tosascoop_jc_device = {
    208	.name		= "sharp-scoop",
    209	.id		= 1,
    210	.dev		= {
    211 		.platform_data	= &tosa_scoop_jc_setup,
    212		.parent 	= &tosascoop_device.dev,
    213	},
    214	.num_resources	= ARRAY_SIZE(tosa_scoop_jc_resources),
    215	.resource	= tosa_scoop_jc_resources,
    216};
    217
    218/*
    219 * PCMCIA
    220 */
    221static struct scoop_pcmcia_dev tosa_pcmcia_scoop[] = {
    222{
    223	.dev        = &tosascoop_device.dev,
    224	.irq        = TOSA_IRQ_GPIO_CF_IRQ,
    225	.cd_irq     = TOSA_IRQ_GPIO_CF_CD,
    226	.cd_irq_str = "PCMCIA0 CD",
    227},{
    228	.dev        = &tosascoop_jc_device.dev,
    229	.irq        = TOSA_IRQ_GPIO_JC_CF_IRQ,
    230	.cd_irq     = -1,
    231},
    232};
    233
    234static struct scoop_pcmcia_config tosa_pcmcia_config = {
    235	.devs         = &tosa_pcmcia_scoop[0],
    236	.num_devs     = 2,
    237};
    238
    239/*
    240 * USB Device Controller
    241 */
    242static struct gpiod_lookup_table tosa_udc_gpiod_table = {
    243	.dev_id = "gpio-vbus",
    244	.table = {
    245		GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_USB_IN,
    246			    "vbus", GPIO_ACTIVE_LOW),
    247		GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_USB_PULLUP,
    248			    "pullup", GPIO_ACTIVE_HIGH),
    249		{ },
    250	},
    251};
    252
    253static struct platform_device tosa_gpio_vbus = {
    254	.name	= "gpio-vbus",
    255	.id	= -1,
    256};
    257
    258/*
    259 * MMC/SD Device
    260 */
    261static int tosa_mci_init(struct device *dev, irq_handler_t tosa_detect_int, void *data)
    262{
    263	int err;
    264
    265	err = gpio_request(TOSA_GPIO_nSD_INT, "SD Int");
    266	if (err) {
    267		printk(KERN_ERR "tosa_mci_init: can't request SD_PWR gpio\n");
    268		goto err_gpio_int;
    269	}
    270	err = gpio_direction_input(TOSA_GPIO_nSD_INT);
    271	if (err)
    272		goto err_gpio_int_dir;
    273
    274	return 0;
    275
    276err_gpio_int_dir:
    277	gpio_free(TOSA_GPIO_nSD_INT);
    278err_gpio_int:
    279	return err;
    280}
    281
    282static void tosa_mci_exit(struct device *dev, void *data)
    283{
    284	gpio_free(TOSA_GPIO_nSD_INT);
    285}
    286
    287static struct pxamci_platform_data tosa_mci_platform_data = {
    288	.detect_delay_ms	= 250,
    289	.ocr_mask       	= MMC_VDD_32_33|MMC_VDD_33_34,
    290	.init           	= tosa_mci_init,
    291	.exit           	= tosa_mci_exit,
    292};
    293
    294static struct gpiod_lookup_table tosa_mci_gpio_table = {
    295	.dev_id = "pxa2xx-mci.0",
    296	.table = {
    297		GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_nSD_DETECT,
    298			    "cd", GPIO_ACTIVE_LOW),
    299		GPIO_LOOKUP("sharp-scoop.0", TOSA_GPIO_SD_WP - TOSA_SCOOP_GPIO_BASE,
    300			    "wp", GPIO_ACTIVE_LOW),
    301		GPIO_LOOKUP("sharp-scoop.0", TOSA_GPIO_PWR_ON - TOSA_SCOOP_GPIO_BASE,
    302			    "power", GPIO_ACTIVE_HIGH),
    303		{ },
    304	},
    305};
    306
    307/*
    308 * Irda
    309 */
    310static void tosa_irda_transceiver_mode(struct device *dev, int mode)
    311{
    312	if (mode & IR_OFF) {
    313		gpio_set_value(TOSA_GPIO_IR_POWERDWN, 0);
    314		pxa2xx_transceiver_mode(dev, mode);
    315		gpio_direction_output(TOSA_GPIO_IRDA_TX, 0);
    316	} else {
    317		pxa2xx_transceiver_mode(dev, mode);
    318		gpio_set_value(TOSA_GPIO_IR_POWERDWN, 1);
    319	}
    320}
    321
    322static int tosa_irda_startup(struct device *dev)
    323{
    324	int ret;
    325
    326	ret = gpio_request(TOSA_GPIO_IRDA_TX, "IrDA TX");
    327	if (ret)
    328		goto err_tx;
    329	ret = gpio_direction_output(TOSA_GPIO_IRDA_TX, 0);
    330	if (ret)
    331		goto err_tx_dir;
    332
    333	ret = gpio_request(TOSA_GPIO_IR_POWERDWN, "IrDA powerdown");
    334	if (ret)
    335		goto err_pwr;
    336
    337	ret = gpio_direction_output(TOSA_GPIO_IR_POWERDWN, 0);
    338	if (ret)
    339		goto err_pwr_dir;
    340
    341	tosa_irda_transceiver_mode(dev, IR_SIRMODE | IR_OFF);
    342
    343	return 0;
    344
    345err_pwr_dir:
    346	gpio_free(TOSA_GPIO_IR_POWERDWN);
    347err_pwr:
    348err_tx_dir:
    349	gpio_free(TOSA_GPIO_IRDA_TX);
    350err_tx:
    351	return ret;
    352}
    353
    354static void tosa_irda_shutdown(struct device *dev)
    355{
    356	tosa_irda_transceiver_mode(dev, IR_SIRMODE | IR_OFF);
    357	gpio_free(TOSA_GPIO_IR_POWERDWN);
    358	gpio_free(TOSA_GPIO_IRDA_TX);
    359}
    360
    361static struct pxaficp_platform_data tosa_ficp_platform_data = {
    362	.gpio_pwdown		= -1,
    363	.transceiver_cap	= IR_SIRMODE | IR_OFF,
    364	.transceiver_mode	= tosa_irda_transceiver_mode,
    365	.startup		= tosa_irda_startup,
    366	.shutdown		= tosa_irda_shutdown,
    367};
    368
    369/*
    370 * Tosa AC IN
    371 */
    372static struct gpiod_lookup_table tosa_power_gpiod_table = {
    373	.dev_id = "gpio-charger",
    374	.table = {
    375		GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_AC_IN,
    376			    NULL, GPIO_ACTIVE_LOW),
    377		{ },
    378	},
    379};
    380
    381static char *tosa_ac_supplied_to[] = {
    382	"main-battery",
    383	"backup-battery",
    384	"jacket-battery",
    385};
    386
    387static struct gpio_charger_platform_data tosa_power_data = {
    388	.name			= "charger",
    389	.type			= POWER_SUPPLY_TYPE_MAINS,
    390	.supplied_to		= tosa_ac_supplied_to,
    391	.num_supplicants	= ARRAY_SIZE(tosa_ac_supplied_to),
    392};
    393
    394static struct resource tosa_power_resource[] = {
    395	{
    396		.name		= "ac",
    397		.start		= PXA_GPIO_TO_IRQ(TOSA_GPIO_AC_IN),
    398		.end		= PXA_GPIO_TO_IRQ(TOSA_GPIO_AC_IN),
    399		.flags		= IORESOURCE_IRQ |
    400				  IORESOURCE_IRQ_HIGHEDGE |
    401				  IORESOURCE_IRQ_LOWEDGE,
    402	},
    403};
    404
    405static struct platform_device tosa_power_device = {
    406	.name			= "gpio-charger",
    407	.id			= -1,
    408	.dev.platform_data	= &tosa_power_data,
    409	.resource		= tosa_power_resource,
    410	.num_resources		= ARRAY_SIZE(tosa_power_resource),
    411};
    412
    413/*
    414 * Tosa Keyboard
    415 */
    416static const uint32_t tosakbd_keymap[] = {
    417	KEY(0, 1, KEY_W),
    418	KEY(0, 5, KEY_K),
    419	KEY(0, 6, KEY_BACKSPACE),
    420	KEY(0, 7, KEY_P),
    421	KEY(1, 0, KEY_Q),
    422	KEY(1, 1, KEY_E),
    423	KEY(1, 2, KEY_T),
    424	KEY(1, 3, KEY_Y),
    425	KEY(1, 5, KEY_O),
    426	KEY(1, 6, KEY_I),
    427	KEY(1, 7, KEY_COMMA),
    428	KEY(2, 0, KEY_A),
    429	KEY(2, 1, KEY_D),
    430	KEY(2, 2, KEY_G),
    431	KEY(2, 3, KEY_U),
    432	KEY(2, 5, KEY_L),
    433	KEY(2, 6, KEY_ENTER),
    434	KEY(2, 7, KEY_DOT),
    435	KEY(3, 0, KEY_Z),
    436	KEY(3, 1, KEY_C),
    437	KEY(3, 2, KEY_V),
    438	KEY(3, 3, KEY_J),
    439	KEY(3, 4, TOSA_KEY_ADDRESSBOOK),
    440	KEY(3, 5, TOSA_KEY_CANCEL),
    441	KEY(3, 6, TOSA_KEY_CENTER),
    442	KEY(3, 7, TOSA_KEY_OK),
    443	KEY(3, 8, KEY_LEFTSHIFT),
    444	KEY(4, 0, KEY_S),
    445	KEY(4, 1, KEY_R),
    446	KEY(4, 2, KEY_B),
    447	KEY(4, 3, KEY_N),
    448	KEY(4, 4, TOSA_KEY_CALENDAR),
    449	KEY(4, 5, TOSA_KEY_HOMEPAGE),
    450	KEY(4, 6, KEY_LEFTCTRL),
    451	KEY(4, 7, TOSA_KEY_LIGHT),
    452	KEY(4, 9, KEY_RIGHTSHIFT),
    453	KEY(5, 0, KEY_TAB),
    454	KEY(5, 1, KEY_SLASH),
    455	KEY(5, 2, KEY_H),
    456	KEY(5, 3, KEY_M),
    457	KEY(5, 4, TOSA_KEY_MENU),
    458	KEY(5, 6, KEY_UP),
    459	KEY(5, 10, TOSA_KEY_FN),
    460	KEY(6, 0, KEY_X),
    461	KEY(6, 1, KEY_F),
    462	KEY(6, 2, KEY_SPACE),
    463	KEY(6, 3, KEY_APOSTROPHE),
    464	KEY(6, 4, TOSA_KEY_MAIL),
    465	KEY(6, 5, KEY_LEFT),
    466	KEY(6, 6, KEY_DOWN),
    467	KEY(6, 7, KEY_RIGHT),
    468};
    469
    470static struct matrix_keymap_data tosakbd_keymap_data = {
    471	.keymap		= tosakbd_keymap,
    472	.keymap_size	= ARRAY_SIZE(tosakbd_keymap),
    473};
    474
    475static const int tosakbd_col_gpios[] =
    476			{ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68 };
    477static const int tosakbd_row_gpios[] =
    478			{ 69, 70, 71, 72, 73, 74, 75 };
    479
    480static struct matrix_keypad_platform_data tosakbd_pdata = {
    481	.keymap_data		= &tosakbd_keymap_data,
    482	.row_gpios		= tosakbd_row_gpios,
    483	.col_gpios		= tosakbd_col_gpios,
    484	.num_row_gpios		= ARRAY_SIZE(tosakbd_row_gpios),
    485	.num_col_gpios		= ARRAY_SIZE(tosakbd_col_gpios),
    486	.col_scan_delay_us	= 10,
    487	.debounce_ms		= 10,
    488	.wakeup			= 1,
    489};
    490
    491static struct platform_device tosakbd_device = {
    492	.name		= "matrix-keypad",
    493	.id		= -1,
    494	.dev		= {
    495		.platform_data = &tosakbd_pdata,
    496	},
    497};
    498
    499static struct gpio_keys_button tosa_gpio_keys[] = {
    500	/*
    501	 * Two following keys are directly tied to "ON" button of tosa. Why?
    502	 * The first one can be used as a wakeup source, the second can't;
    503	 * also the first one is OR of ac_powered and on_button.
    504	 */
    505	{
    506		.type	= EV_PWR,
    507		.code	= KEY_RESERVED,
    508		.gpio	= TOSA_GPIO_POWERON,
    509		.desc	= "Poweron",
    510		.wakeup	= 1,
    511		.active_low = 1,
    512	},
    513	{
    514		.type	= EV_PWR,
    515		.code	= KEY_SUSPEND,
    516		.gpio	= TOSA_GPIO_ON_KEY,
    517		.desc	= "On key",
    518		/*
    519		 * can't be used as wakeup
    520		 * .wakeup	= 1,
    521		 */
    522		.active_low = 1,
    523	},
    524	{
    525		.type	= EV_KEY,
    526		.code	= TOSA_KEY_RECORD,
    527		.gpio	= TOSA_GPIO_RECORD_BTN,
    528		.desc	= "Record Button",
    529		.wakeup	= 1,
    530		.active_low = 1,
    531	},
    532	{
    533		.type	= EV_KEY,
    534		.code	= TOSA_KEY_SYNC,
    535		.gpio	= TOSA_GPIO_SYNC,
    536		.desc	= "Sync Button",
    537		.wakeup	= 1,
    538		.active_low = 1,
    539	},
    540	{
    541		.type	= EV_SW,
    542		.code	= SW_HEADPHONE_INSERT,
    543		.gpio	= TOSA_GPIO_EAR_IN,
    544		.desc	= "HeadPhone insert",
    545		.active_low = 1,
    546		.debounce_interval = 300,
    547	},
    548};
    549
    550static struct gpio_keys_platform_data tosa_gpio_keys_platform_data = {
    551	.buttons	= tosa_gpio_keys,
    552	.nbuttons	= ARRAY_SIZE(tosa_gpio_keys),
    553};
    554
    555static struct platform_device tosa_gpio_keys_device = {
    556	.name	= "gpio-keys",
    557	.id	= -1,
    558	.dev	= {
    559		.platform_data	= &tosa_gpio_keys_platform_data,
    560	},
    561};
    562
    563/*
    564 * Tosa LEDs
    565 */
    566static struct gpio_led tosa_gpio_leds[] = {
    567	{
    568		.name			= "tosa:amber:charge",
    569		.default_trigger	= "main-battery-charging",
    570		.gpio			= TOSA_GPIO_CHRG_ERR_LED,
    571	},
    572	{
    573		.name			= "tosa:green:mail",
    574		.default_trigger	= "nand-disk",
    575		.gpio			= TOSA_GPIO_NOTE_LED,
    576	},
    577	{
    578		.name			= "tosa:dual:wlan",
    579		.default_trigger	= "none",
    580		.gpio			= TOSA_GPIO_WLAN_LED,
    581	},
    582	{
    583		.name			= "tosa:blue:bluetooth",
    584		.default_trigger	= "tosa-bt",
    585		.gpio			= TOSA_GPIO_BT_LED,
    586	},
    587};
    588
    589static struct gpio_led_platform_data tosa_gpio_leds_platform_data = {
    590	.leds		= tosa_gpio_leds,
    591	.num_leds	= ARRAY_SIZE(tosa_gpio_leds),
    592};
    593
    594static struct platform_device tosaled_device = {
    595	.name	= "leds-gpio",
    596	.id	= -1,
    597	.dev	= {
    598		.platform_data	= &tosa_gpio_leds_platform_data,
    599	},
    600};
    601
    602/*
    603 * Toshiba Mobile IO Controller
    604 */
    605static struct resource tc6393xb_resources[] = {
    606	[0] = {
    607		.start	= TOSA_LCDC_PHYS,
    608		.end	= TOSA_LCDC_PHYS + 0x3ffffff,
    609		.flags	= IORESOURCE_MEM,
    610	},
    611
    612	[1] = {
    613		.start	= TOSA_IRQ_GPIO_TC6393XB_INT,
    614		.end	= TOSA_IRQ_GPIO_TC6393XB_INT,
    615		.flags	= IORESOURCE_IRQ,
    616	},
    617};
    618
    619static struct gpiod_lookup_table tosa_battery_gpio_table = {
    620	.dev_id = "wm97xx-battery",
    621	.table = {
    622		GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_BAT0_CRG,
    623			    "main battery full", GPIO_ACTIVE_HIGH),
    624		GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_BAT1_CRG,
    625			    "jacket battery full", GPIO_ACTIVE_HIGH),
    626		GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_BAT0_LOW,
    627			    "main battery low", GPIO_ACTIVE_HIGH),
    628		GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_BAT1_LOW,
    629			    "jacket battery low", GPIO_ACTIVE_HIGH),
    630		GPIO_LOOKUP("gpio-pxa", TOSA_GPIO_JACKET_DETECT,
    631			    "jacket detect", GPIO_ACTIVE_HIGH),
    632		{ },
    633	},
    634};
    635
    636static int tosa_tc6393xb_enable(struct platform_device *dev)
    637{
    638	int rc;
    639
    640	rc = gpio_request(TOSA_GPIO_TC6393XB_REST_IN, "tc6393xb #pclr");
    641	if (rc)
    642		goto err_req_pclr;
    643	rc = gpio_request(TOSA_GPIO_TC6393XB_SUSPEND, "tc6393xb #suspend");
    644	if (rc)
    645		goto err_req_suspend;
    646	rc = gpio_request(TOSA_GPIO_TC6393XB_L3V_ON, "tc6393xb l3v");
    647	if (rc)
    648		goto err_req_l3v;
    649	rc = gpio_direction_output(TOSA_GPIO_TC6393XB_L3V_ON, 0);
    650	if (rc)
    651		goto err_dir_l3v;
    652	rc = gpio_direction_output(TOSA_GPIO_TC6393XB_SUSPEND, 0);
    653	if (rc)
    654		goto err_dir_suspend;
    655	rc = gpio_direction_output(TOSA_GPIO_TC6393XB_REST_IN, 0);
    656	if (rc)
    657		goto err_dir_pclr;
    658
    659	mdelay(1);
    660
    661	gpio_set_value(TOSA_GPIO_TC6393XB_SUSPEND, 1);
    662
    663	mdelay(10);
    664
    665	gpio_set_value(TOSA_GPIO_TC6393XB_REST_IN, 1);
    666	gpio_set_value(TOSA_GPIO_TC6393XB_L3V_ON, 1);
    667
    668	return 0;
    669err_dir_pclr:
    670err_dir_suspend:
    671err_dir_l3v:
    672	gpio_free(TOSA_GPIO_TC6393XB_L3V_ON);
    673err_req_l3v:
    674	gpio_free(TOSA_GPIO_TC6393XB_SUSPEND);
    675err_req_suspend:
    676	gpio_free(TOSA_GPIO_TC6393XB_REST_IN);
    677err_req_pclr:
    678	return rc;
    679}
    680
    681static int tosa_tc6393xb_disable(struct platform_device *dev)
    682{
    683	gpio_free(TOSA_GPIO_TC6393XB_L3V_ON);
    684	gpio_free(TOSA_GPIO_TC6393XB_SUSPEND);
    685	gpio_free(TOSA_GPIO_TC6393XB_REST_IN);
    686
    687	return 0;
    688}
    689
    690static int tosa_tc6393xb_resume(struct platform_device *dev)
    691{
    692	gpio_set_value(TOSA_GPIO_TC6393XB_SUSPEND, 1);
    693	mdelay(10);
    694	gpio_set_value(TOSA_GPIO_TC6393XB_L3V_ON, 1);
    695	mdelay(10);
    696
    697	return 0;
    698}
    699
    700static int tosa_tc6393xb_suspend(struct platform_device *dev)
    701{
    702	gpio_set_value(TOSA_GPIO_TC6393XB_L3V_ON, 0);
    703	gpio_set_value(TOSA_GPIO_TC6393XB_SUSPEND, 0);
    704	return 0;
    705}
    706
    707static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
    708
    709static struct nand_bbt_descr tosa_tc6393xb_nand_bbt = {
    710	.options	= 0,
    711	.offs		= 4,
    712	.len		= 2,
    713	.pattern	= scan_ff_pattern
    714};
    715
    716static const char * const probes[] = {
    717	"cmdlinepart",
    718	"ofpart",
    719	"sharpslpart",
    720	NULL,
    721};
    722
    723static struct tmio_nand_data tosa_tc6393xb_nand_config = {
    724	.badblock_pattern = &tosa_tc6393xb_nand_bbt,
    725	.part_parsers = probes,
    726};
    727
    728#ifdef CONFIG_MFD_TC6393XB
    729static struct fb_videomode tosa_tc6393xb_lcd_mode[] = {
    730	{
    731		.xres = 480,
    732		.yres = 640,
    733		.pixclock = 0x002cdf00,/* PLL divisor */
    734		.left_margin = 0x004c,
    735		.right_margin = 0x005b,
    736		.upper_margin = 0x0001,
    737		.lower_margin = 0x000d,
    738		.hsync_len = 0x0002,
    739		.vsync_len = 0x0001,
    740		.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
    741		.vmode = FB_VMODE_NONINTERLACED,
    742	},{
    743		.xres = 240,
    744		.yres = 320,
    745		.pixclock = 0x00e7f203,/* PLL divisor */
    746		.left_margin = 0x0024,
    747		.right_margin = 0x002f,
    748		.upper_margin = 0x0001,
    749		.lower_margin = 0x000d,
    750		.hsync_len = 0x0002,
    751		.vsync_len = 0x0001,
    752		.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
    753		.vmode = FB_VMODE_NONINTERLACED,
    754	}
    755};
    756
    757static struct tmio_fb_data tosa_tc6393xb_fb_config = {
    758	.lcd_set_power	= tc6393xb_lcd_set_power,
    759	.lcd_mode	= tc6393xb_lcd_mode,
    760	.num_modes	= ARRAY_SIZE(tosa_tc6393xb_lcd_mode),
    761	.modes		= &tosa_tc6393xb_lcd_mode[0],
    762	.height		= 82,
    763	.width		= 60,
    764};
    765#endif
    766
    767static struct tc6393xb_platform_data tosa_tc6393xb_data = {
    768	.scr_pll2cr	= 0x0cc1,
    769	.scr_gper	= 0x3300,
    770
    771	.irq_base	= IRQ_BOARD_START,
    772
    773	.enable		= tosa_tc6393xb_enable,
    774	.disable	= tosa_tc6393xb_disable,
    775	.suspend	= tosa_tc6393xb_suspend,
    776	.resume		= tosa_tc6393xb_resume,
    777
    778	.nand_data	= &tosa_tc6393xb_nand_config,
    779#ifdef CONFIG_MFD_TC6393XB
    780	.fb_data	= &tosa_tc6393xb_fb_config,
    781#endif
    782
    783	.resume_restore = 1,
    784};
    785
    786
    787static struct platform_device tc6393xb_device = {
    788	.name	= "tc6393xb",
    789	.id	= -1,
    790	.dev	= {
    791		.platform_data	= &tosa_tc6393xb_data,
    792	},
    793	.num_resources	= ARRAY_SIZE(tc6393xb_resources),
    794	.resource	= tc6393xb_resources,
    795};
    796
    797static struct tosa_bt_data tosa_bt_data = {
    798	.gpio_pwr	= TOSA_GPIO_BT_PWR_EN,
    799	.gpio_reset	= TOSA_GPIO_BT_RESET,
    800};
    801
    802static struct platform_device tosa_bt_device = {
    803	.name	= "tosa-bt",
    804	.id	= -1,
    805	.dev.platform_data = &tosa_bt_data,
    806};
    807
    808static struct pxa2xx_spi_controller pxa_ssp_master_info = {
    809	.num_chipselect	= 1,
    810};
    811
    812static struct spi_board_info spi_board_info[] __initdata = {
    813	{
    814		.modalias	= "tosa-lcd",
    815		// .platform_data
    816		.max_speed_hz	= 28750,
    817		.bus_num	= 2,
    818		.chip_select	= 0,
    819		.mode		= SPI_MODE_0,
    820	},
    821};
    822
    823static struct mtd_partition sharpsl_rom_parts[] = {
    824	{
    825		.name	="Boot PROM Filesystem",
    826		.offset	= 0x00160000,
    827		.size	= MTDPART_SIZ_FULL,
    828	},
    829};
    830
    831static struct physmap_flash_data sharpsl_rom_data = {
    832	.width		= 2,
    833	.nr_parts	= ARRAY_SIZE(sharpsl_rom_parts),
    834	.parts		= sharpsl_rom_parts,
    835};
    836
    837static struct resource sharpsl_rom_resources[] = {
    838	{
    839		.start	= 0x00000000,
    840		.end	= 0x007fffff,
    841		.flags	= IORESOURCE_MEM,
    842	},
    843};
    844
    845static struct platform_device sharpsl_rom_device = {
    846	.name	= "physmap-flash",
    847	.id	= -1,
    848	.resource = sharpsl_rom_resources,
    849	.num_resources = ARRAY_SIZE(sharpsl_rom_resources),
    850	.dev.platform_data = &sharpsl_rom_data,
    851};
    852
    853static struct platform_device wm9712_device = {
    854	.name	= "wm9712-codec",
    855	.id	= -1,
    856};
    857
    858static struct platform_device tosa_audio_device = {
    859	.name	= "tosa-audio",
    860	.id	= -1,
    861};
    862
    863static struct platform_device *devices[] __initdata = {
    864	&tosascoop_device,
    865	&tosascoop_jc_device,
    866	&tc6393xb_device,
    867	&tosa_power_device,
    868	&tosakbd_device,
    869	&tosa_gpio_keys_device,
    870	&tosaled_device,
    871	&tosa_bt_device,
    872	&sharpsl_rom_device,
    873	&wm9712_device,
    874	&tosa_gpio_vbus,
    875	&tosa_audio_device,
    876};
    877
    878static void tosa_poweroff(void)
    879{
    880	pxa_restart(REBOOT_GPIO, NULL);
    881}
    882
    883static void tosa_restart(enum reboot_mode mode, const char *cmd)
    884{
    885	uint32_t msc0 = __raw_readl(MSC0);
    886
    887	/* Bootloader magic for a reboot */
    888	if((msc0 & 0xffff0000) == 0x7ff00000)
    889		__raw_writel((msc0 & 0xffff) | 0x7ee00000, MSC0);
    890
    891	tosa_poweroff();
    892}
    893
    894static void __init tosa_init(void)
    895{
    896	pxa2xx_mfp_config(ARRAY_AND_SIZE(tosa_pin_config));
    897
    898	pxa_set_ffuart_info(NULL);
    899	pxa_set_btuart_info(NULL);
    900	pxa_set_stuart_info(NULL);
    901
    902	gpio_set_wake(MFP_PIN_GPIO1, 1);
    903	/* We can't pass to gpio-keys since it will drop the Reset altfunc */
    904
    905	init_gpio_reset(TOSA_GPIO_ON_RESET, 0, 0);
    906
    907	pm_power_off = tosa_poweroff;
    908
    909	PCFR |= PCFR_OPDE;
    910
    911	/* enable batt_fault */
    912	PMCR = 0x01;
    913
    914	gpiod_add_lookup_table(&tosa_battery_gpio_table);
    915
    916	gpiod_add_lookup_table(&tosa_mci_gpio_table);
    917	pxa_set_mci_info(&tosa_mci_platform_data);
    918	pxa_set_ficp_info(&tosa_ficp_platform_data);
    919	pxa_set_i2c_info(NULL);
    920	pxa_set_ac97_info(NULL);
    921	platform_scoop_config = &tosa_pcmcia_config;
    922
    923	pxa2xx_set_spi_info(2, &pxa_ssp_master_info);
    924	spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));
    925
    926	clk_add_alias("CLK_CK3P6MI", tc6393xb_device.name, "GPIO11_CLK", NULL);
    927
    928	gpiod_add_lookup_table(&tosa_udc_gpiod_table);
    929	gpiod_add_lookup_table(&tosa_power_gpiod_table);
    930	platform_add_devices(devices, ARRAY_SIZE(devices));
    931}
    932
    933static void __init fixup_tosa(struct tag *tags, char **cmdline)
    934{
    935	sharpsl_save_param();
    936	memblock_add(0xa0000000, SZ_64M);
    937}
    938
    939MACHINE_START(TOSA, "SHARP Tosa")
    940	.fixup          = fixup_tosa,
    941	.map_io         = pxa25x_map_io,
    942	.nr_irqs	= TOSA_NR_IRQS,
    943	.init_irq       = pxa25x_init_irq,
    944	.handle_irq       = pxa25x_handle_irq,
    945	.init_machine   = tosa_init,
    946	.init_time	= pxa_timer_init,
    947	.restart	= tosa_restart,
    948MACHINE_END