forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branches 'ib-qcom-leds-6.9' and 'ib-leds-backlight-6.9' into ib…
…s-for-leds-merged
- Loading branch information
Showing
11 changed files
with
341 additions
and
90 deletions.
There are no files selected for viewing
46 changes: 46 additions & 0 deletions
46
Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
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,46 @@ | ||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) | ||
%YAML 1.2 | ||
--- | ||
$id: http://devicetree.org/schemas/leds/backlight/kinetic,ktd2801.yaml# | ||
$schema: http://devicetree.org/meta-schemas/core.yaml# | ||
|
||
title: Kinetic Technologies KTD2801 one-wire backlight | ||
|
||
maintainers: | ||
- Duje Mihanović <[email protected]> | ||
|
||
description: | | ||
The Kinetic Technologies KTD2801 is a LED backlight driver controlled | ||
by a single GPIO line. The driver can be controlled with a PWM signal | ||
or by pulsing the GPIO line to set the backlight level. This is called | ||
"ExpressWire". | ||
allOf: | ||
- $ref: common.yaml# | ||
|
||
properties: | ||
compatible: | ||
const: kinetic,ktd2801 | ||
|
||
ctrl-gpios: | ||
maxItems: 1 | ||
|
||
default-brightness: true | ||
max-brightness: true | ||
|
||
required: | ||
- compatible | ||
- ctrl-gpios | ||
|
||
additionalProperties: false | ||
|
||
examples: | ||
- | | ||
#include <dt-bindings/gpio/gpio.h> | ||
backlight { | ||
compatible = "kinetic,ktd2801"; | ||
ctrl-gpios = <&gpio 97 GPIO_ACTIVE_HIGH>; | ||
max-brightness = <210>; | ||
default-brightness = <100>; | ||
}; |
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 |
---|---|---|
|
@@ -7979,6 +7979,13 @@ S: Maintained | |
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linkinjeon/exfat.git | ||
F: fs/exfat/ | ||
|
||
EXPRESSWIRE PROTOCOL LIBRARY | ||
M: Duje Mihanović <[email protected]> | ||
L: [email protected] | ||
S: Maintained | ||
F: drivers/leds/leds-expresswire.c | ||
F: include/linux/leds-expresswire.h | ||
|
||
EXT2 FILE SYSTEM | ||
M: Jan Kara <[email protected]> | ||
L: [email protected] | ||
|
@@ -12045,6 +12052,12 @@ S: Maintained | |
F: Documentation/devicetree/bindings/leds/backlight/kinetic,ktd253.yaml | ||
F: drivers/video/backlight/ktd253-backlight.c | ||
|
||
KTD2801 BACKLIGHT DRIVER | ||
M: Duje Mihanović <[email protected]> | ||
S: Maintained | ||
F: Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml | ||
F: drivers/video/backlight/ktd2801-backlight.c | ||
|
||
KTEST | ||
M: Steven Rostedt <[email protected]> | ||
M: John Hawley <[email protected]> | ||
|
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
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 |
---|---|---|
|
@@ -6,9 +6,9 @@ | |
* Ingi Kim <[email protected]> | ||
*/ | ||
|
||
#include <linux/delay.h> | ||
#include <linux/err.h> | ||
#include <linux/gpio/consumer.h> | ||
#include <linux/leds-expresswire.h> | ||
#include <linux/led-class-flash.h> | ||
#include <linux/module.h> | ||
#include <linux/mutex.h> | ||
|
@@ -37,22 +37,9 @@ | |
#define KTD2692_REG_FLASH_CURRENT_BASE 0x80 | ||
#define KTD2692_REG_MODE_BASE 0xA0 | ||
|
||
/* Set bit coding time for expresswire interface */ | ||
#define KTD2692_TIME_RESET_US 700 | ||
#define KTD2692_TIME_DATA_START_TIME_US 10 | ||
#define KTD2692_TIME_HIGH_END_OF_DATA_US 350 | ||
#define KTD2692_TIME_LOW_END_OF_DATA_US 10 | ||
#define KTD2692_TIME_SHORT_BITSET_US 4 | ||
#define KTD2692_TIME_LONG_BITSET_US 12 | ||
|
||
/* KTD2692 default length of name */ | ||
#define KTD2692_NAME_LENGTH 20 | ||
|
||
enum ktd2692_bitset { | ||
KTD2692_LOW = 0, | ||
KTD2692_HIGH, | ||
}; | ||
|
||
/* Movie / Flash Mode Control */ | ||
enum ktd2692_led_mode { | ||
KTD2692_MODE_DISABLE = 0, /* default */ | ||
|
@@ -71,7 +58,19 @@ struct ktd2692_led_config_data { | |
enum led_brightness max_brightness; | ||
}; | ||
|
||
const struct expresswire_timing ktd2692_timing = { | ||
.poweroff_us = 700, | ||
.data_start_us = 10, | ||
.end_of_data_low_us = 10, | ||
.end_of_data_high_us = 350, | ||
.short_bitset_us = 4, | ||
.long_bitset_us = 12 | ||
}; | ||
|
||
struct ktd2692_context { | ||
/* Common ExpressWire properties (ctrl GPIO and timing) */ | ||
struct expresswire_common_props props; | ||
|
||
/* Related LED Flash class device */ | ||
struct led_classdev_flash fled_cdev; | ||
|
||
|
@@ -80,7 +79,6 @@ struct ktd2692_context { | |
struct regulator *regulator; | ||
|
||
struct gpio_desc *aux_gpio; | ||
struct gpio_desc *ctrl_gpio; | ||
|
||
enum ktd2692_led_mode mode; | ||
enum led_brightness torch_brightness; | ||
|
@@ -92,67 +90,6 @@ static struct ktd2692_context *fled_cdev_to_led( | |
return container_of(fled_cdev, struct ktd2692_context, fled_cdev); | ||
} | ||
|
||
static void ktd2692_expresswire_start(struct ktd2692_context *led) | ||
{ | ||
gpiod_direction_output(led->ctrl_gpio, KTD2692_HIGH); | ||
udelay(KTD2692_TIME_DATA_START_TIME_US); | ||
} | ||
|
||
static void ktd2692_expresswire_reset(struct ktd2692_context *led) | ||
{ | ||
gpiod_direction_output(led->ctrl_gpio, KTD2692_LOW); | ||
udelay(KTD2692_TIME_RESET_US); | ||
} | ||
|
||
static void ktd2692_expresswire_end(struct ktd2692_context *led) | ||
{ | ||
gpiod_direction_output(led->ctrl_gpio, KTD2692_LOW); | ||
udelay(KTD2692_TIME_LOW_END_OF_DATA_US); | ||
gpiod_direction_output(led->ctrl_gpio, KTD2692_HIGH); | ||
udelay(KTD2692_TIME_HIGH_END_OF_DATA_US); | ||
} | ||
|
||
static void ktd2692_expresswire_set_bit(struct ktd2692_context *led, bool bit) | ||
{ | ||
/* | ||
* The Low Bit(0) and High Bit(1) is based on a time detection | ||
* algorithm between time low and time high | ||
* Time_(L_LB) : Low time of the Low Bit(0) | ||
* Time_(H_LB) : High time of the LOW Bit(0) | ||
* Time_(L_HB) : Low time of the High Bit(1) | ||
* Time_(H_HB) : High time of the High Bit(1) | ||
* | ||
* It can be simplified to: | ||
* Low Bit(0) : 2 * Time_(H_LB) < Time_(L_LB) | ||
* High Bit(1) : 2 * Time_(L_HB) < Time_(H_HB) | ||
* HIGH ___ ____ _.. _________ ___ | ||
* |_________| |_.. |____| |__| | ||
* LOW <L_LB> <H_LB> <L_HB> <H_HB> | ||
* [ Low Bit (0) ] [ High Bit(1) ] | ||
*/ | ||
if (bit) { | ||
gpiod_direction_output(led->ctrl_gpio, KTD2692_LOW); | ||
udelay(KTD2692_TIME_SHORT_BITSET_US); | ||
gpiod_direction_output(led->ctrl_gpio, KTD2692_HIGH); | ||
udelay(KTD2692_TIME_LONG_BITSET_US); | ||
} else { | ||
gpiod_direction_output(led->ctrl_gpio, KTD2692_LOW); | ||
udelay(KTD2692_TIME_LONG_BITSET_US); | ||
gpiod_direction_output(led->ctrl_gpio, KTD2692_HIGH); | ||
udelay(KTD2692_TIME_SHORT_BITSET_US); | ||
} | ||
} | ||
|
||
static void ktd2692_expresswire_write(struct ktd2692_context *led, u8 value) | ||
{ | ||
int i; | ||
|
||
ktd2692_expresswire_start(led); | ||
for (i = 7; i >= 0; i--) | ||
ktd2692_expresswire_set_bit(led, value & BIT(i)); | ||
ktd2692_expresswire_end(led); | ||
} | ||
|
||
static int ktd2692_led_brightness_set(struct led_classdev *led_cdev, | ||
enum led_brightness brightness) | ||
{ | ||
|
@@ -163,14 +100,14 @@ static int ktd2692_led_brightness_set(struct led_classdev *led_cdev, | |
|
||
if (brightness == LED_OFF) { | ||
led->mode = KTD2692_MODE_DISABLE; | ||
gpiod_direction_output(led->aux_gpio, KTD2692_LOW); | ||
gpiod_direction_output(led->aux_gpio, 0); | ||
} else { | ||
ktd2692_expresswire_write(led, brightness | | ||
expresswire_write_u8(&led->props, brightness | | ||
KTD2692_REG_MOVIE_CURRENT_BASE); | ||
led->mode = KTD2692_MODE_MOVIE; | ||
} | ||
|
||
ktd2692_expresswire_write(led, led->mode | KTD2692_REG_MODE_BASE); | ||
expresswire_write_u8(&led->props, led->mode | KTD2692_REG_MODE_BASE); | ||
mutex_unlock(&led->lock); | ||
|
||
return 0; | ||
|
@@ -187,17 +124,17 @@ static int ktd2692_led_flash_strobe_set(struct led_classdev_flash *fled_cdev, | |
|
||
if (state) { | ||
flash_tm_reg = GET_TIMEOUT_OFFSET(timeout->val, timeout->step); | ||
ktd2692_expresswire_write(led, flash_tm_reg | ||
expresswire_write_u8(&led->props, flash_tm_reg | ||
| KTD2692_REG_FLASH_TIMEOUT_BASE); | ||
|
||
led->mode = KTD2692_MODE_FLASH; | ||
gpiod_direction_output(led->aux_gpio, KTD2692_HIGH); | ||
gpiod_direction_output(led->aux_gpio, 1); | ||
} else { | ||
led->mode = KTD2692_MODE_DISABLE; | ||
gpiod_direction_output(led->aux_gpio, KTD2692_LOW); | ||
gpiod_direction_output(led->aux_gpio, 0); | ||
} | ||
|
||
ktd2692_expresswire_write(led, led->mode | KTD2692_REG_MODE_BASE); | ||
expresswire_write_u8(&led->props, led->mode | KTD2692_REG_MODE_BASE); | ||
|
||
fled_cdev->led_cdev.brightness = LED_OFF; | ||
led->mode = KTD2692_MODE_DISABLE; | ||
|
@@ -247,12 +184,12 @@ static void ktd2692_init_flash_timeout(struct led_classdev_flash *fled_cdev, | |
static void ktd2692_setup(struct ktd2692_context *led) | ||
{ | ||
led->mode = KTD2692_MODE_DISABLE; | ||
ktd2692_expresswire_reset(led); | ||
gpiod_direction_output(led->aux_gpio, KTD2692_LOW); | ||
expresswire_power_off(&led->props); | ||
gpiod_direction_output(led->aux_gpio, 0); | ||
|
||
ktd2692_expresswire_write(led, (KTD2692_MM_MIN_CURR_THRESHOLD_SCALE - 1) | ||
expresswire_write_u8(&led->props, (KTD2692_MM_MIN_CURR_THRESHOLD_SCALE - 1) | ||
| KTD2692_REG_MM_MIN_CURR_THRESHOLD_BASE); | ||
ktd2692_expresswire_write(led, KTD2692_FLASH_MODE_CURR_PERCENT(45) | ||
expresswire_write_u8(&led->props, KTD2692_FLASH_MODE_CURR_PERCENT(45) | ||
| KTD2692_REG_FLASH_CURRENT_BASE); | ||
} | ||
|
||
|
@@ -277,8 +214,8 @@ static int ktd2692_parse_dt(struct ktd2692_context *led, struct device *dev, | |
if (!np) | ||
return -ENXIO; | ||
|
||
led->ctrl_gpio = devm_gpiod_get(dev, "ctrl", GPIOD_ASIS); | ||
ret = PTR_ERR_OR_ZERO(led->ctrl_gpio); | ||
led->props.ctrl_gpio = devm_gpiod_get(dev, "ctrl", GPIOD_ASIS); | ||
ret = PTR_ERR_OR_ZERO(led->props.ctrl_gpio); | ||
if (ret) | ||
return dev_err_probe(dev, ret, "cannot get ctrl-gpios\n"); | ||
|
||
|
@@ -412,6 +349,7 @@ static struct platform_driver ktd2692_driver = { | |
|
||
module_platform_driver(ktd2692_driver); | ||
|
||
MODULE_IMPORT_NS(EXPRESSWIRE); | ||
MODULE_AUTHOR("Ingi Kim <[email protected]>"); | ||
MODULE_DESCRIPTION("Kinetic KTD2692 LED driver"); | ||
MODULE_LICENSE("GPL v2"); |
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,72 @@ | ||
// SPDX-License-Identifier: GPL-2.0-only | ||
/* | ||
* Shared library for Kinetic's ExpressWire protocol. | ||
* This protocol works by pulsing the ExpressWire IC's control GPIO. | ||
* ktd2692 and ktd2801 are known to use this protocol. | ||
*/ | ||
|
||
#include <linux/bits.h> | ||
#include <linux/delay.h> | ||
#include <linux/export.h> | ||
#include <linux/gpio/consumer.h> | ||
#include <linux/types.h> | ||
|
||
#include <linux/leds-expresswire.h> | ||
|
||
void expresswire_power_off(struct expresswire_common_props *props) | ||
{ | ||
gpiod_set_value_cansleep(props->ctrl_gpio, 0); | ||
usleep_range(props->timing.poweroff_us, props->timing.poweroff_us * 2); | ||
} | ||
EXPORT_SYMBOL_NS_GPL(expresswire_power_off, EXPRESSWIRE); | ||
|
||
void expresswire_enable(struct expresswire_common_props *props) | ||
{ | ||
gpiod_set_value(props->ctrl_gpio, 1); | ||
udelay(props->timing.detect_delay_us); | ||
gpiod_set_value(props->ctrl_gpio, 0); | ||
udelay(props->timing.detect_us); | ||
gpiod_set_value(props->ctrl_gpio, 1); | ||
} | ||
EXPORT_SYMBOL_NS_GPL(expresswire_enable, EXPRESSWIRE); | ||
|
||
void expresswire_start(struct expresswire_common_props *props) | ||
{ | ||
gpiod_set_value(props->ctrl_gpio, 1); | ||
udelay(props->timing.data_start_us); | ||
} | ||
EXPORT_SYMBOL_NS_GPL(expresswire_start, EXPRESSWIRE); | ||
|
||
void expresswire_end(struct expresswire_common_props *props) | ||
{ | ||
gpiod_set_value(props->ctrl_gpio, 0); | ||
udelay(props->timing.end_of_data_low_us); | ||
gpiod_set_value(props->ctrl_gpio, 1); | ||
udelay(props->timing.end_of_data_high_us); | ||
} | ||
EXPORT_SYMBOL_NS_GPL(expresswire_end, EXPRESSWIRE); | ||
|
||
void expresswire_set_bit(struct expresswire_common_props *props, bool bit) | ||
{ | ||
if (bit) { | ||
gpiod_set_value(props->ctrl_gpio, 0); | ||
udelay(props->timing.short_bitset_us); | ||
gpiod_set_value(props->ctrl_gpio, 1); | ||
udelay(props->timing.long_bitset_us); | ||
} else { | ||
gpiod_set_value(props->ctrl_gpio, 0); | ||
udelay(props->timing.long_bitset_us); | ||
gpiod_set_value(props->ctrl_gpio, 1); | ||
udelay(props->timing.short_bitset_us); | ||
} | ||
} | ||
EXPORT_SYMBOL_NS_GPL(expresswire_set_bit, EXPRESSWIRE); | ||
|
||
void expresswire_write_u8(struct expresswire_common_props *props, u8 val) | ||
{ | ||
expresswire_start(props); | ||
for (int i = 7; i >= 0; i--) | ||
expresswire_set_bit(props, val & BIT(i)); | ||
expresswire_end(props); | ||
} | ||
EXPORT_SYMBOL_NS_GPL(expresswire_write_u8, EXPRESSWIRE); |
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
Oops, something went wrong.