On Fri, Oct 31, 2014 at 04:51:43PM +0100, Daniel Vetter wrote: > On Wed, Oct 29, 2014 at 10:14:37AM +0100, Thierry Reding wrote: > > On Wed, Oct 29, 2014 at 09:57:02AM +0100, Daniel Vetter wrote: > > > That makes the entire thing a bit non-trivial, which is why I think it > > > would be better as some generic helper. Which then gets embedded or > > > instantiated for specific cases, like dt&drm_panel or dt&drm_bridge. > > > Or maybe even acpi&drm_bridge, who knows ;-) > > > > I worry a little about type safety. How will this generic helper know > > what registry to look in for? Or conversely, if all these resources are > > added to a single registry how do you know that they're of the correct > > type? Failing to ensure this could cause situations where you're asking > > for a panel and get a bridge in return because you've wrongly wired it > > up in device tree for example. > > > > But perhaps if both the registry and the device parts are turned into > > helpers we could still have a single core implementation and then > > instantiate that for each type, something roughly like this: > > > > struct registry { > > struct list_head list; > > struct mutex lock; > > }; > > > > struct registry_record { > > struct list_head list; > > struct module *owner; > > struct kref *ref; > > > > struct device *dev; > > }; > > > > int registry_add(struct registry *registry, struct registry_record *record) > > { > > ... > > try_module_get(record->owner); > > ... > > } > > > > struct registry_record *registry_find_by_of_node(struct registry *registry, > > struct device_node *np) > > { > > ... > > kref_get(...); > > ... > > } > > > > That way it should be possible to embed these into other structures, > > like so: > > > > struct drm_panel { > > struct registry_record record; > > ... > > }; > > > > static struct registry drm_panels; > > > > int drm_panel_add(struct drm_panel *panel) > > { > > return registry_add(&drm_panels, &panel->record); > > } > > > > struct drm_panel *of_drm_panel_find(struct device_node *np) > > { > > struct registry_record *record; > > > > record = registry_find_by_of_node(&drm_panels, np); > > > > return container_of(record, struct drm_panel, record); > > } > > > > Is that what you had in mind? > > Yeah I've thought that we should instantiate using macros even, so that we > have per-type registries. So you'd smash the usual set of > DECLARE/DEFINE_AUX_DEV_REGISTRY into headers/source files, and they'd take > a (name, key, value) tripled. For the example here(of_drm_panel, struct > device_node *, struct drm_panel *) or similar. I might be hand-waving over > a few too many details though ;-) Okay, I'll take a stab at this and see if I can convert DRM panel to it. Thierry
Attachment:
pgpDvimVNv24x.pgp
Description: PGP signature
_______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel