drivers: sensor: meas: ms5837 supporting 02 and 30 variants via dt

This patch adds support via dt compatible property.

Signed-off-by: Ivan Wagner <ivan.wagner@tecinvent.ch>
(cherry picked from commit b5adb4457ca8eea826fcec8edf2d0d06ebf79efe)
diff --git a/drivers/sensor/meas/ms5837/Kconfig b/drivers/sensor/meas/ms5837/Kconfig
index d758d59..96443c8 100644
--- a/drivers/sensor/meas/ms5837/Kconfig
+++ b/drivers/sensor/meas/ms5837/Kconfig
@@ -1,12 +1,13 @@
 # MS5837 pressure sensor configuration options
 
 # Copyright (c) 2018 Jan Van Winkel <jan.van_winkel@dxplore.eu>
+# Copyright (c) 2025 Ivan Wagner <ivan.wagner@tecinvent.ch>
 # SPDX-License-Identifier: Apache-2.0
 
 config MS5837
 	bool "MS5837 pressure and temperature sensor"
 	default y
-	depends on DT_HAS_MEAS_MS5837_ENABLED
+	depends on DT_HAS_MEAS_MS5837_02BA_ENABLED || DT_HAS_MEAS_MS5837_30BA_ENABLED
 	select I2C
 	help
 	  Enable driver for MS5837 pressure and temperature sensor.
diff --git a/drivers/sensor/meas/ms5837/ms5837.c b/drivers/sensor/meas/ms5837/ms5837.c
index d07d230..4f92ff7 100644
--- a/drivers/sensor/meas/ms5837/ms5837.c
+++ b/drivers/sensor/meas/ms5837/ms5837.c
@@ -1,12 +1,11 @@
 /* Driver for MS5837 pressure sensor
  *
  * Copyright (c) 2018 Jan Van Winkel <jan.van_winkel@dxplore.eu>
+ * Copyright (c) 2025 Ivan Wagner <ivan.wagner@tecinvent.ch>
  *
  * SPDX-License-Identifier: Apache-2.0
  */
 
-#define DT_DRV_COMPAT meas_ms5837
-
 #include <zephyr/init.h>
 #include <zephyr/kernel.h>
 #include <zephyr/sys/byteorder.h>
@@ -45,6 +44,8 @@
 	return 0;
 }
 
+#if DT_HAS_COMPAT_STATUS_OKAY(meas_ms5837_30ba)
+
 static void ms5837_compensate_30(const struct device *dev,
 				 const int32_t adc_temperature,
 				 const int32_t adc_pressure)
@@ -94,10 +95,14 @@
 	SENS -= SENSi;
 
 	data->temperature -= Ti;
-	data->pressure =
-	    (((SENS * adc_pressure) / (1ll << 21)) - OFF) / (1ll << 13);
+	/* Result is in mbar * 10 but store result as mbar * 100 same as 02 sensor variant */
+	data->pressure = ((((SENS * adc_pressure) / (1ll << 21)) - OFF) / (1ll << 13)) * 10;
 }
 
+#endif
+
+#if DT_HAS_COMPAT_STATUS_OKAY(meas_ms5837_02ba)
+
 /*
  * First and second order pressure and temperature calculations, as per the flowchart in the
  * MS5837-02B datasheet. (see "Pressure and Temperature Calculation", pages 6 and 7, REV a8 12/2019)
@@ -135,12 +140,16 @@
 	SENS -= SENSi;
 
 	data->temperature -= Ti;
+	/* Result is in mbar * 100 */
 	data->pressure = (((SENS * adc_pressure) / (1ll << 21)) - OFF) / (1ll << 15);
 }
 
+#endif
+
 static int ms5837_sample_fetch(const struct device *dev,
 			       enum sensor_channel channel)
 {
+	const struct ms5837_config *cfg = dev->config;
 	struct ms5837_data *data = dev->data;
 	int err;
 	uint32_t adc_pressure;
@@ -161,7 +170,7 @@
 		return err;
 	}
 
-	data->comp_func(dev, adc_temperature, adc_pressure);
+	cfg->comp_func(dev, adc_temperature, adc_pressure);
 
 	return 0;
 }
@@ -348,34 +357,25 @@
 		return err;
 	}
 
-	const int type_id = (data->factory >> 5) & 0x7f;
-
-	switch (type_id) {
-	case  MS5837_02BA01:
-	case MS5837_02BA21:
-		data->comp_func = ms5837_compensate_02;
-		break;
-	case MS5837_30BA26:
-		data->comp_func = ms5837_compensate_30;
-		break;
-	default:
-		LOG_WRN(" unrecognized type: '%2x', defaulting to MS5837-30", type_id);
-		data->comp_func = ms5837_compensate_30;
-		break;
-	}
-
 	return 0;
 }
 
-#define MS5837_DEFINE(inst)								\
-	static struct ms5837_data ms5837_data_##inst;					\
-											\
-	static const struct ms5837_config ms5837_config_##inst = {			\
-		.i2c = I2C_DT_SPEC_INST_GET(inst),					\
-	};										\
-											\
-	SENSOR_DEVICE_DT_INST_DEFINE(inst, ms5837_init, NULL,				\
-			      &ms5837_data_##inst, &ms5837_config_##inst, POST_KERNEL,	\
-			      CONFIG_SENSOR_INIT_PRIORITY, &ms5837_api_funcs);		\
+#define MS5837_DEFINE(inst, type)                                                                  \
+	static struct ms5837_data ms5837_##type##_data_##inst;                                     \
+                                                                                                   \
+	static const struct ms5837_config ms5837_##type##_config_##inst = {                        \
+		.i2c = I2C_DT_SPEC_INST_GET(inst),                                                 \
+		.comp_func = ms5837_compensate_##type                                              \
+	};                                                                                         \
+                                                                                                   \
+	SENSOR_DEVICE_DT_INST_DEFINE(inst, ms5837_init, NULL, &ms5837_##type##_data_##inst,        \
+				     &ms5837_##type##_config_##inst, POST_KERNEL,                  \
+				     CONFIG_SENSOR_INIT_PRIORITY, &ms5837_api_funcs);
 
-DT_INST_FOREACH_STATUS_OKAY(MS5837_DEFINE)
+#undef DT_DRV_COMPAT
+#define DT_DRV_COMPAT meas_ms5837_02ba
+DT_INST_FOREACH_STATUS_OKAY_VARGS(MS5837_DEFINE, 02)
+
+#undef DT_DRV_COMPAT
+#define DT_DRV_COMPAT meas_ms5837_30ba
+DT_INST_FOREACH_STATUS_OKAY_VARGS(MS5837_DEFINE, 30)
diff --git a/drivers/sensor/meas/ms5837/ms5837.h b/drivers/sensor/meas/ms5837/ms5837.h
index e4f8fc6..5917e70 100644
--- a/drivers/sensor/meas/ms5837/ms5837.h
+++ b/drivers/sensor/meas/ms5837/ms5837.h
@@ -44,12 +44,6 @@
 #define MS5837_ADC_READ_DELAY_4086 10
 #define MS5837_ADC_READ_DELAY_8129 20
 
-enum ms5837_type {
-	MS5837_02BA01 = 0x00,
-	MS5837_02BA21 = 0x15,
-	MS5837_30BA26 = 0x1A
-};
-
 typedef void (*ms5837_compensate_func)(const struct device *dev,
 				       const int32_t adc_temperature,
 				       const int32_t adc_pressure);
@@ -76,11 +70,11 @@
 	uint8_t presure_conv_delay;
 	uint8_t temperature_conv_delay;
 
-	ms5837_compensate_func comp_func;
 };
 
 struct ms5837_config {
 	struct i2c_dt_spec i2c;
+	ms5837_compensate_func comp_func;
 };
 
 #endif /* __SENSOR_MS5837_H__ */
diff --git a/dts/bindings/sensor/meas,ms5837-02ba.yaml b/dts/bindings/sensor/meas,ms5837-02ba.yaml
new file mode 100644
index 0000000..61ac0b1
--- /dev/null
+++ b/dts/bindings/sensor/meas,ms5837-02ba.yaml
@@ -0,0 +1,8 @@
+# Copyright (c) 2025, Ivan Wagner <ivan.wagner@tecinvent.ch>
+# SPDX-License-Identifier: Apache-2.0
+
+description: TE Connectivity MS5837-02BA digital pressure sensor
+
+compatible: "meas,ms5837-02ba"
+
+include: [sensor-device.yaml, i2c-device.yaml]
diff --git a/dts/bindings/sensor/meas,ms5837-30ba.yaml b/dts/bindings/sensor/meas,ms5837-30ba.yaml
new file mode 100644
index 0000000..329537b
--- /dev/null
+++ b/dts/bindings/sensor/meas,ms5837-30ba.yaml
@@ -0,0 +1,8 @@
+# Copyright (c) 2025, Ivan Wagner <ivan.wagner@tecinvent.ch>
+# SPDX-License-Identifier: Apache-2.0
+
+description: TE Connectivity MS5837-30BA digital pressure sensor
+
+compatible: "meas,ms5837-30ba"
+
+include: [sensor-device.yaml, i2c-device.yaml]
diff --git a/dts/bindings/sensor/meas,ms5837.yaml b/dts/bindings/sensor/meas,ms5837.yaml
deleted file mode 100644
index 7d5472c..0000000
--- a/dts/bindings/sensor/meas,ms5837.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-# Copyright (c) 2018, Jan Van Winkel <jan.van_winkel@dxplore.eu>
-# SPDX-License-Identifier: Apache-2.0
-
-description: TE Connectivity MS5837 digital pressure sensor
-
-compatible: "meas,ms5837"
-
-include: [sensor-device.yaml, i2c-device.yaml]
diff --git a/samples/sensor/ms5837/boards/nrf52840dk_nrf52840.overlay b/samples/sensor/ms5837/boards/nrf52840dk_nrf52840.overlay
index 7b5e801..39dcb32 100644
--- a/samples/sensor/ms5837/boards/nrf52840dk_nrf52840.overlay
+++ b/samples/sensor/ms5837/boards/nrf52840dk_nrf52840.overlay
@@ -8,7 +8,8 @@
 	status = "okay";
 	clock-frequency = <I2C_BITRATE_STANDARD>;
 	ms5837@76 {
-		compatible = "meas,ms5837";
+		compatible = "meas,ms5837-30ba";
 		reg = <0x76>;
+		status = "okay";
 	};
 };
diff --git a/tests/drivers/build_all/sensor/i2c.dtsi b/tests/drivers/build_all/sensor/i2c.dtsi
index dda3eeb..da527ae 100644
--- a/tests/drivers/build_all/sensor/i2c.dtsi
+++ b/tests/drivers/build_all/sensor/i2c.dtsi
@@ -175,9 +175,10 @@
 	reg = <0x17>;
 };
 
-test_i2c_ms5837: ms5837@18 {
-	compatible = "meas,ms5837";
+test_i2c_ms5837_02ba: ms5837@18 {
+	compatible = "meas,ms5837-02ba";
 	reg = <0x18>;
+	status = "okay";
 };
 
 test_i2c_mcp9808: mcp9808@19 {
@@ -1067,3 +1068,9 @@
 	compatible = "sensirion,sht21";
 	reg = <0x90>;
 };
+
+test_i2c_ms5837_30ba: ms5837@ae {
+	compatible = "meas,ms5837-30ba";
+	reg = <0xae>;
+	status = "okay";
+};