static bool isl29018_read_lux(struct i2c_client *client, int *lux) { int lux_data; struct isl29018_chip *chip = i2c_get_clientdata(client); lux_data = isl29018_read_sensor_input(client, COMMMAND1_OPMODE_ALS_ONCE); if (lux_data > 0) { *lux = (lux_data * chip->range) >> chip->adc_bit; return true; }
static bool isl29018_read_ir(struct i2c_client *client, int *ir) { int ir_data; ir_data = isl29018_read_sensor_input(client, COMMMAND1_OPMODE_IR_ONCE); if (ir_data > 0) { *ir = ir_data; return true; } return false; }
static int isl29018_read_ir(struct i2c_client *client, int *ir) { int ir_data; ir_data = isl29018_read_sensor_input(client, COMMMAND1_OPMODE_IR_ONCE); if (ir_data < 0) return ir_data; *ir = ir_data; return 0; }
static int isl29018_read_lux(struct isl29018_chip *chip, int *lux) { int lux_data; lux_data = isl29018_read_sensor_input(chip, COMMMAND1_OPMODE_ALS_ONCE); if (lux_data < 0) return lux_data; *lux = (lux_data * chip->range * chip->lux_scale) >> chip->adc_bit; return 0; }
static int isl29018_read_proximity_ir(struct isl29018_chip *chip, int scheme, int *near_ir) { int status; int prox_data = -1; int ir_data = -1; struct device *dev = regmap_get_device(chip->regmap); /* Do proximity sensing with required scheme */ status = regmap_update_bits(chip->regmap, ISL29018_REG_ADD_COMMANDII, COMMANDII_SCHEME_MASK, scheme << COMMANDII_SCHEME_SHIFT); if (status) { dev_err(dev, "Error in setting operating mode\n"); return status; } prox_data = isl29018_read_sensor_input(chip, COMMMAND1_OPMODE_PROX_ONCE); if (prox_data < 0) return prox_data; if (scheme == 1) { *near_ir = prox_data; return 0; } ir_data = isl29018_read_sensor_input(chip, COMMMAND1_OPMODE_IR_ONCE); if (ir_data < 0) return ir_data; if (prox_data >= ir_data) *near_ir = prox_data - ir_data; else *near_ir = 0; return 0; }
static int isl29018_read_ir(struct isl29018_chip *chip, int *ir) { int ir_data; ir_data = isl29018_read_sensor_input(chip, ISL29018_CMD1_OPMODE_IR_ONCE); if (ir_data < 0) return ir_data; *ir = ir_data; return 0; }
static int isl29018_read_proximity_ir(struct i2c_client *client, int scheme, int *near_ir) { int status; int prox_data = -1; int ir_data = -1; /* Do proximity sensing with required scheme */ status = isl29018_write_data(client, ISL29018_REG_ADD_COMMANDII, scheme, COMMANDII_SCHEME_MASK, COMMANDII_SCHEME_SHIFT); if (status) { dev_err(&client->dev, "Error in setting operating mode\n"); return status; } prox_data = isl29018_read_sensor_input(client, COMMMAND1_OPMODE_PROX_ONCE); if (prox_data < 0) return prox_data; if (scheme == 1) { *near_ir = prox_data; return 0; } ir_data = isl29018_read_sensor_input(client, COMMMAND1_OPMODE_IR_ONCE); if (ir_data < 0) return ir_data; if (prox_data >= ir_data) *near_ir = prox_data - ir_data; else *near_ir = 0; return 0; }
static int isl29018_read_lux(struct i2c_client *client, int *lux) { int lux_data; struct isl29018_chip *chip = iio_priv(i2c_get_clientdata(client)); lux_data = isl29018_read_sensor_input(client, COMMMAND1_OPMODE_ALS_ONCE); if (lux_data < 0) return lux_data; *lux = (lux_data * chip->range * chip->lux_scale) >> chip->adc_bit; return 0; }
static int isl29018_read_lux(struct isl29018_chip *chip, int *lux) { int lux_data; unsigned int data_x_range; lux_data = isl29018_read_sensor_input(chip, COMMMAND1_OPMODE_ALS_ONCE); if (lux_data < 0) return lux_data; data_x_range = lux_data * chip->scale.scale + lux_data * chip->scale.uscale / 1000000; *lux = data_x_range * chip->calibscale + data_x_range * chip->ucalibscale / 1000000; return 0; }
static int isl29018_read_lux(struct isl29018_chip *chip, int *lux) { int lux_data; unsigned int data_x_range, lux_unshifted; lux_data = isl29018_read_sensor_input(chip, COMMMAND1_OPMODE_ALS_ONCE); if (lux_data < 0) return lux_data; /* To support fractional scaling, separate the unshifted lux * into two calculations: int scaling and micro-scaling. * lux_uscale ranges from 0-999999, so about 20 bits. Split * the /1,000,000 in two to reduce the risk of over/underflow. */ data_x_range = lux_data * chip->range; lux_unshifted = data_x_range * chip->lux_scale; lux_unshifted += data_x_range / 1000 * chip->lux_uscale / 1000; *lux = lux_unshifted >> chip->adc_bit; return 0; }