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>
2016-08-10 23:47:59 +03:00
# include <linux/module.h> /* symbol_get ; symbol_put */
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>
2009-10-16 22:50:05 +04:00
# include <linux/gpio_keys.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-09-06 04:46:23 +04:00
# include <linux/i2c.h>
2017-11-13 20:27:39 +03:00
# include <linux/platform_data/i2c-pxa.h>
2013-08-29 23:24:14 +04:00
# include <linux/platform_data/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>
2010-11-23 04:12:15 +03:00
# include <linux/spi/pxa2xx_spi.h>
2008-10-16 19:17:05 +04:00
# include <linux/mtd/sharpsl.h>
2011-01-14 20:01:00 +03:00
# include <linux/mtd/physmap.h>
2009-07-27 12:59:39 +04:00
# include <linux/input/matrix_keypad.h>
2010-06-14 18:12:03 +04:00
# include <linux/regulator/machine.h>
2010-10-11 04:20:19 +04:00
# include <linux/io.h>
2013-07-09 03:01:40 +04:00
# include <linux/reboot.h>
2014-04-14 01:54:58 +04:00
# include <linux/memblock.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>
2015-01-30 12:45:33 +03:00
# include "pxa27x.h"
# include "pxa27x-udc.h"
2008-08-07 14:05:25 +04:00
# include <mach/reset.h>
2012-08-24 17:16:48 +04:00
# include <linux/platform_data/irda-pxaficp.h>
# include <linux/platform_data/mmc-pxamci.h>
# include <linux/platform_data/usb-ohci-pxa27x.h>
# include <linux/platform_data/video-pxafb.h>
2008-08-05 19:14:15 +04:00
# include <mach/spitz.h>
2015-01-30 12:45:33 +03:00
# include "sharpsl_pm.h"
2010-11-03 18:29:35 +03:00
# include <mach/smemc.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
2010-06-14 18:12:03 +04:00
/******************************************************************************
* Pin configuration
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
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 */
2010-01-04 06:37:14 +03:00
GPIOxx_LCD_TFT_16BPP ,
2008-09-03 05:47:42 +04:00
/* 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 */
2010-01-11 11:17:25 +03:00
GPIO16_GPIO , /* SPITZ_GPIO_SYNC */
2008-09-03 05:47:42 +04:00
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 ,
2010-01-11 11:17:25 +03:00
GPIO0_GPIO | WAKEUP_ON_EDGE_RISE , /* SPITZ_GPIO_KEY_INT */
GPIO1_GPIO | WAKEUP_ON_EDGE_FALL , /* SPITZ_GPIO_RESET */
2008-09-03 05:47:42 +04:00
} ;
2010-06-14 18:12:03 +04:00
/******************************************************************************
* Scoop GPIO expander
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_SHARP_SCOOP) || defined(CONFIG_SHARP_SCOOP_MODULE)
2010-07-07 16:32:18 +04:00
/* SCOOP Device #1 */
static struct resource spitz_scoop_1_resources [ ] = {
2005-09-13 12:25:34 +04:00
[ 0 ] = {
. start = 0x10800000 ,
. end = 0x10800fff ,
. flags = IORESOURCE_MEM ,
} ,
} ;
2010-07-07 16:32:18 +04:00
static struct scoop_config spitz_scoop_1_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
} ;
2010-07-07 16:32:18 +04:00
struct platform_device spitz_scoop_1_device = {
2005-09-13 12:25:34 +04:00
. name = " sharp-scoop " ,
. id = 0 ,
. dev = {
2010-07-07 16:32:18 +04:00
. platform_data = & spitz_scoop_1_setup ,
2005-09-13 12:25:34 +04:00
} ,
2010-07-07 16:32:18 +04:00
. num_resources = ARRAY_SIZE ( spitz_scoop_1_resources ) ,
. resource = spitz_scoop_1_resources ,
2005-09-13 12:25:34 +04:00
} ;
2010-07-07 16:32:18 +04:00
/* SCOOP Device #2 */
static struct resource spitz_scoop_2_resources [ ] = {
2005-09-13 12:25:34 +04:00
[ 0 ] = {
. start = 0x08800040 ,
. end = 0x08800fff ,
. flags = IORESOURCE_MEM ,
} ,
} ;
2010-07-07 16:32:18 +04:00
static struct scoop_config spitz_scoop_2_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
} ;
2010-07-07 16:32:18 +04:00
struct platform_device spitz_scoop_2_device = {
2005-09-13 12:25:34 +04:00
. name = " sharp-scoop " ,
. id = 1 ,
. dev = {
2010-07-07 16:32:18 +04:00
. platform_data = & spitz_scoop_2_setup ,
2005-09-13 12:25:34 +04:00
} ,
2010-07-07 16:32:18 +04:00
. num_resources = ARRAY_SIZE ( spitz_scoop_2_resources ) ,
. resource = spitz_scoop_2_resources ,
2005-09-13 12:25:34 +04:00
} ;
2010-06-14 18:12:03 +04:00
static void __init spitz_scoop_init ( void )
{
2010-07-07 16:32:18 +04:00
platform_device_register ( & spitz_scoop_1_device ) ;
2010-06-14 18:12:03 +04:00
/* Akita doesn't have the second SCOOP chip */
if ( ! machine_is_akita ( ) )
2010-07-07 16:32:18 +04:00
platform_device_register ( & spitz_scoop_2_device ) ;
2010-06-14 18:12:03 +04:00
}
2005-11-08 22:15:43 +03:00
/* Power control is shared with between one of the CF slots and SD */
2016-01-29 17:06:26 +03:00
static void __maybe_unused spitz_card_pwr_ctrl ( uint8_t enable , uint8_t new_cpr )
2005-11-08 22:15:43 +03:00
{
2010-06-14 18:12:03 +04:00
unsigned short cpr ;
unsigned long flags ;
2005-11-08 22:15:43 +03:00
2010-06-14 18:12:03 +04:00
if ( new_cpr & 0x7 ) {
2008-09-05 18:15:23 +04:00
gpio_set_value ( SPITZ_GPIO_CF_POWER , 1 ) ;
2010-06-14 18:12:03 +04:00
mdelay ( 5 ) ;
}
local_irq_save ( flags ) ;
cpr = read_scoop_reg ( & spitz_scoop_1_device . dev , SCOOP_CPR ) ;
if ( enable & new_cpr )
cpr | = new_cpr ;
else
cpr & = ~ enable ;
write_scoop_reg ( & spitz_scoop_1_device . dev , SCOOP_CPR , cpr ) ;
local_irq_restore ( flags ) ;
if ( ! ( cpr & 0x7 ) ) {
mdelay ( 1 ) ;
gpio_set_value ( SPITZ_GPIO_CF_POWER , 0 ) ;
2005-11-08 22:15:43 +03:00
}
}
2010-06-14 18:12:03 +04:00
# else
static inline void spitz_scoop_init ( void ) { }
static inline void spitz_card_pwr_ctrl ( uint8_t enable , uint8_t new_cpr ) { }
# endif
/******************************************************************************
* PCMCIA
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_PCMCIA_PXA2XX) || defined(CONFIG_PCMCIA_PXA2XX_MODULE)
static void spitz_pcmcia_pwr ( struct device * scoop , uint16_t cpr , int nr )
2005-11-08 22:15:43 +03:00
{
/* Only need to override behaviour for slot 0 */
if ( nr = = 0 )
2010-06-14 18:12:03 +04:00
spitz_card_pwr_ctrl (
cpr & ( SCOOP_CPR_CF_3V | SCOOP_CPR_CF_XV ) , cpr ) ;
2005-11-08 22:15:43 +03:00
else
write_scoop_reg ( scoop , SCOOP_CPR , cpr ) ;
}
2005-09-13 12:25:34 +04:00
static struct scoop_pcmcia_dev spitz_pcmcia_scoop [ ] = {
2010-07-07 16:32:18 +04:00
{
. dev = & spitz_scoop_1_device . dev ,
. irq = SPITZ_IRQ_GPIO_CF_IRQ ,
. cd_irq = SPITZ_IRQ_GPIO_CF_CD ,
. cd_irq_str = " PCMCIA0 CD " ,
} , {
. dev = & spitz_scoop_2_device . dev ,
. irq = SPITZ_IRQ_GPIO_CF2_IRQ ,
. cd_irq = - 1 ,
} ,
2005-09-13 12:25:34 +04:00
} ;
2005-11-08 22:15:43 +03:00
static struct scoop_pcmcia_config spitz_pcmcia_config = {
2010-07-07 16:32:18 +04:00
. devs = & spitz_pcmcia_scoop [ 0 ] ,
. num_devs = 2 ,
. power_ctrl = spitz_pcmcia_pwr ,
2005-11-08 22:15:43 +03:00
} ;
2010-06-14 18:12:03 +04:00
static void __init spitz_pcmcia_init ( void )
{
/* Akita has only one PCMCIA slot used */
if ( machine_is_akita ( ) )
spitz_pcmcia_config . num_devs = 1 ;
platform_scoop_config = & spitz_pcmcia_config ;
}
# else
static inline void spitz_pcmcia_init ( void ) { }
# endif
/******************************************************************************
* GPIO keyboard
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_KEYBOARD_MATRIX) || defined(CONFIG_KEYBOARD_MATRIX_MODULE)
2005-11-08 22:15:43 +03:00
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
2010-07-07 16:32:18 +04:00
static const uint32_t spitz_keymap [ ] = {
2009-07-27 12:59:39 +04:00
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 ) ,
} ;
2010-07-07 16:32:18 +04:00
static const struct matrix_keymap_data spitz_keymap_data = {
. keymap = spitz_keymap ,
. keymap_size = ARRAY_SIZE ( spitz_keymap ) ,
2009-07-27 12:59:39 +04:00
} ;
2010-07-07 16:32:18 +04:00
static const uint32_t spitz_row_gpios [ ] =
2009-07-27 12:59:39 +04:00
{ 12 , 17 , 91 , 34 , 36 , 38 , 39 } ;
2010-07-07 16:32:18 +04:00
static const uint32_t spitz_col_gpios [ ] =
2009-07-27 12:59:39 +04:00
{ 88 , 23 , 24 , 25 , 26 , 27 , 52 , 103 , 107 , 108 , 114 } ;
2010-07-07 16:32:18 +04:00
static struct matrix_keypad_platform_data spitz_mkp_pdata = {
. keymap_data = & spitz_keymap_data ,
. row_gpios = spitz_row_gpios ,
. col_gpios = spitz_col_gpios ,
. num_row_gpios = ARRAY_SIZE ( spitz_row_gpios ) ,
. num_col_gpios = ARRAY_SIZE ( spitz_col_gpios ) ,
2009-07-27 12:59:39 +04:00
. col_scan_delay_us = 10 ,
. debounce_ms = 10 ,
. wakeup = 1 ,
} ;
2010-07-07 16:32:18 +04:00
static struct platform_device spitz_mkp_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 = {
2010-07-07 16:32:18 +04:00
. platform_data = & spitz_mkp_pdata ,
2009-07-27 12:59:39 +04:00
} ,
2005-09-13 12:25:34 +04:00
} ;
2010-06-14 18:12:03 +04:00
static void __init spitz_mkp_init ( void )
{
2010-07-07 16:32:18 +04:00
platform_device_register ( & spitz_mkp_device ) ;
2010-06-14 18:12:03 +04:00
}
# else
static inline void spitz_mkp_init ( void ) { }
# endif
2005-09-13 12:25:34 +04:00
2010-06-14 18:12:03 +04:00
/******************************************************************************
* GPIO keys
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
2009-10-16 22:50:05 +04:00
static struct gpio_keys_button spitz_gpio_keys [ ] = {
{
. type = EV_PWR ,
. code = KEY_SUSPEND ,
. gpio = SPITZ_GPIO_ON_KEY ,
2010-05-05 11:03:12 +04:00
. desc = " On Off " ,
2009-10-16 22:50:05 +04:00
. wakeup = 1 ,
} ,
/* Two buttons detecting the lid state */
{
. type = EV_SW ,
. code = 0 ,
. gpio = SPITZ_GPIO_SWA ,
2010-01-07 23:31:04 +03:00
. desc = " Display Down " ,
2009-10-16 22:50:05 +04:00
} ,
{
. type = EV_SW ,
. code = 1 ,
. gpio = SPITZ_GPIO_SWB ,
2010-01-07 23:31:04 +03:00
. desc = " Lid Closed " ,
2009-10-16 22:50:05 +04:00
} ,
} ;
static struct gpio_keys_platform_data spitz_gpio_keys_platform_data = {
. buttons = spitz_gpio_keys ,
. nbuttons = ARRAY_SIZE ( spitz_gpio_keys ) ,
} ;
static struct platform_device spitz_gpio_keys_device = {
. name = " gpio-keys " ,
. id = - 1 ,
. dev = {
. platform_data = & spitz_gpio_keys_platform_data ,
} ,
} ;
2010-06-14 18:12:03 +04:00
static void __init spitz_keys_init ( void )
{
platform_device_register ( & spitz_gpio_keys_device ) ;
}
# else
static inline void spitz_keys_init ( void ) { }
# endif
2009-10-16 22:50:05 +04:00
2010-06-14 18:12:03 +04:00
/******************************************************************************
* LEDs
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
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 " ,
2016-06-10 08:59:59 +03:00
. default_trigger = " disk-activity " ,
2008-09-05 18:38:23 +04:00
. 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
} ;
2010-07-07 16:32:18 +04:00
static struct platform_device spitz_led_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 = {
2010-07-07 16:32:18 +04:00
. platform_data = & spitz_gpio_leds_info ,
2008-09-05 18:38:23 +04:00
} ,
2006-03-31 14:31:09 +04:00
} ;
2010-06-14 18:12:03 +04:00
static void __init spitz_leds_init ( void )
{
2010-07-07 16:32:18 +04:00
platform_device_register ( & spitz_led_device ) ;
2010-06-14 18:12:03 +04:00
}
# else
static inline void spitz_leds_init ( void ) { }
# endif
2008-01-02 03:09:54 +03:00
2010-06-14 18:12:03 +04:00
/******************************************************************************
* SSP Devices
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
2010-07-07 16:32:18 +04:00
static void spitz_ads7846_wait_for_hsync ( void )
2009-02-06 11:49:23 +03:00
{
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 ,
2010-07-07 16:32:18 +04:00
. wait_for_sync = spitz_ads7846_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 [ ] = {
{
2010-07-07 16:32:18 +04:00
. modalias = " ads7846 " ,
. max_speed_hz = 1200000 ,
. bus_num = 2 ,
. chip_select = 0 ,
. platform_data = & spitz_ads7846_info ,
. controller_data = & spitz_ads7846_chip ,
2011-10-10 12:03:51 +04:00
. irq = PXA_GPIO_TO_IRQ ( SPITZ_GPIO_TP_INT ) ,
2008-09-03 08:09:24 +04:00
} , {
2010-07-07 16:32:18 +04:00
. modalias = " corgi-lcd " ,
. max_speed_hz = 50000 ,
. bus_num = 2 ,
. chip_select = 1 ,
. platform_data = & spitz_lcdcon_info ,
. controller_data = & spitz_lcdcon_chip ,
2008-09-03 08:09:24 +04:00
} , {
2010-07-07 16:32:18 +04:00
. 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
} ,
} ;
2010-06-14 18:12:03 +04:00
static struct pxa2xx_spi_master spitz_spi_info = {
. num_chipselect = 3 ,
} ;
2010-07-07 16:32:18 +04:00
static void __init spitz_spi_init ( void )
2008-09-03 08:09:24 +04:00
{
2010-06-14 18:12:03 +04:00
struct corgi_lcd_platform_data * lcd_data = & spitz_lcdcon_info ;
2008-09-07 07:30:06 +04:00
if ( machine_is_akita ( ) ) {
2010-06-14 18:12:03 +04:00
lcd_data - > gpio_backlight_cont = AKITA_GPIO_BACKLIGHT_CONT ;
lcd_data - > gpio_backlight_on = AKITA_GPIO_BACKLIGHT_ON ;
2008-09-07 07:30:06 +04:00
}
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
2010-07-07 16:32:18 +04:00
static inline void spitz_spi_init ( void ) { }
2008-09-03 08:09:24 +04:00
# endif
2005-09-13 12:25:34 +04:00
2010-06-14 18:12:03 +04:00
/******************************************************************************
* SD / MMC card controller
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
2005-09-13 12:25:34 +04:00
/*
2010-06-14 18:12:03 +04:00
* NOTE : The card detect interrupt isn ' t debounced so we delay it by 250 ms to
* give the card a chance to fully insert / eject .
2005-09-13 12:25:34 +04:00
*/
2013-07-05 19:51:20 +04:00
static int spitz_mci_setpower ( struct device * dev , unsigned int vdd )
2005-09-13 12:25:34 +04:00
{
struct pxamci_platform_data * p_d = dev - > platform_data ;
2010-06-14 18:12:03 +04:00
if ( ( 1 < < vdd ) & p_d - > ocr_mask )
spitz_card_pwr_ctrl ( SCOOP_CPR_SD_3V , SCOOP_CPR_SD_3V ) ;
2005-11-08 22:15:43 +03:00
else
2010-06-14 18:12:03 +04:00
spitz_card_pwr_ctrl ( SCOOP_CPR_SD_3V , 0x0 ) ;
2013-07-05 19:51:20 +04:00
return 0 ;
2005-09-13 12:25:34 +04:00
}
static struct pxamci_platform_data spitz_mci_platform_data = {
2010-04-14 03:00:42 +04:00
. detect_delay_ms = 250 ,
2009-07-07 00:16:42 +04:00
. ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34 ,
2010-07-07 16:32:18 +04:00
. setpower = spitz_mci_setpower ,
2009-07-07 00:16:42 +04:00
. 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
} ;
2010-06-14 18:12:03 +04:00
static void __init spitz_mmc_init ( void )
{
pxa_set_mci_info ( & spitz_mci_platform_data ) ;
}
# else
static inline void spitz_mmc_init ( void ) { }
# endif
2005-09-13 12:25:34 +04:00
2010-06-14 18:12:03 +04:00
/******************************************************************************
* USB Host
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
2006-01-05 23:44:52 +03:00
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
2010-06-14 18:12:03 +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
} ;
2010-06-14 18:12:03 +04:00
static void __init spitz_uhc_init ( void )
{
pxa_set_ohci_info ( & spitz_ohci_platform_data ) ;
}
# else
static inline void spitz_uhc_init ( void ) { }
# endif
2006-01-05 23:44:52 +03:00
2010-06-14 18:12:03 +04:00
/******************************************************************************
* IrDA
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_PXA_FICP) || defined(CONFIG_PXA_FICP_MODULE)
2005-10-30 17:50:25 +03:00
static struct pxaficp_platform_data spitz_ficp_platform_data = {
2008-09-05 18:15:23 +04:00
. transceiver_cap = IR_SIRMODE | IR_OFF ,
2005-10-30 17:50:25 +03:00
} ;
2010-06-14 18:12:03 +04:00
static void __init spitz_irda_init ( void )
{
if ( machine_is_akita ( ) )
spitz_ficp_platform_data . gpio_pwdown = AKITA_GPIO_IR_ON ;
else
spitz_ficp_platform_data . gpio_pwdown = SPITZ_GPIO_IR_ON ;
2005-10-30 17:50:25 +03:00
2010-06-14 18:12:03 +04:00
pxa_set_ficp_info ( & spitz_ficp_platform_data ) ;
}
# else
static inline void spitz_irda_init ( void ) { }
# endif
2006-09-21 01:54:21 +04:00
2010-06-14 18:12:03 +04:00
/******************************************************************************
* Framebuffer
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
2006-09-21 01:54:21 +04:00
static struct pxafb_mode_info spitz_pxafb_modes [ ] = {
2010-07-07 16:32:18 +04:00
{
. 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 ,
} ,
2006-09-21 01:54:21 +04:00
} ;
static struct pxafb_mach_info spitz_pxafb_info = {
2010-06-14 18:12:03 +04:00
. modes = spitz_pxafb_modes ,
. num_modes = ARRAY_SIZE ( spitz_pxafb_modes ) ,
2006-09-21 01:54:21 +04:00
. 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
} ;
2010-06-14 18:12:03 +04:00
static void __init spitz_lcd_init ( void )
{
2011-02-15 10:37:30 +03:00
pxa_set_fb_info ( NULL , & spitz_pxafb_info ) ;
2010-06-14 18:12:03 +04:00
}
# else
static inline void spitz_lcd_init ( void ) { }
# endif
/******************************************************************************
2012-12-11 23:40:11 +04:00
* NAND Flash
2010-06-14 18:12:03 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_MTD_NAND_SHARPSL) || defined(CONFIG_MTD_NAND_SHARPSL_MODULE)
2010-07-07 16:32:18 +04:00
static struct mtd_partition spitz_nand_partitions [ ] = {
2008-10-16 19:17:05 +04:00
{
. name = " System Area " ,
. offset = 0 ,
. size = 7 * 1024 * 1024 ,
2010-07-07 16:32:18 +04:00
} , {
2008-10-16 19:17:05 +04:00
. name = " Root Filesystem " ,
. offset = 7 * 1024 * 1024 ,
2010-07-07 16:32:18 +04:00
} , {
2008-10-16 19:17:05 +04:00
. name = " Home Filesystem " ,
. offset = MTDPART_OFS_APPEND ,
. size = MTDPART_SIZ_FULL ,
} ,
} ;
static uint8_t scan_ff_pattern [ ] = { 0xff , 0xff } ;
2010-07-07 16:32:18 +04:00
static struct nand_bbt_descr spitz_nand_bbt = {
. options = 0 ,
. offs = 4 ,
. len = 2 ,
. pattern = scan_ff_pattern
2008-10-16 19:17:05 +04:00
} ;
2016-02-03 21:58:11 +03:00
static int akita_ooblayout_ecc ( struct mtd_info * mtd , int section ,
struct mtd_oob_region * oobregion )
{
if ( section > 12 )
return - ERANGE ;
switch ( section % 3 ) {
case 0 :
oobregion - > offset = 5 ;
oobregion - > length = 1 ;
break ;
case 1 :
oobregion - > offset = 1 ;
oobregion - > length = 3 ;
break ;
case 2 :
oobregion - > offset = 6 ;
oobregion - > length = 2 ;
break ;
}
oobregion - > offset + = ( section / 3 ) * 0x10 ;
return 0 ;
}
static int akita_ooblayout_free ( struct mtd_info * mtd , int section ,
struct mtd_oob_region * oobregion )
{
if ( section )
return - ERANGE ;
oobregion - > offset = 8 ;
oobregion - > length = 9 ;
return 0 ;
}
static const struct mtd_ooblayout_ops akita_ooblayout_ops = {
. ecc = akita_ooblayout_ecc ,
. free = akita_ooblayout_free ,
2008-10-16 19:17:05 +04:00
} ;
2010-07-07 16:32:18 +04:00
static struct sharpsl_nand_platform_data spitz_nand_pdata = {
. badblock_pattern = & spitz_nand_bbt ,
. partitions = spitz_nand_partitions ,
. nr_partitions = ARRAY_SIZE ( spitz_nand_partitions ) ,
2008-10-16 19:17:05 +04:00
} ;
2010-07-07 16:32:18 +04:00
static struct resource spitz_nand_resources [ ] = {
2008-10-16 19:17:05 +04:00
{
2010-06-14 18:12:03 +04:00
. start = PXA_CS3_PHYS ,
. end = PXA_CS3_PHYS + SZ_4K - 1 ,
2008-10-16 19:17:05 +04:00
. flags = IORESOURCE_MEM ,
} ,
} ;
2010-07-07 16:32:18 +04:00
static struct platform_device spitz_nand_device = {
2008-10-16 19:17:05 +04:00
. name = " sharpsl-nand " ,
. id = - 1 ,
2010-07-07 16:32:18 +04:00
. resource = spitz_nand_resources ,
. num_resources = ARRAY_SIZE ( spitz_nand_resources ) ,
2010-06-14 18:12:03 +04:00
. dev = {
2010-07-07 16:32:18 +04:00
. platform_data = & spitz_nand_pdata ,
2010-06-14 18:12:03 +04:00
}
2008-10-16 19:17:05 +04:00
} ;
2010-06-14 18:12:03 +04:00
static void __init spitz_nand_init ( void )
{
if ( machine_is_spitz ( ) ) {
2010-07-07 16:32:18 +04:00
spitz_nand_partitions [ 1 ] . size = 5 * 1024 * 1024 ;
2010-06-14 18:12:03 +04:00
} else if ( machine_is_akita ( ) ) {
2010-07-07 16:32:18 +04:00
spitz_nand_partitions [ 1 ] . size = 58 * 1024 * 1024 ;
spitz_nand_bbt . len = 1 ;
2016-02-03 21:58:11 +03:00
spitz_nand_pdata . ecc_layout = & akita_ooblayout_ops ;
2010-06-14 18:12:03 +04:00
} else if ( machine_is_borzoi ( ) ) {
2010-07-07 16:32:18 +04:00
spitz_nand_partitions [ 1 ] . size = 32 * 1024 * 1024 ;
spitz_nand_bbt . len = 1 ;
2016-02-03 21:58:11 +03:00
spitz_nand_pdata . ecc_layout = & akita_ooblayout_ops ;
2010-06-14 18:12:03 +04:00
}
2010-07-07 16:32:18 +04:00
platform_device_register ( & spitz_nand_device ) ;
2010-06-14 18:12:03 +04:00
}
# else
static inline void spitz_nand_init ( void ) { }
# endif
2005-09-13 12:25:34 +04:00
2010-06-14 18:12:03 +04:00
/******************************************************************************
* NOR Flash
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
2010-07-07 16:32:18 +04:00
static struct mtd_partition spitz_rom_parts [ ] = {
2008-11-25 00:57:28 +03:00
{
. name = " Boot PROM Filesystem " ,
. offset = 0x00140000 ,
. size = MTDPART_SIZ_FULL ,
} ,
} ;
2010-07-07 16:32:18 +04:00
static struct physmap_flash_data spitz_rom_data = {
2008-11-25 00:57:28 +03:00
. width = 2 ,
2010-07-07 16:32:18 +04:00
. nr_parts = ARRAY_SIZE ( spitz_rom_parts ) ,
. parts = spitz_rom_parts ,
2008-11-25 00:57:28 +03:00
} ;
2010-07-07 16:32:18 +04:00
static struct resource spitz_rom_resources [ ] = {
2008-11-25 00:57:28 +03:00
{
2010-06-14 18:12:03 +04:00
. start = PXA_CS0_PHYS ,
. end = PXA_CS0_PHYS + SZ_8M - 1 ,
2008-11-25 00:57:28 +03:00
. flags = IORESOURCE_MEM ,
} ,
} ;
2010-07-07 16:32:18 +04:00
static struct platform_device spitz_rom_device = {
. name = " physmap-flash " ,
. id = - 1 ,
. resource = spitz_rom_resources ,
. num_resources = ARRAY_SIZE ( spitz_rom_resources ) ,
2010-06-14 18:12:03 +04:00
. dev = {
2010-07-07 16:32:18 +04:00
. platform_data = & spitz_rom_data ,
2010-06-14 18:12:03 +04:00
} ,
2008-11-25 00:57:28 +03:00
} ;
2010-06-14 18:12:03 +04:00
static void __init spitz_nor_init ( void )
{
2010-07-07 16:32:18 +04:00
platform_device_register ( & spitz_rom_device ) ;
2010-06-14 18:12:03 +04:00
}
# else
static inline void spitz_nor_init ( void ) { }
# endif
/******************************************************************************
2012-12-11 23:40:11 +04:00
* I2C devices
2010-06-14 18:12:03 +04:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
static struct pca953x_platform_data akita_pca953x_pdata = {
. gpio_base = AKITA_IOEXP_GPIO_BASE ,
2005-09-13 12:25:34 +04:00
} ;
2010-06-14 18:12:03 +04:00
static struct i2c_board_info spitz_i2c_devs [ ] = {
{
. type = " wm8750 " ,
. addr = 0x1b ,
} , {
. type = " max7310 " ,
. addr = 0x18 ,
. platform_data = & akita_pca953x_pdata ,
} ,
} ;
static struct regulator_consumer_supply isl6271a_consumers [ ] = {
2012-05-08 12:25:10 +04:00
REGULATOR_SUPPLY ( " vcc_core " , NULL ) ,
2008-11-25 00:57:28 +03:00
} ;
2010-06-14 18:12:03 +04:00
static struct regulator_init_data isl6271a_info [ ] = {
{
. constraints = {
. name = " vcc_core range " ,
. min_uV = 850000 ,
. max_uV = 1600000 ,
. always_on = 1 ,
. valid_ops_mask = REGULATOR_CHANGE_VOLTAGE ,
} ,
. consumer_supplies = isl6271a_consumers ,
. num_consumer_supplies = ARRAY_SIZE ( isl6271a_consumers ) ,
}
2005-09-13 12:25:34 +04:00
} ;
2010-06-14 18:12:03 +04:00
static struct i2c_board_info spitz_pi2c_devs [ ] = {
{
. type = " isl6271a " ,
. addr = 0x0c ,
. platform_data = & isl6271a_info ,
} ,
} ;
static void __init spitz_i2c_init ( void )
{
int size = ARRAY_SIZE ( spitz_i2c_devs ) ;
/* Only Akita has the max7310 chip */
if ( ! machine_is_akita ( ) )
size - - ;
pxa_set_i2c_info ( NULL ) ;
pxa27x_set_i2c_power_info ( NULL ) ;
i2c_register_board_info ( 0 , spitz_i2c_devs , size ) ;
i2c_register_board_info ( 1 , ARRAY_AND_SIZE ( spitz_pi2c_devs ) ) ;
}
# else
static inline void spitz_i2c_init ( void ) { }
# endif
2014-10-24 21:50:04 +04:00
/******************************************************************************
* Audio devices
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static inline void spitz_audio_init ( void )
{
platform_device_register_simple ( " spitz-audio " , - 1 , NULL , 0 ) ;
}
2010-06-14 18:12:03 +04:00
/******************************************************************************
* Machine init
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2006-06-19 22:57:12 +04:00
static void spitz_poweroff ( void )
{
2013-07-09 03:01:40 +04:00
pxa_restart ( REBOOT_GPIO , NULL ) ;
2006-06-19 22:57:12 +04:00
}
2013-07-09 03:01:40 +04:00
static void spitz_restart ( enum reboot_mode mode , const char * cmd )
2006-06-19 22:57:12 +04:00
{
2010-11-03 18:29:35 +03:00
uint32_t msc0 = __raw_readl ( MSC0 ) ;
2006-06-19 22:57:12 +04:00
/* Bootloader magic for a reboot */
2010-11-03 18:29:35 +03:00
if ( ( msc0 & 0xffff0000 ) = = 0x7ff00000 )
__raw_writel ( ( msc0 & 0xffff ) | 0x7ee00000 , MSC0 ) ;
2006-06-19 22:57:12 +04:00
spitz_poweroff ( ) ;
}
2010-06-14 18:12:03 +04:00
static void __init spitz_init ( void )
2005-09-13 12:25:34 +04:00
{
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 ;
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
2009-11-09 08:34:08 +03:00
pxa_set_ffuart_info ( NULL ) ;
pxa_set_btuart_info ( NULL ) ;
pxa_set_stuart_info ( NULL ) ;
2010-07-07 16:32:18 +04:00
spitz_spi_init ( ) ;
2010-06-14 18:12:03 +04:00
spitz_scoop_init ( ) ;
spitz_mkp_init ( ) ;
spitz_keys_init ( ) ;
spitz_leds_init ( ) ;
spitz_mmc_init ( ) ;
spitz_pcmcia_init ( ) ;
spitz_irda_init ( ) ;
spitz_uhc_init ( ) ;
spitz_lcd_init ( ) ;
spitz_nor_init ( ) ;
spitz_nand_init ( ) ;
spitz_i2c_init ( ) ;
2014-10-24 21:50:04 +04:00
spitz_audio_init ( ) ;
2014-12-04 14:10:02 +03:00
regulator_has_full_constraints ( ) ;
2005-09-13 12:25:34 +04:00
}
2014-04-14 01:54:58 +04:00
static void __init spitz_fixup ( struct tag * tags , char * * cmdline )
2005-09-13 12:25:34 +04:00
{
sharpsl_save_param ( ) ;
2014-04-14 01:54:58 +04:00
memblock_add ( 0xa0000000 , SZ_64M ) ;
2005-09-13 12:25:34 +04:00
}
# ifdef CONFIG_MACH_SPITZ
MACHINE_START ( SPITZ , " SHARP Spitz " )
2010-07-07 16:32:18 +04:00
. fixup = spitz_fixup ,
2010-10-11 04:20:19 +04:00
. map_io = pxa27x_map_io ,
2012-01-04 02:53:48 +04:00
. nr_irqs = PXA_NR_IRQS ,
2007-06-22 07:14:09 +04:00
. init_irq = pxa27x_init_irq ,
2011-05-18 17:30:04 +04:00
. handle_irq = pxa27x_handle_irq ,
2005-09-13 12:25:34 +04:00
. init_machine = spitz_init ,
2012-11-08 23:40:59 +04:00
. init_time = pxa_timer_init ,
2011-11-04 18:15:53 +04:00
. restart = spitz_restart ,
2005-09-13 12:25:34 +04:00
MACHINE_END
# endif
# ifdef CONFIG_MACH_BORZOI
MACHINE_START ( BORZOI , " SHARP Borzoi " )
2010-07-07 16:32:18 +04:00
. fixup = spitz_fixup ,
2010-10-11 04:20:19 +04:00
. map_io = pxa27x_map_io ,
2012-01-04 02:53:48 +04:00
. nr_irqs = PXA_NR_IRQS ,
2007-06-22 07:14:09 +04:00
. init_irq = pxa27x_init_irq ,
2011-05-18 17:30:04 +04:00
. handle_irq = pxa27x_handle_irq ,
2005-09-13 12:25:34 +04:00
. init_machine = spitz_init ,
2012-11-08 23:40:59 +04:00
. init_time = pxa_timer_init ,
2011-11-04 18:15:53 +04:00
. restart = spitz_restart ,
2005-09-13 12:25:34 +04:00
MACHINE_END
# endif
2005-11-12 21:53:48 +03:00
# ifdef CONFIG_MACH_AKITA
MACHINE_START ( AKITA , " SHARP Akita " )
2010-07-07 16:32:18 +04:00
. fixup = spitz_fixup ,
2010-10-11 04:20:19 +04:00
. map_io = pxa27x_map_io ,
2012-01-04 02:53:48 +04:00
. nr_irqs = PXA_NR_IRQS ,
2007-06-22 07:14:09 +04:00
. init_irq = pxa27x_init_irq ,
2011-05-18 17:30:04 +04:00
. handle_irq = pxa27x_handle_irq ,
2010-06-14 18:12:03 +04:00
. init_machine = spitz_init ,
2012-11-08 23:40:59 +04:00
. init_time = pxa_timer_init ,
2011-11-04 18:15:53 +04:00
. restart = spitz_restart ,
2005-11-12 21:53:48 +03:00
MACHINE_END
# endif