From b93c846273b9eda820f618a07d8871e20639e0b9 Mon Sep 17 00:00:00 2001 From: Daniel Vetter Date: Fri, 6 May 2016 10:28:41 +0200 Subject: drm/hisilicon: Use drm_connector_register_all Use drm_connector_register_all helper to register connectors. Cc: Xinliang Liu Cc: Xinwei Kong Signed-off-by: Daniel Vetter diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c index e102c9e..bc410ee 100644 --- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c +++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c @@ -201,35 +201,6 @@ static int compare_of(struct device *dev, void *data) return dev->of_node == data; } -static int kirin_drm_connectors_register(struct drm_device *dev) -{ - struct drm_connector *connector; - struct drm_connector *failed_connector; - int ret; - - mutex_lock(&dev->mode_config.mutex); - drm_for_each_connector(connector, dev) { - ret = drm_connector_register(connector); - if (ret) { - failed_connector = connector; - goto err; - } - } - mutex_unlock(&dev->mode_config.mutex); - - return 0; - -err: - drm_for_each_connector(connector, dev) { - if (failed_connector == connector) - break; - drm_connector_unregister(connector); - } - mutex_unlock(&dev->mode_config.mutex); - - return ret; -} - static int kirin_drm_bind(struct device *dev) { struct drm_driver *driver = &kirin_drm_driver; @@ -251,7 +222,7 @@ static int kirin_drm_bind(struct device *dev) goto err_kms_cleanup; /* connectors should be registered after drm device register */ - ret = kirin_drm_connectors_register(drm_dev); + ret = drm_connector_register_all(drm_dev); if (ret) goto err_drm_dev_unregister; -- cgit v0.10.2 From 12cb4c87aa587ff476ffc71120f2dc5d2e857256 Mon Sep 17 00:00:00 2001 From: Xinliang Liu Date: Sun, 8 May 2016 17:48:55 +0800 Subject: drm/hisilicon: Make kirin_drm_unbind sufficient Remove deprecated drm_put_dev. Clean up everything needed in unbind. Thanks to Daniel Vetter, this issue is reported by him. Acked-by: Daniel Vetter Reported-by: Daniel Vetter Signed-off-by: Xinliang Liu diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c index bc410ee..3f94785 100644 --- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c +++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c @@ -244,7 +244,12 @@ err_drm_dev_unref: static void kirin_drm_unbind(struct device *dev) { - drm_put_dev(dev_get_drvdata(dev)); + struct drm_device *drm_dev = dev_get_drvdata(dev); + + drm_connector_unregister_all(drm_dev); + drm_dev_unregister(drm_dev); + kirin_drm_kms_cleanup(drm_dev); + drm_dev_unref(drm_dev); } static const struct component_master_ops kirin_drm_ops = { -- cgit v0.10.2 From 165cccc8437704d9f41eae2946774bdf2966245f Mon Sep 17 00:00:00 2001 From: Xinliang Liu Date: Mon, 9 May 2016 09:59:50 +0800 Subject: drm/hisilicon: Fix DRM_INFO printed issue MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch fixed the bellow no DRM_INFO is printed issue: if (!delay_count) DRM_INFO("phylock and phystopstateclklane is not ready.\n"); There will some printed issues with above info, under certain circumstances: If ((BIT(0) | BIT(2)) & val) is never true, break will not happen and delay_count will be max u32 value (?), and no DRM_INFO is printed. Also if ((BIT(0) | BIT(2)) & val) is true at the last possible loop round, break happens, but now delay_count is already zero ( because of earlier delay_count-- ) and DRM_INFO is erroneously printed. Thanks to Juha Leppänen, he reports to me this issue. Signed-off-by: Xinliang Liu Reported-by: Juha Leppänen diff --git a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c index bfbc215..998452a 100644 --- a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c +++ b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c @@ -430,12 +430,13 @@ static void dsi_set_mipi_phy(void __iomem *base, * wait for phy's clock ready */ delay_count = 100; - while (delay_count--) { + while (delay_count) { val = readl(base + PHY_STATUS); if ((BIT(0) | BIT(2)) & val) break; udelay(1); + delay_count--; } if (!delay_count) -- cgit v0.10.2