summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDuncan Laurie <dlaurie@chromium.org>2013-10-21 08:40:26 -0700
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2013-10-21 18:36:27 +0000
commit2d37bb2a644071bdf411b8d97f4aff085fe0712b (patch)
treedb7af2cb4255482ad052f4ceadd91a3c89e8f14c
parent992a61076187b858b1e8477eda1a4c54044891da (diff)
downloadchrome-ec-2d37bb2a644071bdf411b8d97f4aff085fe0712b.tar.gz
samus: Add hook/hack to enable backlight PWM
The backlight controller EEPROM is not enabling PWM mode and it is reloaded every time the backlight state is changed. Since we no longer have signals indicating when the PCH is enabling or disabling backlight this hack will read the controller every second at runtime to determine if it needs to enable PWM mode. This should be removed with the next build when the EEPROM is changed to enable PWM mode by default. BUG=chrome-os-partner:23449 BRANCH=samus TEST=emerge-samus chromeos-ec Change-Id: I5c4acb1115acb7a4a5b04d09c1317778eeb2998d Signed-off-by: Duncan Laurie <dlaurie@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/173836 Reviewed-by: Randall Spangler <rspangler@chromium.org>
-rw-r--r--board/samus/board.h7
-rw-r--r--board/samus/build.mk2
-rw-r--r--board/samus/panel.c105
3 files changed, 112 insertions, 2 deletions
diff --git a/board/samus/board.h b/board/samus/board.h
index 684a8a6774..4f20537c36 100644
--- a/board/samus/board.h
+++ b/board/samus/board.h
@@ -29,7 +29,6 @@
#define CONFIG_BATTERY_CHECK_CONNECTED
#define CONFIG_BATTERY_LINK
#define CONFIG_BATTERY_SMART
-#define CONFIG_BACKLIGHT_LID
#define CONFIG_CHARGER
#define CONFIG_CHARGER_BQ24715
/* 10mOhm sense resitors. */
@@ -65,11 +64,17 @@ enum module_id {
};
/* I2C ports */
+#define I2C_PORT_BACKLIGHT 0
#define I2C_PORT_BATTERY 0
#define I2C_PORT_CHARGER 0
+#define I2C_PORT_ALS 1
+#define I2C_PORT_CAPSENSE 1
#define I2C_PORT_LIGHTBAR 1
#define I2C_PORT_THERMAL 5
+/* Backlight I2C device address */
+#define I2C_ADDR_BACKLIGHT ((0x2C << 1) | I2C_FLAG_BIG_ENDIAN)
+
/* 13x8 keyboard scanner uses an entire GPIO bank for row inputs */
#define KB_SCAN_ROW_IRQ LM4_IRQ_GPIOK
#define KB_SCAN_ROW_GPIO LM4_GPIO_K
diff --git a/board/samus/build.mk b/board/samus/build.mk
index 7bbc05b261..9f1237d90c 100644
--- a/board/samus/build.mk
+++ b/board/samus/build.mk
@@ -9,4 +9,4 @@
# the IC is TI Stellaris LM4
CHIP:=lm4
-board-y=board.o power_sequence.o
+board-y=board.o power_sequence.o panel.o
diff --git a/board/samus/panel.c b/board/samus/panel.c
new file mode 100644
index 0000000000..5704179d5d
--- /dev/null
+++ b/board/samus/panel.c
@@ -0,0 +1,105 @@
+/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "chipset.h"
+#include "common.h"
+#include "console.h"
+#include "gpio.h"
+#include "hooks.h"
+#include "host_command.h"
+#include "i2c.h"
+#include "lid_switch.h"
+
+#define LP8555_REG_COMMAND 0x00
+#define LP8555_REG_COMMAND_ON 0x01
+#define LP8555_REG_CONFIG 0x10
+#define LP8555_REG_CONFIG_MODE_MASK 0x03
+#define LP8555_REG_CONFIG_MODE_PWM 0x00
+
+/**
+ * Enable PWM mode in backlight controller and turn it on.
+ */
+static int lp8555_enable_pwm_mode(void)
+{
+ int reg;
+
+ /* Enable PWM mode. */
+ i2c_read8(I2C_PORT_BACKLIGHT, I2C_ADDR_BACKLIGHT,
+ LP8555_REG_CONFIG, &reg);
+ reg &= ~LP8555_REG_CONFIG_MODE_MASK;
+ reg |= LP8555_REG_CONFIG_MODE_PWM;
+ i2c_write8(I2C_PORT_BACKLIGHT, I2C_ADDR_BACKLIGHT,
+ LP8555_REG_CONFIG, reg);
+
+ /* Power on. */
+ i2c_read8(I2C_PORT_BACKLIGHT, I2C_ADDR_BACKLIGHT,
+ LP8555_REG_COMMAND, &reg);
+ reg |= LP8555_REG_COMMAND_ON;
+ i2c_write8(I2C_PORT_BACKLIGHT, I2C_ADDR_BACKLIGHT,
+ LP8555_REG_COMMAND, reg);
+
+ return EC_SUCCESS;
+}
+
+/**
+ * Host command to toggle backlight.
+ */
+static int switch_command_enable_backlight(struct host_cmd_handler_args *args)
+{
+ const struct ec_params_switch_enable_backlight *p = args->params;
+
+ gpio_set_level(GPIO_ENABLE_BACKLIGHT, p->enabled);
+
+ if (p->enabled)
+ lp8555_enable_pwm_mode();
+
+ return EC_RES_SUCCESS;
+}
+DECLARE_HOST_COMMAND(EC_CMD_SWITCH_ENABLE_BKLIGHT,
+ switch_command_enable_backlight,
+ EC_VER_MASK(0));
+
+/**
+ * Hook to turn backlight PWM mode on if it turns off.
+ */
+static void backlight_pwm_mode_hook(void)
+{
+ int reg;
+
+ /* Only check if the system is powered. */
+ if (!chipset_in_state(CHIPSET_STATE_ON))
+ return;
+
+ /* Read current command reg to see if it is on. */
+ i2c_read8(I2C_PORT_BACKLIGHT, I2C_ADDR_BACKLIGHT,
+ LP8555_REG_COMMAND, &reg);
+
+ /* Turn it on if needed. */
+ if (!(reg & LP8555_REG_COMMAND_ON))
+ lp8555_enable_pwm_mode();
+}
+DECLARE_HOOK(HOOK_SECOND, backlight_pwm_mode_hook, HOOK_PRIO_LAST);
+
+/**
+ * Update backlight state.
+ */
+static void update_backlight(void)
+{
+ /*
+ * Enable backlight if lid is open; this is AND'd with the request from
+ * the AP in hardware.
+ */
+ gpio_set_level(GPIO_ENABLE_BACKLIGHT, lid_is_open());
+}
+DECLARE_HOOK(HOOK_LID_CHANGE, update_backlight, HOOK_PRIO_DEFAULT);
+
+/**
+ * Initialize backlight module.
+ */
+static void backlight_init(void)
+{
+ update_backlight();
+}
+DECLARE_HOOK(HOOK_INIT, backlight_init, HOOK_PRIO_DEFAULT);