brintos

brintos / linux-shallow public Read only

0
0
Text · 3.9 KiB · ddb7ab4 Raw
170 lines · c
1/*2 *  Backlight Driver for HP Jornada 6803 *4 *  Copyright (c) 2005 Andriy Skulysh5 *6 *  Based on Sharp's Corgi Backlight Driver7 *8 * This file is subject to the terms and conditions of the GNU General Public9 * License.  See the file "COPYING" in the main directory of this archive10 * for more details.11 */12 13#include <linux/module.h>14#include <linux/kernel.h>15#include <linux/init.h>16#include <linux/platform_device.h>17#include <linux/spinlock.h>18#include <linux/fb.h>19#include <linux/backlight.h>20 21#include <cpu/dac.h>22#include <mach/hp6xx.h>23#include <asm/hd64461.h>24 25#define HP680_MAX_INTENSITY 25526#define HP680_DEFAULT_INTENSITY 1027 28static int hp680bl_suspended;29static int current_intensity;30static DEFINE_SPINLOCK(bl_lock);31 32static void hp680bl_send_intensity(struct backlight_device *bd)33{34	unsigned long flags;35	u16 v;36	int intensity = backlight_get_brightness(bd);37 38	if (hp680bl_suspended)39		intensity = 0;40 41	spin_lock_irqsave(&bl_lock, flags);42	if (intensity && current_intensity == 0) {43		sh_dac_enable(DAC_LCD_BRIGHTNESS);44		v = inw(HD64461_GPBDR);45		v &= ~HD64461_GPBDR_LCDOFF;46		outw(v, HD64461_GPBDR);47		sh_dac_output(255-(u8)intensity, DAC_LCD_BRIGHTNESS);48	} else if (intensity == 0 && current_intensity != 0) {49		sh_dac_output(255-(u8)intensity, DAC_LCD_BRIGHTNESS);50		sh_dac_disable(DAC_LCD_BRIGHTNESS);51		v = inw(HD64461_GPBDR);52		v |= HD64461_GPBDR_LCDOFF;53		outw(v, HD64461_GPBDR);54	} else if (intensity) {55		sh_dac_output(255-(u8)intensity, DAC_LCD_BRIGHTNESS);56	}57	spin_unlock_irqrestore(&bl_lock, flags);58 59	current_intensity = intensity;60}61 62 63#ifdef CONFIG_PM_SLEEP64static int hp680bl_suspend(struct device *dev)65{66	struct backlight_device *bd = dev_get_drvdata(dev);67 68	hp680bl_suspended = 1;69	hp680bl_send_intensity(bd);70	return 0;71}72 73static int hp680bl_resume(struct device *dev)74{75	struct backlight_device *bd = dev_get_drvdata(dev);76 77	hp680bl_suspended = 0;78	hp680bl_send_intensity(bd);79	return 0;80}81#endif82 83static SIMPLE_DEV_PM_OPS(hp680bl_pm_ops, hp680bl_suspend, hp680bl_resume);84 85static int hp680bl_set_intensity(struct backlight_device *bd)86{87	hp680bl_send_intensity(bd);88	return 0;89}90 91static int hp680bl_get_intensity(struct backlight_device *bd)92{93	return current_intensity;94}95 96static const struct backlight_ops hp680bl_ops = {97	.get_brightness = hp680bl_get_intensity,98	.update_status  = hp680bl_set_intensity,99};100 101static int hp680bl_probe(struct platform_device *pdev)102{103	struct backlight_properties props;104	struct backlight_device *bd;105 106	memset(&props, 0, sizeof(struct backlight_properties));107	props.type = BACKLIGHT_RAW;108	props.max_brightness = HP680_MAX_INTENSITY;109	bd = devm_backlight_device_register(&pdev->dev, "hp680-bl", &pdev->dev,110					NULL, &hp680bl_ops, &props);111	if (IS_ERR(bd))112		return PTR_ERR(bd);113 114	platform_set_drvdata(pdev, bd);115 116	bd->props.brightness = HP680_DEFAULT_INTENSITY;117	hp680bl_send_intensity(bd);118 119	return 0;120}121 122static void hp680bl_remove(struct platform_device *pdev)123{124	struct backlight_device *bd = platform_get_drvdata(pdev);125 126	bd->props.brightness = 0;127	bd->props.power = 0;128	hp680bl_send_intensity(bd);129}130 131static struct platform_driver hp680bl_driver = {132	.probe		= hp680bl_probe,133	.remove_new	= hp680bl_remove,134	.driver		= {135		.name	= "hp680-bl",136		.pm	= &hp680bl_pm_ops,137	},138};139 140static struct platform_device *hp680bl_device;141 142static int __init hp680bl_init(void)143{144	int ret;145 146	ret = platform_driver_register(&hp680bl_driver);147	if (ret)148		return ret;149	hp680bl_device = platform_device_register_simple("hp680-bl", -1,150							NULL, 0);151	if (IS_ERR(hp680bl_device)) {152		platform_driver_unregister(&hp680bl_driver);153		return PTR_ERR(hp680bl_device);154	}155	return 0;156}157 158static void __exit hp680bl_exit(void)159{160	platform_device_unregister(hp680bl_device);161	platform_driver_unregister(&hp680bl_driver);162}163 164module_init(hp680bl_init);165module_exit(hp680bl_exit);166 167MODULE_AUTHOR("Andriy Skulysh <askulysh@gmail.com>");168MODULE_DESCRIPTION("HP Jornada 680 Backlight Driver");169MODULE_LICENSE("GPL");170