From: Russell King <rmk+kernel@xxxxxxxxxxxxxxxx> Hold the mutex while calling component_{un,}bind_all() so that components can perform initialisation in their bind and unbind callbacks from the component helper. Signed-off-by: Russell King <rmk+kernel@xxxxxxxxxxxxxxxx> --- drivers/staging/etnaviv/etnaviv_drv.c | 11 ++++++----- drivers/staging/etnaviv/etnaviv_gpu.c | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/drivers/staging/etnaviv/etnaviv_drv.c b/drivers/staging/etnaviv/etnaviv_drv.c index 4bef6542daf3..2eb33d0074aa 100644 --- a/drivers/staging/etnaviv/etnaviv_drv.c +++ b/drivers/staging/etnaviv/etnaviv_drv.c @@ -99,10 +99,11 @@ static int etnaviv_unload(struct drm_device *dev) if (g) etnaviv_gpu_pm_suspend(g); } - mutex_unlock(&dev->struct_mutex); component_unbind_all(dev->dev, dev); + mutex_unlock(&dev->struct_mutex); + dev->dev_private = NULL; kfree(priv); @@ -116,8 +117,6 @@ static void load_gpu(struct drm_device *dev) struct etnaviv_drm_private *priv = dev->dev_private; unsigned int i; - mutex_lock(&dev->struct_mutex); - for (i = 0; i < ETNA_MAX_PIPES; i++) { struct etnaviv_gpu *g = priv->gpu[i]; @@ -132,8 +131,6 @@ static void load_gpu(struct drm_device *dev) } } } - - mutex_unlock(&dev->struct_mutex); } static int etnaviv_load(struct drm_device *dev, unsigned long flags) @@ -157,12 +154,16 @@ static int etnaviv_load(struct drm_device *dev, unsigned long flags) platform_set_drvdata(pdev, dev); + mutex_lock(&dev->struct_mutex); + err = component_bind_all(dev->dev, dev); if (err < 0) return err; load_gpu(dev); + mutex_unlock(&dev->struct_mutex); + return 0; } diff --git a/drivers/staging/etnaviv/etnaviv_gpu.c b/drivers/staging/etnaviv/etnaviv_gpu.c index 7f041a261d54..6492214865b9 100644 --- a/drivers/staging/etnaviv/etnaviv_gpu.c +++ b/drivers/staging/etnaviv/etnaviv_gpu.c @@ -991,7 +991,7 @@ static void etnaviv_gpu_unbind(struct device *dev, struct device *master, WARN_ON(!list_empty(&gpu->active_list)); if (gpu->buffer) { - drm_gem_object_unreference_unlocked(gpu->buffer); + drm_gem_object_unreference(gpu->buffer); gpu->buffer = NULL; } -- 2.1.4 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/dri-devel