@samitouri / QOSamiQemu / commits / a12368aec4

hw/net/can/flexcan: Subclass TYPE_CAN_FLEXCAN

Subclass TYPE_CAN_FLEXCAN, yielding TYPE_CAN_FLEXCAN2 and TYPE_CAN_FLEXCAN3. Since TYPE_CAN_FLEXCAN is now abstract, TYPE_FSL_IMX6 needs to use TYPE_CAN_FLEXCAN2. TYPE_CAN_FLEXCAN3 will be used in TYPE_FSL_IMX8MP. Signed-off-by: Bernhard Beschow <shentey@gmail.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com> Acked-by: Pavel Pisa <pisa@fel.cvut.cz> Tested-by: Pavel Pisa <pisa@fel.cvut.cz> Message-ID: <20260702184038.178196-3-shentey@gmail.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>

Bernhard Beschow committed Jul 2, 2026 at 20:40 UTC a12368aec4b49b73f090dfbc3eb3653f1b54afa8
3 files changed +68 -16
hw/arm/fsl-imx6.c
+1 -1
@@ -92,7 +92,7 @@ static void fsl_imx6_init(Object *obj)
92 }
93 for (i = 0; i < FSL_IMX6_NUM_CANS; i++) {
94 snprintf(name, NAME_SIZE, "flexcan%d", i + 1);
95 - object_initialize_child(obj, name, &s->flexcan[i], TYPE_CAN_FLEXCAN);
95 + object_initialize_child(obj, name, &s->flexcan[i], TYPE_CAN_FLEXCAN2);
96 }
97 for (i = 0; i < FSL_IMX6_NUM_WDTS; i++) {
98 snprintf(name, NAME_SIZE, "wdt%d", i);
hw/net/can/flexcan.c
+64 -14
@@ -1290,7 +1290,7 @@ static bool flexcan_mem_accepts(void *opaque, hwaddr addr,
1290 return true;
1291 }
1292
1293 -static const struct MemoryRegionOps flexcan_ops = {
1293 +static const struct MemoryRegionOps flexcan2_ops = {
1294 .read = flexcan_mem_read,
1295 .write = flexcan_mem_write,
1296 .endianness = DEVICE_LITTLE_ENDIAN,
@@ -1307,6 +1307,23 @@ static const struct MemoryRegionOps flexcan_ops = {
1307 },
1308 };
1309
1310 +static const struct MemoryRegionOps flexcan3_ops = {
1311 + .read = flexcan_mem_read,
1312 + .write = flexcan_mem_write,
1313 + .endianness = DEVICE_LITTLE_ENDIAN,
1314 + .valid = {
1315 + .min_access_size = 1,
1316 + .max_access_size = 8,
1317 + .unaligned = true,
1318 + .accepts = flexcan_mem_accepts
1319 + },
1320 + .impl = {
1321 + .min_access_size = 4,
1322 + .max_access_size = 4,
1323 + .unaligned = false
1324 + },
1325 +};
1326 +
1327 static CanBusClientInfo flexcan_bus_client_info = {
1328 .can_receive = flexcan_can_receive,
1329 .receive = flexcan_receive,
@@ -1322,16 +1339,26 @@ static int flexcan_connect_to_bus(FlexcanState *s, CanBusState *bus)
1339 return 0;
1340 }
1341
1325 -static void flexcan_init(Object *obj)
1342 +static void flexcan2_init(Object *obj)
1343 {
1344 FlexcanState *s = CAN_FLEXCAN(obj);
1345
1346 memory_region_init_io(
1330 - &s->iomem, obj, &flexcan_ops, s, TYPE_CAN_FLEXCAN,
1347 + &s->iomem, obj, &flexcan2_ops, s, TYPE_CAN_FLEXCAN2,
1348 offsetof(FlexcanRegs, _reserved6)
1349 );
1350 }
1351
1352 +static void flexcan3_init(Object *obj)
1353 +{
1354 + FlexcanState *s = CAN_FLEXCAN(obj);
1355 +
1356 + memory_region_init_io(
1357 + &s->iomem, obj, &flexcan3_ops, s, TYPE_CAN_FLEXCAN3,
1358 + sizeof(FlexcanRegs)
1359 + );
1360 +}
1361 +
1362 static void flexcan_realize(DeviceState *dev, Error **errp)
1363 {
1364 FlexcanState *s = CAN_FLEXCAN(dev);
@@ -1384,19 +1411,42 @@ static void flexcan_class_init(ObjectClass *klass, const void *data)
1411 dc->realize = flexcan_realize;
1412 device_class_set_props(dc, flexcan_properties);
1413 dc->vmsd = &vmstate_can;
1387 - dc->desc = "i.MX FLEXCAN Controller";
1414 }
1415
1390 -static const TypeInfo flexcan_info = {
1391 - .name = TYPE_CAN_FLEXCAN,
1392 - .parent = TYPE_SYS_BUS_DEVICE,
1393 - .instance_size = sizeof(FlexcanState),
1394 - .class_init = flexcan_class_init,
1395 - .instance_init = flexcan_init,
1396 -};
1416 +static void flexcan2_class_init(ObjectClass *klass, const void *data)
1417 +{
1418 + DeviceClass *dc = DEVICE_CLASS(klass);
1419 +
1420 + dc->desc = "i.MX FlexCAN 2 Controller";
1421 +}
1422
1398 -static void can_register_types(void)
1423 +static void flexcan3_class_init(ObjectClass *klass, const void *data)
1424 {
1400 - type_register_static(&flexcan_info);
1425 + DeviceClass *dc = DEVICE_CLASS(klass);
1426 +
1427 + dc->desc = "i.MX FlexCAN 3 Controller";
1428 }
1402 -type_init(can_register_types)
1429 +
1430 +static const TypeInfo flexcan_types[] = {
1431 + {
1432 + .name = TYPE_CAN_FLEXCAN,
1433 + .parent = TYPE_SYS_BUS_DEVICE,
1434 + .instance_size = sizeof(FlexcanState),
1435 + .class_init = flexcan_class_init,
1436 + .abstract = true,
1437 + },
1438 + {
1439 + .name = TYPE_CAN_FLEXCAN2,
1440 + .parent = TYPE_CAN_FLEXCAN,
1441 + .class_init = flexcan2_class_init,
1442 + .instance_init = flexcan2_init,
1443 + },
1444 + {
1445 + .name = TYPE_CAN_FLEXCAN3,
1446 + .parent = TYPE_CAN_FLEXCAN,
1447 + .class_init = flexcan3_class_init,
1448 + .instance_init = flexcan3_init,
1449 + },
1450 +};
1451 +
1452 +DEFINE_TYPES(flexcan_types)
include/hw/net/flexcan.h
+3 -1
@@ -139,7 +139,9 @@ typedef struct FlexcanState {
139 } FlexcanState;
140
141 #define TYPE_CAN_FLEXCAN "flexcan"
142 -
142 OBJECT_DECLARE_SIMPLE_TYPE(FlexcanState, CAN_FLEXCAN);
143
144 +#define TYPE_CAN_FLEXCAN2 "flexcan2"
145 +#define TYPE_CAN_FLEXCAN3 "flexcan3"
146 +
147 #endif