summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/leds/leds-lp5860.yaml7
-rw-r--r--Documentation/devicetree/bindings/leds/sprd,sc2731-bltc.yaml7
-rw-r--r--drivers/leds/Kconfig1
-rw-r--r--drivers/leds/blink/leds-lgm-sso.c4
-rw-r--r--drivers/leds/flash/leds-ktd2692.c2
-rw-r--r--drivers/leds/led-class-multicolor.c4
-rw-r--r--drivers/leds/led-class.c5
-rw-r--r--drivers/leds/led-core.c20
-rw-r--r--drivers/leds/leds-lm3642.c18
-rw-r--r--drivers/leds/leds-lp5569.c4
-rw-r--r--drivers/leds/leds-lp8860.c111
-rw-r--r--drivers/leds/rgb/leds-qcom-lpg.c7
-rw-r--r--drivers/leds/trigger/ledtrig-tty.c2
13 files changed, 98 insertions, 94 deletions
diff --git a/Documentation/devicetree/bindings/leds/leds-lp5860.yaml b/Documentation/devicetree/bindings/leds/leds-lp5860.yaml
index 1ccba4854159..0e88c71c2d39 100644
--- a/Documentation/devicetree/bindings/leds/leds-lp5860.yaml
+++ b/Documentation/devicetree/bindings/leds/leds-lp5860.yaml
@@ -33,6 +33,11 @@ properties:
'#size-cells':
const: 0
+ enable-gpios:
+ maxItems: 1
+ description: |
+ GPIO attached to the chip's enable pin (VIO_EN).
+
patternProperties:
'^multi-led@[0-9a-f]+$':
type: object
@@ -74,6 +79,7 @@ unevaluatedProperties: false
examples:
- |
+ #include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/leds/common.h>
spi {
@@ -83,6 +89,7 @@ examples:
led-controller@0 {
compatible = "ti,lp5860";
reg = <0x0>;
+ enable-gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
diff --git a/Documentation/devicetree/bindings/leds/sprd,sc2731-bltc.yaml b/Documentation/devicetree/bindings/leds/sprd,sc2731-bltc.yaml
index 97535d6dc47a..2ae5cc31e623 100644
--- a/Documentation/devicetree/bindings/leds/sprd,sc2731-bltc.yaml
+++ b/Documentation/devicetree/bindings/leds/sprd,sc2731-bltc.yaml
@@ -18,7 +18,12 @@ description: |
properties:
compatible:
- const: sprd,sc2731-bltc
+ oneOf:
+ - items:
+ - enum:
+ - sprd,sc2730-bltc
+ - const: sprd,sc2731-bltc
+ - const: sprd,sc2731-bltc
reg:
maxItems: 1
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
index 597d7a79c988..f4a0a3c8c870 100644
--- a/drivers/leds/Kconfig
+++ b/drivers/leds/Kconfig
@@ -765,7 +765,6 @@ config LEDS_NETXBIG
tristate "LED support for Big Network series LEDs"
depends on LEDS_CLASS
depends on MACH_KIRKWOOD || COMPILE_TEST
- depends on OF_GPIO
default MACH_KIRKWOOD
help
This option enables support for LEDs found on the LaCie 2Big
diff --git a/drivers/leds/blink/leds-lgm-sso.c b/drivers/leds/blink/leds-lgm-sso.c
index 8923d2df4704..0f27c68e2741 100644
--- a/drivers/leds/blink/leds-lgm-sso.c
+++ b/drivers/leds/blink/leds-lgm-sso.c
@@ -25,7 +25,7 @@
#define LED_BLINK_H8_0 0x0
#define LED_BLINK_H8_1 0x4
#define GET_FREQ_OFFSET(pin, src) (((pin) * 6) + ((src) * 2))
-#define GET_SRC_OFFSET(pinc) (((pin) * 6) + 4)
+#define GET_SRC_OFFSET(pin) (((pin) * 6) + 4)
#define DUTY_CYCLE(x) (0x8 + ((x) * 4))
#define SSO_CON0 0x2B0
@@ -809,8 +809,6 @@ static int intel_sso_led_probe(struct platform_device *pdev)
priv->fpid_clkrate = clk_get_rate(priv->clocks[1].clk);
priv->mmap = syscon_node_to_regmap(dev->of_node);
-
- priv->mmap = syscon_node_to_regmap(dev->of_node);
if (IS_ERR(priv->mmap)) {
dev_err(dev, "Failed to map iomem!\n");
return PTR_ERR(priv->mmap);
diff --git a/drivers/leds/flash/leds-ktd2692.c b/drivers/leds/flash/leds-ktd2692.c
index 0f16eefcfe4c..22fbfccd4873 100644
--- a/drivers/leds/flash/leds-ktd2692.c
+++ b/drivers/leds/flash/leds-ktd2692.c
@@ -59,7 +59,7 @@ struct ktd2692_led_config_data {
enum led_brightness max_brightness;
};
-const struct expresswire_timing ktd2692_timing = {
+static const struct expresswire_timing ktd2692_timing = {
.poweroff_us = 700,
.data_start_us = 10,
.end_of_data_low_us = 10,
diff --git a/drivers/leds/led-class-multicolor.c b/drivers/leds/led-class-multicolor.c
index fd66d2bdeace..6b671f3f9c61 100644
--- a/drivers/leds/led-class-multicolor.c
+++ b/drivers/leds/led-class-multicolor.c
@@ -34,14 +34,14 @@ static ssize_t multi_intensity_store(struct device *dev,
struct led_classdev *led_cdev = dev_get_drvdata(dev);
struct led_classdev_mc *mcled_cdev = lcdev_to_mccdev(led_cdev);
int nrchars, offset = 0;
- int intensity_value[LED_COLOR_ID_MAX];
+ unsigned int intensity_value[LED_COLOR_ID_MAX];
int i;
ssize_t ret;
mutex_lock(&led_cdev->led_access);
for (i = 0; i < mcled_cdev->num_colors; i++) {
- ret = sscanf(buf + offset, "%i%n",
+ ret = sscanf(buf + offset, "%u%n",
&intensity_value[i], &nrchars);
if (ret != 1) {
ret = -EINVAL;
diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c
index d34a19453560..9e14ae588f78 100644
--- a/drivers/leds/led-class.c
+++ b/drivers/leds/led-class.c
@@ -273,7 +273,7 @@ static struct led_classdev *of_led_get(struct device_node *np, int index,
if (!led_node)
return ERR_PTR(-ENOENT);
- led_dev = class_find_device_by_of_node(&leds_class, led_node);
+ led_dev = class_find_device_by_fwnode(&leds_class, of_fwnode_handle(led_node));
of_node_put(led_node);
return led_module_get(led_dev);
@@ -421,6 +421,9 @@ EXPORT_SYMBOL_GPL(led_add_lookup);
*/
void led_remove_lookup(struct led_lookup_data *led_lookup)
{
+ if (!led_lookup)
+ return;
+
mutex_lock(&leds_lookup_lock);
list_del(&led_lookup->list);
mutex_unlock(&leds_lookup_lock);
diff --git a/drivers/leds/led-core.c b/drivers/leds/led-core.c
index 59473f286b31..385e78af1dac 100644
--- a/drivers/leds/led-core.c
+++ b/drivers/leds/led-core.c
@@ -85,7 +85,7 @@ static void led_timer_function(struct timer_list *t)
if (!brightness) {
/* Time to switch the LED on. */
if (test_and_clear_bit(LED_BLINK_BRIGHTNESS_CHANGE,
- &led_cdev->work_flags))
+ &led_cdev->work_flags))
brightness = led_cdev->new_blink_brightness;
else
brightness = led_cdev->blink_brightness;
@@ -217,10 +217,9 @@ static void led_set_software_blink(struct led_classdev *led_cdev,
mod_timer(&led_cdev->blink_timer, jiffies + 1);
}
-
static void led_blink_setup(struct led_classdev *led_cdev,
- unsigned long *delay_on,
- unsigned long *delay_off)
+ unsigned long *delay_on,
+ unsigned long *delay_off)
{
if (!test_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags) &&
led_cdev->blink_set &&
@@ -262,7 +261,7 @@ void led_blink_set_oneshot(struct led_classdev *led_cdev,
int invert)
{
if (test_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags) &&
- timer_pending(&led_cdev->blink_timer))
+ timer_pending(&led_cdev->blink_timer))
return;
set_bit(LED_BLINK_ONESHOT, &led_cdev->work_flags);
@@ -347,9 +346,9 @@ void led_set_brightness_nopm(struct led_classdev *led_cdev, unsigned int value)
/* Ensure delayed_set_value is seen before work_flags modification */
smp_mb__before_atomic();
- if (value)
+ if (value) {
set_bit(LED_SET_BRIGHTNESS, &led_cdev->work_flags);
- else {
+ } else {
clear_bit(LED_SET_BRIGHTNESS, &led_cdev->work_flags);
clear_bit(LED_SET_BLINK, &led_cdev->work_flags);
set_bit(LED_SET_BRIGHTNESS_OFF, &led_cdev->work_flags);
@@ -499,7 +498,6 @@ static void led_parse_fwnode_props(struct device *dev,
props->color_present = true;
}
-
if (!fwnode_property_present(fwnode, "function"))
return;
@@ -581,8 +579,12 @@ int led_compose_name(struct device *dev, struct led_init_data *init_data,
} else if (is_of_node(fwnode)) {
n = snprintf(led_classdev_name, LED_MAX_NAME_SIZE, "%s",
to_of_node(fwnode)->name);
- } else
+ } else if (is_software_node(fwnode)) {
+ n = snprintf(led_classdev_name, LED_MAX_NAME_SIZE, "%s",
+ fwnode_get_name(fwnode));
+ } else {
return -EINVAL;
+ }
if (n >= LED_MAX_NAME_SIZE)
return -E2BIG;
diff --git a/drivers/leds/leds-lm3642.c b/drivers/leds/leds-lm3642.c
index 61629d5d6703..36246267b096 100644
--- a/drivers/leds/leds-lm3642.c
+++ b/drivers/leds/leds-lm3642.c
@@ -3,15 +3,16 @@
* Simple driver for Texas Instruments LM3642 LED Flash driver chip
* Copyright (C) 2012 Texas Instruments
*/
-#include <linux/module.h>
+#include <linux/cleanup.h>
#include <linux/delay.h>
+#include <linux/fs.h>
#include <linux/i2c.h>
#include <linux/leds.h>
-#include <linux/slab.h>
+#include <linux/module.h>
+#include <linux/platform_data/leds-lm3642.h>
#include <linux/platform_device.h>
-#include <linux/fs.h>
#include <linux/regmap.h>
-#include <linux/platform_data/leds-lm3642.h>
+#include <linux/slab.h>
#define REG_FILT_TIME (0x0)
#define REG_IVFM_MODE (0x1)
@@ -202,10 +203,9 @@ static int lm3642_torch_brightness_set(struct led_classdev *cdev,
container_of(cdev, struct lm3642_chip_data, cdev_torch);
int ret;
- mutex_lock(&chip->lock);
+ guard(mutex)(&chip->lock);
chip->br_torch = brightness;
ret = lm3642_control(chip, chip->br_torch, MODES_TORCH);
- mutex_unlock(&chip->lock);
return ret;
}
@@ -249,10 +249,9 @@ static int lm3642_strobe_brightness_set(struct led_classdev *cdev,
container_of(cdev, struct lm3642_chip_data, cdev_flash);
int ret;
- mutex_lock(&chip->lock);
+ guard(mutex)(&chip->lock);
chip->br_flash = brightness;
ret = lm3642_control(chip, chip->br_flash, MODES_FLASH);
- mutex_unlock(&chip->lock);
return ret;
}
@@ -264,10 +263,9 @@ static int lm3642_indicator_brightness_set(struct led_classdev *cdev,
container_of(cdev, struct lm3642_chip_data, cdev_indicator);
int ret;
- mutex_lock(&chip->lock);
+ guard(mutex)(&chip->lock);
chip->br_indicator = brightness;
ret = lm3642_control(chip, chip->br_indicator, MODES_INDIC);
- mutex_unlock(&chip->lock);
return ret;
}
diff --git a/drivers/leds/leds-lp5569.c b/drivers/leds/leds-lp5569.c
index 786f2aa35319..a252ba6c455d 100644
--- a/drivers/leds/leds-lp5569.c
+++ b/drivers/leds/leds-lp5569.c
@@ -410,12 +410,12 @@ static ssize_t lp5569_selftest(struct device *dev,
/* Test LED Open */
pos = lp5569_led_open_test(led, buf);
if (pos < 0)
- return sprintf(buf, "FAIL\n");
+ return sysfs_emit(buf, "FAIL\n");
/* Test LED Shorted */
pos += lp5569_led_short_test(led, buf);
if (pos < 0)
- return sprintf(buf, "FAIL\n");
+ return sysfs_emit(buf, "FAIL\n");
for (i = 0; i < chip->pdata->num_channels; i++) {
/* Restore current */
diff --git a/drivers/leds/leds-lp8860.c b/drivers/leds/leds-lp8860.c
index 0962c00c215a..7a436861c4b7 100644
--- a/drivers/leds/leds-lp8860.c
+++ b/drivers/leds/leds-lp8860.c
@@ -89,16 +89,24 @@
* @client: Pointer to the I2C client
* @led_dev: led class device pointer
* @regmap: Devices register map
- * @eeprom_regmap: EEPROM register map
*/
struct lp8860_led {
struct mutex lock;
struct i2c_client *client;
struct led_classdev led_dev;
struct regmap *regmap;
- struct regmap *eeprom_regmap;
};
+static bool program_eeprom;
+module_param(program_eeprom, bool, 0644);
+MODULE_PARM_DESC(program_eeprom, "Program the configuration EEPROM on device startup");
+
+/*
+ * EEPROM bits are intended to be set/programmed before normal operation only
+ * once during silicon production, but can be reprogrammed for evaluation purposes
+ * up to 1000 cycles. To program this EEPROM using this driver, update the below
+ * table and set the module param "program_eeprom" to 1
+ */
static const struct reg_sequence lp8860_eeprom_disp_regs[] = {
{ LP8860_EEPROM_REG_0, 0xed },
{ LP8860_EEPROM_REG_1, 0xdf },
@@ -127,32 +135,6 @@ static const struct reg_sequence lp8860_eeprom_disp_regs[] = {
{ LP8860_EEPROM_REG_24, 0x3E },
};
-static int lp8860_unlock_eeprom(struct lp8860_led *led)
-{
- int ret;
-
- guard(mutex)(&led->lock);
-
- ret = regmap_write(led->regmap, LP8860_EEPROM_UNLOCK, LP8860_EEPROM_CODE_1);
- if (ret) {
- dev_err(&led->client->dev, "EEPROM Unlock failed\n");
- return ret;
- }
-
- ret = regmap_write(led->regmap, LP8860_EEPROM_UNLOCK, LP8860_EEPROM_CODE_2);
- if (ret) {
- dev_err(&led->client->dev, "EEPROM Unlock failed\n");
- return ret;
- }
- ret = regmap_write(led->regmap, LP8860_EEPROM_UNLOCK, LP8860_EEPROM_CODE_3);
- if (ret) {
- dev_err(&led->client->dev, "EEPROM Unlock failed\n");
- return ret;
- }
-
- return ret;
-}
-
static int lp8860_fault_check(struct lp8860_led *led)
{
int ret, fault;
@@ -211,61 +193,72 @@ static int lp8860_brightness_set(struct led_classdev *led_cdev,
return 0;
}
-static int lp8860_init(struct lp8860_led *led)
+static int lp8860_program_eeprom(struct lp8860_led *led)
{
- unsigned int read_buf;
int ret, reg_count;
+ guard(mutex)(&led->lock);
+
ret = lp8860_fault_check(led);
- if (ret)
- goto out;
+ if (ret) {
+ dev_err(&led->client->dev, "Cannot read/clear faults\n");
+ return ret;
+ }
- ret = regmap_read(led->regmap, LP8860_STATUS, &read_buf);
- if (ret)
- goto out;
+ ret = regmap_write(led->regmap, LP8860_EEPROM_UNLOCK, LP8860_EEPROM_CODE_1);
+ if (ret) {
+ dev_err(&led->client->dev, "EEPROM Unlock failed\n");
+ return ret;
+ }
- ret = lp8860_unlock_eeprom(led);
+ ret = regmap_write(led->regmap, LP8860_EEPROM_UNLOCK, LP8860_EEPROM_CODE_2);
if (ret) {
- dev_err(&led->client->dev, "Failed unlocking EEPROM\n");
- goto out;
+ dev_err(&led->client->dev, "EEPROM Unlock failed\n");
+ return ret;
+ }
+ ret = regmap_write(led->regmap, LP8860_EEPROM_UNLOCK, LP8860_EEPROM_CODE_3);
+ if (ret) {
+ dev_err(&led->client->dev, "EEPROM Unlock failed\n");
+ return ret;
}
reg_count = ARRAY_SIZE(lp8860_eeprom_disp_regs);
- ret = regmap_multi_reg_write(led->eeprom_regmap, lp8860_eeprom_disp_regs, reg_count);
+ ret = regmap_multi_reg_write(led->regmap, lp8860_eeprom_disp_regs, reg_count);
if (ret) {
dev_err(&led->client->dev, "Failed writing EEPROM\n");
- goto out;
+ return ret;
}
ret = regmap_write(led->regmap, LP8860_EEPROM_UNLOCK, LP8860_LOCK_EEPROM);
if (ret)
- goto out;
+ return ret;
ret = regmap_write(led->regmap,
LP8860_EEPROM_CNTRL,
LP8860_PROGRAM_EEPROM);
if (ret) {
dev_err(&led->client->dev, "Failed programming EEPROM\n");
- goto out;
+ return ret;
}
- return ret;
-
-out:
- return ret;
+ return 0;
}
-static const struct regmap_config lp8860_regmap_config = {
- .reg_bits = 8,
- .val_bits = 8,
+static const struct regmap_range lp8860_reg_ranges[] = {
+ regmap_reg_range(LP8860_DISP_CL1_BRT_MSB, LP8860_EEPROM_UNLOCK),
+ regmap_reg_range(LP8860_EEPROM_REG_0, LP8860_EEPROM_REG_24),
+};
- .max_register = LP8860_EEPROM_UNLOCK,
+static const struct regmap_access_table lp8860_reg_table = {
+ .yes_ranges = lp8860_reg_ranges,
+ .n_yes_ranges = ARRAY_SIZE(lp8860_reg_ranges),
};
-static const struct regmap_config lp8860_eeprom_regmap_config = {
+static const struct regmap_config lp8860_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
-
+ .rd_table = &lp8860_reg_table,
+ .wr_table = &lp8860_reg_table,
.max_register = LP8860_EEPROM_REG_24,
};
@@ -319,18 +312,12 @@ static int lp8860_probe(struct i2c_client *client)
return ret;
}
- led->eeprom_regmap = devm_regmap_init_i2c(client, &lp8860_eeprom_regmap_config);
- if (IS_ERR(led->eeprom_regmap)) {
- ret = PTR_ERR(led->eeprom_regmap);
- dev_err(&client->dev, "Failed to allocate register map: %d\n",
- ret);
- return ret;
+ if (program_eeprom) {
+ ret = lp8860_program_eeprom(led);
+ if (ret)
+ return ret;
}
- ret = lp8860_init(led);
- if (ret)
- return ret;
-
init_data.fwnode = of_fwnode_handle(child_node);
init_data.devicename = LP8860_NAME;
init_data.default_label = ":display_cluster";
diff --git a/drivers/leds/rgb/leds-qcom-lpg.c b/drivers/leds/rgb/leds-qcom-lpg.c
index 016bf468e094..f6061c47f863 100644
--- a/drivers/leds/rgb/leds-qcom-lpg.c
+++ b/drivers/leds/rgb/leds-qcom-lpg.c
@@ -1273,7 +1273,12 @@ static int lpg_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
return ret;
if (chan->subtype == LPG_SUBTYPE_HI_RES_PWM) {
- refclk = lpg_clk_rates_hi_res[FIELD_GET(PWM_CLK_SELECT_HI_RES_MASK, val)];
+ unsigned int clk_idx = FIELD_GET(PWM_CLK_SELECT_HI_RES_MASK, val);
+
+ if (clk_idx >= ARRAY_SIZE(lpg_clk_rates_hi_res))
+ return -EINVAL;
+
+ refclk = lpg_clk_rates_hi_res[clk_idx];
resolution = lpg_pwm_resolution_hi_res[FIELD_GET(PWM_SIZE_HI_RES_MASK, val)];
} else {
refclk = lpg_clk_rates[FIELD_GET(PWM_CLK_SELECT_MASK, val)];
diff --git a/drivers/leds/trigger/ledtrig-tty.c b/drivers/leds/trigger/ledtrig-tty.c
index 8eb6286b33ac..3725571144d9 100644
--- a/drivers/leds/trigger/ledtrig-tty.c
+++ b/drivers/leds/trigger/ledtrig-tty.c
@@ -220,7 +220,7 @@ static void ledtrig_tty_work(struct work_struct *work)
goto out;
tty = tty_kopen_shared(devno);
- if (IS_ERR(tty) || !tty)
+ if (IS_ERR_OR_NULL(tty))
/* What to do? retry or abort */
goto out;