2005-04-17 02:20:36 +04:00
/*
2009-11-27 14:11:48 +03:00
* Support for Compaq iPAQ H3600 handheld computer
2005-04-17 02:20:36 +04:00
*
2009-11-27 14:11:48 +03:00
* Copyright ( c ) 2000 , 1 Compaq Computer Corporation . ( Author : Jamey Hicks )
* Copyright ( c ) 2009 Dmitry Artamonow < mad_soft @ inbox . ru >
2005-04-17 02:20:36 +04:00
*
2009-11-27 14:11:48 +03:00
* 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 .
2005-04-17 02:20:36 +04:00
*
*/
2009-11-27 14:11:48 +03:00
2005-04-17 02:20:36 +04:00
# include <linux/init.h>
# include <linux/kernel.h>
2009-10-06 17:35:16 +04:00
# include <linux/gpio.h>
2005-04-17 02:20:36 +04:00
2012-01-14 15:50:04 +04:00
# include <video/sa1100fb.h>
2005-04-17 02:20:36 +04:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/irda.h>
2009-11-27 14:09:25 +03:00
# include <mach/h3xxx.h>
2012-02-24 03:06:51 +04:00
# include <mach/irqs.h>
2005-04-17 02:20:36 +04:00
# include "generic.h"
2009-11-27 13:58:35 +03:00
/*
* helper for sa1100fb
*/
static void h3600_lcd_power ( int enable )
{
2009-11-27 14:22:32 +03:00
if ( gpio_request ( H3XXX_EGPIO_LCD_ON , " LCD power " ) ) {
pr_err ( " %s: can't request H3XXX_EGPIO_LCD_ON \n " , __func__ ) ;
2009-11-27 14:02:28 +03:00
goto err1 ;
2009-11-27 14:22:32 +03:00
}
if ( gpio_request ( H3600_EGPIO_LCD_PCI , " LCD control " ) ) {
pr_err ( " %s: can't request H3XXX_EGPIO_LCD_PCI \n " , __func__ ) ;
2009-11-27 14:02:28 +03:00
goto err2 ;
2009-11-27 14:22:32 +03:00
}
if ( gpio_request ( H3600_EGPIO_LCD_5V_ON , " LCD 5v " ) ) {
pr_err ( " %s: can't request H3XXX_EGPIO_LCD_5V_ON \n " , __func__ ) ;
2009-11-27 14:02:28 +03:00
goto err3 ;
2009-11-27 14:22:32 +03:00
}
if ( gpio_request ( H3600_EGPIO_LVDD_ON , " LCD 9v/-6.5v " ) ) {
pr_err ( " %s: can't request H3600_EGPIO_LVDD_ON \n " , __func__ ) ;
2009-11-27 14:02:28 +03:00
goto err4 ;
2009-11-27 14:22:32 +03:00
}
2009-11-27 14:02:28 +03:00
gpio_direction_output ( H3XXX_EGPIO_LCD_ON , enable ) ;
gpio_direction_output ( H3600_EGPIO_LCD_PCI , enable ) ;
gpio_direction_output ( H3600_EGPIO_LCD_5V_ON , enable ) ;
gpio_direction_output ( H3600_EGPIO_LVDD_ON , enable ) ;
gpio_free ( H3600_EGPIO_LVDD_ON ) ;
err4 : gpio_free ( H3600_EGPIO_LCD_5V_ON ) ;
err3 : gpio_free ( H3600_EGPIO_LCD_PCI ) ;
err2 : gpio_free ( H3XXX_EGPIO_LCD_ON ) ;
err1 : return ;
2009-11-27 13:58:35 +03:00
}
2012-01-14 15:50:04 +04:00
static const struct sa1100fb_rgb h3600_rgb_16 = {
. red = { . offset = 12 , . length = 4 , } ,
. green = { . offset = 7 , . length = 4 , } ,
. blue = { . offset = 1 , . length = 4 , } ,
. transp = { . offset = 0 , . length = 0 , } ,
} ;
static struct sa1100fb_mach_info h3600_lcd_info = {
. pixclock = 174757 , . bpp = 16 ,
. xres = 320 , . yres = 240 ,
. hsync_len = 3 , . vsync_len = 3 ,
. left_margin = 12 , . upper_margin = 10 ,
. right_margin = 17 , . lower_margin = 1 ,
. cmap_static = 1 ,
. lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act ,
. lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv ( 2 ) ,
. rgb [ RGB_16 ] = & h3600_rgb_16 ,
2012-01-14 16:03:22 +04:00
. lcd_power = h3600_lcd_power ,
2012-01-14 15:50:04 +04:00
} ;
2005-04-17 02:20:36 +04:00
static void __init h3600_map_io ( void )
{
h3xxx_map_io ( ) ;
}
2009-10-06 17:22:23 +04:00
/*
* This turns the IRDA power on or off on the Compaq H3600
*/
static int h3600_irda_set_power ( struct device * dev , unsigned int state )
{
2009-11-27 14:02:28 +03:00
gpio_set_value ( H3600_EGPIO_IR_ON , state ) ;
2009-10-06 17:22:23 +04:00
return 0 ;
}
static void h3600_irda_set_speed ( struct device * dev , unsigned int speed )
{
2009-11-27 14:02:28 +03:00
gpio_set_value ( H3600_EGPIO_IR_FSEL , ! ( speed < 4000000 ) ) ;
}
static int h3600_irda_startup ( struct device * dev )
{
int err = gpio_request ( H3600_EGPIO_IR_ON , " IrDA power " ) ;
if ( err )
goto err1 ;
err = gpio_direction_output ( H3600_EGPIO_IR_ON , 0 ) ;
if ( err )
goto err2 ;
err = gpio_request ( H3600_EGPIO_IR_FSEL , " IrDA fsel " ) ;
if ( err )
goto err2 ;
err = gpio_direction_output ( H3600_EGPIO_IR_FSEL , 0 ) ;
if ( err )
goto err3 ;
return 0 ;
err3 : gpio_free ( H3600_EGPIO_IR_FSEL ) ;
err2 : gpio_free ( H3600_EGPIO_IR_ON ) ;
err1 : return err ;
}
static void h3600_irda_shutdown ( struct device * dev )
{
gpio_free ( H3600_EGPIO_IR_ON ) ;
gpio_free ( H3600_EGPIO_IR_FSEL ) ;
2009-10-06 17:22:23 +04:00
}
static struct irda_platform_data h3600_irda_data = {
. set_power = h3600_irda_set_power ,
. set_speed = h3600_irda_set_speed ,
2009-11-27 14:02:28 +03:00
. startup = h3600_irda_startup ,
. shutdown = h3600_irda_shutdown ,
2009-10-06 17:22:23 +04:00
} ;
2009-10-06 18:16:27 +04:00
static struct gpio_default_state h3600_default_gpio [ ] = {
{ H3XXX_GPIO_COM_DCD , GPIO_MODE_IN , " COM DCD " } ,
{ H3XXX_GPIO_COM_CTS , GPIO_MODE_IN , " COM CTS " } ,
{ H3XXX_GPIO_COM_RTS , GPIO_MODE_OUT0 , " COM RTS " } ,
} ;
2009-11-27 13:06:46 +03:00
static void __init h3600_mach_init ( void )
2009-10-06 17:19:44 +04:00
{
2009-10-06 18:16:27 +04:00
h3xxx_init_gpio ( h3600_default_gpio , ARRAY_SIZE ( h3600_default_gpio ) ) ;
2009-10-06 17:19:44 +04:00
h3xxx_mach_init ( ) ;
2012-01-14 15:50:04 +04:00
sa11x0_register_lcd ( & h3600_lcd_info ) ;
2009-10-06 17:22:23 +04:00
sa11x0_register_irda ( & h3600_irda_data ) ;
2009-10-06 17:19:44 +04:00
}
2005-04-17 02:20:36 +04:00
MACHINE_START ( H3600 , " Compaq iPAQ H3600 " )
2011-07-06 06:38:17 +04:00
. atag_offset = 0x100 ,
2005-07-03 20:38:58 +04:00
. map_io = h3600_map_io ,
2012-02-24 03:06:51 +04:00
. nr_irqs = SA1100_NR_IRQS ,
2005-07-03 20:38:58 +04:00
. init_irq = sa1100_init_irq ,
2005-04-17 02:20:36 +04:00
. timer = & sa1100_timer ,
2009-10-06 17:19:44 +04:00
. init_machine = h3600_mach_init ,
2012-04-26 17:22:45 +04:00
. init_late = sa11x0_init_late ,
2011-11-05 14:28:50 +04:00
. restart = sa11x0_restart ,
2005-04-17 02:20:36 +04:00
MACHINE_END