vrahane closed pull request #1122: Lp5523 improvements
URL: https://github.com/apache/mynewt-core/pull/1122
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/hw/drivers/lp5523/include/lp5523/lp5523.h 
b/hw/drivers/lp5523/include/lp5523/lp5523.h
index 4658174475..4f64779679 100644
--- a/hw/drivers/lp5523/include/lp5523/lp5523.h
+++ b/hw/drivers/lp5523/include/lp5523/lp5523.h
@@ -26,6 +26,12 @@ extern "C" {
 
 #include <sensor/sensor.h>
 
+#if MYNEWT_VAL(LED_ENABLE_ABSTRACTION)
+#include <led/led.h>
+#endif
+
+#define LP5523_MAX_PAYLOAD   (10)
+
 #define LP5523_I2C_BASE_ADDR (0x32)
 
 /* Engine control mask */
@@ -49,26 +55,109 @@ extern "C" {
 #define LP5523_LED2 (2)
 #define LP5523_LED1 (1)
 
+struct per_led_cfg {
+    /* Mapping */
+    uint8_t mapping:2;
+    /* Enable Log dimming */
+    uint8_t log_dim_en:1;
+    /* Enable temperature compensation */
+    uint8_t temp_comp:5;
+    /* Output On/Off */
+    uint8_t output_on:1;
+    /* In steps of 100 microamps */
+    uint8_t current_ctrl;
+};
+
 struct lp5523_cfg {
     /* The 2 LSBs of this represent ASEL1 and ASEL0 */
-    uint8_t asel;
-    uint8_t clk_det_en;
-    uint8_t int_clk_en;
-    uint8_t cp_mode;
-    uint8_t int_conf;
+    uint8_t asel:2;
+    /* Enable clock detect enable */
+    uint8_t clk_det_en:1;
+    /* Enable Int clock */
+    uint8_t int_clk_en:1;
+    /* Select CP Mode */
+    uint8_t cp_mode:2;
+    /* Enable VAR_D_SEL */
+    uint8_t var_d_sel:1;
+    /* Enable Power Save */
+    uint8_t ps_en:1;
+    /* Enable PWM power save */
+    uint8_t pwm_ps_en:1;
+    /* Enable auto increment */
+    uint8_t auto_inc_en:1;
+    /* INT conf */
+    uint8_t int_conf:1;
+    /* INT GPO */
+
+    /****** Gain change control settings ******/
+    uint8_t int_gpo:1;
+    /* Threshold Voltage */
+    uint8_t thresh_volt:2;
+    /* Enable adaptive threshold */
+    uint8_t adapt_thresh_en:1;
+    /* Timer value */
+    uint8_t timer:2;
+    /* Force_1x enbale */
+    uint8_t force_1x:1;
+
+    /* All per LED configs go here - 0: D1 8: D9 */
+    struct per_led_cfg per_led_cfg[MYNEWT_VAL(LP5523_LEDS_PER_DRIVER)];
 };
 
 struct lp5523 {
     struct os_dev dev;
-    struct sensor sensor;
+#if MYNEWT_VAL(LED_ENABLE_ABSTRACTION)
+    struct led_dev led_dev;
+#endif
     struct lp5523_cfg cfg;
 };
 
+#if MYNEWT_VAL(LED_ENABLE_ABSTRACTION) == 0
+/*
+ * LED interface
+ */
+struct led_itf {
+
+    /* LED interface type */
+    uint8_t li_type;
+
+    /* interface number */
+    uint8_t li_num;
+
+    /* CS pin - optional, only needed for SPI */
+    uint8_t li_cs_pin;
+
+    /* LED chip address, only needed for I2C */
+    uint16_t li_addr;
+};
+#endif
+
+/**** Config Values ****/
+#define LP5523_ASEL00_ADDR_32h            0x00
+#define LP5523_ASEL01_ADDR_33h            0x01
+#define LP5523_ASEL10_ADDR_34h            0x02
+#define LP5523_ASEL11_ADDR_35h            0x03
+
+#define LP5523_CP_MODE_OFF                0x00
+#define LP5523_CP_MODE_FORCE_TO_BYPASS    0x01
+#define LP5523_CP_MODE_FORCE_TO_1_5X      0x02
+#define LP5523_CP_MODE_AUTO               0x03
+
+#define LP5523_THRESH_VOLT_400MV          0x00
+#define LP5523_THRESH_VOLT_300MV          0x01
+#define LP5523_THRESH_VOLT_200MV          0x02
+#define LP5523_THRESH_VOLT_100MV          0x03
+
+#define LP5523_TIMER_5MS                  0x00
+#define LP5523_TIMER_10MS                 0x01
+#define LP5523_TIMER_50MS                 0x02
+#define LP5523_TIMER_INF                  0x03
+
 /* register addresses */
 
 enum lp5523_bitfield_registers {
     LP5523_OUTPUT_RATIOMETRIC = 0x02,
-    LP5523_OUTPUT_CONTROL = 0x04,
+    LP5523_OUTPUT_CTRL_MSB = 0x04,
     LP5523_ENG_MAPPING = 0x70
 };
 
@@ -92,7 +181,7 @@ enum lp5523_engine_control_registers {
 
 enum lp5523_registers {
     LP5523_ENABLE = 0x00,
-    LP5523_LED_OUTPUT_CTRL = 0x05,
+    LP5523_OUTPUT_CTRL_LSB = 0x05,
     LP5523_LED_CONTROL_BASE = 0x06,
     LP5523_PWM_BASE = 0x16,
     LP5523_MISC = 0x36,
@@ -227,7 +316,7 @@ LP5523_REGISTER_VALUE(LP5523_GAIN_CHANGE_CTRL, 
LP5523_FORCE_1X, 2, 0x04);
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_set_reg(struct sensor_itf *itf, enum lp5523_registers addr,
+int lp5523_set_reg(struct led_itf *itf, enum lp5523_registers addr,
     uint8_t value);
 
 /**
@@ -239,7 +328,7 @@ int lp5523_set_reg(struct sensor_itf *itf, enum 
lp5523_registers addr,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_get_reg(struct sensor_itf *itf, enum lp5523_registers addr,
+int lp5523_get_reg(struct led_itf *itf, enum lp5523_registers addr,
     uint8_t *value);
 
 /**
@@ -264,7 +353,7 @@ int lp5523_apply_value(struct lp5523_register_value addr, 
uint8_t value,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_set_value(struct sensor_itf *itf, struct lp5523_register_value addr,
+int lp5523_set_value(struct led_itf *itf, struct lp5523_register_value addr,
     uint8_t value);
 
 /**
@@ -277,7 +366,7 @@ int lp5523_set_value(struct sensor_itf *itf, struct 
lp5523_register_value addr,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_get_value(struct sensor_itf *itf, struct lp5523_register_value addr,
+int lp5523_get_value(struct led_itf *itf, struct lp5523_register_value addr,
     uint8_t *value);
 
 /**
@@ -294,7 +383,7 @@ int lp5523_get_value(struct sensor_itf *itf, struct 
lp5523_register_value addr,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_set_bitfield(struct sensor_itf *itf,
+int lp5523_set_bitfield(struct led_itf *itf,
     enum lp5523_bitfield_registers addr, uint16_t outputs);
 
 /**
@@ -310,7 +399,7 @@ int lp5523_set_bitfield(struct sensor_itf *itf,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_get_bitfield(struct sensor_itf *itf,
+int lp5523_get_bitfield(struct led_itf *itf,
     enum lp5523_bitfield_registers addr, uint16_t* outputs);
 
 /**
@@ -320,14 +409,14 @@ int lp5523_get_bitfield(struct sensor_itf *itf,
  * LP5523_PWM
  * LP5523_CURRENT_CONTROL
  *
- * @param The sensor interface.
+ * @param The LED interface.
  * @param The register address to write to (the MSB register).
  * @param Output ID 1-9.
  * @param Value to write.
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_set_output_reg(struct sensor_itf *itf,
+int lp5523_set_output_reg(struct led_itf *itf,
     enum lp5523_output_registers addr, uint8_t output, uint8_t value);
 
 /**
@@ -344,7 +433,7 @@ int lp5523_set_output_reg(struct sensor_itf *itf,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_get_output_reg(struct sensor_itf *itf,
+int lp5523_get_output_reg(struct led_itf *itf,
     enum lp5523_output_registers addr, uint8_t output, uint8_t *value);
 
 /**
@@ -361,7 +450,7 @@ int lp5523_get_output_reg(struct sensor_itf *itf,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_set_engine_reg(struct sensor_itf *itf,
+int lp5523_set_engine_reg(struct led_itf *itf,
     enum lp5523_engine_registers addr, uint8_t engine, uint8_t value);
 
 /**
@@ -378,7 +467,7 @@ int lp5523_set_engine_reg(struct sensor_itf *itf,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_get_engine_reg(struct sensor_itf *itf,
+int lp5523_get_engine_reg(struct led_itf *itf,
     enum lp5523_engine_registers addr, uint8_t engine, uint8_t *value);
 
 /**
@@ -389,7 +478,7 @@ int lp5523_get_engine_reg(struct sensor_itf *itf,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_set_enable(struct sensor_itf *itf, uint8_t enable);
+int lp5523_set_enable(struct led_itf *itf, uint8_t enable);
 
 /**
  * Sets the ENGINEX_MODE and ENGINEX_EXEC bits in the ENGINE CNTRLX registers.
@@ -403,7 +492,7 @@ int lp5523_set_enable(struct sensor_itf *itf, uint8_t 
enable);
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_set_engine_control(struct sensor_itf *itf,
+int lp5523_set_engine_control(struct led_itf *itf,
     enum lp5523_engine_control_registers addr, uint8_t engine_mask,
     uint8_t values);
 
@@ -416,7 +505,7 @@ int lp5523_set_engine_control(struct sensor_itf *itf,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_set_output_mapping(struct sensor_itf *itf, uint8_t output,
+int lp5523_set_output_mapping(struct led_itf *itf, uint8_t output,
     uint8_t mapping);
 
 /**
@@ -428,7 +517,7 @@ int lp5523_set_output_mapping(struct sensor_itf *itf, 
uint8_t output,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_get_output_mapping(struct sensor_itf *itf, uint8_t output,
+int lp5523_get_output_mapping(struct led_itf *itf, uint8_t output,
     uint8_t *mapping);
 
 /**
@@ -440,7 +529,7 @@ int lp5523_get_output_mapping(struct sensor_itf *itf, 
uint8_t output,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_set_output_log_dim(struct sensor_itf *itf, uint8_t output,
+int lp5523_set_output_log_dim(struct led_itf *itf, uint8_t output,
     uint8_t enable);
 
 /**
@@ -452,7 +541,7 @@ int lp5523_set_output_log_dim(struct sensor_itf *itf, 
uint8_t output,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_get_output_log_dim(struct sensor_itf *itf, uint8_t output,
+int lp5523_get_output_log_dim(struct led_itf *itf, uint8_t output,
     uint8_t *enable);
 
 /**
@@ -464,7 +553,7 @@ int lp5523_get_output_log_dim(struct sensor_itf *itf, 
uint8_t output,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_set_output_temp_comp(struct sensor_itf *itf, uint8_t output,
+int lp5523_set_output_temp_comp(struct led_itf *itf, uint8_t output,
     uint8_t value);
 
 /**
@@ -476,7 +565,7 @@ int lp5523_set_output_temp_comp(struct sensor_itf *itf, 
uint8_t output,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_get_output_temp_comp(struct sensor_itf *itf, uint8_t output,
+int lp5523_get_output_temp_comp(struct led_itf *itf, uint8_t output,
     uint8_t *value);
 
 /**
@@ -488,7 +577,7 @@ int lp5523_get_output_temp_comp(struct sensor_itf *itf, 
uint8_t output,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_get_engine_int(struct sensor_itf *itf, uint8_t engine,
+int lp5523_get_engine_int(struct led_itf *itf, uint8_t engine,
     uint8_t *flag);
 
 /**
@@ -498,7 +587,7 @@ int lp5523_get_engine_int(struct sensor_itf *itf, uint8_t 
engine,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_reset(struct sensor_itf *itf);
+int lp5523_reset(struct led_itf *itf);
 
 /**
  * Sets the page used for program memory reads and writes.
@@ -508,7 +597,7 @@ int lp5523_reset(struct sensor_itf *itf);
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_set_page_sel(struct sensor_itf *itf, uint8_t page);
+int lp5523_set_page_sel(struct led_itf *itf, uint8_t page);
 
 /**
  * Sets or clears the relevant DX bit in the ENGX MAPPING registers.
@@ -520,7 +609,7 @@ int lp5523_set_page_sel(struct sensor_itf *itf, uint8_t 
page);
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_set_engine_mapping(struct sensor_itf *itf, uint8_t engine,
+int lp5523_set_engine_mapping(struct led_itf *itf, uint8_t engine,
     uint16_t output);
 
 /**
@@ -534,7 +623,7 @@ int lp5523_set_engine_mapping(struct sensor_itf *itf, 
uint8_t engine,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_get_engine_mapping(struct sensor_itf *itf, uint8_t engine,
+int lp5523_get_engine_mapping(struct led_itf *itf, uint8_t engine,
     uint16_t *output);
 
 /**
@@ -546,7 +635,7 @@ int lp5523_get_engine_mapping(struct sensor_itf *itf, 
uint8_t engine,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_set_instruction(struct sensor_itf *itf, uint8_t addr, uint16_t ins);
+int lp5523_set_instruction(struct led_itf *itf, uint8_t addr, uint16_t ins);
 
 /**
  * gets an instruction from program memory.
@@ -557,7 +646,7 @@ int lp5523_set_instruction(struct sensor_itf *itf, uint8_t 
addr, uint16_t ins);
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_get_instruction(struct sensor_itf *itf, uint8_t addr, uint16_t 
*ins);
+int lp5523_get_instruction(struct led_itf *itf, uint8_t addr, uint16_t *ins);
 
 /**
  * Writes a program to memory.
@@ -571,7 +660,7 @@ int lp5523_get_instruction(struct sensor_itf *itf, uint8_t 
addr, uint16_t *ins);
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_set_program(struct sensor_itf *itf, uint8_t engines, uint16_t *pgm,
+int lp5523_set_program(struct led_itf *itf, uint8_t engines, uint16_t *pgm,
     uint8_t start, uint8_t size);
 
 /**
@@ -584,7 +673,7 @@ int lp5523_set_program(struct sensor_itf *itf, uint8_t 
engines, uint16_t *pgm,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_get_program(struct sensor_itf *itf, uint16_t *pgm, uint8_t start,
+int lp5523_get_program(struct led_itf *itf, uint16_t *pgm, uint8_t start,
     uint8_t size);
 
 /**
@@ -598,7 +687,7 @@ int lp5523_get_program(struct sensor_itf *itf, uint16_t 
*pgm, uint8_t start,
  * @return 0 on success, 1 on verify failure, other non-zero error on other
  * failure.
  */
-int lp5523_verify_program(struct sensor_itf *itf, uint16_t *pgm, uint8_t start,
+int lp5523_verify_program(struct led_itf *itf, uint16_t *pgm, uint8_t start,
     uint8_t size);
 
 /**
@@ -610,7 +699,7 @@ int lp5523_verify_program(struct sensor_itf *itf, uint16_t 
*pgm, uint8_t start,
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_engines_run(struct sensor_itf *itf, uint8_t engines);
+int lp5523_engines_run(struct led_itf *itf, uint8_t engines);
 
 /**
  * Sets the specified engines to hold execution of their respective programs.
@@ -621,7 +710,7 @@ int lp5523_engines_run(struct sensor_itf *itf, uint8_t 
engines);
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_engines_hold(struct sensor_itf *itf, uint8_t engines);
+int lp5523_engines_hold(struct led_itf *itf, uint8_t engines);
 
 /**
  * Sets the specified engines to execute the next instruction of their
@@ -633,7 +722,7 @@ int lp5523_engines_hold(struct sensor_itf *itf, uint8_t 
engines);
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_engines_step(struct sensor_itf *itf, uint8_t engines);
+int lp5523_engines_step(struct led_itf *itf, uint8_t engines);
 
 /**
  * Disables the specified engines.
@@ -644,7 +733,7 @@ int lp5523_engines_step(struct sensor_itf *itf, uint8_t 
engines);
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_engines_disable(struct sensor_itf *itf, uint8_t engines);
+int lp5523_engines_disable(struct led_itf *itf, uint8_t engines);
 
 /**
  * Reads the ADC on a pin.
@@ -655,7 +744,7 @@ int lp5523_engines_disable(struct sensor_itf *itf, uint8_t 
engines);
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_read_adc(struct sensor_itf *itf, uint8_t pin, uint8_t *v);
+int lp5523_read_adc(struct led_itf *itf, uint8_t pin, uint8_t *v);
 
 /**
  * Tests the Device, checks for a clock if necessary and checks the ADC values
@@ -665,7 +754,7 @@ int lp5523_read_adc(struct sensor_itf *itf, uint8_t pin, 
uint8_t *v);
  *
  * @return 0 on success, non-zero error on failure.
  */
-int lp5523_self_test(struct sensor_itf *itf);
+int lp5523_self_test(struct led_itf *itf);
 
 /**
  * Expects to be called back through os_dev_create().
@@ -678,6 +767,76 @@ int lp5523_self_test(struct sensor_itf *itf);
 int lp5523_init(struct os_dev *dev, void *arg);
 int lp5523_config(struct lp5523 *lp, struct lp5523_cfg *cfg);
 
+/**
+ * Calculate Temp comp bits from correction factor
+ *
+ * @param corr_factor Correction factor -1.5 < corr_factor < +1.5
+ * @param temp_comp Temperature compensation bits 5 bits 11111 - 01111
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+lp5523_calc_temp_comp(float corr_factor, uint8_t *temp_comp);
+
+/**
+ * Set output ON for particular output
+ *
+ * @param itf Ptr to LED itf
+ * @param output Number of the output
+ * @param on Output 1-ON/0-OFF
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+lp5523_set_output_on(struct led_itf *itf, uint8_t output, uint8_t on);
+
+/**
+ * Get output ON for particular output
+ *
+ * @param itf Ptr to LED itf
+ * @param output Number of the output
+ * @param on Ptr to output variable Output 1-ON/0-OFF
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+lp5523_get_output_on(struct led_itf *itf, uint8_t output, uint8_t *on);
+
+/**
+ *
+ * Get status
+ *
+ * @param LED interface
+ * @param Ptr to status
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+lp5523_get_status(struct led_itf *itf, uint8_t *status);
+
+/**
+ * Get Output Current control
+ *
+ * @param itf LED interface
+ * @param output Number of the output
+ * @param curr_ctrl Ptr to Current control
+ *
+ * @return 0 on success, non-zero on failure
+ */
+int
+lp5523_get_output_curr_ctrl(struct led_itf *itf, uint8_t output, uint8_t 
*curr_ctrl);
+
+/**
+ *
+ * Set output Current control
+ *
+ * @param itf LED interface
+ * @param output Number of the output
+ * @param curr_ctrl Current control value to set
+ */
+int
+lp5523_set_output_curr_ctrl(struct led_itf *itf, uint8_t output, uint8_t 
curr_ctrl);
+
 #if MYNEWT_VAL(LP5523_CLI)
 int lp5523_shell_init(void);
 #endif
diff --git a/hw/drivers/lp5523/src/lp5523.c b/hw/drivers/lp5523/src/lp5523.c
index 55cccc9305..c9da96a342 100644
--- a/hw/drivers/lp5523/src/lp5523.c
+++ b/hw/drivers/lp5523/src/lp5523.c
@@ -24,6 +24,10 @@
 
 #include "lp5523/lp5523.h"
 
+#if MYNEWT_VAL(LED_ABSTRACTION_LAYER)
+#include "led/led.h"
+#endif
+
 /* Define the stats section and records */
 STATS_SECT_START(lp5523_stat_section)
     STATS_SECT_ENTRY(read_errors)
@@ -45,24 +49,24 @@ STATS_SECT_DECL(lp5523_stat_section) g_lp5523stats;
 static struct log _log;
 
 int
-lp5523_set_reg(struct sensor_itf *itf, enum lp5523_registers addr,
+lp5523_set_reg(struct led_itf *itf, enum lp5523_registers addr,
     uint8_t value)
 {
     int rc;
     uint8_t payload[2] = { addr, value };
 
     struct hal_i2c_master_data data_struct = {
-        .address = itf->si_addr,
+        .address = itf->li_addr,
         .len = 2,
         .buffer = payload
     };
 
-    rc = hal_i2c_master_write(itf->si_num, &data_struct,
+    rc = hal_i2c_master_write(itf->li_num, &data_struct,
                               OS_TICKS_PER_SEC / 10, 1);
 
-    if (rc != 0) {
+    if (rc) {
         LP5523_ERR("Failed to write to 0x%02X:0x%02X with value 0x%02X\n",
-                       itf->si_addr, addr, value);
+                       itf->li_addr, addr, value);
         STATS_INC(g_lp5523stats, read_errors);
     }
 
@@ -70,101 +74,124 @@ lp5523_set_reg(struct sensor_itf *itf, enum 
lp5523_registers addr,
 }
 
 int
-lp5523_get_reg(struct sensor_itf *itf, enum lp5523_registers addr,
+lp5523_get_reg(struct led_itf *itf, enum lp5523_registers addr,
     uint8_t *value)
 {
     int rc;
 
     struct hal_i2c_master_data data_struct = {
-        .address = itf->si_addr,
+        .address = itf->li_addr,
         .len = 1,
         .buffer = &addr
     };
 
     /* Register write */
-    rc = hal_i2c_master_write(itf->si_num, &data_struct,
+    rc = hal_i2c_master_write(itf->li_num, &data_struct,
                               OS_TICKS_PER_SEC / 10, 0);
-    if (rc != 0) {
-        LP5523_ERR("I2C access failed at address 0x%02X\n", itf->si_addr);
+    if (rc) {
+        LP5523_ERR("I2C access failed at address 0x%02X\n", itf->li_addr);
         STATS_INC(g_lp5523stats, write_errors);
-        return rc;
+        goto err;
     }
 
     /* Read one byte back */
     data_struct.buffer = value;
-    rc = hal_i2c_master_read(itf->si_num, &data_struct,
+    rc = hal_i2c_master_read(itf->li_num, &data_struct,
                              OS_TICKS_PER_SEC / 10, 1);
 
-    if (rc != 0) {
-         LP5523_ERR("Failed to read from 0x%02X:0x%02X\n", itf->si_addr, addr);
+    if (rc) {
+         LP5523_ERR("Failed to read from 0x%02X:0x%02X\n", itf->li_addr, addr);
          STATS_INC(g_lp5523stats, read_errors);
     }
+
+err:
     return rc;
 }
 
 static int
-lp5523_set_2_regs(struct sensor_itf *itf, enum lp5523_registers addr,
-    uint8_t vals[2])
+lp5523_set_n_regs(struct led_itf *itf, enum lp5523_registers addr,
+    uint8_t *vals, uint8_t len)
 {
     int rc;
-    uint8_t regs[3];
-
-    regs[0] = addr ;
-    regs[1] = vals[0];
-    regs[2] = vals[1];
+    uint8_t regs[LP5523_MAX_PAYLOAD] = {0};
 
     struct hal_i2c_master_data data_struct = {
-        .address = itf->si_addr,
-        .len = 3,
+        .address = itf->li_addr,
+        .len = len + 1,
         .buffer = regs
     };
 
-    rc = hal_i2c_master_write(itf->si_num, &data_struct,
+    memcpy(regs, vals, len + 1);
+
+    regs[0] = addr;
+
+    rc = hal_i2c_master_write(itf->li_num, &data_struct,
                               (OS_TICKS_PER_SEC / 5), 1);
 
-    if (rc != 0) {
-        LP5523_ERR("Failed to write to 0x%02X:0x%02X\n", itf->si_addr, 
regs[0]);
+    if (rc) {
+        LP5523_ERR("Failed to write to 0x%02X:0x%02X\n", itf->li_addr, 
regs[0]);
         STATS_INC(g_lp5523stats, read_errors);
     }
+
     return rc;
 }
 
 /* XXX: Not sure if ai-read is supported, seems to work for reads of length 2 
*/
 static int
-lp5523_get_2_regs(struct sensor_itf *itf, enum lp5523_registers addr,
-    uint8_t vals[2])
+lp5523_get_n_regs(struct led_itf *itf, enum lp5523_registers addr,
+    uint8_t *vals, uint8_t len)
 {
     int rc;
     uint8_t addr_b = (uint8_t) addr;
 
     struct hal_i2c_master_data data_struct = {
-        .address = itf->si_addr,
+        .address = itf->li_addr,
         .len = 1,
         .buffer = &addr_b
     };
 
-    rc = hal_i2c_master_write(itf->si_num, &data_struct,
+    rc = hal_i2c_master_write(itf->li_num, &data_struct,
         (OS_TICKS_PER_SEC / 10), 0);
 
-    if (rc != 0) {
-        LP5523_ERR("Failed to write to 0x%02X:0x%02X\n", itf->si_addr, addr_b);
+    if (rc) {
+        LP5523_ERR("Failed to write to 0x%02X:0x%02X\n", itf->li_addr, addr_b);
         STATS_INC(g_lp5523stats, read_errors);
         return rc;
     }
 
-    data_struct.len = 2;
+    data_struct.len = len;
     data_struct.buffer = vals;
-    rc = hal_i2c_master_read(itf->si_num, &data_struct,
+    rc = hal_i2c_master_read(itf->li_num, &data_struct,
         OS_TICKS_PER_SEC / 5, 1);
 
-    if (rc != 0) {
-         LP5523_ERR("Failed to read from 0x%02X:0x%02X\n", itf->si_addr,
+    if (rc) {
+         LP5523_ERR("Failed to read from 0x%02X:0x%02X\n", itf->li_addr,
             addr_b);
          STATS_INC(g_lp5523stats, read_errors);
     }
     return rc;
 }
 
+int
+lp5523_calc_temp_comp(float corr_factor, uint8_t *temp_comp)
+{
+    uint8_t val;
+
+    /* To deactivate compensation set temp_comp to 0 */
+    if (corr_factor < -1.5 || corr_factor > 1.5) {
+        return SYS_EINVAL;
+    }
+
+    val = abs(corr_factor/0.1);
+
+    if (corr_factor < 0) {
+        val &= 0x10 & val;
+    }
+
+    return 0;
+}
+
+
 static void
 lp5523_wait(uint32_t ms)
 {
@@ -187,19 +214,19 @@ int lp5523_apply_value(struct lp5523_register_value addr, 
uint8_t value,
 }
 
 int
-lp5523_set_value(struct sensor_itf *itf, struct lp5523_register_value addr,
+lp5523_set_value(struct led_itf *itf, struct lp5523_register_value addr,
     uint8_t value)
 {
     int rc;
     uint8_t reg;
 
     rc = lp5523_get_reg(itf, addr.reg, &reg);
-    if (rc != 0) {
+    if (rc) {
         return rc;
     }
 
     rc = lp5523_apply_value(addr, value, &reg);
-    if (rc != 0) {
+    if (rc) {
         return rc;
     }
 
@@ -207,7 +234,7 @@ lp5523_set_value(struct sensor_itf *itf, struct 
lp5523_register_value addr,
 }
 
 int
-lp5523_get_value(struct sensor_itf *itf, struct lp5523_register_value addr,
+lp5523_get_value(struct led_itf *itf, struct lp5523_register_value addr,
     uint8_t *value)
 {
     int rc;
@@ -221,22 +248,22 @@ lp5523_get_value(struct sensor_itf *itf, struct 
lp5523_register_value addr,
 }
 
 int
-lp5523_set_bitfield(struct sensor_itf *itf, enum lp5523_bitfield_registers 
addr,
+lp5523_set_bitfield(struct led_itf *itf, enum lp5523_bitfield_registers addr,
     uint16_t outputs)
 {
     uint8_t vals[2] = { (outputs >> 8) & 0x01, outputs & 0xff };
 
-    return lp5523_set_2_regs(itf, addr, vals);
+    return lp5523_set_n_regs(itf, addr, vals, 2);
 }
 
 int
-lp5523_get_bitfield(struct sensor_itf *itf, enum lp5523_bitfield_registers 
addr,
+lp5523_get_bitfield(struct led_itf *itf, enum lp5523_bitfield_registers addr,
     uint16_t* outputs)
 {
     int rc;
     uint8_t vals[2];
 
-    rc = lp5523_get_2_regs(itf, addr, vals);
+    rc = lp5523_get_n_regs(itf, addr, vals, 2);
 
     *outputs = ((vals[0] & 0x01) << 8) | vals[1];
 
@@ -244,17 +271,75 @@ lp5523_get_bitfield(struct sensor_itf *itf, enum 
lp5523_bitfield_registers addr,
 }
 
 int
-lp5523_set_output_reg(struct sensor_itf *itf, enum lp5523_output_registers 
addr,
+lp5523_set_output_on(struct led_itf *itf, uint8_t output, uint8_t on)
+{
+    int rc;
+    uint16_t outputs;
+
+    if ((output < 1) || (output > 9)) {
+        rc = -1;
+        goto err;
+    }
+
+    rc = lp5523_get_bitfield(itf, LP5523_OUTPUT_CTRL_MSB,
+                             &outputs);
+    if (rc) {
+        goto err;
+    }
+
+    if (!on) {
+        outputs &= ~(0x1 << (output - 1));
+    } else {
+        outputs |= (0x1 << (output - 1));
+    }
+
+    rc = lp5523_set_bitfield(itf, LP5523_OUTPUT_CTRL_MSB, outputs);
+    if (rc) {
+        goto err;
+    }
+
+    return 0;
+err:
+    return rc;
+}
+
+int
+lp5523_get_output_on(struct led_itf *itf, uint8_t output, uint8_t *on)
+{
+    int rc;
+    uint16_t outputs;
+
+    if ((output < 1) || (output > 9)) {
+        rc = -1;
+        goto err;
+    }
+
+    rc = lp5523_get_bitfield(itf, LP5523_OUTPUT_CTRL_MSB,
+                             &outputs);
+    if (rc) {
+        goto err;
+    }
+
+    *on = (outputs & (0x1 << (output - 1)));
+
+    return 0;
+err:
+    return rc;
+}
+
+int
+lp5523_set_output_reg(struct led_itf *itf, enum lp5523_output_registers addr,
     uint8_t output, uint8_t value)
 {
     if ((output < 1) || (output > 9)) {
         return -1;
     }
+
     return lp5523_set_reg(itf, addr + (output - 1), value);
 }
 
 int
-lp5523_get_output_reg(struct sensor_itf *itf, enum lp5523_output_registers 
addr,
+lp5523_get_output_reg(struct led_itf *itf, enum lp5523_output_registers addr,
     uint8_t output, uint8_t *value)
 {
     if ((output < 1) || (output > 9)) {
@@ -263,8 +348,9 @@ lp5523_get_output_reg(struct sensor_itf *itf, enum 
lp5523_output_registers addr,
     return lp5523_get_reg(itf, addr + (output - 1), value);
 }
 
+
 int
-lp5523_set_engine_reg(struct sensor_itf *itf, enum lp5523_engine_registers 
addr,
+lp5523_set_engine_reg(struct led_itf *itf, enum lp5523_engine_registers addr,
     uint8_t engine, uint8_t value)
 {
     if ((engine < 1) || (engine > 3)) {
@@ -274,7 +360,7 @@ lp5523_set_engine_reg(struct sensor_itf *itf, enum 
lp5523_engine_registers addr,
 }
 
 int
-lp5523_get_engine_reg(struct sensor_itf *itf, enum lp5523_engine_registers 
addr,
+lp5523_get_engine_reg(struct led_itf *itf, enum lp5523_engine_registers addr,
     uint8_t engine, uint8_t *value)
 {
     if ((engine < 1) || (engine > 3)) {
@@ -284,7 +370,7 @@ lp5523_get_engine_reg(struct sensor_itf *itf, enum 
lp5523_engine_registers addr,
 }
 
 int
-lp5523_set_enable(struct sensor_itf *itf, uint8_t enable)
+lp5523_set_enable(struct led_itf *itf, uint8_t enable)
 {
     int rc;
 
@@ -297,7 +383,7 @@ lp5523_set_enable(struct sensor_itf *itf, uint8_t enable)
 }
 
 int
-lp5523_set_engine_control(struct sensor_itf *itf,
+lp5523_set_engine_control(struct led_itf *itf,
     enum lp5523_engine_control_registers addr, uint8_t engine_mask, uint8_t 
values)
 {
     uint8_t reg;
@@ -310,7 +396,7 @@ lp5523_set_engine_control(struct sensor_itf *itf,
     }
 
     rc = lp5523_get_reg(itf, addr, &reg);
-    if (rc != 0) {
+    if (rc) {
         return rc;
     }
 
@@ -321,7 +407,7 @@ lp5523_set_engine_control(struct sensor_itf *itf,
 }
 
 int
-lp5523_set_output_mapping(struct sensor_itf *itf, uint8_t output,
+lp5523_set_output_mapping(struct led_itf *itf, uint8_t output,
     uint8_t mapping)
 {
     struct lp5523_register_value reg;
@@ -337,7 +423,7 @@ lp5523_set_output_mapping(struct sensor_itf *itf, uint8_t 
output,
 }
 
 int
-lp5523_get_output_mapping(struct sensor_itf *itf, uint8_t output,
+lp5523_get_output_mapping(struct led_itf *itf, uint8_t output,
     uint8_t *mapping)
 {
     struct lp5523_register_value reg;
@@ -353,7 +439,7 @@ lp5523_get_output_mapping(struct sensor_itf *itf, uint8_t 
output,
 }
 
 int
-lp5523_set_output_log_dim(struct sensor_itf *itf, uint8_t output,
+lp5523_set_output_log_dim(struct led_itf *itf, uint8_t output,
     uint8_t enable)
 {
     struct lp5523_register_value reg;
@@ -369,7 +455,7 @@ lp5523_set_output_log_dim(struct sensor_itf *itf, uint8_t 
output,
 }
 
 int
-lp5523_get_output_log_dim(struct sensor_itf *itf, uint8_t output,
+lp5523_get_output_log_dim(struct led_itf *itf, uint8_t output,
     uint8_t *enable)
 {
     struct lp5523_register_value reg;
@@ -385,7 +471,7 @@ lp5523_get_output_log_dim(struct sensor_itf *itf, uint8_t 
output,
 }
 
 int
-lp5523_set_output_temp_comp(struct sensor_itf *itf, uint8_t output,
+lp5523_set_output_temp_comp(struct led_itf *itf, uint8_t output,
     uint8_t value)
 {
     struct lp5523_register_value reg;
@@ -401,7 +487,7 @@ lp5523_set_output_temp_comp(struct sensor_itf *itf, uint8_t 
output,
 }
 
 int
-lp5523_get_output_temp_comp(struct sensor_itf *itf, uint8_t output,
+lp5523_get_output_temp_comp(struct led_itf *itf, uint8_t output,
     uint8_t *value)
 {
     struct lp5523_register_value reg;
@@ -417,7 +503,7 @@ lp5523_get_output_temp_comp(struct sensor_itf *itf, uint8_t 
output,
 }
 
 int
-lp5523_get_engine_int(struct sensor_itf *itf, uint8_t engine, uint8_t *flag)
+lp5523_get_engine_int(struct led_itf *itf, uint8_t engine, uint8_t *flag)
 {
     struct lp5523_register_value reg;
 
@@ -432,13 +518,13 @@ lp5523_get_engine_int(struct sensor_itf *itf, uint8_t 
engine, uint8_t *flag)
 }
 
 int
-lp5523_reset(struct sensor_itf *itf)
+lp5523_reset(struct led_itf *itf)
 {
     return lp5523_set_reg(itf, LP5523_RESET, 0xff);
 }
 
 int
-lp5523_set_page_sel(struct sensor_itf *itf, uint8_t page)
+lp5523_set_page_sel(struct led_itf *itf, uint8_t page)
 {
     if (page > 5) {
         return -1;
@@ -447,7 +533,7 @@ lp5523_set_page_sel(struct sensor_itf *itf, uint8_t page)
 }
 
 int
-lp5523_set_engine_mapping(struct sensor_itf *itf, uint8_t engine,
+lp5523_set_engine_mapping(struct led_itf *itf, uint8_t engine,
     uint16_t outputs)
 {
     if ((engine < 1) || (engine > 3)) {
@@ -459,7 +545,7 @@ lp5523_set_engine_mapping(struct sensor_itf *itf, uint8_t 
engine,
 }
 
 int
-lp5523_get_engine_mapping(struct sensor_itf *itf, uint8_t engine,
+lp5523_get_engine_mapping(struct led_itf *itf, uint8_t engine,
     uint16_t *outputs)
 {
     if ((engine < 1) || (engine > 3)) {
@@ -471,20 +557,20 @@ lp5523_get_engine_mapping(struct sensor_itf *itf, uint8_t 
engine,
 }
 
 static int
-lp5523_set_pr_instruction(struct sensor_itf *itf, uint8_t addr, uint16_t *ins)
+lp5523_set_pr_instruction(struct led_itf *itf, uint8_t addr, uint16_t *ins)
 {
     uint8_t mem[2] = { ((*ins) >> 8) & 0x00ff, (*ins) & 0x00ff };
 
-    return lp5523_set_2_regs(itf, LP5523_PROGRAM_MEMORY + (addr << 1), mem);
+    return lp5523_set_n_regs(itf, LP5523_PROGRAM_MEMORY + (addr << 1), mem, 2);
 }
 
 static int
-lp5523_get_pr_instruction(struct sensor_itf *itf, uint8_t addr, uint16_t *ins)
+lp5523_get_pr_instruction(struct led_itf *itf, uint8_t addr, uint16_t *ins)
 {
     int rc;
     uint8_t mem[2];
 
-    rc = lp5523_get_2_regs(itf, LP5523_PROGRAM_MEMORY + (addr << 1), mem);
+    rc = lp5523_get_n_regs(itf, LP5523_PROGRAM_MEMORY + (addr << 1), mem, 2);
 
     *ins = (((uint16_t)mem[0]) << 8) | mem[1];
 
@@ -492,15 +578,15 @@ lp5523_get_pr_instruction(struct sensor_itf *itf, uint8_t 
addr, uint16_t *ins)
 }
 
 static int
-lp5523_verify_pr_instruction(struct sensor_itf *itf, uint8_t addr,
+lp5523_verify_pr_instruction(struct led_itf *itf, uint8_t addr,
     uint16_t *ins)
 {
     int rc;
     uint8_t mem[2];
     uint16_t ver;
 
-    rc = lp5523_get_2_regs(itf, LP5523_PROGRAM_MEMORY + (addr << 1), mem);
-    if (rc != 0) {
+    rc = lp5523_get_n_regs(itf, LP5523_PROGRAM_MEMORY + (addr << 1), mem, 2);
+    if (rc) {
         return rc;
     }
 
@@ -511,7 +597,7 @@ lp5523_verify_pr_instruction(struct sensor_itf *itf, 
uint8_t addr,
 
 
 static int
-lp5523_rwv_page(struct sensor_itf *itf, int(*irwv)(struct sensor_itf *,
+lp5523_rwv_page(struct led_itf *itf, int(*irwv)(struct led_itf *,
     uint8_t, uint16_t *), uint8_t page, uint16_t* pgm,
     uint8_t start, uint8_t size)
 {
@@ -519,14 +605,14 @@ lp5523_rwv_page(struct sensor_itf *itf, int(*irwv)(struct 
sensor_itf *,
     uint8_t i;
 
     rc = lp5523_set_page_sel(itf, page);
-    if (rc != 0) {
+    if (rc) {
         return rc;
     }
 
     i = 0;
     while (i < size) {
         rc = irwv(itf, start, pgm + i);
-        if (rc != 0) {
+        if (rc) {
             return rc;
         }
         ++start;
@@ -536,7 +622,7 @@ lp5523_rwv_page(struct sensor_itf *itf, int(*irwv)(struct 
sensor_itf *,
 }
 
 static int
-lp5523_set_page(struct sensor_itf *itf, uint8_t page, uint16_t* pgm,
+lp5523_set_page(struct led_itf *itf, uint8_t page, uint16_t* pgm,
     uint8_t start, uint8_t size)
 {
     return lp5523_rwv_page(itf, &lp5523_set_pr_instruction, page, pgm, start,
@@ -544,7 +630,7 @@ lp5523_set_page(struct sensor_itf *itf, uint8_t page, 
uint16_t* pgm,
 }
 
 static int
-lp5523_get_page(struct sensor_itf *itf, uint8_t page, uint16_t* pgm,
+lp5523_get_page(struct led_itf *itf, uint8_t page, uint16_t* pgm,
     uint8_t start, uint8_t size)
 {
     return lp5523_rwv_page(itf, &lp5523_get_pr_instruction, page, pgm, start,
@@ -552,7 +638,7 @@ lp5523_get_page(struct sensor_itf *itf, uint8_t page, 
uint16_t* pgm,
 }
 
 static int
-lp5523_verify_page(struct sensor_itf *itf, uint8_t page, uint16_t* pgm,
+lp5523_verify_page(struct led_itf *itf, uint8_t page, uint16_t* pgm,
     uint8_t start, uint8_t size)
 {
     return lp5523_rwv_page(itf, &lp5523_verify_pr_instruction, page, pgm, 
start,
@@ -560,7 +646,7 @@ lp5523_verify_page(struct sensor_itf *itf, uint8_t page, 
uint16_t* pgm,
 }
 
 static int
-lp5523_rwv_program(struct sensor_itf *itf, int(*prw)(struct sensor_itf *,
+lp5523_rwv_program(struct led_itf *itf, int(*prw)(struct led_itf *,
     uint8_t, uint16_t *, uint8_t, uint8_t), uint16_t* pgm, uint8_t start,
     uint8_t size)
 {
@@ -581,7 +667,7 @@ lp5523_rwv_program(struct sensor_itf *itf, int(*prw)(struct 
sensor_itf *,
 
     if (page == last_page) {
         rc = prw(itf, page, pgm, start_rel, size);
-        if (rc != 0) {
+        if (rc) {
             return rc;
         }
     } else {
@@ -590,7 +676,7 @@ lp5523_rwv_program(struct sensor_itf *itf, int(*prw)(struct 
sensor_itf *,
 
         write_size = LP5523_PAGE_SIZE - start_rel;
         rc = prw(itf, page, pgm, start_rel, write_size);
-        if (rc != 0) {
+        if (rc) {
             return rc;
         }
         ++page;
@@ -598,7 +684,7 @@ lp5523_rwv_program(struct sensor_itf *itf, int(*prw)(struct 
sensor_itf *,
 
         while (page < last_page) {
             rc = prw(itf, page, pgm, 0, LP5523_PAGE_SIZE);
-            if (rc != 0) {
+            if (rc) {
                 return rc;
             }
             ++page;
@@ -613,27 +699,27 @@ lp5523_rwv_program(struct sensor_itf *itf, 
int(*prw)(struct sensor_itf *,
 }
 
 int
-lp5523_set_instruction(struct sensor_itf *itf, uint8_t addr, uint16_t ins)
+lp5523_set_instruction(struct led_itf *itf, uint8_t addr, uint16_t ins)
 {
     int rc;
 
     rc = lp5523_set_page_sel(itf, addr / LP5523_PAGE_SIZE);
-    return (rc != 0) ? rc : lp5523_set_pr_instruction(itf,
+    return (rc) ? rc : lp5523_set_pr_instruction(itf,
         addr % LP5523_PAGE_SIZE, &ins);
 }
 
 int
-lp5523_get_instruction(struct sensor_itf *itf, uint8_t addr, uint16_t *ins)
+lp5523_get_instruction(struct led_itf *itf, uint8_t addr, uint16_t *ins)
 {
     int rc;
 
     rc = lp5523_set_page_sel(itf, addr / LP5523_PAGE_SIZE);
-    return (rc != 0) ? rc : lp5523_get_pr_instruction(itf,
+    return (rc) ? rc : lp5523_get_pr_instruction(itf,
         addr % LP5523_PAGE_SIZE, ins);
 }
 
 int
-lp5523_set_program(struct sensor_itf *itf, uint8_t engine_mask, uint16_t *pgm,
+lp5523_set_program(struct led_itf *itf, uint8_t engine_mask, uint16_t *pgm,
     uint8_t start, uint8_t size)
 {
     int rc;
@@ -645,14 +731,14 @@ lp5523_set_program(struct sensor_itf *itf, uint8_t 
engine_mask, uint16_t *pgm,
     /* disable engines */
     rc = lp5523_set_engine_control(itf, LP5523_ENGINE_CNTRL2, engine_mask,
         LP5523_ENGINES_DISABLED);
-    if (rc != 0) {
+    if (rc) {
         return rc;
     }
 
     /* put engines into load program state */
     rc = lp5523_set_engine_control(itf, LP5523_ENGINE_CNTRL2, engine_mask,
         LP5523_ENGINES_LOAD_PROGRAM);
-    if (rc != 0) {
+    if (rc) {
         return rc;
     }
 
@@ -663,53 +749,53 @@ lp5523_set_program(struct sensor_itf *itf, uint8_t 
engine_mask, uint16_t *pgm,
 }
 
 int
-lp5523_get_program(struct sensor_itf *itf, uint16_t *pgm, uint8_t start,
+lp5523_get_program(struct led_itf *itf, uint16_t *pgm, uint8_t start,
     uint8_t size)
 {
     return lp5523_rwv_program(itf, &lp5523_get_page, pgm, start, size);
 }
 
 int
-lp5523_verify_program(struct sensor_itf *itf, uint16_t *pgm, uint8_t start,
+lp5523_verify_program(struct led_itf *itf, uint16_t *pgm, uint8_t start,
     uint8_t size)
 {
     return lp5523_rwv_program(itf, &lp5523_verify_page, pgm, start, size);
 }
 
 int
-lp5523_engines_run(struct sensor_itf *itf, uint8_t engine_mask)
+lp5523_engines_run(struct led_itf *itf, uint8_t engine_mask)
 {
     int rc;
 
     rc = lp5523_set_engine_control(itf, LP5523_ENGINE_CNTRL1, engine_mask,
         LP5523_ENGINES_FREE_RUN);
-    return (rc != 0) ? rc : lp5523_set_engine_control(itf, 
LP5523_ENGINE_CNTRL2,
+    return (rc) ? rc : lp5523_set_engine_control(itf, LP5523_ENGINE_CNTRL2,
         engine_mask, LP5523_ENGINES_RUN_PROGRAM);
 }
 
 int
-lp5523_engines_hold(struct sensor_itf *itf, uint8_t engine_mask)
+lp5523_engines_hold(struct led_itf *itf, uint8_t engine_mask)
 {
     return lp5523_set_engine_control(itf, LP5523_ENGINE_CNTRL1, engine_mask,
         LP5523_ENGINES_HOLD);
 }
 
 int
-lp5523_engines_step(struct sensor_itf *itf, uint8_t engine_mask)
+lp5523_engines_step(struct led_itf *itf, uint8_t engine_mask)
 {
     return lp5523_set_engine_control(itf, LP5523_ENGINE_CNTRL1, engine_mask,
         LP5523_ENGINES_STEP);
 }
 
 int
-lp5523_engines_disable(struct sensor_itf *itf, uint8_t engine_mask)
+lp5523_engines_disable(struct led_itf *itf, uint8_t engine_mask)
 {
     return lp5523_set_engine_control(itf, LP5523_ENGINE_CNTRL2, engine_mask,
         LP5523_ENGINES_DISABLED);
 }
 
 int
-lp5523_read_adc(struct sensor_itf *itf, uint8_t pin, uint8_t *v) {
+lp5523_read_adc(struct led_itf *itf, uint8_t pin, uint8_t *v) {
     int rc;
 
     if (pin > 0x1f) {
@@ -718,7 +804,7 @@ lp5523_read_adc(struct sensor_itf *itf, uint8_t pin, 
uint8_t *v) {
 
     rc = lp5523_set_reg(itf, LP5523_LED_TEST_CONTROL,
         pin | LP5523_EN_LED_TEST_ADC.mask);
-    if (rc != 0) {
+    if (rc) {
         return rc;
     }
 
@@ -728,7 +814,23 @@ lp5523_read_adc(struct sensor_itf *itf, uint8_t pin, 
uint8_t *v) {
 }
 
 int
-lp5523_self_test(struct sensor_itf *itf) {
+lp5523_get_status(struct led_itf *itf, uint8_t *status)
+{
+    uint8_t reg;
+    int rc;
+
+    rc = lp5523_get_reg(itf, LP5523_STATUS, &reg);
+    if (rc) {
+        return rc;
+    }
+
+    *status = reg;
+
+    return 0;
+}
+
+int
+lp5523_self_test(struct led_itf *itf) {
     int rc;
     uint8_t status;
     uint8_t misc;
@@ -736,13 +838,13 @@ lp5523_self_test(struct sensor_itf *itf) {
     uint8_t adc;
     uint8_t i;
 
-    rc = lp5523_get_reg(itf, LP5523_STATUS, &status);
-    if (rc != 0) {
+    rc = lp5523_get_status(itf, &status);
+    if (rc) {
         return rc;
     }
 
     rc = lp5523_get_reg(itf, LP5523_MISC, &misc);
-    if (rc != 0) {
+    if (rc) {
         return rc;
     }
 
@@ -754,7 +856,7 @@ lp5523_self_test(struct sensor_itf *itf) {
 
     /* measure VDD */
     rc = lp5523_read_adc(itf, LP5523_LED_TEST_VDD, &vdd);
-    if (rc != 0) {
+    if (rc) {
         return rc;
     }
 
@@ -762,7 +864,7 @@ lp5523_self_test(struct sensor_itf *itf) {
     while (i <= 9) {
         /* set LED PWM to 0xff */
         rc = lp5523_set_output_reg(itf, LP5523_PWM, i, 0xff);
-        if (rc != 0) {
+        if (rc) {
             return rc;
         }
 
@@ -771,7 +873,7 @@ lp5523_self_test(struct sensor_itf *itf) {
 
         /* read the ADC */
         rc = lp5523_read_adc(itf, i - 1, &adc);
-        if (rc != 0) {
+        if (rc) {
             return rc;
         }
         if ((adc > vdd) || (adc < LP5523_LED_TEST_SC_LIM)) {
@@ -779,7 +881,7 @@ lp5523_self_test(struct sensor_itf *itf) {
         }
 
         rc = lp5523_set_output_reg(itf, LP5523_PWM, i, 0x00);
-        if (rc != 0) {
+        if (rc) {
             return rc;
         }
         ++i;
@@ -791,21 +893,15 @@ lp5523_self_test(struct sensor_itf *itf) {
 int
 lp5523_init(struct os_dev *dev, void *arg)
 {
-    struct lp5523 *lp;
-    struct sensor *sensor;
     int rc;
 
     if (!arg || !dev) {
         return SYS_ENODEV;
     }
 
-    lp = (struct lp5523 *)dev;
-
     log_register(dev->od_name, &_log, &log_console_handler, NULL,
         LOG_SYSLEVEL);
 
-    sensor = &lp->sensor;
-
     /* Initialise the stats entry */
     rc = stats_init(
         STATS_HDR(g_lp5523stats),
@@ -816,62 +912,137 @@ lp5523_init(struct os_dev *dev, void *arg)
     rc = stats_register(dev->od_name, STATS_HDR(g_lp5523stats));
     SYSINIT_PANIC_ASSERT(rc == 0);
 
-    rc = sensor_init(sensor, dev);
-    if (rc != 0) {
-        return rc;
-    }
+    return 0;
+}
 
-    rc = sensor_set_interface(sensor, arg);
-    if (rc != 0) {
-        return rc;
-    }
+int
+lp5523_get_output_curr_ctrl(struct led_itf *itf, uint8_t output, uint8_t 
*curr_ctrl)
+{
+      int rc;
+      uint8_t reg;
+
+      rc = lp5523_get_output_reg(itf, LP5523_CURRENT_CONTROL, output, &reg);
+      if (rc) {
+          goto err;
+      }
+
+      *curr_ctrl = reg;
+err:
+      return rc;
+}
+
+int
+lp5523_set_output_curr_ctrl(struct led_itf *itf, uint8_t output, uint8_t 
curr_ctrl)
+{
 
-    return sensor_mgr_register(sensor);
+      return lp5523_set_output_reg(itf, LP5523_CURRENT_CONTROL, output, 
curr_ctrl);
 }
 
 int
-lp5523_config(struct lp5523 *lp, struct lp5523_cfg *cfg)
+lp5523_config(struct lp5523 *lp5523, struct lp5523_cfg *cfg)
 {
     int rc;
-    struct sensor_itf *itf;
+    int i;
+    struct led_itf *itf;
     uint8_t misc_val;
 
-    itf = SENSOR_GET_ITF(&(lp->sensor));
+    itf = LED_GET_ITF(&(lp5523->led_dev));
 
-    itf->si_addr = LP5523_I2C_BASE_ADDR + cfg->asel;
+    itf->li_addr = LP5523_I2C_BASE_ADDR + cfg->asel;
 
     rc = lp5523_reset(itf);
-    if (rc != 0) {
+    if (rc) {
         return rc;
     }
 
     /* chip enable */
     rc = lp5523_set_enable(itf, 1);
-    if (rc != 0) {
-        return rc;
+    if (rc) {
+        goto err;
     }
 
-    misc_val = LP5523_EN_AUTO_INCR.mask;
+    misc_val = 0;
+    if (cfg->auto_inc_en) {
+        misc_val = LP5523_EN_AUTO_INCR.mask;
+    } else {
+        misc_val = LP5523_CLK_DET_EN.mask;
+    }
 
     rc = lp5523_apply_value(LP5523_CLK_DET_EN, cfg->clk_det_en, &misc_val);
-    if (rc != 0) {
-        return rc;
+    if (rc) {
+        goto err;
     }
 
     rc = lp5523_apply_value(LP5523_INT_CLK_EN, cfg->int_clk_en, &misc_val);
-    if (rc != 0) {
-        return rc;
+    if (rc) {
+        goto err;
+    }
+
+    rc = lp5523_apply_value(LP5523_VARIABLE_D_SEL, cfg->var_d_sel, &misc_val);
+    if (rc) {
+        goto err;
+    }
+
+    rc = lp5523_apply_value(LP5523_POWERSAVE_EN, cfg->ps_en, &misc_val);
+    if (rc) {
+        goto err;
+    }
+
+    rc = lp5523_apply_value(LP5523_PWM_PS_EN, cfg->pwm_ps_en, &misc_val);
+    if (rc) {
+        goto err;
     }
 
     rc = lp5523_apply_value(LP5523_CP_MODE, cfg->cp_mode, &misc_val);
-    if (rc != 0) {
-        return rc;
+    if (rc) {
+        goto err;
     }
 
     rc = lp5523_set_reg(itf, LP5523_MISC, misc_val);
-    if (rc != 0) {
-        return rc;
+    if (rc) {
+        goto err;
     }
 
-    return lp5523_set_value(itf, LP5523_INT_CONF, cfg->int_conf);
+    rc = lp5523_set_value(itf, LP5523_INT_CONF, cfg->int_conf);
+    if (rc) {
+        goto err;
+    }
+
+    rc = lp5523_set_value(itf, LP5523_INT_GPO, cfg->int_gpo);
+    if (rc) {
+        goto err;
+    }
+
+    for (i = 1; i <= MYNEWT_VAL(LEDS_PER_DRIVER); i++) {
+        rc = lp5523_set_output_curr_ctrl(itf, i, cfg->per_led_cfg[i - 
1].current_ctrl);
+        if (rc) {
+            goto err;
+        }
+
+        lp5523_wait(1);
+
+        rc = lp5523_set_output_log_dim(itf, i, cfg->per_led_cfg[i - 
1].log_dim_en);
+        if (rc) {
+            goto err;
+        }
+
+        lp5523_wait(1);
+
+        rc = lp5523_set_output_temp_comp(itf, i, cfg->per_led_cfg[i - 
1].temp_comp);
+        if (rc) {
+            goto err;
+        }
+
+        lp5523_wait(1);
+
+        rc = lp5523_set_output_on(itf, i, cfg->per_led_cfg[i - 1].output_on);
+        if (rc) {
+            goto err;
+        }
+
+        lp5523_wait(1);
+    }
+
+err:
+    return rc;
 }
diff --git a/hw/drivers/lp5523/src/lp5523_shell.c 
b/hw/drivers/lp5523/src/lp5523_shell.c
index 991414a10f..43cd5cdfd4 100644
--- a/hw/drivers/lp5523/src/lp5523_shell.c
+++ b/hw/drivers/lp5523/src/lp5523_shell.c
@@ -36,10 +36,10 @@ static struct shell_cmd lp5523_shell_cmd_struct = {
     .sc_cmd_func = lp5523_shell_cmd
 };
 
-static struct sensor_itf lp5523_itf = {
-    .si_type = MYNEWT_VAL(LP5523_SHELL_ITF_TYPE),
-    .si_num = MYNEWT_VAL(LP5523_SHELL_ITF_NUM),
-    .si_addr = MYNEWT_VAL(LP5523_SHELL_ITF_ADDR)
+static struct led_itf lp5523_itf = {
+    .li_type = MYNEWT_VAL(LP5523_SHELL_ITF_TYPE),
+    .li_num = MYNEWT_VAL(LP5523_SHELL_ITF_NUM),
+    .li_addr = MYNEWT_VAL(LP5523_SHELL_ITF_ADDR)
 };
 
 static int
diff --git a/hw/drivers/lp5523/syscfg.yml b/hw/drivers/lp5523/syscfg.yml
index 416f0a4839..01df75350f 100644
--- a/hw/drivers/lp5523/syscfg.yml
+++ b/hw/drivers/lp5523/syscfg.yml
@@ -29,4 +29,7 @@ syscfg.defs:
         value: 0
     LP5523_SHELL_ITF_ADDR:
         description: 'LP5523 I2C Address'
-        value: 0x32
\ No newline at end of file
+        value: 0x32
+    LP5523_LEDS_PER_DRIVER:
+        description: 'LP5523 LEDs per driver'
+        value: 5


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to