summaryrefslogtreecommitdiff
path: root/zephyr/program/nissa/src/common.c
blob: e03b82bca34101c98e3e42d18b22e5ccd2187b22 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/* Copyright 2022 The ChromiumOS Authors
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "battery.h"
#include "charge_state_v2.h"
#include "charger.h"
#include "chipset.h"
#include "hooks.h"
#include "system.h"
#include "usb_mux.h"

#include <zephyr/device.h>
#include <zephyr/logging/log.h>

#include <ap_power/ap_power.h>
LOG_MODULE_REGISTER(nissa, CONFIG_NISSA_LOG_LEVEL);

static void board_power_change(struct ap_power_ev_callback *cb,
			       struct ap_power_ev_data data)
{
	/*
	 * Enable power to pen garage when system is active (safe even if no
	 * pen is present).
	 */
	const struct gpio_dt_spec *const pen_power_gpio =
		GPIO_DT_FROM_NODELABEL(gpio_en_pp5000_pen_x);

	switch (data.event) {
	case AP_POWER_STARTUP:
		gpio_pin_set_dt(pen_power_gpio, 1);
		break;
	case AP_POWER_SHUTDOWN:
		gpio_pin_set_dt(pen_power_gpio, 0);
		break;
	default:
		break;
	}
}

static void board_setup_init(void)
{
	static struct ap_power_ev_callback cb;

	ap_power_ev_init_callback(&cb, board_power_change,
				  AP_POWER_STARTUP | AP_POWER_SHUTDOWN);
	ap_power_ev_add_callback(&cb);
}
DECLARE_HOOK(HOOK_INIT, board_setup_init, HOOK_PRIO_INIT_I2C);

int pd_check_vconn_swap(int port)
{
	/* Do not allow vconn swap if 5V rail is off. */
	const struct gpio_dt_spec *const ec_soc_dsw_pwrok_gpio =
		GPIO_DT_FROM_NODELABEL(gpio_ec_soc_dsw_pwrok);

	return gpio_pin_get_dt(ec_soc_dsw_pwrok_gpio);
}

/*
 * Count of chargers depends on sub board presence.
 */
__override uint8_t board_get_charger_chip_count(void)
{
	return board_get_usb_pd_port_count();
}

__override void ocpc_get_pid_constants(int *kp, int *kp_div, int *ki,
				       int *ki_div, int *kd, int *kd_div)
{
	*kp = 1;
	*kp_div = 32;
	*ki = 0;
	*ki_div = 1;
	*kd = 0;
	*kd_div = 1;
}

#ifdef CONFIG_PLATFORM_EC_CHARGER_SM5803

static int battery_cells;

void board_get_battery_cells(void)
{
	if (charger_get_battery_cells(CHARGER_PRIMARY, &battery_cells) ==
	    EC_SUCCESS) {
		LOG_INF("battery_cells:%d", battery_cells);
	} else {
		LOG_ERR("Failed to get default battery type");
	}
}
DECLARE_HOOK(HOOK_INIT, board_get_battery_cells, HOOK_PRIO_DEFAULT);

/*
 * Called by USB-PD code to determine whether a given input voltage is
 * acceptable.
 */
__override int pd_is_valid_input_voltage(int mv)
{
	/*
	 * SM5803 is extremely inefficient in buck-boost mode, when
	 * VBUS ~= VSYS: very high temperatures on the chip and associated
	 * inductor have been observed when sinking normal charge current in
	 * buck-boost mode (but not in buck or boost mode) so we choose to
	 * completely exclude some voltages that are likely to be problematic.
	 *
	 * Nissa devices use either 2S or 3S batteries, for which VBUS will
	 * usually only be near VSYS with a 3S battery and 12V input (picked
	 * from among common supported PD voltages)- 2S can get close to
	 * 9V, but we expect charge current to be low when a 2S battery is
	 * charged to that voltage (because it will be nearly full).
	 *
	 * We assume that any battery with a design 3S, and
	 * that other problematic PD voltages (near to, but not exactly 12V)
	 * will rarely occur.
	 */
	if (battery_cells == 3 && mv == 12000) {
		return false;
	}
	return true;
}
#endif

/* Trigger shutdown by enabling the Z-sleep circuit */
__override void board_hibernate_late(void)
{
	gpio_pin_set_dt(GPIO_DT_FROM_NODELABEL(gpio_en_slp_z), 1);
	/*
	 * The system should hibernate, but there may be
	 * a small delay, so return.
	 */
}