drivers: sensor: remove redundancies in veml6031 and veml6046

- create common header file veml60xx-common.h for sensors VEML6031 and
  VEML6046.

Signed-off-by: Andreas Klinger <ak@it-klinger.de>
diff --git a/drivers/sensor/vishay/veml6031/veml6031.c b/drivers/sensor/vishay/veml6031/veml6031.c
index b36b0a4..b2511b2 100644
--- a/drivers/sensor/vishay/veml6031/veml6031.c
+++ b/drivers/sensor/vishay/veml6031/veml6031.c
@@ -58,33 +58,6 @@
 #define VEML6031_CMDCODE_ALS_INT    0x17
 
 /*
- * ALS integration time struct.
- */
-struct veml6031_it_data {
-	enum veml6031_it num;
-	uint8_t val;
-	int us;
-};
-
-/*
- * ALS integration time setting values.
- *
- * The enumerators of <tt>enum veml6031_it</tt> provide
- * indices into this array to get the related value for the
- * ALS_IT configuration bits.
- */
-static const struct veml6031_it_data veml6031_it_values[] = {
-	{VEML6031_IT_3_125, 0x00, 3125}, /*   3.125 - 0b0000 */
-	{VEML6031_IT_6_25, 0x01, 6250},  /*   6.25  - 0b0001 */
-	{VEML6031_IT_12_5, 0x02, 12500}, /*  12.5   - 0b0010 */
-	{VEML6031_IT_25, 0x03, 25000},   /*  25     - 0b0011 */
-	{VEML6031_IT_50, 0x04, 50000},   /*  50     - 0b0100 */
-	{VEML6031_IT_100, 0x05, 100000}, /* 100     - 0b0101 */
-	{VEML6031_IT_200, 0x06, 200000}, /* 200     - 0b0110 */
-	{VEML6031_IT_400, 0x07, 400000}, /* 400     - 0b0111 */
-};
-
-/*
  * Resolution matrix for values to convert between data provided
  * by the sensor ("counts") and lux.
  *
@@ -93,7 +66,7 @@
  * and <tt>enum veml6031_als_it</tt> are used for indices into this matrix.
  */
 static const float
-	veml6031_resolution[VEML6031_DIV4_COUNT][VEML6031_GAIN_COUNT][VEML6031_IT_COUNT] = {
+	veml6031_resolution[VEML6031_DIV4_COUNT][VEML60XX_GAIN_COUNT][VEML60XX_IT_COUNT] = {
 		/*3.125ms   6.25ms   12.5ms     25ms     50ms    100ms    200ms     400ms IT */
 		/* size 4/4 */
 		{
@@ -131,9 +104,9 @@
 	uint8_t ir_sd;           /* ALS and IR channel shutdown */
 	uint8_t cal;             /* Power on ready */
 	enum veml6031_div4 div4; /* effective photodiode size */
-	enum veml6031_gain gain; /* gain selection */
-	enum veml6031_it itim;   /* ALS integration time */
-	enum veml6031_pers pers; /* ALS persistens protect */
+	enum veml60xx_gain gain; /* gain selection */
+	enum veml60xx_it itim;   /* ALS integration time */
+	enum veml60xx_pers pers; /* ALS persistence protect */
 	uint16_t thresh_high;
 	uint16_t thresh_low;
 	uint16_t als_data;
@@ -142,30 +115,15 @@
 	uint32_t int_flags;
 };
 
-static bool veml6031_gain_in_range(int32_t gain)
-{
-	return (gain >= VEML6031_GAIN_1) && (gain <= VEML6031_GAIN_0_5);
-}
-
-static bool veml6031_itim_in_range(int32_t itim)
-{
-	return (itim >= VEML6031_IT_3_125) && (itim <= VEML6031_IT_400);
-}
-
 static bool veml6031_div4_in_range(int32_t div4)
 {
 	return (div4 >= VEML6031_SIZE_4_4) && (div4 <= VEML6031_SIZE_1_4);
 }
 
-static bool veml6031_pers_in_range(int32_t pers)
-{
-	return (pers >= VEML6031_PERS_1) && (pers <= VEML6031_PERS_8);
-}
-
 static void veml6031_sleep_by_integration_time(const struct veml6031_data *data)
 {
-	if (veml6031_itim_in_range(data->itim)) {
-		k_sleep(K_USEC(veml6031_it_values[data->itim].us));
+	if (veml60xx_it_in_range(data->itim)) {
+		k_sleep(K_USEC(veml60xx_it_values[data->itim].us));
 	} else {
 		LOG_WRN_ONCE("Wrong settings: itim:%d. Most likely an application bug!",
 			     data->itim);
@@ -174,28 +132,8 @@
 
 static int veml6031_check_settings(const struct veml6031_data *data)
 {
-	return veml6031_div4_in_range(data->div4) && veml6031_gain_in_range(data->gain) &&
-	       veml6031_itim_in_range(data->itim);
-}
-
-static int veml6031_check_gain(const struct sensor_value *val)
-{
-	return veml6031_gain_in_range(val->val1);
-}
-
-static int veml6031_check_it(const struct sensor_value *val)
-{
-	return veml6031_itim_in_range(val->val1);
-}
-
-static int veml6031_check_div4(const struct sensor_value *val)
-{
-	return veml6031_div4_in_range(val->val1);
-}
-
-static int veml6031_check_pers(const struct sensor_value *val)
-{
-	return veml6031_pers_in_range(val->val1);
+	return veml6031_div4_in_range(data->div4) && veml60xx_gain_in_range(data->gain) &&
+	       veml60xx_it_in_range(data->itim);
 }
 
 static int veml6031_read(const struct device *dev, uint8_t cmd, uint8_t *data)
@@ -368,29 +306,29 @@
 	/* SENSOR_ATTR_.*_THRESH are not in enum sensor_attribute_veml6031 */
 	switch ((int)attr) {
 	case SENSOR_ATTR_VEML6031_IT:
-		if (veml6031_check_it(val)) {
-			data->itim = (enum veml6031_it)val->val1;
+		if (veml60xx_it_in_range(val->val1)) {
+			data->itim = (enum veml60xx_it)val->val1;
 		} else {
 			return -EINVAL;
 		}
 		break;
 	case SENSOR_ATTR_VEML6031_DIV4:
-		if (veml6031_check_div4(val)) {
+		if (veml6031_div4_in_range(val->val1)) {
 			data->div4 = (enum veml6031_div4)val->val1;
 		} else {
 			return -EINVAL;
 		}
 		break;
 	case SENSOR_ATTR_VEML6031_GAIN:
-		if (veml6031_check_gain(val)) {
-			data->gain = (enum veml6031_gain)val->val1;
+		if (veml60xx_gain_in_range(val->val1)) {
+			data->gain = (enum veml60xx_gain)val->val1;
 		} else {
 			return -EINVAL;
 		}
 		break;
 	case SENSOR_ATTR_VEML6031_PERS:
-		if (veml6031_check_pers(val)) {
-			data->pers = (enum veml6031_pers)val->val1;
+		if (veml60xx_pers_in_range(val->val1)) {
+			data->pers = (enum veml60xx_pers)val->val1;
 		} else {
 			return -EINVAL;
 		}
@@ -651,9 +589,9 @@
 	static struct veml6031_data veml6031_data_##n = {.trig = 1,                                \
 							 .af = 1,                                  \
 							 .div4 = VEML6031_SIZE_4_4,                \
-							 .gain = VEML6031_GAIN_1,                  \
-							 .itim = VEML6031_IT_100,                  \
-							 .pers = VEML6031_PERS_1,                  \
+							 .gain = VEML60XX_GAIN_1,                  \
+							 .itim = VEML60XX_IT_100,                  \
+							 .pers = VEML60XX_PERS_1,                  \
 							 .thresh_high = 0xFFFF};                   \
                                                                                                    \
 	static const struct veml6031_config veml6031_config_##n = {                                \
diff --git a/drivers/sensor/vishay/veml6046/veml6046.c b/drivers/sensor/vishay/veml6046/veml6046.c
index 9f0b54e..89faea0 100644
--- a/drivers/sensor/vishay/veml6046/veml6046.c
+++ b/drivers/sensor/vishay/veml6046/veml6046.c
@@ -62,41 +62,15 @@
 #define VEML6046_CMDCODE_INT_H      0x1B
 
 /*
- * ALS integration time struct.
- */
-struct veml6046_it_data {
-	enum veml6046_it num;
-	uint8_t val;
-	int us;
-};
-
-/*
- * ALS integration time setting values.
- *
- * The enumerators of enum veml6046_it provide indices into this array to get
- * the related value for the ALS_IT configuration bits.
- */
-static const struct veml6046_it_data veml6046_it_values[VEML6046_IT_COUNT] = {
-	{VEML6046_IT_3_125, 0x00, 3125}, /*   3.125 - 0b0000 */
-	{VEML6046_IT_6_25, 0x01, 6250},  /*   6.25  - 0b0001 */
-	{VEML6046_IT_12_5, 0x02, 12500}, /*  12.5   - 0b0010 */
-	{VEML6046_IT_25, 0x03, 25000},   /*  25     - 0b0011 */
-	{VEML6046_IT_50, 0x04, 50000},   /*  50     - 0b0100 */
-	{VEML6046_IT_100, 0x05, 100000}, /* 100     - 0b0101 */
-	{VEML6046_IT_200, 0x06, 200000}, /* 200     - 0b0110 */
-	{VEML6046_IT_400, 0x07, 400000}, /* 400     - 0b0111 */
-};
-
-/*
  * Resolution matrix for values to convert between data provided
  * by the sensor ("counts") and lux.
  *
  * These values depend on the current size, gain and integration time settings.
- * The enumerators of enum veml6046_pdd, enum veml6046_gain and enum
+ * The enumerators of enum veml6046_pdd, enum veml60xx_gain and enum
  * veml6046_als_it are used for indices into this matrix.
  */
 static const float
-	veml6046_resolution[VEML6046_PDD_COUNT][VEML6046_GAIN_COUNT][VEML6046_IT_COUNT] = {
+	veml6046_resolution[VEML6046_PDD_COUNT][VEML60XX_GAIN_COUNT][VEML60XX_IT_COUNT] = {
 		/*3.125ms   6.25ms   12.5ms     25ms     50ms    100ms    200ms     400ms IT */
 		/* size 2/2 */
 		{
@@ -131,9 +105,9 @@
 	uint8_t int_en;          /* ALS interrupt enable */
 	uint8_t trig;            /* ALS active force trigger */
 	enum veml6046_pdd pdd;   /* effective photodiode size divider */
-	enum veml6046_gain gain; /* gain selection */
-	enum veml6046_it itim;   /* ALS integration time */
-	enum veml6046_pers pers; /* ALS persistens protect */
+	enum veml60xx_gain gain; /* gain selection */
+	enum veml60xx_it itim;   /* ALS integration time */
+	enum veml60xx_pers pers; /* ALS persistens protect */
 	uint16_t thresh_high;
 	uint16_t thresh_low;
 	uint16_t red_data;
@@ -146,24 +120,9 @@
 	uint32_t ir_lux;
 };
 
-static int veml6046_check_gain(const struct sensor_value *val)
+static bool veml6046_pdd_in_range(int32_t pdd)
 {
-	return val->val1 >= VEML6046_GAIN_1 && val->val1 <= VEML6046_GAIN_0_5;
-}
-
-static int veml6046_check_it(const struct sensor_value *val)
-{
-	return val->val1 >= VEML6046_IT_3_125 && val->val1 <= VEML6046_IT_400;
-}
-
-static int veml6046_check_pdd(const struct sensor_value *val)
-{
-	return val->val1 >= VEML6046_SIZE_2_2 && val->val1 <= VEML6046_SIZE_1_2;
-}
-
-static int veml6046_check_pers(const struct sensor_value *val)
-{
-	return val->val1 >= VEML6046_PERS_1 && val->val1 <= VEML6046_PERS_8;
+	return pdd >= VEML6046_SIZE_2_2 && pdd <= VEML6046_SIZE_1_2;
 }
 
 static int veml6046_read16(const struct device *dev, uint8_t cmd, uint16_t *data)
@@ -333,29 +292,29 @@
 	/* SENSOR_ATTR_.*_THRESH are not in enum sensor_attribute_veml6046 */
 	switch ((int)attr) {
 	case SENSOR_ATTR_VEML6046_IT:
-		if (veml6046_check_it(val)) {
-			data->itim = (enum veml6046_it)val->val1;
+		if (veml60xx_it_in_range(val->val1)) {
+			data->itim = (enum veml60xx_it)val->val1;
 		} else {
 			return -EINVAL;
 		}
 		break;
 	case SENSOR_ATTR_VEML6046_PDD:
-		if (veml6046_check_pdd(val)) {
+		if (veml6046_pdd_in_range(val->val1)) {
 			data->pdd = (enum veml6046_pdd)val->val1;
 		} else {
 			return -EINVAL;
 		}
 		break;
 	case SENSOR_ATTR_VEML6046_GAIN:
-		if (veml6046_check_gain(val)) {
-			data->gain = (enum veml6046_gain)val->val1;
+		if (veml60xx_gain_in_range(val->val1)) {
+			data->gain = (enum veml60xx_gain)val->val1;
 		} else {
 			return -EINVAL;
 		}
 		break;
 	case SENSOR_ATTR_VEML6046_PERS:
-		if (veml6046_check_pers(val)) {
-			data->pers = (enum veml6046_pers)val->val1;
+		if (veml60xx_pers_in_range(val->val1)) {
+			data->pers = (enum veml60xx_pers)val->val1;
 		} else {
 			return -EINVAL;
 		}
@@ -436,7 +395,7 @@
 		return ret;
 	}
 
-	k_sleep(K_USEC(veml6046_it_values[data->itim].us));
+	k_sleep(K_USEC(veml60xx_it_values[data->itim].us));
 
 	while (1) {
 		ret = veml6046_read16(dev, VEML6046_CMDCODE_INT_L, &val);
@@ -452,7 +411,7 @@
 			return -EAGAIN;
 		}
 
-		k_sleep(K_USEC(veml6046_it_values[data->itim].us / 10));
+		k_sleep(K_USEC(veml60xx_it_values[data->itim].us / 10));
 
 		cnt++;
 	}
@@ -552,7 +511,6 @@
 	default:
 		return -ENOTSUP;
 	}
-
 	return 0;
 }
 
@@ -615,9 +573,9 @@
 #define VEML6046_INIT(n)                                                                           \
 	static struct veml6046_data veml6046_data_##n = {.trig = 0,                                \
 							 .pdd = VEML6046_SIZE_2_2,                 \
-							 .gain = VEML6046_GAIN_1,                  \
-							 .itim = VEML6046_IT_100,                  \
-							 .pers = VEML6046_PERS_1,                  \
+							 .gain = VEML60XX_GAIN_1,                  \
+							 .itim = VEML60XX_IT_100,                  \
+							 .pers = VEML60XX_PERS_1,                  \
 							 .thresh_high = 0xFFFF};                   \
                                                                                                    \
 	static const struct veml6046_config veml6046_config_##n = {                                \
diff --git a/include/zephyr/drivers/sensor/veml6031.h b/include/zephyr/drivers/sensor/veml6031.h
index 8d9ee68..65808d5 100644
--- a/include/zephyr/drivers/sensor/veml6031.h
+++ b/include/zephyr/drivers/sensor/veml6031.h
@@ -4,6 +4,8 @@
  * SPDX-License-Identifier: Apache-2.0
  */
 
+#include <zephyr/drivers/sensor/veml60xx-common.h>
+
 /**
  * @file
  * @brief Header file for extended sensor API of VEML6031 sensor
@@ -25,25 +27,6 @@
 #endif
 
 /**
- * @brief VEML6031 integration time options for ambient light measurements.
- *
- * Possible values for @ref SENSOR_ATTR_VEML6031_IT custom attribute.
- */
-enum veml6031_it {
-	VEML6031_IT_3_125, /**< 3.125 ms */
-	VEML6031_IT_6_25,  /**< 6.25 ms */
-	VEML6031_IT_12_5,  /**< 12.5 ms */
-	VEML6031_IT_25,    /**< 25 ms */
-	VEML6031_IT_50,    /**< 50 ms */
-	VEML6031_IT_100,   /**< 100 ms */
-	VEML6031_IT_200,   /**< 200 ms */
-	VEML6031_IT_400,   /**< 400 ms */
-	/** @cond INTERNAL_HIDDEN */
-	VEML6031_IT_COUNT,
-	/** @endcond */
-};
-
-/**
  * @brief VEML6031 size options for ambient light measurements.
  *
  * Possible values for @ref SENSOR_ATTR_VEML6031_DIV4 custom attribute.
@@ -57,31 +40,6 @@
 };
 
 /**
- * @brief VEML6031 gain options for ambient light measurements.
- */
-enum veml6031_gain {
-	VEML6031_GAIN_1 = 0x00,    /**< 1x gain */
-	VEML6031_GAIN_2 = 0x01,    /**< 2x gain */
-	VEML6031_GAIN_0_66 = 0x02, /**< 0.66x gain */
-	VEML6031_GAIN_0_5 = 0x03,  /**< 0.5x gain */
-	/** @cond INTERNAL_HIDDEN */
-	VEML6031_GAIN_COUNT = 4,
-	/** @endcond */
-};
-
-/**
- * @brief VEML6031 ALS interrupt persistence protect number options.
- *
- * Possible values for @ref SENSOR_ATTR_VEML6031_PERS custom attribute.
- */
-enum veml6031_pers {
-	VEML6031_PERS_1 = 0x00, /**< 1 measurement */
-	VEML6031_PERS_2 = 0x01, /**< 2 measurements */
-	VEML6031_PERS_4 = 0x02, /**< 4 measurements */
-	VEML6031_PERS_8 = 0x03, /**< 8 measurements */
-};
-
-/**
  * @brief Custom sensor attributes for VEML6031 sensor.
  *
  * For high and low threshold window settings (ALS_WH_L, ALS_WH_H, ALS_WL_L and
diff --git a/include/zephyr/drivers/sensor/veml6046.h b/include/zephyr/drivers/sensor/veml6046.h
index c5641dc..f8c8d39 100644
--- a/include/zephyr/drivers/sensor/veml6046.h
+++ b/include/zephyr/drivers/sensor/veml6046.h
@@ -4,9 +4,11 @@
  * SPDX-License-Identifier: Apache-2.0
  */
 
+#include <zephyr/drivers/sensor/veml60xx-common.h>
+
 /**
  * @file
- * @brief Header file for extended sensor API of VEML6046 sensor
+ * @brief Header file for extended sensor API of VEML6046 sensor.
  * @ingroup veml6046_interface
  */
 
@@ -25,25 +27,6 @@
 #endif
 
 /**
- * @brief VEML6046 integration time options for light measurements.
- *
- * Possible values for @ref SENSOR_ATTR_VEML6046_IT custom attribute.
- */
-enum veml6046_it {
-	VEML6046_IT_3_125, /**< 3.125 ms */
-	VEML6046_IT_6_25,  /**< 6.25 ms */
-	VEML6046_IT_12_5,  /**< 12.5 ms */
-	VEML6046_IT_25,    /**< 25 ms */
-	VEML6046_IT_50,    /**< 50 ms */
-	VEML6046_IT_100,   /**< 100 ms */
-	VEML6046_IT_200,   /**< 200 ms */
-	VEML6046_IT_400,   /**< 400 ms */
-	/** @cond INTERNAL_HIDDEN */
-	VEML6046_IT_COUNT,
-	/** @endcond */
-};
-
-/**
  * @brief VEML6046 size options for light measurements.
  *
  * Possible values for @ref SENSOR_ATTR_VEML6046_PDD custom attribute.
@@ -57,33 +40,6 @@
 };
 
 /**
- * @brief VEML6046 gain options for light measurements.
- *
- * Possible values for @ref SENSOR_ATTR_VEML6046_GAIN custom attribute.
- */
-enum veml6046_gain {
-	VEML6046_GAIN_1 = 0x00,    /**< 1x gain */
-	VEML6046_GAIN_2 = 0x01,    /**< 2x gain */
-	VEML6046_GAIN_0_66 = 0x02, /**< 0.66x gain */
-	VEML6046_GAIN_0_5 = 0x03,  /**< 0.5x gain */
-	/** @cond INTERNAL_HIDDEN */
-	VEML6046_GAIN_COUNT = 4,
-	/** @endcond */
-};
-
-/**
- * @brief VEML6046 interrupt persistence protect number options.
- *
- * Possible values for @ref SENSOR_ATTR_VEML6046_PERS custom attribute.
- */
-enum veml6046_pers {
-	VEML6046_PERS_1 = 0x00, /**< 1 measurement */
-	VEML6046_PERS_2 = 0x01, /**< 2 measurements */
-	VEML6046_PERS_4 = 0x02, /**< 4 measurements */
-	VEML6046_PERS_8 = 0x03, /**< 8 measurements */
-};
-
-/**
  * @brief VEML6046 specific sensor attributes.
  *
  * For high and low threshold window settings (G_THDH_L, G_THDH_H, G_THDL_L and
diff --git a/include/zephyr/drivers/sensor/veml60xx-common.h b/include/zephyr/drivers/sensor/veml60xx-common.h
new file mode 100644
index 0000000..0a9aea8
--- /dev/null
+++ b/include/zephyr/drivers/sensor/veml60xx-common.h
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2025 Andreas Klinger
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief Header file for extended sensor API of VEML60xx sensor family
+ * @ingroup veml60xx_interface
+ */
+
+#ifndef ZEPHYR_INCLUDE_DRIVERS_SENSOR_VEML60XX_H_
+#define ZEPHYR_INCLUDE_DRIVERS_SENSOR_VEML60XX_H_
+
+/**
+ * @defgroup veml60xx_interface VEML60XX
+ * @ingroup sensor_interface_ext
+ * @brief Vishay VEML60xx sensor family common attributes
+ * @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief VEML60xx integration time options for ambient light measurements.
+ *
+ * Possible values for @ref SENSOR_ATTR_VEML6031_IT and
+ * @ref SENSOR_ATTR_VEML6046_IT custom attribute.
+ */
+enum veml60xx_it {
+	VEML60XX_IT_3_125, /**< 3.125 ms */
+	VEML60XX_IT_6_25,  /**< 6.25 ms */
+	VEML60XX_IT_12_5,  /**< 12.5 ms */
+	VEML60XX_IT_25,    /**< 25 ms */
+	VEML60XX_IT_50,    /**< 50 ms */
+	VEML60XX_IT_100,   /**< 100 ms */
+	VEML60XX_IT_200,   /**< 200 ms */
+	VEML60XX_IT_400,   /**< 400 ms */
+	/** @cond INTERNAL_HIDDEN */
+	VEML60XX_IT_COUNT,
+	/** @endcond */
+};
+
+/*
+ * @brief VEML60xx integration time struct.
+ */
+struct veml60xx_it_data {
+	enum veml60xx_it num;
+	uint8_t val;
+	int us;
+};
+
+/*
+ * @brief VEML60xx integration time setting values.
+ *
+ * The enumerators of enum veml60xx_it provide indices into this array to get
+ * the related value for the ALS_IT configuration bits.
+ */
+static const struct veml60xx_it_data veml60xx_it_values[VEML60XX_IT_COUNT] = {
+	{VEML60XX_IT_3_125, 0x00, 3125}, /*   3.125 - 0b0000 */
+	{VEML60XX_IT_6_25, 0x01, 6250},  /*   6.25  - 0b0001 */
+	{VEML60XX_IT_12_5, 0x02, 12500}, /*  12.5   - 0b0010 */
+	{VEML60XX_IT_25, 0x03, 25000},   /*  25     - 0b0011 */
+	{VEML60XX_IT_50, 0x04, 50000},   /*  50     - 0b0100 */
+	{VEML60XX_IT_100, 0x05, 100000}, /* 100     - 0b0101 */
+	{VEML60XX_IT_200, 0x06, 200000}, /* 200     - 0b0110 */
+	{VEML60XX_IT_400, 0x07, 400000}, /* 400     - 0b0111 */
+};
+/**
+ * @brief VEML60xx gain options for ambient light measurements.
+ */
+enum veml60xx_gain {
+	VEML60XX_GAIN_1 = 0x00,    /**< 1x gain */
+	VEML60XX_GAIN_2 = 0x01,    /**< 2x gain */
+	VEML60XX_GAIN_0_66 = 0x02, /**< 0.66x gain */
+	VEML60XX_GAIN_0_5 = 0x03,  /**< 0.5x gain */
+	/** @cond INTERNAL_HIDDEN */
+	VEML60XX_GAIN_COUNT = 4,
+	/** @endcond */
+};
+
+/**
+ * @brief VEML60xx ALS interrupt persistence protect number options.
+ *
+ * Possible values for @ref SENSOR_ATTR_VEML6031_PERS and
+ * @ref SENSOR_ATTR_VEML6046_PERS custom attribute.
+ */
+enum veml60xx_pers {
+	VEML60XX_PERS_1 = 0x00, /**< 1 measurement */
+	VEML60XX_PERS_2 = 0x01, /**< 2 measurements */
+	VEML60XX_PERS_4 = 0x02, /**< 4 measurements */
+	VEML60XX_PERS_8 = 0x03, /**< 8 measurements */
+};
+
+
+static inline bool veml60xx_gain_in_range(int32_t gain)
+{
+	return (gain >= VEML60XX_GAIN_1) && (gain <= VEML60XX_GAIN_0_5);
+}
+
+static inline bool veml60xx_it_in_range(int32_t it)
+{
+	return (it >= VEML60XX_IT_3_125) && (it <= VEML60XX_IT_400);
+}
+
+static inline bool veml60xx_pers_in_range(int32_t pers)
+{
+	return (pers >= VEML60XX_PERS_1) && (pers <= VEML60XX_PERS_8);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+/**
+ * @}
+ */
+
+#endif /* ZEPHYR_INCLUDE_DRIVERS_SENSOR_VEML60XX_H_ */
diff --git a/samples/sensor/veml6031/src/main.c b/samples/sensor/veml6031/src/main.c
index 97239aa..0616891 100644
--- a/samples/sensor/veml6031/src/main.c
+++ b/samples/sensor/veml6031/src/main.c
@@ -65,9 +65,9 @@
 {
 	int it, div4, gain;
 
-	for (it = VEML6031_IT_3_125; it <= VEML6031_IT_400; it++) {
+	for (it = VEML60XX_IT_3_125; it <= VEML60XX_IT_400; it++) {
 		for (div4 = VEML6031_SIZE_4_4; div4 <= VEML6031_SIZE_1_4; div4++) {
-			for (gain = VEML6031_GAIN_1; gain <= VEML6031_GAIN_0_5; gain++) {
+			for (gain = VEML60XX_GAIN_1; gain <= VEML60XX_GAIN_0_5; gain++) {
 				read_with_attr(dev, it, div4, gain);
 			}
 		}
diff --git a/samples/sensor/veml6046/src/main.c b/samples/sensor/veml6046/src/main.c
index aec830e..7ac637e 100644
--- a/samples/sensor/veml6046/src/main.c
+++ b/samples/sensor/veml6046/src/main.c
@@ -85,9 +85,9 @@
 
 static void read_with_all_attr(const struct device *dev)
 {
-	for (int it = VEML6046_IT_3_125; it <= VEML6046_IT_400; it++) {
+	for (int it = VEML60XX_IT_3_125; it <= VEML60XX_IT_400; it++) {
 		for (int pdd = VEML6046_SIZE_2_2; pdd <= VEML6046_SIZE_1_2; pdd++) {
-			for (int gain = VEML6046_GAIN_1; gain <= VEML6046_GAIN_0_5; gain++) {
+			for (int gain = VEML60XX_GAIN_1; gain <= VEML60XX_GAIN_0_5; gain++) {
 				read_with_attr(dev, it, pdd, gain);
 			}
 		}