2006-04-02 20:46:30 +04:00
/*
* linux / arch / arm / mach - omap1 / board - nokia770 . c
*
* Modified from board - generic . 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 .
*/
2012-12-20 01:41:01 +04:00
# include <linux/irq.h>
2011-07-26 13:53:52 +04:00
# include <linux/gpio.h>
2006-04-02 20:46:30 +04:00
# include <linux/kernel.h>
# include <linux/init.h>
2008-06-10 03:24:08 +04:00
# include <linux/mutex.h>
2006-04-02 20:46:30 +04:00
# include <linux/platform_device.h>
# include <linux/input.h>
# include <linux/clk.h>
2009-08-03 16:06:36 +04:00
# include <linux/omapfb.h>
2006-04-02 20:46:30 +04:00
# include <linux/spi/spi.h>
# include <linux/spi/ads7846.h>
2007-01-26 03:29:42 +03:00
# include <linux/workqueue.h>
# include <linux/delay.h>
2006-04-02 20:46:30 +04:00
2012-08-24 17:21:06 +04:00
# include <linux/platform_data/keypad-omap.h>
# include <linux/platform_data/lcd-mipid.h>
2012-12-20 01:41:01 +04:00
# include <linux/platform_data/gpio-omap.h>
# include <linux/platform_data/i2c-cbus-gpio.h>
2012-08-24 17:21:06 +04:00
2006-04-02 20:46:30 +04:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
2012-09-19 21:46:56 +04:00
# include <mach/mux.h>
2006-04-02 20:46:30 +04:00
2012-02-24 22:34:34 +04:00
# include <mach/hardware.h>
2012-06-04 11:56:15 +04:00
# include <mach/usb.h>
2012-02-24 22:34:34 +04:00
# include "common.h"
2012-09-27 20:33:34 +04:00
# include "clock.h"
2012-10-15 23:09:43 +04:00
# include "mmc.h"
2012-02-24 22:34:34 +04:00
2007-03-06 19:20:00 +03:00
# define ADS7846_PENDOWN_GPIO 15
2010-12-21 00:09:22 +03:00
static const unsigned int nokia770_keymap [ ] = {
KEY ( 1 , 0 , GROUP_0 | KEY_UP ) ,
KEY ( 2 , 0 , GROUP_1 | KEY_F5 ) ,
KEY ( 0 , 1 , GROUP_0 | KEY_LEFT ) ,
2006-04-02 20:46:30 +04:00
KEY ( 1 , 1 , GROUP_0 | KEY_ENTER ) ,
2010-12-21 00:09:22 +03:00
KEY ( 2 , 1 , GROUP_0 | KEY_RIGHT ) ,
KEY ( 0 , 2 , GROUP_1 | KEY_ESC ) ,
KEY ( 1 , 2 , GROUP_0 | KEY_DOWN ) ,
2006-04-02 20:46:30 +04:00
KEY ( 2 , 2 , GROUP_1 | KEY_F4 ) ,
2010-12-21 00:09:22 +03:00
KEY ( 0 , 3 , GROUP_2 | KEY_F7 ) ,
KEY ( 1 , 3 , GROUP_2 | KEY_F8 ) ,
KEY ( 2 , 3 , GROUP_2 | KEY_F6 ) ,
2006-04-02 20:46:30 +04:00
} ;
static struct resource nokia770_kp_resources [ ] = {
[ 0 ] = {
. start = INT_KEYBOARD ,
. end = INT_KEYBOARD ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
2010-12-21 00:09:22 +03:00
static const struct matrix_keymap_data nokia770_keymap_data = {
. keymap = nokia770_keymap ,
. keymap_size = ARRAY_SIZE ( nokia770_keymap ) ,
} ;
2006-04-02 20:46:30 +04:00
static struct omap_kp_platform_data nokia770_kp_data = {
2006-09-29 12:59:20 +04:00
. rows = 8 ,
. cols = 8 ,
2010-12-21 00:09:22 +03:00
. keymap_data = & nokia770_keymap_data ,
2006-09-29 12:59:20 +04:00
. delay = 4 ,
2006-04-02 20:46:30 +04:00
} ;
static struct platform_device nokia770_kp_device = {
. name = " omap-keypad " ,
. id = - 1 ,
. dev = {
. platform_data = & nokia770_kp_data ,
} ,
. num_resources = ARRAY_SIZE ( nokia770_kp_resources ) ,
. resource = nokia770_kp_resources ,
} ;
static struct platform_device * nokia770_devices [ ] __initdata = {
2006-12-08 00:58:17 +03:00
& nokia770_kp_device ,
2006-04-02 20:46:30 +04:00
} ;
2007-03-06 19:20:00 +03:00
static void mipid_shutdown ( struct mipid_platform_data * pdata )
{
if ( pdata - > nreset_gpio ! = - 1 ) {
printk ( KERN_INFO " shutdown LCD \n " ) ;
2008-12-11 04:35:25 +03:00
gpio_set_value ( pdata - > nreset_gpio , 0 ) ;
2007-03-06 19:20:00 +03:00
msleep ( 120 ) ;
}
}
static struct mipid_platform_data nokia770_mipid_platform_data = {
. shutdown = mipid_shutdown ,
} ;
2011-09-20 16:23:13 +04:00
static struct omap_lcd_config nokia770_lcd_config __initdata = {
. ctrl_name = " hwa742 " ,
} ;
2011-02-09 23:40:07 +03:00
static void __init mipid_dev_init ( void )
2007-03-06 19:20:00 +03:00
{
2011-09-20 16:23:13 +04:00
nokia770_mipid_platform_data . nreset_gpio = 13 ;
nokia770_mipid_platform_data . data_lines = 16 ;
2007-03-06 19:20:00 +03:00
2011-09-20 16:23:13 +04:00
omapfb_set_lcd_config ( & nokia770_lcd_config ) ;
2007-03-06 19:20:00 +03:00
}
2006-04-02 20:46:30 +04:00
static struct ads7846_platform_data nokia770_ads7846_platform_data __initdata = {
. x_max = 0x0fff ,
. y_max = 0x0fff ,
. x_plate_ohms = 180 ,
. pressure_max = 255 ,
. debounce_max = 10 ,
. debounce_tol = 3 ,
2007-03-06 19:20:00 +03:00
. debounce_rep = 1 ,
2012-11-20 12:26:17 +04:00
. gpio_pendown = ADS7846_PENDOWN_GPIO ,
2006-04-02 20:46:30 +04:00
} ;
static struct spi_board_info nokia770_spi_board_info [ ] __initdata = {
[ 0 ] = {
2006-12-08 00:58:17 +03:00
. modalias = " lcd_mipid " ,
2006-04-02 20:46:30 +04:00
. bus_num = 2 ,
. chip_select = 3 ,
. max_speed_hz = 12000000 ,
2007-03-06 19:20:00 +03:00
. platform_data = & nokia770_mipid_platform_data ,
2006-04-02 20:46:30 +04:00
} ,
[ 1 ] = {
. modalias = " ads7846 " ,
. bus_num = 2 ,
. chip_select = 0 ,
. max_speed_hz = 2500000 ,
. platform_data = & nokia770_ads7846_platform_data ,
} ,
} ;
2011-02-09 23:40:07 +03:00
static void __init hwa742_dev_init ( void )
2009-05-29 01:03:31 +04:00
{
clk_add_alias ( " hwa_sys_ck " , NULL , " bclk " , NULL ) ;
}
2006-04-02 20:46:30 +04:00
/* assume no Mini-AB port */
static struct omap_usb_config nokia770_usb_config __initdata = {
. otg = 1 ,
. register_host = 1 ,
. register_dev = 1 ,
. hmc_mode = 16 ,
. pins [ 0 ] = 6 ,
} ;
2008-12-11 04:37:16 +03:00
# if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
# define NOKIA770_GPIO_MMC_POWER 41
# define NOKIA770_GPIO_MMC_SWITCH 23
static int nokia770_mmc_set_power ( struct device * dev , int slot , int power_on ,
int vdd )
{
2009-04-23 22:10:48 +04:00
gpio_set_value ( NOKIA770_GPIO_MMC_POWER , power_on ) ;
2008-12-11 04:37:16 +03:00
return 0 ;
}
static int nokia770_mmc_get_cover_state ( struct device * dev , int slot )
{
return gpio_get_value ( NOKIA770_GPIO_MMC_SWITCH ) ;
}
static struct omap_mmc_platform_data nokia770_mmc2_data = {
. nr_slots = 1 ,
2009-06-23 14:30:21 +04:00
. max_freq = 12000000 ,
2008-12-11 04:37:16 +03:00
. slots [ 0 ] = {
. set_power = nokia770_mmc_set_power ,
. get_cover_state = nokia770_mmc_get_cover_state ,
2009-06-23 14:30:21 +04:00
. ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34 ,
2008-12-11 04:37:16 +03:00
. name = " mmcblk " ,
2006-04-02 20:46:30 +04:00
} ,
} ;
2008-12-11 04:37:16 +03:00
static struct omap_mmc_platform_data * nokia770_mmc_data [ OMAP16XX_NR_MMC ] ;
static void __init nokia770_mmc_init ( void )
{
int ret ;
ret = gpio_request ( NOKIA770_GPIO_MMC_POWER , " MMC power " ) ;
if ( ret < 0 )
return ;
gpio_direction_output ( NOKIA770_GPIO_MMC_POWER , 0 ) ;
ret = gpio_request ( NOKIA770_GPIO_MMC_SWITCH , " MMC cover " ) ;
if ( ret < 0 ) {
gpio_free ( NOKIA770_GPIO_MMC_POWER ) ;
return ;
}
gpio_direction_input ( NOKIA770_GPIO_MMC_SWITCH ) ;
/* Only the second MMC controller is used */
nokia770_mmc_data [ 1 ] = & nokia770_mmc2_data ;
omap1_init_mmc ( nokia770_mmc_data , OMAP16XX_NR_MMC ) ;
}
# else
static inline void nokia770_mmc_init ( void )
{
}
# endif
2012-12-20 01:41:01 +04:00
# if defined(CONFIG_I2C_CBUS_GPIO) || defined(CONFIG_I2C_CBUS_GPIO_MODULE)
static struct i2c_cbus_platform_data nokia770_cbus_data = {
. clk_gpio = OMAP_MPUIO ( 9 ) ,
. dat_gpio = OMAP_MPUIO ( 10 ) ,
. sel_gpio = OMAP_MPUIO ( 11 ) ,
} ;
static struct platform_device nokia770_cbus_device = {
. name = " i2c-cbus-gpio " ,
. id = 2 ,
. dev = {
. platform_data = & nokia770_cbus_data ,
} ,
} ;
static struct i2c_board_info nokia770_i2c_board_info_2 [ ] __initdata = {
{
I2C_BOARD_INFO ( " retu-mfd " , 0x01 ) ,
} ,
2013-06-16 17:35:12 +04:00
{
I2C_BOARD_INFO ( " tahvo-mfd " , 0x02 ) ,
} ,
2012-12-20 01:41:01 +04:00
} ;
static void __init nokia770_cbus_init ( void )
{
const int retu_irq_gpio = 62 ;
2013-06-16 17:35:12 +04:00
const int tahvo_irq_gpio = 40 ;
2012-12-20 01:41:01 +04:00
if ( gpio_request_one ( retu_irq_gpio , GPIOF_IN , " Retu IRQ " ) )
return ;
2013-06-16 17:35:12 +04:00
if ( gpio_request_one ( tahvo_irq_gpio , GPIOF_IN , " Tahvo IRQ " ) ) {
gpio_free ( retu_irq_gpio ) ;
return ;
}
2012-12-20 01:41:01 +04:00
irq_set_irq_type ( gpio_to_irq ( retu_irq_gpio ) , IRQ_TYPE_EDGE_RISING ) ;
2013-06-16 17:35:12 +04:00
irq_set_irq_type ( gpio_to_irq ( tahvo_irq_gpio ) , IRQ_TYPE_EDGE_RISING ) ;
2012-12-20 01:41:01 +04:00
nokia770_i2c_board_info_2 [ 0 ] . irq = gpio_to_irq ( retu_irq_gpio ) ;
2013-06-16 17:35:12 +04:00
nokia770_i2c_board_info_2 [ 1 ] . irq = gpio_to_irq ( tahvo_irq_gpio ) ;
2012-12-20 01:41:01 +04:00
i2c_register_board_info ( 2 , nokia770_i2c_board_info_2 ,
ARRAY_SIZE ( nokia770_i2c_board_info_2 ) ) ;
platform_device_register ( & nokia770_cbus_device ) ;
}
# else /* CONFIG_I2C_CBUS_GPIO */
static void __init nokia770_cbus_init ( void )
{
}
# endif /* CONFIG_I2C_CBUS_GPIO */
2006-04-02 20:46:30 +04:00
static void __init omap_nokia770_init ( void )
{
2011-10-06 02:14:02 +04:00
/* On Nokia 770, the SleepX signal is masked with an
* MPUIO line by default . It has to be unmasked for it
* to become functional */
/* SleepX mask direction */
omap_writew ( ( omap_readw ( 0xfffb5008 ) & ~ 2 ) , 0xfffb5008 ) ;
/* Unmask SleepX signal */
omap_writew ( ( omap_readw ( 0xfffb5004 ) & ~ 2 ) , 0xfffb5004 ) ;
2006-04-02 20:46:30 +04:00
platform_add_devices ( nokia770_devices , ARRAY_SIZE ( nokia770_devices ) ) ;
2012-03-29 19:41:01 +04:00
nokia770_spi_board_info [ 1 ] . irq = gpio_to_irq ( 15 ) ;
2006-04-02 20:46:30 +04:00
spi_register_board_info ( nokia770_spi_board_info ,
ARRAY_SIZE ( nokia770_spi_board_info ) ) ;
omap_serial_init ( ) ;
2007-11-07 07:54:32 +03:00
omap_register_i2c_bus ( 1 , 100 , NULL , 0 ) ;
2009-05-29 01:03:31 +04:00
hwa742_dev_init ( ) ;
2007-03-06 19:20:00 +03:00
mipid_dev_init ( ) ;
2010-07-05 17:31:30 +04:00
omap1_usb_init ( & nokia770_usb_config ) ;
2008-12-11 04:37:16 +03:00
nokia770_mmc_init ( ) ;
2012-12-20 01:41:01 +04:00
nokia770_cbus_init ( ) ;
2006-04-02 20:46:30 +04:00
}
MACHINE_START ( NOKIA770 , " Nokia 770 " )
2011-07-06 06:38:15 +04:00
. atag_offset = 0x100 ,
2011-10-06 02:14:02 +04:00
. map_io = omap16xx_map_io ,
. init_early = omap1_init_early ,
. init_irq = omap1_init_irq ,
2006-04-02 20:46:30 +04:00
. init_machine = omap_nokia770_init ,
2012-04-26 09:49:29 +04:00
. init_late = omap1_init_late ,
2012-11-08 23:40:59 +04:00
. init_time = omap1_timer_init ,
2011-11-05 21:06:28 +04:00
. restart = omap1_restart ,
2006-04-02 20:46:30 +04:00
MACHINE_END