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>
2014-12-24 01:14:14 +03:00
# include <linux/platform_data/irda-sa11x0.h>
2005-04-17 02:20:36 +04:00
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
*/
2013-11-26 14:09:49 +04:00
static struct gpio h3600_lcd_gpio [ ] = {
{ H3XXX_EGPIO_LCD_ON , GPIOF_OUT_INIT_LOW , " LCD power " } ,
{ H3600_EGPIO_LCD_PCI , GPIOF_OUT_INIT_LOW , " LCD control " } ,
{ H3600_EGPIO_LCD_5V_ON , GPIOF_OUT_INIT_LOW , " LCD 5v " } ,
{ H3600_EGPIO_LVDD_ON , GPIOF_OUT_INIT_LOW , " LCD 9v/-6.5v " } ,
} ;
static bool h3600_lcd_request ( void )
{
static bool h3600_lcd_ok ;
int rc ;
if ( h3600_lcd_ok )
return true ;
rc = gpio_request_array ( h3600_lcd_gpio , ARRAY_SIZE ( h3600_lcd_gpio ) ) ;
if ( rc )
pr_err ( " %s: can't request GPIOs \n " , __func__ ) ;
else
h3600_lcd_ok = true ;
return h3600_lcd_ok ;
}
2009-11-27 13:58:35 +03:00
static void h3600_lcd_power ( int enable )
{
2013-11-26 14:09:49 +04:00
if ( ! h3600_lcd_request ( ) )
return ;
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 ) ;
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
*/
2013-11-26 14:10:40 +04:00
static struct gpio h3600_irda_gpio [ ] = {
{ H3600_EGPIO_IR_ON , GPIOF_OUT_INIT_LOW , " IrDA power " } ,
{ H3600_EGPIO_IR_FSEL , GPIOF_OUT_INIT_LOW , " IrDA fsel " } ,
} ;
2009-10-06 17:22:23 +04:00
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 )
{
2013-11-26 14:10:40 +04:00
return gpio_request_array ( h3600_irda_gpio , sizeof ( h3600_irda_gpio ) ) ;
2009-11-27 14:02:28 +03:00
}
static void h3600_irda_shutdown ( struct device * dev )
{
2013-11-26 14:10:40 +04:00
return gpio_free_array ( h3600_irda_gpio , sizeof ( h3600_irda_gpio ) ) ;
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-11-27 13:06:46 +03:00
static void __init h3600_mach_init ( void )
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 ,
2012-11-08 23:40:59 +04:00
. init_time = sa1100_timer_init ,
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