From patchwork Thu Sep 17 14:57:55 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Anholt X-Patchwork-Id: 7208261 X-Patchwork-Delegate: agross@codeaurora.org Return-Path: X-Original-To: patchwork-linux-arm-msm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id D45579F336 for ; Thu, 17 Sep 2015 14:58:09 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id BF7C520831 for ; Thu, 17 Sep 2015 14:58:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 76625207EB for ; Thu, 17 Sep 2015 14:58:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751814AbbIQO6F (ORCPT ); Thu, 17 Sep 2015 10:58:05 -0400 Received: from gabe.freedesktop.org ([131.252.210.177]:41615 "EHLO gabe.freedesktop.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751782AbbIQO6E (ORCPT ); Thu, 17 Sep 2015 10:58:04 -0400 Received: from annarchy.freedesktop.org (annarchy.freedesktop.org [131.252.210.176]) by gabe.freedesktop.org (Postfix) with ESMTP id 2B9536E6C0; Thu, 17 Sep 2015 07:58:03 -0700 (PDT) Received: from eliezer.anholt.net (annarchy.freedesktop.org [127.0.0.1]) by annarchy.freedesktop.org (Postfix) with ESMTP id 0AEDD182BA; Thu, 17 Sep 2015 07:58:03 -0700 (PDT) Received: by eliezer.anholt.net (Postfix, from userid 1000) id 6C648F0008B; Thu, 17 Sep 2015 07:57:58 -0700 (PDT) From: Eric Anholt To: dri-devel@lists.freedesktop.org Cc: linux-kernel@vger.kernel.org, David Airlie , Inki Dae , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , linux-arm-msm@vger.kernel.org, Rob Clark , Eric Anholt Subject: [PATCH v2 1/4] drm: Put platform driver registration/unregistration loops in core. Date: Thu, 17 Sep 2015 10:57:55 -0400 Message-Id: <1442501878-9037-1-git-send-email-eric@anholt.net> X-Mailer: git-send-email 2.1.4 Sender: linux-arm-msm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-arm-msm@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This is mostly just a move of the code from exynos, with a slight reformat. I wanted to do a similar thing for vc4, and msm looks like a good candidate as well. Signed-off-by: Eric Anholt --- v2: Move to the KMS helper config flag, and add our kerneldoc to drm.tmpl (under the "Driver Initialization" section), as requested by danvet. Move to drm_platform_helper.c instead of _helpers.c to be consistent with other files. Documentation/DocBook/drm.tmpl | 4 +++ drivers/gpu/drm/Makefile | 3 +- drivers/gpu/drm/drm_platform_helper.c | 53 +++++++++++++++++++++++++++++++++ drivers/gpu/drm/exynos/exynos_drm_drv.c | 38 ++++------------------- include/drm/drmP.h | 4 +++ 5 files changed, 69 insertions(+), 33 deletions(-) create mode 100644 drivers/gpu/drm/drm_platform_helper.c diff --git a/Documentation/DocBook/drm.tmpl b/Documentation/DocBook/drm.tmpl index 9ddf8c6..1678d8f 100644 --- a/Documentation/DocBook/drm.tmpl +++ b/Documentation/DocBook/drm.tmpl @@ -465,6 +465,10 @@ char *date; + + Platform Helper Functions Reference +!Edrivers/gpu/drm/drm_platform_helper.c + diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile index 45e7719..8e3f251 100644 --- a/drivers/gpu/drm/Makefile +++ b/drivers/gpu/drm/Makefile @@ -21,7 +21,8 @@ drm-$(CONFIG_DRM_PANEL) += drm_panel.o drm-$(CONFIG_OF) += drm_of.o drm_kms_helper-y := drm_crtc_helper.o drm_dp_helper.o drm_probe_helper.o \ - drm_plane_helper.o drm_dp_mst_topology.o drm_atomic_helper.o + drm_plane_helper.o drm_dp_mst_topology.o drm_atomic_helper.o \ + drm_platform_helper.o drm_kms_helper-$(CONFIG_DRM_LOAD_EDID_FIRMWARE) += drm_edid_load.o drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o drm_kms_helper-$(CONFIG_DRM_KMS_CMA_HELPER) += drm_fb_cma_helper.o diff --git a/drivers/gpu/drm/drm_platform_helper.c b/drivers/gpu/drm/drm_platform_helper.c new file mode 100644 index 0000000..450846f --- /dev/null +++ b/drivers/gpu/drm/drm_platform_helper.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2011 Samsung Electronics Co., Ltd. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + */ + +#include + +/** + * drm_platform_register_drivers - Helper to register an array of + * struct platform_drivers wth platform_driver_register(). + * @drv: array of platform drivers to register + * @count: number of drivers in the array + * + * Use drm_platform_unregister_drivers() to undo this. + * + * Return: 0 on success, -errno value from the last + * platform_driver_register otherwise. + */ +int drm_platform_register_drivers(struct platform_driver *const *drv, + int count) +{ + int i, ret; + + for (i = 0; i < count; ++i) { + ret = platform_driver_register(drv[i]); + if (ret) { + while (--i >= 0) + platform_driver_unregister(drv[i]); + return ret; + } + } + + return 0; +} +EXPORT_SYMBOL_GPL(drm_platform_register_drivers); + +/** + * drm_platform_unregister_drivers - Helper to unregister an array of + * struct platform_drivers. + * @drv: array of platform drivers to unregister + * @count: number of drivers in the array + */ +void drm_platform_unregister_drivers(struct platform_driver *const *drv, + int count) +{ + while (--count >= 0) + platform_driver_unregister(drv[count]); +} +EXPORT_SYMBOL_GPL(drm_platform_unregister_drivers); diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index fa5194c..83f829b 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c @@ -520,53 +520,27 @@ static int exynos_drm_register_devices(void) return 0; } -static void exynos_drm_unregister_drivers(struct platform_driver * const *drv, - int count) -{ - while (--count >= 0) - platform_driver_unregister(drv[count]); -} - -static int exynos_drm_register_drivers(struct platform_driver * const *drv, - int count) -{ - int i, ret; - - for (i = 0; i < count; ++i) { - ret = platform_driver_register(drv[i]); - if (!ret) - continue; - - while (--i >= 0) - platform_driver_unregister(drv[i]); - - return ret; - } - - return 0; -} - static inline int exynos_drm_register_kms_drivers(void) { - return exynos_drm_register_drivers(exynos_drm_kms_drivers, - ARRAY_SIZE(exynos_drm_kms_drivers)); + return drm_platform_register_drivers(exynos_drm_kms_drivers, + ARRAY_SIZE(exynos_drm_kms_drivers)); } static inline int exynos_drm_register_non_kms_drivers(void) { - return exynos_drm_register_drivers(exynos_drm_non_kms_drivers, - ARRAY_SIZE(exynos_drm_non_kms_drivers)); + return drm_platform_register_drivers(exynos_drm_non_kms_drivers, + ARRAY_SIZE(exynos_drm_non_kms_drivers)); } static inline void exynos_drm_unregister_kms_drivers(void) { - exynos_drm_unregister_drivers(exynos_drm_kms_drivers, + drm_platform_unregister_drivers(exynos_drm_kms_drivers, ARRAY_SIZE(exynos_drm_kms_drivers)); } static inline void exynos_drm_unregister_non_kms_drivers(void) { - exynos_drm_unregister_drivers(exynos_drm_non_kms_drivers, + drm_platform_unregister_drivers(exynos_drm_non_kms_drivers, ARRAY_SIZE(exynos_drm_non_kms_drivers)); } diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 8b5ce7c..a774574 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -1087,6 +1087,10 @@ extern int drm_pcie_get_speed_cap_mask(struct drm_device *dev, u32 *speed_mask); /* platform section */ extern int drm_platform_init(struct drm_driver *driver, struct platform_device *platform_device); extern int drm_platform_set_busid(struct drm_device *d, struct drm_master *m); +int drm_platform_register_drivers(struct platform_driver *const *drv, + int count); +void drm_platform_unregister_drivers(struct platform_driver *const *drv, + int count); /* returns true if currently okay to sleep */ static __inline__ bool drm_can_sleep(void)