blob: 5d636a8704e495fff081f539d61cbdeea7d5e4ff [file] [log] [blame]
#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;
}