/* 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, ®, 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, ®, 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, ®, 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, ®, 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, ®, 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, ®, 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; }
/* 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, ®, 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, ®, 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, ®, 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); }