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");