2005-09-13 12:25:34 +04:00
/*
* Support for Sharp SL - Cxx00 Series of PDAs
* Models : SL - C3000 ( Spitz ) , SL - C1000 ( Akita ) and SL - C3100 ( Borzoi )
*
* Copyright ( c ) 2005 Richard Purdie
*
* Based on Sharp ' s 2.4 kernel patches / lubbock . c
*
* 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>
2005-10-29 22:07:23 +04:00
# include <linux/platform_device.h>
2005-09-13 12:25:34 +04:00
# include <linux/delay.h>
2008-09-02 13:34:33 +04:00
# include <linux/gpio.h>
2008-09-05 18:38:23 +04:00
# include <linux/leds.h>
2008-11-25 00:57:28 +03:00
# include <linux/mtd/physmap.h>
2008-09-06 04:46:23 +04:00
# include <linux/i2c.h>
# include <linux/i2c/pca953x.h>
2008-09-03 08:09:24 +04:00
# include <linux/spi/spi.h>
# include <linux/spi/ads7846.h>
# include <linux/spi/corgi_lcd.h>
2008-10-16 19:17:05 +04:00
# include <linux/mtd/sharpsl.h>
2009-07-27 12:59:39 +04:00
# include <linux/input/matrix_keypad.h>
2005-09-13 12:25:34 +04:00
# include <asm/setup.h>
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
2009-05-17 17:05:23 +04:00
# include <asm/mach/sharpsl_param.h>
# include <asm/hardware/scoop.h>
2005-09-13 12:25:34 +04:00
2009-01-02 18:17:22 +03:00
# include <mach/pxa27x.h>
2008-08-05 19:14:15 +04:00
# include <mach/pxa27x-udc.h>
2008-08-07 14:05:25 +04:00
# include <mach/reset.h>
2009-04-13 11:03:11 +04:00
# include <plat/i2c.h>
2008-08-05 19:14:15 +04:00
# include <mach/irda.h>
# include <mach/mmc.h>
# include <mach/ohci.h>
# include <mach/pxafb.h>
2008-09-03 08:09:24 +04:00
# include <mach/pxa2xx_spi.h>
2008-08-05 19:14:15 +04:00
# include <mach/spitz.h>
2005-09-13 12:25:34 +04:00
# include "generic.h"
2007-05-15 18:39:36 +04:00
# include "devices.h"
2005-09-13 12:25:34 +04:00
# include "sharpsl.h"
2008-09-03 05:47:42 +04:00
static unsigned long spitz_pin_config [ ] __initdata = {
/* Chip Selects */
GPIO78_nCS_2 , /* SCOOP #2 */
2008-11-16 10:56:58 +03:00
GPIO79_nCS_3 , /* NAND */
2008-09-03 05:47:42 +04:00
GPIO80_nCS_4 , /* SCOOP #1 */
/* LCD - 16bpp Active TFT */
GPIO58_LCD_LDD_0 ,
GPIO59_LCD_LDD_1 ,
GPIO60_LCD_LDD_2 ,
GPIO61_LCD_LDD_3 ,
GPIO62_LCD_LDD_4 ,
GPIO63_LCD_LDD_5 ,
GPIO64_LCD_LDD_6 ,
GPIO65_LCD_LDD_7 ,
GPIO66_LCD_LDD_8 ,
GPIO67_LCD_LDD_9 ,
GPIO68_LCD_LDD_10 ,
GPIO69_LCD_LDD_11 ,
GPIO70_LCD_LDD_12 ,
GPIO71_LCD_LDD_13 ,
GPIO72_LCD_LDD_14 ,
GPIO73_LCD_LDD_15 ,
GPIO74_LCD_FCLK ,
GPIO75_LCD_LCLK ,
GPIO76_LCD_PCLK ,
/* PC Card */
GPIO48_nPOE ,
GPIO49_nPWE ,
GPIO50_nPIOR ,
GPIO51_nPIOW ,
GPIO85_nPCE_1 ,
GPIO54_nPCE_2 ,
GPIO55_nPREG ,
GPIO56_nPWAIT ,
GPIO57_nIOIS16 ,
2008-11-16 10:56:58 +03:00
GPIO104_PSKTSEL ,
2008-09-03 05:47:42 +04:00
2009-02-05 19:48:20 +03:00
/* I2S */
GPIO28_I2S_BITCLK_OUT ,
GPIO29_I2S_SDATA_IN ,
GPIO30_I2S_SDATA_OUT ,
GPIO31_I2S_SYNC ,
2008-09-03 05:47:42 +04:00
/* MMC */
GPIO32_MMC_CLK ,
GPIO112_MMC_CMD ,
GPIO92_MMC_DAT_0 ,
GPIO109_MMC_DAT_1 ,
GPIO110_MMC_DAT_2 ,
GPIO111_MMC_DAT_3 ,
/* GPIOs */
GPIO9_GPIO , /* SPITZ_GPIO_nSD_DETECT */
GPIO81_GPIO , /* SPITZ_GPIO_nSD_WP */
GPIO41_GPIO , /* SPITZ_GPIO_USB_CONNECT */
GPIO37_GPIO , /* SPITZ_GPIO_USB_HOST */
GPIO35_GPIO , /* SPITZ_GPIO_USB_DEVICE */
GPIO22_GPIO , /* SPITZ_GPIO_HSYNC */
GPIO94_GPIO , /* SPITZ_GPIO_CF_CD */
GPIO105_GPIO , /* SPITZ_GPIO_CF_IRQ */
GPIO106_GPIO , /* SPITZ_GPIO_CF2_IRQ */
2009-07-27 12:59:39 +04:00
/* GPIO matrix keypad */
GPIO88_GPIO , /* column 0 */
GPIO23_GPIO , /* column 1 */
GPIO24_GPIO , /* column 2 */
GPIO25_GPIO , /* column 3 */
GPIO26_GPIO , /* column 4 */
GPIO27_GPIO , /* column 5 */
GPIO52_GPIO , /* column 6 */
GPIO103_GPIO , /* column 7 */
GPIO107_GPIO , /* column 8 */
GPIO108_GPIO , /* column 9 */
GPIO114_GPIO , /* column 10 */
GPIO12_GPIO , /* row 0 */
GPIO17_GPIO , /* row 1 */
GPIO91_GPIO , /* row 2 */
GPIO34_GPIO , /* row 3 */
GPIO36_GPIO , /* row 4 */
GPIO38_GPIO , /* row 5 */
GPIO39_GPIO , /* row 6 */
2008-11-28 11:00:24 +03:00
/* I2C */
GPIO117_I2C_SCL ,
GPIO118_I2C_SDA ,
2008-09-03 05:47:42 +04:00
GPIO1_GPIO | WAKEUP_ON_EDGE_RISE ,
} ;
2005-09-13 12:25:34 +04:00
/*
* Spitz SCOOP Device # 1
*/
static struct resource spitz_scoop_resources [ ] = {
[ 0 ] = {
. start = 0x10800000 ,
. end = 0x10800fff ,
. flags = IORESOURCE_MEM ,
} ,
} ;
static struct scoop_config spitz_scoop_setup = {
2008-09-05 18:15:23 +04:00
. io_dir = SPITZ_SCP_IO_DIR ,
2005-09-13 12:25:34 +04:00
. io_out = SPITZ_SCP_IO_OUT ,
2008-09-05 18:15:23 +04:00
. suspend_clr = SPITZ_SCP_SUS_CLR ,
. suspend_set = SPITZ_SCP_SUS_SET ,
. gpio_base = SPITZ_SCP_GPIO_BASE ,
2005-09-13 12:25:34 +04:00
} ;
struct platform_device spitzscoop_device = {
. name = " sharp-scoop " ,
. id = 0 ,
. dev = {
. platform_data = & spitz_scoop_setup ,
} ,
. num_resources = ARRAY_SIZE ( spitz_scoop_resources ) ,
. resource = spitz_scoop_resources ,
} ;
/*
* Spitz SCOOP Device # 2
*/
static struct resource spitz_scoop2_resources [ ] = {
[ 0 ] = {
. start = 0x08800040 ,
. end = 0x08800fff ,
. flags = IORESOURCE_MEM ,
} ,
} ;
static struct scoop_config spitz_scoop2_setup = {
2008-09-05 18:15:23 +04:00
. io_dir = SPITZ_SCP2_IO_DIR ,
2005-09-13 12:25:34 +04:00
. io_out = SPITZ_SCP2_IO_OUT ,
2008-09-05 18:15:23 +04:00
. suspend_clr = SPITZ_SCP2_SUS_CLR ,
. suspend_set = SPITZ_SCP2_SUS_SET ,
. gpio_base = SPITZ_SCP2_GPIO_BASE ,
2005-09-13 12:25:34 +04:00
} ;
struct platform_device spitzscoop2_device = {
. name = " sharp-scoop " ,
. id = 1 ,
. dev = {
. platform_data = & spitz_scoop2_setup ,
} ,
. num_resources = ARRAY_SIZE ( spitz_scoop2_resources ) ,
. resource = spitz_scoop2_resources ,
} ;
2005-11-08 22:15:43 +03:00
# define SPITZ_PWR_SD 0x01
# define SPITZ_PWR_CF 0x02
/* Power control is shared with between one of the CF slots and SD */
static void spitz_card_pwr_ctrl ( int device , unsigned short new_cpr )
{
unsigned short cpr = read_scoop_reg ( & spitzscoop_device . dev , SCOOP_CPR ) ;
if ( new_cpr & 0x0007 ) {
2008-09-05 18:15:23 +04:00
gpio_set_value ( SPITZ_GPIO_CF_POWER , 1 ) ;
2005-11-08 22:15:43 +03:00
if ( ! ( cpr & 0x0002 ) & & ! ( cpr & 0x0004 ) )
mdelay ( 5 ) ;
if ( device = = SPITZ_PWR_CF )
cpr | = 0x0002 ;
if ( device = = SPITZ_PWR_SD )
cpr | = 0x0004 ;
write_scoop_reg ( & spitzscoop_device . dev , SCOOP_CPR , cpr | new_cpr ) ;
} else {
if ( device = = SPITZ_PWR_CF )
cpr & = ~ 0x0002 ;
if ( device = = SPITZ_PWR_SD )
cpr & = ~ 0x0004 ;
if ( ! ( cpr & 0x0002 ) & & ! ( cpr & 0x0004 ) ) {
2006-01-05 23:44:57 +03:00
write_scoop_reg ( & spitzscoop_device . dev , SCOOP_CPR , 0x0000 ) ;
2005-11-08 22:15:43 +03:00
mdelay ( 1 ) ;
2008-09-05 18:15:23 +04:00
gpio_set_value ( SPITZ_GPIO_CF_POWER , 0 ) ;
2006-01-05 23:44:57 +03:00
} else {
write_scoop_reg ( & spitzscoop_device . dev , SCOOP_CPR , cpr | new_cpr ) ;
2005-11-08 22:15:43 +03:00
}
}
}
static void spitz_pcmcia_pwr ( struct device * scoop , unsigned short cpr , int nr )
{
/* Only need to override behaviour for slot 0 */
if ( nr = = 0 )
spitz_card_pwr_ctrl ( SPITZ_PWR_CF , cpr ) ;
else
write_scoop_reg ( scoop , SCOOP_CPR , cpr ) ;
}
2005-09-13 12:25:34 +04:00
static struct scoop_pcmcia_dev spitz_pcmcia_scoop [ ] = {
{
. dev = & spitzscoop_device . dev ,
. irq = SPITZ_IRQ_GPIO_CF_IRQ ,
. cd_irq = SPITZ_IRQ_GPIO_CF_CD ,
. cd_irq_str = " PCMCIA0 CD " ,
} , {
. dev = & spitzscoop2_device . dev ,
. irq = SPITZ_IRQ_GPIO_CF2_IRQ ,
. cd_irq = - 1 ,
} ,
} ;
2005-11-08 22:15:43 +03:00
static struct scoop_pcmcia_config spitz_pcmcia_config = {
. devs = & spitz_pcmcia_scoop [ 0 ] ,
. num_devs = 2 ,
. power_ctrl = spitz_pcmcia_pwr ,
} ;
EXPORT_SYMBOL ( spitzscoop_device ) ;
EXPORT_SYMBOL ( spitzscoop2_device ) ;
2005-09-13 12:25:34 +04:00
/*
* Spitz Keyboard Device
*/
2009-07-27 12:59:39 +04:00
# define SPITZ_KEY_CALENDAR KEY_F1
# define SPITZ_KEY_ADDRESS KEY_F2
# define SPITZ_KEY_FN KEY_F3
# define SPITZ_KEY_CANCEL KEY_F4
# define SPITZ_KEY_EXOK KEY_F5
# define SPITZ_KEY_EXCANCEL KEY_F6
# define SPITZ_KEY_EXJOGDOWN KEY_F7
# define SPITZ_KEY_EXJOGUP KEY_F8
# define SPITZ_KEY_JAP1 KEY_LEFTALT
# define SPITZ_KEY_JAP2 KEY_RIGHTCTRL
# define SPITZ_KEY_SYNC KEY_F9
# define SPITZ_KEY_MAIL KEY_F10
# define SPITZ_KEY_OK KEY_F11
# define SPITZ_KEY_MENU KEY_F12
static const uint32_t spitzkbd_keymap [ ] = {
KEY ( 0 , 0 , KEY_LEFTCTRL ) ,
KEY ( 0 , 1 , KEY_1 ) ,
KEY ( 0 , 2 , KEY_3 ) ,
KEY ( 0 , 3 , KEY_5 ) ,
KEY ( 0 , 4 , KEY_6 ) ,
KEY ( 0 , 5 , KEY_7 ) ,
KEY ( 0 , 6 , KEY_9 ) ,
KEY ( 0 , 7 , KEY_0 ) ,
KEY ( 0 , 8 , KEY_BACKSPACE ) ,
KEY ( 0 , 9 , SPITZ_KEY_EXOK ) , /* EXOK */
KEY ( 0 , 10 , SPITZ_KEY_EXCANCEL ) , /* EXCANCEL */
KEY ( 1 , 1 , KEY_2 ) ,
KEY ( 1 , 2 , KEY_4 ) ,
KEY ( 1 , 3 , KEY_R ) ,
KEY ( 1 , 4 , KEY_Y ) ,
KEY ( 1 , 5 , KEY_8 ) ,
KEY ( 1 , 6 , KEY_I ) ,
KEY ( 1 , 7 , KEY_O ) ,
KEY ( 1 , 8 , KEY_P ) ,
KEY ( 1 , 9 , SPITZ_KEY_EXJOGDOWN ) , /* EXJOGDOWN */
KEY ( 1 , 10 , SPITZ_KEY_EXJOGUP ) , /* EXJOGUP */
KEY ( 2 , 0 , KEY_TAB ) ,
KEY ( 2 , 1 , KEY_Q ) ,
KEY ( 2 , 2 , KEY_E ) ,
KEY ( 2 , 3 , KEY_T ) ,
KEY ( 2 , 4 , KEY_G ) ,
KEY ( 2 , 5 , KEY_U ) ,
KEY ( 2 , 6 , KEY_J ) ,
KEY ( 2 , 7 , KEY_K ) ,
KEY ( 3 , 0 , SPITZ_KEY_ADDRESS ) , /* ADDRESS */
KEY ( 3 , 1 , KEY_W ) ,
KEY ( 3 , 2 , KEY_S ) ,
KEY ( 3 , 3 , KEY_F ) ,
KEY ( 3 , 4 , KEY_V ) ,
KEY ( 3 , 5 , KEY_H ) ,
KEY ( 3 , 6 , KEY_M ) ,
KEY ( 3 , 7 , KEY_L ) ,
KEY ( 3 , 9 , KEY_RIGHTSHIFT ) ,
KEY ( 4 , 0 , SPITZ_KEY_CALENDAR ) , /* CALENDAR */
KEY ( 4 , 1 , KEY_A ) ,
KEY ( 4 , 2 , KEY_D ) ,
KEY ( 4 , 3 , KEY_C ) ,
KEY ( 4 , 4 , KEY_B ) ,
KEY ( 4 , 5 , KEY_N ) ,
KEY ( 4 , 6 , KEY_DOT ) ,
KEY ( 4 , 8 , KEY_ENTER ) ,
KEY ( 4 , 9 , KEY_LEFTSHIFT ) ,
KEY ( 5 , 0 , SPITZ_KEY_MAIL ) , /* MAIL */
KEY ( 5 , 1 , KEY_Z ) ,
KEY ( 5 , 2 , KEY_X ) ,
KEY ( 5 , 3 , KEY_MINUS ) ,
KEY ( 5 , 4 , KEY_SPACE ) ,
KEY ( 5 , 5 , KEY_COMMA ) ,
KEY ( 5 , 7 , KEY_UP ) ,
KEY ( 5 , 10 , SPITZ_KEY_FN ) , /* FN */
KEY ( 6 , 0 , KEY_SYSRQ ) ,
KEY ( 6 , 1 , SPITZ_KEY_JAP1 ) , /* JAP1 */
KEY ( 6 , 2 , SPITZ_KEY_JAP2 ) , /* JAP2 */
KEY ( 6 , 3 , SPITZ_KEY_CANCEL ) , /* CANCEL */
KEY ( 6 , 4 , SPITZ_KEY_OK ) , /* OK */
KEY ( 6 , 5 , SPITZ_KEY_MENU ) , /* MENU */
KEY ( 6 , 6 , KEY_LEFT ) ,
KEY ( 6 , 7 , KEY_DOWN ) ,
KEY ( 6 , 8 , KEY_RIGHT ) ,
} ;
static const struct matrix_keymap_data spitzkbd_keymap_data = {
. keymap = spitzkbd_keymap ,
. keymap_size = ARRAY_SIZE ( spitzkbd_keymap ) ,
} ;
static const uint32_t spitzkbd_row_gpios [ ] =
{ 12 , 17 , 91 , 34 , 36 , 38 , 39 } ;
static const uint32_t spitzkbd_col_gpios [ ] =
{ 88 , 23 , 24 , 25 , 26 , 27 , 52 , 103 , 107 , 108 , 114 } ;
static struct matrix_keypad_platform_data spitzkbd_pdata = {
. keymap_data = & spitzkbd_keymap_data ,
. row_gpios = spitzkbd_row_gpios ,
. col_gpios = spitzkbd_col_gpios ,
. num_row_gpios = ARRAY_SIZE ( spitzkbd_row_gpios ) ,
. num_col_gpios = ARRAY_SIZE ( spitzkbd_col_gpios ) ,
. col_scan_delay_us = 10 ,
. debounce_ms = 10 ,
. wakeup = 1 ,
} ;
2005-09-13 12:25:34 +04:00
static struct platform_device spitzkbd_device = {
2009-07-27 12:59:39 +04:00
. name = " matrix-keypad " ,
2005-09-13 12:25:34 +04:00
. id = - 1 ,
2009-07-27 12:59:39 +04:00
. dev = {
. platform_data = & spitzkbd_pdata ,
} ,
2005-09-13 12:25:34 +04:00
} ;
/*
2006-03-31 14:31:09 +04:00
* Spitz LEDs
2005-09-13 12:25:34 +04:00
*/
2008-09-05 18:38:23 +04:00
static struct gpio_led spitz_gpio_leds [ ] = {
{
. name = " spitz:amber:charge " ,
. default_trigger = " sharpsl-charge " ,
. gpio = SPITZ_GPIO_LED_ORANGE ,
} ,
{
. name = " spitz:green:hddactivity " ,
. default_trigger = " ide-disk " ,
. gpio = SPITZ_GPIO_LED_GREEN ,
2005-09-13 12:25:34 +04:00
} ,
} ;
2008-09-05 18:38:23 +04:00
static struct gpio_led_platform_data spitz_gpio_leds_info = {
. leds = spitz_gpio_leds ,
. num_leds = ARRAY_SIZE ( spitz_gpio_leds ) ,
2005-09-13 12:25:34 +04:00
} ;
2006-03-31 14:31:09 +04:00
static struct platform_device spitzled_device = {
2008-09-05 18:38:23 +04:00
. name = " leds-gpio " ,
2006-03-31 14:31:09 +04:00
. id = - 1 ,
2008-09-05 18:38:23 +04:00
. dev = {
. platform_data = & spitz_gpio_leds_info ,
} ,
2006-03-31 14:31:09 +04:00
} ;
2008-09-03 08:09:24 +04:00
# if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
static struct pxa2xx_spi_master spitz_spi_info = {
. num_chipselect = 3 ,
} ;
2008-01-02 03:09:54 +03:00
2009-02-06 11:49:23 +03:00
static void spitz_wait_for_hsync ( void )
{
while ( gpio_get_value ( SPITZ_GPIO_HSYNC ) )
cpu_relax ( ) ;
while ( ! gpio_get_value ( SPITZ_GPIO_HSYNC ) )
cpu_relax ( ) ;
}
2008-09-03 08:09:24 +04:00
static struct ads7846_platform_data spitz_ads7846_info = {
. model = 7846 ,
. vref_delay_usecs = 100 ,
. x_plate_ohms = 419 ,
. y_plate_ohms = 486 ,
2009-09-18 23:44:19 +04:00
. pressure_max = 1024 ,
2008-09-03 08:09:24 +04:00
. gpio_pendown = SPITZ_GPIO_TP_INT ,
2009-02-06 11:49:23 +03:00
. wait_for_sync = spitz_wait_for_hsync ,
2008-09-03 08:09:24 +04:00
} ;
2008-01-02 03:09:54 +03:00
2008-09-03 08:09:24 +04:00
static struct pxa2xx_spi_chip spitz_ads7846_chip = {
2009-04-14 09:33:49 +04:00
. gpio_cs = SPITZ_GPIO_ADS7846_CS ,
2008-09-03 08:09:24 +04:00
} ;
2008-01-02 03:09:54 +03:00
2008-09-03 08:09:24 +04:00
static void spitz_bl_kick_battery ( void )
2008-01-02 03:09:54 +03:00
{
2008-09-03 08:09:24 +04:00
void ( * kick_batt ) ( void ) ;
2008-01-02 03:09:54 +03:00
2008-09-03 08:09:24 +04:00
kick_batt = symbol_get ( sharpsl_battery_kick ) ;
if ( kick_batt ) {
kick_batt ( ) ;
symbol_put ( sharpsl_battery_kick ) ;
2008-01-02 03:09:54 +03:00
}
}
2008-09-03 08:09:24 +04:00
static struct corgi_lcd_platform_data spitz_lcdcon_info = {
. init_mode = CORGI_LCD_MODE_VGA ,
. max_intensity = 0x2f ,
. default_intensity = 0x1f ,
. limit_mask = 0x0b ,
2008-09-07 07:30:06 +04:00
. gpio_backlight_cont = SPITZ_GPIO_BACKLIGHT_CONT ,
. gpio_backlight_on = SPITZ_GPIO_BACKLIGHT_ON ,
2008-09-03 08:09:24 +04:00
. kick_battery = spitz_bl_kick_battery ,
} ;
2008-01-02 03:09:54 +03:00
2008-09-03 08:09:24 +04:00
static struct pxa2xx_spi_chip spitz_lcdcon_chip = {
2009-04-14 09:33:49 +04:00
. gpio_cs = SPITZ_GPIO_LCDCON_CS ,
2005-09-13 12:25:34 +04:00
} ;
2008-09-03 08:09:24 +04:00
static struct pxa2xx_spi_chip spitz_max1111_chip = {
2009-04-14 09:33:49 +04:00
. gpio_cs = SPITZ_GPIO_MAX1111_CS ,
2005-09-13 12:25:34 +04:00
} ;
2008-09-03 08:09:24 +04:00
static struct spi_board_info spitz_spi_devices [ ] = {
{
. modalias = " ads7846 " ,
. max_speed_hz = 1200000 ,
. bus_num = 2 ,
. chip_select = 0 ,
. platform_data = & spitz_ads7846_info ,
. controller_data = & spitz_ads7846_chip ,
. irq = gpio_to_irq ( SPITZ_GPIO_TP_INT ) ,
} , {
. modalias = " corgi-lcd " ,
. max_speed_hz = 50000 ,
. bus_num = 2 ,
. chip_select = 1 ,
. platform_data = & spitz_lcdcon_info ,
. controller_data = & spitz_lcdcon_chip ,
} , {
. modalias = " max1111 " ,
. max_speed_hz = 450000 ,
. bus_num = 2 ,
. chip_select = 2 ,
. controller_data = & spitz_max1111_chip ,
2005-09-13 12:25:34 +04:00
} ,
} ;
2008-09-03 08:09:24 +04:00
static void __init spitz_init_spi ( void )
{
2008-09-07 07:30:06 +04:00
if ( machine_is_akita ( ) ) {
spitz_lcdcon_info . gpio_backlight_cont = AKITA_GPIO_BACKLIGHT_CONT ;
spitz_lcdcon_info . gpio_backlight_on = AKITA_GPIO_BACKLIGHT_ON ;
}
2008-09-03 08:09:24 +04:00
pxa2xx_set_spi_info ( 2 , & spitz_spi_info ) ;
spi_register_board_info ( ARRAY_AND_SIZE ( spitz_spi_devices ) ) ;
}
# else
static inline void spitz_init_spi ( void ) { }
# endif
2005-09-13 12:25:34 +04:00
/*
* MMC / SD Device
*
* The card detect interrupt isn ' t debounced so we delay it by 250 ms
* to give the card a chance to fully insert / eject .
*/
static void spitz_mci_setpower ( struct device * dev , unsigned int vdd )
{
struct pxamci_platform_data * p_d = dev - > platform_data ;
2005-11-08 22:15:43 +03:00
if ( ( 1 < < vdd ) & p_d - > ocr_mask )
spitz_card_pwr_ctrl ( SPITZ_PWR_SD , 0x0004 ) ;
else
spitz_card_pwr_ctrl ( SPITZ_PWR_SD , 0x0000 ) ;
2005-09-13 12:25:34 +04:00
}
static struct pxamci_platform_data spitz_mci_platform_data = {
2009-07-07 00:16:42 +04:00
. ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34 ,
. setpower = spitz_mci_setpower ,
. gpio_card_detect = SPITZ_GPIO_nSD_DETECT ,
. gpio_card_ro = SPITZ_GPIO_nSD_WP ,
. gpio_power = - 1 ,
2005-09-13 12:25:34 +04:00
} ;
2006-01-05 23:44:52 +03:00
/*
* USB Host ( OHCI )
*/
static int spitz_ohci_init ( struct device * dev )
{
2008-09-02 13:34:33 +04:00
int err ;
2006-01-05 23:44:52 +03:00
2008-09-02 13:34:33 +04:00
err = gpio_request ( SPITZ_GPIO_USB_HOST , " USB_HOST " ) ;
if ( err )
return err ;
2006-01-05 23:44:52 +03:00
2008-09-03 05:47:42 +04:00
/* Only Port 2 is connected
* Setup USB Port 2 Output Control Register
*/
2006-01-05 23:44:52 +03:00
UP2OCR = UP2OCR_HXS | UP2OCR_HXOE | UP2OCR_DPPDE | UP2OCR_DMPDE ;
2008-09-27 11:49:57 +04:00
return gpio_direction_output ( SPITZ_GPIO_USB_HOST , 1 ) ;
2006-01-05 23:44:52 +03:00
}
2009-05-15 10:11:22 +04:00
static void spitz_ohci_exit ( struct device * dev )
{
gpio_free ( SPITZ_GPIO_USB_HOST ) ;
}
2006-01-05 23:44:52 +03:00
static struct pxaohci_platform_data spitz_ohci_platform_data = {
. port_mode = PMM_NPS_MODE ,
. init = spitz_ohci_init ,
2009-05-15 10:11:22 +04:00
. exit = spitz_ohci_exit ,
2008-09-27 11:49:57 +04:00
. flags = ENABLE_PORT_ALL | NO_OC_PROTECTION ,
2006-06-09 01:44:07 +04:00
. power_budget = 150 ,
2006-01-05 23:44:52 +03:00
} ;
2005-10-30 17:50:25 +03:00
/*
* Irda
*/
2005-11-12 21:53:48 +03:00
2005-10-30 17:50:25 +03:00
static struct pxaficp_platform_data spitz_ficp_platform_data = {
2009-07-17 14:50:43 +04:00
/* .gpio_pwdown is set in spitz_init() and akita_init() accordingly */
2008-09-05 18:15:23 +04:00
. transceiver_cap = IR_SIRMODE | IR_OFF ,
2005-10-30 17:50:25 +03:00
} ;
2005-09-13 12:25:34 +04:00
/*
* Spitz PXA Framebuffer
*/
2006-09-21 01:54:21 +04:00
static struct pxafb_mode_info spitz_pxafb_modes [ ] = {
{
. pixclock = 19231 ,
. xres = 480 ,
. yres = 640 ,
. bpp = 16 ,
. hsync_len = 40 ,
. left_margin = 46 ,
. right_margin = 125 ,
. vsync_len = 3 ,
. upper_margin = 1 ,
. lower_margin = 0 ,
. sync = 0 ,
} , {
. pixclock = 134617 ,
. xres = 240 ,
. yres = 320 ,
. bpp = 16 ,
. hsync_len = 20 ,
. left_margin = 20 ,
. right_margin = 46 ,
. vsync_len = 2 ,
. upper_margin = 1 ,
. lower_margin = 0 ,
. sync = 0 ,
} ,
} ;
static struct pxafb_mach_info spitz_pxafb_info = {
. modes = & spitz_pxafb_modes [ 0 ] ,
. num_modes = 2 ,
. fixed_modes = 1 ,
2008-09-03 06:00:38 +04:00
. lcd_conn = LCD_COLOR_TFT_16BPP | LCD_ALTERNATE_MAPPING ,
2005-09-13 12:25:34 +04:00
} ;
2008-10-16 19:17:05 +04:00
static struct mtd_partition sharpsl_nand_partitions [ ] = {
{
. name = " System Area " ,
. offset = 0 ,
. size = 7 * 1024 * 1024 ,
} ,
{
. name = " Root Filesystem " ,
. offset = 7 * 1024 * 1024 ,
} ,
{
. name = " Home Filesystem " ,
. offset = MTDPART_OFS_APPEND ,
. size = MTDPART_SIZ_FULL ,
} ,
} ;
static uint8_t scan_ff_pattern [ ] = { 0xff , 0xff } ;
static struct nand_bbt_descr sharpsl_bbt = {
. options = 0 ,
. offs = 4 ,
. len = 2 ,
. pattern = scan_ff_pattern
} ;
static struct sharpsl_nand_platform_data sharpsl_nand_platform_data = {
. badblock_pattern = & sharpsl_bbt ,
. partitions = sharpsl_nand_partitions ,
. nr_partitions = ARRAY_SIZE ( sharpsl_nand_partitions ) ,
} ;
static struct resource sharpsl_nand_resources [ ] = {
{
. start = 0x0C000000 ,
. end = 0x0C000FFF ,
. flags = IORESOURCE_MEM ,
} ,
} ;
static struct platform_device sharpsl_nand_device = {
. name = " sharpsl-nand " ,
. id = - 1 ,
. resource = sharpsl_nand_resources ,
. num_resources = ARRAY_SIZE ( sharpsl_nand_resources ) ,
. dev . platform_data = & sharpsl_nand_platform_data ,
} ;
2005-09-13 12:25:34 +04:00
2008-11-25 00:57:28 +03:00
static struct mtd_partition sharpsl_rom_parts [ ] = {
{
. name = " Boot PROM Filesystem " ,
. offset = 0x00140000 ,
. size = MTDPART_SIZ_FULL ,
} ,
} ;
static struct physmap_flash_data sharpsl_rom_data = {
. width = 2 ,
. nr_parts = ARRAY_SIZE ( sharpsl_rom_parts ) ,
. parts = sharpsl_rom_parts ,
} ;
static struct resource sharpsl_rom_resources [ ] = {
{
. start = 0x00000000 ,
. end = 0x007fffff ,
. flags = IORESOURCE_MEM ,
} ,
} ;
static struct platform_device sharpsl_rom_device = {
. name = " physmap-flash " ,
. id = - 1 ,
. resource = sharpsl_rom_resources ,
. num_resources = ARRAY_SIZE ( sharpsl_rom_resources ) ,
. dev . platform_data = & sharpsl_rom_data ,
} ;
2005-09-13 12:25:34 +04:00
static struct platform_device * devices [ ] __initdata = {
& spitzscoop_device ,
& spitzkbd_device ,
2006-03-31 14:31:09 +04:00
& spitzled_device ,
2008-10-16 19:17:05 +04:00
& sharpsl_nand_device ,
2008-11-25 00:57:28 +03:00
& sharpsl_rom_device ,
2005-09-13 12:25:34 +04:00
} ;
2006-06-19 22:57:12 +04:00
static void spitz_poweroff ( void )
{
2009-03-19 19:20:24 +03:00
arm_machine_restart ( ' g ' , NULL ) ;
2006-06-19 22:57:12 +04:00
}
2009-03-19 19:20:24 +03:00
static void spitz_restart ( char mode , const char * cmd )
2006-06-19 22:57:12 +04:00
{
/* Bootloader magic for a reboot */
if ( ( MSC0 & 0xffff0000 ) = = 0x7ff00000 )
MSC0 = ( MSC0 & 0xffff ) | 0x7ee00000 ;
spitz_poweroff ( ) ;
}
2005-09-13 12:25:34 +04:00
static void __init common_init ( void )
{
2009-05-06 05:43:18 +04:00
init_gpio_reset ( SPITZ_GPIO_ON_RESET , 1 , 0 ) ;
2006-06-19 22:57:12 +04:00
pm_power_off = spitz_poweroff ;
arm_pm_restart = spitz_restart ;
2008-10-16 19:17:05 +04:00
if ( machine_is_spitz ( ) ) {
sharpsl_nand_partitions [ 1 ] . size = 5 * 1024 * 1024 ;
} else if ( machine_is_akita ( ) ) {
sharpsl_nand_partitions [ 1 ] . size = 58 * 1024 * 1024 ;
} else if ( machine_is_borzoi ( ) ) {
sharpsl_nand_partitions [ 1 ] . size = 32 * 1024 * 1024 ;
}
2005-09-13 12:25:34 +04:00
PMCR = 0x00 ;
/* Stop 3.6MHz and drive HIGH to PCMCIA and CS */
PCFR | = PCFR_OPDE ;
2008-09-03 05:47:42 +04:00
pxa2xx_mfp_config ( ARRAY_AND_SIZE ( spitz_pin_config ) ) ;
2005-09-13 12:25:34 +04:00
2008-09-03 08:09:24 +04:00
spitz_init_spi ( ) ;
2005-09-13 12:25:34 +04:00
platform_add_devices ( devices , ARRAY_SIZE ( devices ) ) ;
2009-07-07 00:16:42 +04:00
spitz_mci_platform_data . detect_delay = msecs_to_jiffies ( 250 ) ;
2005-09-13 12:25:34 +04:00
pxa_set_mci_info ( & spitz_mci_platform_data ) ;
2006-01-05 23:44:52 +03:00
pxa_set_ohci_info ( & spitz_ohci_platform_data ) ;
2005-10-30 17:50:25 +03:00
pxa_set_ficp_info ( & spitz_ficp_platform_data ) ;
2005-09-13 12:25:34 +04:00
set_pxa_fb_info ( & spitz_pxafb_info ) ;
2008-08-26 16:30:03 +04:00
pxa_set_i2c_info ( NULL ) ;
2005-09-13 12:25:34 +04:00
}
2008-01-02 03:09:54 +03:00
# if defined(CONFIG_MACH_SPITZ) || defined(CONFIG_MACH_BORZOI)
2005-09-13 12:25:34 +04:00
static void __init spitz_init ( void )
{
2009-07-17 14:50:43 +04:00
spitz_ficp_platform_data . gpio_pwdown = SPITZ_GPIO_IR_ON ;
2005-11-08 22:15:43 +03:00
platform_scoop_config = & spitz_pcmcia_config ;
2005-09-13 12:25:34 +04:00
common_init ( ) ;
platform_device_register ( & spitzscoop2_device ) ;
}
2008-01-02 03:09:54 +03:00
# endif
2005-09-13 12:25:34 +04:00
2005-11-12 21:53:48 +03:00
# ifdef CONFIG_MACH_AKITA
/*
* Akita IO Expander
*/
2008-09-06 04:46:23 +04:00
static struct pca953x_platform_data akita_ioexp = {
. gpio_base = AKITA_IOEXP_GPIO_BASE ,
2005-11-12 21:53:48 +03:00
} ;
2008-09-06 04:46:23 +04:00
static struct i2c_board_info akita_i2c_board_info [ ] = {
{
. type = " max7310 " ,
. addr = 0x18 ,
. platform_data = & akita_ioexp ,
} ,
} ;
2008-01-02 03:09:54 +03:00
2008-10-16 19:17:05 +04:00
static struct nand_bbt_descr sharpsl_akita_bbt = {
. options = 0 ,
. offs = 4 ,
. len = 1 ,
. pattern = scan_ff_pattern
} ;
static struct nand_ecclayout akita_oobinfo = {
. eccbytes = 24 ,
. eccpos = {
0x5 , 0x1 , 0x2 , 0x3 , 0x6 , 0x7 , 0x15 , 0x11 ,
0x12 , 0x13 , 0x16 , 0x17 , 0x25 , 0x21 , 0x22 , 0x23 ,
0x26 , 0x27 , 0x35 , 0x31 , 0x32 , 0x33 , 0x36 , 0x37 } ,
. oobfree = { { 0x08 , 0x09 } }
} ;
2005-11-12 21:53:48 +03:00
static void __init akita_init ( void )
{
2009-07-17 14:50:43 +04:00
spitz_ficp_platform_data . gpio_pwdown = AKITA_GPIO_IR_ON ;
2005-11-12 21:53:48 +03:00
2008-10-16 19:17:05 +04:00
sharpsl_nand_platform_data . badblock_pattern = & sharpsl_akita_bbt ;
sharpsl_nand_platform_data . ecc_layout = & akita_oobinfo ;
2005-11-12 21:53:48 +03:00
/* We just pretend the second element of the array doesn't exist */
spitz_pcmcia_config . num_devs = 1 ;
platform_scoop_config = & spitz_pcmcia_config ;
2008-09-06 04:46:23 +04:00
i2c_register_board_info ( 0 , ARRAY_AND_SIZE ( akita_i2c_board_info ) ) ;
2005-11-12 21:53:48 +03:00
common_init ( ) ;
}
# endif
2005-09-13 12:25:34 +04:00
static void __init fixup_spitz ( 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 ) ;
}
# ifdef CONFIG_MACH_SPITZ
MACHINE_START ( SPITZ , " SHARP Spitz " )
. phys_io = 0x40000000 ,
. io_pg_offst = ( io_p2v ( 0x40000000 ) > > 18 ) & 0xfffc ,
. fixup = fixup_spitz ,
. map_io = pxa_map_io ,
2007-06-22 07:14:09 +04:00
. init_irq = pxa27x_init_irq ,
2005-09-13 12:25:34 +04:00
. init_machine = spitz_init ,
. timer = & pxa_timer ,
MACHINE_END
# endif
# ifdef CONFIG_MACH_BORZOI
MACHINE_START ( BORZOI , " SHARP Borzoi " )
. phys_io = 0x40000000 ,
. io_pg_offst = ( io_p2v ( 0x40000000 ) > > 18 ) & 0xfffc ,
. fixup = fixup_spitz ,
. map_io = pxa_map_io ,
2007-06-22 07:14:09 +04:00
. init_irq = pxa27x_init_irq ,
2005-09-13 12:25:34 +04:00
. init_machine = spitz_init ,
. timer = & pxa_timer ,
MACHINE_END
# endif
2005-11-12 21:53:48 +03:00
# ifdef CONFIG_MACH_AKITA
MACHINE_START ( AKITA , " SHARP Akita " )
. phys_io = 0x40000000 ,
. io_pg_offst = ( io_p2v ( 0x40000000 ) > > 18 ) & 0xfffc ,
. fixup = fixup_spitz ,
. map_io = pxa_map_io ,
2007-06-22 07:14:09 +04:00
. init_irq = pxa27x_init_irq ,
2005-11-12 21:53:48 +03:00
. init_machine = akita_init ,
. timer = & pxa_timer ,
MACHINE_END
# endif