Message ID | 1449751300-2841-3-git-send-email-architt@codeaurora.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Dec 10, 2015 at 06:11:36PM +0530, Archit Taneja wrote: > Simplify the mipi dsi device creation process. device_initialize and "MIPI" and "DSI", please. > 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 <a.hajda@samsung.com> > Signed-off-by: Archit Taneja <architt@codeaurora.org> > --- > drivers/gpu/drm/drm_mipi_dsi.c | 61 +++++++++++++++++------------------------- > include/drm/drm_mipi_dsi.h | 15 +++++++++++ > 2 files changed, 40 insertions(+), 36 deletions(-) To be honest, I'm not sure I like this. If you want to have a simpler helper, why not implement it using the lower-level helpers. Really the only thing you're doing here is add a high-level helper that takes an info struct, whereas previously the same would be done by storing the info directly in the structure between allocation and addition of the device. Initially the implementation was following that of platform devices, I see no reason to deviate from that. What you want here can easily be done by something like: struct mipi_dsi_device * mipi_dsi_device_register_full(struct mipi_dsi_host *host, const struct mipi_dsi_device_info *info) { struct mipi_dsi_device *dsi; dsi = mipi_dsi_device_alloc(host); if (IS_ERR(dsi)) return dsi; dsi->dev.of_node = info->node; dsi->channel = info->channel; err = mipi_dsi_device_add(dsi); if (err < 0) { ... } return dsi; } Thierry
On 1/21/2016 9:16 PM, Thierry Reding wrote: > On Thu, Dec 10, 2015 at 06:11:36PM +0530, Archit Taneja wrote: >> Simplify the mipi dsi device creation process. device_initialize and > > "MIPI" and "DSI", please. Sure, I'll replace with these and in the other patches. > >> 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 <a.hajda@samsung.com> >> Signed-off-by: Archit Taneja <architt@codeaurora.org> >> --- >> drivers/gpu/drm/drm_mipi_dsi.c | 61 +++++++++++++++++------------------------- >> include/drm/drm_mipi_dsi.h | 15 +++++++++++ >> 2 files changed, 40 insertions(+), 36 deletions(-) > > To be honest, I'm not sure I like this. If you want to have a simpler > helper, why not implement it using the lower-level helpers. Really the > only thing you're doing here is add a high-level helper that takes an > info struct, whereas previously the same would be done by storing the > info directly in the structure between allocation and addition of the > device. > > Initially the implementation was following that of platform devices, I > see no reason to deviate from that. What you want here can easily be I don't see why we need to call device_initialize and device_add separately for DSI devices. From my (limited) understanding, we should call these separately if we want to take a reference (using get_device()), or set up some private data before the bus's notifier kicks in. Since the main purpose of the series is not to simplify the device creation code, I can drop this. > done by something like: > > struct mipi_dsi_device * > mipi_dsi_device_register_full(struct mipi_dsi_host *host, > const struct mipi_dsi_device_info *info) > { > struct mipi_dsi_device *dsi; > > dsi = mipi_dsi_device_alloc(host); > if (IS_ERR(dsi)) > return dsi; > > dsi->dev.of_node = info->node; > dsi->channel = info->channel; > > err = mipi_dsi_device_add(dsi); > if (err < 0) { > ... > } > > return dsi; > } > > Thierry > This does look less intrusive. I'll consider switching to this. Thanks, Archit
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