drm: Introduce drm_connector_register_all() helper
Subsystems (5)
v5 cover drm: Introduce drm_connector_register_all() helper
As a pair to already existing drm_connector_unplug_all()
(which we'll rename in this series to drm_connector_unregister_all()) we're adding generic implementation of what is already done in some drivers for registering all connectors.
After implementation of that new helper we're updating 2 drivers that used to use it's own implementation:
[1] atmel_hlcdc
[2] rcar_du
Other drivers still use load() callback and so should be first modified so their load() gets called from their probe() explicitly.
Build- and run-tested on yet to be upstreamed ARC PGU (part of AXS10x board).
Changes v4 -> v5:
* Added missing mutex unlock on a fail path in drm_connector_register_all() Thanks David for his attention and patience!
Changes v3 -> v4:
* Based on current drm-intel/topic/drm-misc
It's now on commit 6c87e5c3ec6db052f3744804a517b6fb003906e1 And since thet new base already has
"drm: Rename drm_connector_unplug_all() to drm_connector_unregister_all()" this series now only includes 3 subsequent patches.
* In drm_connector_register_all() fail path which calls unregister_all() is moved outside of loop&locked section (as suggested by Daniel)
Changes v2 -> v3:
* Added acks for 1, 3 and 4 patches
* Updated kerneldoc descriptins of both register_ and unregister_all()
* Updated commit messages (mostly spellos and grammar issues)
Changes v1 -> v2:
* Rename drm_connector_unplug_all() to drm_connector_unregister_all()
* Use drm_for_each_connector() instead of list_for_each_entry()
* Updated kerneldoc for drm_dev_register()
Alexey Brodkin (3):
drm: Introduce drm_connector_register_all() helper
drm: atmel_hldc: Use generic drm_connector_register_all() helper
drm: rcar-du: Use generic drm_connector_register_all() helper
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 39 ++------------------------- drivers/gpu/drm/drm_crtc.c | 40 ++++++++++++++++++++++++++++ drivers/gpu/drm/drm_drv.c | 6 ++++- drivers/gpu/drm/rcar-du/rcar_du_drv.c | 9 +------ include/drm/drm_crtc.h | 3 ++- 5 files changed, 50 insertions(+), 47 deletions(-)
Signature · 1 line
2.5.0
PATCH v5 1/3 drm: Introduce drm_connector_register_all() helper
As a pair to already existing drm_connector_unregister_all() we're adding generic implementation of what is already done in some drivers.
Once this helper is implemented we'll be ready to switch existing driver-specific implementations with the generic one.
---
Changes v4 -> v5:
* Added missing mutex unlock on a fail path in drm_connector_register_all(). Thanks David for his attention and patience!
Changes v3 -> v4:
* In drm_connector_register_all() fail path which calls unregister_all() is moved outside of loop&locked section (as suggested by Daniel)
Changes v2 -> v3:
* Updated title with capital after colon
* Simplified failure path with direct and unconditional invocation of unregister_all()
* Updated kerneldoc description of the drm_connector_register_all()
Changes v1 -> v2:
* Rename drm_connector_unplug_all() to drm_connector_unregister_all()
* Use drm_for_each_connector() instead of list_for_each_entry()
* Updated kerneldoc for drm_dev_register()
drivers/gpu/drm/drm_crtc.c | 40 ++++++++++++++++++++++++++++++++++++++++ drivers/gpu/drm/drm_drv.c | 6 +++++- include/drm/drm_crtc.h | 3 ++- 3 files changed, 47 insertions(+), 2 deletions(-)
drivers/gpu/drm/drm_crtc.c +40 -0
@@ -1079,6 +1079,46 @@ void drm_connector_unregister(struct drm_connector *connector)EXPORT_SYMBOL (drm_connector_unregister);/** +* drm_connector_register_all - register all connectors +* @dev: drm device +* +* This function registers all connectors in sysfs and other places so that +* userspace can start to access them. Drivers can call it after calling +* drm_dev_register() to complete the device registration, if they don't call +* drm_connector_register() on each connector individually. +* +* When a device is unplugged and should be removed from userspace access, +* call drm_connector_unregister_all(), which is the inverse of this +* function. +* +* Returns: +* Zero on success, error code on failure. +*/ +int drm_connector_register_all (struct drm_device *dev) +{ +struct drm_connector *connector; +int ret; + +mutex_lock (&dev->mode_config.mutex); + +drm_for_each_connector (connector, dev) { + ret =drm_connector_register (connector); +if (ret) + goto err; + } + +mutex_unlock (&dev->mode_config.mutex); + +return 0 ; + +err: +mutex_unlock (&dev->mode_config.mutex); +drm_connector_unregister_all (dev); +return ret; +} +EXPORT_SYMBOL (drm_connector_register_all); + +/** * drm_connector_unregister_all - unregister connector userspace interfaces * @dev: drm device *
drivers/gpu/drm/drm_drv.c +5 -1
@@ -715,7 +715,11 @@ EXPORT_SYMBOL(drm_dev_unref);* * Register the DRM device @dev with the system, advertise device to user-space * and start normal device operation. @dev must be allocated via drm_dev_alloc() -* previously. +* previously. Right after drm_dev_register() the driver should call +* drm_connector_register_all() to register all connectors in sysfs. This is +* a separate call for backward compatibility with drivers still using +* the deprecated ->load() callback, where connectors are registered from within +* the ->load() callback. * * Never call this twice on any device! *
include/drm/drm_crtc.h +2 -1
@@ -2253,7 +2253,8 @@ void drm_connector_unregister(struct drm_connector *connector);extern void drm_connector_cleanup (struct drm_connector *connector);extern unsigned int drm_connector_index (struct drm_connector *connector); -/* helper to unregister all connectors from sysfs for device */ +/* helpers to {un}register all connectors from sysfs for device */ +extern int drm_connector_register_all (struct drm_device *dev);extern void drm_connector_unregister_all (struct drm_device *dev);extern int drm_bridge_add (struct drm_bridge *bridge);
Signature · 1 line
2.5.0
PATCH v5 2/3 drm: atmel_hldc: Use generic drm_connector_register_all() helper
In reply to Alexey BrodkinThis driver used to have its own implementation of connector_register_all() which actually was taken as a prototype of drm_connector_register_all().
Now when drm_connector_register_all() exists reusing it here.
And while at it replace atmel_hlcdc_dc_connector_unplug_all() with generic drm_connector_unregister_all().
---
No changes v4 -> v5.
No changes v3 -> v4.
Changes v2 -> v3:
* Updated title with capital after colon
* Added ack from Boris
No changes v1 -> v2.
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 39 ++-------------------------- 1 file changed, 2 insertions(+), 37 deletions(-)
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c +2 -37
@@ -584,41 +584,6 @@ static void atmel_hlcdc_dc_unload(struct drm_device *dev)destroy_workqueue (dc->wq); } -static int atmel_hlcdc_dc_connector_plug_all (struct drm_device *dev) -{ -struct drm_connector *connector, *failed; -int ret; - -mutex_lock (&dev->mode_config.mutex); -list_for_each_entry (connector, &dev->mode_config.connector_list, head) { - ret =drm_connector_register (connector); -if (ret) { - failed = connector; - goto err; - } - } -mutex_unlock (&dev->mode_config.mutex); -return 0 ; - -err: -list_for_each_entry (connector, &dev->mode_config.connector_list, head) { -if (failed == connector) -break ; - -drm_connector_unregister (connector); - } -mutex_unlock (&dev->mode_config.mutex); - -return ret; -} - -static void atmel_hlcdc_dc_connector_unplug_all (struct drm_device *dev) -{ -mutex_lock (&dev->mode_config.mutex); -drm_connector_unplug_all (dev); -mutex_unlock (&dev->mode_config.mutex); -} -static void atmel_hlcdc_dc_lastclose (struct drm_device *dev) {struct atmel_hlcdc_dc *dc = dev->dev_private;
@@ -736,7 +701,7 @@ static int atmel_hlcdc_dc_drm_probe(struct platform_device *pdev)if (ret) goto err_unload; - ret =atmel_hlcdc_dc_connector_plug_all (ddev); + ret =drm_connector_register_all (ddev);if (ret) goto err_unregister;
@@ -758,7 +723,7 @@ static int atmel_hlcdc_dc_drm_remove(struct platform_device *pdev) {struct drm_device *ddev =platform_get_drvdata (pdev); -atmel_hlcdc_dc_connector_unplug_all (ddev); +drm_connector_unregister_all (ddev);drm_dev_unregister (ddev);atmel_hlcdc_dc_unload (ddev);drm_dev_unref (ddev);
Signature · 1 line
2.5.0
PATCH v5 3/3 drm: rcar-du: Use generic drm_connector_register_all() helper
In reply to Alexey BrodkinNow that a generic drm_connector_register_all() helper exists we may safely substitute it for the driver-specific implementation of connectors plugging in sysfs.
---
No changes v4 -> v5.
No changes v3 -> v4.
Changes v2 -> v3:
* Updated title with capital after colon
* Updated commit message with fixes of spellos and grammar issues
* Added ack from Laurent
No changes v1 -> v2.
drivers/gpu/drm/rcar-du/rcar_du_drv.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-)
drivers/gpu/drm/rcar-du/rcar_du_drv.c +1 -8
@@ -361,14 +361,7 @@ static int rcar_du_probe(struct platform_device *pdev)if (ret) goto error; -mutex_lock (&ddev->mode_config.mutex); -drm_for_each_connector (connector, ddev) { - ret =drm_connector_register (connector); -if (ret <0 ) -break ; - } -mutex_unlock (&ddev->mode_config.mutex); - + ret =drm_connector_register_all (ddev);if (ret <0 ) goto error;
Signature · 1 line
2.5.0
Hi Alexey,
Quoted 34 lines · On Tue, 29 Mar 2016 13:22:49 +0300 Alexey Brodkin…
As a pair to already existing
drm_connector_unplug_all()
(which we'll rename in this series todrm_connector_unregister_all()) we're adding generic implementation of what is already done in some drivers for registering all connectors.After implementation of that new helper we're updating 2 drivers that used to use it's own implementation:
[1]atmel_hlcdc
[2]rcar_duOther drivers still use
load()callback and so should be first modified so theirload()gets called from theirprobe()explicitly.Build- and run-tested on yet to be upstreamed ARC PGU (part of AXS10x board).
Changes v4 -> v5:
* Added missing mutex unlock on a fail path indrm_connector_register_all()Thanks David for his attention and patience!Changes v3 -> v4:
* Based on current drm-intel/topic/drm-misc
It's now on commit6c87e5c3ec6db052f3744804a517b6fb003906e1And since thet new base already has
"drm: Renamedrm_connector_unplug_all()todrm_connector_unregister_all()" this series now only includes 3 subsequent patches.* In
drm_connector_register_all()fail path which callsunregister_all()is moved outside of loop&locked section (as suggested by Daniel)Changes v2 -> v3:
* Added acks for 1, 3 and 4 patches
* Updated kerneldoc descriptins of bothregister_andunregister_all()
* Updated commit messages (mostly spellos and grammar issues)
Quoted 8 lines
Changes v1 -> v2:
* Renamedrm_connector_unplug_all()todrm_connector_unregister_all()
* Usedrm_for_each_connector()instead oflist_for_each_entry()
* Updated kerneldoc fordrm_dev_register()Cc Daniel Vetter <[email protected]>Cc David Airlie <[email protected]>Cc Boris Brezillon <[email protected]>
Next time, can you please send all the patches of the series, not only the cover letter.
Thanks,
Boris
Signature · 3 lines
Boris Brezillon, Free Electrons Embedded Linux and Kernel engineering http://free-electrons.com
Hi Boris,
Quoted 45 lines · Boris Brezillon
Hi Alexey,
Quoted 40 lines · On Tue, 29 Mar 2016 13:22:49 +-0300 Alexey Brodkin…
As a pair to already existing
drm_connector_unplug_all()
(which we'll rename in this series todrm_connector_unregister_all()) we're adding generic implementation of what is already done in some drivers for registering all connectors.After implementation of that new helper we're updating 2 drivers that used to use it's own implementation:
[1]atmel_hlcdc
[2]rcar_duOther drivers still use
load()callback and so should be first modified so theirload()gets called from theirprobe()explicitly.Build- and run-tested on yet to be upstreamed ARC PGU (part of AXS10x board).
Changes v4 -> v5:
* Added missing mutex unlock on a fail path indrm_connector_register_all()Thanks David for his attention and patience!Changes v3 -> v4:
* Based on current drm-intel/topic/drm-misc
It's now on commit6c87e5c3ec6db052f3744804a517b6fb003906e1And since thet new base already has
"drm: Renamedrm_connector_unplug_all()todrm_connector_unregister_all()" this series now only includes 3 subsequent patches.* In
drm_connector_register_all()fail path which callsunregister_all()is moved outside of loop&locked section (as suggested by Daniel)Changes v2 -> v3:
* Added acks for 1, 3 and 4 patches
* Updated kerneldoc descriptins of bothregister_andunregister_all()
* Updated commit messages (mostly spellos and grammar issues)Changes v1 -> v2:
* Renamedrm_connector_unplug_all()todrm_connector_unregister_all()
* Usedrm_for_each_connector()instead oflist_for_each_entry()
* Updated kerneldoc fordrm_dev_register()
Quoted 5 lines
Quoted 3 lines
Cc Daniel Vetter <[email protected]>Cc David Airlie <[email protected]>Cc Boris Brezillon <[email protected]>Next time, can you please send all the patches of the series, not only the cover letter.
Sure.
It would be so much more convenient if git may add all people mentioned in any patch of series to Cc list for all other patches (+- cover letter). Without that feature one has to add all people in Cc explicitly in each patch.
-Alexey