summaryrefslogtreecommitdiff
path: root/zephyr/test/drivers/sm5803/src/usbc.c
blob: 8028842a04ba3703d6b38309b49ae5a892bf1fa7 (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
/* 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 "driver/charger/sm5803.h"
#include "driver/tcpm/tcpci.h"
#include "emul/emul_sm5803.h"
#include "test/drivers/charger_utils.h"

#include <zephyr/drivers/emul.h>
#include <zephyr/drivers/gpio/gpio_emul.h>

__override bool pd_check_vbus_level(int port, enum vbus_level level)
{
	return sm5803_check_vbus_level(port, level);
}

static void pin_interrupt_handler(const struct device *gpio,
				  struct gpio_callback *const cb,
				  gpio_port_pins_t pins)
{
	sm5803_interrupt(get_charger_num(&sm5803_drv));
}

static int configure_charger_interrupt(void)
{
	const struct gpio_dt_spec *gpio = sm5803_emul_get_interrupt_gpio(
		EMUL_DT_GET(DT_NODELABEL(sm5803_emul)));
	static struct gpio_callback callback;

	if (!device_is_ready(gpio->port))
		k_oops();

	gpio_emul_input_set(gpio->port, gpio->pin, 1);
	gpio_pin_configure_dt(gpio, GPIO_INPUT | GPIO_ACTIVE_LOW);
	gpio_init_callback(&callback, pin_interrupt_handler, BIT(gpio->pin));
	gpio_add_callback(gpio->port, &callback);
	gpio_pin_interrupt_configure_dt(gpio, GPIO_INT_EDGE_TO_ACTIVE);

	return 0;
}
SYS_INIT(configure_charger_interrupt, APPLICATION, 10);