struct isl29028_chip {
struct mutex lock;
struct regmap *regmap;
-
unsigned int prox_sampling;
bool enable_prox;
-
int lux_scale;
enum isl29028_als_ir_mode als_ir_mode;
};
if (period >= prox_period[sel])
break;
}
+
return regmap_update_bits(chip->regmap, ISL29028_REG_CONFIGURE,
ISL29028_CONF_PROX_SLP_MASK,
sel << ISL29028_CONF_PROX_SLP_SH);
/* Wait for conversion to be complete for first sample */
mdelay(DIV_ROUND_UP(1000, chip->prox_sampling));
+
return 0;
}
ISL29028_CONF_ALS_RANGE_MASK,
ISL29028_CONF_ALS_RANGE_HIGH_LUX);
break;
-
case ISL29028_MODE_IR:
ret = regmap_update_bits(chip->regmap, ISL29028_REG_CONFIGURE,
ISL29028_CONF_ALS_IR_MODE_MASK,
ISL29028_CONF_ALS_IR_MODE_IR);
break;
-
case ISL29028_MODE_NONE:
return regmap_update_bits(chip->regmap, ISL29028_REG_CONFIGURE,
ISL29028_CONF_ALS_EN_MASK,
}
*als_ir = ((msb & 0xF) << 8) | (lsb & 0xFF);
+
return 0;
}
ret = isl29028_enable_proximity(chip, true);
if (ret < 0)
return ret;
+
chip->enable_prox = true;
}
ISL29028_REG_PROX_DATA, ret);
return ret;
}
+
*prox = data;
+
return 0;
}
als_ir_data = (als_ir_data * 49) / 100;
*als_data = als_ir_data;
+
return 0;
}
dev_err(dev, "Error in enabling IR mode err %d\n", ret);
return ret;
}
+
return isl29028_read_als_ir(chip, ir_data);
}
mask);
break;
}
+
if (val < 1 || val > 100) {
dev_err(dev,
"Samp_freq %d is not in range[1:100]\n", val);
break;
}
+
ret = isl29028_set_proxim_sampling(chip, val);
if (ret < 0) {
dev_err(dev,
ret);
break;
}
+
chip->prox_sampling = val;
break;
-
case IIO_LIGHT:
if (mask != IIO_CHAN_INFO_SCALE) {
dev_err(dev,
mask);
break;
}
+
if ((val != 125) && (val != 2000)) {
dev_err(dev,
"lux scale %d is invalid [125, 2000]\n", val);
break;
}
+
ret = isl29028_set_als_scale(chip, val);
if (ret < 0) {
dev_err(dev,
"Setting lux scale fail with error %d\n", ret);
break;
}
+
chip->lux_scale = val;
break;
-
default:
dev_err(dev, "Unsupported channel type\n");
break;
}
+
mutex_unlock(&chip->lock);
+
return ret;
}
default:
break;
}
+
if (ret < 0)
break;
+
ret = IIO_VAL_INT;
break;
-
case IIO_CHAN_INFO_SAMP_FREQ:
if (chan->type != IIO_PROXIMITY)
break;
+
*val = chip->prox_sampling;
ret = IIO_VAL_INT;
break;
-
case IIO_CHAN_INFO_SCALE:
if (chan->type != IIO_LIGHT)
break;
*val = chip->lux_scale;
ret = IIO_VAL_INT;
break;
-
default:
dev_err(dev, "mask value 0x%08lx not supported\n", mask);
break;
}
+
mutex_unlock(&chip->lock);
+
return ret;
}
ISL29028_REG_TEST1_MODE, ret);
return ret;
}
+
ret = regmap_write(chip->regmap, ISL29028_REG_TEST2_MODE, 0x0);
if (ret < 0) {
dev_err(&client->dev,
indio_dev->name = id->name;
indio_dev->dev.parent = &client->dev;
indio_dev->modes = INDIO_DIRECT_MODE;
+
ret = devm_iio_device_register(indio_dev->dev.parent, indio_dev);
if (ret < 0) {
dev_err(&client->dev,
ret);
return ret;
}
+
return 0;
}