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 &= ~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 |= 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, ®); + + /* 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);