@@ -740,20 +740,20 @@ static const VMStateDescription aspeed_i2c_vmstate = {
740
740
741
741
static void aspeed_i2c_reset (DeviceState * dev )
742
742
{
743
- int i ;
744
743
AspeedI2CState * s = ASPEED_I2C (dev );
745
- AspeedI2CClass * aic = ASPEED_I2C_GET_CLASS (s );
746
744
747
745
s -> intr_status = 0 ;
746
+ }
747
+
748
+ static void aspeed_i2c_instance_init (Object * obj )
749
+ {
750
+ AspeedI2CState * s = ASPEED_I2C (obj );
751
+ AspeedI2CClass * aic = ASPEED_I2C_GET_CLASS (s );
752
+ int i ;
748
753
749
754
for (i = 0 ; i < aic -> num_busses ; i ++ ) {
750
- s -> busses [i ].intr_ctrl = 0 ;
751
- s -> busses [i ].intr_status = 0 ;
752
- s -> busses [i ].cmd = 0 ;
753
- s -> busses [i ].buf = 0 ;
754
- s -> busses [i ].dma_addr = 0 ;
755
- s -> busses [i ].dma_len = 0 ;
756
- i2c_end_transfer (s -> busses [i ].bus );
755
+ object_initialize_child (obj , "bus[*]" , & s -> busses [i ],
756
+ TYPE_ASPEED_I2C_BUS );
757
757
}
758
758
}
759
759
@@ -791,17 +791,21 @@ static void aspeed_i2c_realize(DeviceState *dev, Error **errp)
791
791
sysbus_init_mmio (sbd , & s -> iomem );
792
792
793
793
for (i = 0 ; i < aic -> num_busses ; i ++ ) {
794
- char name [ 32 ] ;
794
+ Object * bus = OBJECT ( & s -> busses [ i ]) ;
795
795
int offset = i < aic -> gap ? 1 : 5 ;
796
796
797
- sysbus_init_irq (sbd , & s -> busses [i ].irq );
798
- snprintf (name , sizeof (name ), "aspeed.i2c.%d" , i );
799
- s -> busses [i ].controller = s ;
800
- s -> busses [i ].id = i ;
801
- s -> busses [i ].bus = i2c_init_bus (dev , name );
802
- memory_region_init_io (& s -> busses [i ].mr , OBJECT (dev ),
803
- & aspeed_i2c_bus_ops , & s -> busses [i ], name ,
804
- aic -> reg_size );
797
+ if (!object_property_set_link (bus , "controller" , OBJECT (s ), errp )) {
798
+ return ;
799
+ }
800
+
801
+ if (!object_property_set_uint (bus , "bus-id" , i , errp )) {
802
+ return ;
803
+ }
804
+
805
+ if (!sysbus_realize (SYS_BUS_DEVICE (bus ), errp )) {
806
+ return ;
807
+ }
808
+
805
809
memory_region_add_subregion (& s -> iomem , aic -> reg_size * (i + offset ),
806
810
& s -> busses [i ].mr );
807
811
}
@@ -841,12 +845,72 @@ static void aspeed_i2c_class_init(ObjectClass *klass, void *data)
841
845
static const TypeInfo aspeed_i2c_info = {
842
846
.name = TYPE_ASPEED_I2C ,
843
847
.parent = TYPE_SYS_BUS_DEVICE ,
848
+ .instance_init = aspeed_i2c_instance_init ,
844
849
.instance_size = sizeof (AspeedI2CState ),
845
850
.class_init = aspeed_i2c_class_init ,
846
851
.class_size = sizeof (AspeedI2CClass ),
847
852
.abstract = true,
848
853
};
849
854
855
+ static void aspeed_i2c_bus_reset (DeviceState * dev )
856
+ {
857
+ AspeedI2CBus * s = ASPEED_I2C_BUS (dev );
858
+
859
+ s -> intr_ctrl = 0 ;
860
+ s -> intr_status = 0 ;
861
+ s -> cmd = 0 ;
862
+ s -> buf = 0 ;
863
+ s -> dma_addr = 0 ;
864
+ s -> dma_len = 0 ;
865
+ i2c_end_transfer (s -> bus );
866
+ }
867
+
868
+ static void aspeed_i2c_bus_realize (DeviceState * dev , Error * * errp )
869
+ {
870
+ AspeedI2CBus * s = ASPEED_I2C_BUS (dev );
871
+ AspeedI2CClass * aic ;
872
+ g_autofree char * name = g_strdup_printf (TYPE_ASPEED_I2C_BUS ".%d" , s -> id );
873
+
874
+ if (!s -> controller ) {
875
+ error_setg (errp , TYPE_ASPEED_I2C_BUS ": 'controller' link not set" );
876
+ return ;
877
+ }
878
+
879
+ aic = ASPEED_I2C_GET_CLASS (s -> controller );
880
+
881
+ sysbus_init_irq (SYS_BUS_DEVICE (dev ), & s -> irq );
882
+
883
+ s -> bus = i2c_init_bus (dev , name );
884
+
885
+ memory_region_init_io (& s -> mr , OBJECT (s ), & aspeed_i2c_bus_ops ,
886
+ s , name , aic -> reg_size );
887
+ sysbus_init_mmio (SYS_BUS_DEVICE (dev ), & s -> mr );
888
+ }
889
+
890
+ static Property aspeed_i2c_bus_properties [] = {
891
+ DEFINE_PROP_UINT8 ("bus-id" , AspeedI2CBus , id , 0 ),
892
+ DEFINE_PROP_LINK ("controller" , AspeedI2CBus , controller , TYPE_ASPEED_I2C ,
893
+ AspeedI2CState * ),
894
+ DEFINE_PROP_END_OF_LIST (),
895
+ };
896
+
897
+ static void aspeed_i2c_bus_class_init (ObjectClass * klass , void * data )
898
+ {
899
+ DeviceClass * dc = DEVICE_CLASS (klass );
900
+
901
+ dc -> desc = "Aspeed I2C Bus" ;
902
+ dc -> realize = aspeed_i2c_bus_realize ;
903
+ dc -> reset = aspeed_i2c_bus_reset ;
904
+ device_class_set_props (dc , aspeed_i2c_bus_properties );
905
+ }
906
+
907
+ static const TypeInfo aspeed_i2c_bus_info = {
908
+ .name = TYPE_ASPEED_I2C_BUS ,
909
+ .parent = TYPE_SYS_BUS_DEVICE ,
910
+ .instance_size = sizeof (AspeedI2CBus ),
911
+ .class_init = aspeed_i2c_bus_class_init ,
912
+ };
913
+
850
914
static qemu_irq aspeed_2400_i2c_bus_get_irq (AspeedI2CBus * bus )
851
915
{
852
916
return bus -> controller -> irq ;
@@ -951,6 +1015,7 @@ static const TypeInfo aspeed_2600_i2c_info = {
951
1015
952
1016
static void aspeed_i2c_register_types (void )
953
1017
{
1018
+ type_register_static (& aspeed_i2c_bus_info );
954
1019
type_register_static (& aspeed_i2c_info );
955
1020
type_register_static (& aspeed_2400_i2c_info );
956
1021
type_register_static (& aspeed_2500_i2c_info );
0 commit comments