diff options
Diffstat (limited to 'recipes-kernel/linux/linux-handheld-4.0/locomo/0006-video-backlight-add-new-locomo-backlight-driver.patch')
-rw-r--r-- | recipes-kernel/linux/linux-handheld-4.0/locomo/0006-video-backlight-add-new-locomo-backlight-driver.patch | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-handheld-4.0/locomo/0006-video-backlight-add-new-locomo-backlight-driver.patch b/recipes-kernel/linux/linux-handheld-4.0/locomo/0006-video-backlight-add-new-locomo-backlight-driver.patch new file mode 100644 index 0000000..cf2ebe7 --- /dev/null +++ b/recipes-kernel/linux/linux-handheld-4.0/locomo/0006-video-backlight-add-new-locomo-backlight-driver.patch @@ -0,0 +1,212 @@ +From 3be6ca10a2c5275f6c89818b7478b21567dc3cf3 Mon Sep 17 00:00:00 2001 +From: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> +Date: Mon, 11 Nov 2013 03:10:17 +0400 +Subject: [PATCH 06/20] video: backlight: add new locomo backlight driver + +Add new simple backlight driver - it cares only about PWM/frontlight +part of LoCoMo, it does not touch TFT settings and does not export TFT +power control. + +Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> +--- + drivers/video/backlight/Kconfig | 6 +- + drivers/video/backlight/Makefile | 2 +- + drivers/video/backlight/locomo_bl.c | 153 ++++++++++++++++++++++++++++++++++++ + 3 files changed, 157 insertions(+), 4 deletions(-) + create mode 100644 drivers/video/backlight/locomo_bl.c + +diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig +index efb0904..540ab64 100644 +--- a/drivers/video/backlight/Kconfig ++++ b/drivers/video/backlight/Kconfig +@@ -217,12 +217,12 @@ config BACKLIGHT_LM3533 + levels. + + config BACKLIGHT_LOCOMO +- tristate "Sharp LOCOMO LCD/Backlight Driver" +- depends on SHARP_LOCOMO ++ tristate "Sharp LOCOMO Backlight Driver" ++ depends on MFD_LOCOMO + default y + help + If you have a Sharp Zaurus SL-5500 (Collie) or SL-5600 (Poodle) say y to +- enable the LCD/backlight driver. ++ enable the backlight driver. + + config BACKLIGHT_OMAP1 + tristate "OMAP1 PWL-based LCD Backlight" +diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile +index fcd50b73..2a61b7e 100644 +--- a/drivers/video/backlight/Makefile ++++ b/drivers/video/backlight/Makefile +@@ -39,7 +39,7 @@ obj-$(CONFIG_BACKLIGHT_IPAQ_MICRO) += ipaq_micro_bl.o + obj-$(CONFIG_BACKLIGHT_LM3533) += lm3533_bl.o + obj-$(CONFIG_BACKLIGHT_LM3630A) += lm3630a_bl.o + obj-$(CONFIG_BACKLIGHT_LM3639) += lm3639_bl.o +-obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomolcd.o ++obj-$(CONFIG_BACKLIGHT_LOCOMO) += locomo_bl.o + obj-$(CONFIG_BACKLIGHT_LP855X) += lp855x_bl.o + obj-$(CONFIG_BACKLIGHT_LP8788) += lp8788_bl.o + obj-$(CONFIG_BACKLIGHT_LV5207LP) += lv5207lp.o +diff --git a/drivers/video/backlight/locomo_bl.c b/drivers/video/backlight/locomo_bl.c +new file mode 100644 +index 0000000..cc60022 +--- /dev/null ++++ b/drivers/video/backlight/locomo_bl.c +@@ -0,0 +1,153 @@ ++/* ++ * Backlight control code for Sharp Zaurus SL-5500 ++ * ++ * Copyright 2005 John Lenz <lenz@cs.wisc.edu> ++ * Maintainer: Pavel Machek <pavel@ucw.cz> (unless John wants to :-) ++ * GPL v2 ++ * ++ * This driver assumes single CPU. That's okay, because collie is ++ * slightly old hardware, and no one is going to retrofit second CPU to ++ * old PDA. ++ */ ++ ++#include <linux/backlight.h> ++#include <linux/delay.h> ++#include <linux/fb.h> ++#include <linux/gpio/consumer.h> ++#include <linux/mfd/locomo.h> ++#include <linux/module.h> ++#include <linux/platform_device.h> ++#include <linux/regmap.h> ++ ++struct locomo_bl { ++ struct regmap *regmap; ++ int current_intensity; ++ struct gpio_desc *fl_vr; ++}; ++ ++static const struct { ++ u16 duty, bpwf; ++ bool vr; ++} locomo_bl_pwm[] = { ++ { 0, 161, false }, ++ { 117, 161, false }, ++ { 163, 148, false }, ++ { 194, 161, false }, ++ { 194, 161, true }, ++}; ++ ++static int locomo_bl_set_intensity(struct backlight_device *bd) ++{ ++ int intensity = bd->props.brightness; ++ struct locomo_bl *bl = dev_get_drvdata(&bd->dev); ++ ++ if (bd->props.power != FB_BLANK_UNBLANK) ++ intensity = 0; ++ if (bd->props.fb_blank != FB_BLANK_UNBLANK) ++ intensity = 0; ++ if (bd->props.state & BL_CORE_SUSPENDED) ++ intensity = 0; ++ ++ gpiod_set_value(bl->fl_vr, locomo_bl_pwm[intensity].vr); ++ ++ regmap_write(bl->regmap, LOCOMO_ALS, locomo_bl_pwm[intensity].bpwf); ++ usleep_range(100, 200); ++ regmap_write(bl->regmap, LOCOMO_ALD, locomo_bl_pwm[intensity].duty); ++ usleep_range(100, 200); ++ regmap_write(bl->regmap, LOCOMO_ALS, locomo_bl_pwm[intensity].bpwf | ++ LOCOMO_ALS_EN); ++ ++ bl->current_intensity = intensity; ++ if (bd->props.state & BL_CORE_SUSPENDED) ++ regmap_write(bl->regmap, LOCOMO_ALS, 0x00); ++ ++ return 0; ++} ++ ++static int locomo_bl_get_intensity(struct backlight_device *bd) ++{ ++ struct locomo_bl *bl = dev_get_drvdata(&bd->dev); ++ ++ return bl->current_intensity; ++} ++ ++static const struct backlight_ops locomo_bl_ops = { ++ .options = BL_CORE_SUSPENDRESUME, ++ .get_brightness = locomo_bl_get_intensity, ++ .update_status = locomo_bl_set_intensity, ++}; ++ ++static int locomo_bl_probe(struct platform_device *dev) ++{ ++ struct backlight_properties props; ++ struct locomo_bl *bl; ++ struct backlight_device *locomo_bl_device; ++ ++ bl = devm_kmalloc(&dev->dev, sizeof(struct locomo_bl), GFP_KERNEL); ++ if (!bl) ++ return -ENOMEM; ++ ++ bl->regmap = dev_get_regmap(dev->dev.parent, NULL); ++ if (!bl->regmap) ++ return -ENODEV; ++ ++ bl->fl_vr = devm_gpiod_get(&dev->dev, "flvr", GPIOD_OUT_LOW); ++ if (IS_ERR(bl->fl_vr)) ++ return PTR_ERR(bl->fl_vr); ++ ++ regmap_write(bl->regmap, LOCOMO_ALS, 0); ++ regmap_write(bl->regmap, LOCOMO_ALD, 0); ++ ++ memset(&props, 0, sizeof(struct backlight_properties)); ++ props.type = BACKLIGHT_RAW; ++ props.max_brightness = ARRAY_SIZE(locomo_bl_pwm) - 1; ++ props.brightness = props.max_brightness / 2; ++ locomo_bl_device = devm_backlight_device_register(&dev->dev, ++ "locomo-bl", ++ &dev->dev, bl, ++ &locomo_bl_ops, &props); ++ ++ if (IS_ERR(locomo_bl_device)) ++ return PTR_ERR(locomo_bl_device); ++ ++ platform_set_drvdata(dev, locomo_bl_device); ++ ++ /* Set up frontlight so that screen is readable */ ++ backlight_update_status(locomo_bl_device); ++ ++ return 0; ++} ++ ++static void locomo_bl_shutdown(struct platform_device *dev) ++{ ++ struct backlight_device *locomo_bl_device = platform_get_drvdata(dev); ++ ++ locomo_bl_device->props.brightness = 0; ++ locomo_bl_device->props.power = 0; ++ locomo_bl_set_intensity(locomo_bl_device); ++} ++ ++static int locomo_bl_remove(struct platform_device *dev) ++{ ++ locomo_bl_shutdown(dev); ++ ++ return 0; ++} ++ ++static struct platform_driver locomo_bl_driver = { ++ .driver = { ++ .name = "locomo-backlight", ++ }, ++ .probe = locomo_bl_probe, ++ .remove = locomo_bl_remove, ++ /* Turn off bl on power off/reboot */ ++ .shutdown = locomo_bl_shutdown, ++}; ++ ++module_platform_driver(locomo_bl_driver); ++ ++MODULE_AUTHOR("John Lenz <lenz@cs.wisc.edu>"); ++MODULE_AUTHOR("Pavel Machek <pavel@ucw.cz>"); ++MODULE_DESCRIPTION("LoCoMo Backlight driver"); ++MODULE_LICENSE("GPL v2"); ++MODULE_ALIAS("platform:locomo-backlight"); +-- +1.9.1 + |