dev: pm8x41: Add support for WLED in 8974 Pro AC target
Add support for Slave ID selection to control WLED.
This Slave ID will be used for SPMI register writes.
Change-Id: Ieec4fc34673dbd3376beae148eecea2acc8a0dff
diff --git a/dev/pmic/pm8x41/include/pm8x41_wled.h b/dev/pmic/pm8x41/include/pm8x41_wled.h
index b357794..0ef9091 100644
--- a/dev/pmic/pm8x41/include/pm8x41_wled.h
+++ b/dev/pmic/pm8x41/include/pm8x41_wled.h
@@ -30,7 +30,7 @@
#include <debug.h>
#include <reg.h>
-#define PM_WLED_BASE 0x1D800
+#define PM_WLED_BASE 0x0D800
#define PM_WLED_CTNL_REG(n) (PM_WLED_BASE + n)
#define PM_WLED_LED_CTNL_REG(n) (PM_WLED_BASE + 0x60 + (n-1)*10)
@@ -57,7 +57,7 @@
#define PM_WLED_LED3_ILED_SYNC_MASK BIT(0)
#define PM_WLED_ENABLE_MODULE_MASK BIT(7)
-
+#define DEFAULT_SLAVE_ID 0x1
struct pm8x41_wled_data{
uint8_t mod_scheme;
uint16_t led1_brightness;
@@ -72,3 +72,4 @@
void pm8x41_wled_iled_sync_control(uint8_t enable);
void pm8x41_wled_sink_control(uint8_t enable);
void pm8x41_wled_enable(uint8_t enable);
+void pm8x41_wled_config_slave_id(uint8_t slave_id);
diff --git a/dev/pmic/pm8x41/pm8x41_wled.c b/dev/pmic/pm8x41/pm8x41_wled.c
index fd8b48f..8c37e12 100644
--- a/dev/pmic/pm8x41/pm8x41_wled.c
+++ b/dev/pmic/pm8x41/pm8x41_wled.c
@@ -31,6 +31,25 @@
#include <pm8x41_hw.h>
#include <pm8x41_wled.h>
+static uint8_t wled_slave_id;
+
+static void wled_reg_write(uint32_t addr, uint8_t val)
+{
+ uint32_t new_addr;
+ if (wled_slave_id) {
+ new_addr = addr + (wled_slave_id << 16);
+ REG_WRITE(new_addr, val);
+ } else {
+ new_addr = addr + (DEFAULT_SLAVE_ID << 16);
+ REG_WRITE(new_addr, val);
+ }
+}
+
+void pm8x41_wled_config_slave_id(uint8_t slave_id)
+{
+ wled_slave_id = slave_id;
+}
+
void pm8x41_wled_config(struct pm8x41_wled_data *wled_ctrl) {
if (!wled_ctrl) {
@@ -38,20 +57,20 @@
return;
}
- REG_WRITE(PM_WLED_MODULATION_SCHEME, wled_ctrl->mod_scheme);
+ wled_reg_write(PM_WLED_MODULATION_SCHEME, wled_ctrl->mod_scheme);
- REG_WRITE(PM_WLED_LED1_BRIGHTNESS_LSB, (wled_ctrl->led1_brightness & 0xFF));
- REG_WRITE(PM_WLED_LED1_BRIGHTNESS_MSB, ((wled_ctrl->led1_brightness >> 8) & 0xFF));
- REG_WRITE(PM_WLED_LED2_BRIGHTNESS_LSB, (wled_ctrl->led2_brightness & 0xFF));
- REG_WRITE(PM_WLED_LED2_BRIGHTNESS_MSB, ((wled_ctrl->led2_brightness >> 8) & 0xFF));
- REG_WRITE(PM_WLED_LED3_BRIGHTNESS_LSB, (wled_ctrl->led3_brightness & 0xFF));
- REG_WRITE(PM_WLED_LED3_BRIGHTNESS_MSB, ((wled_ctrl->led3_brightness >> 8) & 0xFF));
+ wled_reg_write(PM_WLED_LED1_BRIGHTNESS_LSB, (wled_ctrl->led1_brightness & 0xFF));
+ wled_reg_write(PM_WLED_LED1_BRIGHTNESS_MSB, ((wled_ctrl->led1_brightness >> 8) & 0xFF));
+ wled_reg_write(PM_WLED_LED2_BRIGHTNESS_LSB, (wled_ctrl->led2_brightness & 0xFF));
+ wled_reg_write(PM_WLED_LED2_BRIGHTNESS_MSB, ((wled_ctrl->led2_brightness >> 8) & 0xFF));
+ wled_reg_write(PM_WLED_LED3_BRIGHTNESS_LSB, (wled_ctrl->led3_brightness & 0xFF));
+ wled_reg_write(PM_WLED_LED3_BRIGHTNESS_MSB, ((wled_ctrl->led3_brightness >> 8) & 0xFF));
- REG_WRITE(PM_WLED_MAX_DUTY_CYCLE, wled_ctrl->max_duty_cycle);
- REG_WRITE(PM_WLED_OVP, wled_ctrl->ovp);
- REG_WRITE(LEDn_FULL_SCALE_CURRENT(1), wled_ctrl->full_current_scale);
- REG_WRITE(LEDn_FULL_SCALE_CURRENT(2), wled_ctrl->full_current_scale);
- REG_WRITE(LEDn_FULL_SCALE_CURRENT(3), wled_ctrl->full_current_scale);
+ wled_reg_write(PM_WLED_MAX_DUTY_CYCLE, wled_ctrl->max_duty_cycle);
+ wled_reg_write(PM_WLED_OVP, wled_ctrl->ovp);
+ wled_reg_write(LEDn_FULL_SCALE_CURRENT(1), wled_ctrl->full_current_scale);
+ wled_reg_write(LEDn_FULL_SCALE_CURRENT(2), wled_ctrl->full_current_scale);
+ wled_reg_write(LEDn_FULL_SCALE_CURRENT(3), wled_ctrl->full_current_scale);
dprintf(SPEW, "WLED Configuration Success.\n");
@@ -67,7 +86,7 @@
PM_WLED_LED3_SINK_MASK;
}
- REG_WRITE(PM_WLED_CURRENT_SINK, value);
+ wled_reg_write(PM_WLED_CURRENT_SINK, value);
dprintf(SPEW, "WLED Sink Success\n");
@@ -83,7 +102,7 @@
PM_WLED_LED1_ILED_SYNC_MASK;
}
- REG_WRITE(PM_WLED_ILED_SYNC_BIT, value);
+ wled_reg_write(PM_WLED_ILED_SYNC_BIT, value);
dprintf(SPEW, "WLED ILED Sync Success\n");
@@ -96,7 +115,7 @@
if (enable)
value = PM_WLED_ENABLE_MODULE_MASK;
- REG_WRITE(PM_WLED_ENABLE, value);
+ wled_reg_write(PM_WLED_ENABLE, value);
dprintf(SPEW, "WLED Enable Success\n");