From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754000AbbLJMmA (ORCPT ); Thu, 10 Dec 2015 07:42:00 -0500 Received: from smtp.codeaurora.org ([198.145.29.96]:36492 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753286AbbLJMl5 (ORCPT ); Thu, 10 Dec 2015 07:41:57 -0500 From: Archit Taneja To: dri-devel@lists.freedesktop.org, a.hajda@samsung.com, jani.nikula@linux.intel.com Cc: linux-kernel@vger.kernel.org, airlied@linux.ie, daniel@ffwll.ch, treding@nvidia.com, l.stach@pengutronix.de, robh@kernel.org, linux-arm-msm@vger.kernel.org, Archit Taneja Subject: [PATCH v4 2/6] drm/dsi: Refactor device creation Date: Thu, 10 Dec 2015 18:11:36 +0530 Message-Id: <1449751300-2841-3-git-send-email-architt@codeaurora.org> X-Mailer: git-send-email 1.8.2.1 In-Reply-To: <1449751300-2841-1-git-send-email-architt@codeaurora.org> References: <1448884892-7731-1-git-send-email-architt@codeaurora.org> <1449751300-2841-1-git-send-email-architt@codeaurora.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Simplify the mipi dsi device creation process. device_initialize and device_add don't need to be called separately when creating mipi_dsi_device's. Use device_register instead to simplify things. Create a helper function mipi_dsi_device_new which takes in struct mipi_dsi_device_info and mipi_dsi_host. It clubs the functions mipi_dsi_device_alloc and mipi_dsi_device_add into one. mipi_dsi_device_info acts as a template to populate the dsi device information. This is populated by of_mipi_dsi_device_add and passed to mipi_dsi_device_new. Later on, we'll provide mipi_dsi_device_new as a standalone way to create a dsi device not available via DT. The new device creation process tries to closely follow what's been done in i2c_new_device in i2c-core. Reviewed-by: Andrzej Hajda Signed-off-by: Archit Taneja --- drivers/gpu/drm/drm_mipi_dsi.c | 61 +++++++++++++++++------------------------- include/drm/drm_mipi_dsi.h | 15 +++++++++++ 2 files changed, 40 insertions(+), 36 deletions(-) diff --git a/drivers/gpu/drm/drm_mipi_dsi.c b/drivers/gpu/drm/drm_mipi_dsi.c index bced235..9434585 100644 --- a/drivers/gpu/drm/drm_mipi_dsi.c +++ b/drivers/gpu/drm/drm_mipi_dsi.c @@ -102,9 +102,18 @@ static const struct device_type mipi_dsi_device_type = { .release = mipi_dsi_dev_release, }; -static struct mipi_dsi_device *mipi_dsi_device_alloc(struct mipi_dsi_host *host) +struct mipi_dsi_device *mipi_dsi_device_new(struct mipi_dsi_host *host, + struct mipi_dsi_device_info *info) { struct mipi_dsi_device *dsi; + struct device *dev = host->dev; + int ret; + + if (info->reg > 3) { + dev_err(dev, "device node has invalid reg property: %u\n", + info->reg); + return ERR_PTR(-EINVAL); + } dsi = kzalloc(sizeof(*dsi), GFP_KERNEL); if (!dsi) @@ -114,27 +123,28 @@ static struct mipi_dsi_device *mipi_dsi_device_alloc(struct mipi_dsi_host *host) dsi->dev.bus = &mipi_dsi_bus_type; dsi->dev.parent = host->dev; dsi->dev.type = &mipi_dsi_device_type; + dsi->dev.of_node = info->node; + dsi->channel = info->reg; - device_initialize(&dsi->dev); - - return dsi; -} - -static int mipi_dsi_device_add(struct mipi_dsi_device *dsi) -{ - struct mipi_dsi_host *host = dsi->host; + dev_set_name(&dsi->dev, "%s.%d", dev_name(host->dev), info->reg); - dev_set_name(&dsi->dev, "%s.%d", dev_name(host->dev), dsi->channel); + ret = device_register(&dsi->dev); + if (ret) { + dev_err(dev, "failed to register device: %d\n", ret); + kfree(dsi); + return ERR_PTR(ret); + } - return device_add(&dsi->dev); + return dsi; } +EXPORT_SYMBOL(mipi_dsi_device_new); #if IS_ENABLED(CONFIG_OF) static struct mipi_dsi_device * of_mipi_dsi_device_add(struct mipi_dsi_host *host, struct device_node *node) { - struct mipi_dsi_device *dsi; struct device *dev = host->dev; + struct mipi_dsi_device_info info = { }; int ret; u32 reg; @@ -145,31 +155,10 @@ of_mipi_dsi_device_add(struct mipi_dsi_host *host, struct device_node *node) return ERR_PTR(-EINVAL); } - if (reg > 3) { - dev_err(dev, "device node %s has invalid reg property: %u\n", - node->full_name, reg); - return ERR_PTR(-EINVAL); - } - - dsi = mipi_dsi_device_alloc(host); - if (IS_ERR(dsi)) { - dev_err(dev, "failed to allocate DSI device %s: %ld\n", - node->full_name, PTR_ERR(dsi)); - return dsi; - } - - dsi->dev.of_node = of_node_get(node); - dsi->channel = reg; + info.reg = reg; + info.node = of_node_get(node); - ret = mipi_dsi_device_add(dsi); - if (ret) { - dev_err(dev, "failed to add DSI device %s: %d\n", - node->full_name, ret); - kfree(dsi); - return ERR_PTR(ret); - } - - return dsi; + return mipi_dsi_device_new(host, &info); } #else static struct mipi_dsi_device * diff --git a/include/drm/drm_mipi_dsi.h b/include/drm/drm_mipi_dsi.h index f1d8d0d..90f4f3c 100644 --- a/include/drm/drm_mipi_dsi.h +++ b/include/drm/drm_mipi_dsi.h @@ -140,6 +140,19 @@ enum mipi_dsi_pixel_format { }; /** + * struct mipi_dsi_device_info - template for creating a mipi_dsi_device + * @reg: DSI virtual channel assigned to peripheral + * @node: pointer to OF device node + * + * This is populated and passed to mipi_dsi_device_new to create a new + * DSI device + */ +struct mipi_dsi_device_info { + u32 reg; + struct device_node *node; +}; + +/** * struct mipi_dsi_device - DSI peripheral device * @host: DSI host for this peripheral * @dev: driver model device node for this peripheral @@ -174,6 +187,8 @@ ssize_t mipi_dsi_generic_write(struct mipi_dsi_device *dsi, const void *payload, ssize_t mipi_dsi_generic_read(struct mipi_dsi_device *dsi, const void *params, size_t num_params, void *data, size_t size); +struct mipi_dsi_device *mipi_dsi_device_new(struct mipi_dsi_host *host, + struct mipi_dsi_device_info *info); /** * enum mipi_dsi_dcs_tear_mode - Tearing Effect Output Line mode * @MIPI_DSI_DCS_TEAR_MODE_VBLANK: the TE output line consists of V-Blanking -- The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, hosted by The Linux Foundation