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 .
*/
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
2008-08-05 19:14:15 +04:00
# include <mach/hardware.h>
2006-04-02 20:46:30 +04:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
2009-10-20 20:40:47 +04:00
# include <plat/mux.h>
# include <plat/usb.h>
# include <plat/board.h>
# include <plat/keypad.h>
2011-11-11 01:45:17 +04:00
# include "common.h"
2009-10-20 20:40:47 +04:00
# include <plat/hwa742.h>
# include <plat/lcd_mipid.h>
# include <plat/mmc.h>
# include <plat/clock.h>
2006-04-02 20:46:30 +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-02-09 23:40:07 +03:00
static void __init mipid_dev_init ( void )
2007-03-06 19:20:00 +03:00
{
const struct omap_lcd_config * conf ;
conf = omap_get_config ( OMAP_TAG_LCD , struct omap_lcd_config ) ;
if ( conf ! = NULL ) {
nokia770_mipid_platform_data . nreset_gpio = conf - > nreset_gpio ;
nokia770_mipid_platform_data . data_lines = conf - > data_lines ;
}
}
2011-02-09 23:40:07 +03:00
static void __init ads7846_dev_init ( void )
2007-03-06 19:20:00 +03:00
{
2008-12-11 04:35:30 +03:00
if ( gpio_request ( ADS7846_PENDOWN_GPIO , " ADS7846 pendown " ) < 0 )
2007-03-06 19:20:00 +03:00
printk ( KERN_ERR " can't get ads7846 pen down GPIO \n " ) ;
}
static int ads7846_get_pendown_state ( void )
{
2008-12-11 04:35:25 +03:00
return ! gpio_get_value ( ADS7846_PENDOWN_GPIO ) ;
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 ,
. get_pendown_state = ads7846_get_pendown_state ,
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 ,
. irq = OMAP_GPIO_IRQ ( 15 ) ,
. platform_data = & nokia770_ads7846_platform_data ,
} ,
} ;
2009-05-29 01:03:31 +04:00
static struct hwa742_platform_data nokia770_hwa742_platform_data = {
. te_connected = 1 ,
} ;
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 ) ;
omapfb_set_ctrl_platform_data ( & nokia770_hwa742_platform_data ) ;
}
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 ,
. dma_mask = 0xffffffff ,
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
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 ) ) ;
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
ads7846_dev_init ( ) ;
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 ( ) ;
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 ,
2010-05-23 13:18:16 +04:00
. reserve = omap_reserve ,
2011-10-06 02:14:02 +04:00
. init_irq = omap1_init_irq ,
2006-04-02 20:46:30 +04:00
. init_machine = omap_nokia770_init ,
2011-03-30 02:54:48 +04:00
. timer = & omap1_timer ,
2011-11-05 21:06:28 +04:00
. restart = omap1_restart ,
2006-04-02 20:46:30 +04:00
MACHINE_END