/* Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
+ * Copyright (C) 2018 XiaoMi, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
#define FLASH_LED_IRES_BASE 3
#define FLASH_LED_IRES_DIVISOR 2500
#define FLASH_LED_IRES_MIN_UA 5000
-#define FLASH_LED_IRES_DEFAULT_UA 12500
+#define FLASH_LED_IRES_DEFAULT_UA 13000
#define FLASH_LED_IRES_DEFAULT_VAL 0x00
#define FLASH_LED_HDRM_VOL_SHIFT 4
#define FLASH_LED_HDRM_VOL_DEFAULT_MV 0x80
int rc, i, addr_offset;
u8 val, mask;
+ pr_err("snode->enabled = %d, on = %d", snode->enabled, on);
if (snode->enabled == on) {
- pr_debug("Switch node is already %s!\n",
+ pr_err("Switch node is already %s!\n",
on ? "enabled" : "disabled");
+ if (on)
+ qpnp_flash_led_switch_disable(snode);
return 0;
}
rc = qpnp_flash_led_masked_write(led,
FLASH_LED_REG_MOD_CTRL(led->base),
FLASH_LED_MOD_CTRL_MASK, FLASH_LED_MOD_ENABLE);
- if (rc < 0)
+ if (rc < 0) {
+ pr_err("qpnp_flash_led_masked_write fail\n");
return rc;
+ }
}
led->enable++;
rc = qpnp_flash_led_masked_write(led,
FLASH_LED_EN_LED_CTRL(led->base),
snode->led_mask, val);
- if (rc < 0)
+ if (rc < 0) {
+ pr_err("qpnp_flash_led_masked_write fail\n");
return rc;
+ }
snode->enabled = true;
return 0;
/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved.
+ * Copyright (C) 2018 XiaoMi, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
if (wled->switch_freq_khz == 1600)
reg = QPNP_WLED_SWITCH_FREQ_1600_KHZ_CODE;
else if (wled->switch_freq_khz == 600)
- temp = QPNP_WLED_SWITCH_FREQ_600_KHZ_CODE;
+ reg = QPNP_WLED_SWITCH_FREQ_600_KHZ_CODE;
else
reg = QPNP_WLED_SWITCH_FREQ_800_KHZ_CODE;
return 0;
}
+int qpnp_wled_cabc(struct led_classdev *led_cdev, bool enable)
+{
+ struct qpnp_wled *wled;
+ int rc = 0, i;
+ u8 reg = 0;
+
+ wled = container_of(led_cdev, struct qpnp_wled, cdev);
+ if (wled == NULL) {
+ pr_err("wled is null\n");
+ return -EPERM;
+ }
+ wled->en_cabc = enable;
+ for (i = 0; i < wled->num_strings; i++) {
+ /* CABC */
+ rc = qpnp_wled_read_reg(wled,
+ QPNP_WLED_CABC_REG(wled->sink_base,
+ wled->strings[i]), ®);
+ if (rc < 0)
+ return rc;
+ reg &= QPNP_WLED_CABC_MASK;
+ reg |= (wled->en_cabc << QPNP_WLED_CABC_SHIFT);
+ rc = qpnp_wled_write_reg(wled,
+ QPNP_WLED_CABC_REG(wled->sink_base,
+ wled->strings[i]), reg);
+ if (rc)
+ return rc;
+ pr_debug("%d en_cabc %d\n", i, wled->en_cabc);
+ }
+ return rc;
+}
+
+EXPORT_SYMBOL_GPL(qpnp_wled_cabc);
+
/* parse wled dtsi parameters */
static int qpnp_wled_parse_dt(struct qpnp_wled *wled)
{
/* Copyright (c) 2012-2015, 2017, The Linux Foundation. All rights reserved.
+ * Copyright (C) 2018 XiaoMi, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
enum led_brightness value)
{
struct qpnp_led_data *led;
+ int rc;
led = container_of(led_cdev, struct qpnp_led_data, cdev);
if (value < LED_OFF) {
value = led->cdev.max_brightness;
led->cdev.brightness = value;
+
+ if (led->id == QPNP_ID_RGB_RED || led->id == QPNP_ID_RGB_GREEN
+ || led->id == QPNP_ID_RGB_BLUE) {
+ mutex_lock(&led->lock);
+ rc = qpnp_rgb_set(led);
+ if (rc < 0)
+ dev_err(&led->pdev->dev,
+ "RGB set brightness failed (%d)\n", rc);
+ mutex_unlock(&led->lock);
+ return;
+ } else if (led->id == QPNP_ID_LED_MPP) {
+ mutex_lock(&led->lock);
+ rc = qpnp_mpp_set(led);
+ if (rc < 0)
+ dev_err(&led->pdev->dev,
+ "MPP set brightness failed (%d)\n", rc);
+ mutex_unlock(&led->lock);
+ return;
+ } else if (led->id == QPNP_ID_KPDBL) {
+ mutex_lock(&led->lock);
+ rc = qpnp_kpdbl_set(led);
+ if (rc < 0)
+ dev_err(&led->pdev->dev,
+ "KPDBL set brightness failed (%d)\n", rc);
+ mutex_unlock(&led->lock);
+ return;
+ }
+
if (led->in_order_command_processing)
queue_work(led->workqueue, &led->work);
else
*
* Copyright (C) 2005 John Lenz <lenz@cs.wisc.edu>
* Copyright (C) 2005 Richard Purdie <rpurdie@openedhand.com>
+ * Copyright (C) 2018 XiaoMi, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
struct led_classdev *led_cdev);
extern void led_classdev_suspend(struct led_classdev *led_cdev);
extern void led_classdev_resume(struct led_classdev *led_cdev);
+extern int qpnp_wled_cabc(struct led_classdev *led_cdev, bool enable);
/**
* led_blink_set - set blinking with software fallback