mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-24 20:50:53 +07:00
2a41e6070d
Subsystems such as ALSA, DRM and others require a single card-level device structure to represent a subsystem. However, firmware tends to describe the individual devices and the connections between them. Therefore, we need a way to gather up the individual component devices together, and indicate when we have all the component devices. We do this in DT by providing a "superdevice" node which specifies the components, eg: imx-drm { compatible = "fsl,drm"; crtcs = <&ipu1>; connectors = <&hdmi>; }; The superdevice is declared into the component support, along with the subcomponents. The superdevice receives callbacks to locate the subcomponents, and identify when all components are present. At this point, we bind the superdevice, which causes the appropriate subsystem to be initialised in the conventional way. When any of the components or superdevice are removed from the system, we unbind the superdevice, thereby taking the subsystem down. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
33 lines
896 B
C
33 lines
896 B
C
#ifndef COMPONENT_H
|
|
#define COMPONENT_H
|
|
|
|
struct device;
|
|
|
|
struct component_ops {
|
|
int (*bind)(struct device *, struct device *, void *);
|
|
void (*unbind)(struct device *, struct device *, void *);
|
|
};
|
|
|
|
int component_add(struct device *, const struct component_ops *);
|
|
void component_del(struct device *, const struct component_ops *);
|
|
|
|
int component_bind_all(struct device *, void *);
|
|
void component_unbind_all(struct device *, void *);
|
|
|
|
struct master;
|
|
|
|
struct component_master_ops {
|
|
int (*add_components)(struct device *, struct master *);
|
|
int (*bind)(struct device *);
|
|
void (*unbind)(struct device *);
|
|
};
|
|
|
|
int component_master_add(struct device *, const struct component_master_ops *);
|
|
void component_master_del(struct device *,
|
|
const struct component_master_ops *);
|
|
|
|
int component_master_add_child(struct master *master,
|
|
int (*compare)(struct device *, void *), void *compare_data);
|
|
|
|
#endif
|