Commit 38984d78 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'backlight-next-6.7' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight

Pull backlight updates from Lee Jones:
 "New Functionality:

   - Add new Device Tree binding for Monolithic Power (MPS) MP3309C
     step-up converter

   - Document brightness-levels in bindings for; generic, LED and PWM

  Bug Fixes:

   - Ensure PWMs are disabled on .shutdown(), .suspend() and .remove()"

* tag 'backlight-next-6.7' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight:
  dt-bindings: backlight: Add brightness-levels related common properties
  backlight: pwm_bl: Disable PWM on shutdown, suspend and remove
  dt-bindings: backlight: Add MPS MP3309C
parents 27bc0782 d5272d39
...@@ -33,4 +33,21 @@ properties: ...@@ -33,4 +33,21 @@ properties:
due to restrictions in a specific system, such as mounting conditions. due to restrictions in a specific system, such as mounting conditions.
$ref: /schemas/types.yaml#/definitions/uint32 $ref: /schemas/types.yaml#/definitions/uint32
brightness-levels:
description:
Array of distinct brightness levels. The levels must be in the range
accepted by the underlying LED device. Typically these are in the range
from 0 to 255, but any range starting at 0 will do, as long as they are
accepted by the LED.
The 0 value means a 0% of brightness (darkest/off), while the last value
in the array represents a full 100% brightness (brightest).
If this array is not provided, the driver default mapping is used.
$ref: /schemas/types.yaml#/definitions/uint32-array
default-brightness-level:
description:
The default brightness level (index into the array defined by the
"brightness-levels" property).
$ref: /schemas/types.yaml#/definitions/uint32
additionalProperties: true additionalProperties: true
...@@ -16,6 +16,9 @@ description: ...@@ -16,6 +16,9 @@ description:
can also be used to describe a backlight device controlled by the output of can also be used to describe a backlight device controlled by the output of
a LED driver. a LED driver.
allOf:
- $ref: common.yaml#
properties: properties:
compatible: compatible:
const: led-backlight const: led-backlight
...@@ -26,25 +29,11 @@ properties: ...@@ -26,25 +29,11 @@ properties:
items: items:
maxItems: 1 maxItems: 1
brightness-levels:
description:
Array of distinct brightness levels. The levels must be in the range
accepted by the underlying LED devices. This is used to translate a
backlight brightness level into a LED brightness level. If it is not
provided, the identity mapping is used.
$ref: /schemas/types.yaml#/definitions/uint32-array
default-brightness-level:
description:
The default brightness level (index into the array defined by the
"brightness-levels" property).
$ref: /schemas/types.yaml#/definitions/uint32
required: required:
- compatible - compatible
- leds - leds
additionalProperties: false unevaluatedProperties: false
examples: examples:
- | - |
......
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/leds/backlight/mps,mp3309c.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: MPS MP3309C backlight
maintainers:
- Flavio Suligoi <f.suligoi@asem.it>
description: |
The Monolithic Power (MPS) MP3309C is a WLED step-up converter, featuring a
programmable switching frequency to optimize efficiency.
It supports two different dimming modes:
- analog mode, via I2C commands (default)
- PWM controlled mode.
The datasheet is available at:
https://www.monolithicpower.com/en/mp3309c.html
allOf:
- $ref: common.yaml#
properties:
compatible:
const: mps,mp3309c
reg:
maxItems: 1
pwms:
description: if present, the backlight is controlled in PWM mode.
maxItems: 1
enable-gpios:
description: GPIO used to enable the backlight in "analog-i2c" dimming mode.
maxItems: 1
mps,overvoltage-protection-microvolt:
description: Overvoltage protection (13.5V, 24V or 35.5V).
enum: [ 13500000, 24000000, 35500000 ]
default: 35500000
mps,no-sync-mode:
description: disable synchronous rectification mode
type: boolean
required:
- compatible
- reg
- max-brightness
- default-brightness
unevaluatedProperties: false
examples:
- |
i2c {
#address-cells = <1>;
#size-cells = <0>;
/* Backlight with PWM control */
backlight_pwm: backlight@17 {
compatible = "mps,mp3309c";
reg = <0x17>;
pwms = <&pwm1 0 3333333 0>; /* 300 Hz --> (1/f) * 1*10^9 */
max-brightness = <100>;
default-brightness = <80>;
mps,overvoltage-protection-microvolt = <24000000>;
};
};
...@@ -11,6 +11,9 @@ maintainers: ...@@ -11,6 +11,9 @@ maintainers:
- Daniel Thompson <daniel.thompson@linaro.org> - Daniel Thompson <daniel.thompson@linaro.org>
- Jingoo Han <jingoohan1@gmail.com> - Jingoo Han <jingoohan1@gmail.com>
allOf:
- $ref: common.yaml#
properties: properties:
compatible: compatible:
const: pwm-backlight const: pwm-backlight
...@@ -39,21 +42,6 @@ properties: ...@@ -39,21 +42,6 @@ properties:
Delay in ms between disabling the backlight using GPIO and setting PWM Delay in ms between disabling the backlight using GPIO and setting PWM
value to 0. value to 0.
brightness-levels:
description:
Array of distinct brightness levels. Typically these are in the range
from 0 to 255, but any range starting at 0 will do. The actual brightness
level (PWM duty cycle) will be interpolated from these values. 0 means a
0% duty cycle (darkest/off), while the last value in the array represents
a 100% duty cycle (brightest).
$ref: /schemas/types.yaml#/definitions/uint32-array
default-brightness-level:
description:
The default brightness level (index into the array defined by the
"brightness-levels" property).
$ref: /schemas/types.yaml#/definitions/uint32
num-interpolated-steps: num-interpolated-steps:
description: description:
Number of interpolated steps between each value of brightness-levels Number of interpolated steps between each value of brightness-levels
...@@ -69,7 +57,7 @@ required: ...@@ -69,7 +57,7 @@ required:
- compatible - compatible
- pwms - pwms
additionalProperties: false unevaluatedProperties: false
examples: examples:
- | - |
......
...@@ -626,9 +626,14 @@ static void pwm_backlight_remove(struct platform_device *pdev) ...@@ -626,9 +626,14 @@ static void pwm_backlight_remove(struct platform_device *pdev)
{ {
struct backlight_device *bl = platform_get_drvdata(pdev); struct backlight_device *bl = platform_get_drvdata(pdev);
struct pwm_bl_data *pb = bl_get_data(bl); struct pwm_bl_data *pb = bl_get_data(bl);
struct pwm_state state;
backlight_device_unregister(bl); backlight_device_unregister(bl);
pwm_backlight_power_off(pb); pwm_backlight_power_off(pb);
pwm_get_state(pb->pwm, &state);
state.duty_cycle = 0;
state.enabled = false;
pwm_apply_state(pb->pwm, &state);
if (pb->exit) if (pb->exit)
pb->exit(&pdev->dev); pb->exit(&pdev->dev);
...@@ -638,8 +643,13 @@ static void pwm_backlight_shutdown(struct platform_device *pdev) ...@@ -638,8 +643,13 @@ static void pwm_backlight_shutdown(struct platform_device *pdev)
{ {
struct backlight_device *bl = platform_get_drvdata(pdev); struct backlight_device *bl = platform_get_drvdata(pdev);
struct pwm_bl_data *pb = bl_get_data(bl); struct pwm_bl_data *pb = bl_get_data(bl);
struct pwm_state state;
pwm_backlight_power_off(pb); pwm_backlight_power_off(pb);
pwm_get_state(pb->pwm, &state);
state.duty_cycle = 0;
state.enabled = false;
pwm_apply_state(pb->pwm, &state);
} }
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
...@@ -647,12 +657,24 @@ static int pwm_backlight_suspend(struct device *dev) ...@@ -647,12 +657,24 @@ static int pwm_backlight_suspend(struct device *dev)
{ {
struct backlight_device *bl = dev_get_drvdata(dev); struct backlight_device *bl = dev_get_drvdata(dev);
struct pwm_bl_data *pb = bl_get_data(bl); struct pwm_bl_data *pb = bl_get_data(bl);
struct pwm_state state;
if (pb->notify) if (pb->notify)
pb->notify(pb->dev, 0); pb->notify(pb->dev, 0);
pwm_backlight_power_off(pb); pwm_backlight_power_off(pb);
/*
* Note that disabling the PWM doesn't guarantee that the output stays
* at its inactive state. However without the PWM disabled, the PWM
* driver refuses to suspend. So disable here even though this might
* enable the backlight on poorly designed boards.
*/
pwm_get_state(pb->pwm, &state);
state.duty_cycle = 0;
state.enabled = false;
pwm_apply_state(pb->pwm, &state);
if (pb->notify_after) if (pb->notify_after)
pb->notify_after(pb->dev, 0); pb->notify_after(pb->dev, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment