mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-01-22 16:58:21 -05:00
iio: light: vcnl4000: Check type with switch case
Check IIO_PROXIMITY with switch case in order to make it easier to add further types like light. Add check for IIO_EV_INFO_VALUE for writing rising or falling events. Signed-off-by: Astrid Rost <astrid.rost@axis.com> Link: https://lore.kernel.org/r/20230613135025.2596641-4-astrid.rost@axis.com Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
committed by
Jonathan Cameron
parent
e55c96daf7
commit
2be17b6889
@@ -600,9 +600,13 @@ static int vcnl4000_read_raw(struct iio_dev *indio_dev,
|
||||
*val2 = data->al_scale;
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
case IIO_CHAN_INFO_INT_TIME:
|
||||
if (chan->type != IIO_PROXIMITY)
|
||||
switch (chan->type) {
|
||||
case IIO_PROXIMITY:
|
||||
ret = vcnl4040_read_ps_it(data, val, val2);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
ret = vcnl4040_read_ps_it(data, val, val2);
|
||||
}
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
return IIO_VAL_INT_PLUS_MICRO;
|
||||
@@ -621,9 +625,12 @@ static int vcnl4040_write_raw(struct iio_dev *indio_dev,
|
||||
case IIO_CHAN_INFO_INT_TIME:
|
||||
if (val != 0)
|
||||
return -EINVAL;
|
||||
if (chan->type != IIO_PROXIMITY)
|
||||
switch (chan->type) {
|
||||
case IIO_PROXIMITY:
|
||||
return vcnl4040_write_ps_it(data, val2);
|
||||
default:
|
||||
return -EINVAL;
|
||||
return vcnl4040_write_ps_it(data, val2);
|
||||
}
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -638,9 +645,15 @@ static int vcnl4040_read_avail(struct iio_dev *indio_dev,
|
||||
|
||||
switch (mask) {
|
||||
case IIO_CHAN_INFO_INT_TIME:
|
||||
*vals = (int *)(*data->chip_spec->ps_it_times);
|
||||
switch (chan->type) {
|
||||
case IIO_PROXIMITY:
|
||||
*vals = (int *)(*data->chip_spec->ps_it_times);
|
||||
*length = 2 * data->chip_spec->num_ps_it_times;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
*type = IIO_VAL_INT_PLUS_MICRO;
|
||||
*length = 2 * data->chip_spec->num_ps_it_times;
|
||||
return IIO_AVAIL_LIST;
|
||||
default:
|
||||
return -EINVAL;
|
||||
@@ -836,24 +849,34 @@ static int vcnl4040_read_event(struct iio_dev *indio_dev,
|
||||
int ret;
|
||||
struct vcnl4000_data *data = iio_priv(indio_dev);
|
||||
|
||||
switch (dir) {
|
||||
case IIO_EV_DIR_RISING:
|
||||
ret = i2c_smbus_read_word_data(data->client,
|
||||
VCNL4040_PS_THDH_LM);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
*val = ret;
|
||||
return IIO_VAL_INT;
|
||||
case IIO_EV_DIR_FALLING:
|
||||
ret = i2c_smbus_read_word_data(data->client,
|
||||
VCNL4040_PS_THDL_LM);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
*val = ret;
|
||||
return IIO_VAL_INT;
|
||||
switch (chan->type) {
|
||||
case IIO_PROXIMITY:
|
||||
switch (info) {
|
||||
case IIO_EV_INFO_VALUE:
|
||||
switch (dir) {
|
||||
case IIO_EV_DIR_RISING:
|
||||
ret = i2c_smbus_read_word_data(data->client,
|
||||
VCNL4040_PS_THDH_LM);
|
||||
break;
|
||||
case IIO_EV_DIR_FALLING:
|
||||
ret = i2c_smbus_read_word_data(data->client,
|
||||
VCNL4040_PS_THDL_LM);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
*val = ret;
|
||||
return IIO_VAL_INT;
|
||||
}
|
||||
|
||||
static int vcnl4040_write_event(struct iio_dev *indio_dev,
|
||||
@@ -866,22 +889,35 @@ static int vcnl4040_write_event(struct iio_dev *indio_dev,
|
||||
int ret;
|
||||
struct vcnl4000_data *data = iio_priv(indio_dev);
|
||||
|
||||
switch (dir) {
|
||||
case IIO_EV_DIR_RISING:
|
||||
ret = i2c_smbus_write_word_data(data->client,
|
||||
VCNL4040_PS_THDH_LM, val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
return IIO_VAL_INT;
|
||||
case IIO_EV_DIR_FALLING:
|
||||
ret = i2c_smbus_write_word_data(data->client,
|
||||
VCNL4040_PS_THDL_LM, val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
return IIO_VAL_INT;
|
||||
switch (chan->type) {
|
||||
case IIO_PROXIMITY:
|
||||
switch (info) {
|
||||
case IIO_EV_INFO_VALUE:
|
||||
switch (dir) {
|
||||
case IIO_EV_DIR_RISING:
|
||||
ret = i2c_smbus_write_word_data(data->client,
|
||||
VCNL4040_PS_THDH_LM,
|
||||
val);
|
||||
break;
|
||||
case IIO_EV_DIR_FALLING:
|
||||
ret = i2c_smbus_write_word_data(data->client,
|
||||
VCNL4040_PS_THDL_LM,
|
||||
val);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
return IIO_VAL_INT;
|
||||
}
|
||||
|
||||
static bool vcnl4010_is_thr_enabled(struct vcnl4000_data *data)
|
||||
@@ -974,15 +1010,20 @@ static int vcnl4040_read_event_config(struct iio_dev *indio_dev,
|
||||
int ret;
|
||||
struct vcnl4000_data *data = iio_priv(indio_dev);
|
||||
|
||||
ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
switch (chan->type) {
|
||||
case IIO_PROXIMITY:
|
||||
ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
data->ps_int = FIELD_GET(VCNL4040_PS_CONF2_PS_INT, ret);
|
||||
data->ps_int = FIELD_GET(VCNL4040_PS_CONF2_PS_INT, ret);
|
||||
|
||||
return (dir == IIO_EV_DIR_RISING) ?
|
||||
FIELD_GET(VCNL4040_PS_IF_AWAY, ret) :
|
||||
FIELD_GET(VCNL4040_PS_IF_CLOSE, ret);
|
||||
return (dir == IIO_EV_DIR_RISING) ?
|
||||
FIELD_GET(VCNL4040_PS_IF_AWAY, ret) :
|
||||
FIELD_GET(VCNL4040_PS_IF_CLOSE, ret);
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
static int vcnl4040_write_event_config(struct iio_dev *indio_dev,
|
||||
@@ -990,25 +1031,32 @@ static int vcnl4040_write_event_config(struct iio_dev *indio_dev,
|
||||
enum iio_event_type type,
|
||||
enum iio_event_direction dir, int state)
|
||||
{
|
||||
int ret;
|
||||
int ret = -EINVAL;
|
||||
u16 val, mask;
|
||||
struct vcnl4000_data *data = iio_priv(indio_dev);
|
||||
|
||||
mutex_lock(&data->vcnl4000_lock);
|
||||
|
||||
ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF1);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
switch (chan->type) {
|
||||
case IIO_PROXIMITY:
|
||||
ret = i2c_smbus_read_word_data(data->client, VCNL4200_PS_CONF1);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
if (dir == IIO_EV_DIR_RISING)
|
||||
mask = VCNL4040_PS_IF_AWAY;
|
||||
else
|
||||
mask = VCNL4040_PS_IF_CLOSE;
|
||||
if (dir == IIO_EV_DIR_RISING)
|
||||
mask = VCNL4040_PS_IF_AWAY;
|
||||
else
|
||||
mask = VCNL4040_PS_IF_CLOSE;
|
||||
|
||||
val = state ? (ret | mask) : (ret & ~mask);
|
||||
val = state ? (ret | mask) : (ret & ~mask);
|
||||
|
||||
data->ps_int = FIELD_GET(VCNL4040_PS_CONF2_PS_INT, val);
|
||||
ret = i2c_smbus_write_word_data(data->client, VCNL4200_PS_CONF1, val);
|
||||
data->ps_int = FIELD_GET(VCNL4040_PS_CONF2_PS_INT, val);
|
||||
ret = i2c_smbus_write_word_data(data->client, VCNL4200_PS_CONF1,
|
||||
val);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
mutex_unlock(&data->vcnl4000_lock);
|
||||
|
||||
Reference in New Issue
Block a user