2006-04-02 17:46:30 +01: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 .
*/
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/platform_device.h>
# include <linux/input.h>
# include <linux/clk.h>
# include <linux/spi/spi.h>
# include <linux/spi/ads7846.h>
# include <asm/hardware.h>
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
# include <asm/arch/gpio.h>
# include <asm/arch/mux.h>
# include <asm/arch/usb.h>
# include <asm/arch/board.h>
# include <asm/arch/keypad.h>
# include <asm/arch/common.h>
# include <asm/arch/dsp_common.h>
# include <asm/arch/aic23.h>
# include <asm/arch/gpio.h>
static void __init omap_nokia770_init_irq ( void )
{
/* 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 ) ;
omap1_init_common_hw ( ) ;
omap_init_irq ( ) ;
}
static int nokia770_keymap [ ] = {
KEY ( 0 , 1 , GROUP_0 | KEY_UP ) ,
KEY ( 0 , 2 , GROUP_1 | KEY_F5 ) ,
KEY ( 1 , 0 , GROUP_0 | KEY_LEFT ) ,
KEY ( 1 , 1 , GROUP_0 | KEY_ENTER ) ,
KEY ( 1 , 2 , GROUP_0 | KEY_RIGHT ) ,
KEY ( 2 , 0 , GROUP_1 | KEY_ESC ) ,
KEY ( 2 , 1 , GROUP_0 | KEY_DOWN ) ,
KEY ( 2 , 2 , GROUP_1 | KEY_F4 ) ,
KEY ( 3 , 0 , GROUP_2 | KEY_F7 ) ,
KEY ( 3 , 1 , GROUP_2 | KEY_F8 ) ,
KEY ( 3 , 2 , GROUP_2 | KEY_F6 ) ,
0
} ;
static struct resource nokia770_kp_resources [ ] = {
[ 0 ] = {
. start = INT_KEYBOARD ,
. end = INT_KEYBOARD ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct omap_kp_platform_data nokia770_kp_data = {
2006-09-29 01:59:20 -07:00
. rows = 8 ,
. cols = 8 ,
. keymap = nokia770_keymap ,
2006-12-05 19:36:26 +00:00
. keymapsize = ARRAY_SIZE ( nokia770_keymap ) ,
2006-09-29 01:59:20 -07:00
. delay = 4 ,
2006-04-02 17:46:30 +01: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 = {
& nokia770_kp_device ,
} ;
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 ,
} ;
static struct spi_board_info nokia770_spi_board_info [ ] __initdata = {
[ 0 ] = {
. modalias = " lcd_lph8923 " ,
. bus_num = 2 ,
. chip_select = 3 ,
. max_speed_hz = 12000000 ,
} ,
[ 1 ] = {
. modalias = " ads7846 " ,
. bus_num = 2 ,
. chip_select = 0 ,
. max_speed_hz = 2500000 ,
. irq = OMAP_GPIO_IRQ ( 15 ) ,
. platform_data = & nokia770_ads7846_platform_data ,
} ,
} ;
/* 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 ,
} ;
static struct omap_mmc_config nokia770_mmc_config __initdata = {
. mmc [ 0 ] = {
. enabled = 0 ,
. wire4 = 0 ,
. wp_pin = - 1 ,
. power_pin = - 1 ,
. switch_pin = - 1 ,
} ,
. mmc [ 1 ] = {
. enabled = 0 ,
. wire4 = 0 ,
. wp_pin = - 1 ,
. power_pin = - 1 ,
. switch_pin = - 1 ,
} ,
} ;
static struct omap_board_config_kernel nokia770_config [ ] = {
{ OMAP_TAG_USB , NULL } ,
{ OMAP_TAG_MMC , & nokia770_mmc_config } ,
} ;
/*
* audio power control
*/
# define HEADPHONE_GPIO 14
# define AMPLIFIER_CTRL_GPIO 58
static struct clk * dspxor_ck ;
static DECLARE_MUTEX ( audio_pwr_sem ) ;
/*
* audio_pwr_state
* + - - + - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
* | - 1 | down | power - up request - > 0 |
* + - - + - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
* | 0 | up | power - down ( 1 ) request - > 1 |
* | | | power - down ( 2 ) request - > ( ignore ) |
* + - - + - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
* | 1 | up , | power - up request - > 0 |
* | | received down ( 1 ) request | power - down ( 2 ) request - > - 1 |
* + - - + - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*/
static int audio_pwr_state = - 1 ;
/*
* audio_pwr_up / down should be called under audio_pwr_sem
*/
static void nokia770_audio_pwr_up ( void )
{
clk_enable ( dspxor_ck ) ;
/* Turn on codec */
tlv320aic23_power_up ( ) ;
if ( omap_get_gpio_datain ( HEADPHONE_GPIO ) )
/* HP not connected, turn on amplifier */
omap_set_gpio_dataout ( AMPLIFIER_CTRL_GPIO , 1 ) ;
else
/* HP connected, do not turn on amplifier */
printk ( " HP connected \n " ) ;
}
2006-12-05 19:36:26 +00:00
static void codec_delayed_power_down ( struct work_struct * work )
2006-04-02 17:46:30 +01:00
{
down ( & audio_pwr_sem ) ;
if ( audio_pwr_state = = - 1 )
tlv320aic23_power_down ( ) ;
clk_disable ( dspxor_ck ) ;
up ( & audio_pwr_sem ) ;
}
2006-12-05 19:36:26 +00:00
static DECLARE_DELAYED_WORK ( codec_power_down_work , codec_delayed_power_down ) ;
2006-04-02 17:46:30 +01:00
static void nokia770_audio_pwr_down ( void )
{
/* Turn off amplifier */
omap_set_gpio_dataout ( AMPLIFIER_CTRL_GPIO , 0 ) ;
/* Turn off codec: schedule delayed work */
schedule_delayed_work ( & codec_power_down_work , HZ / 20 ) ; /* 50ms */
}
void nokia770_audio_pwr_up_request ( int stage )
{
down ( & audio_pwr_sem ) ;
if ( audio_pwr_state = = - 1 )
nokia770_audio_pwr_up ( ) ;
/* force audio_pwr_state = 0, even if it was 1. */
audio_pwr_state = 0 ;
up ( & audio_pwr_sem ) ;
}
void nokia770_audio_pwr_down_request ( int stage )
{
down ( & audio_pwr_sem ) ;
switch ( stage ) {
case 1 :
if ( audio_pwr_state = = 0 )
audio_pwr_state = 1 ;
break ;
case 2 :
if ( audio_pwr_state = = 1 ) {
nokia770_audio_pwr_down ( ) ;
audio_pwr_state = - 1 ;
}
break ;
}
up ( & audio_pwr_sem ) ;
}
static void __init omap_nokia770_init ( void )
{
nokia770_config [ 0 ] . data = & nokia770_usb_config ;
platform_add_devices ( nokia770_devices , ARRAY_SIZE ( nokia770_devices ) ) ;
spi_register_board_info ( nokia770_spi_board_info ,
ARRAY_SIZE ( nokia770_spi_board_info ) ) ;
omap_board_config = nokia770_config ;
omap_board_config_size = ARRAY_SIZE ( nokia770_config ) ;
omap_serial_init ( ) ;
omap_dsp_audio_pwr_up_request = nokia770_audio_pwr_up_request ;
omap_dsp_audio_pwr_down_request = nokia770_audio_pwr_down_request ;
dspxor_ck = clk_get ( 0 , " dspxor_ck " ) ;
}
static void __init omap_nokia770_map_io ( void )
{
omap1_map_common_io ( ) ;
}
MACHINE_START ( NOKIA770 , " Nokia 770 " )
. phys_io = 0xfff00000 ,
. io_pg_offst = ( ( 0xfef00000 ) > > 18 ) & 0xfffc ,
. boot_params = 0x10000100 ,
. map_io = omap_nokia770_map_io ,
. init_irq = omap_nokia770_init_irq ,
. init_machine = omap_nokia770_init ,
. timer = & omap_timer ,
MACHINE_END