devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/2] iio: light: add support for veml3235
@ 2024-10-23 18:59 Javier Carrasco
  2024-10-23 18:59 ` [PATCH v3 1/2] dt-bindings: iio: light: veml6030: add veml3235 Javier Carrasco
  2024-10-23 18:59 ` [PATCH v3 2/2] iio: light: add support for veml3235 Javier Carrasco
  0 siblings, 2 replies; 7+ messages in thread
From: Javier Carrasco @ 2024-10-23 18:59 UTC (permalink / raw)
  To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Rishi Gupta
  Cc: linux-iio, devicetree, linux-kernel, Javier Carrasco,
	Krzysztof Kozlowski

This series adds support for the Vishay veml3235 ambient light sensor
with I2C protocol interface.

I attempted to add support for this device in the existing veml6030
driver, as it shares some operating principles with the supported
devices. But given that the veml3235 has different register addresses,
bit arrangements, and limited functionality, it ended up making most of
the driver kind of device-agnostic.

Instead, the proposed driver is based on the recently updated veml6030
with multiple simplifications and a few clean ups (e.g. regfields,
right definition of shared-by-all info masks, which can't be modified
in veml6030 as it breaks the ABI).

On the other hand, the dt-bindings can be recycled as there is no real
reason to add new ones. From a dt-bindings point of view it resembles
the already supported veml7700. But if for whatever reason new bindings
would be preferred, I am willing to provide them in further versions.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
---
Changes in v3:
- Add missing Tag to [1/2] (Acked-by).
- Drop processed values from the driver, which in turn removes the need
  to store the current resolution, gain and integration time in the
  driver data.
- Fix SD0 bit position (15).
- Drop redundant configuration write in hw_init (gain and integration
  times are the only fields to set).
- Link to v2: https://lore.kernel.org/r/20241020-veml3235-v2-0-4bc7cfad7e0b@gmail.com

Changes in v2:
- Rename SD/SD0 bits to include register name.
- Switch to dev_info() when checking ID.
- Simplify val/val2 handling in veml3235_set_gain().
- Move return -EINVAL to the default case in veml3235_read_avail().
- Link to v1: https://lore.kernel.org/r/20241016-veml3235-v1-0-b904f802daef@gmail.com

---
Javier Carrasco (2):
      dt-bindings: iio: light: veml6030: add veml3235
      iio: light: add support for veml3235

 .../bindings/iio/light/vishay,veml6030.yaml        |   5 +-
 MAINTAINERS                                        |   6 +
 drivers/iio/light/Kconfig                          |  11 +
 drivers/iio/light/Makefile                         |   1 +
 drivers/iio/light/veml3235.c                       | 504 +++++++++++++++++++++
 5 files changed, 526 insertions(+), 1 deletion(-)
---
base-commit: ceab669fdf7b7510b4e4997b33d6f66e433a96db
change-id: 20241007-veml3235-0a38265e9bae

Best regards,
-- 
Javier Carrasco <javier.carrasco.cruz@gmail.com>


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v3 1/2] dt-bindings: iio: light: veml6030: add veml3235
  2024-10-23 18:59 [PATCH v3 0/2] iio: light: add support for veml3235 Javier Carrasco
@ 2024-10-23 18:59 ` Javier Carrasco
  2024-10-23 18:59 ` [PATCH v3 2/2] iio: light: add support for veml3235 Javier Carrasco
  1 sibling, 0 replies; 7+ messages in thread
From: Javier Carrasco @ 2024-10-23 18:59 UTC (permalink / raw)
  To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Rishi Gupta
  Cc: linux-iio, devicetree, linux-kernel, Javier Carrasco,
	Krzysztof Kozlowski

The veml3235 is another Vishay ambient light sensor that shares similar
properties with the other sensors covered by this bindings. In this
case, only the compatible, reg, and vdd-supply properties are required,
and the device does not have an interrupt line, like the already
supported veml7700.

Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
---
 Documentation/devicetree/bindings/iio/light/vishay,veml6030.yaml | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/iio/light/vishay,veml6030.yaml b/Documentation/devicetree/bindings/iio/light/vishay,veml6030.yaml
index 53b55575efd3..4ea69f1fdd63 100644
--- a/Documentation/devicetree/bindings/iio/light/vishay,veml6030.yaml
+++ b/Documentation/devicetree/bindings/iio/light/vishay,veml6030.yaml
@@ -4,7 +4,7 @@
 $id: http://devicetree.org/schemas/iio/light/vishay,veml6030.yaml#
 $schema: http://devicetree.org/meta-schemas/core.yaml#
 
-title: VEML6030, VEML6035 and VEML7700 Ambient Light Sensors (ALS)
+title: VEML3235, VEML6030, VEML6035 and VEML7700 Ambient Light Sensors (ALS)
 
 maintainers:
   - Rishi Gupta <gupt21@gmail.com>
@@ -20,6 +20,7 @@ description: |
   whenever configured threshold is crossed.
 
   Specifications about the sensors can be found at:
+    https://www.vishay.com/docs/80131/veml3235.pdf
     https://www.vishay.com/docs/84366/veml6030.pdf
     https://www.vishay.com/docs/84889/veml6035.pdf
     https://www.vishay.com/docs/84286/veml7700.pdf
@@ -27,6 +28,7 @@ description: |
 properties:
   compatible:
     enum:
+      - vishay,veml3235
       - vishay,veml6030
       - vishay,veml6035
       - vishay,veml7700
@@ -76,6 +78,7 @@ allOf:
       properties:
         compatible:
           enum:
+            - vishay,veml3235
             - vishay,veml7700
     then:
       properties:

-- 
2.43.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v3 2/2] iio: light: add support for veml3235
  2024-10-23 18:59 [PATCH v3 0/2] iio: light: add support for veml3235 Javier Carrasco
  2024-10-23 18:59 ` [PATCH v3 1/2] dt-bindings: iio: light: veml6030: add veml3235 Javier Carrasco
@ 2024-10-23 18:59 ` Javier Carrasco
  2024-10-25  9:01   ` kernel test robot
  1 sibling, 1 reply; 7+ messages in thread
From: Javier Carrasco @ 2024-10-23 18:59 UTC (permalink / raw)
  To: Jonathan Cameron, Lars-Peter Clausen, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Rishi Gupta
  Cc: linux-iio, devicetree, linux-kernel, Javier Carrasco

The Vishay veml3235 is a low-power ambient light sensor with I2C
interface. It provides a minimum detectable intensity of
0.0021 lx/cnt, configurable integration time and gain, and an additional
white channel to distinguish between different light sources.

Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
---
 MAINTAINERS                  |   6 +
 drivers/iio/light/Kconfig    |  11 +
 drivers/iio/light/Makefile   |   1 +
 drivers/iio/light/veml3235.c | 504 +++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 522 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 5c977ffd2bdd..228d81ae6dc2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -24679,6 +24679,12 @@ S:	Maintained
 F:	drivers/input/serio/userio.c
 F:	include/uapi/linux/userio.h
 
+VISHAY VEML3235 AMBIENT LIGHT SENSOR DRIVER
+M:	Javier Carrasco <javier.carrasco.cruz@gmail.com>
+S:	Maintained
+F:	Documentation/devicetree/bindings/iio/light/vishay,veml6030.yaml
+F:	drivers/iio/light/veml3235.c
+
 VISHAY VEML6030 AMBIENT LIGHT SENSOR DRIVER
 M:	Javier Carrasco <javier.carrasco.cruz@gmail.com>
 S:	Maintained
diff --git a/drivers/iio/light/Kconfig b/drivers/iio/light/Kconfig
index 39c0e08a8e06..8fdabe7c8b29 100644
--- a/drivers/iio/light/Kconfig
+++ b/drivers/iio/light/Kconfig
@@ -670,6 +670,17 @@ config VCNL4035
 	  To compile this driver as a module, choose M here: the
 	  module will be called vcnl4035.
 
+config VEML3235
+	tristate "VEML3235 ambient light sensor"
+	select REGMAP_I2C
+	depends on I2C
+	help
+	  Say Y here if you want to build a driver for the Vishay VEML3235
+	  ambient light sensor.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called veml3235.
+
 config VEML6030
 	tristate "VEML6030 and VEML6035 ambient light sensors"
 	select REGMAP_I2C
diff --git a/drivers/iio/light/Makefile b/drivers/iio/light/Makefile
index 321010fc0b93..f14a37442712 100644
--- a/drivers/iio/light/Makefile
+++ b/drivers/iio/light/Makefile
@@ -62,6 +62,7 @@ obj-$(CONFIG_TSL4531)		+= tsl4531.o
 obj-$(CONFIG_US5182D)		+= us5182d.o
 obj-$(CONFIG_VCNL4000)		+= vcnl4000.o
 obj-$(CONFIG_VCNL4035)		+= vcnl4035.o
+obj-$(CONFIG_VEML3235)		+= veml3235.o
 obj-$(CONFIG_VEML6030)		+= veml6030.o
 obj-$(CONFIG_VEML6040)		+= veml6040.o
 obj-$(CONFIG_VEML6070)		+= veml6070.o
diff --git a/drivers/iio/light/veml3235.c b/drivers/iio/light/veml3235.c
new file mode 100644
index 000000000000..18ab73f4377c
--- /dev/null
+++ b/drivers/iio/light/veml3235.c
@@ -0,0 +1,504 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * VEML3235 Ambient Light Sensor
+ *
+ * Copyright (c) 2024, Javier Carrasco <javier.carrasco.cruz@gmail.com>
+ *
+ * Datasheet: https://www.vishay.com/docs/80131/veml3235.pdf
+ * Appnote-80222: https://www.vishay.com/docs/80222/designingveml3235.pdf
+ */
+
+#include <linux/err.h>
+#include <linux/i2c.h>
+#include <linux/iio/iio.h>
+#include <linux/module.h>
+#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
+#include <linux/regulator/consumer.h>
+
+#define VEML3235_REG_CONF       0x00
+#define VEML3235_REG_WH_DATA    0x04
+#define VEML3235_REG_ALS_DATA   0x05
+#define VEML3235_REG_ID         0x09
+
+#define VEML3235_CONF_SD        BIT(0)
+#define VEML3235_CONF_SD0       BIT(15)
+
+struct veml3235_rf {
+	struct regmap_field *it;
+	struct regmap_field *gain;
+	struct regmap_field *id;
+};
+
+struct veml3235_data {
+	struct i2c_client *client;
+	struct device *dev;
+	struct regmap *regmap;
+	struct veml3235_rf rf;
+};
+
+static const int veml3235_it_times[][2] = {
+	{ 0, 50000 },
+	{ 0, 100000 },
+	{ 0, 200000 },
+	{ 0, 400000 },
+	{ 0, 800000 },
+};
+
+static const int veml3235_scale_vals[] = { 1, 2, 4, 8 };
+
+static int veml3235_power_on(struct veml3235_data *data)
+{
+	int ret;
+
+	ret = regmap_clear_bits(data->regmap, VEML3235_REG_CONF,
+				VEML3235_CONF_SD | VEML3235_CONF_SD0);
+	if (ret)
+		return ret;
+
+	/* Wait 4 ms to let processor & oscillator start correctly */
+	fsleep(4000);
+
+	return 0;
+}
+
+static int veml3235_shut_down(struct veml3235_data *data)
+{
+	return regmap_set_bits(data->regmap, VEML3235_REG_CONF,
+			       VEML3235_CONF_SD | VEML3235_CONF_SD0);
+}
+
+static void veml3235_shut_down_action(void *data)
+{
+	veml3235_shut_down(data);
+}
+
+enum veml3235_chan {
+	CH_ALS,
+	CH_WHITE,
+};
+
+static const struct iio_chan_spec veml3235_channels[] = {
+	{
+		.type = IIO_LIGHT,
+		.channel = CH_ALS,
+		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
+		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
+					   BIT(IIO_CHAN_INFO_SCALE),
+		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
+						     BIT(IIO_CHAN_INFO_SCALE),
+	},
+	{
+		.type = IIO_INTENSITY,
+		.channel = CH_WHITE,
+		.modified = 1,
+		.channel2 = IIO_MOD_LIGHT_BOTH,
+		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
+		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_INT_TIME) |
+					   BIT(IIO_CHAN_INFO_SCALE),
+		.info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_INT_TIME) |
+						     BIT(IIO_CHAN_INFO_SCALE),
+	},
+};
+
+static const struct regmap_config veml3235_regmap_config = {
+	.name = "veml3235_regmap",
+	.reg_bits = 8,
+	.val_bits = 16,
+	.max_register = VEML3235_REG_ID,
+	.val_format_endian = REGMAP_ENDIAN_LITTLE,
+};
+
+static int veml3235_get_it(struct veml3235_data *data, int *val, int *val2)
+{
+	int ret, reg;
+
+	ret = regmap_field_read(data->rf.it, &reg);
+	if (ret)
+		return ret;
+
+	switch (reg) {
+	case 0:
+		*val2 = 50000;
+		break;
+	case 1:
+		*val2 = 100000;
+		break;
+	case 2:
+		*val2 = 200000;
+		break;
+	case 3:
+		*val2 = 400000;
+		break;
+	case 4:
+		*val2 = 800000;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	*val = 0;
+
+	return IIO_VAL_INT_PLUS_MICRO;
+}
+
+static int veml3235_set_it(struct iio_dev *indio_dev, int val, int val2)
+{
+	struct veml3235_data *data = iio_priv(indio_dev);
+	int ret, new_it, it_idx;
+
+	if (val)
+		return -EINVAL;
+
+	switch (val2) {
+	case 50000:
+		new_it = 0x00;
+		it_idx = 4;
+		break;
+	case 100000:
+		new_it = 0x01;
+		it_idx = 3;
+		break;
+	case 200000:
+		new_it = 0x02;
+		it_idx = 2;
+		break;
+	case 400000:
+		new_it = 0x03;
+		it_idx = 1;
+		break;
+	case 800000:
+		new_it = 0x04;
+		it_idx = 0;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	ret = regmap_field_write(data->rf.it, new_it);
+	if (ret) {
+		dev_err(data->dev,
+			"failed to update integration time: %d\n", ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+static int veml3235_set_gain(struct iio_dev *indio_dev, int val, int val2)
+{
+	struct veml3235_data *data = iio_priv(indio_dev);
+	int ret, new_gain, gain_idx;
+
+	if (val2 != 0)
+		return -EINVAL;
+
+	switch (val) {
+	case 1:
+		new_gain = 0x00;
+		gain_idx = 3;
+		break;
+	case 2:
+		new_gain = 0x01;
+		gain_idx = 2;
+		break;
+	case 4:
+		new_gain = 0x03;
+		gain_idx = 1;
+		break;
+	case 8:
+		new_gain = 0x07;
+		gain_idx = 0;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	ret = regmap_field_write(data->rf.gain, new_gain);
+	if (ret) {
+		dev_err(data->dev, "failed to set gain: %d\n", ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+static int veml3235_get_gain(struct veml3235_data *data, int *val)
+{
+	int ret, reg;
+
+	ret = regmap_field_read(data->rf.gain, &reg);
+	if (ret) {
+		dev_err(data->dev, "failed to read gain %d\n", ret);
+		return ret;
+	}
+
+	switch (reg & 0x03) {
+	case 0:
+		*val = 1;
+		break;
+	case 1:
+		*val = 2;
+		break;
+	case 3:
+		*val = 4;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	/* Double gain */
+	if (reg & 0x04)
+		*val *= 2;
+
+	return IIO_VAL_INT;
+}
+
+static int veml3235_read_raw(struct iio_dev *indio_dev,
+			     struct iio_chan_spec const *chan, int *val,
+			     int *val2, long mask)
+{
+	struct veml3235_data *data = iio_priv(indio_dev);
+	struct regmap *regmap = data->regmap;
+	int ret, reg;
+
+	switch (mask) {
+	case IIO_CHAN_INFO_RAW:
+		switch (chan->type) {
+		case IIO_LIGHT:
+			ret = regmap_read(regmap, VEML3235_REG_ALS_DATA, &reg);
+			if (ret < 0)
+				return ret;
+
+			*val = reg;
+			return IIO_VAL_INT;
+		case IIO_INTENSITY:
+			ret = regmap_read(regmap, VEML3235_REG_WH_DATA, &reg);
+			if (ret < 0)
+				return ret;
+
+			*val = reg;
+			return IIO_VAL_INT;
+		default:
+			return -EINVAL;
+		}
+	case IIO_CHAN_INFO_INT_TIME:
+		return veml3235_get_it(data, val, val2);
+	case IIO_CHAN_INFO_SCALE:
+		return veml3235_get_gain(data, val);
+	default:
+		return -EINVAL;
+	}
+}
+
+static int veml3235_read_avail(struct iio_dev *indio_dev,
+			       struct iio_chan_spec const *chan,
+			       const int **vals, int *type, int *length,
+			       long mask)
+{
+	switch (mask) {
+	case IIO_CHAN_INFO_INT_TIME:
+		*vals = (int *)&veml3235_it_times;
+		*length = 2 * ARRAY_SIZE(veml3235_it_times);
+		*type = IIO_VAL_INT_PLUS_MICRO;
+		return IIO_AVAIL_LIST;
+	case IIO_CHAN_INFO_SCALE:
+		*vals = (int *)&veml3235_scale_vals;
+		*length = ARRAY_SIZE(veml3235_scale_vals);
+		*type = IIO_VAL_INT;
+		return IIO_AVAIL_LIST;
+	default:
+		return -EINVAL;
+	}
+}
+
+static int veml3235_write_raw(struct iio_dev *indio_dev,
+			      struct iio_chan_spec const *chan,
+			      int val, int val2, long mask)
+{
+	switch (mask) {
+	case IIO_CHAN_INFO_INT_TIME:
+		return veml3235_set_it(indio_dev, val, val2);
+	case IIO_CHAN_INFO_SCALE:
+		return veml3235_set_gain(indio_dev, val, val2);
+	}
+
+	return -EINVAL;
+}
+
+static void veml3235_read_id(struct veml3235_data *data)
+{
+	int ret, reg;
+
+	ret = regmap_field_read(data->rf.id,  &reg);
+	if (ret) {
+		dev_info(data->dev, "failed to read ID\n");
+		return;
+	}
+
+	if (reg != 0x35)
+		dev_info(data->dev, "Unknown ID %d\n", reg);
+}
+
+static const struct reg_field veml3235_rf_it =
+	REG_FIELD(VEML3235_REG_CONF, 4, 6);
+
+static const struct reg_field veml3235_rf_gain =
+	REG_FIELD(VEML3235_REG_CONF, 11, 13);
+
+static const struct reg_field veml3235_rf_id =
+	REG_FIELD(VEML3235_REG_ID, 0, 7);
+
+static int veml3235_regfield_init(struct veml3235_data *data)
+{
+	struct regmap *regmap = data->regmap;
+	struct device *dev = data->dev;
+	struct regmap_field *rm_field;
+	struct veml3235_rf *rf = &data->rf;
+
+	rm_field = devm_regmap_field_alloc(dev, regmap, veml3235_rf_it);
+	if (IS_ERR(rm_field))
+		return PTR_ERR(rm_field);
+	rf->it = rm_field;
+
+	rm_field = devm_regmap_field_alloc(dev, regmap, veml3235_rf_gain);
+	if (IS_ERR(rm_field))
+		return PTR_ERR(rm_field);
+	rf->gain = rm_field;
+
+	rm_field = devm_regmap_field_alloc(dev, regmap, veml3235_rf_id);
+	if (IS_ERR(rm_field))
+		return PTR_ERR(rm_field);
+	rf->id = rm_field;
+
+	return 0;
+}
+
+static int veml3235_hw_init(struct iio_dev *indio_dev)
+{
+	struct veml3235_data *data = iio_priv(indio_dev);
+	struct device *dev = data->dev;
+	int ret;
+
+	/* Set gain to 1 and integration time to 100 ms */
+	ret = regmap_field_write(data->rf.gain, 0x00);
+	if (ret)
+		return dev_err_probe(data->dev, ret, "failed to set gain\n");
+
+	ret = regmap_field_write(data->rf.it, 0x01);
+	if (ret)
+		return dev_err_probe(data->dev, ret,
+				     "failed to set integration time\n");
+
+	ret = veml3235_power_on(data);
+	if (ret)
+		return dev_err_probe(dev, ret, "failed to power on\n");
+
+	return devm_add_action_or_reset(dev, veml3235_shut_down_action, data);
+}
+
+static const struct iio_info veml3235_info = {
+	.read_raw  = veml3235_read_raw,
+	.read_avail  = veml3235_read_avail,
+	.write_raw = veml3235_write_raw,
+};
+
+static int veml3235_probe(struct i2c_client *client)
+{
+	struct device *dev = &client->dev;
+	struct veml3235_data *data;
+	struct iio_dev *indio_dev;
+	struct regmap *regmap;
+	int ret;
+
+	regmap = devm_regmap_init_i2c(client, &veml3235_regmap_config);
+	if (IS_ERR(regmap))
+		return dev_err_probe(dev, PTR_ERR(regmap),
+				     "failed to setup regmap\n");
+
+	indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
+	if (!indio_dev)
+		return -ENOMEM;
+
+	data = iio_priv(indio_dev);
+	i2c_set_clientdata(client, indio_dev);
+	data->client = client;
+	data->dev = dev;
+	data->regmap = regmap;
+
+	ret = veml3235_regfield_init(data);
+	if (ret)
+		return dev_err_probe(dev, ret, "failed to init regfield\n");
+
+	ret = devm_regulator_get_enable(dev, "vdd");
+	if (ret)
+		return dev_err_probe(dev, ret, "failed to enable regulator\n");
+
+	indio_dev->name = "veml3235";
+	indio_dev->channels = veml3235_channels;
+	indio_dev->num_channels = ARRAY_SIZE(veml3235_channels);
+	indio_dev->modes = INDIO_DIRECT_MODE;
+	indio_dev->info = &veml3235_info;
+
+	veml3235_read_id(data);
+
+	ret = veml3235_hw_init(indio_dev);
+	if (ret < 0)
+		return ret;
+
+	return devm_iio_device_register(dev, indio_dev);
+}
+
+static int veml3235_runtime_suspend(struct device *dev)
+{
+	struct veml3235_data *data = iio_priv(dev_get_drvdata(dev));
+	int ret;
+
+	ret = veml3235_shut_down(data);
+	if (ret < 0)
+		dev_err(data->dev, "failed to suspend: %d\n", ret);
+
+	return ret;
+}
+
+static int veml3235_runtime_resume(struct device *dev)
+{
+	struct veml3235_data *data = iio_priv(dev_get_drvdata(dev));
+	int ret;
+
+	ret = veml3235_power_on(data);
+	if (ret < 0)
+		dev_err(data->dev, "failed to resume: %d\n", ret);
+
+	return ret;
+}
+
+static DEFINE_RUNTIME_DEV_PM_OPS(veml3235_pm_ops, veml3235_runtime_suspend,
+				 veml3235_runtime_resume, NULL);
+
+static const struct of_device_id veml3235_of_match[] = {
+	{ .compatible = "vishay,veml3235" },
+	{ }
+};
+MODULE_DEVICE_TABLE(of, veml3235_of_match);
+
+static const struct i2c_device_id veml3235_id[] = {
+	{ "veml3235" },
+	{ }
+};
+MODULE_DEVICE_TABLE(i2c, veml3235_id);
+
+static struct i2c_driver veml3235_driver = {
+	.driver = {
+		.name = "veml3235",
+		.of_match_table = veml3235_of_match,
+		.pm = pm_ptr(&veml3235_pm_ops),
+	},
+	.probe = veml3235_probe,
+	.id_table = veml3235_id,
+};
+module_i2c_driver(veml3235_driver);
+
+MODULE_AUTHOR("Javier Carrasco <javier.carrasco.cruz@gmail.com>");
+MODULE_DESCRIPTION("VEML3235 Ambient Light Sensor");
+MODULE_LICENSE("GPL");

-- 
2.43.0


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v3 2/2] iio: light: add support for veml3235
  2024-10-23 18:59 ` [PATCH v3 2/2] iio: light: add support for veml3235 Javier Carrasco
@ 2024-10-25  9:01   ` kernel test robot
  2024-10-25  9:07     ` Javier Carrasco
  0 siblings, 1 reply; 7+ messages in thread
From: kernel test robot @ 2024-10-25  9:01 UTC (permalink / raw)
  To: Javier Carrasco, Jonathan Cameron, Lars-Peter Clausen,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley, Rishi Gupta
  Cc: oe-kbuild-all, linux-iio, devicetree, linux-kernel,
	Javier Carrasco

Hi Javier,

kernel test robot noticed the following build warnings:

[auto build test WARNING on ceab669fdf7b7510b4e4997b33d6f66e433a96db]

url:    https://github.com/intel-lab-lkp/linux/commits/Javier-Carrasco/dt-bindings-iio-light-veml6030-add-veml3235/20241024-030144
base:   ceab669fdf7b7510b4e4997b33d6f66e433a96db
patch link:    https://lore.kernel.org/r/20241023-veml3235-v3-2-8490f2622f9a%40gmail.com
patch subject: [PATCH v3 2/2] iio: light: add support for veml3235
config: loongarch-allmodconfig (https://download.01.org/0day-ci/archive/20241025/202410251610.kB7u6xMJ-lkp@intel.com/config)
compiler: loongarch64-linux-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241025/202410251610.kB7u6xMJ-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202410251610.kB7u6xMJ-lkp@intel.com/

All warnings (new ones prefixed by >>):

   drivers/iio/light/veml3235.c: In function 'veml3235_set_it':
>> drivers/iio/light/veml3235.c:148:26: warning: variable 'it_idx' set but not used [-Wunused-but-set-variable]
     148 |         int ret, new_it, it_idx;
         |                          ^~~~~~
   drivers/iio/light/veml3235.c: In function 'veml3235_set_gain':
>> drivers/iio/light/veml3235.c:191:28: warning: variable 'gain_idx' set but not used [-Wunused-but-set-variable]
     191 |         int ret, new_gain, gain_idx;
         |                            ^~~~~~~~


vim +/it_idx +148 drivers/iio/light/veml3235.c

   144	
   145	static int veml3235_set_it(struct iio_dev *indio_dev, int val, int val2)
   146	{
   147		struct veml3235_data *data = iio_priv(indio_dev);
 > 148		int ret, new_it, it_idx;
   149	
   150		if (val)
   151			return -EINVAL;
   152	
   153		switch (val2) {
   154		case 50000:
   155			new_it = 0x00;
   156			it_idx = 4;
   157			break;
   158		case 100000:
   159			new_it = 0x01;
   160			it_idx = 3;
   161			break;
   162		case 200000:
   163			new_it = 0x02;
   164			it_idx = 2;
   165			break;
   166		case 400000:
   167			new_it = 0x03;
   168			it_idx = 1;
   169			break;
   170		case 800000:
   171			new_it = 0x04;
   172			it_idx = 0;
   173			break;
   174		default:
   175			return -EINVAL;
   176		}
   177	
   178		ret = regmap_field_write(data->rf.it, new_it);
   179		if (ret) {
   180			dev_err(data->dev,
   181				"failed to update integration time: %d\n", ret);
   182			return ret;
   183		}
   184	
   185		return 0;
   186	}
   187	
   188	static int veml3235_set_gain(struct iio_dev *indio_dev, int val, int val2)
   189	{
   190		struct veml3235_data *data = iio_priv(indio_dev);
 > 191		int ret, new_gain, gain_idx;
   192	
   193		if (val2 != 0)
   194			return -EINVAL;
   195	
   196		switch (val) {
   197		case 1:
   198			new_gain = 0x00;
   199			gain_idx = 3;
   200			break;
   201		case 2:
   202			new_gain = 0x01;
   203			gain_idx = 2;
   204			break;
   205		case 4:
   206			new_gain = 0x03;
   207			gain_idx = 1;
   208			break;
   209		case 8:
   210			new_gain = 0x07;
   211			gain_idx = 0;
   212			break;
   213		default:
   214			return -EINVAL;
   215		}
   216	
   217		ret = regmap_field_write(data->rf.gain, new_gain);
   218		if (ret) {
   219			dev_err(data->dev, "failed to set gain: %d\n", ret);
   220			return ret;
   221		}
   222	
   223		return 0;
   224	}
   225	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v3 2/2] iio: light: add support for veml3235
  2024-10-25  9:01   ` kernel test robot
@ 2024-10-25  9:07     ` Javier Carrasco
  2024-10-26 18:10       ` Jonathan Cameron
  0 siblings, 1 reply; 7+ messages in thread
From: Javier Carrasco @ 2024-10-25  9:07 UTC (permalink / raw)
  To: kernel test robot, Jonathan Cameron, Lars-Peter Clausen,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley, Rishi Gupta
  Cc: oe-kbuild-all, linux-iio, devicetree, linux-kernel

On 25/10/2024 11:01, kernel test robot wrote:
> Hi Javier,
> 
> kernel test robot noticed the following build warnings:
> 
> [auto build test WARNING on ceab669fdf7b7510b4e4997b33d6f66e433a96db]
> 
> url:    https://github.com/intel-lab-lkp/linux/commits/Javier-Carrasco/dt-bindings-iio-light-veml6030-add-veml3235/20241024-030144
> base:   ceab669fdf7b7510b4e4997b33d6f66e433a96db
> patch link:    https://lore.kernel.org/r/20241023-veml3235-v3-2-8490f2622f9a%40gmail.com
> patch subject: [PATCH v3 2/2] iio: light: add support for veml3235
> config: loongarch-allmodconfig (https://download.01.org/0day-ci/archive/20241025/202410251610.kB7u6xMJ-lkp@intel.com/config)
> compiler: loongarch64-linux-gcc (GCC) 14.1.0
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241025/202410251610.kB7u6xMJ-lkp@intel.com/reproduce)
> 
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202410251610.kB7u6xMJ-lkp@intel.com/
> 
> All warnings (new ones prefixed by >>):
> 
>    drivers/iio/light/veml3235.c: In function 'veml3235_set_it':
>>> drivers/iio/light/veml3235.c:148:26: warning: variable 'it_idx' set but not used [-Wunused-but-set-variable]
>      148 |         int ret, new_it, it_idx;
>          |                          ^~~~~~
>    drivers/iio/light/veml3235.c: In function 'veml3235_set_gain':
>>> drivers/iio/light/veml3235.c:191:28: warning: variable 'gain_idx' set but not used [-Wunused-but-set-variable]
>      191 |         int ret, new_gain, gain_idx;
>          |                            ^~~~~~~~
> 
> 
> vim +/it_idx +148 drivers/iio/light/veml3235.c
> 
>    144	
>    145	static int veml3235_set_it(struct iio_dev *indio_dev, int val, int val2)
>    146	{
>    147		struct veml3235_data *data = iio_priv(indio_dev);
>  > 148		int ret, new_it, it_idx;
>    149	
>    150		if (val)
>    151			return -EINVAL;
>    152	
>    153		switch (val2) {
>    154		case 50000:
>    155			new_it = 0x00;
>    156			it_idx = 4;
>    157			break;
>    158		case 100000:
>    159			new_it = 0x01;
>    160			it_idx = 3;
>    161			break;
>    162		case 200000:
>    163			new_it = 0x02;
>    164			it_idx = 2;
>    165			break;
>    166		case 400000:
>    167			new_it = 0x03;
>    168			it_idx = 1;
>    169			break;
>    170		case 800000:
>    171			new_it = 0x04;
>    172			it_idx = 0;
>    173			break;
>    174		default:
>    175			return -EINVAL;
>    176		}
>    177	
>    178		ret = regmap_field_write(data->rf.it, new_it);
>    179		if (ret) {
>    180			dev_err(data->dev,
>    181				"failed to update integration time: %d\n", ret);
>    182			return ret;
>    183		}
>    184	
>    185		return 0;
>    186	}
>    187	
>    188	static int veml3235_set_gain(struct iio_dev *indio_dev, int val, int val2)
>    189	{
>    190		struct veml3235_data *data = iio_priv(indio_dev);
>  > 191		int ret, new_gain, gain_idx;
>    192	
>    193		if (val2 != 0)
>    194			return -EINVAL;
>    195	
>    196		switch (val) {
>    197		case 1:
>    198			new_gain = 0x00;
>    199			gain_idx = 3;
>    200			break;
>    201		case 2:
>    202			new_gain = 0x01;
>    203			gain_idx = 2;
>    204			break;
>    205		case 4:
>    206			new_gain = 0x03;
>    207			gain_idx = 1;
>    208			break;
>    209		case 8:
>    210			new_gain = 0x07;
>    211			gain_idx = 0;
>    212			break;
>    213		default:
>    214			return -EINVAL;
>    215		}
>    216	
>    217		ret = regmap_field_write(data->rf.gain, new_gain);
>    218		if (ret) {
>    219			dev_err(data->dev, "failed to set gain: %d\n", ret);
>    220			return ret;
>    221		}
>    222	
>    223		return 0;
>    224	}
>    225	
> 


Unused as there is no processed values anymore. I will drop them for v4.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v3 2/2] iio: light: add support for veml3235
  2024-10-25  9:07     ` Javier Carrasco
@ 2024-10-26 18:10       ` Jonathan Cameron
  2024-10-27 12:23         ` Javier Carrasco
  0 siblings, 1 reply; 7+ messages in thread
From: Jonathan Cameron @ 2024-10-26 18:10 UTC (permalink / raw)
  To: Javier Carrasco
  Cc: kernel test robot, Lars-Peter Clausen, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Rishi Gupta, oe-kbuild-all,
	linux-iio, devicetree, linux-kernel

Hi Javier,

> >    222	
> >    223		return 0;
> >    224	}
> >    225	
> >   
> 
> 
> Unused as there is no processed values anymore. I will drop them for v4.
Given I didn't have any other comments I just fixed these up whilst applying.

Series applied to the togreg branch of iio.git and initially pushed out as
testing for 0-day to take a first look at it.
Thanks,

Jonathan

p.s. Diff was as follows, shout if I mess it up.

diff --git a/drivers/iio/light/veml3235.c b/drivers/iio/light/veml3235.c
index 18ab73f4377c..66361c3012a3 100644
--- a/drivers/iio/light/veml3235.c
+++ b/drivers/iio/light/veml3235.c
@@ -145,7 +145,7 @@ static int veml3235_get_it(struct veml3235_data *data, int *val, int *val2)
 static int veml3235_set_it(struct iio_dev *indio_dev, int val, int val2)
 {
        struct veml3235_data *data = iio_priv(indio_dev);
-       int ret, new_it, it_idx;
+       int ret, new_it;
 
        if (val)
                return -EINVAL;
@@ -153,23 +153,18 @@ static int veml3235_set_it(struct iio_dev *indio_dev, int val, int val2)
        switch (val2) {
        case 50000:
                new_it = 0x00;
-               it_idx = 4;
                break;
        case 100000:
                new_it = 0x01;
-               it_idx = 3;
                break;
        case 200000:
                new_it = 0x02;
-               it_idx = 2;
                break;
        case 400000:
                new_it = 0x03;
-               it_idx = 1;
                break;
        case 800000:
                new_it = 0x04;
-               it_idx = 0;
                break;
        default:
                return -EINVAL;
@@ -188,7 +183,7 @@ static int veml3235_set_it(struct iio_dev *indio_dev, int val, int val2)
 static int veml3235_set_gain(struct iio_dev *indio_dev, int val, int val2)
 {
        struct veml3235_data *data = iio_priv(indio_dev);
-       int ret, new_gain, gain_idx;
+       int ret, new_gain;
 
        if (val2 != 0)
                return -EINVAL;
@@ -196,19 +191,15 @@ static int veml3235_set_gain(struct iio_dev *indio_dev, int val, int val2)
        switch (val) {
        case 1:
                new_gain = 0x00;
-               gain_idx = 3;
                break;
        case 2:
                new_gain = 0x01;
-               gain_idx = 2;
                break;
        case 4:
                new_gain = 0x03;
-               gain_idx = 1;
                break;
        case 8:
                new_gain = 0x07;
-               gain_idx = 0;
                break;
        default:
                return -EINVAL;


> 


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v3 2/2] iio: light: add support for veml3235
  2024-10-26 18:10       ` Jonathan Cameron
@ 2024-10-27 12:23         ` Javier Carrasco
  0 siblings, 0 replies; 7+ messages in thread
From: Javier Carrasco @ 2024-10-27 12:23 UTC (permalink / raw)
  To: Jonathan Cameron
  Cc: kernel test robot, Lars-Peter Clausen, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, Rishi Gupta, oe-kbuild-all,
	linux-iio, devicetree, linux-kernel

On 26/10/2024 20:10, Jonathan Cameron wrote:
> Hi Javier,
> 
>>>    222	
>>>    223		return 0;
>>>    224	}
>>>    225	
>>>   
>>
>>
>> Unused as there is no processed values anymore. I will drop them for v4.
> Given I didn't have any other comments I just fixed these up whilst applying.
> 
> Series applied to the togreg branch of iio.git and initially pushed out as
> testing for 0-day to take a first look at it.
> Thanks,
> 
> Jonathan
> 
> p.s. Diff was as follows, shout if I mess it up.
> 
> diff --git a/drivers/iio/light/veml3235.c b/drivers/iio/light/veml3235.c
> index 18ab73f4377c..66361c3012a3 100644
> --- a/drivers/iio/light/veml3235.c
> +++ b/drivers/iio/light/veml3235.c
> @@ -145,7 +145,7 @@ static int veml3235_get_it(struct veml3235_data *data, int *val, int *val2)
>  static int veml3235_set_it(struct iio_dev *indio_dev, int val, int val2)
>  {
>         struct veml3235_data *data = iio_priv(indio_dev);
> -       int ret, new_it, it_idx;
> +       int ret, new_it;
>  
>         if (val)
>                 return -EINVAL;
> @@ -153,23 +153,18 @@ static int veml3235_set_it(struct iio_dev *indio_dev, int val, int val2)
>         switch (val2) {
>         case 50000:
>                 new_it = 0x00;
> -               it_idx = 4;
>                 break;
>         case 100000:
>                 new_it = 0x01;
> -               it_idx = 3;
>                 break;
>         case 200000:
>                 new_it = 0x02;
> -               it_idx = 2;
>                 break;
>         case 400000:
>                 new_it = 0x03;
> -               it_idx = 1;
>                 break;
>         case 800000:
>                 new_it = 0x04;
> -               it_idx = 0;
>                 break;
>         default:
>                 return -EINVAL;
> @@ -188,7 +183,7 @@ static int veml3235_set_it(struct iio_dev *indio_dev, int val, int val2)
>  static int veml3235_set_gain(struct iio_dev *indio_dev, int val, int val2)
>  {
>         struct veml3235_data *data = iio_priv(indio_dev);
> -       int ret, new_gain, gain_idx;
> +       int ret, new_gain;
>  
>         if (val2 != 0)
>                 return -EINVAL;
> @@ -196,19 +191,15 @@ static int veml3235_set_gain(struct iio_dev *indio_dev, int val, int val2)
>         switch (val) {
>         case 1:
>                 new_gain = 0x00;
> -               gain_idx = 3;
>                 break;
>         case 2:
>                 new_gain = 0x01;
> -               gain_idx = 2;
>                 break;
>         case 4:
>                 new_gain = 0x03;
> -               gain_idx = 1;
>                 break;
>         case 8:
>                 new_gain = 0x07;
> -               gain_idx = 0;
>                 break;
>         default:
>                 return -EINVAL;
> 
> 
>>
> 


Hi Jonathan, that is exactly the diff I wanted to add for v4. Thanks for
fixing it.

Best regards,
Javier Carrasco

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2024-10-27 12:24 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-23 18:59 [PATCH v3 0/2] iio: light: add support for veml3235 Javier Carrasco
2024-10-23 18:59 ` [PATCH v3 1/2] dt-bindings: iio: light: veml6030: add veml3235 Javier Carrasco
2024-10-23 18:59 ` [PATCH v3 2/2] iio: light: add support for veml3235 Javier Carrasco
2024-10-25  9:01   ` kernel test robot
2024-10-25  9:07     ` Javier Carrasco
2024-10-26 18:10       ` Jonathan Cameron
2024-10-27 12:23         ` Javier Carrasco

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).