2009-02-18 14:47:26 +03:00
/*
*
* LCD driver for HP Jornada 700 series ( 710 / 720 / 728 )
* Copyright ( C ) 2006 - 2009 Kristoffer Ericson < kristoffer . ericson @ gmail . com >
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License version
* 2 or any later version as published by the Free Software Foundation .
*
*/
# include <linux/device.h>
# include <linux/fb.h>
# include <linux/kernel.h>
# include <linux/lcd.h>
# include <linux/module.h>
# include <linux/platform_device.h>
# include <linux/delay.h>
# include <mach/jornada720.h>
# include <mach/hardware.h>
# include <video/s1d13xxxfb.h>
# define LCD_MAX_CONTRAST 0xff
# define LCD_DEF_CONTRAST 0x80
2013-04-30 03:17:31 +04:00
static int jornada_lcd_get_power ( struct lcd_device * ld )
2009-02-18 14:47:26 +03:00
{
2014-08-27 05:14:43 +04:00
return PPSR & PPC_LDD2 ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN ;
2009-02-18 14:47:26 +03:00
}
2013-04-30 03:17:31 +04:00
static int jornada_lcd_get_contrast ( struct lcd_device * ld )
2009-02-18 14:47:26 +03:00
{
int ret ;
2013-04-30 03:17:31 +04:00
if ( jornada_lcd_get_power ( ld ) ! = FB_BLANK_UNBLANK )
2009-02-18 14:47:26 +03:00
return 0 ;
jornada_ssp_start ( ) ;
2014-07-10 12:07:06 +04:00
if ( jornada_ssp_byte ( GETCONTRAST ) = = TXDUMMY ) {
2009-02-18 14:47:26 +03:00
ret = jornada_ssp_byte ( TXDUMMY ) ;
2014-07-10 12:07:06 +04:00
goto success ;
2009-02-18 14:47:26 +03:00
}
2014-07-10 12:07:06 +04:00
dev_err ( & ld - > dev , " failed to set contrast \n " ) ;
ret = - ETIMEDOUT ;
success :
jornada_ssp_end ( ) ;
return ret ;
2009-02-18 14:47:26 +03:00
}
2013-04-30 03:17:31 +04:00
static int jornada_lcd_set_contrast ( struct lcd_device * ld , int value )
2009-02-18 14:47:26 +03:00
{
2014-07-10 12:07:06 +04:00
int ret = 0 ;
2009-02-18 14:47:26 +03:00
jornada_ssp_start ( ) ;
/* start by sending our set contrast cmd to mcu */
2014-07-10 12:07:06 +04:00
if ( jornada_ssp_byte ( SETCONTRAST ) = = TXDUMMY ) {
/* if successful push the new value */
if ( jornada_ssp_byte ( value ) = = TXDUMMY )
goto success ;
2009-02-18 14:47:26 +03:00
}
2014-07-10 12:07:06 +04:00
dev_err ( & ld - > dev , " failed to set contrast \n " ) ;
ret = - ETIMEDOUT ;
2009-02-18 14:47:26 +03:00
2014-07-10 12:07:06 +04:00
success :
jornada_ssp_end ( ) ;
return ret ;
2009-02-18 14:47:26 +03:00
}
2013-04-30 03:17:31 +04:00
static int jornada_lcd_set_power ( struct lcd_device * ld , int power )
2009-02-18 14:47:26 +03:00
{
if ( power ! = FB_BLANK_UNBLANK ) {
PPSR & = ~ PPC_LDD2 ;
PPDR | = PPC_LDD2 ;
2013-04-30 03:17:31 +04:00
} else {
2009-02-18 14:47:26 +03:00
PPSR | = PPC_LDD2 ;
2013-04-30 03:17:31 +04:00
}
2009-02-18 14:47:26 +03:00
return 0 ;
}
static struct lcd_ops jornada_lcd_props = {
. get_contrast = jornada_lcd_get_contrast ,
. set_contrast = jornada_lcd_set_contrast ,
. get_power = jornada_lcd_get_power ,
. set_power = jornada_lcd_set_power ,
} ;
static int jornada_lcd_probe ( struct platform_device * pdev )
{
struct lcd_device * lcd_device ;
int ret ;
2014-01-24 03:54:29 +04:00
lcd_device = devm_lcd_device_register ( & pdev - > dev , S1D_DEVICENAME ,
& pdev - > dev , NULL , & jornada_lcd_props ) ;
2009-02-18 14:47:26 +03:00
if ( IS_ERR ( lcd_device ) ) {
ret = PTR_ERR ( lcd_device ) ;
2013-04-30 03:17:31 +04:00
dev_err ( & pdev - > dev , " failed to register device \n " ) ;
2009-02-18 14:47:26 +03:00
return ret ;
}
platform_set_drvdata ( pdev , lcd_device ) ;
/* lets set our default values */
jornada_lcd_set_contrast ( lcd_device , LCD_DEF_CONTRAST ) ;
jornada_lcd_set_power ( lcd_device , FB_BLANK_UNBLANK ) ;
/* give it some time to startup */
msleep ( 100 ) ;
return 0 ;
}
static struct platform_driver jornada_lcd_driver = {
. probe = jornada_lcd_probe ,
. driver = {
. name = " jornada_lcd " ,
} ,
} ;
2012-01-11 03:09:11 +04:00
module_platform_driver ( jornada_lcd_driver ) ;
2009-02-18 14:47:26 +03:00
MODULE_AUTHOR ( " Kristoffer Ericson <kristoffer.ericson@gmail.com> " ) ;
MODULE_DESCRIPTION ( " HP Jornada 710/720/728 LCD driver " ) ;
MODULE_LICENSE ( " GPL " ) ;