2005-04-17 02:20:36 +04:00
/* linux/arch/arm/mach-s3c2410/mach-h1940.c
*
* Copyright ( c ) 2003 - 2005 Simtec Electronics
* Ben Dooks < ben @ simtec . co . uk >
*
* http : //www.handhelds.org/projects/h1940.html
*
* 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/types.h>
# include <linux/interrupt.h>
# include <linux/list.h>
2010-05-22 22:47:18 +04:00
# include <linux/memblock.h>
2005-04-17 02:20:36 +04:00
# include <linux/timer.h>
# include <linux/init.h>
2007-05-20 14:55:53 +04:00
# include <linux/sysdev.h>
2006-12-18 01:22:26 +03:00
# include <linux/serial_core.h>
2005-10-29 22:07:23 +04:00
# include <linux/platform_device.h>
2008-09-06 15:10:45 +04:00
# include <linux/io.h>
2009-11-17 16:54:56 +03:00
# include <linux/gpio.h>
2011-01-06 22:52:46 +03:00
# include <linux/input.h>
# include <linux/gpio_keys.h>
2009-11-17 16:54:58 +03:00
# include <linux/pwm_backlight.h>
2010-09-27 10:32:49 +04:00
# include <linux/i2c.h>
2011-01-06 22:52:48 +03:00
# include <linux/leds.h>
2011-01-06 22:52:49 +03:00
# include <linux/pda_power.h>
# include <linux/s3c_adc_battery.h>
2011-01-06 22:52:50 +03:00
# include <linux/delay.h>
2011-01-06 22:52:48 +03:00
2009-11-17 16:54:58 +03:00
# include <video/platform_lcd.h>
2009-11-17 16:54:56 +03:00
# include <linux/mmc/host.h>
2005-04-17 02:20:36 +04:00
# include <asm/mach/arch.h>
# include <asm/mach/map.h>
# include <asm/mach/irq.h>
2008-08-05 19:14:15 +04:00
# include <mach/hardware.h>
2005-04-17 02:20:36 +04:00
# include <asm/irq.h>
# include <asm/mach-types.h>
2008-10-08 01:26:09 +04:00
# include <plat/regs-serial.h>
2008-08-05 19:14:15 +04:00
# include <mach/regs-lcd.h>
# include <mach/regs-clock.h>
2005-09-10 00:10:10 +04:00
2009-11-17 16:54:56 +03:00
# include <mach/regs-gpio.h>
# include <mach/gpio-fns.h>
# include <mach/gpio-nrs.h>
2008-08-05 19:14:15 +04:00
# include <mach/h1940.h>
# include <mach/h1940-latch.h>
# include <mach/fb.h>
2008-10-30 13:14:37 +03:00
# include <plat/udc.h>
2008-10-31 19:14:40 +03:00
# include <plat/iic.h>
2005-04-17 02:20:36 +04:00
2010-05-04 09:38:49 +04:00
# include <plat/gpio-cfg.h>
2008-10-08 02:09:51 +04:00
# include <plat/clock.h>
2008-10-08 01:26:09 +04:00
# include <plat/devs.h>
# include <plat/cpu.h>
2008-10-21 17:06:34 +04:00
# include <plat/pll.h>
2008-10-08 01:26:09 +04:00
# include <plat/pm.h>
2009-11-17 16:54:56 +03:00
# include <plat/mci.h>
2010-05-04 15:12:41 +04:00
# include <plat/ts.h>
2005-04-17 02:20:36 +04:00
2010-09-27 10:32:49 +04:00
# include <sound/uda1380.h>
2010-09-08 13:39:46 +04:00
# define H1940_LATCH ((void __force __iomem *)0xF8000000)
# define H1940_PA_LATCH S3C2410_CS2
# define H1940_LATCH_BIT(x) (1 << ((x) + 16 - S3C_GPIO_END))
2005-04-17 02:20:36 +04:00
static struct map_desc h1940_iodesc [ ] __initdata = {
2006-02-11 01:40:51 +03:00
[ 0 ] = {
. virtual = ( unsigned long ) H1940_LATCH ,
. pfn = __phys_to_pfn ( H1940_PA_LATCH ) ,
. length = SZ_16K ,
. type = MT_DEVICE
} ,
2005-04-17 02:20:36 +04:00
} ;
# define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK
# define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
# define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
2006-06-19 02:04:05 +04:00
static struct s3c2410_uartcfg h1940_uartcfgs [ ] __initdata = {
2005-04-17 02:20:36 +04:00
[ 0 ] = {
. hwport = 0 ,
. flags = 0 ,
. ucon = 0x3c5 ,
. ulcon = 0x03 ,
. ufcon = 0x51 ,
} ,
[ 1 ] = {
. hwport = 1 ,
. flags = 0 ,
. ucon = 0x245 ,
. ulcon = 0x03 ,
. ufcon = 0x00 ,
} ,
/* IR port */
[ 2 ] = {
. hwport = 2 ,
. flags = 0 ,
. uart_flags = UPF_CONS_FLOW ,
. ucon = 0x3c5 ,
. ulcon = 0x43 ,
. ufcon = 0x51 ,
}
} ;
2006-02-11 01:40:51 +03:00
/* Board control latch control */
2010-09-27 10:28:00 +04:00
static unsigned int latch_state ;
2006-02-11 01:40:51 +03:00
2010-09-08 13:39:46 +04:00
static void h1940_latch_control ( unsigned int clear , unsigned int set )
2006-02-11 01:40:51 +03:00
{
unsigned long flags ;
local_irq_save ( flags ) ;
latch_state & = ~ clear ;
latch_state | = set ;
__raw_writel ( latch_state , H1940_LATCH ) ;
local_irq_restore ( flags ) ;
}
2010-09-08 13:39:46 +04:00
static inline int h1940_gpiolib_to_latch ( int offset )
{
return 1 < < ( offset + 16 ) ;
}
static void h1940_gpiolib_latch_set ( struct gpio_chip * chip ,
unsigned offset , int value )
{
int latch_bit = h1940_gpiolib_to_latch ( offset ) ;
h1940_latch_control ( value ? 0 : latch_bit ,
value ? latch_bit : 0 ) ;
}
static int h1940_gpiolib_latch_output ( struct gpio_chip * chip ,
unsigned offset , int value )
{
h1940_gpiolib_latch_set ( chip , offset , value ) ;
return 0 ;
}
static int h1940_gpiolib_latch_get ( struct gpio_chip * chip ,
unsigned offset )
{
return ( latch_state > > ( offset + 16 ) ) & 1 ;
}
struct gpio_chip h1940_latch_gpiochip = {
. base = H1940_LATCH_GPIO ( 0 ) ,
. owner = THIS_MODULE ,
. label = " H1940_LATCH " ,
. ngpio = 16 ,
. direction_output = h1940_gpiolib_latch_output ,
. set = h1940_gpiolib_latch_set ,
. get = h1940_gpiolib_latch_get ,
} ;
2005-04-17 02:20:36 +04:00
2007-02-13 02:21:26 +03:00
static struct s3c2410_udc_mach_info h1940_udc_cfg __initdata = {
2009-05-18 01:32:23 +04:00
. vbus_pin = S3C2410_GPG ( 5 ) ,
2007-02-13 02:21:26 +03:00
. vbus_pin_inverted = 1 ,
2011-03-07 10:42:00 +03:00
. pullup_pin = H1940_LATCH_USB_DP ,
2007-02-13 02:21:26 +03:00
} ;
2009-12-23 22:25:05 +03:00
static struct s3c2410_ts_mach_info h1940_ts_cfg __initdata = {
. delay = 10000 ,
. presc = 49 ,
. oversampling_shift = 2 ,
2010-05-18 15:44:27 +04:00
. cfg_gpio = s3c24xx_ts_cfg_gpio ,
2009-12-23 22:25:05 +03:00
} ;
2007-02-13 02:21:26 +03:00
2005-09-10 00:10:10 +04:00
/**
* Set lcd on or off
* */
2007-10-16 12:28:56 +04:00
static struct s3c2410fb_display h1940_lcd __initdata = {
2007-10-16 12:28:58 +04:00
. lcdcon5 = S3C2410_LCDCON5_FRM565 | \
S3C2410_LCDCON5_INVVLINE | \
S3C2410_LCDCON5_HWSWP ,
2007-10-16 12:28:56 +04:00
2007-10-16 12:28:57 +04:00
. type = S3C2410_LCDCON1_TFT ,
2007-10-16 12:28:56 +04:00
. width = 240 ,
. height = 320 ,
2007-10-16 12:29:06 +04:00
. pixclock = 260000 ,
2007-10-16 12:28:56 +04:00
. xres = 240 ,
. yres = 320 ,
. bpp = 16 ,
2010-05-12 15:38:00 +04:00
. left_margin = 8 ,
. right_margin = 20 ,
2007-10-16 12:29:00 +04:00
. hsync_len = 4 ,
2007-10-16 12:28:59 +04:00
. upper_margin = 8 ,
. lower_margin = 7 ,
2007-10-16 12:29:00 +04:00
. vsync_len = 1 ,
2007-10-16 12:28:56 +04:00
} ;
static struct s3c2410fb_mach_info h1940_fb_info __initdata = {
. displays = & h1940_lcd ,
. num_displays = 1 ,
. default_display = 0 ,
2011-01-06 22:52:50 +03:00
. lpcsel = 0x02 ,
. gpccon = 0xaa940659 ,
. gpccon_mask = 0xffffc0f0 ,
. gpcup = 0x0000ffff ,
. gpcup_mask = 0xffffffff ,
. gpdcon = 0xaa84aaa0 ,
. gpdcon_mask = 0xffffffff ,
. gpdup = 0x0000faff ,
. gpdup_mask = 0xffffffff ,
2005-09-10 00:10:10 +04:00
} ;
2005-04-17 02:20:36 +04:00
2011-01-06 22:52:49 +03:00
static int power_supply_init ( struct device * dev )
{
return gpio_request ( S3C2410_GPF ( 2 ) , " cable plugged " ) ;
}
static int h1940_is_ac_online ( void )
{
return ! gpio_get_value ( S3C2410_GPF ( 2 ) ) ;
}
static void power_supply_exit ( struct device * dev )
{
gpio_free ( S3C2410_GPF ( 2 ) ) ;
}
static char * h1940_supplicants [ ] = {
" main-battery " ,
" backup-battery " ,
} ;
static struct pda_power_pdata power_supply_info = {
. init = power_supply_init ,
. is_ac_online = h1940_is_ac_online ,
. exit = power_supply_exit ,
. supplied_to = h1940_supplicants ,
. num_supplicants = ARRAY_SIZE ( h1940_supplicants ) ,
} ;
static struct resource power_supply_resources [ ] = {
[ 0 ] = {
. name = " ac " ,
. flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE |
IORESOURCE_IRQ_HIGHEDGE ,
. start = IRQ_EINT2 ,
. end = IRQ_EINT2 ,
} ,
} ;
static struct platform_device power_supply = {
. name = " pda-power " ,
. id = - 1 ,
. dev = {
. platform_data =
& power_supply_info ,
} ,
. resource = power_supply_resources ,
. num_resources = ARRAY_SIZE ( power_supply_resources ) ,
} ;
static const struct s3c_adc_bat_thresh bat_lut_noac [ ] = {
{ . volt = 4070 , . cur = 162 , . level = 100 } ,
{ . volt = 4040 , . cur = 165 , . level = 95 } ,
{ . volt = 4016 , . cur = 164 , . level = 90 } ,
{ . volt = 3996 , . cur = 166 , . level = 85 } ,
{ . volt = 3971 , . cur = 168 , . level = 80 } ,
{ . volt = 3951 , . cur = 168 , . level = 75 } ,
{ . volt = 3931 , . cur = 170 , . level = 70 } ,
{ . volt = 3903 , . cur = 172 , . level = 65 } ,
{ . volt = 3886 , . cur = 172 , . level = 60 } ,
{ . volt = 3858 , . cur = 176 , . level = 55 } ,
{ . volt = 3842 , . cur = 176 , . level = 50 } ,
{ . volt = 3818 , . cur = 176 , . level = 45 } ,
{ . volt = 3789 , . cur = 180 , . level = 40 } ,
{ . volt = 3769 , . cur = 180 , . level = 35 } ,
{ . volt = 3749 , . cur = 184 , . level = 30 } ,
{ . volt = 3732 , . cur = 184 , . level = 25 } ,
{ . volt = 3716 , . cur = 184 , . level = 20 } ,
{ . volt = 3708 , . cur = 184 , . level = 15 } ,
{ . volt = 3716 , . cur = 96 , . level = 10 } ,
{ . volt = 3700 , . cur = 96 , . level = 5 } ,
{ . volt = 3684 , . cur = 96 , . level = 0 } ,
} ;
static const struct s3c_adc_bat_thresh bat_lut_acin [ ] = {
{ . volt = 4130 , . cur = 0 , . level = 100 } ,
{ . volt = 3982 , . cur = 0 , . level = 50 } ,
{ . volt = 3854 , . cur = 0 , . level = 10 } ,
{ . volt = 3841 , . cur = 0 , . level = 0 } ,
} ;
int h1940_bat_init ( void )
{
int ret ;
ret = gpio_request ( H1940_LATCH_SM803_ENABLE , " h1940-charger-enable " ) ;
if ( ret )
return ret ;
gpio_direction_output ( H1940_LATCH_SM803_ENABLE , 0 ) ;
return 0 ;
}
void h1940_bat_exit ( void )
{
gpio_free ( H1940_LATCH_SM803_ENABLE ) ;
}
void h1940_enable_charger ( void )
{
gpio_set_value ( H1940_LATCH_SM803_ENABLE , 1 ) ;
}
void h1940_disable_charger ( void )
{
gpio_set_value ( H1940_LATCH_SM803_ENABLE , 0 ) ;
}
static struct s3c_adc_bat_pdata h1940_bat_cfg = {
. init = h1940_bat_init ,
. exit = h1940_bat_exit ,
. enable_charger = h1940_enable_charger ,
. disable_charger = h1940_disable_charger ,
. gpio_charge_finished = S3C2410_GPF ( 3 ) ,
. gpio_inverted = 1 ,
. lut_noac = bat_lut_noac ,
. lut_noac_cnt = ARRAY_SIZE ( bat_lut_noac ) ,
. lut_acin = bat_lut_acin ,
. lut_acin_cnt = ARRAY_SIZE ( bat_lut_acin ) ,
. volt_channel = 0 ,
. current_channel = 1 ,
. volt_mult = 4056 ,
. current_mult = 1893 ,
. internal_impedance = 200 ,
. backup_volt_channel = 3 ,
/* TODO Check backup volt multiplier */
. backup_volt_mult = 4056 ,
. backup_volt_min = 0 ,
. backup_volt_max = 4149288
} ;
static struct platform_device h1940_battery = {
. name = " s3c-adc-battery " ,
. id = - 1 ,
. dev = {
. parent = & s3c_device_adc . dev ,
. platform_data = & h1940_bat_cfg ,
} ,
} ;
2011-01-06 22:52:48 +03:00
DEFINE_SPINLOCK ( h1940_blink_spin ) ;
int h1940_led_blink_set ( unsigned gpio , int state ,
unsigned long * delay_on , unsigned long * delay_off )
{
int blink_gpio , check_gpio1 , check_gpio2 ;
switch ( gpio ) {
case H1940_LATCH_LED_GREEN :
blink_gpio = S3C2410_GPA ( 7 ) ;
check_gpio1 = S3C2410_GPA ( 1 ) ;
check_gpio2 = S3C2410_GPA ( 3 ) ;
break ;
case H1940_LATCH_LED_RED :
blink_gpio = S3C2410_GPA ( 1 ) ;
check_gpio1 = S3C2410_GPA ( 7 ) ;
check_gpio2 = S3C2410_GPA ( 3 ) ;
break ;
default :
blink_gpio = S3C2410_GPA ( 3 ) ;
check_gpio1 = S3C2410_GPA ( 1 ) ;
check_gpio1 = S3C2410_GPA ( 7 ) ;
break ;
}
if ( delay_on & & delay_off & & ! * delay_on & & ! * delay_off )
* delay_on = * delay_off = 500 ;
spin_lock ( & h1940_blink_spin ) ;
switch ( state ) {
case GPIO_LED_NO_BLINK_LOW :
case GPIO_LED_NO_BLINK_HIGH :
if ( ! gpio_get_value ( check_gpio1 ) & &
! gpio_get_value ( check_gpio2 ) )
gpio_set_value ( H1940_LATCH_LED_FLASH , 0 ) ;
gpio_set_value ( blink_gpio , 0 ) ;
if ( gpio_is_valid ( gpio ) )
gpio_set_value ( gpio , state ) ;
break ;
case GPIO_LED_BLINK :
if ( gpio_is_valid ( gpio ) )
gpio_set_value ( gpio , 0 ) ;
gpio_set_value ( H1940_LATCH_LED_FLASH , 1 ) ;
gpio_set_value ( blink_gpio , 1 ) ;
break ;
}
spin_unlock ( & h1940_blink_spin ) ;
return 0 ;
}
EXPORT_SYMBOL ( h1940_led_blink_set ) ;
static struct gpio_led h1940_leds_desc [ ] = {
{
. name = " Green " ,
2011-03-17 21:04:57 +03:00
. default_trigger = " main-battery-full " ,
2011-01-06 22:52:48 +03:00
. gpio = H1940_LATCH_LED_GREEN ,
. retain_state_suspended = 1 ,
} ,
{
. name = " Red " ,
2011-03-17 21:04:57 +03:00
. default_trigger
= " main-battery-charging-blink-full-solid " ,
2011-01-06 22:52:48 +03:00
. gpio = H1940_LATCH_LED_RED ,
. retain_state_suspended = 1 ,
} ,
} ;
static struct gpio_led_platform_data h1940_leds_pdata = {
. num_leds = ARRAY_SIZE ( h1940_leds_desc ) ,
. leds = h1940_leds_desc ,
. gpio_blink_set = h1940_led_blink_set ,
} ;
2009-09-28 07:45:47 +04:00
static struct platform_device h1940_device_leds = {
2011-01-06 22:52:48 +03:00
. name = " leds-gpio " ,
. id = - 1 ,
. dev = {
. platform_data = & h1940_leds_pdata ,
} ,
2007-02-13 02:50:34 +03:00
} ;
2009-09-28 07:45:47 +04:00
static struct platform_device h1940_device_bluetooth = {
2007-05-10 00:41:03 +04:00
. name = " h1940-bt " ,
. id = - 1 ,
} ;
2010-09-27 01:27:41 +04:00
static void h1940_set_mmc_power ( unsigned char power_mode , unsigned short vdd )
{
switch ( power_mode ) {
case MMC_POWER_OFF :
gpio_set_value ( H1940_LATCH_SD_POWER , 0 ) ;
break ;
case MMC_POWER_UP :
case MMC_POWER_ON :
gpio_set_value ( H1940_LATCH_SD_POWER , 1 ) ;
break ;
default :
break ;
} ;
}
2010-01-18 10:24:22 +03:00
static struct s3c24xx_mci_pdata h1940_mmc_cfg __initdata = {
2009-11-17 16:54:56 +03:00
. gpio_detect = S3C2410_GPF ( 5 ) ,
. gpio_wprotect = S3C2410_GPH ( 8 ) ,
2010-09-27 01:27:41 +04:00
. set_power = h1940_set_mmc_power ,
2009-11-17 16:54:56 +03:00
. ocr_avail = MMC_VDD_32_33 ,
} ;
2009-11-17 16:54:58 +03:00
static int h1940_backlight_init ( struct device * dev )
{
gpio_request ( S3C2410_GPB ( 0 ) , " Backlight " ) ;
2010-05-04 06:40:51 +04:00
gpio_direction_output ( S3C2410_GPB ( 0 ) , 0 ) ;
2010-05-06 06:03:50 +04:00
s3c_gpio_setpull ( S3C2410_GPB ( 0 ) , S3C_GPIO_PULL_NONE ) ;
2010-05-04 09:38:49 +04:00
s3c_gpio_cfgpin ( S3C2410_GPB ( 0 ) , S3C2410_GPB0_TOUT0 ) ;
2010-09-27 10:28:00 +04:00
gpio_set_value ( H1940_LATCH_MAX1698_nSHUTDOWN , 1 ) ;
2009-11-17 16:54:58 +03:00
return 0 ;
}
2010-09-27 10:28:00 +04:00
static int h1940_backlight_notify ( struct device * dev , int brightness )
{
if ( ! brightness ) {
gpio_direction_output ( S3C2410_GPB ( 0 ) , 1 ) ;
gpio_set_value ( H1940_LATCH_MAX1698_nSHUTDOWN , 0 ) ;
} else {
gpio_direction_output ( S3C2410_GPB ( 0 ) , 0 ) ;
s3c_gpio_setpull ( S3C2410_GPB ( 0 ) , S3C_GPIO_PULL_NONE ) ;
s3c_gpio_cfgpin ( S3C2410_GPB ( 0 ) , S3C2410_GPB0_TOUT0 ) ;
gpio_set_value ( H1940_LATCH_MAX1698_nSHUTDOWN , 1 ) ;
}
return brightness ;
}
2009-11-17 16:54:58 +03:00
static void h1940_backlight_exit ( struct device * dev )
{
2010-05-04 06:40:51 +04:00
gpio_direction_output ( S3C2410_GPB ( 0 ) , 1 ) ;
2010-09-27 10:28:00 +04:00
gpio_set_value ( H1940_LATCH_MAX1698_nSHUTDOWN , 0 ) ;
2009-11-17 16:54:58 +03:00
}
2010-09-27 10:28:00 +04:00
2009-11-17 16:54:58 +03:00
static struct platform_pwm_backlight_data backlight_data = {
. pwm_id = 0 ,
. max_brightness = 100 ,
. dft_brightness = 50 ,
/* tcnt = 0x31 */
. pwm_period_ns = 36296 ,
. init = h1940_backlight_init ,
2010-09-27 10:28:00 +04:00
. notify = h1940_backlight_notify ,
2009-11-17 16:54:58 +03:00
. exit = h1940_backlight_exit ,
} ;
static struct platform_device h1940_backlight = {
. name = " pwm-backlight " ,
. dev = {
. parent = & s3c_device_timer [ 0 ] . dev ,
. platform_data = & backlight_data ,
} ,
. id = - 1 ,
} ;
static void h1940_lcd_power_set ( struct plat_lcd_data * pd ,
unsigned int power )
{
2011-01-06 22:52:50 +03:00
int value , retries = 100 ;
2009-11-17 16:54:58 +03:00
if ( ! power ) {
2010-09-27 10:28:00 +04:00
gpio_set_value ( S3C2410_GPC ( 0 ) , 0 ) ;
2009-11-17 16:54:58 +03:00
/* wait for 3ac */
do {
2010-05-04 06:40:51 +04:00
value = gpio_get_value ( S3C2410_GPC ( 6 ) ) ;
2011-01-06 22:52:50 +03:00
} while ( value & & retries - - ) ;
2010-09-27 10:28:00 +04:00
gpio_set_value ( H1940_LATCH_LCD_P2 , 0 ) ;
gpio_set_value ( H1940_LATCH_LCD_P3 , 0 ) ;
gpio_set_value ( H1940_LATCH_LCD_P4 , 0 ) ;
gpio_direction_output ( S3C2410_GPC ( 1 ) , 0 ) ;
gpio_direction_output ( S3C2410_GPC ( 4 ) , 0 ) ;
gpio_set_value ( H1940_LATCH_LCD_P1 , 0 ) ;
gpio_set_value ( H1940_LATCH_LCD_P0 , 0 ) ;
gpio_set_value ( S3C2410_GPC ( 5 ) , 0 ) ;
2009-11-17 16:54:58 +03:00
} else {
2010-09-27 10:28:00 +04:00
gpio_set_value ( H1940_LATCH_LCD_P0 , 1 ) ;
gpio_set_value ( H1940_LATCH_LCD_P1 , 1 ) ;
2011-01-06 22:52:50 +03:00
gpio_direction_input ( S3C2410_GPC ( 1 ) ) ;
gpio_direction_input ( S3C2410_GPC ( 4 ) ) ;
mdelay ( 10 ) ;
2010-09-27 10:28:00 +04:00
s3c_gpio_cfgpin ( S3C2410_GPC ( 1 ) , S3C_GPIO_SFN ( 2 ) ) ;
s3c_gpio_cfgpin ( S3C2410_GPC ( 4 ) , S3C_GPIO_SFN ( 2 ) ) ;
gpio_set_value ( S3C2410_GPC ( 5 ) , 1 ) ;
gpio_set_value ( S3C2410_GPC ( 0 ) , 1 ) ;
gpio_set_value ( H1940_LATCH_LCD_P3 , 1 ) ;
gpio_set_value ( H1940_LATCH_LCD_P2 , 1 ) ;
gpio_set_value ( H1940_LATCH_LCD_P4 , 1 ) ;
2009-11-17 16:54:58 +03:00
}
}
static struct plat_lcd_data h1940_lcd_power_data = {
. set_power = h1940_lcd_power_set ,
} ;
static struct platform_device h1940_lcd_powerdev = {
. name = " platform-lcd " ,
. dev . parent = & s3c_device_lcd . dev ,
. dev . platform_data = & h1940_lcd_power_data ,
} ;
2010-09-27 10:32:49 +04:00
static struct uda1380_platform_data uda1380_info = {
. gpio_power = H1940_LATCH_UDA_POWER ,
. gpio_reset = S3C2410_GPA ( 12 ) ,
. dac_clk = UDA1380_DAC_CLK_SYSCLK ,
} ;
static struct i2c_board_info h1940_i2c_devices [ ] = {
{
I2C_BOARD_INFO ( " uda1380 " , 0x1a ) ,
. platform_data = & uda1380_info ,
} ,
} ;
2011-01-06 22:52:46 +03:00
# define DECLARE_BUTTON(p, k, n, w) \
{ \
. gpio = p , \
. code = k , \
. desc = n , \
. wakeup = w , \
. active_low = 1 , \
}
static struct gpio_keys_button h1940_buttons [ ] = {
DECLARE_BUTTON ( S3C2410_GPF ( 0 ) , KEY_POWER , " Power " , 1 ) ,
DECLARE_BUTTON ( S3C2410_GPF ( 6 ) , KEY_ENTER , " Select " , 1 ) ,
DECLARE_BUTTON ( S3C2410_GPF ( 7 ) , KEY_RECORD , " Record " , 0 ) ,
DECLARE_BUTTON ( S3C2410_GPG ( 0 ) , KEY_F11 , " Calendar " , 0 ) ,
DECLARE_BUTTON ( S3C2410_GPG ( 2 ) , KEY_F12 , " Contacts " , 0 ) ,
DECLARE_BUTTON ( S3C2410_GPG ( 3 ) , KEY_MAIL , " Mail " , 0 ) ,
DECLARE_BUTTON ( S3C2410_GPG ( 6 ) , KEY_LEFT , " Left_arrow " , 0 ) ,
DECLARE_BUTTON ( S3C2410_GPG ( 7 ) , KEY_HOMEPAGE , " Home " , 0 ) ,
DECLARE_BUTTON ( S3C2410_GPG ( 8 ) , KEY_RIGHT , " Right_arrow " , 0 ) ,
DECLARE_BUTTON ( S3C2410_GPG ( 9 ) , KEY_UP , " Up_arrow " , 0 ) ,
DECLARE_BUTTON ( S3C2410_GPG ( 10 ) , KEY_DOWN , " Down_arrow " , 0 ) ,
} ;
static struct gpio_keys_platform_data h1940_buttons_data = {
. buttons = h1940_buttons ,
. nbuttons = ARRAY_SIZE ( h1940_buttons ) ,
} ;
static struct platform_device h1940_dev_buttons = {
. name = " gpio-keys " ,
. id = - 1 ,
. dev = {
. platform_data = & h1940_buttons_data ,
}
} ;
2005-04-17 02:20:36 +04:00
static struct platform_device * h1940_devices [ ] __initdata = {
2011-01-06 22:52:46 +03:00
& h1940_dev_buttons ,
2009-11-23 03:13:39 +03:00
& s3c_device_ohci ,
2005-04-17 02:20:36 +04:00
& s3c_device_lcd ,
& s3c_device_wdt ,
2008-10-31 19:14:40 +03:00
& s3c_device_i2c0 ,
2005-04-17 02:20:36 +04:00
& s3c_device_iis ,
2010-11-22 09:35:53 +03:00
& samsung_asoc_dma ,
2007-02-13 02:21:26 +03:00
& s3c_device_usbgadget ,
2009-09-28 07:45:47 +04:00
& h1940_device_leds ,
& h1940_device_bluetooth ,
2009-11-17 16:54:56 +03:00
& s3c_device_sdi ,
2009-11-17 16:54:57 +03:00
& s3c_device_rtc ,
2009-11-17 16:54:58 +03:00
& s3c_device_timer [ 0 ] ,
& h1940_backlight ,
& h1940_lcd_powerdev ,
2010-04-22 12:47:43 +04:00
& s3c_device_adc ,
& s3c_device_ts ,
2011-01-06 22:52:49 +03:00
& power_supply ,
& h1940_battery ,
2005-04-17 02:20:36 +04:00
} ;
2005-09-20 20:24:33 +04:00
static void __init h1940_map_io ( void )
2005-04-17 02:20:36 +04:00
{
s3c24xx_init_io ( h1940_iodesc , ARRAY_SIZE ( h1940_iodesc ) ) ;
s3c24xx_init_clocks ( 0 ) ;
s3c24xx_init_uarts ( h1940_uartcfgs , ARRAY_SIZE ( h1940_uartcfgs ) ) ;
2006-12-06 03:50:24 +03:00
/* setup PM */
2007-03-19 17:10:20 +03:00
# ifdef CONFIG_PM_H1940
2006-12-06 03:50:24 +03:00
memcpy ( phys_to_virt ( H1940_SUSPEND_RESUMEAT ) , h1940_pm_return , 1024 ) ;
2007-03-19 17:10:20 +03:00
# endif
2008-12-12 03:24:18 +03:00
s3c_pm_init ( ) ;
2010-09-08 13:39:46 +04:00
2010-09-27 10:28:00 +04:00
/* Add latch gpio chip, set latch initial value */
h1940_latch_control ( 0 , 0 ) ;
2010-09-08 13:39:46 +04:00
WARN_ON ( gpiochip_add ( & h1940_latch_gpiochip ) ) ;
2005-04-17 02:20:36 +04:00
}
2010-05-22 21:18:57 +04:00
/* H1940 and RX3715 need to reserve this for suspend */
static void __init h1940_reserve ( void )
{
2010-05-22 22:47:18 +04:00
memblock_reserve ( 0x30003000 , 0x1000 ) ;
memblock_reserve ( 0x30081000 , 0x1000 ) ;
2010-05-22 21:18:57 +04:00
}
2005-09-20 20:24:33 +04:00
static void __init h1940_init_irq ( void )
2005-04-17 02:20:36 +04:00
{
s3c24xx_init_irq ( ) ;
}
2005-09-20 20:24:33 +04:00
static void __init h1940_init ( void )
2005-09-10 00:10:10 +04:00
{
2007-02-13 02:21:26 +03:00
u32 tmp ;
2007-10-16 12:28:56 +04:00
s3c24xx_fb_set_platdata ( & h1940_fb_info ) ;
2010-01-18 10:24:22 +03:00
s3c24xx_mci_set_platdata ( & h1940_mmc_cfg ) ;
2007-02-13 02:21:26 +03:00
s3c24xx_udc_set_platdata ( & h1940_udc_cfg ) ;
2009-12-23 22:25:05 +03:00
s3c24xx_ts_set_platdata ( & h1940_ts_cfg ) ;
2008-10-31 19:14:40 +03:00
s3c_i2c0_set_platdata ( NULL ) ;
2007-02-13 02:21:26 +03:00
/* Turn off suspend on both USB ports, and switch the
* selectable USB port to USB device mode . */
s3c2410_modify_misccr ( S3C2410_MISCCR_USBHOST |
S3C2410_MISCCR_USBSUSPND0 |
S3C2410_MISCCR_USBSUSPND1 , 0x0 ) ;
2008-10-21 17:06:34 +04:00
tmp = ( 0x78 < < S3C24XX_PLLCON_MDIVSHIFT )
| ( 0x02 < < S3C24XX_PLLCON_PDIVSHIFT )
| ( 0x03 < < S3C24XX_PLLCON_SDIVSHIFT ) ;
2007-02-13 02:21:26 +03:00
writel ( tmp , S3C2410_UPLLCON ) ;
2007-04-20 14:19:16 +04:00
2009-11-17 16:54:58 +03:00
gpio_request ( S3C2410_GPC ( 0 ) , " LCD power " ) ;
2010-09-27 10:28:00 +04:00
gpio_request ( S3C2410_GPC ( 1 ) , " LCD power " ) ;
gpio_request ( S3C2410_GPC ( 4 ) , " LCD power " ) ;
2009-11-17 16:54:58 +03:00
gpio_request ( S3C2410_GPC ( 5 ) , " LCD power " ) ;
gpio_request ( S3C2410_GPC ( 6 ) , " LCD power " ) ;
2010-09-27 10:28:00 +04:00
gpio_request ( H1940_LATCH_LCD_P0 , " LCD power " ) ;
gpio_request ( H1940_LATCH_LCD_P1 , " LCD power " ) ;
gpio_request ( H1940_LATCH_LCD_P2 , " LCD power " ) ;
gpio_request ( H1940_LATCH_LCD_P3 , " LCD power " ) ;
gpio_request ( H1940_LATCH_LCD_P4 , " LCD power " ) ;
gpio_request ( H1940_LATCH_MAX1698_nSHUTDOWN , " LCD power " ) ;
gpio_direction_output ( S3C2410_GPC ( 0 ) , 0 ) ;
gpio_direction_output ( S3C2410_GPC ( 1 ) , 0 ) ;
gpio_direction_output ( S3C2410_GPC ( 4 ) , 0 ) ;
gpio_direction_output ( S3C2410_GPC ( 5 ) , 0 ) ;
2010-05-04 06:40:51 +04:00
gpio_direction_input ( S3C2410_GPC ( 6 ) ) ;
2010-09-27 10:28:00 +04:00
gpio_direction_output ( H1940_LATCH_LCD_P0 , 0 ) ;
gpio_direction_output ( H1940_LATCH_LCD_P1 , 0 ) ;
gpio_direction_output ( H1940_LATCH_LCD_P2 , 0 ) ;
gpio_direction_output ( H1940_LATCH_LCD_P3 , 0 ) ;
gpio_direction_output ( H1940_LATCH_LCD_P4 , 0 ) ;
gpio_direction_output ( H1940_LATCH_MAX1698_nSHUTDOWN , 0 ) ;
2009-11-17 16:54:58 +03:00
2010-09-27 01:27:41 +04:00
gpio_request ( H1940_LATCH_SD_POWER , " SD power " ) ;
gpio_direction_output ( H1940_LATCH_SD_POWER , 0 ) ;
2009-11-17 16:54:58 +03:00
2007-04-20 14:19:16 +04:00
platform_add_devices ( h1940_devices , ARRAY_SIZE ( h1940_devices ) ) ;
2010-09-27 10:32:49 +04:00
2011-01-06 22:52:48 +03:00
gpio_request ( S3C2410_GPA ( 1 ) , " Red LED blink " ) ;
gpio_request ( S3C2410_GPA ( 3 ) , " Blue LED blink " ) ;
gpio_request ( S3C2410_GPA ( 7 ) , " Green LED blink " ) ;
gpio_request ( H1940_LATCH_LED_FLASH , " LED blink " ) ;
gpio_direction_output ( S3C2410_GPA ( 1 ) , 0 ) ;
gpio_direction_output ( S3C2410_GPA ( 3 ) , 0 ) ;
gpio_direction_output ( S3C2410_GPA ( 7 ) , 0 ) ;
gpio_direction_output ( H1940_LATCH_LED_FLASH , 0 ) ;
2010-09-27 10:32:49 +04:00
i2c_register_board_info ( 0 , h1940_i2c_devices ,
ARRAY_SIZE ( h1940_i2c_devices ) ) ;
2005-09-10 00:10:10 +04:00
}
2005-04-17 02:20:36 +04:00
MACHINE_START ( H1940 , " IPAQ-H1940 " )
2010-05-07 04:24:05 +04:00
/* Maintainer: Ben Dooks <ben-linux@fluff.org> */
2005-07-03 20:38:58 +04:00
. boot_params = S3C2410_SDRAM_PA + 0x100 ,
. map_io = h1940_map_io ,
2010-05-22 21:18:57 +04:00
. reserve = h1940_reserve ,
2005-07-03 20:38:58 +04:00
. init_irq = h1940_init_irq ,
2007-02-13 02:21:26 +03:00
. init_machine = h1940_init ,
2005-04-17 02:20:36 +04:00
. timer = & s3c24xx_timer ,
MACHINE_END