aboutsummaryrefslogtreecommitdiffstats
path: root/tcpm_driver.c
blob: 5d636a8704e495fff081f539d61cbdeea7d5e4ff (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
#include "m1-pd-bmc.h"
#include "tcpm_driver.h"

/* I2C wrapper functions - get I2C port / slave addr from config struct. */
int16_t tcpc_write(int16_t port, int16_t reg, int16_t val)
{
	const struct hw_context *fusb = get_hw_from_port(port);
	uint8_t buf[] = {
		reg & 0xff,
		val & 0xff,
	};

	i2c_write_blocking(fusb->i2c, fusb->addr, buf, sizeof(buf), false);

	return 0;
}

int16_t tcpc_write16(int16_t port, int16_t reg, int16_t val)
{
	const struct hw_context *fusb = get_hw_from_port(port);
	uint8_t buf[] = {
		reg & 0xff,
		val & 0xff,
		(val >> 8) & 0xff,
	};

	i2c_write_blocking(fusb->i2c, fusb->addr, buf, sizeof(buf), false);

	return 0;
}

int16_t tcpc_read(int16_t port, int16_t reg, int16_t *val)
{
	const struct hw_context *fusb = get_hw_from_port(port);
	uint8_t buf[] = {
		reg & 0xff,
		0,
	};

	i2c_write_blocking(fusb->i2c, fusb->addr, &buf[0], 1, true);
	i2c_read_blocking(fusb->i2c, fusb->addr, &buf[1], 1, false);

	*val = buf[1];

	return 0;
}

int16_t tcpc_read16(int16_t port, int16_t reg, int16_t *val)
{
	const struct hw_context *fusb = get_hw_from_port(port);
	uint8_t buf[] = {
		reg & 0xff,
		0,
		0,
	};

	i2c_write_blocking(fusb->i2c, fusb->addr, &buf[0], 1, true);
	i2c_read_blocking(fusb->i2c, fusb->addr, &buf[1], 2, false);
	*val = buf[1];
	*val |= (buf[2] << 8);

	return 0;
}

int16_t tcpc_xfer(int16_t port,
	      const uint8_t * out, int16_t out_size,
	      uint8_t * in, int16_t in_size, int16_t flags)
{
	const struct hw_context *fusb = get_hw_from_port(port);

	if (out_size) {
		i2c_write_blocking(fusb->i2c, fusb->addr, out, out_size,
				   !(flags & I2C_XFER_STOP));
	}

	if (in_size) {
		i2c_read_blocking(fusb->i2c, fusb->addr, in, in_size,
				  !(flags & I2C_XFER_STOP));
	}

	return 0;
}