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 = indio_dev->dev_data; struct i2c_client *client = chip->client; int value = 0; int hb_value = 0; int lb_value = 0; int lux_data = 0; int lux = 0; bool status; if(!chip->enable_ls) return -ENODEV; mutex_lock(&chip->lock); switch (mode) { case COMMMAND1_OPMODE_PROX_ONCE: status = isl29018_read_proximity_ir(client, chip->prox_scheme, &value); break; case COMMMAND1_OPMODE_ALS_ONCE: status = isl29018_read_lux(client, &hb_value, &lb_value); break; case COMMMAND1_OPMODE_IR_ONCE: status = isl29018_read_ir(client, &value); break; default: dev_err(&client->dev,"Mode %d is not supported\n",mode); mutex_unlock(&chip->lock); return -EBUSY; } if (!status) { dev_err(&client->dev, "Error in Reading data"); mutex_unlock(&chip->lock); return -EBUSY; } mutex_unlock(&chip->lock); if (mode != COMMMAND1_OPMODE_ALS_ONCE) { return sprintf(buf, "%d\n", value); } else { lux_data = ((hb_value << 8) | lb_value); lux = (lux_data * chip->range) >> chip->adc_bit; return sprintf(buf, "%d\n", lux); } }
static int isl29018_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask) { int ret = -EINVAL; struct isl29018_chip *chip = iio_priv(indio_dev); mutex_lock(&chip->lock); if (chip->suspended) { mutex_unlock(&chip->lock); return -EBUSY; } switch (mask) { case IIO_CHAN_INFO_RAW: case IIO_CHAN_INFO_PROCESSED: switch (chan->type) { case IIO_LIGHT: ret = isl29018_read_lux(chip, val); break; case IIO_INTENSITY: ret = isl29018_read_ir(chip, val); break; case IIO_PROXIMITY: ret = isl29018_read_proximity_ir(chip, chip->prox_scheme, val); break; default: break; } if (!ret) ret = IIO_VAL_INT; break; case IIO_CHAN_INFO_CALIBSCALE: if (chan->type == IIO_LIGHT) { *val = chip->lux_scale; *val2 = chip->lux_uscale; ret = IIO_VAL_INT_PLUS_MICRO; } break; default: break; } mutex_unlock(&chip->lock); return ret; }
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); struct i2c_client *client = chip->client; int value = 0; int status; mutex_lock(&chip->lock); if (chip->suspended) { mutex_unlock(&chip->lock); return -EBUSY; } switch (mode) { case COMMMAND1_OPMODE_PROX_ONCE: status = isl29018_read_proximity_ir(client, chip->prox_scheme, &value); break; case COMMMAND1_OPMODE_ALS_ONCE: status = isl29018_read_lux(client, &value); break; case COMMMAND1_OPMODE_IR_ONCE: status = isl29018_read_ir(client, &value); break; default: dev_err(&client->dev, "Mode %d is not supported\n", mode); mutex_unlock(&chip->lock); return -EBUSY; } if (status < 0) { dev_err(&client->dev, "Error in Reading data"); mutex_unlock(&chip->lock); return status; } mutex_unlock(&chip->lock); return sprintf(buf, "%d\n", value); }
static int isl29018_read_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int *val, int *val2, long mask) { int ret = -EINVAL; struct isl29018_chip *chip = iio_priv(indio_dev); struct i2c_client *client = chip->client; mutex_lock(&chip->lock); switch (mask) { case 0: switch (chan->type) { case IIO_LIGHT: ret = isl29018_read_lux(client, val); break; case IIO_INTENSITY: ret = isl29018_read_ir(client, val); break; case IIO_PROXIMITY: ret = isl29018_read_proximity_ir(client, chip->prox_scheme, val); break; default: break; } if (!ret) ret = IIO_VAL_INT; break; case (1 << IIO_CHAN_INFO_CALIBSCALE_SEPARATE): if (chan->type == IIO_LIGHT) { *val = chip->lux_scale; ret = IIO_VAL_INT; } break; default: break; } mutex_unlock(&chip->lock); return ret; }