drivers: can: add can_get_bitrate_{min,max}(), deprecate existing APIs

Since the minimum/maximum supported bitrates are now stored in the common
CAN controller driver configuration struct, retrieving these can no longer
fail.

Add new CAN controller API functions can_get_bitrate_min() and
can_get_bitrate_max() reflecting this and deprecate the existing
can_get_min_bitrate() and can_get_max_bitrate().

Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
diff --git a/drivers/can/can_common.c b/drivers/can/can_common.c
index cb2e7c3..29397fd 100644
--- a/drivers/can/can_common.c
+++ b/drivers/can/can_common.c
@@ -351,22 +351,12 @@
 int z_impl_can_set_bitrate(const struct device *dev, uint32_t bitrate)
 {
 	struct can_timing timing = { 0 };
-	uint32_t min_bitrate;
-	uint32_t max_bitrate;
+	uint32_t min = can_get_bitrate_min(dev);
+	uint32_t max = can_get_bitrate_max(dev);
 	uint16_t sample_pnt;
 	int ret;
 
-	(void)can_get_min_bitrate(dev, &min_bitrate);
-
-	ret = can_get_max_bitrate(dev, &max_bitrate);
-	if (ret == -ENOSYS) {
-		/* Maximum bitrate unknown */
-		max_bitrate = 0;
-	} else if (ret < 0) {
-		return ret;
-	}
-
-	if ((bitrate < min_bitrate) || (((max_bitrate > 0) && (bitrate > max_bitrate)))) {
+	if ((bitrate < min) || (bitrate > max)) {
 		return -ENOTSUP;
 	}
 
@@ -407,22 +397,12 @@
 int z_impl_can_set_bitrate_data(const struct device *dev, uint32_t bitrate_data)
 {
 	struct can_timing timing_data = { 0 };
-	uint32_t min_bitrate;
-	uint32_t max_bitrate;
+	uint32_t min = can_get_bitrate_min(dev);
+	uint32_t max = can_get_bitrate_max(dev);
 	uint16_t sample_pnt;
 	int ret;
 
-	(void)can_get_min_bitrate(dev, &min_bitrate);
-
-	ret = can_get_max_bitrate(dev, &max_bitrate);
-	if (ret == -ENOSYS) {
-		/* Maximum bitrate unknown */
-		max_bitrate = 0;
-	} else if (ret < 0) {
-		return ret;
-	}
-
-	if ((bitrate_data < min_bitrate) || ((max_bitrate > 0) && (bitrate_data > max_bitrate))) {
+	if ((bitrate_data < min) || (bitrate_data > max)) {
 		return -ENOTSUP;
 	}
 
diff --git a/drivers/can/can_handlers.c b/drivers/can/can_handlers.c
index a7f89d5..b762b80 100644
--- a/drivers/can/can_handlers.c
+++ b/drivers/can/can_handlers.c
@@ -45,25 +45,21 @@
 }
 #include <syscalls/can_get_core_clock_mrsh.c>
 
-static inline int z_vrfy_can_get_min_bitrate(const struct device *dev,
-					     uint32_t *min_bitrate)
+static inline uint32_t z_vrfy_can_get_bitrate_min(const struct device *dev)
 {
 	K_OOPS(K_SYSCALL_OBJ(dev, K_OBJ_DRIVER_CAN));
-	K_OOPS(K_SYSCALL_MEMORY_WRITE(min_bitrate, sizeof(*min_bitrate)));
 
-	return z_impl_can_get_min_bitrate(dev, min_bitrate);
+	return z_impl_can_get_bitrate_min(dev);
 }
-#include <syscalls/can_get_min_bitrate_mrsh.c>
+#include <syscalls/can_get_bitrate_min_mrsh.c>
 
-static inline int z_vrfy_can_get_max_bitrate(const struct device *dev,
-					     uint32_t *max_bitrate)
+static inline uint32_t z_vrfy_can_get_bitrate_max(const struct device *dev)
 {
 	K_OOPS(K_SYSCALL_OBJ(dev, K_OBJ_DRIVER_CAN));
-	K_OOPS(K_SYSCALL_MEMORY_WRITE(max_bitrate, sizeof(*max_bitrate)));
 
-	return z_impl_can_get_max_bitrate(dev, max_bitrate);
+	return z_impl_can_get_bitrate_max(dev);
 }
-#include <syscalls/can_get_max_bitrate_mrsh.c>
+#include <syscalls/can_get_bitrate_max_mrsh.c>
 
 static inline const struct can_timing *z_vrfy_can_get_timing_min(const struct device *dev)
 {
diff --git a/drivers/can/can_shell.c b/drivers/can/can_shell.c
index 66cb4c1..6c07448 100644
--- a/drivers/can/can_shell.c
+++ b/drivers/can/can_shell.c
@@ -280,9 +280,9 @@
 	const struct can_timing *timing_max;
 	struct can_bus_err_cnt err_cnt;
 	enum can_state state;
-	uint32_t max_bitrate = 0;
-	int max_std_filters = 0;
-	int max_ext_filters = 0;
+	uint32_t bitrate_max;
+	int max_std_filters;
+	int max_ext_filters;
 	uint32_t core_clock;
 	can_mode_t cap;
 	int err;
@@ -298,11 +298,7 @@
 		return err;
 	}
 
-	err = can_get_max_bitrate(dev, &max_bitrate);
-	if (err != 0 && err != -ENOSYS) {
-		shell_error(sh, "failed to get maximum bitrate (err %d)", err);
-		return err;
-	}
+	bitrate_max = can_get_bitrate_max(dev);
 
 	max_std_filters = can_get_max_filters(dev, false);
 	if (max_std_filters < 0 && max_std_filters != -ENOSYS) {
@@ -329,7 +325,7 @@
 	}
 
 	shell_print(sh, "core clock:      %d Hz", core_clock);
-	shell_print(sh, "max bitrate:     %d bps", max_bitrate);
+	shell_print(sh, "max bitrate:     %d bps", bitrate_max);
 	shell_print(sh, "max std filters: %d", max_std_filters);
 	shell_print(sh, "max ext filters: %d", max_ext_filters);
 
diff --git a/include/zephyr/drivers/can.h b/include/zephyr/drivers/can.h
index 9b589e9..1171bd8 100644
--- a/include/zephyr/drivers/can.h
+++ b/include/zephyr/drivers/can.h
@@ -840,18 +840,33 @@
  * Get the minimum supported bitrate for the CAN controller/transceiver combination.
  *
  * @param dev Pointer to the device structure for the driver instance.
+ * @return Minimum supported bitrate in bits/s
+ */
+__syscall uint32_t can_get_bitrate_min(const struct device *dev);
+
+static inline uint32_t z_impl_can_get_bitrate_min(const struct device *dev)
+{
+	const struct can_driver_config *common = (const struct can_driver_config *)dev->config;
+
+	return common->min_bitrate;
+}
+
+/**
+ * @brief Get minimum supported bitrate
+ *
+ * Get the minimum supported bitrate for the CAN controller/transceiver combination.
+ *
+ * @deprecated Use @a can_get_bitrate_min() instead.
+ *
+ * @param dev Pointer to the device structure for the driver instance.
  * @param[out] min_bitrate Minimum supported bitrate in bits/s
  *
  * @retval -EIO General input/output error.
  * @retval -ENOSYS If this function is not implemented by the driver.
  */
-__syscall int can_get_min_bitrate(const struct device *dev, uint32_t *min_bitrate);
-
-static inline int z_impl_can_get_min_bitrate(const struct device *dev, uint32_t *min_bitrate)
+__deprecated static inline int can_get_min_bitrate(const struct device *dev, uint32_t *min_bitrate)
 {
-	const struct can_driver_config *common = (const struct can_driver_config *)dev->config;
-
-	*min_bitrate = common->min_bitrate;
+	*min_bitrate = can_get_bitrate_min(dev);
 
 	return 0;
 }
@@ -862,23 +877,34 @@
  * Get the maximum supported bitrate for the CAN controller/transceiver combination.
  *
  * @param dev Pointer to the device structure for the driver instance.
+ * @return Maximum supported bitrate in bits/s
+ */
+__syscall uint32_t can_get_bitrate_max(const struct device *dev);
+
+static inline uint32_t z_impl_can_get_bitrate_max(const struct device *dev)
+{
+	const struct can_driver_config *common = (const struct can_driver_config *)dev->config;
+
+	return common->max_bitrate;
+}
+
+/**
+ * @brief Get maximum supported bitrate
+ *
+ * Get the maximum supported bitrate for the CAN controller/transceiver combination.
+ *
+ * @deprecated Use @a can_get_bitrate_max() instead.
+ *
+ * @param dev Pointer to the device structure for the driver instance.
  * @param[out] max_bitrate Maximum supported bitrate in bits/s
  *
  * @retval 0 If successful.
  * @retval -EIO General input/output error.
  * @retval -ENOSYS If this function is not implemented by the driver.
  */
-__syscall int can_get_max_bitrate(const struct device *dev, uint32_t *max_bitrate);
-
-static inline int z_impl_can_get_max_bitrate(const struct device *dev, uint32_t *max_bitrate)
+__deprecated static inline int can_get_max_bitrate(const struct device *dev, uint32_t *max_bitrate)
 {
-	const struct can_driver_config *common = (const struct can_driver_config *)dev->config;
-
-	if (common->max_bitrate == 0U) {
-		return -ENOSYS;
-	}
-
-	*max_bitrate = common->max_bitrate;
+	*max_bitrate = can_get_bitrate_max(dev);
 
 	return 0;
 }
diff --git a/tests/drivers/can/api/src/canfd.c b/tests/drivers/can/api/src/canfd.c
index ec881b0..2059c02 100644
--- a/tests/drivers/can/api/src/canfd.c
+++ b/tests/drivers/can/api/src/canfd.c
@@ -397,22 +397,14 @@
  */
 ZTEST_USER(canfd, test_set_bitrate_too_high)
 {
-	uint32_t max = 8000000U;
-	int expected = -EINVAL;
+	uint32_t max = can_get_bitrate_max(can_dev);
 	int err;
 
-	err = can_get_max_bitrate(can_dev, &max);
-	if (err != -ENOSYS) {
-		zassert_equal(err, 0, "failed to get max bitrate (err %d)", err);
-		zassert_not_equal(max, 0, "max bitrate is 0");
-		expected = -ENOTSUP;
-	}
-
 	err = can_stop(can_dev);
 	zassert_equal(err, 0, "failed to stop CAN controller (err %d)", err);
 
 	err = can_set_bitrate_data(can_dev, max + 1);
-	zassert_equal(err, expected, "too high data phase bitrate accepted");
+	zassert_equal(err, -ENOTSUP, "too high data phase bitrate accepted");
 
 	err = can_start(can_dev);
 	zassert_equal(err, 0, "failed to start CAN controller (err %d)", err);
diff --git a/tests/drivers/can/api/src/classic.c b/tests/drivers/can/api/src/classic.c
index c59e346..0b99f9a 100644
--- a/tests/drivers/can/api/src/classic.c
+++ b/tests/drivers/can/api/src/classic.c
@@ -480,19 +480,8 @@
  */
 ZTEST_USER(can_classic, test_bitrate_limits)
 {
-	uint32_t min = 0U;
-	uint32_t max = 0U;
-	int err;
-
-	err = can_get_min_bitrate(can_dev, &min);
-	zassert_equal(err, 0, "failed to get min bitrate (err %d)", err);
-
-	err = can_get_max_bitrate(can_dev, &max);
-	if (err == -ENOSYS) {
-		ztest_test_skip();
-	}
-
-	zassert_equal(err, 0, "failed to get max bitrate (err %d)", err);
+	uint32_t min = can_get_bitrate_min(can_dev);
+	uint32_t max = can_get_bitrate_max(can_dev);
 
 	zassert_true(min <= max, "min bitrate must be lower or equal to max bitrate");
 }
@@ -502,22 +491,14 @@
  */
 ZTEST_USER(can_classic, test_set_bitrate_too_high)
 {
-	uint32_t max = 1000000U;
-	int expected = -EINVAL;
+	uint32_t max = can_get_bitrate_max(can_dev);
 	int err;
 
-	err = can_get_max_bitrate(can_dev, &max);
-	if (err != -ENOSYS) {
-		zassert_equal(err, 0, "failed to get max bitrate (err %d)", err);
-		zassert_not_equal(max, 0, "max bitrate is 0");
-		expected = -ENOTSUP;
-	}
-
 	err = can_stop(can_dev);
 	zassert_equal(err, 0, "failed to stop CAN controller (err %d)", err);
 
 	err = can_set_bitrate(can_dev, max + 1);
-	zassert_equal(err, expected, "too high bitrate accepted");
+	zassert_equal(err, -ENOTSUP, "too high bitrate accepted");
 
 	err = can_start(can_dev);
 	zassert_equal(err, 0, "failed to start CAN controller (err %d)", err);