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_read(als->lm3533, reg, val); if (ret)
dev_err(&indio_dev->dev, "failed to get target current\n");
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;
}
staticint lm3533_als_get_current(struct iio_dev *indio_dev, unsigned channel, int *val)
{
u8 zone;
u8 target; int ret;
ret = lm3533_als_get_zone(indio_dev, &zone); if (ret) return ret;
ret = lm3533_als_get_target(indio_dev, channel, zone, &target); if (ret) return ret;
*val = target;
return 0;
}
staticint lm3533_als_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ int ret;
switch (mask) { case IIO_CHAN_INFO_RAW: switch (chan->type) { case IIO_LIGHT:
ret = lm3533_als_get_adc(indio_dev, false, val); break; case IIO_CURRENT:
ret = lm3533_als_get_current(indio_dev, chan->channel,
val); break; default: return -EINVAL;
} break; case IIO_CHAN_INFO_AVERAGE_RAW:
ret = lm3533_als_get_adc(indio_dev, true, val); break; default: return -EINVAL;
}
staticint lm3533_als_set_int_mode(struct iio_dev *indio_dev, int enable)
{ struct lm3533_als *als = iio_priv(indio_dev);
u8 mask = LM3533_ALS_INT_ENABLE_MASK;
u8 val; int ret;
if (enable)
val = mask; else
val = 0;
ret = lm3533_update(als->lm3533, LM3533_REG_ALS_ZONE_INFO, val, mask); if (ret) {
dev_err(&indio_dev->dev, "failed to set int mode %d\n",
enable); return ret;
}
return 0;
}
staticint lm3533_als_get_int_mode(struct iio_dev *indio_dev, int *enable)
{ struct lm3533_als *als = iio_priv(indio_dev);
u8 mask = LM3533_ALS_INT_ENABLE_MASK;
u8 val; int ret;
ret = lm3533_read(als->lm3533, LM3533_REG_ALS_ZONE_INFO, &val); if (ret) {
dev_err(&indio_dev->dev, "failed to get int mode\n"); return ret;
}
reg = lm3533_als_get_threshold_reg(nr, raising);
ret = lm3533_read(als->lm3533, reg, val); if (ret)
dev_err(&indio_dev->dev, "failed to get threshold\n");
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);
switch (als_attr->type) { case LM3533_ATTR_TYPE_HYSTERESIS:
ret = lm3533_als_get_hysteresis(indio_dev, als_attr->val1,
&val); break; case LM3533_ATTR_TYPE_TARGET:
ret = lm3533_als_get_target(indio_dev, als_attr->val1,
als_attr->val2, &val); break; case LM3533_ATTR_TYPE_THRESH_FALLING:
ret = lm3533_als_get_threshold(indio_dev, als_attr->val1, false, &val); break; case LM3533_ATTR_TYPE_THRESH_RAISING:
ret = lm3533_als_get_threshold(indio_dev, als_attr->val1, true, &val); break; default:
ret = -ENXIO;
}
switch (als_attr->type) { case LM3533_ATTR_TYPE_TARGET:
ret = lm3533_als_set_target(indio_dev, als_attr->val1,
als_attr->val2, val); break; case LM3533_ATTR_TYPE_THRESH_FALLING:
ret = lm3533_als_set_threshold(indio_dev, als_attr->val1, false, val); break; case LM3533_ATTR_TYPE_THRESH_RAISING:
ret = lm3533_als_set_threshold(indio_dev, als_attr->val1, true, val); break; default:
ret = -ENXIO;
}
if (pwm_mode)
val = mask; /* pwm input */ else
val = 0; /* analog input */
ret = lm3533_update(als->lm3533, LM3533_REG_ALS_CONF, val, mask); if (ret) {
dev_err(&als->pdev->dev, "failed to set input mode %d\n",
pwm_mode); return ret;
}
return 0;
}
staticint lm3533_als_set_resistor(struct lm3533_als *als, u8 val)
{ int ret;
if (val < LM3533_ALS_RESISTOR_MIN || val > LM3533_ALS_RESISTOR_MAX) {
dev_err(&als->pdev->dev, "invalid resistor value\n"); return -EINVAL;
}
ret = lm3533_write(als->lm3533, LM3533_REG_ALS_RESISTOR_SELECT, val); if (ret) {
dev_err(&als->pdev->dev, "failed to set resistor\n"); return ret;
}
return 0;
}
staticint lm3533_als_setup(struct lm3533_als *als, conststruct lm3533_als_platform_data *pdata)
{ int ret;
ret = lm3533_als_set_input_mode(als, pdata->pwm_mode); if (ret) return ret;
/* ALS input is always high impedance in PWM-mode. */ if (!pdata->pwm_mode) {
ret = lm3533_als_set_resistor(als, pdata->r_select); if (ret) return ret;
}
/* Make sure interrupts are disabled. */
ret = lm3533_update(als->lm3533, LM3533_REG_ALS_ZONE_INFO, 0, mask); if (ret) {
dev_err(&als->pdev->dev, "failed to disable interrupts\n"); return ret;
}
ret = request_threaded_irq(als->irq, NULL, lm3533_als_isr,
IRQF_TRIGGER_LOW | IRQF_ONESHOT,
dev_name(&als->pdev->dev), dev); if (ret) {
dev_err(&als->pdev->dev, "failed to request irq %d\n",
als->irq); return ret;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.