diff options
Diffstat (limited to 'drivers/video/backlight/jornada720_bl.c')
-rw-r--r-- | drivers/video/backlight/jornada720_bl.c | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/drivers/video/backlight/jornada720_bl.c b/drivers/video/backlight/jornada720_bl.c new file mode 100644 index 00000000000000..b35e343116f4ff --- /dev/null +++ b/drivers/video/backlight/jornada720_bl.c @@ -0,0 +1,145 @@ +/* + * drivers/video/backlight/jornada720_bl.c + * + * Backlight Driver for HP Jornada 720 + * + * Copyright (c) 2006 Filip Zyzniewski <filip.zyzniewski@tefnet.pl> + * + * 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/module.h> +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/backlight.h> +#include <linux/fb.h> +#include <linux/device.h> +#include <asm/hardware.h> +#include <asm/arch/jornada720_mcu.h> +#include <video/s1d13xxxfb.h> + +MODULE_AUTHOR("Filip Zyzniewski <filip.zyzniewski@tefnet.pl>"); +MODULE_DESCRIPTION("HP Jornada 720 Backlight Driver"); +MODULE_LICENSE("GPL"); + +/* + * HP Documentation referred in this file: + * http://www.jlime.com/downloads/development/docs/jornada7xx/jornada720.txt + */ + +#define JORNADA720_BL_MAX_BRIGHTNESS 0xff + +/* default brightness (line 460 of HP's doc - it's + * mistakenly referred as default contrast there) */ +#define JORNADA720_BL_DEFAULT_BRIGHTNESS 0x19 + +static struct backlight_device *jornada720_bl_device; + +static int jornada720_bl_get_brightness(struct backlight_device *dev) +{ + int ret; + + /* check if backlight is on (line 461 of HP's doc */ + if(!(PPSR & PPC_LDD1)) + return 255; + + /* get data from the MCU (line 310 of HP's doc) */ + if(jornada720_mcu_start(jornada720_mcu_GetBrightness)) { + printk(KERN_WARNING "jornada720_bl: GetBrightness failed\n"); + ret=256; + } else + ret=jornada720_mcu_read(); + + jornada720_mcu_end(); + + /* 0 is max brightness for the kernel, opposite for the MCU */ + return 255-ret; +} + +static int jornada720_bl_update_status(struct backlight_device *dev) +{ + int ret=0; + + + if (dev->props->power != FB_BLANK_UNBLANK || dev->props->fb_blank != FB_BLANK_UNBLANK) { + /* turn off the backlight PWM (line 313 of HP's doc) */ + ret=jornada720_mcu_start(jornada720_mcu_BrightnessOff); + if(ret) + printk(KERN_WARNING "jornada720_bl: BrightnessOff failed\n"); + /* turn off the backlight (line 461 of HP's doc) */ + PPSR &= ~PPC_LDD1; + PPDR |= PPC_LDD1; + } + else { + /* turn the backlight on (line 461 of HP's doc) */ + PPSR |= PPC_LDD1; + /* line 309 of HP's doc */ + if (!(ret=jornada720_mcu_start(jornada720_mcu_SetBrightness))) { + /* 0 is max brightness for the kernel, opposite for the MCU */ + if(jornada720_mcu_byte(255 - dev->props->brightness) != jornada720_mcu_TxDummy) + ret = -1; + } else + printk(KERN_WARNING "jornada720_bl: SetBrightness failed\n"); + } + + jornada720_mcu_end(); + + return ret; +} + + +static struct backlight_properties jornada720_bl_data = { + .owner = THIS_MODULE, + .max_brightness = JORNADA720_BL_MAX_BRIGHTNESS, + .get_brightness = jornada720_bl_get_brightness, + .update_status = jornada720_bl_update_status, +}; + +static int jornada720_bl_probe(struct device *_dev) +{ + /* + * name must match fb driver name (documentation of + * backlight_device_register() in backlight.c + */ + jornada720_bl_device = backlight_device_register (S1D_DEVICENAME, + NULL, &jornada720_bl_data); + if (IS_ERR (jornada720_bl_device)) + return PTR_ERR (jornada720_bl_device); + + jornada720_bl_data.power = FB_BLANK_UNBLANK; + jornada720_bl_data.brightness = JORNADA720_BL_DEFAULT_BRIGHTNESS; + jornada720_bl_update_status(jornada720_bl_device); + + return 0; + +} + +static int jornada720_bl_remove(struct device *_dev) +{ + backlight_device_unregister(jornada720_bl_device); + return 0; +} + +static struct device_driver jornada720_bl_driver = { + .name = jornada720_mcu_bus_id_bl, + .bus = &jornada720_mcu_bus_type, + .probe = jornada720_bl_probe, + .remove = jornada720_bl_remove, + .owner = THIS_MODULE +}; + +static int __init jornada720_bl_init(void) +{ + return driver_register(&jornada720_bl_driver); +} + +static void __exit jornada720_bl_exit(void) +{ + driver_unregister(&jornada720_bl_driver); +} + +module_init(jornada720_bl_init); +module_exit(jornada720_bl_exit); |