summaryrefslogtreecommitdiff
path: root/driver/led
diff options
context:
space:
mode:
authorDaisuke Nojiri <dnojiri@chromium.org>2018-04-20 14:29:13 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-04-27 21:27:29 -0700
commit3fbf2c47ae847112044c529bb54655841e53014a (patch)
treec362366276e9163595952460b59de2512d1ca0ca /driver/led
parent102ad072922da1c510446fb3bb4d14c5eb815cec (diff)
downloadchrome-ec-3fbf2c47ae847112044c529bb54655841e53014a.tar.gz
Nami: Add keyboard backlight control
This implements keyboard backlight control for Nami, Vayne, Pantheon, and Sona. On Sona, GPIOC4 is directly connected to the LED strings. Thus, we use PWM to control the brightness. On the other variants, the LED strings are connected to LM3509. Thus, we control the brightness through I2C. Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org> BUG=b:76182445,b:78141647 BRANCH=none TEST=Verify keyboard backlight brightness changes on Nami. Verify keyboard backlight turns on/off on lid close/open, sleep/suspend. on Nami. Verify 'kblight' returns x set by 'kblight x' on Sona. Change-Id: I400ea2bc7a58a3cc57eb959179d2139a99ac176c Reviewed-on: https://chromium-review.googlesource.com/1022833 Commit-Ready: Daisuke Nojiri <dnojiri@chromium.org> Tested-by: Daisuke Nojiri <dnojiri@chromium.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org> Reviewed-by: Aaron Durbin <adurbin@google.com>
Diffstat (limited to 'driver/led')
-rw-r--r--driver/led/lm3509.c82
-rw-r--r--driver/led/lm3509.h28
2 files changed, 89 insertions, 21 deletions
diff --git a/driver/led/lm3509.c b/driver/led/lm3509.c
index 463627a210..58838e2bbe 100644
--- a/driver/led/lm3509.c
+++ b/driver/led/lm3509.c
@@ -5,6 +5,7 @@
* TI LM3509 LED driver.
*/
+#include "compile_time_macros.h"
#include "i2c.h"
#include "lm3509.h"
@@ -13,31 +14,78 @@ inline int lm3509_write(uint8_t reg, uint8_t val)
return i2c_write8(I2C_PORT_KBLIGHT, LM3509_I2C_ADDR, reg, val);
}
-int lm3509_poweron(void)
+inline int lm3509_read(uint8_t reg, int *val)
{
- int ret = 0;
+ return i2c_read8(I2C_PORT_KBLIGHT, LM3509_I2C_ADDR, reg, val);
+}
- /* BIT= description
- * [2]= set both main and seconfary current same, both control by BMAIN.
- * [1]= enable secondary current sink.
- * [0]= enable main current sink.
- */
- ret |= lm3509_write(LM3509_REG_GP, 0x07);
- /* Brigntness register
- * 0x00= 0%
- * 0x1F= 100%
- */
- ret |= lm3509_write(LM3509_REG_BMAIN, 0x1F);
+/* Brightness level (0.0 to 100.0%) to brightness register conversion table */
+static const uint16_t lm3509_brightness[32] = {
+ 0, 1, 6, 10, 11, 13, 16, 20,
+ 24, 28, 31, 37, 43, 52, 62, 75,
+ 87, 100, 125, 150, 168, 187, 225, 262,
+ 312, 375, 437, 525, 612, 700, 875, 1000
+};
- return ret;
+static int brightness_to_bmain(int percent)
+{
+ int i;
+ int b = percent * 10;
+
+ for (i = 1; i < sizeof(lm3509_brightness); i++) {
+ int low = lm3509_brightness[i - 1];
+ int high = lm3509_brightness[i];
+ if (high < b)
+ continue;
+ /* rounding to the nearest */
+ return (b - low < high - b) ? i - 1 : i;
+ }
+ /* Brightness is out of range. Return the highest value. */
+ return i - 1;
}
-int lm3509_poweroff(void)
+int lm3509_power(int enable)
{
int ret = 0;
+ uint8_t gp = 0, bmain = 0;
+
+ if (enable) {
+ /*
+ * [2]= set both main and secondary current same
+ * both control by BMAIN.
+ * [1]= enable secondary current sink.
+ * [0]= enable main current sink.
+ */
+ gp = 0x07;
+ /*
+ * Brightness register
+ * 0x00= 0%
+ * 0x1F= 100%
+ */
+ bmain = ARRAY_SIZE(lm3509_brightness) - 1;
+ }
- ret |= lm3509_write(LM3509_REG_GP, 0x00);
- ret |= lm3509_write(LM3509_REG_BMAIN, 0x00);
+ ret |= lm3509_write(LM3509_REG_GP, gp);
+ ret |= lm3509_write(LM3509_REG_BMAIN, bmain);
return ret;
}
+
+int lm3509_set_brightness(int percent)
+{
+ /* We don't need to read/mask/write BMAIN because bit6 and 7 are non
+ * functional read only bits.
+ */
+ return lm3509_write(LM3509_REG_BMAIN, brightness_to_bmain(percent));
+}
+
+int lm3509_get_brightness(int *percent)
+{
+ int rv, val;
+ rv = lm3509_read(LM3509_REG_BMAIN, &val);
+ if (rv)
+ return rv;
+ val &= LM3509_BMAIN_MASK;
+ *percent = lm3509_brightness[val] / 10;
+ return EC_SUCCESS;
+}
diff --git a/driver/led/lm3509.h b/driver/led/lm3509.h
index ca8c67edbf..12ca480562 100644
--- a/driver/led/lm3509.h
+++ b/driver/led/lm3509.h
@@ -15,10 +15,30 @@
#define LM3509_REG_BMAIN 0xA0
#define LM3509_REG_BSUB 0xB0
-/* Power on and initialize LM3509. */
-int lm3509_poweron(void);
+#define LM3509_BMAIN_MASK 0x1F
-/* Power off LM3509. */
-int lm3509_poweroff(void);
+/**
+ * Power on/off and initialize LM3509.
+ *
+ * @param enable: 1 to enable or 0 to disable.
+ * @return EC_SUCCESS or EC_ERROR_* on error.
+ */
+int lm3509_power(int enable);
+
+/**
+ * Set brightness level
+ *
+ * @param percent: Brightness level: 0 - 100%
+ * @return EC_SUCCESS or EC_ERROR_* on error.
+ */
+int lm3509_set_brightness(int percent);
+
+/**
+ * Get current brightness level
+ *
+ * @param percent: Current brightness level.
+ * @return EC_SUCCESS or EC_ERROR_* on error.
+ */
+int lm3509_get_brightness(int *percent);
#endif /* __CROS_EC_LM3509_H */