Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
110 changes: 106 additions & 4 deletions drivers/staging/iio/light/isl29018.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,10 @@
#define ISL29018_TEST_SHIFT 0
#define ISL29018_TEST_MASK (0xFF << ISL29018_TEST_SHIFT)

#define ISL29018_REG_TEST 0x08
#define ISL29018_TEST_SHIFT 0
#define ISL29018_TEST_MASK (0xFF << ISL29018_TEST_SHIFT)

struct isl29018_chip {
struct device *dev;
struct regmap *regmap;
Expand Down Expand Up @@ -221,6 +225,95 @@ static int isl29018_read_proximity_ir(struct isl29018_chip *chip, int scheme,
}

/* Sysfs interface */
/* lux_scale */
static ssize_t show_lux_scale(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct iio_dev *indio_dev = dev_get_drvdata(dev);
struct isl29018_chip *chip = iio_priv(indio_dev);

return sprintf(buf, "%d\n", chip->lux_scale);
}

static ssize_t store_lux_scale(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count)
{
struct iio_dev *indio_dev = dev_get_drvdata(dev);
struct isl29018_chip *chip = iio_priv(indio_dev);
unsigned long lval;

lval = simple_strtoul(buf, NULL, 10);
if (lval == 0)
return -EINVAL;

mutex_lock(&chip->lock);
chip->lux_scale = lval;
mutex_unlock(&chip->lock);

return count;
}

static ssize_t get_sensor_data(struct device *dev, char *buf, int mode)
{
struct iio_dev *indio_dev = dev_get_drvdata(dev);
struct isl29018_chip *chip = iio_priv(indio_dev);
int value = 0;
int status;

mutex_lock(&chip->lock);
switch (mode) {
case COMMMAND1_OPMODE_PROX_ONCE:
status = isl29018_read_proximity_ir(chip,
chip->prox_scheme, &value);
break;

case COMMMAND1_OPMODE_ALS_ONCE:
status = isl29018_read_lux(chip, &value);
break;

case COMMMAND1_OPMODE_IR_ONCE:
status = isl29018_read_ir(chip, &value);
break;

default:
dev_err(dev, "Mode %d is not supported\n", mode);
mutex_unlock(&chip->lock);
return -EBUSY;
}

if (status < 0) {
dev_err(dev, "Error in Reading data");
mutex_unlock(&chip->lock);
return status;
}

mutex_unlock(&chip->lock);

return sprintf(buf, "%d\n", value);
}


/* Read lux */
static ssize_t show_lux(struct device *dev,
struct device_attribute *devattr, char *buf)
{
return get_sensor_data(dev, buf, COMMMAND1_OPMODE_ALS_ONCE);
}

/* Read ir */
static ssize_t show_ir(struct device *dev,
struct device_attribute *devattr, char *buf)
{
return get_sensor_data(dev, buf, COMMMAND1_OPMODE_IR_ONCE);
}

/* Read nearest ir */
static ssize_t show_proxim_ir(struct device *dev,
struct device_attribute *devattr, char *buf)
{
return get_sensor_data(dev, buf, COMMMAND1_OPMODE_PROX_ONCE);
}

/* range */
static ssize_t show_range(struct device *dev,
struct device_attribute *attr, char *buf)
Expand Down Expand Up @@ -412,17 +505,17 @@ static const struct iio_chan_spec isl29018_channels[] = {
.type = IIO_LIGHT,
.indexed = 1,
.channel = 0,
.info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
BIT(IIO_CHAN_INFO_CALIBSCALE),
.info_mask = IIO_CHAN_INFO_PROCESSED_SEPARATE_BIT |
IIO_CHAN_INFO_CALIBSCALE_SEPARATE_BIT,
}, {
.type = IIO_INTENSITY,
.modified = 1,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT,
.channel2 = IIO_MOD_LIGHT_IR,
}, {
/* Unindexed in current ABI. But perhaps it should be. */
.type = IIO_PROXIMITY,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
.info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT,
}
};

Expand All @@ -435,6 +528,11 @@ static IIO_DEVICE_ATTR(proximity_on_chip_ambient_infrared_suppression,
S_IRUGO | S_IWUSR,
show_prox_infrared_suppression,
store_prox_infrared_suppression, 0);
static IIO_DEVICE_ATTR(illuminance0_input, S_IRUGO, show_lux, NULL, 0);
static IIO_DEVICE_ATTR(illuminance0_calibscale, S_IRUGO | S_IWUSR,
show_lux_scale, store_lux_scale, 0);
static IIO_DEVICE_ATTR(intensity_infrared_raw, S_IRUGO, show_ir, NULL, 0);
static IIO_DEVICE_ATTR(proximity_raw, S_IRUGO, show_proxim_ir, NULL, 0);

#define ISL29018_DEV_ATTR(name) (&iio_dev_attr_##name.dev_attr.attr)
#define ISL29018_CONST_ATTR(name) (&iio_const_attr_##name.dev_attr.attr)
Expand All @@ -444,6 +542,10 @@ static struct attribute *isl29018_attributes[] = {
ISL29018_DEV_ATTR(adc_resolution),
ISL29018_CONST_ATTR(adc_resolution_available),
ISL29018_DEV_ATTR(proximity_on_chip_ambient_infrared_suppression),
ISL29018_DEV_ATTR(illuminance0_input),
ISL29018_DEV_ATTR(illuminance0_calibscale),
ISL29018_DEV_ATTR(intensity_infrared_raw),
ISL29018_DEV_ATTR(proximity_raw),
NULL
};

Expand Down