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