예제 #1
0
파일: bq24773.c 프로젝트: gelraen/cros-ec
/* Charging power state initialization */
int charger_post_init(void)
{
	int rv;
#ifdef CONFIG_CHARGER_ILIM_PIN_DISABLED
	int option2;
#endif

	/* Set charger input current limit */
	rv = charger_set_input_current(CONFIG_CHARGER_INPUT_CURRENT);

#ifdef CONFIG_CHARGER_ILIM_PIN_DISABLED
	if (rv)
		return rv;

	/* Disable the external ILIM pin. */
	rv = i2c_read16(I2C_PORT_CHARGER, BQ24773_ADDR,
			   BQ24773_CHARGE_OPTION2, &option2);
	if (rv)
		return rv;

	option2 &= ~OPTION2_EN_EXTILIM;
	rv = i2c_write16(I2C_PORT_CHARGER, BQ24773_ADDR,
			   BQ24773_CHARGE_OPTION2, option2);
#endif

	return rv;
}
예제 #2
0
static int test_i2c(void)
{
	int res = EC_ERROR_UNKNOWN;
	int dummy_data;
	struct i2c_test_param_t *param;
	param = i2c_test_params + (prng_no_seed() % (sizeof(i2c_test_params) /
				   sizeof(struct i2c_test_param_t)));
	if (param->width == 8 && param->data == -1)
		res = i2c_read8(param->port, param->addr,
				param->offset, &dummy_data);
	else if (param->width == 8 && param->data >= 0)
		res = i2c_write8(param->port, param->addr,
				 param->offset, param->data);
	else if (param->width == 16 && param->data == -1)
		res = i2c_read16(param->port, param->addr,
				 param->offset, &dummy_data);
	else if (param->width == 16 && param->data >= 0)
		res = i2c_write16(param->port, param->addr,
				  param->offset, param->data);
	else if (param->width == 32 && param->data == -1)
		res = i2c_read32(param->port, param->addr,
				 param->offset, &dummy_data);
	else if (param->width == 32 && param->data >= 0)
		res = i2c_write32(param->port, param->addr,
				  param->offset, param->data);

	return res;
}
예제 #3
0
파일: tcpci.c 프로젝트: fourier49/BZ_DEV_EC
int tcpm_alert_status(int port, int *alert)
{
	int rv;
	/* Read TCPC Alert register */
	rv = i2c_read16(I2C_PORT_TCPC, I2C_ADDR_TCPC(port),
			TCPC_REG_ALERT, alert);
	return rv;
}
예제 #4
0
파일: i2c.c 프로젝트: fourier49/BIZ_EC
int smbus_read_word(uint8_t i2c_port, uint8_t slave_addr,
			uint8_t smbus_cmd, uint16_t *p16)
{
	int rv, d16 = 0;
	rv = i2c_read16(i2c_port, slave_addr, smbus_cmd, &d16);
	*p16 = d16;
	return rv;
}
예제 #5
0
int I2C::i2c_read16(int addr, uint8_t reg, int16_t *value)
{
    uint16_t temp = 0;
    const int ret = i2c_read16(addr, reg, &temp);
    if (!ret)
       *value = static_cast<int16_t>(temp);
    return ret;
}
예제 #6
0
파일: bq24773.c 프로젝트: thehobn/ec
/* Charging power state initialization */
int charger_post_init(void)
{
	int rv, option;
#ifdef CONFIG_CHARGER_ILIM_PIN_DISABLED
	int option2;
#endif

	rv = charger_get_option(&option);
	if (rv)
		return rv;

	option &= ~OPTION0_LEARN_ENABLE;

	rv = charger_set_option(option);
	if (rv)
		return rv;

#ifndef BOARD_SAMUS
	/* Turn off PROCHOT warning */
	rv = i2c_write8(I2C_PORT_CHARGER, BQ24773_ADDR,
			BQ24773_PROCHOT_OPTION1, 0);
#else
	/* On Samus, use PROCHOT warning to detect charging problems */
	/* Turn on PROCHOT warning */
	rv = i2c_write16(I2C_PORT_CHARGER, BQ24773_ADDR,
			 BQ24773_PROCHOT_OPTION1, 0x8120);
	/* Set PROCHOT ICRIT warning when IADP is >120% of IDPM */
	rv |= i2c_write16(I2C_PORT_CHARGER, BQ24773_ADDR,
			 BQ24773_PROCHOT_OPTION0, 0x1b54);
#endif

	if (rv)
		return rv;

#ifdef CONFIG_CHARGER_ILIM_PIN_DISABLED
	/* Read the external ILIM pin enabled flag. */
	rv = i2c_read16(I2C_PORT_CHARGER, BQ24773_ADDR,
			   BQ24773_CHARGE_OPTION2, &option2);
	if (rv)
		return rv;

	/* Set ILIM pin disabled if it is currently enabled. */
	if (option2 & OPTION2_EN_EXTILIM) {
		option2 &= ~OPTION2_EN_EXTILIM;
		rv = i2c_write16(I2C_PORT_CHARGER, BQ24773_ADDR,
				 BQ24773_CHARGE_OPTION2, option2);
	}
	return rv;
#else
	return EC_SUCCESS;
#endif
}
예제 #7
0
파일: bq24773.c 프로젝트: thehobn/ec
int charger_get_current(int *current)
{
	int rv;
	int reg;

	rv = i2c_read16(I2C_PORT_CHARGER, BQ24773_ADDR,
			BQ24773_CHARGE_CURRENT, &reg);
	if (rv)
		return rv;

	*current = REG_TO_CURRENT(reg, R_SNS);
	return EC_SUCCESS;
}
예제 #8
0
파일: tcpci.c 프로젝트: fourier49/BZ_DEV_EC
int tcpm_init(int port)
{
	int rv, err = 0;

	while (1) {
		rv = i2c_read16(I2C_PORT_TCPC, I2C_ADDR_TCPC(port),
				TCPC_REG_ERROR_STATUS, &err);
		/*
		 * If i2c succeeds and the uninitialized bit is clear, then
		 * initalization is complete, clear all alert bits and write
		 * the initial alert mask.
		 */
		if (rv == EC_SUCCESS && !(err & TCPC_REG_ERROR_STATUS_UNINIT)) {
			i2c_write16(I2C_PORT_TCPC, I2C_ADDR_TCPC(port),
				    TCPC_REG_ALERT, 0xff);
			return init_alert_mask(port);
		}
		msleep(10);
	}
}
예제 #9
0
static inline int ch_raw_read16(int cmd, int *param,
				enum bd99955_command map_cmd)
{
	int rv;

	/* Map the Charge command code to appropriate region */
	mutex_lock(&bd99955_map_mutex);
	if (charger_map_cmd != map_cmd) {
		rv = i2c_write16(I2C_PORT_CHARGER, I2C_ADDR_CHARGER,
				 BD99955_CMD_MAP_SET, map_cmd);
		if (rv)
			goto bd99955_read_cleanup;

		charger_map_cmd = map_cmd;
	}

	rv = i2c_read16(I2C_PORT_CHARGER, I2C_ADDR_CHARGER, cmd, param);

bd99955_read_cleanup:
	mutex_unlock(&bd99955_map_mutex);

	return rv;
}
예제 #10
0
파일: tcpci.c 프로젝트: fourier49/BIZ_EC
int tcpm_get_message(int port, uint32_t *payload, int *head)
{
	int rv, cnt, reg = TCPC_REG_RX_DATA;

	rv = i2c_read8(I2C_PORT_TCPC, I2C_ADDR_TCPC(port),
		       TCPC_REG_RX_BYTE_CNT, &cnt);

	rv |= i2c_read16(I2C_PORT_TCPC, I2C_ADDR_TCPC(port),
			 TCPC_REG_RX_HDR, (int *)head);

	if (rv == EC_SUCCESS && cnt > 0) {
		i2c_lock(I2C_PORT_TCPC, 1);
		rv = i2c_xfer(I2C_PORT_TCPC, I2C_ADDR_TCPC(port),
			      (uint8_t *)&reg, 1, (uint8_t *)payload,
			      cnt, I2C_XFER_SINGLE);
		i2c_lock(I2C_PORT_TCPC, 0);
	}

	/* Read complete, clear RX status alert bit */
	i2c_write16(I2C_PORT_TCPC, I2C_ADDR_TCPC(port),
		    TCPC_REG_ALERT, TCPC_REG_ALERT_RX_STATUS);

	return rv;
}
예제 #11
0
static inline int sbc_read(int cmd, int *param)
{
	return i2c_read16(I2C_PORT_CHARGER, CHARGER_ADDR, cmd, param);
}
예제 #12
0
파일: bq24773.c 프로젝트: thehobn/ec
int charger_get_option(int *option)
{
	return i2c_read16(I2C_PORT_CHARGER, BQ24773_ADDR,
			 BQ24773_CHARGE_OPTION0, option);
}
예제 #13
0
파일: bq24773.c 프로젝트: thehobn/ec
int charger_get_voltage(int *voltage)
{
	return i2c_read16(I2C_PORT_CHARGER, BQ24773_ADDR,
			  BQ24773_MAX_CHARGE_VOLTAGE, voltage);
}
예제 #14
0
/**
 * Read 16bit register from device.
 */
static inline int raw_read16(const int port, const int addr, const int reg,
			     int *data_ptr)
{
	return i2c_read16(port, addr, reg, data_ptr);
}