diff --git a/drivers/can/can_common.c b/drivers/can/can_common.c index fe5e3779220..57bc6b9f52e 100644 --- a/drivers/can/can_common.c +++ b/drivers/can/can_common.c @@ -127,10 +127,12 @@ static int can_calc_timing_int(uint32_t core_clock, struct can_timing *res, return sp_err_min == UINT16_MAX ? -EINVAL : (int)sp_err_min; } -int can_calc_timing(const struct device *dev, struct can_timing *res, - uint32_t bitrate, uint16_t sample_pnt) + +int z_impl_can_calc_timing(const struct device *dev, struct can_timing *res, + uint32_t bitrate, uint16_t sample_pnt) { - const struct can_driver_api *api = dev->api; + const struct can_timing *min = can_get_timing_min(dev); + const struct can_timing *max = can_get_timing_max(dev); uint32_t core_clock; int ret; @@ -139,15 +141,15 @@ int can_calc_timing(const struct device *dev, struct can_timing *res, return ret; } - return can_calc_timing_int(core_clock, res, &api->timing_min, - &api->timing_max, bitrate, sample_pnt); + return can_calc_timing_int(core_clock, res, min, max, bitrate, sample_pnt); } #ifdef CONFIG_CAN_FD_MODE -int can_calc_timing_data(const struct device *dev, struct can_timing *res, - uint32_t bitrate, uint16_t sample_pnt) +int z_impl_can_calc_timing_data(const struct device *dev, struct can_timing *res, + uint32_t bitrate, uint16_t sample_pnt) { - const struct can_driver_api *api = dev->api; + const struct can_timing *min = can_get_timing_min_data(dev); + const struct can_timing *max = can_get_timing_max_data(dev); uint32_t core_clock; int ret; @@ -156,10 +158,9 @@ int can_calc_timing_data(const struct device *dev, struct can_timing *res, return ret; } - return can_calc_timing_int(core_clock, res, &api->timing_min_data, - &api->timing_max_data, bitrate, sample_pnt); + return can_calc_timing_int(core_clock, res, min, max, bitrate, sample_pnt); } -#endif +#endif /* CONFIG_CAN_FD_MODE */ int can_calc_prescaler(const struct device *dev, struct can_timing *timing, uint32_t bitrate) @@ -184,7 +185,7 @@ int can_set_bitrate(const struct device *dev, uint32_t bitrate, uint32_t bitrate struct can_timing timing; #ifdef CONFIG_CAN_FD_MODE struct can_timing timing_data; -#endif +#endif /* CONFIG_CAN_FD_MODE */ uint32_t max_bitrate; int ret; diff --git a/drivers/can/can_handlers.c b/drivers/can/can_handlers.c index eefbbdf448c..f76b756c506 100644 --- a/drivers/can/can_handlers.c +++ b/drivers/can/can_handlers.c @@ -7,6 +7,22 @@ #include #include +static int z_vrfy_can_calc_timing(const struct device *dev, struct can_timing *res, + uint32_t bitrate, uint16_t sample_pnt) +{ + struct can_timing local_res; + int err; + + Z_OOPS(Z_SYSCALL_DRIVER_CAN(dev, get_core_clock)); + Z_OOPS(z_user_from_copy(&local_res, res, sizeof(local_res))); + + err = z_impl_can_calc_timing(dev, &local_res, bitrate, sample_pnt); + Z_OOPS(z_user_to_copy(res, &local_res, sizeof(*res))); + + return err; +} +#include + static inline int z_vrfy_can_set_timing(const struct device *dev, const struct can_timing *timing, const struct can_timing *timing_data) @@ -57,6 +73,22 @@ static inline const struct can_timing *z_vrfy_can_get_timing_max(const struct de #ifdef CONFIG_CAN_FD_MODE +static int z_vrfy_can_calc_timing_data(const struct device *dev, struct can_timing *res, + uint32_t bitrate, uint16_t sample_pnt) +{ + struct can_timing local_res; + int err; + + Z_OOPS(Z_SYSCALL_DRIVER_CAN(dev, get_core_clock)); + Z_OOPS(z_user_from_copy(&local_res, res, sizeof(local_res))); + + err = z_impl_can_calc_timing_data(dev, &local_res, bitrate, sample_pnt); + Z_OOPS(z_user_to_copy(res, &local_res, sizeof(*res))); + + return err; +} +#include + static inline const struct can_timing *z_vrfy_can_get_timing_min_data(const struct device *dev) { Z_OOPS(Z_SYSCALL_OBJ(dev, K_OBJ_DRIVER_CAN)); diff --git a/include/drivers/can.h b/include/drivers/can.h index 46c0d9e2a9a..d116ee75939 100644 --- a/include/drivers/can.h +++ b/include/drivers/can.h @@ -699,8 +699,8 @@ static inline const struct can_timing *z_impl_can_get_timing_max(const struct de * @retval -EINVAL if there is no solution for the desired values. * @retval -EIO if @a can_get_core_clock() is not available. */ -int can_calc_timing(const struct device *dev, struct can_timing *res, - uint32_t bitrate, uint16_t sample_pnt); +__syscall int can_calc_timing(const struct device *dev, struct can_timing *res, + uint32_t bitrate, uint16_t sample_pnt); #if defined(CONFIG_CAN_FD_MODE) || defined(__DOXYGEN__) @@ -766,8 +766,9 @@ static inline const struct can_timing *z_impl_can_get_timing_max_data(const stru * @retval -EINVAL if there is no solution for the desired values. * @retval -EIO if @a can_get_core_clock() is not available. */ -int can_calc_timing_data(const struct device *dev, struct can_timing *res, - uint32_t bitrate, uint16_t sample_pnt); +__syscall int can_calc_timing_data(const struct device *dev, struct can_timing *res, + uint32_t bitrate, uint16_t sample_pnt); + #endif /* CONFIG_CAN_FD_MODE */ /**