summaryrefslogtreecommitdiff
path: root/zephyr/program/corsola
diff options
context:
space:
mode:
Diffstat (limited to 'zephyr/program/corsola')
-rw-r--r--zephyr/program/corsola/include/variant_db_detection.h15
-rw-r--r--zephyr/program/corsola/npcx_adc.dtsi1
-rw-r--r--zephyr/program/corsola/src/npcx_usbc.c10
-rw-r--r--zephyr/program/corsola/src/usb_pd_policy.c13
-rw-r--r--zephyr/program/corsola/src/usbc.c6
-rw-r--r--zephyr/program/corsola/starmie/CMakeLists.txt5
-rw-r--r--zephyr/program/corsola/starmie/project.conf4
-rw-r--r--zephyr/program/corsola/starmie/project.overlay56
-rw-r--r--zephyr/program/corsola/starmie/src/base_detect.c151
-rw-r--r--zephyr/program/corsola/starmie/src/ppc.c8
-rw-r--r--zephyr/program/corsola/voltorb/project.conf1
11 files changed, 242 insertions, 28 deletions
diff --git a/zephyr/program/corsola/include/variant_db_detection.h b/zephyr/program/corsola/include/variant_db_detection.h
index e98ba3067d..fb468126ef 100644
--- a/zephyr/program/corsola/include/variant_db_detection.h
+++ b/zephyr/program/corsola/include/variant_db_detection.h
@@ -8,27 +8,32 @@
#ifndef __CROS_EC_CORSOLA_DB_DETECTION_H
#define __CROS_EC_CORSOLA_DB_DETECTION_H
+#include <stdint.h>
+
enum corsola_db_type {
CORSOLA_DB_UNINIT = -1,
+ /* CORSOLA_DB_NO_DETECTION means there is no detection involved in. */
+ CORSOLA_DB_NO_DETECTION,
+ /* CORSOLA_DB_NONE means there is no DB in the design. */
CORSOLA_DB_NONE,
CORSOLA_DB_TYPEC,
CORSOLA_DB_HDMI,
CORSOLA_DB_COUNT,
};
-#ifdef CONFIG_VARIANT_CORSOLA_DB_DETECTION
/*
* Get the connected daughterboard type.
*
* @return The daughterboard type.
*/
+#ifdef CONFIG_VARIANT_CORSOLA_DB_DETECTION
enum corsola_db_type corsola_get_db_type(void);
-#else
+#elif !defined(CONFIG_TEST)
inline enum corsola_db_type corsola_get_db_type(void)
{
- return CORSOLA_DB_NONE;
-};
-#endif /* CONFIG_VARIANT_CORSOLA_DB_DETECTION */
+ return CORSOLA_DB_NO_DETECTION;
+}
+#endif
/* return the adjusted port count for board overridden usbc/charger functions.
*/
diff --git a/zephyr/program/corsola/npcx_adc.dtsi b/zephyr/program/corsola/npcx_adc.dtsi
index 7b69abe48a..cd6a9c1bef 100644
--- a/zephyr/program/corsola/npcx_adc.dtsi
+++ b/zephyr/program/corsola/npcx_adc.dtsi
@@ -7,6 +7,7 @@
* Kingler and Steelix use the same dts, take care of this when modify it.
*/
+
/ {
named-adc-channels {
compatible = "named-adc-channels";
diff --git a/zephyr/program/corsola/src/npcx_usbc.c b/zephyr/program/corsola/src/npcx_usbc.c
index 2e1d8d11c5..8e9cd09e55 100644
--- a/zephyr/program/corsola/src/npcx_usbc.c
+++ b/zephyr/program/corsola/src/npcx_usbc.c
@@ -179,9 +179,13 @@ int board_vbus_source_enabled(int port)
#if CONFIG_USB_PD_PORT_MAX_COUNT > 1
__override int board_rt1718s_set_snk_enable(int port, int enable)
{
- if (port == USBC_PORT_C1) {
- rt1718s_gpio_set_level(port, GPIO_EN_USB_C1_SINK, enable);
- }
+ rt1718s_gpio_set_level(port, GPIO_EN_USB_C1_SINK, enable);
+
+ return EC_SUCCESS;
+}
+__override int board_rt1718s_set_src_enable(int port, int enable)
+{
+ rt1718s_gpio_set_level(port, GPIO_EN_USB_C1_SOURCE, enable);
return EC_SUCCESS;
}
diff --git a/zephyr/program/corsola/src/usb_pd_policy.c b/zephyr/program/corsola/src/usb_pd_policy.c
index 30ded99aba..4b7e46cb74 100644
--- a/zephyr/program/corsola/src/usb_pd_policy.c
+++ b/zephyr/program/corsola/src/usb_pd_policy.c
@@ -229,12 +229,6 @@ void pd_power_supply_reset(int port)
prev_en = ppc_is_sourcing_vbus(port);
-#if defined(CONFIG_USB_PD_TCPM_RT1718S) && CONFIG_USB_PD_PORT_MAX_COUNT > 1
- if (port == USBC_PORT_C1) {
- rt1718s_gpio_set_level(port, GPIO_EN_USB_C1_SOURCE, 0);
- }
-#endif
-
/* Disable VBUS. */
ppc_vbus_source_enable(port, 0);
@@ -254,13 +248,6 @@ int pd_set_power_supply_ready(int port)
pd_set_vbus_discharge(port, 0);
-#if defined(CONFIG_USB_PD_TCPM_RT1718S) && CONFIG_USB_PD_PORT_MAX_COUNT > 1
- /* Provide Vbus. */
- if (port == USBC_PORT_C1) {
- rt1718s_gpio_set_level(port, GPIO_EN_USB_C1_SOURCE, 1);
- }
-#endif
-
RETURN_ERROR(ppc_vbus_source_enable(port, 1));
/* Notify host of power info change. */
diff --git a/zephyr/program/corsola/src/usbc.c b/zephyr/program/corsola/src/usbc.c
index 71c02ff54f..871c84a2e4 100644
--- a/zephyr/program/corsola/src/usbc.c
+++ b/zephyr/program/corsola/src/usbc.c
@@ -45,7 +45,7 @@ DECLARE_HOOK(HOOK_INIT, baseboard_init, HOOK_PRIO_PRE_DEFAULT);
__override uint8_t board_get_usb_pd_port_count(void)
{
- /* This function returns the PORT_COUNT+1 when HDMI db is connected.
+ /* This function returns the PORT_COUNT when HDMI db is connected.
* This is a trick to ensure the usb_mux_set being set properley.
* HDMI display functions using the USB virtual mux to * communicate
* with the DP bridge.
@@ -56,6 +56,8 @@ __override uint8_t board_get_usb_pd_port_count(void)
} else {
return CONFIG_USB_PD_PORT_MAX_COUNT - 1;
}
+ } else if (corsola_get_db_type() == CORSOLA_DB_NONE) {
+ return CONFIG_USB_PD_PORT_MAX_COUNT - 1;
}
return CONFIG_USB_PD_PORT_MAX_COUNT;
@@ -65,7 +67,7 @@ uint8_t board_get_adjusted_usb_pd_port_count(void)
{
const enum corsola_db_type db = corsola_get_db_type();
- if (db == CORSOLA_DB_TYPEC || db == CORSOLA_DB_NONE) {
+ if (db == CORSOLA_DB_TYPEC || db == CORSOLA_DB_NO_DETECTION) {
return CONFIG_USB_PD_PORT_MAX_COUNT;
} else {
return CONFIG_USB_PD_PORT_MAX_COUNT - 1;
diff --git a/zephyr/program/corsola/starmie/CMakeLists.txt b/zephyr/program/corsola/starmie/CMakeLists.txt
index f401c5dd43..dd669ab82c 100644
--- a/zephyr/program/corsola/starmie/CMakeLists.txt
+++ b/zephyr/program/corsola/starmie/CMakeLists.txt
@@ -9,4 +9,7 @@ zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_I2C "../src/ite_i2c.c")
zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_USBC
"../src/ite_usb_pd_policy.c" "../src/ite_usbc.c")
-zephyr_library_sources("src/ppc.c") \ No newline at end of file
+zephyr_library_sources_ifdef(CONFIG_PLATFORM_EC_DETACHABLE_BASE
+ "src/base_detect.c")
+
+zephyr_library_sources("src/ppc.c")
diff --git a/zephyr/program/corsola/starmie/project.conf b/zephyr/program/corsola/starmie/project.conf
index 70bd94520f..72d18b8e9f 100644
--- a/zephyr/program/corsola/starmie/project.conf
+++ b/zephyr/program/corsola/starmie/project.conf
@@ -40,3 +40,7 @@ CONFIG_PLATFORM_EC_BODY_DETECTION=y
CONFIG_PLATFORM_EC_BODY_DETECTION_ALWAYS_ENABLE_IN_S0=y
CONFIG_PLATFORM_EC_GESTURE_DETECTION=y
CONFIG_PLATFORM_EC_GESTURE_HOST_DETECTION=y
+
+# Detachable
+CONFIG_PLATFORM_EC_DETACHABLE_BASE=y
+CONFIG_PLATFORM_EC_BASE_ATTACHED_SWITCH=y
diff --git a/zephyr/program/corsola/starmie/project.overlay b/zephyr/program/corsola/starmie/project.overlay
index 2358026e2d..de79d92cdb 100644
--- a/zephyr/program/corsola/starmie/project.overlay
+++ b/zephyr/program/corsola/starmie/project.overlay
@@ -43,6 +43,11 @@
handler = "power_signal_interrupt";
};
+ pogo_prsnt_int: pogo-prsnt-int {
+ irq-pin = <&pogo_prsnt_int_l>;
+ flags = <GPIO_INT_EDGE_BOTH>;
+ handler = "base_detect_interrupt";
+ };
/delete-node/ lid_imu;
};
@@ -71,8 +76,8 @@
};
// POGO_PRSNT_INT_L GPI5
- pogo_prsnt_int_l: pogo_prsnt_int_l{
- gpios = <&gpioi 5 GPIO_INPUT_PULL_DOWN>;
+ pogo_prsnt_int_l: pogo_prsnt_int_l {
+ gpios = <&gpioi 5 (GPIO_INPUT | GPIO_ACTIVE_LOW)>;
};
pg_pp4200_s5_od: pg-pp4200-s5-od {
@@ -131,8 +136,8 @@
motionsense-rotation-ref {
compatible = "cros-ec,motionsense-rotation-ref";
lid_rot_ref_bmi: lid-rotation-ref-bmi {
- mat33 = <1 0 0
- 0 1 0
+ mat33 = <(-1) 0 0
+ 0 (-1) 0
0 0 1>;
};
};
@@ -217,6 +222,39 @@
power-gpio-pin = <&pmic_ec_resetb>;
};
};
+
+ named-adc-channels {
+ adc_temp_sensor_1: adc-temp-sensor-1 {
+ enum-name = "ADC_TEMP_SENSOR_1";
+ io-channels = <&adc0 6>;
+ };
+ adc_temp_sensor_2: adc-temp-sensor-2 {
+ enum-name = "ADC_TEMP_SENSOR_2";
+ io-channels = <&adc0 7>;
+ };
+ };
+
+ temp_sensor_1_thermistor: sensor-1-thermistor {
+ compatible = "cros-ec,temp-sensor-thermistor";
+ thermistor = <&thermistor_1V8_100K_100K_4250B>;
+ adc = <&adc_temp_sensor_1>;
+ };
+
+ temp_sensor_2_thermistor: sensor-2-thermistor {
+ compatible = "cros-ec,temp-sensor-thermistor";
+ thermistor = <&thermistor_1V8_100K_100K_4250B>;
+ adc = <&adc_temp_sensor_2>;
+ };
+
+ named-temp-sensors {
+ compatible = "cros-ec,temp-sensors";
+ temp_sensor_1 {
+ sensor = <&temp_sensor_1_thermistor>;
+ };
+ temp_sensor_2 {
+ sensor = <&temp_sensor_2_thermistor>;
+ };
+ };
};
&i2c0{
@@ -231,3 +269,13 @@
reg = <0x10>;
};
};
+
+&adc0{
+ status = "okay";
+ pinctrl-0 = <&adc0_ch6_gpi6_default>;
+ pinctrl-names = "default";
+};
+
+&thermistor_1V8_100K_100K_4250B{
+ status = "okay";
+};
diff --git a/zephyr/program/corsola/starmie/src/base_detect.c b/zephyr/program/corsola/starmie/src/base_detect.c
new file mode 100644
index 0000000000..144b26e3be
--- /dev/null
+++ b/zephyr/program/corsola/starmie/src/base_detect.c
@@ -0,0 +1,151 @@
+/* Copyright 2023 The ChromiumOS Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "ap_power/ap_power.h"
+#include "base_state.h"
+#include "chipset.h"
+#include "console.h"
+#include "gpio/gpio_int.h"
+#include "hooks.h"
+#include "host_command.h"
+#include "tablet_mode.h"
+
+#include <zephyr/drivers/gpio.h>
+#include <zephyr/kernel.h>
+
+#define CPRINTS(format, args...) cprints(CC_SYSTEM, format, ##args)
+#define CPRINTF(format, args...) cprintf(CC_SYSTEM, format, ##args)
+
+/* Base detection debouncing */
+#define BASE_DETECT_EN_DEBOUNCE_US (350 * MSEC)
+#define BASE_DETECT_DIS_DEBOUNCE_US (20 * MSEC)
+
+K_MUTEX_DEFINE(modify_base_detection_mutex);
+static bool detect_base_enabled;
+
+static void base_detect_deferred(void);
+DECLARE_DEFERRED(base_detect_deferred);
+
+enum base_status {
+ BASE_UNKNOWN = 0,
+ BASE_DISCONNECTED = 1,
+ BASE_CONNECTED = 2,
+};
+
+static enum base_status current_base_status;
+
+static void base_update(enum base_status specified_status)
+{
+ int connected = (specified_status != BASE_CONNECTED) ? false : true;
+
+ if (current_base_status == specified_status)
+ return;
+
+ current_base_status = specified_status;
+
+ base_set_state(connected);
+ tablet_set_mode(!connected, TABLET_TRIGGER_BASE);
+ gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(en_pp3300_base_x), connected);
+}
+
+void base_detect_interrupt(enum gpio_signal signal)
+{
+ gpio_disable_dt_interrupt(GPIO_INT_FROM_NODELABEL(pogo_prsnt_int));
+ hook_call_deferred(&base_detect_deferred_data,
+ (current_base_status == BASE_CONNECTED) ?
+ BASE_DETECT_DIS_DEBOUNCE_US :
+ BASE_DETECT_EN_DEBOUNCE_US);
+}
+
+static inline void detect_and_update_base_status(void)
+{
+ if (gpio_pin_get_dt(GPIO_DT_FROM_NODELABEL(pogo_prsnt_int_l))) {
+ base_update(BASE_CONNECTED);
+ } else {
+ base_update(BASE_DISCONNECTED);
+ }
+}
+
+static void base_detect_deferred(void)
+{
+ k_mutex_lock(&modify_base_detection_mutex, K_FOREVER);
+ /*
+ * If a disable base detection is issued after an ISR, and is before
+ * executing the deferred hook, then we need to check whether the
+ * detection is enabled. If disabled, there is no need to re-enable the
+ * interrupt.
+ */
+ if (detect_base_enabled) {
+ detect_and_update_base_status();
+ gpio_enable_dt_interrupt(
+ GPIO_INT_FROM_NODELABEL(pogo_prsnt_int));
+ }
+ k_mutex_unlock(&modify_base_detection_mutex);
+}
+
+static void base_detect_enable(bool enable)
+{
+ detect_base_enabled = enable;
+ if (enable) {
+ gpio_enable_dt_interrupt(
+ GPIO_INT_FROM_NODELABEL(pogo_prsnt_int));
+ detect_and_update_base_status();
+ } else {
+ gpio_disable_dt_interrupt(
+ GPIO_INT_FROM_NODELABEL(pogo_prsnt_int));
+ base_update(BASE_UNKNOWN);
+ }
+}
+
+static void base_startup_hook(struct ap_power_ev_callback *cb,
+ struct ap_power_ev_data data)
+{
+ switch (data.event) {
+ case AP_POWER_STARTUP:
+ base_detect_enable(true);
+ break;
+ case AP_POWER_SHUTDOWN:
+ base_detect_enable(false);
+ break;
+ default:
+ return;
+ }
+}
+
+static int base_init(void)
+{
+ static struct ap_power_ev_callback cb;
+
+ detect_base_enabled = false;
+ ap_power_ev_init_callback(&cb, base_startup_hook,
+ AP_POWER_STARTUP | AP_POWER_SHUTDOWN);
+ ap_power_ev_add_callback(&cb);
+
+ if (!chipset_in_state(CHIPSET_STATE_ANY_OFF)) {
+ base_detect_enable(true);
+ }
+
+ return 0;
+}
+SYS_INIT(base_init, APPLICATION, 1);
+
+void base_force_state(enum ec_set_base_state_cmd state)
+{
+ k_mutex_lock(&modify_base_detection_mutex, K_FOREVER);
+ switch (state) {
+ case EC_SET_BASE_STATE_ATTACH:
+ base_detect_enable(false);
+ base_update(BASE_CONNECTED);
+ break;
+ case EC_SET_BASE_STATE_DETACH:
+ base_detect_enable(false);
+ base_update(BASE_DISCONNECTED);
+ break;
+ case EC_SET_BASE_STATE_RESET:
+ base_detect_enable(true);
+ break;
+ }
+ k_mutex_unlock(&modify_base_detection_mutex);
+}
diff --git a/zephyr/program/corsola/starmie/src/ppc.c b/zephyr/program/corsola/starmie/src/ppc.c
index 8c1dc2fe7f..505da06473 100644
--- a/zephyr/program/corsola/starmie/src/ppc.c
+++ b/zephyr/program/corsola/starmie/src/ppc.c
@@ -27,3 +27,11 @@ void ppc_interrupt(enum gpio_signal signal)
ppc_chips[0].drv->interrupt(0);
}
}
+
+static int set_rt1739(void)
+{
+ rt1739_init(0);
+ return 0;
+}
+
+SYS_INIT(set_rt1739, POST_KERNEL, 61);
diff --git a/zephyr/program/corsola/voltorb/project.conf b/zephyr/program/corsola/voltorb/project.conf
index d2693d0de8..19348b04cd 100644
--- a/zephyr/program/corsola/voltorb/project.conf
+++ b/zephyr/program/corsola/voltorb/project.conf
@@ -42,6 +42,7 @@ CONFIG_PLATFORM_EC_EXTPOWER_DEBOUNCE_MS=800
# Battery config
CONFIG_PLATFORM_EC_BATT_FULL_CHIPSET_OFF_INPUT_LIMIT_MV=15000
CONFIG_PLATFORM_EC_SMART_BATTERY_OPTIONAL_MFG_FUNC=y
+CONFIG_PLATFORM_EC_BATTERY_STBL_STAT=y
# Remove debug options and features for FW QUAL
CONFIG_PLATFORM_EC_SYSTEM_UNLOCKED=n