blob: 452b728b79cbfd01a2a5621d7af48ce2bfe40f91 [file] [log] [blame]
Ronald G. Minnich3faa2c72013-02-20 15:46:46 -08001/*
2 * This file is part of the coreboot project.
3 *
Stefan Reinauer08dc3572013-05-14 16:57:50 -07004 * Copyright 2013 Google Inc.
Ronald G. Minnich3faa2c72013-02-20 15:46:46 -08005 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
Ronald G. Minnich3faa2c72013-02-20 15:46:46 -080014 */
15
Gabe Blacka5d914e42013-04-15 18:22:11 -070016#include <boot/coreboot_tables.h>
Ronald G. Minnich3faa2c72013-02-20 15:46:46 -080017#include <console/console.h>
Gabe Black7fa726a2013-04-15 18:09:15 -070018#include <ec/google/chromeec/ec.h>
19#include <ec/google/chromeec/ec_commands.h>
Julius Werner1ed0c8c2014-10-20 13:16:29 -070020#include <soc/cpu.h>
21#include <soc/gpio.h>
Ronald G. Minnich3faa2c72013-02-20 15:46:46 -080022#include <string.h>
23#include <vendorcode/google/chromeos/chromeos.h>
Kyösti Mälkkiab728092014-05-03 16:47:52 +030024#include <bootmode.h>
David Hendricksd9b16f32013-03-06 19:16:10 -080025
Ronald G. Minnich3faa2c72013-02-20 15:46:46 -080026void fill_lb_gpios(struct lb_gpios *gpios)
27{
Gabe Blacka5d914e42013-04-15 18:22:11 -070028 int count = 0;
Ronald G. Minnich3faa2c72013-02-20 15:46:46 -080029
Gabe Blacka554e232013-04-15 16:25:02 -070030 /* Write Protect: active low */
Gabe Blacka5d914e42013-04-15 18:22:11 -070031 gpios->gpios[count].port = EXYNOS5_GPD1;
32 gpios->gpios[count].polarity = ACTIVE_LOW;
Stefan Reinauerdc006c12013-05-15 14:54:07 -070033 gpios->gpios[count].value = gpio_get_value(GPIO_D16); // WP_GPIO
Gabe Blacka5d914e42013-04-15 18:22:11 -070034 strncpy((char *)gpios->gpios[count].name, "write protect",
35 GPIO_MAX_NAME_LENGTH);
36 count++;
Ronald G. Minnich3faa2c72013-02-20 15:46:46 -080037
Gabe Blackfe3b0242013-04-10 14:39:09 -070038 /* Recovery: active low */
Gabe Blacka5d914e42013-04-15 18:22:11 -070039 gpios->gpios[count].port = -1;
40 gpios->gpios[count].polarity = ACTIVE_HIGH;
41 gpios->gpios[count].value = get_recovery_mode_switch();
42 strncpy((char *)gpios->gpios[count].name, "recovery",
43 GPIO_MAX_NAME_LENGTH);
44 count++;
Ronald G. Minnich3faa2c72013-02-20 15:46:46 -080045
Gabe Blacka554e232013-04-15 16:25:02 -070046 /* Lid: active high */
Gabe Blacka5d914e42013-04-15 18:22:11 -070047 gpios->gpios[count].port = EXYNOS5_GPX3;
48 gpios->gpios[count].polarity = ACTIVE_HIGH;
Stefan Reinauerdc006c12013-05-15 14:54:07 -070049 gpios->gpios[count].value = gpio_get_value(GPIO_X35); // LID_GPIO
Gabe Blacka5d914e42013-04-15 18:22:11 -070050 strncpy((char *)gpios->gpios[count].name, "lid", GPIO_MAX_NAME_LENGTH);
51 count++;
Ronald G. Minnicheeb36322013-02-27 10:12:03 -080052
David Hendricksd9b16f32013-03-06 19:16:10 -080053 /* Power: virtual GPIO active low */
Gabe Black5cda3082013-04-15 19:59:10 -070054 gpios->gpios[count].port = EXYNOS5_GPX1;
Gabe Blacka5d914e42013-04-15 18:22:11 -070055 gpios->gpios[count].polarity = ACTIVE_LOW;
Gabe Black5cda3082013-04-15 19:59:10 -070056 gpios->gpios[count].value =
Stefan Reinauerdc006c12013-05-15 14:54:07 -070057 gpio_get_value(GPIO_X13); // POWER_GPIO
Gabe Blacka5d914e42013-04-15 18:22:11 -070058 strncpy((char *)gpios->gpios[count].name, "power",
59 GPIO_MAX_NAME_LENGTH);
60 count++;
Ronald G. Minnicheeb36322013-02-27 10:12:03 -080061
62 /* Developer: virtual GPIO active high */
Gabe Blacka5d914e42013-04-15 18:22:11 -070063 gpios->gpios[count].port = -1;
64 gpios->gpios[count].polarity = ACTIVE_HIGH;
65 gpios->gpios[count].value = get_developer_mode_switch();
66 strncpy((char *)gpios->gpios[count].name, "developer",
67 GPIO_MAX_NAME_LENGTH);
68 count++;
Ronald G. Minnich3faa2c72013-02-20 15:46:46 -080069
Gabe Blacka5d914e42013-04-15 18:22:11 -070070 gpios->size = sizeof(*gpios) + (count * sizeof(struct lb_gpio));
71 gpios->count = count;
72
73 printk(BIOS_ERR, "Added %d GPIOS size %d\n", count, gpios->size);
Ronald G. Minnich3faa2c72013-02-20 15:46:46 -080074}
75
76int get_developer_mode_switch(void)
77{
Gabe Blacka5d914e42013-04-15 18:22:11 -070078 return 0;
Ronald G. Minnich3faa2c72013-02-20 15:46:46 -080079}
80
81int get_recovery_mode_switch(void)
82{
Gabe Black7fa726a2013-04-15 18:09:15 -070083 uint32_t ec_events;
Ronald G. Minnich3faa2c72013-02-20 15:46:46 -080084
Gabe Black7fa726a2013-04-15 18:09:15 -070085 /* The GPIO is active low. */
Stefan Reinauerdc006c12013-05-15 14:54:07 -070086 if (!gpio_get_value(GPIO_Y10)) // RECMODE_GPIO
Gabe Black7fa726a2013-04-15 18:09:15 -070087 return 1;
88
89 ec_events = google_chromeec_get_events_b();
90 return !!(ec_events &
91 EC_HOST_EVENT_MASK(EC_HOST_EVENT_KEYBOARD_RECOVERY));
Ronald G. Minnich3faa2c72013-02-20 15:46:46 -080092}
93
Gabe Blackd29bf202013-09-12 06:23:51 -070094int get_write_protect_state(void)
Ronald G. Minnich3faa2c72013-02-20 15:46:46 -080095{
Gabe Blackd29bf202013-09-12 06:23:51 -070096 return !gpio_get_value(GPIO_D16);
Ronald G. Minnich3faa2c72013-02-20 15:46:46 -080097}