-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
backlight: Add support for the Avionic Design Xanthos backlight device.
This patch adds support for the backlight device found on Avionic Design Xanthos-based boards. Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de> Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
- Loading branch information
Thierry Reding
authored and
Richard Purdie
committed
Sep 7, 2009
1 parent
5036cc4
commit 3b96ea9
Showing
3 changed files
with
187 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,178 @@ | ||
/* | ||
* linux/drivers/video/backlight/adx.c | ||
* | ||
* Copyright (C) 2009 Avionic Design GmbH | ||
* | ||
* 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. | ||
* | ||
* Written by Thierry Reding <thierry.reding@avionic-design.de> | ||
*/ | ||
|
||
#include <linux/backlight.h> | ||
#include <linux/fb.h> | ||
#include <linux/io.h> | ||
#include <linux/module.h> | ||
#include <linux/platform_device.h> | ||
|
||
/* register definitions */ | ||
#define ADX_BACKLIGHT_CONTROL 0x00 | ||
#define ADX_BACKLIGHT_CONTROL_ENABLE (1 << 0) | ||
#define ADX_BACKLIGHT_BRIGHTNESS 0x08 | ||
#define ADX_BACKLIGHT_STATUS 0x10 | ||
#define ADX_BACKLIGHT_ERROR 0x18 | ||
|
||
struct adxbl { | ||
void __iomem *base; | ||
}; | ||
|
||
static int adx_backlight_update_status(struct backlight_device *bldev) | ||
{ | ||
struct adxbl *bl = bl_get_data(bldev); | ||
u32 value; | ||
|
||
value = bldev->props.brightness; | ||
writel(value, bl->base + ADX_BACKLIGHT_BRIGHTNESS); | ||
|
||
value = readl(bl->base + ADX_BACKLIGHT_CONTROL); | ||
|
||
if (bldev->props.state & BL_CORE_FBBLANK) | ||
value &= ~ADX_BACKLIGHT_CONTROL_ENABLE; | ||
else | ||
value |= ADX_BACKLIGHT_CONTROL_ENABLE; | ||
|
||
writel(value, bl->base + ADX_BACKLIGHT_CONTROL); | ||
|
||
return 0; | ||
} | ||
|
||
static int adx_backlight_get_brightness(struct backlight_device *bldev) | ||
{ | ||
struct adxbl *bl = bl_get_data(bldev); | ||
u32 brightness; | ||
|
||
brightness = readl(bl->base + ADX_BACKLIGHT_BRIGHTNESS); | ||
return brightness & 0xff; | ||
} | ||
|
||
static int adx_backlight_check_fb(struct fb_info *fb) | ||
{ | ||
return 1; | ||
} | ||
|
||
static struct backlight_ops adx_backlight_ops = { | ||
.options = 0, | ||
.update_status = adx_backlight_update_status, | ||
.get_brightness = adx_backlight_get_brightness, | ||
.check_fb = adx_backlight_check_fb, | ||
}; | ||
|
||
static int __devinit adx_backlight_probe(struct platform_device *pdev) | ||
{ | ||
struct backlight_device *bldev; | ||
struct resource *res; | ||
struct adxbl *bl; | ||
int ret = 0; | ||
|
||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
if (!res) { | ||
ret = -ENXIO; | ||
goto out; | ||
} | ||
|
||
res = devm_request_mem_region(&pdev->dev, res->start, | ||
resource_size(res), res->name); | ||
if (!res) { | ||
ret = -ENXIO; | ||
goto out; | ||
} | ||
|
||
bl = devm_kzalloc(&pdev->dev, sizeof(*bl), GFP_KERNEL); | ||
if (!bl) { | ||
ret = -ENOMEM; | ||
goto out; | ||
} | ||
|
||
bl->base = devm_ioremap_nocache(&pdev->dev, res->start, | ||
resource_size(res)); | ||
if (!bl->base) { | ||
ret = -ENXIO; | ||
goto out; | ||
} | ||
|
||
bldev = backlight_device_register(dev_name(&pdev->dev), &pdev->dev, bl, | ||
&adx_backlight_ops); | ||
if (!bldev) { | ||
ret = -ENOMEM; | ||
goto out; | ||
} | ||
|
||
bldev->props.max_brightness = 0xff; | ||
bldev->props.brightness = 0xff; | ||
bldev->props.power = FB_BLANK_UNBLANK; | ||
|
||
platform_set_drvdata(pdev, bldev); | ||
|
||
out: | ||
return ret; | ||
} | ||
|
||
static int __devexit adx_backlight_remove(struct platform_device *pdev) | ||
{ | ||
struct backlight_device *bldev; | ||
int ret = 0; | ||
|
||
bldev = platform_get_drvdata(pdev); | ||
bldev->props.power = FB_BLANK_UNBLANK; | ||
bldev->props.brightness = 0xff; | ||
backlight_update_status(bldev); | ||
backlight_device_unregister(bldev); | ||
platform_set_drvdata(pdev, NULL); | ||
|
||
return ret; | ||
} | ||
|
||
#ifdef CONFIG_PM | ||
static int adx_backlight_suspend(struct platform_device *pdev, | ||
pm_message_t state) | ||
{ | ||
return 0; | ||
} | ||
|
||
static int adx_backlight_resume(struct platform_device *pdev) | ||
{ | ||
return 0; | ||
} | ||
#else | ||
#define adx_backlight_suspend NULL | ||
#define adx_backlight_resume NULL | ||
#endif | ||
|
||
static struct platform_driver adx_backlight_driver = { | ||
.probe = adx_backlight_probe, | ||
.remove = __devexit_p(adx_backlight_remove), | ||
.suspend = adx_backlight_suspend, | ||
.resume = adx_backlight_resume, | ||
.driver = { | ||
.name = "adx-backlight", | ||
.owner = THIS_MODULE, | ||
}, | ||
}; | ||
|
||
static int __init adx_backlight_init(void) | ||
{ | ||
return platform_driver_register(&adx_backlight_driver); | ||
} | ||
|
||
static void __exit adx_backlight_exit(void) | ||
{ | ||
platform_driver_unregister(&adx_backlight_driver); | ||
} | ||
|
||
module_init(adx_backlight_init); | ||
module_exit(adx_backlight_exit); | ||
|
||
MODULE_AUTHOR("Thierry Reding <thierry.reding@avionic-design.de>"); | ||
MODULE_DESCRIPTION("Avionic Design Xanthos Backlight Driver"); | ||
MODULE_LICENSE("GPL v2"); |