mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-08 16:41:55 +00:00
samus: Changes for Proto1b
- disable PP1800_PGOOD internal pullup - add PP3300_DSW_EN control on PF6, turned on in S5 and off in G3 - change PCH_WAKE_L and PCH_PWRBTN_L to open drain signals - add PCH_BL_EN interrupt on PM3 for rising edge to put backlight controller into PWM mode, remove 1 second hook - add samus-specific extpower handler for AC_PRESENT to buffer the AC_PRESENT input to the new PCH_ACOK output on PM6. this is driven high in S5/S3/S0 when AC_PRESENT is high, otherwise driven low. BUG=chrome-os-partner:23752 BRANCH=samus TEST=emerge-samus chromeos-ec Change-Id: Ie8ab538610e41914212ee1f3a6287b63474fb85b Signed-off-by: Duncan Laurie <dlaurie@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/175281 Reviewed-by: Bill Richardson <wfrichar@chromium.org>
This commit is contained in:
committed by
chrome-internal-fetch
parent
6aa0a79f28
commit
fa13ac76b1
@@ -52,7 +52,7 @@ const struct gpio_info gpio_list[] = {
|
||||
x86_interrupt},
|
||||
{"PP1200_PGOOD", LM4_GPIO_H, (1<<6), GPIO_INT_BOTH,
|
||||
x86_interrupt},
|
||||
{"PP1800_PGOOD", LM4_GPIO_L, (1<<7), GPIO_PULL_UP|GPIO_INT_BOTH,
|
||||
{"PP1800_PGOOD", LM4_GPIO_L, (1<<7), GPIO_INT_BOTH,
|
||||
x86_interrupt},
|
||||
{"VCORE_PGOOD", LM4_GPIO_C, (1<<6), GPIO_INT_BOTH,
|
||||
x86_interrupt},
|
||||
@@ -60,6 +60,8 @@ const struct gpio_info gpio_list[] = {
|
||||
switch_interrupt},
|
||||
{"WP_L", LM4_GPIO_A, (1<<4), GPIO_INT_BOTH,
|
||||
switch_interrupt},
|
||||
{"PCH_BL_EN", LM4_GPIO_M, (1<<3), GPIO_INT_RISING,
|
||||
backlight_interrupt},
|
||||
|
||||
/* Other inputs */
|
||||
{"BOARD_VERSION1", LM4_GPIO_Q, (1<<5), GPIO_INPUT, NULL},
|
||||
@@ -78,6 +80,7 @@ const struct gpio_info gpio_list[] = {
|
||||
/* Outputs; all unasserted by default except for reset signals */
|
||||
{"CPU_PROCHOT", LM4_GPIO_B, (1<<1), GPIO_OUT_LOW, NULL},
|
||||
{"PP1200_EN", LM4_GPIO_H, (1<<5), GPIO_OUT_LOW, NULL},
|
||||
{"PP3300_DSW_EN", LM4_GPIO_F, (1<<6), GPIO_OUT_LOW, NULL},
|
||||
{"PP3300_DSW_GATED_EN", LM4_GPIO_J, (1<<3), GPIO_OUT_LOW, NULL},
|
||||
{"PP3300_LTE_EN", LM4_GPIO_D, (1<<2), GPIO_OUT_LOW, NULL},
|
||||
{"PP3300_WLAN_EN", LM4_GPIO_J, (1<<0), GPIO_OUT_LOW, NULL},
|
||||
@@ -98,14 +101,15 @@ const struct gpio_info gpio_list[] = {
|
||||
* input until we drive it high. So can't use open-drain (HI_Z).
|
||||
*/
|
||||
{"PCH_HDA_SDO", LM4_GPIO_G, (1<<1), GPIO_INPUT, NULL},
|
||||
{"PCH_WAKE_L", LM4_GPIO_F, (1<<0), GPIO_OUT_HIGH, NULL},
|
||||
{"PCH_WAKE_L", LM4_GPIO_F, (1<<0), GPIO_ODR_HIGH, NULL},
|
||||
{"PCH_NMI_L", LM4_GPIO_F, (1<<2), GPIO_ODR_HIGH, NULL},
|
||||
{"PCH_PWRBTN_L", LM4_GPIO_H, (1<<0), GPIO_OUT_HIGH, NULL},
|
||||
{"PCH_PWRBTN_L", LM4_GPIO_H, (1<<0), GPIO_ODR_HIGH, NULL},
|
||||
{"PCH_PWROK", LM4_GPIO_F, (1<<5), GPIO_OUT_LOW, NULL},
|
||||
{"PCH_RCIN_L", LM4_GPIO_F, (1<<3), GPIO_ODR_HIGH, NULL},
|
||||
{"PCH_SYS_RST_L", LM4_GPIO_F, (1<<1), GPIO_ODR_HIGH, NULL},
|
||||
{"PCH_SMI_L", LM4_GPIO_F, (1<<4), GPIO_ODR_HIGH, NULL},
|
||||
{"TOUCHSCREEN_RESET_L", LM4_GPIO_N, (1<<7), GPIO_OUT_LOW, NULL},
|
||||
{"PCH_ACOK", LM4_GPIO_M, (1<<6), GPIO_OUT_LOW, NULL},
|
||||
#ifndef HEY_USE_BUILTIN_CLKRUN
|
||||
{"LPC_CLKRUN_L", LM4_GPIO_M, (1<<2), GPIO_ODR_HIGH, NULL},
|
||||
#endif
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
#define CONFIG_BOARD_VERSION
|
||||
#define CONFIG_CHIPSET_X86
|
||||
#define CONFIG_CHIPSET_CAN_THROTTLE
|
||||
#define CONFIG_EXTPOWER_GPIO
|
||||
#define CONFIG_KEYBOARD_BOARD_CONFIG
|
||||
#define CONFIG_KEYBOARD_PROTOCOL_8042
|
||||
#define CONFIG_LED_DRIVER_DS2413
|
||||
@@ -87,6 +86,7 @@ enum gpio_signal {
|
||||
GPIO_VCORE_PGOOD, /* Power good on core VR */
|
||||
GPIO_RECOVERY_L, /* Recovery signal from servo */
|
||||
GPIO_WP_L, /* Write protect input */
|
||||
GPIO_PCH_BL_EN, /* PCH backlight input */
|
||||
|
||||
/* Other inputs */
|
||||
GPIO_BOARD_VERSION1, /* Board version stuffing resistor 1 */
|
||||
@@ -104,7 +104,8 @@ enum gpio_signal {
|
||||
/* Outputs */
|
||||
GPIO_CPU_PROCHOT, /* Force CPU to think it's overheated */
|
||||
GPIO_PP1200_EN, /* Enable 1.20V supply */
|
||||
GPIO_PP3300_DSW_GATED_EN, /* Enable DSW rails */
|
||||
GPIO_PP3300_DSW_EN, /* Enable 3.3V DSW rail */
|
||||
GPIO_PP3300_DSW_GATED_EN, /* Enable 3.3V Gated DSW and core VDD */
|
||||
GPIO_PP3300_LTE_EN, /* Enable LTE radio */
|
||||
GPIO_PP3300_WLAN_EN, /* Enable WiFi power */
|
||||
GPIO_PP1050_EN, /* Enable 1.05V regulator */
|
||||
@@ -130,6 +131,7 @@ enum gpio_signal {
|
||||
GPIO_PCH_SYS_RST_L, /* Reset PCH resume power plane logic */
|
||||
GPIO_PCH_SMI_L, /* System management interrupt to PCH */
|
||||
GPIO_TOUCHSCREEN_RESET_L, /* Reset touch screen */
|
||||
GPIO_PCH_ACOK, /* AC present signal buffered to PCH */
|
||||
#ifndef HEY_USE_BUILTIN_CLKRUN
|
||||
GPIO_LPC_CLKRUN_L, /* Dunno. Probably important, though. */
|
||||
#endif
|
||||
|
||||
@@ -9,4 +9,4 @@
|
||||
# the IC is TI Stellaris LM4
|
||||
CHIP:=lm4
|
||||
|
||||
board-y=board.o power_sequence.o panel.o
|
||||
board-y=board.o power_sequence.o panel.o extpower.o
|
||||
|
||||
64
board/samus/extpower.c
Normal file
64
board/samus/extpower.c
Normal file
@@ -0,0 +1,64 @@
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Pure GPIO-based external power detection, buffered to PCH.
|
||||
* Drive high in S5-S0 when AC_PRESENT is high, otherwise drive low.
|
||||
*/
|
||||
|
||||
#include "chipset.h"
|
||||
#include "common.h"
|
||||
#include "extpower.h"
|
||||
#include "gpio.h"
|
||||
#include "hooks.h"
|
||||
#include "host_command.h"
|
||||
|
||||
int extpower_is_present(void)
|
||||
{
|
||||
return gpio_get_level(GPIO_AC_PRESENT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deferred function to handle external power change
|
||||
*/
|
||||
static void extpower_deferred(void)
|
||||
{
|
||||
hook_notify(HOOK_AC_CHANGE);
|
||||
|
||||
/* Forward notification to host */
|
||||
if (extpower_is_present())
|
||||
host_set_single_event(EC_HOST_EVENT_AC_CONNECTED);
|
||||
else
|
||||
host_set_single_event(EC_HOST_EVENT_AC_DISCONNECTED);
|
||||
}
|
||||
DECLARE_DEFERRED(extpower_deferred);
|
||||
|
||||
static void extpower_buffer_to_pch(void)
|
||||
{
|
||||
if (chipset_in_state(CHIPSET_STATE_HARD_OFF)) {
|
||||
/* Drive low in G3 state */
|
||||
gpio_set_level(GPIO_PCH_ACOK, 0);
|
||||
} else {
|
||||
/* Buffer from extpower in S5+ (where 3.3DSW enabled) */
|
||||
gpio_set_level(GPIO_PCH_ACOK, extpower_is_present());
|
||||
}
|
||||
}
|
||||
|
||||
void extpower_interrupt(enum gpio_signal signal)
|
||||
{
|
||||
extpower_buffer_to_pch();
|
||||
|
||||
/* Trigger deferred notification of external power change */
|
||||
hook_call_deferred(extpower_deferred, 0);
|
||||
}
|
||||
|
||||
static void extpower_init(void)
|
||||
{
|
||||
extpower_buffer_to_pch();
|
||||
|
||||
/* Enable interrupts, now that we've initialized */
|
||||
gpio_enable_interrupt(GPIO_AC_PRESENT);
|
||||
}
|
||||
DECLARE_HOOK(HOOK_INIT, extpower_init, HOOK_PRIO_DEFAULT);
|
||||
@@ -61,26 +61,14 @@ 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)
|
||||
void backlight_interrupt(enum gpio_signal signal)
|
||||
{
|
||||
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();
|
||||
/*
|
||||
* PCH indicates it is turning on backlight so we should
|
||||
* attempt to put the backlight controller into PWM mode.
|
||||
*/
|
||||
lp8555_enable_pwm_mode();
|
||||
}
|
||||
DECLARE_HOOK(HOOK_SECOND, backlight_pwm_mode_hook, HOOK_PRIO_LAST);
|
||||
|
||||
/**
|
||||
* Update backlight state.
|
||||
@@ -100,6 +88,7 @@ DECLARE_HOOK(HOOK_LID_CHANGE, update_backlight, HOOK_PRIO_DEFAULT);
|
||||
*/
|
||||
static void backlight_init(void)
|
||||
{
|
||||
gpio_enable_interrupt(GPIO_PCH_BL_EN);
|
||||
update_backlight();
|
||||
}
|
||||
DECLARE_HOOK(HOOK_INIT, backlight_init, HOOK_PRIO_DEFAULT);
|
||||
|
||||
@@ -138,6 +138,7 @@ enum x86_state x86_chipset_init(void)
|
||||
gpio_set_level(GPIO_PP5000_USB_EN, 0);
|
||||
gpio_set_level(GPIO_PP5000_EN, 0);
|
||||
gpio_set_level(GPIO_PCH_DPWROK, 0);
|
||||
gpio_set_level(GPIO_PP3300_DSW_EN, 0);
|
||||
wireless_enable(0);
|
||||
}
|
||||
}
|
||||
@@ -191,6 +192,9 @@ enum x86_state x86_handle_state(enum x86_state state)
|
||||
break;
|
||||
|
||||
case X86_G3S5:
|
||||
/* Enable 3.3V DSW */
|
||||
gpio_set_level(GPIO_PP3300_DSW_EN, 1);
|
||||
|
||||
/*
|
||||
* Wait 10ms after +3VALW good, since that powers VccDSW and
|
||||
* VccSUS.
|
||||
@@ -211,7 +215,7 @@ enum x86_state x86_handle_state(enum x86_state state)
|
||||
}
|
||||
}
|
||||
|
||||
/* Turn on 3.3V DSW rail. */
|
||||
/* Turn on 3.3V DSW gated rail for core regulator */
|
||||
gpio_set_level(GPIO_PP3300_DSW_GATED_EN, 1);
|
||||
|
||||
/* Assert DPWROK */
|
||||
@@ -361,6 +365,8 @@ enum x86_state x86_handle_state(enum x86_state state)
|
||||
gpio_set_level(GPIO_PP1050_EN, 0);
|
||||
gpio_set_level(GPIO_PP3300_DSW_GATED_EN, 0);
|
||||
gpio_set_level(GPIO_PP5000_EN, 0);
|
||||
/* Disable 3.3V DSW */
|
||||
gpio_set_level(GPIO_PP3300_DSW_EN, 0);
|
||||
return X86_G3;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user