diff --git a/hw/arm/fsl-imx6.c b/hw/arm/fsl-imx6.c index bf106a9063..585c935b89 100644 --- a/hw/arm/fsl-imx6.c +++ b/hw/arm/fsl-imx6.c @@ -391,7 +391,8 @@ static void fsl_imx6_realize(DeviceState *dev, Error **errp) { FSL_IMX6_CAN2_ADDR, FSL_IMX6_FLEXCAN2_IRQ }, }; - s->flexcan[i].ccm = IMX_CCM(&s->ccm); + object_property_set_link(OBJECT(&s->flexcan[i]), "clock-control-module", + OBJECT(&s->ccm), &error_abort); object_property_set_link(OBJECT(&s->flexcan[i]), "canbus", OBJECT(s->canbus[i]), &error_abort); diff --git a/hw/net/can/flexcan.c b/hw/net/can/flexcan.c index 1ea459d9f6..8f3f066ef5 100644 --- a/hw/net/can/flexcan.c +++ b/hw/net/can/flexcan.c @@ -333,8 +333,6 @@ static uint32_t flexcan_get_bitrate(FlexcanState *s) uint32_t pe_freq, s_freq, bitrate; - assert(s->ccm); - /* s_freq: CAN clock from CCM divided by the prescaler */ pe_freq = imx_ccm_get_clock_frequency(s->ccm, CLK_CAN); s_freq = pe_freq / (1 + conf_presdiv); @@ -1346,6 +1344,12 @@ static void flexcan_realize(DeviceState *dev, Error **errp) } } + if (!s->ccm) { + error_setg(errp, "%s 'clock-control-module' link property not set", + dev->canonical_path); + return; + } + sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->iomem); sysbus_init_irq(SYS_BUS_DEVICE(SYS_BUS_DEVICE(dev)), &s->irq); } @@ -1366,6 +1370,8 @@ static const VMStateDescription vmstate_can = { static const Property flexcan_properties[] = { DEFINE_PROP_LINK("canbus", FlexcanState, canbus, TYPE_CAN_BUS, CanBusState *), + DEFINE_PROP_LINK("clock-control-module", FlexcanState, ccm, TYPE_IMX_CCM, + IMXCCMState *), }; static void flexcan_class_init(ObjectClass *klass, const void *data)