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 ;-)

Cheers, Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
--
To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to