2005-11-06 17:27:52 +03:00
/*
* Support for Sharp SL - C6000x PDAs
* Model : ( Tosa )
*
* Copyright ( c ) 2005 Dirk Opfer
*
* Based on code written by Sharp / Lineo for 2.4 kernels
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
*/
# include <linux/kernel.h>
# include <linux/init.h>
2005-11-21 18:17:06 +03:00
# include <linux/platform_device.h>
2005-11-06 17:27:52 +03:00
# include <linux/major.h>
# include <linux/fs.h>
# include <linux/interrupt.h>
2008-06-14 14:42:02 +04:00
# include <linux/delay.h>
# include <linux/fb.h>
2005-11-06 17:27:52 +03:00
# include <linux/mmc/host.h>
2008-06-14 14:42:02 +04:00
# include <linux/mfd/tc6393xb.h>
2008-06-27 13:38:44 +04:00
# include <linux/mfd/tmio.h>
# include <linux/mtd/nand.h>
# include <linux/mtd/partitions.h>
2006-06-19 22:57:12 +04:00
# include <linux/pm.h>
2006-06-21 02:27:37 +04:00
# include <linux/delay.h>
2008-01-21 09:04:20 +03:00
# include <linux/gpio_keys.h>
# include <linux/input.h>
2008-04-12 23:16:16 +04:00
# include <linux/gpio.h>
2008-06-14 14:43:36 +04:00
# include <linux/pda_power.h>
2005-11-06 17:27:52 +03:00
# include <asm/setup.h>
# include <asm/mach-types.h>
2008-01-30 11:39:48 +03:00
# include <asm/arch/pxa2xx-regs.h>
2008-04-10 14:00:32 +04:00
# include <asm/arch/mfp-pxa25x.h>
2005-11-06 17:27:52 +03:00
# include <asm/arch/irda.h>
2008-04-10 18:43:18 +04:00
# include <asm/arch/i2c.h>
2005-11-06 17:27:52 +03:00
# include <asm/arch/mmc.h>
# include <asm/arch/udc.h>
# include <asm/mach/arch.h>
# include <asm/arch/tosa.h>
# include <asm/hardware/scoop.h>
# include <asm/mach/sharpsl_param.h>
# include "generic.h"
2007-05-15 18:39:36 +04:00
# include "devices.h"
2005-11-06 17:27:52 +03:00
2008-04-10 14:00:32 +04:00
static unsigned long tosa_pin_config [ ] = {
GPIO78_nCS_2 , /* Scoop */
GPIO80_nCS_4 , /* tg6393xb */
GPIO33_nCS_5 , /* Scoop */
// GPIO76 CARD_VCC_ON1
GPIO19_GPIO , /* Reset out */
GPIO1_RST | WAKEUP_ON_EDGE_FALL ,
GPIO0_GPIO | WAKEUP_ON_EDGE_FALL , /* WAKE_UP */
GPIO2_GPIO | WAKEUP_ON_EDGE_BOTH , /* AC_IN */
GPIO3_GPIO | WAKEUP_ON_EDGE_FALL , /* RECORD */
GPIO4_GPIO | WAKEUP_ON_EDGE_FALL , /* SYNC */
GPIO20_GPIO , /* EAR_IN */
GPIO22_GPIO , /* On */
GPIO5_GPIO , /* USB_IN */
GPIO32_GPIO , /* Pen IRQ */
GPIO7_GPIO , /* Jacket Detect */
GPIO14_GPIO , /* BAT0_CRG */
GPIO12_GPIO , /* BAT1_CRG */
GPIO17_GPIO , /* BAT0_LOW */
GPIO84_GPIO , /* BAT1_LOW */
GPIO38_GPIO , /* BAT_LOCK */
GPIO11_3_6MHz ,
GPIO15_GPIO , /* TC6393XB IRQ */
GPIO18_RDY ,
GPIO27_GPIO , /* LCD Sync */
/* MMC */
GPIO6_MMC_CLK ,
GPIO8_MMC_CS0 ,
GPIO9_GPIO , /* Detect */
2008-06-09 16:23:50 +04:00
GPIO10_GPIO , /* nSD_INT */
2008-04-10 14:00:32 +04:00
/* CF */
GPIO13_GPIO , /* CD_IRQ */
GPIO21_GPIO , /* Main Slot IRQ */
GPIO36_GPIO , /* Jacket Slot IRQ */
GPIO48_nPOE ,
GPIO49_nPWE ,
GPIO50_nPIOR ,
GPIO51_nPIOW ,
GPIO52_nPCE_1 ,
GPIO53_nPCE_2 ,
GPIO54_nPSKTSEL ,
GPIO55_nPREG ,
GPIO56_nPWAIT ,
GPIO57_nIOIS16 ,
/* AC97 */
GPIO31_AC97_SYNC ,
GPIO30_AC97_SDATA_OUT ,
GPIO28_AC97_BITCLK ,
GPIO29_AC97_SDATA_IN_0 ,
// GPIO79 nAUD_IRQ
/* FFUART */
GPIO34_FFUART_RXD ,
GPIO35_FFUART_CTS ,
GPIO37_FFUART_DSR ,
GPIO39_FFUART_TXD ,
GPIO40_FFUART_DTR ,
GPIO41_FFUART_RTS ,
/* BTUART */
GPIO42_BTUART_RXD ,
GPIO43_BTUART_TXD ,
GPIO44_BTUART_CTS ,
GPIO45_BTUART_RTS ,
/* Keybd */
2008-05-26 06:28:50 +04:00
GPIO58_GPIO | MFP_LPM_DRIVE_LOW ,
GPIO59_GPIO | MFP_LPM_DRIVE_LOW ,
GPIO60_GPIO | MFP_LPM_DRIVE_LOW ,
GPIO61_GPIO | MFP_LPM_DRIVE_LOW ,
GPIO62_GPIO | MFP_LPM_DRIVE_LOW ,
GPIO63_GPIO | MFP_LPM_DRIVE_LOW ,
GPIO64_GPIO | MFP_LPM_DRIVE_LOW ,
GPIO65_GPIO | MFP_LPM_DRIVE_LOW ,
GPIO66_GPIO | MFP_LPM_DRIVE_LOW ,
GPIO67_GPIO | MFP_LPM_DRIVE_LOW ,
GPIO68_GPIO | MFP_LPM_DRIVE_LOW ,
GPIO69_GPIO | MFP_LPM_DRIVE_LOW ,
GPIO70_GPIO | MFP_LPM_DRIVE_LOW ,
GPIO71_GPIO | MFP_LPM_DRIVE_LOW ,
GPIO72_GPIO | MFP_LPM_DRIVE_LOW ,
GPIO73_GPIO | MFP_LPM_DRIVE_LOW ,
GPIO74_GPIO | MFP_LPM_DRIVE_LOW ,
GPIO75_GPIO | MFP_LPM_DRIVE_LOW ,
2008-04-10 14:00:32 +04:00
/* SPI */
GPIO81_SSP2_CLK_OUT ,
GPIO82_SSP2_FRM_OUT ,
GPIO83_SSP2_TXD ,
} ;
2008-06-12 14:42:07 +04:00
static unsigned long tosa_pin_irda_off [ ] = {
GPIO46_STUART_RXD ,
GPIO47_GPIO | MFP_LPM_DRIVE_LOW ,
} ;
static unsigned long tosa_pin_irda_on [ ] = {
GPIO46_STUART_RXD ,
GPIO47_STUART_TXD ,
} ;
2005-11-06 17:27:52 +03:00
/*
* SCOOP Device
*/
static struct resource tosa_scoop_resources [ ] = {
[ 0 ] = {
. start = TOSA_CF_PHYS ,
. end = TOSA_CF_PHYS + 0xfff ,
. flags = IORESOURCE_MEM ,
} ,
} ;
static struct scoop_config tosa_scoop_setup = {
. io_dir = TOSA_SCOOP_IO_DIR ,
2008-04-12 23:16:16 +04:00
. gpio_base = TOSA_SCOOP_GPIO_BASE ,
2005-11-06 17:27:52 +03:00
} ;
2008-04-19 13:42:25 +04:00
static struct platform_device tosascoop_device = {
2005-11-06 17:27:52 +03:00
. name = " sharp-scoop " ,
. id = 0 ,
. dev = {
. platform_data = & tosa_scoop_setup ,
} ,
. num_resources = ARRAY_SIZE ( tosa_scoop_resources ) ,
. resource = tosa_scoop_resources ,
} ;
/*
* SCOOP Device Jacket
*/
static struct resource tosa_scoop_jc_resources [ ] = {
[ 0 ] = {
. start = TOSA_SCOOP_PHYS + 0x40 ,
. end = TOSA_SCOOP_PHYS + 0xfff ,
. flags = IORESOURCE_MEM ,
} ,
} ;
static struct scoop_config tosa_scoop_jc_setup = {
. io_dir = TOSA_SCOOP_JC_IO_DIR ,
2008-04-12 23:16:16 +04:00
. gpio_base = TOSA_SCOOP_JC_GPIO_BASE ,
2005-11-06 17:27:52 +03:00
} ;
2008-04-19 13:42:25 +04:00
static struct platform_device tosascoop_jc_device = {
2005-11-06 17:27:52 +03:00
. name = " sharp-scoop " ,
. id = 1 ,
. dev = {
. platform_data = & tosa_scoop_jc_setup ,
. parent = & tosascoop_device . dev ,
} ,
. num_resources = ARRAY_SIZE ( tosa_scoop_jc_resources ) ,
. resource = tosa_scoop_jc_resources ,
} ;
2005-11-08 22:15:50 +03:00
/*
* PCMCIA
*/
2005-11-06 17:27:52 +03:00
static struct scoop_pcmcia_dev tosa_pcmcia_scoop [ ] = {
{
. dev = & tosascoop_device . dev ,
. irq = TOSA_IRQ_GPIO_CF_IRQ ,
. cd_irq = TOSA_IRQ_GPIO_CF_CD ,
. cd_irq_str = " PCMCIA0 CD " ,
} , {
. dev = & tosascoop_jc_device . dev ,
. irq = TOSA_IRQ_GPIO_JC_CF_IRQ ,
. cd_irq = - 1 ,
} ,
} ;
2005-11-08 22:15:50 +03:00
static struct scoop_pcmcia_config tosa_pcmcia_config = {
. devs = & tosa_pcmcia_scoop [ 0 ] ,
. num_devs = 2 ,
} ;
2005-11-08 22:15:30 +03:00
/*
* USB Device Controller
*/
static struct pxa2xx_udc_mach_info udc_info __initdata = {
2008-04-12 23:16:16 +04:00
. gpio_pullup = TOSA_GPIO_USB_PULLUP ,
2007-12-21 12:18:01 +03:00
. gpio_vbus = TOSA_GPIO_USB_IN ,
. gpio_vbus_inverted = 1 ,
2005-11-08 22:15:30 +03:00
} ;
/*
* MMC / SD Device
*/
static struct pxamci_platform_data tosa_mci_platform_data ;
2006-10-09 15:19:47 +04:00
static int tosa_mci_init ( struct device * dev , irq_handler_t tosa_detect_int , void * data )
2005-11-08 22:15:30 +03:00
{
int err ;
tosa_mci_platform_data . detect_delay = msecs_to_jiffies ( 250 ) ;
2008-06-09 16:23:50 +04:00
err = gpio_request ( TOSA_GPIO_nSD_DETECT , " MMC/SD card detect " ) ;
if ( err ) {
printk ( KERN_ERR " tosa_mci_init: can't request nSD_DETECT gpio \n " ) ;
goto err_gpio_detect ;
}
err = gpio_direction_input ( TOSA_GPIO_nSD_DETECT ) ;
if ( err )
goto err_gpio_detect_dir ;
2008-01-23 17:05:58 +03:00
err = request_irq ( TOSA_IRQ_GPIO_nSD_DETECT , tosa_detect_int ,
IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING ,
2005-11-08 22:15:30 +03:00
" MMC/SD card detect " , data ) ;
2008-04-12 23:16:16 +04:00
if ( err ) {
2005-11-08 22:15:30 +03:00
printk ( KERN_ERR " tosa_mci_init: MMC/SD: can't request MMC card detect IRQ \n " ) ;
2008-04-12 23:16:16 +04:00
goto err_irq ;
}
2008-06-09 16:23:50 +04:00
err = gpio_request ( TOSA_GPIO_SD_WP , " SD Write Protect " ) ;
2008-04-12 23:16:16 +04:00
if ( err ) {
printk ( KERN_ERR " tosa_mci_init: can't request SD_WP gpio \n " ) ;
goto err_gpio_wp ;
}
err = gpio_direction_input ( TOSA_GPIO_SD_WP ) ;
if ( err )
goto err_gpio_wp_dir ;
2008-06-09 16:23:50 +04:00
err = gpio_request ( TOSA_GPIO_PWR_ON , " SD Power " ) ;
2008-04-12 23:16:16 +04:00
if ( err ) {
printk ( KERN_ERR " tosa_mci_init: can't request SD_PWR gpio \n " ) ;
goto err_gpio_pwr ;
}
err = gpio_direction_output ( TOSA_GPIO_PWR_ON , 0 ) ;
if ( err )
goto err_gpio_pwr_dir ;
2005-11-08 22:15:30 +03:00
2008-06-09 16:23:50 +04:00
err = gpio_request ( TOSA_GPIO_nSD_INT , " SD Int " ) ;
if ( err ) {
printk ( KERN_ERR " tosa_mci_init: can't request SD_PWR gpio \n " ) ;
goto err_gpio_int ;
}
err = gpio_direction_input ( TOSA_GPIO_nSD_INT ) ;
if ( err )
goto err_gpio_int_dir ;
2008-04-12 23:16:16 +04:00
return 0 ;
2008-06-09 16:23:50 +04:00
err_gpio_int_dir :
gpio_free ( TOSA_GPIO_nSD_INT ) ;
err_gpio_int :
2008-04-12 23:16:16 +04:00
err_gpio_pwr_dir :
gpio_free ( TOSA_GPIO_PWR_ON ) ;
err_gpio_pwr :
err_gpio_wp_dir :
gpio_free ( TOSA_GPIO_SD_WP ) ;
err_gpio_wp :
free_irq ( TOSA_IRQ_GPIO_nSD_DETECT , data ) ;
err_irq :
2008-06-09 16:23:50 +04:00
err_gpio_detect_dir :
gpio_free ( TOSA_GPIO_nSD_DETECT ) ;
err_gpio_detect :
2008-01-23 17:05:58 +03:00
return err ;
2005-11-08 22:15:30 +03:00
}
static void tosa_mci_setpower ( struct device * dev , unsigned int vdd )
{
struct pxamci_platform_data * p_d = dev - > platform_data ;
if ( ( 1 < < vdd ) & p_d - > ocr_mask ) {
2008-04-12 23:16:16 +04:00
gpio_set_value ( TOSA_GPIO_PWR_ON , 1 ) ;
2005-11-08 22:15:30 +03:00
} else {
2008-04-12 23:16:16 +04:00
gpio_set_value ( TOSA_GPIO_PWR_ON , 0 ) ;
2005-11-08 22:15:30 +03:00
}
}
static int tosa_mci_get_ro ( struct device * dev )
{
2008-04-12 23:16:16 +04:00
return gpio_get_value ( TOSA_GPIO_SD_WP ) ;
2005-11-08 22:15:30 +03:00
}
static void tosa_mci_exit ( struct device * dev , void * data )
{
2008-06-09 16:23:50 +04:00
gpio_free ( TOSA_GPIO_nSD_INT ) ;
2008-04-12 23:16:16 +04:00
gpio_free ( TOSA_GPIO_PWR_ON ) ;
gpio_free ( TOSA_GPIO_SD_WP ) ;
2005-11-08 22:15:30 +03:00
free_irq ( TOSA_IRQ_GPIO_nSD_DETECT , data ) ;
2008-06-09 16:23:50 +04:00
gpio_free ( TOSA_GPIO_nSD_DETECT ) ;
2005-11-08 22:15:30 +03:00
}
static struct pxamci_platform_data tosa_mci_platform_data = {
. ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34 ,
. init = tosa_mci_init ,
. get_ro = tosa_mci_get_ro ,
. setpower = tosa_mci_setpower ,
. exit = tosa_mci_exit ,
} ;
/*
* Irda
*/
2008-06-12 14:42:07 +04:00
static void tosa_irda_transceiver_mode ( struct device * dev , int mode )
{
if ( mode & IR_OFF ) {
gpio_set_value ( TOSA_GPIO_IR_POWERDWN , 0 ) ;
pxa2xx_mfp_config ( ARRAY_AND_SIZE ( tosa_pin_irda_off ) ) ;
gpio_direction_output ( TOSA_GPIO_IRDA_TX , 0 ) ;
} else {
pxa2xx_mfp_config ( ARRAY_AND_SIZE ( tosa_pin_irda_on ) ) ;
gpio_set_value ( TOSA_GPIO_IR_POWERDWN , 1 ) ;
}
}
2008-04-12 23:16:16 +04:00
static int tosa_irda_startup ( struct device * dev )
2005-11-08 22:15:30 +03:00
{
2008-04-12 23:16:16 +04:00
int ret ;
2008-06-12 14:42:07 +04:00
ret = gpio_request ( TOSA_GPIO_IRDA_TX , " IrDA TX " ) ;
if ( ret )
goto err_tx ;
ret = gpio_direction_output ( TOSA_GPIO_IRDA_TX , 0 ) ;
if ( ret )
goto err_tx_dir ;
2008-04-12 23:16:16 +04:00
ret = gpio_request ( TOSA_GPIO_IR_POWERDWN , " IrDA powerdown " ) ;
if ( ret )
2008-06-12 14:42:07 +04:00
goto err_pwr ;
2008-04-12 23:16:16 +04:00
ret = gpio_direction_output ( TOSA_GPIO_IR_POWERDWN , 0 ) ;
if ( ret )
2008-06-12 14:42:07 +04:00
goto err_pwr_dir ;
2008-04-12 23:16:16 +04:00
2008-06-12 14:42:07 +04:00
tosa_irda_transceiver_mode ( dev , IR_SIRMODE | IR_OFF ) ;
2008-04-12 23:16:16 +04:00
2008-06-12 14:42:07 +04:00
return 0 ;
err_pwr_dir :
2008-04-12 23:16:16 +04:00
gpio_free ( TOSA_GPIO_IR_POWERDWN ) ;
2008-06-12 14:42:07 +04:00
err_pwr :
err_tx_dir :
gpio_free ( TOSA_GPIO_IRDA_TX ) ;
err_tx :
return ret ;
2008-04-12 23:16:16 +04:00
}
2008-06-12 14:42:07 +04:00
static void tosa_irda_shutdown ( struct device * dev )
2008-04-12 23:16:16 +04:00
{
2008-06-12 14:42:07 +04:00
tosa_irda_transceiver_mode ( dev , IR_SIRMODE | IR_OFF ) ;
gpio_free ( TOSA_GPIO_IR_POWERDWN ) ;
gpio_free ( TOSA_GPIO_IRDA_TX ) ;
2005-11-08 22:15:30 +03:00
}
static struct pxaficp_platform_data tosa_ficp_platform_data = {
. transceiver_cap = IR_SIRMODE | IR_OFF ,
. transceiver_mode = tosa_irda_transceiver_mode ,
2008-04-12 23:16:16 +04:00
. startup = tosa_irda_startup ,
. shutdown = tosa_irda_shutdown ,
2005-11-08 22:15:30 +03:00
} ;
2008-06-14 14:43:36 +04:00
/*
* Tosa AC IN
*/
static int tosa_power_init ( struct device * dev )
{
int ret = gpio_request ( TOSA_GPIO_AC_IN , " ac in " ) ;
if ( ret )
goto err_gpio_req ;
ret = gpio_direction_input ( TOSA_GPIO_AC_IN ) ;
if ( ret )
goto err_gpio_in ;
return 0 ;
err_gpio_in :
gpio_free ( TOSA_GPIO_AC_IN ) ;
err_gpio_req :
return ret ;
}
static void tosa_power_exit ( struct device * dev )
{
gpio_free ( TOSA_GPIO_AC_IN ) ;
}
static int tosa_power_ac_online ( void )
{
return gpio_get_value ( TOSA_GPIO_AC_IN ) = = 0 ;
}
static char * tosa_ac_supplied_to [ ] = {
" main-battery " ,
" backup-battery " ,
" jacket-battery " ,
} ;
static struct pda_power_pdata tosa_power_data = {
. init = tosa_power_init ,
. is_ac_online = tosa_power_ac_online ,
. exit = tosa_power_exit ,
. supplied_to = tosa_ac_supplied_to ,
. num_supplicants = ARRAY_SIZE ( tosa_ac_supplied_to ) ,
} ;
static struct resource tosa_power_resource [ ] = {
{
. name = " ac " ,
. start = gpio_to_irq ( TOSA_GPIO_AC_IN ) ,
. end = gpio_to_irq ( TOSA_GPIO_AC_IN ) ,
. flags = IORESOURCE_IRQ |
IORESOURCE_IRQ_HIGHEDGE |
IORESOURCE_IRQ_LOWEDGE ,
} ,
} ;
static struct platform_device tosa_power_device = {
. name = " pda-power " ,
. id = - 1 ,
. dev . platform_data = & tosa_power_data ,
. resource = tosa_power_resource ,
. num_resources = ARRAY_SIZE ( tosa_power_resource ) ,
} ;
2005-11-08 22:15:30 +03:00
/*
* Tosa Keyboard
*/
static struct platform_device tosakbd_device = {
. name = " tosa-keyboard " ,
. id = - 1 ,
} ;
2005-11-06 17:27:52 +03:00
2008-01-21 09:04:20 +03:00
static struct gpio_keys_button tosa_gpio_keys [ ] = {
2008-04-12 23:02:50 +04:00
/*
* Two following keys are directly tied to " ON " button of tosa . Why ?
* The first one can be used as a wakeup source , the second can ' t ;
* also the first one is OR of ac_powered and on_button .
*/
{
. type = EV_PWR ,
. code = KEY_RESERVED ,
. gpio = TOSA_GPIO_POWERON ,
. desc = " Poweron " ,
. wakeup = 1 ,
. active_low = 1 ,
} ,
2008-01-21 09:04:20 +03:00
{
. type = EV_PWR ,
. code = KEY_SUSPEND ,
. gpio = TOSA_GPIO_ON_KEY ,
. desc = " On key " ,
2008-04-12 23:02:50 +04:00
/*
* can ' t be used as wakeup
* . wakeup = 1 ,
*/
2008-01-21 09:04:20 +03:00
. active_low = 1 ,
} ,
{
. type = EV_KEY ,
. code = TOSA_KEY_RECORD ,
. gpio = TOSA_GPIO_RECORD_BTN ,
. desc = " Record Button " ,
. wakeup = 1 ,
. active_low = 1 ,
} ,
{
. type = EV_KEY ,
. code = TOSA_KEY_SYNC ,
. gpio = TOSA_GPIO_SYNC ,
. desc = " Sync Button " ,
. wakeup = 1 ,
. active_low = 1 ,
} ,
} ;
static struct gpio_keys_platform_data tosa_gpio_keys_platform_data = {
. buttons = tosa_gpio_keys ,
. nbuttons = ARRAY_SIZE ( tosa_gpio_keys ) ,
} ;
static struct platform_device tosa_gpio_keys_device = {
. name = " gpio-keys " ,
. id = - 1 ,
. dev = {
. platform_data = & tosa_gpio_keys_platform_data ,
} ,
} ;
2006-03-31 14:31:12 +04:00
/*
* Tosa LEDs
*/
2008-04-19 13:42:25 +04:00
static struct gpio_led tosa_gpio_leds [ ] = {
2008-04-12 23:17:02 +04:00
{
. name = " tosa:amber:charge " ,
. default_trigger = " main-battery-charging " ,
. gpio = TOSA_GPIO_CHRG_ERR_LED ,
} ,
{
. name = " tosa:green:mail " ,
. default_trigger = " nand-disk " ,
. gpio = TOSA_GPIO_NOTE_LED ,
} ,
2008-04-19 13:42:06 +04:00
{
. name = " tosa:dual:wlan " ,
. default_trigger = " none " ,
. gpio = TOSA_GPIO_WLAN_LED ,
} ,
{
. name = " tosa:blue:bluetooth " ,
. default_trigger = " none " ,
. gpio = TOSA_GPIO_BT_LED ,
} ,
2008-04-12 23:17:02 +04:00
} ;
2008-04-19 13:42:25 +04:00
static struct gpio_led_platform_data tosa_gpio_leds_platform_data = {
2008-04-12 23:17:02 +04:00
. leds = tosa_gpio_leds ,
. num_leds = ARRAY_SIZE ( tosa_gpio_leds ) ,
} ;
2006-03-31 14:31:12 +04:00
static struct platform_device tosaled_device = {
2008-04-12 23:17:02 +04:00
. name = " leds-gpio " ,
. id = - 1 ,
. dev = {
. platform_data = & tosa_gpio_leds_platform_data ,
} ,
2006-03-31 14:31:12 +04:00
} ;
2008-06-14 14:42:02 +04:00
/*
* Toshiba Mobile IO Controller
*/
static struct resource tc6393xb_resources [ ] = {
[ 0 ] = {
. start = TOSA_LCDC_PHYS ,
. end = TOSA_LCDC_PHYS + 0x3ffffff ,
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = {
. start = TOSA_IRQ_GPIO_TC6393XB_INT ,
. end = TOSA_IRQ_GPIO_TC6393XB_INT ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static int tosa_tc6393xb_enable ( struct platform_device * dev )
{
int rc ;
rc = gpio_request ( TOSA_GPIO_TC6393XB_REST_IN , " tc6393xb #pclr " ) ;
if ( rc )
goto err_req_pclr ;
rc = gpio_request ( TOSA_GPIO_TC6393XB_SUSPEND , " tc6393xb #suspend " ) ;
if ( rc )
goto err_req_suspend ;
rc = gpio_request ( TOSA_GPIO_TC6393XB_L3V_ON , " l3v " ) ;
if ( rc )
goto err_req_l3v ;
rc = gpio_direction_output ( TOSA_GPIO_TC6393XB_L3V_ON , 0 ) ;
if ( rc )
goto err_dir_l3v ;
rc = gpio_direction_output ( TOSA_GPIO_TC6393XB_SUSPEND , 0 ) ;
if ( rc )
goto err_dir_suspend ;
rc = gpio_direction_output ( TOSA_GPIO_TC6393XB_REST_IN , 0 ) ;
if ( rc )
goto err_dir_pclr ;
mdelay ( 1 ) ;
gpio_set_value ( TOSA_GPIO_TC6393XB_SUSPEND , 1 ) ;
mdelay ( 10 ) ;
gpio_set_value ( TOSA_GPIO_TC6393XB_REST_IN , 1 ) ;
gpio_set_value ( TOSA_GPIO_TC6393XB_L3V_ON , 1 ) ;
return 0 ;
err_dir_pclr :
err_dir_suspend :
err_dir_l3v :
gpio_free ( TOSA_GPIO_TC6393XB_L3V_ON ) ;
err_req_l3v :
gpio_free ( TOSA_GPIO_TC6393XB_SUSPEND ) ;
err_req_suspend :
gpio_free ( TOSA_GPIO_TC6393XB_REST_IN ) ;
err_req_pclr :
return rc ;
}
static int tosa_tc6393xb_disable ( struct platform_device * dev )
{
gpio_free ( TOSA_GPIO_TC6393XB_L3V_ON ) ;
gpio_free ( TOSA_GPIO_TC6393XB_SUSPEND ) ;
gpio_free ( TOSA_GPIO_TC6393XB_REST_IN ) ;
return 0 ;
}
static int tosa_tc6393xb_resume ( struct platform_device * dev )
{
gpio_set_value ( TOSA_GPIO_TC6393XB_SUSPEND , 1 ) ;
mdelay ( 10 ) ;
gpio_set_value ( TOSA_GPIO_TC6393XB_L3V_ON , 1 ) ;
mdelay ( 10 ) ;
return 0 ;
}
static int tosa_tc6393xb_suspend ( struct platform_device * dev )
{
gpio_set_value ( TOSA_GPIO_TC6393XB_L3V_ON , 0 ) ;
gpio_set_value ( TOSA_GPIO_TC6393XB_SUSPEND , 0 ) ;
return 0 ;
}
2008-06-27 13:38:44 +04:00
static struct mtd_partition tosa_nand_partition [ ] = {
{
. name = " smf " ,
. offset = 0 ,
. size = 7 * 1024 * 1024 ,
} ,
{
. name = " root " ,
. offset = MTDPART_OFS_APPEND ,
. size = 28 * 1024 * 1024 ,
} ,
{
. name = " home " ,
. offset = MTDPART_OFS_APPEND ,
. size = MTDPART_SIZ_FULL ,
} ,
} ;
static uint8_t scan_ff_pattern [ ] = { 0xff , 0xff } ;
static struct nand_bbt_descr tosa_tc6393xb_nand_bbt = {
. options = 0 ,
. offs = 4 ,
. len = 2 ,
. pattern = scan_ff_pattern
} ;
static struct tmio_nand_data tosa_tc6393xb_nand_config = {
. num_partitions = ARRAY_SIZE ( tosa_nand_partition ) ,
. partition = tosa_nand_partition ,
. badblock_pattern = & tosa_tc6393xb_nand_bbt ,
} ;
2008-06-14 14:42:02 +04:00
static struct tc6393xb_platform_data tosa_tc6393xb_setup = {
. scr_pll2cr = 0x0cc1 ,
. scr_gper = 0x3300 ,
. scr_gpo_dsr =
TOSA_TC6393XB_GPIO_BIT ( TOSA_GPIO_CARD_VCC_ON ) ,
. scr_gpo_doecr =
TOSA_TC6393XB_GPIO_BIT ( TOSA_GPIO_CARD_VCC_ON ) ,
. irq_base = IRQ_BOARD_START ,
. gpio_base = TOSA_TC6393XB_GPIO_BASE ,
. enable = tosa_tc6393xb_enable ,
. disable = tosa_tc6393xb_disable ,
. suspend = tosa_tc6393xb_suspend ,
. resume = tosa_tc6393xb_resume ,
2008-06-27 13:38:44 +04:00
. nand_data = & tosa_tc6393xb_nand_config ,
2008-06-14 14:42:02 +04:00
} ;
static struct platform_device tc6393xb_device = {
. name = " tc6393xb " ,
. id = - 1 ,
. dev = {
. platform_data = & tosa_tc6393xb_setup ,
} ,
. num_resources = ARRAY_SIZE ( tc6393xb_resources ) ,
. resource = tc6393xb_resources ,
} ;
2005-11-06 17:27:52 +03:00
static struct platform_device * devices [ ] __initdata = {
& tosascoop_device ,
& tosascoop_jc_device ,
2008-06-14 14:42:02 +04:00
& tc6393xb_device ,
2008-06-14 14:43:36 +04:00
& tosa_power_device ,
2005-11-08 22:15:30 +03:00
& tosakbd_device ,
2008-01-21 09:04:20 +03:00
& tosa_gpio_keys_device ,
2006-03-31 14:31:12 +04:00
& tosaled_device ,
2005-11-06 17:27:52 +03:00
} ;
2006-06-19 22:57:12 +04:00
static void tosa_poweroff ( void )
{
2008-05-22 19:21:48 +04:00
arm_machine_restart ( ' g ' ) ;
2006-06-19 22:57:12 +04:00
}
static void tosa_restart ( char mode )
{
/* Bootloader magic for a reboot */
if ( ( MSC0 & 0xffff0000 ) = = 0x7ff00000 )
MSC0 = ( MSC0 & 0xffff ) | 0x7ee00000 ;
tosa_poweroff ( ) ;
}
2005-11-06 17:27:52 +03:00
static void __init tosa_init ( void )
{
2008-06-14 14:42:02 +04:00
int dummy ;
2008-04-10 14:00:32 +04:00
pxa2xx_mfp_config ( ARRAY_AND_SIZE ( tosa_pin_config ) ) ;
2008-06-12 14:42:07 +04:00
pxa2xx_mfp_config ( ARRAY_AND_SIZE ( tosa_pin_irda_off ) ) ;
2008-04-10 14:00:32 +04:00
gpio_set_wake ( MFP_PIN_GPIO1 , 1 ) ;
/* We can't pass to gpio-keys since it will drop the Reset altfunc */
2008-05-22 19:21:48 +04:00
init_gpio_reset ( TOSA_GPIO_ON_RESET ) ;
2006-06-19 22:57:12 +04:00
pm_power_off = tosa_poweroff ;
arm_pm_restart = tosa_restart ;
2005-11-06 17:27:52 +03:00
PCFR | = PCFR_OPDE ;
2005-11-08 22:15:30 +03:00
/* enable batt_fault */
2005-11-06 17:27:52 +03:00
PMCR = 0x01 ;
2008-06-14 14:42:02 +04:00
dummy = gpiochip_reserve ( TOSA_SCOOP_GPIO_BASE , 12 ) ;
dummy = gpiochip_reserve ( TOSA_SCOOP_JC_GPIO_BASE , 12 ) ;
dummy = gpiochip_reserve ( TOSA_TC6393XB_GPIO_BASE , 16 ) ;
2005-11-08 22:15:30 +03:00
pxa_set_mci_info ( & tosa_mci_platform_data ) ;
pxa_set_udc_info ( & udc_info ) ;
pxa_set_ficp_info ( & tosa_ficp_platform_data ) ;
2008-04-10 18:43:18 +04:00
pxa_set_i2c_info ( NULL ) ;
2005-11-08 22:15:50 +03:00
platform_scoop_config = & tosa_pcmcia_config ;
2005-11-06 17:27:52 +03:00
2005-11-08 22:15:50 +03:00
platform_add_devices ( devices , ARRAY_SIZE ( devices ) ) ;
2005-11-06 17:27:52 +03:00
}
static void __init fixup_tosa ( struct machine_desc * desc ,
struct tag * tags , char * * cmdline , struct meminfo * mi )
{
sharpsl_save_param ( ) ;
mi - > nr_banks = 1 ;
mi - > bank [ 0 ] . start = 0xa0000000 ;
mi - > bank [ 0 ] . node = 0 ;
mi - > bank [ 0 ] . size = ( 64 * 1024 * 1024 ) ;
}
MACHINE_START ( TOSA , " SHARP Tosa " )
. phys_io = 0x40000000 ,
. io_pg_offst = ( io_p2v ( 0x40000000 ) > > 18 ) & 0xfffc ,
. fixup = fixup_tosa ,
. map_io = pxa_map_io ,
2007-06-22 07:14:09 +04:00
. init_irq = pxa25x_init_irq ,
2005-11-06 17:27:52 +03:00
. init_machine = tosa_init ,
. timer = & pxa_timer ,
MACHINE_END