diff --git a/boards/arm/s32z270dc2_r52/s32z270dc2_r52.dtsi b/boards/arm/s32z270dc2_r52/s32z270dc2_r52.dtsi index eed395cce8c..59c46f7896b 100644 --- a/boards/arm/s32z270dc2_r52/s32z270dc2_r52.dtsi +++ b/boards/arm/s32z270dc2_r52/s32z270dc2_r52.dtsi @@ -109,7 +109,6 @@ &can0 { pinctrl-0 = <&can0_default>; pinctrl-names = "default"; - clock-frequency = <80000000>; bus-speed = <125000>; sample-point = <875>; sjw = <1>; @@ -122,7 +121,6 @@ &can1 { pinctrl-0 = <&can1_default>; pinctrl-names = "default"; - clock-frequency = <80000000>; bus-speed = <125000>; sample-point = <875>; sjw = <1>; diff --git a/boards/arm/s32z270dc2_r52/s32z270dc2_rtu0_r52.dts b/boards/arm/s32z270dc2_r52/s32z270dc2_rtu0_r52.dts index a8650758089..ebaf1658f3b 100644 --- a/boards/arm/s32z270dc2_r52/s32z270dc2_rtu0_r52.dts +++ b/boards/arm/s32z270dc2_r52/s32z270dc2_rtu0_r52.dts @@ -5,6 +5,7 @@ */ /dts-v1/; +#include #include #include "s32z270dc2_r52.dtsi" diff --git a/boards/arm/s32z270dc2_r52/s32z270dc2_rtu1_r52.dts b/boards/arm/s32z270dc2_r52/s32z270dc2_rtu1_r52.dts index 1f74fe4a3a9..06cf6b25844 100644 --- a/boards/arm/s32z270dc2_r52/s32z270dc2_rtu1_r52.dts +++ b/boards/arm/s32z270dc2_r52/s32z270dc2_rtu1_r52.dts @@ -5,6 +5,7 @@ */ /dts-v1/; +#include #include #include "s32z270dc2_r52.dtsi" diff --git a/drivers/can/Kconfig.nxp_s32 b/drivers/can/Kconfig.nxp_s32 index a8102d8e958..53c1ffc2b8b 100644 --- a/drivers/can/Kconfig.nxp_s32 +++ b/drivers/can/Kconfig.nxp_s32 @@ -1,10 +1,11 @@ -# Copyright 2022 NXP +# Copyright 2022-2023 NXP # SPDX-License-Identifier: Apache-2.0 config CAN_NXP_S32_CANXL bool "NXP S32 CANXL driver" default y depends on DT_HAS_NXP_S32_CANXL_ENABLED + select CLOCK_CONTROL help Enable support for NXP S32 CANXL driver. diff --git a/drivers/can/can_nxp_s32_canxl.c b/drivers/can/can_nxp_s32_canxl.c index b5dd7305c51..a601399e82e 100644 --- a/drivers/can/can_nxp_s32_canxl.c +++ b/drivers/can/can_nxp_s32_canxl.c @@ -1,5 +1,5 @@ /* - * Copyright 2022 NXP + * Copyright 2022-2023 NXP * * SPDX-License-Identifier: Apache-2.0 */ @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -66,7 +67,8 @@ struct can_nxp_s32_config { CANXL_GRP_CONTROL_Type *base_grp_ctrl; CANXL_DSC_CONTROL_Type *base_dsc_ctrl; uint8 instance; - uint32_t clock_can; + const struct device *clock_dev; + clock_control_subsys_t clock_subsys; uint32_t bitrate; uint32_t sample_point; uint32_t sjw; @@ -286,9 +288,7 @@ static int can_nxp_s32_get_core_clock(const struct device *dev, uint32_t *rate) __ASSERT_NO_MSG(rate != NULL); - *rate = config->clock_can; - - return 0; + return clock_control_get_rate(config->clock_dev, config->clock_subsys, rate); } static int can_nxp_s32_get_max_filters(const struct device *dev, bool ide) @@ -829,6 +829,17 @@ static int can_nxp_s32_init(const struct device *dev) } } + if (!device_is_ready(config->clock_dev)) { + LOG_ERR("Clock control device not ready"); + return -ENODEV; + } + + err = clock_control_on(config->clock_dev, config->clock_subsys); + if (err) { + LOG_ERR("Failed to enable clock"); + return err; + } + k_mutex_init(&data->rx_mutex); k_mutex_init(&data->tx_mutex); k_sem_init(&data->tx_allocs_sem, CONFIG_CAN_NXP_S32_MAX_TX, CONFIG_CAN_NXP_S32_MAX_TX); @@ -1060,7 +1071,9 @@ static const struct can_driver_api can_nxp_s32_driver_api = { .base_dsc_ctrl = (CANXL_DSC_CONTROL_Type *) \ DT_REG_ADDR_BY_NAME(CAN_NXP_S32_NODE(n), dsc_ctrl), \ .instance = n, \ - .clock_can = DT_PROP(CAN_NXP_S32_NODE(n), clock_frequency), \ + .clock_dev = DEVICE_DT_GET(DT_CLOCKS_CTLR(CAN_NXP_S32_NODE(n))), \ + .clock_subsys = (clock_control_subsys_t) \ + DT_CLOCKS_CELL(CAN_NXP_S32_NODE(n), name), \ .bitrate = DT_PROP(CAN_NXP_S32_NODE(n), bus_speed), \ .sjw = DT_PROP(CAN_NXP_S32_NODE(n), sjw), \ .prop_seg = DT_PROP_OR(CAN_NXP_S32_NODE(n), prop_seg, 0), \ diff --git a/dts/arm/nxp/nxp_s32z27x_r52.dtsi b/dts/arm/nxp/nxp_s32z27x_r52.dtsi index 5f5c69948cb..5728e3e3ff9 100644 --- a/dts/arm/nxp/nxp_s32z27x_r52.dtsi +++ b/dts/arm/nxp/nxp_s32z27x_r52.dtsi @@ -688,6 +688,7 @@ interrupts = , ; interrupt-names = "RX_TX_DATA_IRQ", "INT_ERROR_IRQ"; + clocks = <&clock NXP_S32_P5_CANXL_PE_CLK>; }; can1: can@4751b000 { @@ -700,6 +701,7 @@ interrupts = , ; interrupt-names = "RX_TX_DATA_IRQ", "INT_ERROR_IRQ"; + clocks = <&clock NXP_S32_P5_CANXL_PE_CLK>; }; }; }; diff --git a/dts/bindings/can/nxp,s32-canxl.yaml b/dts/bindings/can/nxp,s32-canxl.yaml index 8d498e47007..2a0f9408b65 100644 --- a/dts/bindings/can/nxp,s32-canxl.yaml +++ b/dts/bindings/can/nxp,s32-canxl.yaml @@ -1,4 +1,4 @@ -# Copyright 2022 NXP +# Copyright 2022-2023 NXP # # SPDX-License-Identifier: Apache-2.0 @@ -15,10 +15,8 @@ properties: interrupts: required: true - clock-frequency: - type: int + clocks: required: true - description: Module clock frequency in Hz. pinctrl-0: required: true