mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2026-01-04 05:51:34 +00:00
That way all the users of jump tags don't need to know about the
padding requirements.
BUG=chrome-os-partner:23851
BRANCH=none
TEST=enable CONFIG_CMD_JUMPTAGS, then 'jumptags'. Output should be
something like this:
20007fbc: 0x5550 UP.1 2
20007fc4: 0x4b42 KB.2 3
20007fcc: 0x4c50 LP.1 12
20007fdc: 0x4d54 MT.1 8
All the addresses in the first column should be word-aligned. The
sizes in the last column don't need to be a multiple of 4.
Change-Id: I91f9c29701a007ef8a56b5b7e0ea09930dfbea31
Signed-off-by: Randall Spangler <rspangler@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/175591
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
130 lines
3.5 KiB
C
130 lines
3.5 KiB
C
/* 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.
|
|
*/
|
|
|
|
/* PWM control module for Chromebook keyboard backlight. */
|
|
|
|
#include "common.h"
|
|
#include "console.h"
|
|
#include "gpio.h"
|
|
#include "hooks.h"
|
|
#include "host_command.h"
|
|
#include "lid_switch.h"
|
|
#include "pwm.h"
|
|
#include "system.h"
|
|
#include "util.h"
|
|
|
|
#define PWMKBD_SYSJUMP_TAG 0x504b /* "PK" */
|
|
#define PWM_HOOK_VERSION 1
|
|
/* Saved PWM state across sysjumps */
|
|
struct pwm_kbd_state {
|
|
uint8_t kblight_en;
|
|
uint8_t kblight_percent;
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
/* Console commands */
|
|
|
|
static int command_kblight(int argc, char **argv)
|
|
{
|
|
if (argc >= 2) {
|
|
char *e;
|
|
int i = strtoi(argv[1], &e, 0);
|
|
if (*e)
|
|
return EC_ERROR_PARAM1;
|
|
pwm_set_duty(PWM_CH_KBLIGHT, i);
|
|
}
|
|
|
|
ccprintf("Keyboard backlight: %d%%\n", pwm_get_duty(PWM_CH_KBLIGHT));
|
|
return EC_SUCCESS;
|
|
}
|
|
DECLARE_CONSOLE_COMMAND(kblight, command_kblight,
|
|
"percent",
|
|
"Set keyboard backlight",
|
|
NULL);
|
|
|
|
/*****************************************************************************/
|
|
/* Host commands */
|
|
|
|
int pwm_command_get_keyboard_backlight(struct host_cmd_handler_args *args)
|
|
{
|
|
struct ec_response_pwm_get_keyboard_backlight *r = args->response;
|
|
|
|
r->percent = pwm_get_duty(PWM_CH_KBLIGHT);
|
|
r->enabled = pwm_get_enabled(PWM_CH_KBLIGHT);
|
|
args->response_size = sizeof(*r);
|
|
|
|
return EC_RES_SUCCESS;
|
|
}
|
|
DECLARE_HOST_COMMAND(EC_CMD_PWM_GET_KEYBOARD_BACKLIGHT,
|
|
pwm_command_get_keyboard_backlight,
|
|
EC_VER_MASK(0));
|
|
|
|
int pwm_command_set_keyboard_backlight(struct host_cmd_handler_args *args)
|
|
{
|
|
const struct ec_params_pwm_set_keyboard_backlight *p = args->params;
|
|
|
|
pwm_set_duty(PWM_CH_KBLIGHT, p->percent);
|
|
|
|
return EC_RES_SUCCESS;
|
|
}
|
|
DECLARE_HOST_COMMAND(EC_CMD_PWM_SET_KEYBOARD_BACKLIGHT,
|
|
pwm_command_set_keyboard_backlight,
|
|
EC_VER_MASK(0));
|
|
|
|
/*****************************************************************************/
|
|
/* Hooks */
|
|
|
|
static void pwm_kblight_init(void)
|
|
{
|
|
const struct pwm_kbd_state *prev;
|
|
int version, size;
|
|
|
|
/* Configure GPIO */
|
|
gpio_config_module(MODULE_PWM_KBLIGHT, 1);
|
|
|
|
prev = (const struct pwm_kbd_state *)
|
|
system_get_jump_tag(PWMKBD_SYSJUMP_TAG, &version, &size);
|
|
if (prev && version == PWM_HOOK_VERSION && size == sizeof(*prev)) {
|
|
/* Restore previous state. */
|
|
pwm_enable(PWM_CH_KBLIGHT, prev->kblight_en);
|
|
pwm_set_duty(PWM_CH_KBLIGHT, prev->kblight_percent);
|
|
} else {
|
|
/* Enable keyboard backlight control, turned down */
|
|
pwm_set_duty(PWM_CH_KBLIGHT, 0);
|
|
pwm_enable(PWM_CH_KBLIGHT, 1);
|
|
}
|
|
}
|
|
DECLARE_HOOK(HOOK_INIT, pwm_kblight_init, HOOK_PRIO_DEFAULT);
|
|
|
|
static void pwm_kblight_preserve_state(void)
|
|
{
|
|
struct pwm_kbd_state state;
|
|
|
|
state.kblight_en = pwm_get_enabled(PWM_CH_KBLIGHT);
|
|
state.kblight_percent = pwm_get_duty(PWM_CH_KBLIGHT);
|
|
|
|
system_add_jump_tag(PWMKBD_SYSJUMP_TAG, PWM_HOOK_VERSION,
|
|
sizeof(state), &state);
|
|
}
|
|
DECLARE_HOOK(HOOK_SYSJUMP, pwm_kblight_preserve_state, HOOK_PRIO_DEFAULT);
|
|
|
|
static void pwm_kblight_suspend(void)
|
|
{
|
|
pwm_set_duty(PWM_CH_KBLIGHT, 0);
|
|
}
|
|
DECLARE_HOOK(HOOK_CHIPSET_SUSPEND, pwm_kblight_suspend, HOOK_PRIO_DEFAULT);
|
|
|
|
static void pwm_kblight_shutdown(void)
|
|
{
|
|
pwm_set_duty(PWM_CH_KBLIGHT, 0);
|
|
}
|
|
DECLARE_HOOK(HOOK_CHIPSET_SHUTDOWN, pwm_kblight_shutdown, HOOK_PRIO_DEFAULT);
|
|
|
|
static void pwm_kblight_lid_change(void)
|
|
{
|
|
pwm_enable(PWM_CH_KBLIGHT, lid_is_open());
|
|
}
|
|
DECLARE_HOOK(HOOK_LID_CHANGE, pwm_kblight_lid_change, HOOK_PRIO_DEFAULT);
|