drivers/platform/x86/asus-laptop.c
247
struct asus_led wled;
drivers/platform/x86/asus-laptop.c
645
led_classdev_unregister(&asus->wled.led);
drivers/platform/x86/asus-laptop.c
703
r = asus_led_register(asus, &asus->wled, "asus::wlan",
drivers/power/supply/ip5xxx_power.c
818
ip5xxx_setup_reg(wled_enable, wled.enable);
drivers/power/supply/ip5xxx_power.c
819
ip5xxx_setup_reg(wled_detect_en, wled.detect_en);
drivers/power/supply/ip5xxx_power.c
820
ip5xxx_setup_reg(wled_present, wled.present);
drivers/power/supply/ip5xxx_power.c
98
} wled;
drivers/regulator/bd71815-regulator.c
556
BD71815_LED_REG(wled, BD71815_WLED, BD71815_REG_LED_DIMM, LED_DIMM_MASK,
drivers/video/backlight/qcom-wled.c
1003
for (i = 0; i < wled->cfg.num_strings; i++) {
drivers/video/backlight/qcom-wled.c
1004
j = wled->cfg.enabled_strings[i];
drivers/video/backlight/qcom-wled.c
1010
rc = wled_auto_detection_at_init(wled);
drivers/video/backlight/qcom-wled.c
1014
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
1015
wled->sink_addr + WLED4_SINK_REG_CURR_SINK,
drivers/video/backlight/qcom-wled.c
1020
rc = regmap_update_bits(wled->regmap, wled->ctrl_addr +
drivers/video/backlight/qcom-wled.c
1027
for (i = 0; i < wled->cfg.num_strings; i++) {
drivers/video/backlight/qcom-wled.c
1028
j = wled->cfg.enabled_strings[i];
drivers/video/backlight/qcom-wled.c
1030
addr = wled->sink_addr +
drivers/video/backlight/qcom-wled.c
1032
rc = regmap_update_bits(wled->regmap, addr,
drivers/video/backlight/qcom-wled.c
1038
addr = wled->sink_addr +
drivers/video/backlight/qcom-wled.c
1040
rc = regmap_update_bits(wled->regmap, addr,
drivers/video/backlight/qcom-wled.c
1042
wled->cfg.string_i_limit);
drivers/video/backlight/qcom-wled.c
1047
rc = wled4_cabc_config(wled, wled->cfg.cabc);
drivers/video/backlight/qcom-wled.c
1051
rc = regmap_update_bits(wled->regmap, wled->ctrl_addr +
drivers/video/backlight/qcom-wled.c
1058
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
1059
wled->sink_addr + WLED4_SINK_REG_CURR_SINK,
drivers/video/backlight/qcom-wled.c
1064
rc = wled->wled_sync_toggle(wled);
drivers/video/backlight/qcom-wled.c
1066
dev_err(wled->dev, "Failed to toggle sync reg rc:%d\n", rc);
drivers/video/backlight/qcom-wled.c
1070
rc = wled_auto_detection_at_init(wled);
drivers/video/backlight/qcom-wled.c
1087
static int wled5_setup(struct wled *wled)
drivers/video/backlight/qcom-wled.c
1094
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
1095
wled->ctrl_addr + WLED3_CTRL_REG_OVP,
drivers/video/backlight/qcom-wled.c
1096
WLED5_CTRL_REG_OVP_MASK, wled->cfg.ovp);
drivers/video/backlight/qcom-wled.c
1100
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
1101
wled->ctrl_addr + WLED3_CTRL_REG_ILIMIT,
drivers/video/backlight/qcom-wled.c
1103
wled->cfg.boost_i_limit);
drivers/video/backlight/qcom-wled.c
1107
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
1108
wled->ctrl_addr + WLED3_CTRL_REG_FREQ,
drivers/video/backlight/qcom-wled.c
1110
wled->cfg.switch_freq);
drivers/video/backlight/qcom-wled.c
1115
for (i = 0; i < wled->cfg.num_strings; ++i) {
drivers/video/backlight/qcom-wled.c
1116
j = wled->cfg.enabled_strings[i];
drivers/video/backlight/qcom-wled.c
1117
addr = wled->sink_addr +
drivers/video/backlight/qcom-wled.c
1119
rc = regmap_update_bits(wled->regmap, addr,
drivers/video/backlight/qcom-wled.c
1121
wled->cfg.string_i_limit);
drivers/video/backlight/qcom-wled.c
1125
addr = wled->sink_addr + WLED5_SINK_REG_STR_SRC_SEL(j);
drivers/video/backlight/qcom-wled.c
1126
rc = regmap_update_bits(wled->regmap, addr,
drivers/video/backlight/qcom-wled.c
1128
wled->cfg.mod_sel == MOD_A ?
drivers/video/backlight/qcom-wled.c
1136
rc = wled5_cabc_config(wled, wled->cfg.cabc_sel ? true : false);
drivers/video/backlight/qcom-wled.c
1141
addr = wled->sink_addr + WLED5_SINK_REG_MOD_A_EN;
drivers/video/backlight/qcom-wled.c
1142
val = (wled->cfg.mod_sel == MOD_A) ? WLED5_SINK_REG_MOD_EN_MASK : 0;
drivers/video/backlight/qcom-wled.c
1143
rc = regmap_update_bits(wled->regmap, addr,
drivers/video/backlight/qcom-wled.c
1148
addr = wled->sink_addr + WLED5_SINK_REG_MOD_B_EN;
drivers/video/backlight/qcom-wled.c
1149
val = (wled->cfg.mod_sel == MOD_B) ? WLED5_SINK_REG_MOD_EN_MASK : 0;
drivers/video/backlight/qcom-wled.c
1150
rc = regmap_update_bits(wled->regmap, addr,
drivers/video/backlight/qcom-wled.c
1155
offset = (wled->cfg.mod_sel == MOD_A) ?
drivers/video/backlight/qcom-wled.c
1159
addr = wled->sink_addr + offset;
drivers/video/backlight/qcom-wled.c
1160
val = (wled->max_brightness == WLED5_SINK_REG_BRIGHT_MAX_15B) ?
drivers/video/backlight/qcom-wled.c
1163
rc = regmap_write(wled->regmap, addr, val);
drivers/video/backlight/qcom-wled.c
1167
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
1168
wled->sink_addr + WLED4_SINK_REG_CURR_SINK,
drivers/video/backlight/qcom-wled.c
1174
rc = wled->wled_sync_toggle(wled);
drivers/video/backlight/qcom-wled.c
1180
rc = wled_auto_detection_at_init(wled);
drivers/video/backlight/qcom-wled.c
1314
static int wled_configure(struct wled *wled)
drivers/video/backlight/qcom-wled.c
1316
struct wled_config *cfg = &wled->cfg;
drivers/video/backlight/qcom-wled.c
1317
struct device *dev = wled->dev;
drivers/video/backlight/qcom-wled.c
1435
dev_err(wled->dev, "invalid IO resources\n");
drivers/video/backlight/qcom-wled.c
1438
wled->ctrl_addr = be32_to_cpu(*prop_addr);
drivers/video/backlight/qcom-wled.c
1440
rc = of_property_read_string(dev->of_node, "label", &wled->name);
drivers/video/backlight/qcom-wled.c
1442
wled->name = devm_kasprintf(dev, GFP_KERNEL, "%pOFn", dev->of_node);
drivers/video/backlight/qcom-wled.c
1443
if (!wled->name)
drivers/video/backlight/qcom-wled.c
1446
switch (wled->version) {
drivers/video/backlight/qcom-wled.c
1451
wled->wled_set_brightness = wled3_set_brightness;
drivers/video/backlight/qcom-wled.c
1452
wled->wled_sync_toggle = wled3_sync_toggle;
drivers/video/backlight/qcom-wled.c
1453
wled->max_string_count = 3;
drivers/video/backlight/qcom-wled.c
1454
wled->sink_addr = wled->ctrl_addr;
drivers/video/backlight/qcom-wled.c
1467
wled->wled_set_brightness = wled4_set_brightness;
drivers/video/backlight/qcom-wled.c
1468
wled->wled_sync_toggle = wled3_sync_toggle;
drivers/video/backlight/qcom-wled.c
1469
wled->wled_cabc_config = wled4_cabc_config;
drivers/video/backlight/qcom-wled.c
1470
wled->wled_ovp_delay = wled4_ovp_delay;
drivers/video/backlight/qcom-wled.c
1471
wled->wled_auto_detection_required =
drivers/video/backlight/qcom-wled.c
1473
wled->max_string_count = 4;
drivers/video/backlight/qcom-wled.c
1477
dev_err(wled->dev, "invalid IO resources\n");
drivers/video/backlight/qcom-wled.c
1480
wled->sink_addr = be32_to_cpu(*prop_addr);
drivers/video/backlight/qcom-wled.c
1487
wled->wled_set_brightness = wled5_set_brightness;
drivers/video/backlight/qcom-wled.c
1488
wled->wled_sync_toggle = wled3_sync_toggle;
drivers/video/backlight/qcom-wled.c
1489
wled->wled_cabc_config = wled5_cabc_config;
drivers/video/backlight/qcom-wled.c
1490
wled->wled_ovp_delay = wled5_ovp_delay;
drivers/video/backlight/qcom-wled.c
1491
wled->wled_auto_detection_required =
drivers/video/backlight/qcom-wled.c
1493
wled->max_string_count = 4;
drivers/video/backlight/qcom-wled.c
1497
dev_err(wled->dev, "invalid IO resources\n");
drivers/video/backlight/qcom-wled.c
1500
wled->sink_addr = be32_to_cpu(*prop_addr);
drivers/video/backlight/qcom-wled.c
1504
dev_err(wled->dev, "Invalid WLED version\n");
drivers/video/backlight/qcom-wled.c
1543
if (string_len > wled->max_string_count) {
drivers/video/backlight/qcom-wled.c
1545
wled->max_string_count);
drivers/video/backlight/qcom-wled.c
1551
wled->cfg.enabled_strings,
drivers/video/backlight/qcom-wled.c
1560
if (wled->cfg.enabled_strings[i] >= wled->max_string_count) {
drivers/video/backlight/qcom-wled.c
1563
wled->cfg.enabled_strings[i], i);
drivers/video/backlight/qcom-wled.c
1573
if (val < 1 || val > wled->max_string_count) {
drivers/video/backlight/qcom-wled.c
1575
wled->max_string_count);
drivers/video/backlight/qcom-wled.c
1594
static int wled_configure_short_irq(struct wled *wled,
drivers/video/backlight/qcom-wled.c
1599
if (!wled->has_short_detect)
drivers/video/backlight/qcom-wled.c
1602
rc = regmap_update_bits(wled->regmap, wled->ctrl_addr +
drivers/video/backlight/qcom-wled.c
1609
wled->short_irq = platform_get_irq_byname(pdev, "short");
drivers/video/backlight/qcom-wled.c
1610
if (wled->short_irq < 0) {
drivers/video/backlight/qcom-wled.c
1615
rc = devm_request_threaded_irq(wled->dev, wled->short_irq,
drivers/video/backlight/qcom-wled.c
1618
"wled_short_irq", wled);
drivers/video/backlight/qcom-wled.c
1620
dev_err(wled->dev, "Unable to request short_irq (err:%d)\n",
drivers/video/backlight/qcom-wled.c
1626
static int wled_configure_ovp_irq(struct wled *wled,
drivers/video/backlight/qcom-wled.c
1632
wled->ovp_irq = platform_get_irq_byname(pdev, "ovp");
drivers/video/backlight/qcom-wled.c
1633
if (wled->ovp_irq < 0) {
drivers/video/backlight/qcom-wled.c
1638
rc = devm_request_threaded_irq(wled->dev, wled->ovp_irq, NULL,
drivers/video/backlight/qcom-wled.c
1640
"wled_ovp_irq", wled);
drivers/video/backlight/qcom-wled.c
1642
dev_err(wled->dev, "Unable to request ovp_irq (err:%d)\n",
drivers/video/backlight/qcom-wled.c
1644
wled->ovp_irq = 0;
drivers/video/backlight/qcom-wled.c
1648
rc = regmap_read(wled->regmap, wled->ctrl_addr +
drivers/video/backlight/qcom-wled.c
1655
disable_irq(wled->ovp_irq);
drivers/video/backlight/qcom-wled.c
1668
struct wled *wled;
drivers/video/backlight/qcom-wled.c
1679
wled = devm_kzalloc(&pdev->dev, sizeof(*wled), GFP_KERNEL);
drivers/video/backlight/qcom-wled.c
1680
if (!wled)
drivers/video/backlight/qcom-wled.c
1683
wled->regmap = regmap;
drivers/video/backlight/qcom-wled.c
1684
wled->dev = &pdev->dev;
drivers/video/backlight/qcom-wled.c
1686
wled->version = (uintptr_t)of_device_get_match_data(&pdev->dev);
drivers/video/backlight/qcom-wled.c
1687
if (!wled->version) {
drivers/video/backlight/qcom-wled.c
1692
mutex_init(&wled->lock);
drivers/video/backlight/qcom-wled.c
1693
rc = wled_configure(wled);
drivers/video/backlight/qcom-wled.c
1699
wled->max_brightness = val;
drivers/video/backlight/qcom-wled.c
1701
switch (wled->version) {
drivers/video/backlight/qcom-wled.c
1703
wled->cfg.auto_detection_enabled = false;
drivers/video/backlight/qcom-wled.c
1704
rc = wled3_setup(wled);
drivers/video/backlight/qcom-wled.c
1712
wled->has_short_detect = true;
drivers/video/backlight/qcom-wled.c
1713
rc = wled4_setup(wled);
drivers/video/backlight/qcom-wled.c
1721
wled->has_short_detect = true;
drivers/video/backlight/qcom-wled.c
1722
if (wled->cfg.cabc_sel)
drivers/video/backlight/qcom-wled.c
1723
wled->max_brightness = WLED5_SINK_REG_BRIGHT_MAX_12B;
drivers/video/backlight/qcom-wled.c
1725
rc = wled5_setup(wled);
drivers/video/backlight/qcom-wled.c
1733
dev_err(wled->dev, "Invalid WLED version\n");
drivers/video/backlight/qcom-wled.c
1737
INIT_DELAYED_WORK(&wled->ovp_work, wled_ovp_work);
drivers/video/backlight/qcom-wled.c
1739
rc = wled_configure_short_irq(wled, pdev);
drivers/video/backlight/qcom-wled.c
1743
rc = wled_configure_ovp_irq(wled, pdev);
drivers/video/backlight/qcom-wled.c
1753
props.max_brightness = wled->max_brightness;
drivers/video/backlight/qcom-wled.c
1754
bl = devm_backlight_device_register(&pdev->dev, wled->name,
drivers/video/backlight/qcom-wled.c
1755
&pdev->dev, wled,
drivers/video/backlight/qcom-wled.c
1762
struct wled *wled = platform_get_drvdata(pdev);
drivers/video/backlight/qcom-wled.c
1764
mutex_destroy(&wled->lock);
drivers/video/backlight/qcom-wled.c
1765
cancel_delayed_work_sync(&wled->ovp_work);
drivers/video/backlight/qcom-wled.c
1766
disable_irq(wled->short_irq);
drivers/video/backlight/qcom-wled.c
1767
disable_irq(wled->ovp_irq);
drivers/video/backlight/qcom-wled.c
207
int (*wled_set_brightness)(struct wled *wled, u16 brightness);
drivers/video/backlight/qcom-wled.c
210
int (*wled_cabc_config)(struct wled *wled, bool enable);
drivers/video/backlight/qcom-wled.c
216
int (*wled_sync_toggle)(struct wled *wled);
drivers/video/backlight/qcom-wled.c
222
int (*wled_ovp_delay)(struct wled *wled);
drivers/video/backlight/qcom-wled.c
228
bool (*wled_auto_detection_required)(struct wled *wled);
drivers/video/backlight/qcom-wled.c
231
static int wled3_set_brightness(struct wled *wled, u16 brightness)
drivers/video/backlight/qcom-wled.c
238
for (i = 0; i < wled->cfg.num_strings; ++i) {
drivers/video/backlight/qcom-wled.c
239
rc = regmap_bulk_write(wled->regmap, wled->ctrl_addr +
drivers/video/backlight/qcom-wled.c
240
WLED3_SINK_REG_BRIGHT(wled->cfg.enabled_strings[i]),
drivers/video/backlight/qcom-wled.c
249
static int wled4_set_brightness(struct wled *wled, u16 brightness)
drivers/video/backlight/qcom-wled.c
252
u16 low_limit = wled->max_brightness * 4 / 1000;
drivers/video/backlight/qcom-wled.c
261
for (i = 0; i < wled->cfg.num_strings; ++i) {
drivers/video/backlight/qcom-wled.c
262
rc = regmap_bulk_write(wled->regmap, wled->sink_addr +
drivers/video/backlight/qcom-wled.c
263
WLED4_SINK_REG_BRIGHT(wled->cfg.enabled_strings[i]),
drivers/video/backlight/qcom-wled.c
272
static int wled5_set_brightness(struct wled *wled, u16 brightness)
drivers/video/backlight/qcom-wled.c
275
u16 low_limit = wled->max_brightness * 1 / 1000;
drivers/video/backlight/qcom-wled.c
284
offset = (wled->cfg.mod_sel == MOD_A) ?
drivers/video/backlight/qcom-wled.c
288
rc = regmap_bulk_write(wled->regmap, wled->sink_addr + offset,
drivers/video/backlight/qcom-wled.c
295
struct wled *wled = container_of(work,
drivers/video/backlight/qcom-wled.c
296
struct wled, ovp_work.work);
drivers/video/backlight/qcom-wled.c
297
enable_irq(wled->ovp_irq);
drivers/video/backlight/qcom-wled.c
300
static int wled_module_enable(struct wled *wled, int val)
drivers/video/backlight/qcom-wled.c
304
if (wled->disabled_by_short)
drivers/video/backlight/qcom-wled.c
307
rc = regmap_update_bits(wled->regmap, wled->ctrl_addr +
drivers/video/backlight/qcom-wled.c
314
if (wled->ovp_irq > 0) {
drivers/video/backlight/qcom-wled.c
322
schedule_delayed_work(&wled->ovp_work, HZ / 100);
drivers/video/backlight/qcom-wled.c
324
if (!cancel_delayed_work_sync(&wled->ovp_work))
drivers/video/backlight/qcom-wled.c
325
disable_irq(wled->ovp_irq);
drivers/video/backlight/qcom-wled.c
332
static int wled3_sync_toggle(struct wled *wled)
drivers/video/backlight/qcom-wled.c
335
unsigned int mask = GENMASK(wled->max_string_count - 1, 0);
drivers/video/backlight/qcom-wled.c
337
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
338
wled->sink_addr + WLED3_SINK_REG_SYNC,
drivers/video/backlight/qcom-wled.c
343
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
344
wled->sink_addr + WLED3_SINK_REG_SYNC,
drivers/video/backlight/qcom-wled.c
350
static int wled5_mod_sync_toggle(struct wled *wled)
drivers/video/backlight/qcom-wled.c
355
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
356
wled->sink_addr + WLED5_SINK_REG_MOD_SYNC_BIT,
drivers/video/backlight/qcom-wled.c
361
val = (wled->cfg.mod_sel == MOD_A) ? WLED5_SINK_REG_SYNC_MOD_A_BIT :
drivers/video/backlight/qcom-wled.c
363
return regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
364
wled->sink_addr + WLED5_SINK_REG_MOD_SYNC_BIT,
drivers/video/backlight/qcom-wled.c
368
static int wled_ovp_fault_status(struct wled *wled, bool *fault_set)
drivers/video/backlight/qcom-wled.c
374
rc = regmap_read(wled->regmap,
drivers/video/backlight/qcom-wled.c
375
wled->ctrl_addr + WLED3_CTRL_REG_INT_RT_STS,
drivers/video/backlight/qcom-wled.c
378
dev_err(wled->dev, "Failed to read INT_RT_STS rc=%d\n", rc);
drivers/video/backlight/qcom-wled.c
382
rc = regmap_read(wled->regmap,
drivers/video/backlight/qcom-wled.c
383
wled->ctrl_addr + WLED3_CTRL_REG_FAULT_STATUS,
drivers/video/backlight/qcom-wled.c
386
dev_err(wled->dev, "Failed to read FAULT_STATUS rc=%d\n", rc);
drivers/video/backlight/qcom-wled.c
393
if (wled->version == 4 && (fault_sts & WLED3_CTRL_REG_OVP_FAULT_BIT))
drivers/video/backlight/qcom-wled.c
396
if (wled->version == 5 && (fault_sts & (WLED3_CTRL_REG_OVP_FAULT_BIT |
drivers/video/backlight/qcom-wled.c
401
dev_dbg(wled->dev, "WLED OVP fault detected, int_rt_sts=0x%x fault_sts=0x%x\n",
drivers/video/backlight/qcom-wled.c
407
static int wled4_ovp_delay(struct wled *wled)
drivers/video/backlight/qcom-wled.c
412
static int wled5_ovp_delay(struct wled *wled)
drivers/video/backlight/qcom-wled.c
419
rc = regmap_read(wled->regmap, wled->ctrl_addr +
drivers/video/backlight/qcom-wled.c
427
dev_dbg(wled->dev, "delay_time_us: %d\n", delay_us);
drivers/video/backlight/qcom-wled.c
434
struct wled *wled = bl_get_data(bl);
drivers/video/backlight/qcom-wled.c
438
mutex_lock(&wled->lock);
drivers/video/backlight/qcom-wled.c
440
rc = wled->wled_set_brightness(wled, brightness);
drivers/video/backlight/qcom-wled.c
442
dev_err(wled->dev, "wled failed to set brightness rc:%d\n",
drivers/video/backlight/qcom-wled.c
447
if (wled->version < 5) {
drivers/video/backlight/qcom-wled.c
448
rc = wled->wled_sync_toggle(wled);
drivers/video/backlight/qcom-wled.c
450
dev_err(wled->dev, "wled sync failed rc:%d\n", rc);
drivers/video/backlight/qcom-wled.c
458
rc = wled5_mod_sync_toggle(wled);
drivers/video/backlight/qcom-wled.c
460
dev_err(wled->dev, "wled mod sync failed rc:%d\n",
drivers/video/backlight/qcom-wled.c
467
if (!!brightness != !!wled->brightness) {
drivers/video/backlight/qcom-wled.c
468
rc = wled_module_enable(wled, !!brightness);
drivers/video/backlight/qcom-wled.c
470
dev_err(wled->dev, "wled enable failed rc:%d\n", rc);
drivers/video/backlight/qcom-wled.c
475
wled->brightness = brightness;
drivers/video/backlight/qcom-wled.c
478
mutex_unlock(&wled->lock);
drivers/video/backlight/qcom-wled.c
483
static int wled4_cabc_config(struct wled *wled, bool enable)
drivers/video/backlight/qcom-wled.c
488
for (i = 0; i < wled->cfg.num_strings; i++) {
drivers/video/backlight/qcom-wled.c
489
j = wled->cfg.enabled_strings[i];
drivers/video/backlight/qcom-wled.c
492
rc = regmap_update_bits(wled->regmap, wled->sink_addr +
drivers/video/backlight/qcom-wled.c
502
static int wled5_cabc_config(struct wled *wled, bool enable)
drivers/video/backlight/qcom-wled.c
507
if (wled->cabc_disabled)
drivers/video/backlight/qcom-wled.c
510
reg = enable ? wled->cfg.cabc_sel : 0;
drivers/video/backlight/qcom-wled.c
511
offset = (wled->cfg.mod_sel == MOD_A) ? WLED5_SINK_REG_MOD_A_SRC_SEL :
drivers/video/backlight/qcom-wled.c
514
rc = regmap_update_bits(wled->regmap, wled->sink_addr + offset,
drivers/video/backlight/qcom-wled.c
521
if (!wled->cfg.cabc_sel)
drivers/video/backlight/qcom-wled.c
522
wled->cabc_disabled = true;
drivers/video/backlight/qcom-wled.c
533
struct wled *wled = _wled;
drivers/video/backlight/qcom-wled.c
537
wled->short_count++;
drivers/video/backlight/qcom-wled.c
538
mutex_lock(&wled->lock);
drivers/video/backlight/qcom-wled.c
539
rc = wled_module_enable(wled, false);
drivers/video/backlight/qcom-wled.c
541
dev_err(wled->dev, "wled disable failed rc:%d\n", rc);
drivers/video/backlight/qcom-wled.c
546
wled->last_short_event);
drivers/video/backlight/qcom-wled.c
548
wled->short_count = 1;
drivers/video/backlight/qcom-wled.c
550
if (wled->short_count > WLED_SHORT_CNT_MAX) {
drivers/video/backlight/qcom-wled.c
551
dev_err(wled->dev, "Short triggered %d times, disabling WLED forever!\n",
drivers/video/backlight/qcom-wled.c
552
wled->short_count);
drivers/video/backlight/qcom-wled.c
553
wled->disabled_by_short = true;
drivers/video/backlight/qcom-wled.c
557
wled->last_short_event = ktime_get();
drivers/video/backlight/qcom-wled.c
560
rc = wled_module_enable(wled, true);
drivers/video/backlight/qcom-wled.c
562
dev_err(wled->dev, "wled enable failed rc:%d\n", rc);
drivers/video/backlight/qcom-wled.c
565
mutex_unlock(&wled->lock);
drivers/video/backlight/qcom-wled.c
572
static void wled_auto_string_detection(struct wled *wled)
drivers/video/backlight/qcom-wled.c
580
rc = regmap_read(wled->regmap, wled->sink_addr +
drivers/video/backlight/qcom-wled.c
583
dev_err(wled->dev, "Failed to read SINK configuration rc=%d\n",
drivers/video/backlight/qcom-wled.c
589
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
590
wled->ctrl_addr + WLED3_CTRL_REG_MOD_EN,
drivers/video/backlight/qcom-wled.c
593
dev_err(wled->dev, "Failed to disable WLED module rc=%d\n", rc);
drivers/video/backlight/qcom-wled.c
598
rc = wled4_set_brightness(wled, AUTO_DETECT_BRIGHTNESS);
drivers/video/backlight/qcom-wled.c
600
dev_err(wled->dev, "Failed to set brightness for auto detection rc=%d\n",
drivers/video/backlight/qcom-wled.c
605
if (wled->cfg.cabc) {
drivers/video/backlight/qcom-wled.c
606
rc = wled->wled_cabc_config(wled, false);
drivers/video/backlight/qcom-wled.c
612
rc = regmap_write(wled->regmap,
drivers/video/backlight/qcom-wled.c
613
wled->sink_addr + WLED4_SINK_REG_CURR_SINK, 0);
drivers/video/backlight/qcom-wled.c
615
dev_err(wled->dev, "Failed to disable all sinks rc=%d\n", rc);
drivers/video/backlight/qcom-wled.c
620
for (i = 0; i < wled->cfg.num_strings; i++) {
drivers/video/backlight/qcom-wled.c
621
j = wled->cfg.enabled_strings[i];
drivers/video/backlight/qcom-wled.c
625
rc = regmap_write(wled->regmap, wled->ctrl_addr +
drivers/video/backlight/qcom-wled.c
628
dev_err(wled->dev, "Failed to enable feedback for SINK %d rc = %d\n",
drivers/video/backlight/qcom-wled.c
634
rc = regmap_write(wled->regmap, wled->sink_addr +
drivers/video/backlight/qcom-wled.c
637
dev_err(wled->dev, "Failed to configure SINK %d rc=%d\n",
drivers/video/backlight/qcom-wled.c
643
rc = regmap_update_bits(wled->regmap, wled->ctrl_addr +
drivers/video/backlight/qcom-wled.c
648
dev_err(wled->dev, "Failed to enable WLED module rc=%d\n",
drivers/video/backlight/qcom-wled.c
653
delay_time_us = wled->wled_ovp_delay(wled);
drivers/video/backlight/qcom-wled.c
656
rc = wled_ovp_fault_status(wled, &fault_set);
drivers/video/backlight/qcom-wled.c
658
dev_err(wled->dev, "Error in getting OVP fault_sts, rc=%d\n",
drivers/video/backlight/qcom-wled.c
664
dev_dbg(wled->dev, "WLED OVP fault detected with SINK %d\n",
drivers/video/backlight/qcom-wled.c
670
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
671
wled->ctrl_addr + WLED3_CTRL_REG_MOD_EN,
drivers/video/backlight/qcom-wled.c
674
dev_err(wled->dev, "Failed to disable WLED module rc=%d\n",
drivers/video/backlight/qcom-wled.c
681
dev_err(wled->dev, "No valid WLED sinks found\n");
drivers/video/backlight/qcom-wled.c
682
wled->disabled_by_short = true;
drivers/video/backlight/qcom-wled.c
687
dev_warn(wled->dev, "%x is not a valid sink configuration - using %x instead\n",
drivers/video/backlight/qcom-wled.c
693
rc = regmap_write(wled->regmap,
drivers/video/backlight/qcom-wled.c
694
wled->sink_addr + WLED4_SINK_REG_CURR_SINK,
drivers/video/backlight/qcom-wled.c
697
dev_err(wled->dev, "Failed to reconfigure the default sink rc=%d\n",
drivers/video/backlight/qcom-wled.c
703
if (wled->version == 4) {
drivers/video/backlight/qcom-wled.c
704
for (i = 0; i < wled->cfg.num_strings; i++) {
drivers/video/backlight/qcom-wled.c
705
j = wled->cfg.enabled_strings[i];
drivers/video/backlight/qcom-wled.c
713
rc = regmap_write(wled->regmap, wled->sink_addr +
drivers/video/backlight/qcom-wled.c
716
dev_err(wled->dev, "Failed to configure MODULATOR_EN rc=%d\n",
drivers/video/backlight/qcom-wled.c
724
rc = wled->wled_cabc_config(wled, true);
drivers/video/backlight/qcom-wled.c
729
rc = regmap_write(wled->regmap,
drivers/video/backlight/qcom-wled.c
730
wled->ctrl_addr + WLED3_CTRL_REG_FEEDBACK_CONTROL, 0);
drivers/video/backlight/qcom-wled.c
732
dev_err(wled->dev, "Failed to restore feedback setting rc=%d\n",
drivers/video/backlight/qcom-wled.c
738
rc = wled4_set_brightness(wled, wled->brightness);
drivers/video/backlight/qcom-wled.c
740
dev_err(wled->dev, "Failed to set brightness after auto detection rc=%d\n",
drivers/video/backlight/qcom-wled.c
745
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
746
wled->ctrl_addr + WLED3_CTRL_REG_MOD_EN,
drivers/video/backlight/qcom-wled.c
750
dev_err(wled->dev, "Failed to enable WLED module rc=%d\n", rc);
drivers/video/backlight/qcom-wled.c
761
static bool wled4_auto_detection_required(struct wled *wled)
drivers/video/backlight/qcom-wled.c
765
if (!wled->cfg.auto_detection_enabled)
drivers/video/backlight/qcom-wled.c
773
if (!wled->auto_detection_ovp_count) {
drivers/video/backlight/qcom-wled.c
774
wled->start_ovp_fault_time = ktime_get();
drivers/video/backlight/qcom-wled.c
775
wled->auto_detection_ovp_count++;
drivers/video/backlight/qcom-wled.c
778
wled->start_ovp_fault_time);
drivers/video/backlight/qcom-wled.c
780
wled->auto_detection_ovp_count = 0;
drivers/video/backlight/qcom-wled.c
782
wled->auto_detection_ovp_count++;
drivers/video/backlight/qcom-wled.c
784
if (wled->auto_detection_ovp_count >=
drivers/video/backlight/qcom-wled.c
786
wled->auto_detection_ovp_count = 0;
drivers/video/backlight/qcom-wled.c
794
static bool wled5_auto_detection_required(struct wled *wled)
drivers/video/backlight/qcom-wled.c
796
if (!wled->cfg.auto_detection_enabled)
drivers/video/backlight/qcom-wled.c
811
static int wled_auto_detection_at_init(struct wled *wled)
drivers/video/backlight/qcom-wled.c
816
if (!wled->cfg.auto_detection_enabled)
drivers/video/backlight/qcom-wled.c
819
rc = wled_ovp_fault_status(wled, &fault_set);
drivers/video/backlight/qcom-wled.c
821
dev_err(wled->dev, "Error in getting OVP fault_sts, rc=%d\n",
drivers/video/backlight/qcom-wled.c
827
mutex_lock(&wled->lock);
drivers/video/backlight/qcom-wled.c
828
wled_auto_string_detection(wled);
drivers/video/backlight/qcom-wled.c
829
mutex_unlock(&wled->lock);
drivers/video/backlight/qcom-wled.c
837
struct wled *wled = _wled;
drivers/video/backlight/qcom-wled.c
841
rc = regmap_read(wled->regmap,
drivers/video/backlight/qcom-wled.c
842
wled->ctrl_addr + WLED3_CTRL_REG_INT_RT_STS, &int_sts);
drivers/video/backlight/qcom-wled.c
844
dev_err(wled->dev, "Error in reading WLED3_INT_RT_STS rc=%d\n",
drivers/video/backlight/qcom-wled.c
849
rc = regmap_read(wled->regmap, wled->ctrl_addr +
drivers/video/backlight/qcom-wled.c
852
dev_err(wled->dev, "Error in reading WLED_FAULT_STATUS rc=%d\n",
drivers/video/backlight/qcom-wled.c
859
dev_dbg(wled->dev, "WLED OVP fault detected, int_sts=%x fault_sts= %x\n",
drivers/video/backlight/qcom-wled.c
863
if (wled->wled_auto_detection_required(wled)) {
drivers/video/backlight/qcom-wled.c
864
mutex_lock(&wled->lock);
drivers/video/backlight/qcom-wled.c
865
wled_auto_string_detection(wled);
drivers/video/backlight/qcom-wled.c
866
mutex_unlock(&wled->lock);
drivers/video/backlight/qcom-wled.c
873
static int wled3_setup(struct wled *wled)
drivers/video/backlight/qcom-wled.c
879
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
880
wled->ctrl_addr + WLED3_CTRL_REG_OVP,
drivers/video/backlight/qcom-wled.c
881
WLED3_CTRL_REG_OVP_MASK, wled->cfg.ovp);
drivers/video/backlight/qcom-wled.c
885
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
886
wled->ctrl_addr + WLED3_CTRL_REG_ILIMIT,
drivers/video/backlight/qcom-wled.c
888
wled->cfg.boost_i_limit);
drivers/video/backlight/qcom-wled.c
892
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
893
wled->ctrl_addr + WLED3_CTRL_REG_FREQ,
drivers/video/backlight/qcom-wled.c
895
wled->cfg.switch_freq);
drivers/video/backlight/qcom-wled.c
899
for (i = 0; i < wled->cfg.num_strings; ++i) {
drivers/video/backlight/qcom-wled.c
900
j = wled->cfg.enabled_strings[i];
drivers/video/backlight/qcom-wled.c
901
addr = wled->ctrl_addr + WLED3_SINK_REG_STR_MOD_EN(j);
drivers/video/backlight/qcom-wled.c
902
rc = regmap_update_bits(wled->regmap, addr,
drivers/video/backlight/qcom-wled.c
908
if (wled->cfg.ext_gen) {
drivers/video/backlight/qcom-wled.c
909
addr = wled->ctrl_addr + WLED3_SINK_REG_STR_MOD_SRC(j);
drivers/video/backlight/qcom-wled.c
910
rc = regmap_update_bits(wled->regmap, addr,
drivers/video/backlight/qcom-wled.c
917
addr = wled->ctrl_addr + WLED3_SINK_REG_STR_FULL_SCALE_CURR(j);
drivers/video/backlight/qcom-wled.c
918
rc = regmap_update_bits(wled->regmap, addr,
drivers/video/backlight/qcom-wled.c
920
wled->cfg.string_i_limit);
drivers/video/backlight/qcom-wled.c
924
addr = wled->ctrl_addr + WLED3_SINK_REG_STR_CABC(j);
drivers/video/backlight/qcom-wled.c
925
rc = regmap_update_bits(wled->regmap, addr,
drivers/video/backlight/qcom-wled.c
927
wled->cfg.cabc ?
drivers/video/backlight/qcom-wled.c
935
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
936
wled->ctrl_addr + WLED3_SINK_REG_CURR_SINK,
drivers/video/backlight/qcom-wled.c
956
static int wled4_setup(struct wled *wled)
drivers/video/backlight/qcom-wled.c
963
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
964
wled->ctrl_addr + WLED3_CTRL_REG_OVP,
drivers/video/backlight/qcom-wled.c
965
WLED3_CTRL_REG_OVP_MASK, wled->cfg.ovp);
drivers/video/backlight/qcom-wled.c
969
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
970
wled->ctrl_addr + WLED3_CTRL_REG_ILIMIT,
drivers/video/backlight/qcom-wled.c
972
wled->cfg.boost_i_limit);
drivers/video/backlight/qcom-wled.c
976
rc = regmap_update_bits(wled->regmap,
drivers/video/backlight/qcom-wled.c
977
wled->ctrl_addr + WLED3_CTRL_REG_FREQ,
drivers/video/backlight/qcom-wled.c
979
wled->cfg.switch_freq);
drivers/video/backlight/qcom-wled.c
983
if (wled->cfg.external_pfet) {
drivers/video/backlight/qcom-wled.c
985
rc = regmap_write(wled->regmap, wled->ctrl_addr +
drivers/video/backlight/qcom-wled.c
991
rc = regmap_write(wled->regmap,
drivers/video/backlight/qcom-wled.c
992
wled->ctrl_addr + WLED4_CTRL_REG_TEST1,
drivers/video/backlight/qcom-wled.c
998
rc = regmap_read(wled->regmap, wled->sink_addr +