Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
888cd6e7
Commit
888cd6e7
authored
Mar 07, 2024
by
Lee Jones
Browse files
Options
Browse Files
Download
Plain Diff
Merge branches 'ib-qcom-leds-6.9' and 'ib-leds-backlight-6.9' into ibs-for-leds-merged
parents
5b2dd77b
7774f3d1
Changes
11
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
341 additions
and
90 deletions
+341
-90
Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
...n/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
+46
-0
MAINTAINERS
MAINTAINERS
+13
-0
drivers/leds/Kconfig
drivers/leds/Kconfig
+4
-0
drivers/leds/Makefile
drivers/leds/Makefile
+3
-0
drivers/leds/flash/Kconfig
drivers/leds/flash/Kconfig
+2
-1
drivers/leds/flash/leds-ktd2692.c
drivers/leds/flash/leds-ktd2692.c
+27
-89
drivers/leds/leds-expresswire.c
drivers/leds/leds-expresswire.c
+72
-0
drivers/video/backlight/Kconfig
drivers/video/backlight/Kconfig
+7
-0
drivers/video/backlight/Makefile
drivers/video/backlight/Makefile
+1
-0
drivers/video/backlight/ktd2801-backlight.c
drivers/video/backlight/ktd2801-backlight.c
+128
-0
include/linux/leds-expresswire.h
include/linux/leds-expresswire.h
+38
-0
No files found.
Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
0 → 100644
View file @
888cd6e7
# 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ć <duje.mihanovic@skole.hr>
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>;
};
MAINTAINERS
View file @
888cd6e7
...
...
@@ -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ć <duje.mihanovic@skole.hr>
L: linux-leds@vger.kernel.org
S: Maintained
F: drivers/leds/leds-expresswire.c
F: include/linux/leds-expresswire.h
EXT2 FILE SYSTEM
M: Jan Kara <jack@suse.com>
L: linux-ext4@vger.kernel.org
...
...
@@ -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ć <duje.mihanovic@skole.hr>
S: Maintained
F: Documentation/devicetree/bindings/leds/backlight/kinetic,ktd2801.yaml
F: drivers/video/backlight/ktd2801-backlight.c
KTEST
M: Steven Rostedt <rostedt@goodmis.org>
M: John Hawley <warthog9@eaglescrag.net>
...
...
drivers/leds/Kconfig
View file @
888cd6e7
...
...
@@ -186,6 +186,10 @@ config LEDS_EL15203000
To compile this driver as a module, choose M here: the module
will be called leds-el15203000.
config LEDS_EXPRESSWIRE
bool
depends on GPIOLIB
config LEDS_TURRIS_OMNIA
tristate "LED support for CZ.NIC's Turris Omnia"
depends on LEDS_CLASS_MULTICOLOR
...
...
drivers/leds/Makefile
View file @
888cd6e7
...
...
@@ -91,6 +91,9 @@ obj-$(CONFIG_LEDS_WM831X_STATUS) += leds-wm831x-status.o
obj-$(CONFIG_LEDS_WM8350)
+=
leds-wm8350.o
obj-$(CONFIG_LEDS_WRAP)
+=
leds-wrap.o
# Kinetic ExpressWire Protocol
obj-$(CONFIG_LEDS_EXPRESSWIRE)
+=
leds-expresswire.o
# LED SPI Drivers
obj-$(CONFIG_LEDS_CR0014114)
+=
leds-cr0014114.o
obj-$(CONFIG_LEDS_DAC124S085)
+=
leds-dac124s085.o
...
...
drivers/leds/flash/Kconfig
View file @
888cd6e7
...
...
@@ -23,7 +23,8 @@ config LEDS_AS3645A
config LEDS_KTD2692
tristate "LED support for Kinetic KTD2692 flash LED controller"
depends on OF
depends on GPIOLIB || COMPILE_TEST
depends on GPIOLIB
select LEDS_EXPRESSWIRE
help
This option enables support for Kinetic KTD2692 LED flash connected
through ExpressWire interface.
...
...
drivers/leds/flash/leds-ktd2692.c
View file @
888cd6e7
...
...
@@ -6,9 +6,9 @@
* Ingi Kim <ingi2.kim@samsung.com>
*/
#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 <ingi2.kim@samsung.com>"
);
MODULE_DESCRIPTION
(
"Kinetic KTD2692 LED driver"
);
MODULE_LICENSE
(
"GPL v2"
);
drivers/leds/leds-expresswire.c
0 → 100644
View file @
888cd6e7
// 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
);
drivers/video/backlight/Kconfig
View file @
888cd6e7
...
...
@@ -183,6 +183,13 @@ config BACKLIGHT_KTD253
which is a 1-wire GPIO-controlled backlight found in some mobile
phones.
config BACKLIGHT_KTD2801
tristate "Backlight Driver for Kinetic KTD2801"
select LEDS_EXPRESSWIRE
help
Say Y to enable the backlight driver for the Kinetic KTD2801 1-wire
GPIO-controlled backlight found in Samsung Galaxy Core Prime VE LTE.
config BACKLIGHT_KTZ8866
tristate "Backlight Driver for Kinetic KTZ8866"
depends on I2C
...
...
drivers/video/backlight/Makefile
View file @
888cd6e7
...
...
@@ -34,6 +34,7 @@ obj-$(CONFIG_BACKLIGHT_HP680) += hp680_bl.o
obj-$(CONFIG_BACKLIGHT_HP700)
+=
jornada720_bl.o
obj-$(CONFIG_BACKLIGHT_IPAQ_MICRO)
+=
ipaq_micro_bl.o
obj-$(CONFIG_BACKLIGHT_KTD253)
+=
ktd253-backlight.o
obj-$(CONFIG_BACKLIGHT_KTD2801)
+=
ktd2801-backlight.o
obj-$(CONFIG_BACKLIGHT_KTZ8866)
+=
ktz8866.o
obj-$(CONFIG_BACKLIGHT_LM3533)
+=
lm3533_bl.o
obj-$(CONFIG_BACKLIGHT_LM3630A)
+=
lm3630a_bl.o
...
...
drivers/video/backlight/ktd2801-backlight.c
0 → 100644
View file @
888cd6e7
// SPDX-License-Identifier: GPL-2.0-only
/*
* Datasheet:
* https://www.kinet-ic.com/uploads/web/KTD2801/KTD2801-04b.pdf
*/
#include <linux/backlight.h>
#include <linux/gpio/consumer.h>
#include <linux/leds-expresswire.h>
#include <linux/platform_device.h>
#include <linux/property.h>
#define KTD2801_DEFAULT_BRIGHTNESS 100
#define KTD2801_MAX_BRIGHTNESS 255
/* These values have been extracted from Samsung's driver. */
static
const
struct
expresswire_timing
ktd2801_timing
=
{
.
poweroff_us
=
2600
,
.
detect_delay_us
=
150
,
.
detect_us
=
270
,
.
data_start_us
=
5
,
.
short_bitset_us
=
5
,
.
long_bitset_us
=
15
,
.
end_of_data_low_us
=
10
,
.
end_of_data_high_us
=
350
};
struct
ktd2801_backlight
{
struct
expresswire_common_props
props
;
struct
backlight_device
*
bd
;
bool
was_on
;
};
static
int
ktd2801_update_status
(
struct
backlight_device
*
bd
)
{
struct
ktd2801_backlight
*
ktd2801
=
bl_get_data
(
bd
);
u8
brightness
=
(
u8
)
backlight_get_brightness
(
bd
);
if
(
backlight_is_blank
(
bd
))
{
expresswire_power_off
(
&
ktd2801
->
props
);
ktd2801
->
was_on
=
false
;
return
0
;
}
if
(
!
ktd2801
->
was_on
)
{
expresswire_enable
(
&
ktd2801
->
props
);
ktd2801
->
was_on
=
true
;
}
expresswire_write_u8
(
&
ktd2801
->
props
,
brightness
);
return
0
;
}
static
const
struct
backlight_ops
ktd2801_backlight_ops
=
{
.
update_status
=
ktd2801_update_status
,
};
static
int
ktd2801_backlight_probe
(
struct
platform_device
*
pdev
)
{
struct
device
*
dev
=
&
pdev
->
dev
;
struct
backlight_device
*
bd
;
struct
ktd2801_backlight
*
ktd2801
;
u32
brightness
,
max_brightness
;
int
ret
;
ktd2801
=
devm_kzalloc
(
dev
,
sizeof
(
*
ktd2801
),
GFP_KERNEL
);
if
(
!
ktd2801
)
return
-
ENOMEM
;
ktd2801
->
was_on
=
true
;
ktd2801
->
props
.
timing
=
ktd2801_timing
;
ret
=
device_property_read_u32
(
dev
,
"max-brightness"
,
&
max_brightness
);
if
(
ret
)
max_brightness
=
KTD2801_MAX_BRIGHTNESS
;
if
(
max_brightness
>
KTD2801_MAX_BRIGHTNESS
)
{
dev_err
(
dev
,
"illegal max brightness specified
\n
"
);
max_brightness
=
KTD2801_MAX_BRIGHTNESS
;
}
ret
=
device_property_read_u32
(
dev
,
"default-brightness"
,
&
brightness
);
if
(
ret
)
brightness
=
KTD2801_DEFAULT_BRIGHTNESS
;
if
(
brightness
>
max_brightness
)
{
dev_err
(
dev
,
"default brightness exceeds max
\n
"
);
brightness
=
max_brightness
;
}
ktd2801
->
props
.
ctrl_gpio
=
devm_gpiod_get
(
dev
,
"ctrl"
,
GPIOD_OUT_HIGH
);
if
(
IS_ERR
(
ktd2801
->
props
.
ctrl_gpio
))
return
dev_err_probe
(
dev
,
PTR_ERR
(
ktd2801
->
props
.
ctrl_gpio
),
"failed to get backlight GPIO"
);
gpiod_set_consumer_name
(
ktd2801
->
props
.
ctrl_gpio
,
dev_name
(
dev
));
bd
=
devm_backlight_device_register
(
dev
,
dev_name
(
dev
),
dev
,
ktd2801
,
&
ktd2801_backlight_ops
,
NULL
);
if
(
IS_ERR
(
bd
))
return
dev_err_probe
(
dev
,
PTR_ERR
(
bd
),
"failed to register backlight"
);
bd
->
props
.
max_brightness
=
max_brightness
;
bd
->
props
.
brightness
=
brightness
;
ktd2801
->
bd
=
bd
;
platform_set_drvdata
(
pdev
,
bd
);
backlight_update_status
(
bd
);
return
0
;
}
static
const
struct
of_device_id
ktd2801_of_match
[]
=
{
{
.
compatible
=
"kinetic,ktd2801"
},
{
}
};
MODULE_DEVICE_TABLE
(
of
,
ktd2801_of_match
);
static
struct
platform_driver
ktd2801_backlight_driver
=
{
.
driver
=
{
.
name
=
"ktd2801-backlight"
,
.
of_match_table
=
ktd2801_of_match
,
},
.
probe
=
ktd2801_backlight_probe
,
};
module_platform_driver
(
ktd2801_backlight_driver
);
MODULE_IMPORT_NS
(
EXPRESSWIRE
);
MODULE_AUTHOR
(
"Duje Mihanović <duje.mihanovic@skole.hr>"
);
MODULE_DESCRIPTION
(
"Kinetic KTD2801 Backlight Driver"
);
MODULE_LICENSE
(
"GPL"
);
include/linux/leds-expresswire.h
0 → 100644
View file @
888cd6e7
/* 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.
*/
#ifndef _LEDS_EXPRESSWIRE_H
#define _LEDS_EXPRESSWIRE_H
#include <linux/types.h>
struct
gpio_desc
;
struct
expresswire_timing
{
unsigned
long
poweroff_us
;
unsigned
long
detect_delay_us
;
unsigned
long
detect_us
;
unsigned
long
data_start_us
;
unsigned
long
end_of_data_low_us
;
unsigned
long
end_of_data_high_us
;
unsigned
long
short_bitset_us
;
unsigned
long
long_bitset_us
;
};
struct
expresswire_common_props
{
struct
gpio_desc
*
ctrl_gpio
;
struct
expresswire_timing
timing
;
};
void
expresswire_power_off
(
struct
expresswire_common_props
*
props
);
void
expresswire_enable
(
struct
expresswire_common_props
*
props
);
void
expresswire_start
(
struct
expresswire_common_props
*
props
);
void
expresswire_end
(
struct
expresswire_common_props
*
props
);
void
expresswire_set_bit
(
struct
expresswire_common_props
*
props
,
bool
bit
);
void
expresswire_write_u8
(
struct
expresswire_common_props
*
props
,
u8
val
);
#endif
/* _LEDS_EXPRESSWIRE_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment