drivers: can: convert can_calc_timing*() to syscalls

Convert can_calc_timing() + can_calc_timing_data() to syscalls and use
the newly added syscalls calls for determing the minimum/maximum
supported timing parameter values.

Signed-off-by: Henrik Brix Andersen <hebad@vestas.com>
This commit is contained in:
Henrik Brix Andersen 2022-03-24 14:44:13 +01:00 committed by Marti Bolivar
commit 372cee4268
3 changed files with 50 additions and 16 deletions

View file

@ -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;

View file

@ -7,6 +7,22 @@
#include <syscall_handler.h>
#include <drivers/can.h>
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 <syscalls/can_calc_timing_mrsh.c>
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 <syscalls/can_calc_timing_data_mrsh.c>
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));