spapr: Implement get_dt_compatible() callback
For devices that cannot be statically initialized, implement a get_dt_compatible() callback that allows us to ask the device for the 'compatible' value. Signed-off-by: Stefan Berger <stefanb@linux.ibm.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Message-Id: <20200121152935.649898-3-stefanb@linux.ibm.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
3688d73b6e
commit
864674fa29
@ -87,6 +87,7 @@ static int vio_make_devnode(SpaprVioDevice *dev,
|
|||||||
SpaprVioDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
|
SpaprVioDeviceClass *pc = VIO_SPAPR_DEVICE_GET_CLASS(dev);
|
||||||
int vdevice_off, node_off, ret;
|
int vdevice_off, node_off, ret;
|
||||||
char *dt_name;
|
char *dt_name;
|
||||||
|
const char *dt_compatible;
|
||||||
|
|
||||||
vdevice_off = fdt_path_offset(fdt, "/vdevice");
|
vdevice_off = fdt_path_offset(fdt, "/vdevice");
|
||||||
if (vdevice_off < 0) {
|
if (vdevice_off < 0) {
|
||||||
@ -113,9 +114,15 @@ static int vio_make_devnode(SpaprVioDevice *dev,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pc->dt_compatible) {
|
if (pc->get_dt_compatible) {
|
||||||
|
dt_compatible = pc->get_dt_compatible(dev);
|
||||||
|
} else {
|
||||||
|
dt_compatible = pc->dt_compatible;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dt_compatible) {
|
||||||
ret = fdt_setprop_string(fdt, node_off, "compatible",
|
ret = fdt_setprop_string(fdt, node_off, "compatible",
|
||||||
pc->dt_compatible);
|
dt_compatible);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -58,6 +58,7 @@ typedef struct SpaprVioDeviceClass {
|
|||||||
void (*realize)(SpaprVioDevice *dev, Error **errp);
|
void (*realize)(SpaprVioDevice *dev, Error **errp);
|
||||||
void (*reset)(SpaprVioDevice *dev);
|
void (*reset)(SpaprVioDevice *dev);
|
||||||
int (*devnode)(SpaprVioDevice *dev, void *fdt, int node_off);
|
int (*devnode)(SpaprVioDevice *dev, void *fdt, int node_off);
|
||||||
|
const char *(*get_dt_compatible)(SpaprVioDevice *dev);
|
||||||
} SpaprVioDeviceClass;
|
} SpaprVioDeviceClass;
|
||||||
|
|
||||||
struct SpaprVioDevice {
|
struct SpaprVioDevice {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user