Example #1
0
/* sysfs store for max volatge */
static ssize_t qpnp_hap_max_volatge_store(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
{
	struct timed_output_dev *timed_dev = dev_get_drvdata(dev);
	struct qpnp_hap *hap = container_of(timed_dev, struct qpnp_hap,
					 timed_dev);
	int data, rc, temp;
	u8 reg;

	if (sscanf(buf, "%d", &data) != 1)
		return -EINVAL;

	if (data < QPNP_HAP_VMAX_MIN_MV)
		data = QPNP_HAP_VMAX_MIN_MV;
	else if (data > QPNP_HAP_VMAX_MAX_MV)
		data = QPNP_HAP_VMAX_MAX_MV;

	rc = qpnp_hap_read_reg(hap, &reg, QPNP_HAP_VMAX_REG(hap->base));
	if (rc < 0)
		return rc;
	reg &= QPNP_HAP_VMAX_MASK;
	temp = data / QPNP_HAP_VMAX_MIN_MV;
	reg |= (temp << QPNP_HAP_VMAX_SHIFT);
	rc = qpnp_hap_write_reg(hap, &reg, QPNP_HAP_VMAX_REG(hap->base));
	if (rc)
		return rc;

	hap->vmax_mv = data;

	return count;
}
/* configuration api for max volatge */
static int qpnp_hap_vmax_config(struct qpnp_hap *hap , int odrb)
{
	u8 reg = 0;
	int rc, temp;

	if (hap->vmax_mv < QPNP_HAP_VMAX_MIN_MV)
		hap->vmax_mv = QPNP_HAP_VMAX_MIN_MV;
	else if (hap->vmax_mv > QPNP_HAP_VMAX_MAX_MV)
	{
	/*                           */
	/* When Over drive or Reverse braking occur , odrb = 1 */
	 if(odrb)
		hap->vmax_mv = QPNP_HAP_OV_RB_MV;
	 else
		hap->vmax_mv = QPNP_HAP_VMAX_MAX_MV;
	}

	rc = qpnp_hap_read_reg(hap, &reg, QPNP_HAP_VMAX_REG(hap->base));
	if (rc < 0)
		return rc;
	reg &= QPNP_HAP_VMAX_MASK;
	temp = hap->vmax_mv / QPNP_HAP_VMAX_MIN_MV;
	reg |= (temp << QPNP_HAP_VMAX_SHIFT);
	rc = qpnp_hap_write_reg(hap, &reg, QPNP_HAP_VMAX_REG(hap->base));
	if (rc)
		return rc;

	return 0;
}
/* sysfs store for amp */
static ssize_t qpnp_hap_amp_store(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t count)
{
	struct timed_output_dev *timed_dev = dev_get_drvdata(dev);
	struct qpnp_hap *hap = container_of(timed_dev, struct qpnp_hap,
					 timed_dev);
	u8 reg = 0;
	int temp, ret, value;

	if (sscanf(buf, "%d", &value) != 1)
		return -EINVAL;

	if (value < QPNP_HAP_VMAX_MIN_MV)
		value = QPNP_HAP_VMAX_MIN_MV;
	else if (value > QPNP_HAP_VMAX_MAX_MV)
		value = QPNP_HAP_VMAX_MAX_MV;

	ret = qpnp_hap_read_reg(hap, &reg, QPNP_HAP_VMAX_REG(hap->base));

	if (ret < 0) {
			dev_err(&hap->spmi->dev, "Error reading address: %X\n",
					QPNP_HAP_VMAX_REG(hap->base));
	}

	reg &= QPNP_HAP_VMAX_MASK;
	/* Vmax Controlled by 116mV step. So we divide our input Voltage by 116 */
	temp = value / QPNP_HAP_VMAX_MIN_MV;
	/* Changed Vmax have to save to hap->vmax_mv and hap->vmax_mv_orig to
						recover vmax that changed here */
	hap->vmax_mv = hap->vmax_mv_orig = temp * QPNP_HAP_VMAX_MIN_MV;
	reg |= (temp << QPNP_HAP_VMAX_SHIFT);

	ret = qpnp_hap_write_reg(hap, &reg, QPNP_HAP_VMAX_REG(hap->base));
	if (ret < 0) {
			dev_err(&hap->spmi->dev,
					"Error writing address: %X\n",
					QPNP_HAP_VMAX_REG(hap->base));
	}

	return count;
}
Example #4
0
/* configuration api for max volatge */
static int qpnp_hap_vmax_config(struct qpnp_hap *hap)
{
	u8 reg = 0;
	int rc, temp;

	if (hap->vmax_mv < QPNP_HAP_VMAX_MIN_MV)
		hap->vmax_mv = QPNP_HAP_VMAX_MIN_MV;
	else if (hap->vmax_mv > QPNP_HAP_VMAX_MAX_MV)
		hap->vmax_mv = QPNP_HAP_VMAX_MAX_MV;

	rc = qpnp_hap_read_reg(hap, &reg, QPNP_HAP_VMAX_REG(hap->base));
	if (rc < 0)
		return rc;
	reg &= QPNP_HAP_VMAX_MASK;
	temp = hap->vmax_mv / QPNP_HAP_VMAX_MIN_MV;
	reg |= (temp << QPNP_HAP_VMAX_SHIFT);
	rc = qpnp_hap_write_reg(hap, &reg, QPNP_HAP_VMAX_REG(hap->base));
	if (rc)
		return rc;

	return 0;
}
/* sysfs show for amp */
static ssize_t qpnp_hap_amp_show(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct timed_output_dev *timed_dev = dev_get_drvdata(dev);
	struct qpnp_hap *hap = container_of(timed_dev, struct qpnp_hap,
					 timed_dev);
	u8 reg = 0, temp = 0;
	int res, ret;

	ret = qpnp_hap_read_reg(hap, &reg, QPNP_HAP_VMAX_REG(hap->base));
	if (ret < 0) {
			dev_err(&hap->spmi->dev,
					"Error reading address: %X\n",
					QPNP_HAP_VMAX_REG(hap->base));
	    return ret;
	}

	reg &= ~QPNP_HAP_VMAX_MASK;
	temp = reg >> QPNP_HAP_VMAX_SHIFT;
	res = temp * QPNP_HAP_VMAX_MIN_MV;

	return snprintf(buf, PAGE_SIZE, "%d\n", res);
}