From: Bjorn Andersson <bjorn.andersson@linaro.org>
To: Douglas Anderson <dianders@chromium.org>
Cc: Andrzej Hajda <a.hajda@samsung.com>,
Neil Armstrong <narmstrong@baylibre.com>,
Laurent Pinchart <Laurent.pinchart@ideasonboard.com>,
Jonas Karlman <jonas@kwiboo.se>,
Jernej Skrabec <jernej.skrabec@siol.net>,
Sam Ravnborg <sam@ravnborg.org>, Wolfram Sang <wsa@kernel.org>,
Stephen Boyd <swboyd@chromium.org>,
robdclark@chromium.org,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>,
Steev Klimaszewski <steev@kali.org>,
linux-arm-msm@vger.kernel.org, Linus W <linus.walleij@linaro.org>,
Daniel Vetter <daniel@ffwll.ch>, David Airlie <airlied@linux.ie>,
Robert Foss <robert.foss@linaro.org>,
dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v4 20/27] drm/bridge: ti-sn65dsi86: Promote the AUX channel to its own sub-dev
Date: Fri, 23 Apr 2021 09:59:14 -0500 [thread overview]
Message-ID: <YILgwpg/uPgIario@builder.lan> (raw)
In-Reply-To: <20210416153909.v4.20.Ie9daa320d907fff73f893f74b898197e399cce59@changeid>
On Fri 16 Apr 17:39 CDT 2021, Douglas Anderson wrote:
> We'd like to be able to expose the DDC-over-AUX channel bus to our
> panel. This gets into a chicken-and-egg problem because:
> - The panel wants to get its DDC at probe time.
> - The ti-sn65dsi86 MIPI-to-eDP bridge code, which provides the DDC
> bus, wants to get the panel at probe time.
>
> By using a sub device we can fully create the AUX channel bits so that
> the panel can get them. Then the panel can finish probing and the
> bridge can probe.
>
> To accomplish this, we also move registering the AUX channel out of
> the bridge's attach code and do it right at probe time. We use devm to
> manage cleanup.
>
> NOTE: there's a little bit of a trick here. Though the AUX channel can
> run without the MIPI-to-eDP bits of the code, the MIPI-to-eDP bits
> can't run without the AUX channel. We could come up a complicated
> signaling scheme (have the MIPI-to-eDP bits return EPROBE_DEFER for a
> while or wait on some sort of completion), but it seems simple enough
> to just not even bother creating the bridge device until the AUX
> channel probes. That's what we'll do.
>
> Signed-off-by: Douglas Anderson <dianders@chromium.org>
> ---
>
> (no changes since v1)
>
> drivers/gpu/drm/bridge/ti-sn65dsi86.c | 82 ++++++++++++++++++++-------
> 1 file changed, 63 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/ti-sn65dsi86.c b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
> index 875e5dbe6594..8253098bcdbf 100644
> --- a/drivers/gpu/drm/bridge/ti-sn65dsi86.c
> +++ b/drivers/gpu/drm/bridge/ti-sn65dsi86.c
> @@ -116,6 +116,7 @@
> * struct ti_sn65dsi86 - Platform data for ti-sn65dsi86 driver.
> * @bridge_aux: AUX-bus sub device for MIPI-to-eDP bridge functionality.
> * @gpio_aux: AUX-bus sub device for GPIO controller functionality.
> + * @aux_aux: AUX-bus sub device for eDP AUX channel functionality.
> *
> * @dev: Pointer to the top level (i2c) device.
> * @regmap: Regmap for accessing i2c.
> @@ -148,6 +149,7 @@
> struct ti_sn65dsi86 {
> struct auxiliary_device bridge_aux;
> struct auxiliary_device gpio_aux;
> + struct auxiliary_device aux_aux;
>
> struct device *dev;
> struct regmap *regmap;
> @@ -483,18 +485,12 @@ static int ti_sn_bridge_attach(struct drm_bridge *bridge,
> return -EINVAL;
> }
>
> - ret = drm_dp_aux_register(&pdata->aux);
> - if (ret < 0) {
> - drm_err(bridge->dev, "Failed to register DP AUX channel: %d\n", ret);
> - return ret;
> - }
> -
> ret = drm_connector_init(bridge->dev, &pdata->connector,
> &ti_sn_bridge_connector_funcs,
> DRM_MODE_CONNECTOR_eDP);
> if (ret) {
> DRM_ERROR("Failed to initialize connector with drm\n");
> - goto err_conn_init;
> + return ret;
> }
>
> drm_connector_helper_add(&pdata->connector,
> @@ -551,8 +547,6 @@ static int ti_sn_bridge_attach(struct drm_bridge *bridge,
> mipi_dsi_device_unregister(dsi);
> err_dsi_host:
> drm_connector_cleanup(&pdata->connector);
> -err_conn_init:
> - drm_dp_aux_unregister(&pdata->aux);
> return ret;
> }
>
> @@ -1316,11 +1310,6 @@ static int ti_sn_bridge_probe(struct auxiliary_device *adev,
> if (ret)
> return ret;
>
> - pdata->aux.name = "ti-sn65dsi86-aux";
> - pdata->aux.dev = pdata->dev;
> - pdata->aux.transfer = ti_sn_aux_transfer;
> - drm_dp_aux_init(&pdata->aux);
> -
> pdata->bridge.funcs = &ti_sn_bridge_funcs;
> pdata->bridge.of_node = np;
>
> @@ -1419,6 +1408,54 @@ static int ti_sn65dsi86_add_aux_device(struct ti_sn65dsi86 *pdata,
> return ret;
> }
>
> +static void ti_sn65dsi86_unregister_dp_aux(void *data)
> +{
> + drm_dp_aux_unregister(data);
> +}
> +
> +static int ti_sn_aux_probe(struct auxiliary_device *adev,
> + const struct auxiliary_device_id *id)
> +{
> + struct ti_sn65dsi86 *pdata = dev_get_drvdata(adev->dev.parent);
> + int ret;
> +
> + pdata->aux.name = "ti-sn65dsi86-aux";
> + pdata->aux.dev = pdata->dev;
> + pdata->aux.transfer = ti_sn_aux_transfer;
> + drm_dp_aux_init(&pdata->aux);
> +
> + ret = drm_dp_aux_register(&pdata->aux);
> + if (ret < 0) {
> + drm_err(pdata, "Failed to register DP AUX channel: %d\n", ret);
> + return ret;
> + }
> + ret = devm_add_action_or_reset(&adev->dev,
> + ti_sn65dsi86_unregister_dp_aux, &pdata->aux);
> + if (ret)
> + return ret;
> +
> + /*
> + * The eDP to MIPI bridge parts don't work until the AUX channel is
> + * setup so we don't add it in the main driver probe, we add it now.
> + */
> + return ti_sn65dsi86_add_aux_device(pdata, &pdata->bridge_aux, "bridge");
> +}
> +
> +static const struct auxiliary_device_id ti_sn_aux_id_table[] = {
> + { .name = "ti_sn65dsi86.aux", },
> + {},
> +};
> +
> +MODULE_DEVICE_TABLE(auxiliary, ti_sn_aux_id_table);
> +
> +static struct auxiliary_driver ti_sn_aux_driver = {
> + .name = "aux",
> + .probe = ti_sn_aux_probe,
> + .id_table = ti_sn_aux_id_table,
> +};
> +
> +module_auxiliary_driver(ti_sn_aux_driver);
As with the earlier patch, please drop MODULE_DEVICE_TABLE() and rework
module_driver().
Regards,
Bjorn
> +
> static int ti_sn65dsi86_probe(struct i2c_client *client,
> const struct i2c_device_id *id)
> {
> @@ -1477,10 +1514,11 @@ static int ti_sn65dsi86_probe(struct i2c_client *client,
> * motiviation here is to solve the chicken-and-egg problem of probe
> * ordering. The bridge wants the panel to be there when it probes.
> * The panel wants its HPD GPIO (provided by sn65dsi86 on some boards)
> - * when it probes. There will soon be other devices (DDC I2C bus, PWM)
> - * that have the same problem. Having sub-devices allows the some sub
> - * devices to finish probing even if others return -EPROBE_DEFER and
> - * gets us around the problems.
> + * when it probes. The panel and maybe backlight might want the DDC
> + * bus. Soon the PWM provided by the bridge chip will have the same
> + * problem. Having sub-devices allows the some sub devices to finish
> + * probing even if others return -EPROBE_DEFER and gets us around the
> + * problems.
> */
>
> if (IS_ENABLED(CONFIG_OF_GPIO)) {
> @@ -1489,7 +1527,13 @@ static int ti_sn65dsi86_probe(struct i2c_client *client,
> return ret;
> }
>
> - return ti_sn65dsi86_add_aux_device(pdata, &pdata->bridge_aux, "bridge");
> + /*
> + * NOTE: At the end of the AUX channel probe we'll add the aux device
> + * for the bridge. This is because the bridge can't be used until the
> + * AUX channel is there and this is a very simple solution to the
> + * dependency problem.
> + */
> + return ti_sn65dsi86_add_aux_device(pdata, &pdata->aux_aux, "aux");
> }
>
> static struct i2c_device_id ti_sn65dsi86_id[] = {
> --
> 2.31.1.368.gbe11c130af-goog
>
next prev parent reply other threads:[~2021-04-23 14:59 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-16 22:39 [PATCH v4 00/27] drm: Fix EDID reading on ti-sn65dsi86; solve some chicken-and-egg problems Douglas Anderson
2021-04-16 22:39 ` [PATCH v4 01/27] drm/bridge: Fix the stop condition of drm_bridge_chain_pre_enable() Douglas Anderson
2021-04-16 22:39 ` [PATCH v4 02/27] drm/bridge: ti-sn65dsi86: Simplify refclk handling Douglas Anderson
2021-04-16 22:39 ` [PATCH v4 03/27] drm/bridge: ti-sn65dsi86: Remove incorrectly tagged kerneldoc comment Douglas Anderson
2021-04-16 22:39 ` [PATCH v4 04/27] drm/bridge: ti-sn65dsi86: Reorder remove() Douglas Anderson
2021-04-16 22:39 ` [PATCH v4 05/27] drm/bridge: ti-sn65dsi86: Move drm_panel_unprepare() to post_disable() Douglas Anderson
2021-04-16 22:39 ` [PATCH v4 06/27] drm/bridge: ti-sn65dsi86: Get rid of the useless detect() function Douglas Anderson
2021-04-16 22:39 ` [PATCH v4 07/27] drm/panel: panel-simple: Use runtime pm to avoid excessive unprepare / prepare Douglas Anderson
2021-04-16 22:39 ` [PATCH v4 08/27] drm/bridge: ti-sn65dsi86: Rename the main driver data structure Douglas Anderson
2021-04-23 14:28 ` Bjorn Andersson
2021-04-16 22:39 ` [PATCH v4 09/27] drm/bridge: ti-sn65dsi86: More renames in prep for sub-devices Douglas Anderson
2021-04-23 14:30 ` Bjorn Andersson
2021-04-16 22:39 ` [PATCH v4 10/27] drm/bridge: ti-sn65dsi86: Clean debugfs code Douglas Anderson
2021-04-23 14:35 ` Bjorn Andersson
2021-04-16 22:39 ` [PATCH v4 11/27] drm/bridge: ti-sn65dsi86: Add local var for "dev" to simplify probe Douglas Anderson
2021-04-23 14:38 ` Bjorn Andersson
2021-04-16 22:39 ` [PATCH v4 12/27] drm/bridge: ti-sn65dsi86: Cleanup managing of drvdata Douglas Anderson
2021-04-23 14:38 ` Bjorn Andersson
2021-04-16 22:39 ` [PATCH v4 13/27] drm/bridge: ti-sn65dsi86: Use devm to do our runtime_disable Douglas Anderson
2021-04-23 14:39 ` Bjorn Andersson
2021-04-16 22:39 ` [PATCH v4 14/27] drm/bridge: ti-sn65dsi86: Move all the chip-related init to the start Douglas Anderson
2021-04-23 14:41 ` Bjorn Andersson
2021-04-16 22:39 ` [PATCH v4 15/27] drm/bridge: ti-sn65dsi86: Break GPIO and MIPI-to-eDP bridge into sub-drivers Douglas Anderson
2021-04-23 14:49 ` Bjorn Andersson
2021-04-16 22:39 ` [PATCH v4 16/27] drm/panel: panel-simple: Get rid of hacky HPD chicken-and-egg code Douglas Anderson
2021-04-23 14:50 ` Bjorn Andersson
2021-04-16 22:39 ` [PATCH v4 17/27] drm/bridge: ti-sn65dsi86: Use pm_runtime autosuspend Douglas Anderson
2021-04-23 14:51 ` Bjorn Andersson
2021-04-16 22:39 ` [PATCH v4 18/27] drm/bridge: ti-sn65dsi86: Code motion of refclk management functions Douglas Anderson
2021-04-23 14:51 ` Bjorn Andersson
2021-04-16 22:39 ` [PATCH v4 19/27] drm/bridge: ti-sn65dsi86: If refclk, DP AUX can happen w/out pre-enable Douglas Anderson
2021-04-23 14:56 ` Bjorn Andersson
2021-04-16 22:39 ` [PATCH v4 20/27] drm/bridge: ti-sn65dsi86: Promote the AUX channel to its own sub-dev Douglas Anderson
2021-04-23 14:59 ` Bjorn Andersson [this message]
2021-04-16 22:39 ` [PATCH v4 21/27] i2c: i2c-core-of: Fix corner case of finding adapter by node Douglas Anderson
2021-04-23 15:12 ` Bjorn Andersson
2021-04-16 22:39 ` [PATCH v4 22/27] drm/panel: panel-simple: Remove extra call: drm_connector_update_edid_property() Douglas Anderson
2021-04-23 15:15 ` Bjorn Andersson
2021-04-16 22:39 ` [PATCH v4 23/27] drm/panel: panel-simple: Power the panel when reading the EDID Douglas Anderson
2021-04-23 15:16 ` Bjorn Andersson
2021-04-16 22:39 ` [PATCH v4 24/27] drm/panel: panel-simple: Cache the EDID as long as we retain power Douglas Anderson
2021-04-23 16:12 ` Bjorn Andersson
2021-04-23 16:30 ` Doug Anderson
2021-04-16 22:39 ` [PATCH v4 25/27] drm/bridge: ti-sn65dsi86: Don't read EDID blob over DDC Douglas Anderson
2021-04-23 16:13 ` Bjorn Andersson
2021-04-16 22:39 ` [PATCH v4 26/27] arm64: dts: qcom: Link the panel to the bridge's DDC bus Douglas Anderson
2021-04-23 16:16 ` Bjorn Andersson
2021-04-16 22:39 ` [PATCH v4 27/27] drm/panel: panel-simple: Prepare/unprepare are refcounted, not forced Douglas Anderson
2021-04-23 16:16 ` Bjorn Andersson
2021-04-23 16:46 ` Doug Anderson
2021-04-20 16:42 ` [PATCH v4 00/27] drm: Fix EDID reading on ti-sn65dsi86; solve some chicken-and-egg problems Doug Anderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YILgwpg/uPgIario@builder.lan \
--to=bjorn.andersson@linaro.org \
--cc=Laurent.pinchart@ideasonboard.com \
--cc=a.hajda@samsung.com \
--cc=airlied@linux.ie \
--cc=daniel@ffwll.ch \
--cc=dianders@chromium.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=jernej.skrabec@siol.net \
--cc=jonas@kwiboo.se \
--cc=linus.walleij@linaro.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=narmstrong@baylibre.com \
--cc=robdclark@chromium.org \
--cc=robert.foss@linaro.org \
--cc=sam@ravnborg.org \
--cc=stanislav.lisovskiy@intel.com \
--cc=steev@kali.org \
--cc=swboyd@chromium.org \
--cc=wsa@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).