From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030846AbbJ3L23 (ORCPT ); Fri, 30 Oct 2015 07:28:29 -0400 Received: from mailout2.w1.samsung.com ([210.118.77.12]:57773 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030383AbbJ3L21 (ORCPT ); Fri, 30 Oct 2015 07:28:27 -0400 X-AuditID: cbfec7f4-f79c56d0000012ee-bf-563354598313 Subject: Re: [RFC v2 1/5] drm/dsi: Refactor device creation To: Archit Taneja , dri-devel@lists.freedesktop.org References: <1435641851-27295-1-git-send-email-architt@codeaurora.org> <1444123482-25579-1-git-send-email-architt@codeaurora.org> <1444123482-25579-2-git-send-email-architt@codeaurora.org> 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, jani.nikula@linux.intel.com From: Andrzej Hajda Message-id: <56335454.5090109@samsung.com> Date: Fri, 30 Oct 2015 12:28:20 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 MIME-version: 1.0 In-reply-to: <1444123482-25579-2-git-send-email-architt@codeaurora.org> Content-type: text/plain; charset=windows-1252 Content-transfer-encoding: 7bit X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrFLMWRmVeSWpSXmKPExsVy+t/xy7qRIcZhBnsPMFr0njvJZNHU8ZbV 4v+2icwWV76+Z7NYfnk9o8WDuTeZLCbuP8tucXnXHDaL/3t2sFvc/s3nwOVxua+XyWPvtwUs HptWdbJ5bP/2gNVj3slAj/vdx5k8epvfsXn0/zXw+LxJLoAzissmJTUnsyy1SN8ugSvj2mKW gmdaFVcWbGZvYDyk1MXIySEhYCIx+eUBFghbTOLCvfVsXYxcHEICSxklHly5wAThPGeUONf8 gh2kSljAWuLx3uesILaIgLfEnNV9jBBFBxglvj/fyALiMIM4/dNXMYJUsQloSvzdfBNoLgcH r4CWRPeVCJAwi4CqxMu375hBbFGBCImJExrAhvIKCEr8mHwP7CROAXeJLXsmMIO0MgvoSdy/ qAUSZhaQl9i85i3zBEaBWUg6ZiFUzUJStYCReRWjaGppckFxUnquoV5xYm5xaV66XnJ+7iZG SIx82cG4+JjVIUYBDkYlHt4fCUZhQqyJZcWVuYcYJTiYlUR4e5yMw4R4UxIrq1KL8uOLSnNS iw8xSnOwKInzzt31PkRIID2xJDU7NbUgtQgmy8TBKdXAuKSfw3X+lfK5T/+c3vqk70OXsJtZ 5tX+2Ycms3CdOx17Pk945STxtzL34qUEntpunc761fiuUeG31kezPJxmvW1q2XH4Xn6RxpKp W3p3HIid8vx61GGzd9cenr5ouVX5ml+hXaD6odd7FM8+blSSW+zyP3Xf6fmePmG6XsZ8ogsT ppr0MbpPE1ViKc5INNRiLipOBAD7jIDkjQIAAA== Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 10/06/2015 11:24 AM, Archit Taneja wrote: > 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. > > Signed-off-by: Archit Taneja Reviewed-by: Andrzej Hajda Regards Andrzej > --- > 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 2d5ca8ee..245ecfe 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 r; > + > + 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,26 +123,27 @@ 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); > + r = device_register(&dsi->dev); > + if (r) { > + dev_err(dev, "failed to register device: %d\n", r); > + kfree(dsi); > + return ERR_PTR(r); > + } > > - return device_add(&dsi->dev); > + return dsi; > } > +EXPORT_SYMBOL(mipi_dsi_device_new); > > 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; > > @@ -144,31 +154,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); > } > > int mipi_dsi_host_register(struct mipi_dsi_host *host) > 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