From 84ba1881208aa0fe56e7775958d95a8fa78f93c4 Mon Sep 17 00:00:00 2001 From: Randall Spangler Date: Fri, 27 Sep 2013 09:11:48 -0700 Subject: Support backlight control via lid only The old backlight_x86 code did (backlight enable) = (lid is open) && (GPIO request from AP) Newer systems will AND those signals in hardware. Support those systems by separating CONFIG_BACKLIGHT_LID and CONFIG_BACKLIGHT_REQ_GPIO, and add tests for the case where the enable signal is dependent only on the lid position. BUG=chrome-os-partner:22960 BRANCH=none TEST=pass unit tests Change-Id: I1909426e49f00a8acd5047fd88c801cba1dacd76 Reviewed-on: https://chromium-review.googlesource.com/170925 Tested-by: Randall Spangler Reviewed-by: Bill Richardson Commit-Queue: Randall Spangler --- test/bklight_passthru.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 test/bklight_passthru.c (limited to 'test/bklight_passthru.c') diff --git a/test/bklight_passthru.c b/test/bklight_passthru.c new file mode 100644 index 0000000000..cf533912ae --- /dev/null +++ b/test/bklight_passthru.c @@ -0,0 +1,140 @@ +/* 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. + * + * Test x86 backlight passthrough. + */ + +#include "backlight.h" +#include "common.h" +#include "console.h" +#include "hooks.h" +#include "host_command.h" +#include "lid_switch.h" +#include "test_util.h" +#include "timer.h" +#include "util.h" + +static int mock_lid = 1; +static int mock_pch_bklten; +static int backlight_en; + +int gpio_get_level(enum gpio_signal signal) +{ + if (signal == GPIO_LID_OPEN) + return mock_lid; + if (signal == GPIO_PCH_BKLTEN) + return mock_pch_bklten; + return 0; +} + +void gpio_set_level(enum gpio_signal signal, int level) +{ + if (signal == GPIO_ENABLE_BACKLIGHT) + backlight_en = level; +} + +void set_lid_state(int is_open) +{ + mock_lid = is_open; + lid_interrupt(GPIO_LID_OPEN); + msleep(40); +} + +void set_pch_bklten(int enabled) +{ + int orig = mock_pch_bklten; + mock_pch_bklten = enabled; + if (orig != enabled) + backlight_interrupt(GPIO_PCH_BKLTEN); +} + +static int send_bklight_hostcmd(int enabled) +{ + struct ec_params_switch_enable_backlight p; + p.enabled = enabled; + + return test_send_host_command(EC_CMD_SWITCH_ENABLE_BKLIGHT, 0, &p, + sizeof(p), NULL, 0); +} + +static int test_passthrough(void) +{ + /* Initial state */ + TEST_ASSERT(mock_lid == 1 && mock_pch_bklten == 0); + TEST_ASSERT(!backlight_en); + + /* Enable backlight */ + set_pch_bklten(1); + TEST_ASSERT(backlight_en); + + /* Disable backlight */ + set_pch_bklten(0); + TEST_ASSERT(!backlight_en); + + /* Enable backlight again */ + set_pch_bklten(1); + TEST_ASSERT(backlight_en); + + /* Close lid. Backlight should turn off */ + set_lid_state(0); + TEST_ASSERT(!backlight_en); + + /* Open lid. Backlight turns on */ + set_lid_state(1); + TEST_ASSERT(backlight_en); + + /* Close lid and disable backlight */ + set_lid_state(0); + set_pch_bklten(0); + TEST_ASSERT(!backlight_en); + + /* Open lid now. Backlight stays off */ + set_lid_state(1); + TEST_ASSERT(!backlight_en); + + return EC_SUCCESS; +} + +static int test_hostcommand(void) +{ + /* Open lid and enable backlight */ + set_lid_state(1); + set_pch_bklten(1); + TEST_ASSERT(backlight_en); + + /* Disable by host command */ + send_bklight_hostcmd(0); + TEST_ASSERT(!backlight_en); + + /* Close and open lid. Backlight should come up */ + set_lid_state(0); + set_lid_state(1); + TEST_ASSERT(backlight_en); + + /* Close lid and disable backlight */ + set_lid_state(0); + set_pch_bklten(0); + TEST_ASSERT(!backlight_en); + + /* Enable by host command */ + send_bklight_hostcmd(1); + TEST_ASSERT(backlight_en); + + /* Disable backlight by lid */ + set_lid_state(1); + set_lid_state(0); + TEST_ASSERT(!backlight_en); + + return EC_SUCCESS; +} + +void run_test(void) +{ + test_reset(); + + RUN_TEST(test_passthrough); + RUN_TEST(test_hostcommand); + + test_print_result(); +} -- cgit v1.2.1