/* * Full-scale current. * * imax 5000 - 29800 uA (800 uA step) */ int lm3533_ctrlbank_set_max_current(struct lm3533_ctrlbank *cb, u16 imax) { u8 reg; u8 val; int ret; if (imax < LM3533_MAX_CURRENT_MIN || imax > LM3533_MAX_CURRENT_MAX) return -EINVAL; val = (imax - LM3533_MAX_CURRENT_MIN) / LM3533_MAX_CURRENT_STEP; reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_MAX_CURRENT_BASE); ret = lm3533_write(cb->lm3533, reg, val); if (ret) dev_err(cb->dev, "failed to set max current\n"); return ret; }
static int lm3533_als_set_target(struct iio_dev *indio_dev, unsigned channel, unsigned zone, u8 val) { struct lm3533_als *als = iio_priv(indio_dev); u8 reg; int ret; if (channel > LM3533_ALS_CHANNEL_CURRENT_MAX) return -EINVAL; if (zone > LM3533_ALS_ZONE_MAX) return -EINVAL; reg = lm3533_als_get_target_reg(channel, zone); ret = lm3533_write(als->lm3533, reg, val); if (ret) dev_err(&indio_dev->dev, "failed to set target current\n"); return ret; }
static int lm3533_als_set_threshold(struct iio_dev *indio_dev, unsigned nr, bool raising, u8 val) { struct lm3533_als *als = iio_priv(indio_dev); u8 val2; u8 reg, reg2; int ret; if (nr > LM3533_ALS_THRESH_MAX) return -EINVAL; reg = lm3533_als_get_threshold_reg(nr, raising); reg2 = lm3533_als_get_threshold_reg(nr, !raising); mutex_lock(&als->thresh_mutex); ret = lm3533_read(als->lm3533, reg2, &val2); if (ret) { dev_err(&indio_dev->dev, "failed to get threshold\n"); goto out; } /* * This device does not allow negative hysteresis (in fact, it uses * whichever value is smaller as the lower bound) so we need to make * sure that thresh_falling <= thresh_raising. */ if ((raising && (val < val2)) || (!raising && (val > val2))) { ret = -EINVAL; goto out; } ret = lm3533_write(als->lm3533, reg, val); if (ret) { dev_err(&indio_dev->dev, "failed to set threshold\n"); goto out; } out: mutex_unlock(&als->thresh_mutex); return ret; }