Skip to content

Commit

Permalink
backlight: Add support for the Avionic Design Xanthos backlight device.
Browse files Browse the repository at this point in the history
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
Show file tree
Hide file tree
Showing 3 changed files with 187 additions and 1 deletion.
8 changes: 8 additions & 0 deletions drivers/video/backlight/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -243,3 +243,11 @@ config BACKLIGHT_WM831X
help
If you have a backlight driven by the ISINK and DCDC of a
WM831x PMIC say y to enable the backlight driver for it.

config BACKLIGHT_ADX
tristate "Avionic Design Xanthos Backlight Driver"
depends on BACKLIGHT_CLASS_DEVICE && ARCH_PXA_ADX
default y
help
Say Y to enable the backlight driver on Avionic Design Xanthos-based
boards.
2 changes: 1 addition & 1 deletion drivers/video/backlight/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,4 @@ obj-$(CONFIG_BACKLIGHT_MBP_NVIDIA) += mbp_nvidia_bl.o
obj-$(CONFIG_BACKLIGHT_TOSA) += tosa_bl.o
obj-$(CONFIG_BACKLIGHT_SAHARA) += kb3886_bl.o
obj-$(CONFIG_BACKLIGHT_WM831X) += wm831x_bl.o

obj-$(CONFIG_BACKLIGHT_ADX) += adx_bl.o
178 changes: 178 additions & 0 deletions drivers/video/backlight/adx_bl.c
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");

0 comments on commit 3b96ea9

Please sign in to comment.