struct isl29028_chip { struct mutex lock; struct regmap *regmap; int prox_sampling_int; int prox_sampling_frac; bool enable_prox; int lux_scale; enum isl29028_als_ir_mode als_ir_mode;
};
staticint isl29028_find_prox_sleep_index(int sampling_int, int sampling_fract)
{ int i;
for (i = 0; i < ARRAY_SIZE(isl29028_prox_data); ++i) { if (isl29028_prox_data[i].sampling_int == sampling_int &&
isl29028_prox_data[i].sampling_fract == sampling_fract) return i;
}
return -EINVAL;
}
staticint isl29028_set_proxim_sampling(struct isl29028_chip *chip, int sampling_int, int sampling_fract)
{ struct device *dev = regmap_get_device(chip->regmap); int sleep_index, ret;
sleep_index = isl29028_find_prox_sleep_index(sampling_int,
sampling_fract); if (sleep_index < 0) return sleep_index;
ret = regmap_update_bits(chip->regmap, ISL29028_REG_CONFIGURE,
ISL29028_CONF_PROX_SLP_MASK,
sleep_index << ISL29028_CONF_PROX_SLP_SH);
if (ret < 0) {
dev_err(dev, "%s(): Error %d setting the proximity sampling\n",
__func__, ret); return ret;
}
staticint isl29028_enable_proximity(struct isl29028_chip *chip)
{ int prox_index, ret;
ret = isl29028_set_proxim_sampling(chip, chip->prox_sampling_int,
chip->prox_sampling_frac); if (ret < 0) return ret;
ret = regmap_update_bits(chip->regmap, ISL29028_REG_CONFIGURE,
ISL29028_CONF_PROX_EN_MASK,
ISL29028_CONF_PROX_EN); if (ret < 0) return ret;
/* Wait for conversion to be complete for first sample */
prox_index = isl29028_find_prox_sleep_index(chip->prox_sampling_int,
chip->prox_sampling_frac); if (prox_index < 0) return prox_index;
if (on) {
ret = pm_runtime_resume_and_get(dev);
} else {
pm_runtime_mark_last_busy(dev);
ret = pm_runtime_put_autosuspend(dev);
}
return ret;
}
/* Channel IO */ staticint isl29028_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
{ struct isl29028_chip *chip = iio_priv(indio_dev); struct device *dev = regmap_get_device(chip->regmap); int ret;
ret = isl29028_set_pm_runtime_busy(chip, true); if (ret < 0) return ret;
mutex_lock(&chip->lock);
ret = -EINVAL; switch (chan->type) { case IIO_PROXIMITY: if (mask != IIO_CHAN_INFO_SAMP_FREQ) {
dev_err(dev, "%s(): proximity: Mask value 0x%08lx is not supported\n",
__func__, mask); break;
}
if (val < 1 || val > 100) {
dev_err(dev, "%s(): proximity: Sampling frequency %d is not in the range [1:100]\n",
__func__, val); break;
}
ret = isl29028_set_proxim_sampling(chip, val, val2); break; case IIO_LIGHT: if (mask != IIO_CHAN_INFO_SCALE) {
dev_err(dev, "%s(): light: Mask value 0x%08lx is not supported\n",
__func__, mask); break;
}
if (val != 125 && val != 2000) {
dev_err(dev, "%s(): light: Lux scale %d is not in the set {125, 2000}\n",
__func__, val); break;
}
ret = isl29028_set_als_scale(chip, val); break; default:
dev_err(dev, "%s(): Unsupported channel type %x\n",
__func__, chan->type); break;
}
mutex_unlock(&chip->lock);
if (ret < 0) return ret;
ret = isl29028_set_pm_runtime_busy(chip, false); if (ret < 0) return ret;
return ret;
}
staticint isl29028_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{ struct isl29028_chip *chip = iio_priv(indio_dev); struct device *dev = regmap_get_device(chip->regmap); int ret, pm_ret;
ret = isl29028_set_pm_runtime_busy(chip, true); if (ret < 0) return ret;
mutex_lock(&chip->lock);
ret = -EINVAL; switch (mask) { case IIO_CHAN_INFO_RAW: case IIO_CHAN_INFO_PROCESSED: switch (chan->type) { case IIO_LIGHT:
ret = isl29028_als_get(chip, val); break; case IIO_INTENSITY:
ret = isl29028_ir_get(chip, val); break; case IIO_PROXIMITY:
ret = isl29028_read_proxim(chip, val); break; default: break;
}
if (ret < 0) break;
ret = IIO_VAL_INT; break; case IIO_CHAN_INFO_SAMP_FREQ: if (chan->type != IIO_PROXIMITY) break;
*val = chip->prox_sampling_int;
*val2 = chip->prox_sampling_frac;
ret = IIO_VAL_INT; break; case IIO_CHAN_INFO_SCALE: if (chan->type != IIO_LIGHT) break;
*val = chip->lux_scale;
ret = IIO_VAL_INT; break; default:
dev_err(dev, "%s(): mask value 0x%08lx is not supported\n",
__func__, mask); break;
}
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.