mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
ARM: SoC board updates for 3.12
Board updates for 3.12. Again, a bit of domain overlap with SoC and DT branches,
but most of this is around legacy code and board support. We've found that
platform maintainers have a hard time separating all of these out and might
move towards fewer branches for next release.
- Removal of a number of Marvell Kirkwood board files, since contents
is now common and mostly configured via DT.
- Device-tree updates for Marvell Dove, including irqchip and clocksource
setup.
- Defconfig updates. Gotta go somewhere. One new one for Renesas Lager.
- New backlight drivers for backlights used on Renesas shmobile platforms.
- Removal of Renesas leds driver.
- Shuffling of some of the new Broadcom platforms to give room for others in
the same mach directory. More in 2.13.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
iQIcBAABAgAGBQJSKhrfAAoJEIwa5zzehBx3OOAQAJCWhoYaHvWmyAf+xCOQNpX2
YgAngENW04VpHFOyn6BtoGv6+5JypdB2TmK3GHHlVJd1Im5mD1wgm8hAfgyV8lQ4
UeJULdA2HZAstKeTirO65BIyUb5QIrWakF24ccfIfg2xeScM8FV0m8cmzeo3fYAf
DmmeoSCmvTdu/cDWBNlsQZ/as8qCQwyF+5kZg+SMl1btA1Publu2I5lDE02TH46d
sc5mN+ihw0JG62EJV7pov6uVyeFLExoTbrNfQZ4rixmKkMDS/jq5ZbBS5c0i8ULF
s1UMSZtYTcUO9rAPv3+MOIc7fq7nKo9lLuwMrA1HHUEDJ2BEi8DIp99F+ZYm/MSL
WpVxYNwOobPcMJBYGR2fy4GgpIyWB285GgrBUxcq7t0Xi4uBbptwjLhDE4d7LREV
8guW251R+OEVPYcwFctsubnox0MViyC3CQ1FaAAdtTjpSKomlhk/yaxaQ9nGrxls
QCZgXHWm4Ir3QYv8XfOn0X9vdP81EnX11SiwtrRSJ71QMs814nB8NdPDqU4VHsw8
exKmqjq/Lt+F9Kpxn/FevNNuYOdefZNQi00yl3ERchdIGdvRwE/0yA0D69mpwIVr
E41UwvH3g43vazCo2PMdWPWuFlpGMR3iZ4pXnDLH/w33ppfJWfokYwKSRQ/mu/MN
LMjkwoZn1X+fZzNSh9/G
=EGua
-----END PGP SIGNATURE-----
Merge tag 'boards-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Pull ARM SoC board updates from Olof Johansson:
"Board updates for 3.12. Again, a bit of domain overlap with SoC and
DT branches, but most of this is around legacy code and board support.
We've found that platform maintainers have a hard time separating all
of these out and might move towards fewer branches for next release.
- Removal of a number of Marvell Kirkwood board files, since contents
is now common and mostly configured via DT.
- Device-tree updates for Marvell Dove, including irqchip and
clocksource setup.
- Defconfig updates. Gotta go somewhere. One new one for Renesas
Lager.
- New backlight drivers for backlights used on Renesas shmobile
platforms.
- Removal of Renesas leds driver.
- Shuffling of some of the new Broadcom platforms to give room for
others in the same mach directory. More in 3.13"
* tag 'boards-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (67 commits)
mmc: sdhci-bcm-kona: Staticize sdhci_bcm_kona_card_event
mmc: sdhci-bcm-kona: Remove unneeded version.h inclusion
ARM: bcm: Make secure API call optional
ARM: DT: binding fixup to align with vendor-prefixes.txt (drivers)
ARM: mmc: fix NONREMOVABLE test in sdhci-bcm-kona
ARM: bcm: Rename board_bcm
mmc: sdhci-bcm-kona: make linker-section warning go away
ARM: tegra: defconfig updates
ARM: dove: add initial DT file for Globalscale D2Plug
ARM: dove: add GPIO IR receiver node to SolidRun CuBox
ARM: dove: add common pinmux functions to DT
ARM: dove: add cpu device tree node
ARM: dove: update dove_defconfig with SI5351, PCI, and xHCI
arch/arm/mach-kirkwood: Avoid using ARRAY_AND_SIZE(e) as a function argument
ARM: kirkwood: fix DT building and update defconfig
ARM: kirkwood: Remove all remaining trace of DNS-320/325 platform code
ARM: configs: disable DEBUG_LL in bcm_defconfig
ARM: bcm281xx: Board specific reboot code
ARM bcm281xx: Turn on socket & network support.
ARM: bcm281xx: Turn on L2 cache.
...
This commit is contained in:
commit
44598f98b9
111 changed files with 2416 additions and 3040 deletions
|
|
@ -425,6 +425,25 @@ config BACKLIGHT_AS3711
|
|||
If you have an Austrian Microsystems AS3711 say Y to enable the
|
||||
backlight driver.
|
||||
|
||||
config BACKLIGHT_GPIO
|
||||
tristate "Generic GPIO based Backlight Driver"
|
||||
depends on GPIOLIB
|
||||
help
|
||||
If you have a LCD backlight adjustable by GPIO, say Y to enable
|
||||
this driver.
|
||||
|
||||
config BACKLIGHT_LV5207LP
|
||||
tristate "Sanyo LV5207LP Backlight"
|
||||
depends on I2C
|
||||
help
|
||||
If you have a Sanyo LV5207LP say Y to enable the backlight driver.
|
||||
|
||||
config BACKLIGHT_BD6107
|
||||
tristate "Rohm BD6107 Backlight"
|
||||
depends on I2C
|
||||
help
|
||||
If you have a Rohm BD6107 say Y to enable the backlight driver.
|
||||
|
||||
endif # BACKLIGHT_CLASS_DEVICE
|
||||
|
||||
endif # BACKLIGHT_LCD_SUPPORT
|
||||
|
|
|
|||
|
|
@ -26,12 +26,14 @@ obj-$(CONFIG_BACKLIGHT_ADP8870) += adp8870_bl.o
|
|||
obj-$(CONFIG_BACKLIGHT_APPLE) += apple_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_AS3711) += as3711_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_ATMEL_PWM) += atmel-pwm-bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_BD6107) += bd6107.o
|
||||
obj-$(CONFIG_BACKLIGHT_CARILLO_RANCH) += cr_bllcd.o
|
||||
obj-$(CONFIG_BACKLIGHT_CLASS_DEVICE) += backlight.o
|
||||
obj-$(CONFIG_BACKLIGHT_DA903X) += da903x_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_DA9052) += da9052_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_EP93XX) += ep93xx_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_GENERIC) += generic_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_GPIO) += gpio_backlight.o
|
||||
obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_HP700) += jornada720_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o
|
||||
|
|
@ -40,6 +42,7 @@ obj-$(CONFIG_BACKLIGHT_LM3639) += lm3639_bl.o
|
|||
obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o
|
||||
obj-$(CONFIG_BACKLIGHT_LP855X) += lp855x_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_LP8788) += lp8788_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_LV5207LP) += lv5207lp.o
|
||||
obj-$(CONFIG_BACKLIGHT_MAX8925) += max8925_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_OMAP1) += omap1_bl.o
|
||||
obj-$(CONFIG_BACKLIGHT_OT200) += ot200_bl.o
|
||||
|
|
|
|||
213
drivers/video/backlight/bd6107.c
Normal file
213
drivers/video/backlight/bd6107.c
Normal file
|
|
@ -0,0 +1,213 @@
|
|||
/*
|
||||
* ROHM Semiconductor BD6107 LED Driver
|
||||
*
|
||||
* Copyright (C) 2013 Ideas on board SPRL
|
||||
*
|
||||
* Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.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 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/backlight.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_data/bd6107.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#define BD6107_PSCNT1 0x00
|
||||
#define BD6107_PSCNT1_PSCNTREG2 (1 << 2)
|
||||
#define BD6107_PSCNT1_PSCNTREG1 (1 << 0)
|
||||
#define BD6107_REGVSET 0x02
|
||||
#define BD6107_REGVSET_REG1VSET_2_85V (1 << 2)
|
||||
#define BD6107_REGVSET_REG1VSET_2_80V (0 << 2)
|
||||
#define BD6107_LEDCNT1 0x03
|
||||
#define BD6107_LEDCNT1_LEDONOFF2 (1 << 1)
|
||||
#define BD6107_LEDCNT1_LEDONOFF1 (1 << 0)
|
||||
#define BD6107_PORTSEL 0x04
|
||||
#define BD6107_PORTSEL_LEDM(n) (1 << (n))
|
||||
#define BD6107_RGB1CNT1 0x05
|
||||
#define BD6107_RGB1CNT2 0x06
|
||||
#define BD6107_RGB1CNT3 0x07
|
||||
#define BD6107_RGB1CNT4 0x08
|
||||
#define BD6107_RGB1CNT5 0x09
|
||||
#define BD6107_RGB1FLM 0x0a
|
||||
#define BD6107_RGB2CNT1 0x0b
|
||||
#define BD6107_RGB2CNT2 0x0c
|
||||
#define BD6107_RGB2CNT3 0x0d
|
||||
#define BD6107_RGB2CNT4 0x0e
|
||||
#define BD6107_RGB2CNT5 0x0f
|
||||
#define BD6107_RGB2FLM 0x10
|
||||
#define BD6107_PSCONT3 0x11
|
||||
#define BD6107_SMMONCNT 0x12
|
||||
#define BD6107_DCDCCNT 0x13
|
||||
#define BD6107_IOSEL 0x14
|
||||
#define BD6107_OUT1 0x15
|
||||
#define BD6107_OUT2 0x16
|
||||
#define BD6107_MASK1 0x17
|
||||
#define BD6107_MASK2 0x18
|
||||
#define BD6107_FACTOR1 0x19
|
||||
#define BD6107_FACTOR2 0x1a
|
||||
#define BD6107_CLRFACT1 0x1b
|
||||
#define BD6107_CLRFACT2 0x1c
|
||||
#define BD6107_STATE1 0x1d
|
||||
#define BD6107_LSIVER 0x1e
|
||||
#define BD6107_GRPSEL 0x1f
|
||||
#define BD6107_LEDCNT2 0x20
|
||||
#define BD6107_LEDCNT3 0x21
|
||||
#define BD6107_MCURRENT 0x22
|
||||
#define BD6107_MAINCNT1 0x23
|
||||
#define BD6107_MAINCNT2 0x24
|
||||
#define BD6107_SLOPECNT 0x25
|
||||
#define BD6107_MSLOPE 0x26
|
||||
#define BD6107_RGBSLOPE 0x27
|
||||
#define BD6107_TEST 0x29
|
||||
#define BD6107_SFTRST 0x2a
|
||||
#define BD6107_SFTRSTGD 0x2b
|
||||
|
||||
struct bd6107 {
|
||||
struct i2c_client *client;
|
||||
struct backlight_device *backlight;
|
||||
struct bd6107_platform_data *pdata;
|
||||
};
|
||||
|
||||
static int bd6107_write(struct bd6107 *bd, u8 reg, u8 data)
|
||||
{
|
||||
return i2c_smbus_write_byte_data(bd->client, reg, data);
|
||||
}
|
||||
|
||||
static int bd6107_backlight_update_status(struct backlight_device *backlight)
|
||||
{
|
||||
struct bd6107 *bd = bl_get_data(backlight);
|
||||
int brightness = backlight->props.brightness;
|
||||
|
||||
if (backlight->props.power != FB_BLANK_UNBLANK ||
|
||||
backlight->props.fb_blank != FB_BLANK_UNBLANK ||
|
||||
backlight->props.state & (BL_CORE_SUSPENDED | BL_CORE_FBBLANK))
|
||||
brightness = 0;
|
||||
|
||||
if (brightness) {
|
||||
bd6107_write(bd, BD6107_PORTSEL, BD6107_PORTSEL_LEDM(2) |
|
||||
BD6107_PORTSEL_LEDM(1) | BD6107_PORTSEL_LEDM(0));
|
||||
bd6107_write(bd, BD6107_MAINCNT1, brightness);
|
||||
bd6107_write(bd, BD6107_LEDCNT1, BD6107_LEDCNT1_LEDONOFF1);
|
||||
} else {
|
||||
gpio_set_value(bd->pdata->reset, 0);
|
||||
msleep(24);
|
||||
gpio_set_value(bd->pdata->reset, 1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bd6107_backlight_get_brightness(struct backlight_device *backlight)
|
||||
{
|
||||
return backlight->props.brightness;
|
||||
}
|
||||
|
||||
static int bd6107_backlight_check_fb(struct backlight_device *backlight,
|
||||
struct fb_info *info)
|
||||
{
|
||||
struct bd6107 *bd = bl_get_data(backlight);
|
||||
|
||||
return bd->pdata->fbdev == NULL || bd->pdata->fbdev == info->dev;
|
||||
}
|
||||
|
||||
static const struct backlight_ops bd6107_backlight_ops = {
|
||||
.options = BL_CORE_SUSPENDRESUME,
|
||||
.update_status = bd6107_backlight_update_status,
|
||||
.get_brightness = bd6107_backlight_get_brightness,
|
||||
.check_fb = bd6107_backlight_check_fb,
|
||||
};
|
||||
|
||||
static int bd6107_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct bd6107_platform_data *pdata = client->dev.platform_data;
|
||||
struct backlight_device *backlight;
|
||||
struct backlight_properties props;
|
||||
struct bd6107 *bd;
|
||||
int ret;
|
||||
|
||||
if (pdata == NULL || !pdata->reset) {
|
||||
dev_err(&client->dev, "No reset GPIO in platform data\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!i2c_check_functionality(client->adapter,
|
||||
I2C_FUNC_SMBUS_BYTE_DATA)) {
|
||||
dev_warn(&client->dev,
|
||||
"I2C adapter doesn't support I2C_FUNC_SMBUS_BYTE\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
bd = devm_kzalloc(&client->dev, sizeof(*bd), GFP_KERNEL);
|
||||
if (!bd)
|
||||
return -ENOMEM;
|
||||
|
||||
bd->client = client;
|
||||
bd->pdata = pdata;
|
||||
|
||||
ret = devm_gpio_request_one(&client->dev, pdata->reset,
|
||||
GPIOF_DIR_OUT | GPIOF_INIT_LOW, "reset");
|
||||
if (ret < 0) {
|
||||
dev_err(&client->dev, "unable to request reset GPIO\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
memset(&props, 0, sizeof(props));
|
||||
props.type = BACKLIGHT_RAW;
|
||||
props.max_brightness = 128;
|
||||
props.brightness = clamp_t(unsigned int, pdata->def_value, 0,
|
||||
props.max_brightness);
|
||||
|
||||
backlight = backlight_device_register(dev_name(&client->dev),
|
||||
&bd->client->dev, bd,
|
||||
&bd6107_backlight_ops, &props);
|
||||
if (IS_ERR(backlight)) {
|
||||
dev_err(&client->dev, "failed to register backlight\n");
|
||||
return PTR_ERR(backlight);
|
||||
}
|
||||
|
||||
backlight_update_status(backlight);
|
||||
i2c_set_clientdata(client, backlight);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bd6107_remove(struct i2c_client *client)
|
||||
{
|
||||
struct backlight_device *backlight = i2c_get_clientdata(client);
|
||||
|
||||
backlight->props.brightness = 0;
|
||||
backlight_update_status(backlight);
|
||||
backlight_device_unregister(backlight);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id bd6107_ids[] = {
|
||||
{ "bd6107", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, bd6107_ids);
|
||||
|
||||
static struct i2c_driver bd6107_driver = {
|
||||
.driver = {
|
||||
.name = "bd6107",
|
||||
},
|
||||
.probe = bd6107_probe,
|
||||
.remove = bd6107_remove,
|
||||
.id_table = bd6107_ids,
|
||||
};
|
||||
|
||||
module_i2c_driver(bd6107_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Rohm BD6107 Backlight Driver");
|
||||
MODULE_AUTHOR("Laurent Pinchart <[email protected]>");
|
||||
MODULE_LICENSE("GPL");
|
||||
133
drivers/video/backlight/gpio_backlight.c
Normal file
133
drivers/video/backlight/gpio_backlight.c
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
/*
|
||||
* gpio_backlight.c - Simple GPIO-controlled backlight
|
||||
*
|
||||
* 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/backlight.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_data/gpio_backlight.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
struct gpio_backlight {
|
||||
struct device *dev;
|
||||
struct device *fbdev;
|
||||
|
||||
int gpio;
|
||||
int active;
|
||||
};
|
||||
|
||||
static int gpio_backlight_update_status(struct backlight_device *bl)
|
||||
{
|
||||
struct gpio_backlight *gbl = bl_get_data(bl);
|
||||
int brightness = bl->props.brightness;
|
||||
|
||||
if (bl->props.power != FB_BLANK_UNBLANK ||
|
||||
bl->props.fb_blank != FB_BLANK_UNBLANK ||
|
||||
bl->props.state & (BL_CORE_SUSPENDED | BL_CORE_FBBLANK))
|
||||
brightness = 0;
|
||||
|
||||
gpio_set_value(gbl->gpio, brightness ? gbl->active : !gbl->active);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gpio_backlight_get_brightness(struct backlight_device *bl)
|
||||
{
|
||||
return bl->props.brightness;
|
||||
}
|
||||
|
||||
static int gpio_backlight_check_fb(struct backlight_device *bl,
|
||||
struct fb_info *info)
|
||||
{
|
||||
struct gpio_backlight *gbl = bl_get_data(bl);
|
||||
|
||||
return gbl->fbdev == NULL || gbl->fbdev == info->dev;
|
||||
}
|
||||
|
||||
static const struct backlight_ops gpio_backlight_ops = {
|
||||
.options = BL_CORE_SUSPENDRESUME,
|
||||
.update_status = gpio_backlight_update_status,
|
||||
.get_brightness = gpio_backlight_get_brightness,
|
||||
.check_fb = gpio_backlight_check_fb,
|
||||
};
|
||||
|
||||
static int gpio_backlight_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct gpio_backlight_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct backlight_properties props;
|
||||
struct backlight_device *bl;
|
||||
struct gpio_backlight *gbl;
|
||||
int ret;
|
||||
|
||||
if (!pdata) {
|
||||
dev_err(&pdev->dev, "failed to find platform data\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
gbl = devm_kzalloc(&pdev->dev, sizeof(*gbl), GFP_KERNEL);
|
||||
if (gbl == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
gbl->dev = &pdev->dev;
|
||||
gbl->fbdev = pdata->fbdev;
|
||||
gbl->gpio = pdata->gpio;
|
||||
gbl->active = pdata->active_low ? 0 : 1;
|
||||
|
||||
ret = devm_gpio_request_one(gbl->dev, gbl->gpio, GPIOF_DIR_OUT |
|
||||
(gbl->active ? GPIOF_INIT_LOW
|
||||
: GPIOF_INIT_HIGH),
|
||||
pdata->name);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "unable to request GPIO\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
memset(&props, 0, sizeof(props));
|
||||
props.type = BACKLIGHT_RAW;
|
||||
props.max_brightness = 1;
|
||||
bl = backlight_device_register(dev_name(&pdev->dev), &pdev->dev, gbl,
|
||||
&gpio_backlight_ops, &props);
|
||||
if (IS_ERR(bl)) {
|
||||
dev_err(&pdev->dev, "failed to register backlight\n");
|
||||
return PTR_ERR(bl);
|
||||
}
|
||||
|
||||
bl->props.brightness = pdata->def_value;
|
||||
backlight_update_status(bl);
|
||||
|
||||
platform_set_drvdata(pdev, bl);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gpio_backlight_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct backlight_device *bl = platform_get_drvdata(pdev);
|
||||
|
||||
backlight_device_unregister(bl);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver gpio_backlight_driver = {
|
||||
.driver = {
|
||||
.name = "gpio-backlight",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = gpio_backlight_probe,
|
||||
.remove = gpio_backlight_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(gpio_backlight_driver);
|
||||
|
||||
MODULE_AUTHOR("Laurent Pinchart <[email protected]>");
|
||||
MODULE_DESCRIPTION("GPIO-based Backlight Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:gpio-backlight");
|
||||
171
drivers/video/backlight/lv5207lp.c
Normal file
171
drivers/video/backlight/lv5207lp.c
Normal file
|
|
@ -0,0 +1,171 @@
|
|||
/*
|
||||
* Sanyo LV5207LP LED Driver
|
||||
*
|
||||
* Copyright (C) 2013 Ideas on board SPRL
|
||||
*
|
||||
* Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.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 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/backlight.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_data/lv5207lp.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#define LV5207LP_CTRL1 0x00
|
||||
#define LV5207LP_CPSW (1 << 7)
|
||||
#define LV5207LP_SCTEN (1 << 6)
|
||||
#define LV5207LP_C10 (1 << 5)
|
||||
#define LV5207LP_CKSW (1 << 4)
|
||||
#define LV5207LP_RSW (1 << 3)
|
||||
#define LV5207LP_GSW (1 << 2)
|
||||
#define LV5207LP_BSW (1 << 1)
|
||||
#define LV5207LP_CTRL2 0x01
|
||||
#define LV5207LP_MSW (1 << 7)
|
||||
#define LV5207LP_MLED4 (1 << 6)
|
||||
#define LV5207LP_RED 0x02
|
||||
#define LV5207LP_GREEN 0x03
|
||||
#define LV5207LP_BLUE 0x04
|
||||
|
||||
#define LV5207LP_MAX_BRIGHTNESS 32
|
||||
|
||||
struct lv5207lp {
|
||||
struct i2c_client *client;
|
||||
struct backlight_device *backlight;
|
||||
struct lv5207lp_platform_data *pdata;
|
||||
};
|
||||
|
||||
static int lv5207lp_write(struct lv5207lp *lv, u8 reg, u8 data)
|
||||
{
|
||||
return i2c_smbus_write_byte_data(lv->client, reg, data);
|
||||
}
|
||||
|
||||
static int lv5207lp_backlight_update_status(struct backlight_device *backlight)
|
||||
{
|
||||
struct lv5207lp *lv = bl_get_data(backlight);
|
||||
int brightness = backlight->props.brightness;
|
||||
|
||||
if (backlight->props.power != FB_BLANK_UNBLANK ||
|
||||
backlight->props.fb_blank != FB_BLANK_UNBLANK ||
|
||||
backlight->props.state & (BL_CORE_SUSPENDED | BL_CORE_FBBLANK))
|
||||
brightness = 0;
|
||||
|
||||
if (brightness) {
|
||||
lv5207lp_write(lv, LV5207LP_CTRL1,
|
||||
LV5207LP_CPSW | LV5207LP_C10 | LV5207LP_CKSW);
|
||||
lv5207lp_write(lv, LV5207LP_CTRL2,
|
||||
LV5207LP_MSW | LV5207LP_MLED4 |
|
||||
(brightness - 1));
|
||||
} else {
|
||||
lv5207lp_write(lv, LV5207LP_CTRL1, 0);
|
||||
lv5207lp_write(lv, LV5207LP_CTRL2, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lv5207lp_backlight_get_brightness(struct backlight_device *backlight)
|
||||
{
|
||||
return backlight->props.brightness;
|
||||
}
|
||||
|
||||
static int lv5207lp_backlight_check_fb(struct backlight_device *backlight,
|
||||
struct fb_info *info)
|
||||
{
|
||||
struct lv5207lp *lv = bl_get_data(backlight);
|
||||
|
||||
return lv->pdata->fbdev == NULL || lv->pdata->fbdev == info->dev;
|
||||
}
|
||||
|
||||
static const struct backlight_ops lv5207lp_backlight_ops = {
|
||||
.options = BL_CORE_SUSPENDRESUME,
|
||||
.update_status = lv5207lp_backlight_update_status,
|
||||
.get_brightness = lv5207lp_backlight_get_brightness,
|
||||
.check_fb = lv5207lp_backlight_check_fb,
|
||||
};
|
||||
|
||||
static int lv5207lp_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct lv5207lp_platform_data *pdata = client->dev.platform_data;
|
||||
struct backlight_device *backlight;
|
||||
struct backlight_properties props;
|
||||
struct lv5207lp *lv;
|
||||
|
||||
if (pdata == NULL) {
|
||||
dev_err(&client->dev, "No platform data supplied\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!i2c_check_functionality(client->adapter,
|
||||
I2C_FUNC_SMBUS_BYTE_DATA)) {
|
||||
dev_warn(&client->dev,
|
||||
"I2C adapter doesn't support I2C_FUNC_SMBUS_BYTE\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
lv = devm_kzalloc(&client->dev, sizeof(*lv), GFP_KERNEL);
|
||||
if (!lv)
|
||||
return -ENOMEM;
|
||||
|
||||
lv->client = client;
|
||||
lv->pdata = pdata;
|
||||
|
||||
memset(&props, 0, sizeof(props));
|
||||
props.type = BACKLIGHT_RAW;
|
||||
props.max_brightness = min_t(unsigned int, pdata->max_value,
|
||||
LV5207LP_MAX_BRIGHTNESS);
|
||||
props.brightness = clamp_t(unsigned int, pdata->def_value, 0,
|
||||
props.max_brightness);
|
||||
|
||||
backlight = backlight_device_register(dev_name(&client->dev),
|
||||
&lv->client->dev, lv,
|
||||
&lv5207lp_backlight_ops, &props);
|
||||
if (IS_ERR(backlight)) {
|
||||
dev_err(&client->dev, "failed to register backlight\n");
|
||||
return PTR_ERR(backlight);
|
||||
}
|
||||
|
||||
backlight_update_status(backlight);
|
||||
i2c_set_clientdata(client, backlight);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lv5207lp_remove(struct i2c_client *client)
|
||||
{
|
||||
struct backlight_device *backlight = i2c_get_clientdata(client);
|
||||
|
||||
backlight->props.brightness = 0;
|
||||
backlight_update_status(backlight);
|
||||
backlight_device_unregister(backlight);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id lv5207lp_ids[] = {
|
||||
{ "lv5207lp", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, lv5207lp_ids);
|
||||
|
||||
static struct i2c_driver lv5207lp_driver = {
|
||||
.driver = {
|
||||
.name = "lv5207lp",
|
||||
},
|
||||
.probe = lv5207lp_probe,
|
||||
.remove = lv5207lp_remove,
|
||||
.id_table = lv5207lp_ids,
|
||||
};
|
||||
|
||||
module_i2c_driver(lv5207lp_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Sanyo LV5207LP Backlight Driver");
|
||||
MODULE_AUTHOR("Laurent Pinchart <[email protected]>");
|
||||
MODULE_LICENSE("GPL");
|
||||
Loading…
Reference in a new issue