Exemplo n.º 1
0
static int ltc294x_reset(const struct ltc294x_info *info, int prescaler_exp)
{
        int ret;
        u8 value;
        u8 control;

        /* Read status and control registers */
        ret = ltc294x_read_regs(info->client, LTC294X_REG_CONTROL, &value, 1);
        if (ret < 0) {
                dev_err(&info->client->dev,
                        "Could not read registers from device\n");
                goto error_exit;
        }

        control = LTC294X_REG_CONTROL_PRESCALER_SET(prescaler_exp) |
                                LTC294X_REG_CONTROL_ALCC_CONFIG_DISABLED;
        /* Put the 2943 into "monitor" mode, so it measures every 10 sec */
        if (info->num_regs == LTC2943_NUM_REGS)
                control |= LTC2943_REG_CONTROL_MODE_SCAN;

        if (value != control) {
                ret = ltc294x_write_regs(info->client,
                        LTC294X_REG_CONTROL, &control, 1);
                if (ret < 0) {
                        dev_err(&info->client->dev,
                                "Could not write register\n");
                        goto error_exit;
                }
        }

        return 0;

error_exit:
        return ret;
}
Exemplo n.º 2
0
static int ltc294x_set_charge_now(const struct ltc294x_info *info, int val)
{
        int ret;
        u8 dataw[2];
        u8 ctrl_reg;
        s32 value;

        value = convert_uAh_to_bin(info, val);
        /* Direction depends on how sense+/- were connected */
        if (info->Qlsb < 0)
                value += 0xFFFF;
        if ((value < 0) || (value > 0xFFFF)) /* input validation */
                return -EINVAL;

        /* Read control register */
        ret = ltc294x_read_regs(info->client,
                LTC294X_REG_CONTROL, &ctrl_reg, 1);
        if (ret < 0)
                return ret;
        /* Disable analog section */
        ctrl_reg |= LTC294X_REG_CONTROL_SHUTDOWN_MASK;
        ret = ltc294x_write_regs(info->client,
                LTC294X_REG_CONTROL, &ctrl_reg, 1);
        if (ret < 0)
                return ret;
        /* Set new charge value */
        dataw[0] = I16_MSB(value);
        dataw[1] = I16_LSB(value);
        ret = ltc294x_write_regs(info->client,
                LTC294X_REG_ACC_CHARGE_MSB, &dataw[0], 2);
        if (ret < 0)
                goto error_exit;
        /* Enable analog section */
error_exit:
        ctrl_reg &= ~LTC294X_REG_CONTROL_SHUTDOWN_MASK;
        ret = ltc294x_write_regs(info->client,
                LTC294X_REG_CONTROL, &ctrl_reg, 1);

        return ret < 0 ? ret : 0;
}
Exemplo n.º 3
0
int ltc294x_reset( int prescaler_exp) {
		struct ltc294x_info *info = &ltc2943_info;
        int ret;
        u8 value[3];
        u8 control;

        /* Read status and control registers */
	ret = ltc294x_read_regs(info->client, LTC294X_REG_CONTROL, &value[0], 1);
        if (ret < 0) {
                dev_err(&info->client->dev,
                        "Could not read registers from device\n");
                goto error_exit;
        }

        control = LTC294X_REG_CONTROL_PRESCALER_SET(prescaler_exp) |
                                LTC294X_REG_CONTROL_ALCC_CONFIG_OUTPUT_ALERT;
        /* Set the 2943 mode*/
        if (info->num_regs == LTC2943_NUM_REGS)
                control |= LTC2943_REG_CONTROL_MODE_SCAN;

		do {
			if (value[0] != control) {
					ret = ltc294x_write_regs(info->client,
							LTC294X_REG_CONTROL, &control, 1);
					if (ret < 0) {
							dev_err(&info->client->dev,
									"Could not write register\n");
							goto error_exit;
					}
			}
			/* Read status and control registers again */
			ret = ltc294x_read_regs(info->client, LTC294X_REG_CONTROL, &value[0], 1);
			if (ret < 0) {
					dev_err(&info->client->dev,
							"Could not read registers from device\n");
					goto error_exit;
			}
		}
		while(value[0]!= control);
		
        return 0;

error_exit:
        return ret;
}
Exemplo n.º 4
0
static int ltc294x_reset(const struct ltc294x_info *info, int prescaler_exp)
{
	int ret;
	u8 value;
	u8 control;

	/* Read status and control registers */
	ret = ltc294x_read_regs(info->client, LTC294X_REG_CONTROL, &value, 1);
	if (ret < 0) {
		dev_err(&info->client->dev,
			"Could not read registers from device\n");
		goto error_exit;
	}

	control = LTC294X_REG_CONTROL_PRESCALER_SET(prescaler_exp) |
				LTC294X_REG_CONTROL_ALCC_CONFIG_DISABLED;
	/* Put device into "monitor" mode */
	switch (info->id) {
	case LTC2942_ID:	/* 2942 measures every 2 sec */
		control |= LTC2942_REG_CONTROL_MODE_SCAN;
		break;
	case LTC2943_ID:
	case LTC2944_ID:	/* 2943 and 2944 measure every 10 sec */
		control |= LTC2943_REG_CONTROL_MODE_SCAN;
		break;
	default:
		break;
	}

	if (value != control) {
		ret = ltc294x_write_regs(info->client,
			LTC294X_REG_CONTROL, &control, 1);
		if (ret < 0) {
			dev_err(&info->client->dev,
				"Could not write register\n");
			goto error_exit;
		}
	}

	return 0;

error_exit:
	return ret;
}