2005-04-16 15:20:36 -07:00
/*
2005-07-10 19:58:11 +01:00
* linux / arch / arm / mach - omap1 / board - osk . c
2005-04-16 15:20:36 -07:00
*
* Board specific init for OMAP5912 OSK
*
* Written by Dirk Behme < dirk . behme @ de . bosch . com >
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation ; either version 2 of the License , or ( at your
* option ) any later version .
*
* THIS SOFTWARE IS PROVIDED ` ` AS IS ' ' AND ANY EXPRESS OR IMPLIED
* WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED . IN
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
* NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF
* USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*
* You should have received a copy of the GNU General Public License along
* with this program ; if not , write to the Free Software Foundation , Inc . ,
* 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
2011-07-26 10:53:52 +01:00
# include <linux/gpio.h>
2005-04-16 15:20:36 -07:00
# include <linux/kernel.h>
# include <linux/init.h>
2005-10-29 19:07:23 +01:00
# include <linux/platform_device.h>
2006-12-07 13:58:17 -08:00
# include <linux/interrupt.h>
2006-07-01 22:32:35 +01:00
# include <linux/irq.h>
2007-10-13 23:56:30 +02:00
# include <linux/i2c.h>
2008-02-28 22:09:15 -08:00
# include <linux/leds.h>
2009-12-11 16:16:33 -08:00
# include <linux/smc91x.h>
2011-09-20 15:23:13 +03:00
# include <linux/omapfb.h>
2005-09-08 23:07:38 +01:00
# include <linux/mtd/mtd.h>
# include <linux/mtd/partitions.h>
2010-02-15 10:03:32 -08:00
# include <linux/mtd/physmap.h>
2017-08-14 18:34:23 +02:00
# include <linux/mfd/tps65010.h>
2012-08-30 15:37:24 -07:00
# include <linux/platform_data/gpio-omap.h>
2012-08-29 02:18:54 +03:00
# include <linux/platform_data/omap1_bl.h>
2008-01-27 18:14:49 +01:00
2005-04-16 15:20:36 -07:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
2015-01-30 10:45:33 +01:00
# include "flash.h"
2012-09-19 10:46:56 -07:00
# include <mach/mux.h>
2012-10-02 13:39:28 -07:00
# include <mach/tc.h>
2012-02-24 10:34:34 -08:00
# include <mach/hardware.h>
2012-06-04 00:56:15 -07:00
# include <mach/usb.h>
2012-02-24 10:34:34 -08:00
2011-11-10 22:45:17 +01:00
# include "common.h"
2006-04-02 17:46:30 +01:00
2009-03-23 18:07:34 -07:00
/* At OMAP5912 OSK the Ethernet is directly connected to CS1 */
# define OMAP_OSK_ETHR_START 0x04800300
/* TPS65010 has four GPIOs. nPG and LED2 can be treated like GPIOs with
* alternate pin configurations for hardware - controlled blinking .
*/
# define OSK_TPS_GPIO_BASE (OMAP_MAX_GPIO_LINES + 16 /* MPUIO */ )
# define OSK_TPS_GPIO_USB_PWR_EN (OSK_TPS_GPIO_BASE + 0)
# define OSK_TPS_GPIO_LED_D3 (OSK_TPS_GPIO_BASE + 1)
# define OSK_TPS_GPIO_LAN_RESET (OSK_TPS_GPIO_BASE + 2)
# define OSK_TPS_GPIO_DSP_PWR_EN (OSK_TPS_GPIO_BASE + 3)
# define OSK_TPS_GPIO_LED_D9 (OSK_TPS_GPIO_BASE + 4)
# define OSK_TPS_GPIO_LED_D2 (OSK_TPS_GPIO_BASE + 5)
2005-09-08 23:07:38 +01:00
static struct mtd_partition osk_partitions [ ] = {
/* bootloader (U-Boot, etc) in first sector */
{
. name = " bootloader " ,
. offset = 0 ,
. size = SZ_128K ,
. mask_flags = MTD_WRITEABLE , /* force read-only */
} ,
/* bootloader params in the next sector */
{
. name = " params " ,
. offset = MTDPART_OFS_APPEND ,
. size = SZ_128K ,
. mask_flags = 0 ,
} , {
. name = " kernel " ,
. offset = MTDPART_OFS_APPEND ,
. size = SZ_2M ,
. mask_flags = 0
} , {
. name = " filesystem " ,
. offset = MTDPART_OFS_APPEND ,
. size = MTDPART_SIZ_FULL ,
. mask_flags = 0
}
2005-04-16 15:20:36 -07:00
} ;
2010-02-15 10:03:32 -08:00
static struct physmap_flash_data osk_flash_data = {
2005-09-08 23:07:38 +01:00
. width = 2 ,
2010-02-15 10:03:32 -08:00
. set_vpp = omap1_set_vpp ,
2005-09-08 23:07:38 +01:00
. parts = osk_partitions ,
. nr_parts = ARRAY_SIZE ( osk_partitions ) ,
} ;
static struct resource osk_flash_resource = {
/* this is on CS3, wherever it's mapped */
. flags = IORESOURCE_MEM ,
} ;
static struct platform_device osk5912_flash_device = {
2010-02-15 10:03:32 -08:00
. name = " physmap-flash " ,
2005-09-08 23:07:38 +01:00
. id = 0 ,
. dev = {
. platform_data = & osk_flash_data ,
} ,
. num_resources = 1 ,
. resource = & osk_flash_resource ,
} ;
2005-04-16 15:20:36 -07:00
2009-12-11 16:16:33 -08:00
static struct smc91x_platdata osk5912_smc91x_info = {
. flags = SMC91X_USE_16BIT | SMC91X_NOWAIT ,
. leda = RPC_LED_100_10 ,
. ledb = RPC_LED_TX_RX ,
} ;
2005-04-16 15:20:36 -07:00
static struct resource osk5912_smc91x_resources [ ] = {
[ 0 ] = {
. start = OMAP_OSK_ETHR_START , /* Physical */
. end = OMAP_OSK_ETHR_START + 0xf ,
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = {
2008-01-14 22:30:10 +00:00
. flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE ,
2005-04-16 15:20:36 -07:00
} ,
} ;
static struct platform_device osk5912_smc91x_device = {
. name = " smc91x " ,
. id = - 1 ,
2009-12-11 16:16:33 -08:00
. dev = {
. platform_data = & osk5912_smc91x_info ,
} ,
2005-04-16 15:20:36 -07:00
. num_resources = ARRAY_SIZE ( osk5912_smc91x_resources ) ,
. resource = osk5912_smc91x_resources ,
} ;
static struct resource osk5912_cf_resources [ ] = {
[ 0 ] = {
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device osk5912_cf_device = {
. name = " omap_cf " ,
. id = - 1 ,
. dev = {
. platform_data = ( void * ) 2 /* CS2 */ ,
} ,
. num_resources = ARRAY_SIZE ( osk5912_cf_resources ) ,
. resource = osk5912_cf_resources ,
} ;
static struct platform_device * osk5912_devices [ ] __initdata = {
2005-09-08 23:07:38 +01:00
& osk5912_flash_device ,
2005-04-16 15:20:36 -07:00
& osk5912_smc91x_device ,
& osk5912_cf_device ,
} ;
2008-02-28 22:09:15 -08:00
static struct gpio_led tps_leds [ ] = {
/* NOTE: D9 and D2 have hardware blink support.
* Also , D9 requires non - battery power .
*/
2008-12-10 17:35:54 -08:00
{ . gpio = OSK_TPS_GPIO_LED_D9 , . name = " d9 " ,
2016-06-10 07:59:59 +02:00
. default_trigger = " disk-activity " , } ,
2008-02-28 22:09:15 -08:00
{ . gpio = OSK_TPS_GPIO_LED_D2 , . name = " d2 " , } ,
{ . gpio = OSK_TPS_GPIO_LED_D3 , . name = " d3 " , . active_low = 1 ,
. default_trigger = " heartbeat " , } ,
} ;
static struct gpio_led_platform_data tps_leds_data = {
. num_leds = 3 ,
. leds = tps_leds ,
} ;
static struct platform_device osk5912_tps_leds = {
. name = " leds-gpio " ,
. id = 0 ,
. dev . platform_data = & tps_leds_data ,
} ;
static int osk_tps_setup ( struct i2c_client * client , void * context )
{
2014-03-21 13:33:03 +01:00
if ( ! IS_BUILTIN ( CONFIG_TPS65010 ) )
return - ENOSYS ;
2008-02-28 22:09:15 -08:00
/* Set GPIO 1 HIGH to disable VBUS power supply;
* OHCI driver powers it up / down as needed .
*/
gpio_request ( OSK_TPS_GPIO_USB_PWR_EN , " n_vbus_en " ) ;
gpio_direction_output ( OSK_TPS_GPIO_USB_PWR_EN , 1 ) ;
/* Set GPIO 2 high so LED D3 is off by default */
tps65010_set_gpio_out_value ( GPIO2 , HIGH ) ;
/* Set GPIO 3 low to take ethernet out of reset */
gpio_request ( OSK_TPS_GPIO_LAN_RESET , " smc_reset " ) ;
gpio_direction_output ( OSK_TPS_GPIO_LAN_RESET , 0 ) ;
/* GPIO4 is VDD_DSP */
gpio_request ( OSK_TPS_GPIO_DSP_PWR_EN , " dsp_power " ) ;
gpio_direction_output ( OSK_TPS_GPIO_DSP_PWR_EN , 1 ) ;
/* REVISIT if DSP support isn't configured, power it off ... */
/* Let LED1 (D9) blink; leds-gpio may override it */
tps65010_set_led ( LED1 , BLINK ) ;
/* Set LED2 off by default */
tps65010_set_led ( LED2 , OFF ) ;
/* Enable LOW_PWR handshake */
tps65010_set_low_pwr ( ON ) ;
/* Switch VLDO2 to 3.0V for AIC23 */
tps65010_config_vregs1 ( TPS_LDO2_ENABLE | TPS_VLDO2_3_0V
| TPS_LDO1_ENABLE ) ;
/* register these three LEDs */
osk5912_tps_leds . dev . parent = & client - > dev ;
platform_device_register ( & osk5912_tps_leds ) ;
return 0 ;
}
static struct tps65010_board tps_board = {
. base = OSK_TPS_GPIO_BASE ,
. outmask = 0x0f ,
. setup = osk_tps_setup ,
} ;
2007-10-13 23:56:30 +02:00
static struct i2c_board_info __initdata osk_i2c_board_info [ ] = {
{
I2C_BOARD_INFO ( " tps65010 " , 0x48 ) ,
2008-02-28 22:09:15 -08:00
. platform_data = & tps_board ,
2007-10-13 23:56:30 +02:00
} ,
2009-01-15 13:09:54 +02:00
{
I2C_BOARD_INFO ( " tlv320aic23 " , 0x1B ) ,
} ,
2007-10-13 23:56:30 +02:00
/* TODO when driver support is ready:
* - optionally on Mistral , ov9640 camera sensor at 0x30
*/
} ;
2005-04-16 15:20:36 -07:00
static void __init osk_init_smc91x ( void )
{
2008-07-03 12:24:41 +03:00
u32 l ;
2008-02-26 00:01:23 -08:00
if ( ( gpio_request ( 0 , " smc_irq " ) ) < 0 ) {
2005-04-16 15:20:36 -07:00
printk ( " Error requesting gpio 0 for smc91x irq \n " ) ;
return ;
}
/* Check EMIFS wait states to fix errors with SMC_GET_PKT_HDR */
2008-07-03 12:24:41 +03:00
l = omap_readl ( EMIFS_CCS ( 1 ) ) ;
l | = 0x3 ;
omap_writel ( l , EMIFS_CCS ( 1 ) ) ;
2005-04-16 15:20:36 -07:00
}
static void __init osk_init_cf ( void )
{
omap_cfg_reg ( M7_1610_GPIO62 ) ;
2008-02-26 00:01:23 -08:00
if ( ( gpio_request ( 62 , " cf_irq " ) ) < 0 ) {
2005-04-16 15:20:36 -07:00
printk ( " Error requesting gpio 62 for CF irq \n " ) ;
return ;
}
2005-09-08 23:07:38 +01:00
/* the CF I/O IRQ is really active-low */
2011-03-24 13:25:22 +01:00
irq_set_irq_type ( gpio_to_irq ( 62 ) , IRQ_TYPE_EDGE_FALLING ) ;
2005-04-16 15:20:36 -07:00
}
static struct omap_usb_config osk_usb_config __initdata = {
/* has usb host connector (A) ... for development it can also
* be used , with a NONSTANDARD gender - bending cable / dongle , as
* a peripheral .
*/
2014-05-16 12:00:57 +02:00
# if IS_ENABLED(CONFIG_USB_OMAP)
2005-04-16 15:20:36 -07:00
. register_dev = 1 ,
. hmc_mode = 0 ,
# else
. register_host = 1 ,
. hmc_mode = 16 ,
. rwc = 1 ,
# endif
. pins [ 0 ] = 2 ,
} ;
2006-06-26 16:15:59 -07:00
# ifdef CONFIG_OMAP_OSK_MISTRAL
2017-08-22 11:55:50 +05:30
static const struct omap_lcd_config osk_lcd_config __initconst = {
2005-11-10 14:26:48 +00:00
. ctrl_name = " internal " ,
} ;
2006-06-26 16:15:59 -07:00
# endif
2005-11-10 14:26:48 +00:00
2005-09-08 23:07:38 +01:00
# ifdef CONFIG_OMAP_OSK_MISTRAL
2006-06-26 16:15:59 -07:00
# include <linux/input.h>
2013-09-27 15:06:28 -04:00
# include <linux/platform_data/at24.h>
2006-06-26 16:15:59 -07:00
# include <linux/spi/spi.h>
# include <linux/spi/ads7846.h>
2012-08-24 15:21:06 +02:00
# include <linux/platform_data/keypad-omap.h>
2006-06-26 16:15:59 -07:00
2008-12-10 17:35:53 -08:00
static struct at24_platform_data at24c04 = {
. byte_len = SZ_4K / 8 ,
. page_size = 16 ,
} ;
static struct i2c_board_info __initdata mistral_i2c_board_info [ ] = {
{
/* NOTE: powered from LCD supply */
I2C_BOARD_INFO ( " 24c04 " , 0x50 ) ,
. platform_data = & at24c04 ,
} ,
/* TODO when driver support is ready:
* - optionally ov9640 camera sensor at 0x30
*/
} ;
2010-12-20 21:09:22 +00:00
static const unsigned int osk_keymap [ ] = {
2006-06-26 16:15:59 -07:00
/* KEY(col, row, code) */
KEY ( 0 , 0 , KEY_F1 ) , /* SW4 */
2010-12-20 21:09:22 +00:00
KEY ( 3 , 0 , KEY_UP ) , /* (sw2/up) */
2006-06-26 16:15:59 -07:00
KEY ( 1 , 1 , KEY_LEFTCTRL ) , /* SW5 */
2010-12-20 21:09:22 +00:00
KEY ( 2 , 1 , KEY_LEFT ) , /* (sw2/left) */
KEY ( 0 , 2 , KEY_SPACE ) , /* SW3 */
KEY ( 1 , 2 , KEY_ESC ) , /* SW6 */
2006-06-26 16:15:59 -07:00
KEY ( 2 , 2 , KEY_DOWN ) , /* (sw2/down) */
2010-12-20 21:09:22 +00:00
KEY ( 2 , 3 , KEY_ENTER ) , /* (sw2/select) */
2006-06-26 16:15:59 -07:00
KEY ( 3 , 3 , KEY_RIGHT ) , /* (sw2/right) */
2010-12-20 21:09:22 +00:00
} ;
static const struct matrix_keymap_data osk_keymap_data = {
. keymap = osk_keymap ,
. keymap_size = ARRAY_SIZE ( osk_keymap ) ,
2006-06-26 16:15:59 -07:00
} ;
static struct omap_kp_platform_data osk_kp_data = {
2006-09-29 01:59:20 -07:00
. rows = 8 ,
. cols = 8 ,
2010-12-20 21:09:22 +00:00
. keymap_data = & osk_keymap_data ,
2006-09-29 01:59:20 -07:00
. delay = 9 ,
2006-06-26 16:15:59 -07:00
} ;
static struct resource osk5912_kp_resources [ ] = {
[ 0 ] = {
. start = INT_KEYBOARD ,
. end = INT_KEYBOARD ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device osk5912_kp_device = {
. name = " omap-keypad " ,
. id = - 1 ,
. dev = {
. platform_data = & osk_kp_data ,
} ,
. num_resources = ARRAY_SIZE ( osk5912_kp_resources ) ,
. resource = osk5912_kp_resources ,
} ;
2007-01-25 16:24:01 -08:00
static struct omap_backlight_config mistral_bl_data = {
. default_intensity = 0xa0 ,
} ;
static struct platform_device mistral_bl_device = {
. name = " omap-bl " ,
. id = - 1 ,
. dev = {
. platform_data = & mistral_bl_data ,
} ,
} ;
2006-06-26 16:15:59 -07:00
static struct platform_device osk5912_lcd_device = {
. name = " lcd_osk " ,
. id = - 1 ,
} ;
2012-03-14 02:14:39 +08:00
static struct gpio_led mistral_gpio_led_pins [ ] = {
{
. name = " mistral:red " ,
. default_trigger = " heartbeat " ,
. gpio = 3 ,
} ,
{
. name = " mistral:green " ,
. default_trigger = " cpu0 " ,
. gpio = OMAP_MPUIO ( 4 ) ,
} ,
} ;
static struct gpio_led_platform_data mistral_gpio_led_data = {
. leds = mistral_gpio_led_pins ,
. num_leds = ARRAY_SIZE ( mistral_gpio_led_pins ) ,
} ;
static struct platform_device mistral_gpio_leds = {
. name = " leds-gpio " ,
. id = - 1 ,
. dev = {
. platform_data = & mistral_gpio_led_data ,
} ,
} ;
2006-06-26 16:15:59 -07:00
static struct platform_device * mistral_devices [ ] __initdata = {
& osk5912_kp_device ,
2007-01-25 16:24:01 -08:00
& mistral_bl_device ,
2006-06-26 16:15:59 -07:00
& osk5912_lcd_device ,
2012-03-14 02:14:39 +08:00
& mistral_gpio_leds ,
2006-06-26 16:15:59 -07:00
} ;
2006-06-26 16:16:04 -07:00
static int mistral_get_pendown_state ( void )
{
2008-02-26 00:01:23 -08:00
return ! gpio_get_value ( 4 ) ;
2006-06-26 16:16:04 -07:00
}
2006-06-26 16:15:59 -07:00
static const struct ads7846_platform_data mistral_ts_info = {
. model = 7846 ,
. vref_delay_usecs = 100 , /* internal, no capacitor */
. x_plate_ohms = 419 ,
. y_plate_ohms = 486 ,
2006-06-26 16:16:04 -07:00
. get_pendown_state = mistral_get_pendown_state ,
2006-06-26 16:15:59 -07:00
} ;
static struct spi_board_info __initdata mistral_boardinfo [ ] = { {
/* MicroWire (bus 2) CS0 has an ads7846e */
. modalias = " ads7846 " ,
. platform_data = & mistral_ts_info ,
. max_speed_hz = 120000 /* max sample rate at 3V */
* 26 /* command + data + overhead */ ,
. bus_num = 2 ,
. chip_select = 0 ,
} } ;
2005-09-08 23:07:38 +01:00
static irqreturn_t
2006-10-06 10:53:39 -07:00
osk_mistral_wake_interrupt ( int irq , void * ignored )
2005-09-08 23:07:38 +01:00
{
return IRQ_HANDLED ;
}
static void __init osk_mistral_init ( void )
{
2006-06-26 16:15:59 -07:00
/* NOTE: we could actually tell if there's a Mistral board
2005-09-08 23:07:38 +01:00
* attached , e . g . by trying to read something from the ads7846 .
2006-06-26 16:15:59 -07:00
* But this arch_init ( ) code is too early for that , since we
* can ' t talk to the ads or even the i2c eeprom .
2005-09-08 23:07:38 +01:00
*/
2006-12-11 14:14:11 -08:00
/* parallel camera interface */
omap_cfg_reg ( J15_1610_CAM_LCLK ) ;
omap_cfg_reg ( J18_1610_CAM_D7 ) ;
omap_cfg_reg ( J19_1610_CAM_D6 ) ;
omap_cfg_reg ( J14_1610_CAM_D5 ) ;
omap_cfg_reg ( K18_1610_CAM_D4 ) ;
omap_cfg_reg ( K19_1610_CAM_D3 ) ;
omap_cfg_reg ( K15_1610_CAM_D2 ) ;
omap_cfg_reg ( K14_1610_CAM_D1 ) ;
omap_cfg_reg ( L19_1610_CAM_D0 ) ;
omap_cfg_reg ( L18_1610_CAM_VS ) ;
omap_cfg_reg ( L15_1610_CAM_HS ) ;
omap_cfg_reg ( M19_1610_CAM_RSTZ ) ;
omap_cfg_reg ( Y15_1610_CAM_OUTCLK ) ;
/* serial camera interface */
omap_cfg_reg ( H19_1610_CAM_EXCLK ) ;
omap_cfg_reg ( W13_1610_CCP_CLKM ) ;
omap_cfg_reg ( Y12_1610_CCP_CLKP ) ;
/* CCP_DATAM CONFLICTS WITH UART1.TX (and serial console) */
2007-12-13 22:27:15 -04:00
/* omap_cfg_reg(Y14_1610_CCP_DATAM); */
2006-12-11 14:14:11 -08:00
omap_cfg_reg ( W14_1610_CCP_DATAP ) ;
/* CAM_PWDN */
2008-02-26 00:01:23 -08:00
if ( gpio_request ( 11 , " cam_pwdn " ) = = 0 ) {
2006-12-11 14:14:11 -08:00
omap_cfg_reg ( N20_1610_GPIO11 ) ;
2008-02-26 00:01:23 -08:00
gpio_direction_output ( 11 , 0 ) ;
2006-12-11 14:14:11 -08:00
} else
pr_debug ( " OSK+Mistral: CAM_PWDN is awol \n " ) ;
2007-12-13 22:27:15 -04:00
/* omap_cfg_reg(P19_1610_GPIO6); */ /* BUSY */
2008-02-26 00:01:23 -08:00
gpio_request ( 6 , " ts_busy " ) ;
gpio_direction_input ( 6 ) ;
2007-12-13 22:27:15 -04:00
omap_cfg_reg ( P20_1610_GPIO4 ) ; /* PENIRQ */
2008-02-26 00:01:23 -08:00
gpio_request ( 4 , " ts_int " ) ;
gpio_direction_input ( 4 ) ;
2011-03-24 13:25:22 +01:00
irq_set_irq_type ( gpio_to_irq ( 4 ) , IRQ_TYPE_EDGE_FALLING ) ;
2008-02-26 00:01:23 -08:00
2012-03-29 08:41:01 -07:00
mistral_boardinfo [ 0 ] . irq = gpio_to_irq ( 4 ) ;
2006-06-26 16:15:59 -07:00
spi_register_board_info ( mistral_boardinfo ,
ARRAY_SIZE ( mistral_boardinfo ) ) ;
2008-12-10 17:35:53 -08:00
/* the sideways button (SW1) is for use as a "wakeup" button
*
* NOTE : The Mistral board has the wakeup button ( SW1 ) wired
* to the LCD 3.3 V rail , which is powered down during suspend .
* To allow this button to wake up the omap , work around this
* HW bug by rewiring SW1 to use the main 3.3 V rail .
*/
2005-09-08 23:07:38 +01:00
omap_cfg_reg ( N15_1610_MPUIO2 ) ;
2008-02-26 00:01:23 -08:00
if ( gpio_request ( OMAP_MPUIO ( 2 ) , " wakeup " ) = = 0 ) {
2005-09-08 23:07:38 +01:00
int ret = 0 ;
2008-12-10 17:35:26 -08:00
int irq = gpio_to_irq ( OMAP_MPUIO ( 2 ) ) ;
2008-02-26 00:01:23 -08:00
gpio_direction_input ( OMAP_MPUIO ( 2 ) ) ;
2011-03-24 13:25:22 +01:00
irq_set_irq_type ( irq , IRQ_TYPE_EDGE_RISING ) ;
2005-09-08 23:07:38 +01:00
/* share the IRQ in case someone wants to use the
* button for more than wakeup from system sleep .
*/
2008-12-10 17:35:26 -08:00
ret = request_irq ( irq ,
2005-09-08 23:07:38 +01:00
& osk_mistral_wake_interrupt ,
2006-07-03 02:20:05 +02:00
IRQF_SHARED , " mistral_wakeup " ,
2005-09-08 23:07:38 +01:00
& osk_mistral_wake_interrupt ) ;
if ( ret ! = 0 ) {
2008-02-26 00:01:23 -08:00
gpio_free ( OMAP_MPUIO ( 2 ) ) ;
2005-09-08 23:07:38 +01:00
printk ( KERN_ERR " OSK+Mistral: no wakeup irq, %d? \n " ,
ret ) ;
} else
2008-12-10 17:35:26 -08:00
enable_irq_wake ( irq ) ;
2005-09-08 23:07:38 +01:00
} else
printk ( KERN_ERR " OSK+Mistral: wakeup button is awol \n " ) ;
2006-06-26 16:15:59 -07:00
2007-01-25 16:24:01 -08:00
/* LCD: backlight, and power; power controls other devices on the
* board , like the touchscreen , EEPROM , and wakeup ( ! ) switch .
*/
omap_cfg_reg ( PWL ) ;
2008-02-26 00:01:23 -08:00
if ( gpio_request ( 2 , " lcd_pwr " ) = = 0 )
gpio_direction_output ( 2 , 1 ) ;
2007-01-25 16:24:01 -08:00
2012-03-14 02:14:39 +08:00
/*
* GPIO based LEDs
*/
omap_cfg_reg ( P18_1610_GPIO3 ) ;
omap_cfg_reg ( MPUIO4 ) ;
2008-12-10 17:35:53 -08:00
i2c_register_board_info ( 1 , mistral_i2c_board_info ,
ARRAY_SIZE ( mistral_i2c_board_info ) ) ;
2006-06-26 16:15:59 -07:00
platform_add_devices ( mistral_devices , ARRAY_SIZE ( mistral_devices ) ) ;
2005-09-08 23:07:38 +01:00
}
# else
static void __init osk_mistral_init ( void ) { }
# endif
2006-04-02 17:46:30 +01:00
# define EMIFS_CS3_VAL (0x88013141)
2005-04-16 15:20:36 -07:00
static void __init osk_init ( void )
{
2008-07-03 12:24:41 +03:00
u32 l ;
2010-12-07 16:26:55 -08:00
osk_init_smc91x ( ) ;
osk_init_cf ( ) ;
2006-04-02 17:46:30 +01:00
/* Workaround for wrong CS3 (NOR flash) timing
* There are some U - Boot versions out there which configure
* wrong CS3 memory timings . This mainly leads to CRC
2007-05-11 20:40:30 +01:00
* or similar errors if you use NOR flash ( e . g . with JFFS2 )
2006-04-02 17:46:30 +01:00
*/
2008-07-03 12:24:41 +03:00
l = omap_readl ( EMIFS_CCS ( 3 ) ) ;
if ( l ! = EMIFS_CS3_VAL )
omap_writel ( EMIFS_CS3_VAL , EMIFS_CCS ( 3 ) ) ;
2006-04-02 17:46:30 +01:00
2005-09-08 23:07:38 +01:00
osk_flash_resource . end = osk_flash_resource . start = omap_cs3_phys ( ) ;
osk_flash_resource . end + = SZ_32M - 1 ;
2012-03-29 08:41:01 -07:00
osk5912_smc91x_resources [ 1 ] . start = gpio_to_irq ( 0 ) ;
osk5912_smc91x_resources [ 1 ] . end = gpio_to_irq ( 0 ) ;
osk5912_cf_resources [ 0 ] . start = gpio_to_irq ( 62 ) ;
osk5912_cf_resources [ 0 ] . end = gpio_to_irq ( 62 ) ;
2005-04-16 15:20:36 -07:00
platform_add_devices ( osk5912_devices , ARRAY_SIZE ( osk5912_devices ) ) ;
2008-07-03 12:24:43 +03:00
l = omap_readl ( USB_TRANSCEIVER_CTRL ) ;
l | = ( 3 < < 1 ) ;
omap_writel ( l , USB_TRANSCEIVER_CTRL ) ;
2005-09-08 23:07:38 +01:00
2010-07-05 16:31:30 +03:00
omap1_usb_init ( & osk_usb_config ) ;
2009-03-23 18:07:49 -07:00
2007-10-13 23:56:30 +02:00
/* irq for tps65010 chip */
/* bootloader effectively does: omap_cfg_reg(U19_1610_MPUIO1); */
if ( gpio_request ( OMAP_MPUIO ( 1 ) , " tps65010 " ) = = 0 )
gpio_direction_input ( OMAP_MPUIO ( 1 ) ) ;
2005-11-10 14:26:48 +00:00
omap_serial_init ( ) ;
2012-03-29 08:41:01 -07:00
osk_i2c_board_info [ 0 ] . irq = gpio_to_irq ( OMAP_MPUIO ( 1 ) ) ;
2007-11-07 06:54:32 +02:00
omap_register_i2c_bus ( 1 , 400 , osk_i2c_board_info ,
ARRAY_SIZE ( osk_i2c_board_info ) ) ;
2005-09-08 23:07:38 +01:00
osk_mistral_init ( ) ;
2011-09-20 15:23:13 +03:00
# ifdef CONFIG_OMAP_OSK_MISTRAL
omapfb_set_lcd_config ( & osk_lcd_config ) ;
# endif
2005-04-16 15:20:36 -07:00
}
MACHINE_START ( OMAP_OSK , " TI-OSK " )
2005-07-03 17:38:58 +01:00
/* Maintainer: Dirk Behme <dirk.behme@de.bosch.com> */
2011-07-05 22:38:15 -04:00
. atag_offset = 0x100 ,
2011-10-05 15:14:02 -07:00
. map_io = omap16xx_map_io ,
. init_early = omap1_init_early ,
. init_irq = omap1_init_irq ,
2015-05-20 09:01:21 -07:00
. handle_irq = omap1_handle_irq ,
2005-07-03 17:38:58 +01:00
. init_machine = osk_init ,
2012-04-26 13:49:29 +08:00
. init_late = omap1_init_late ,
2012-11-08 12:40:59 -07:00
. init_time = omap1_timer_init ,
2011-11-05 17:06:28 +00:00
. restart = omap1_restart ,
2005-04-16 15:20:36 -07:00
MACHINE_END