/* Set INT_PS value */
mutex_lock(&data->lock);
ret = regmap_field_write(data->reg_int_ps, state); if (ret < 0)
dev_err(&client->dev, "failed to set interrupt mode\n");
mutex_unlock(&data->lock);
return ret;
}
staticint stk3310_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask)
{
u8 reg;
__be16 buf; int ret; unsignedint index; struct stk3310_data *data = iio_priv(indio_dev); struct i2c_client *client = data->client;
if (chan->type != IIO_LIGHT && chan->type != IIO_PROXIMITY) return -EINVAL;
switch (mask) { case IIO_CHAN_INFO_RAW: if (chan->type == IIO_LIGHT)
reg = STK3310_REG_ALS_DATA_MSB; else
reg = STK3310_REG_PS_DATA_MSB;
mutex_lock(&data->lock);
ret = regmap_bulk_read(data->regmap, reg, &buf, 2); if (ret < 0) {
dev_err(&client->dev, "register read failed\n");
mutex_unlock(&data->lock); return ret;
}
*val = be16_to_cpu(buf);
mutex_unlock(&data->lock); return IIO_VAL_INT; case IIO_CHAN_INFO_INT_TIME: if (chan->type == IIO_LIGHT)
ret = regmap_field_read(data->reg_als_it, &index); else
ret = regmap_field_read(data->reg_ps_it, &index); if (ret < 0) return ret;
*val = stk3310_it_table[index][0];
*val2 = stk3310_it_table[index][1]; return IIO_VAL_INT_PLUS_MICRO; case IIO_CHAN_INFO_SCALE: if (chan->type == IIO_LIGHT)
ret = regmap_field_read(data->reg_als_gain, &index); else
ret = regmap_field_read(data->reg_ps_gain, &index); if (ret < 0) return ret;
staticint stk3310_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask)
{ int ret; int index; struct stk3310_data *data = iio_priv(indio_dev);
if (chan->type != IIO_LIGHT && chan->type != IIO_PROXIMITY) return -EINVAL;
switch (mask) { case IIO_CHAN_INFO_INT_TIME:
index = stk3310_get_index(stk3310_it_table,
ARRAY_SIZE(stk3310_it_table),
val, val2); if (index < 0) return -EINVAL;
mutex_lock(&data->lock); if (chan->type == IIO_LIGHT)
ret = regmap_field_write(data->reg_als_it, index); else
ret = regmap_field_write(data->reg_ps_it, index); if (ret < 0)
dev_err(&data->client->dev, "sensor configuration failed\n");
mutex_unlock(&data->lock); return ret;
case IIO_CHAN_INFO_SCALE:
index = stk3310_get_index(stk3310_scale_table,
ARRAY_SIZE(stk3310_scale_table),
val, val2); if (index < 0) return -EINVAL;
mutex_lock(&data->lock); if (chan->type == IIO_LIGHT)
ret = regmap_field_write(data->reg_als_gain, index); else
ret = regmap_field_write(data->reg_ps_gain, index); if (ret < 0)
dev_err(&data->client->dev, "sensor configuration failed\n");
mutex_unlock(&data->lock); return ret;
}
ret = regmap_read(data->regmap, STK3310_REG_ID, &chipid); if (ret < 0) return ret;
ret = stk3310_check_chip_id(chipid); if (ret < 0)
dev_info(&client->dev, "new unknown chip id: 0x%x\n", chipid);
state = STK3310_STATE_EN_ALS | STK3310_STATE_EN_PS;
ret = stk3310_set_state(data, state); if (ret < 0) {
dev_err(&client->dev, "failed to enable sensor"); return ret;
}
/* Enable PS interrupts */
ret = regmap_field_write(data->reg_int_ps, STK3310_PSINT_EN); if (ret < 0)
dev_err(&client->dev, "failed to enable interrupts!\n");
return ret;
}
staticbool stk3310_is_volatile_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case STK3310_REG_ALS_DATA_MSB: case STK3310_REG_ALS_DATA_LSB: case STK3310_REG_PS_DATA_LSB: case STK3310_REG_PS_DATA_MSB: case STK3310_REG_FLAG: returntrue; default: returnfalse;
}
}
/* Read FLAG_NF to figure out what threshold has been met. */
mutex_lock(&data->lock);
ret = regmap_field_read(data->reg_flag_nf, &dir); if (ret < 0) {
dev_err(&data->client->dev, "register read failed: %d\n", ret); goto out;
}
event = IIO_UNMOD_EVENT_CODE(IIO_PROXIMITY, 1,
IIO_EV_TYPE_THRESH,
(dir ? IIO_EV_DIR_FALLING :
IIO_EV_DIR_RISING));
iio_push_event(indio_dev, event, data->timestamp);
/* Reset the interrupt flag */
ret = regmap_field_write(data->reg_flag_psint, 0); if (ret < 0)
dev_err(&data->client->dev, "failed to reset interrupts\n");
out:
mutex_unlock(&data->lock);
data = iio_priv(i2c_get_clientdata(to_i2c_client(dev))); if (data->ps_enabled)
state |= STK3310_STATE_EN_PS; if (data->als_enabled)
state |= STK3310_STATE_EN_ALS;
¤ 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.0.15Bemerkung:
(vorverarbeitet am 2026-06-08)
¤
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.