Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

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