[PATCH RESEND v3 2/2] drm/bridge: display-connector: add DP support
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Mon Nov 30 10:18:39 UTC 2020
Hi Tomi,
Thank you for the patch.
On Tue, Nov 24, 2020 at 09:11:55AM +0200, Tomi Valkeinen wrote:
> Add DP support to display-connector driver. The driver will support HPD
> via a GPIO and DP PWR.
>
> DP PWR will be enabled at probe, which is not optimal, but I'm not sure
> what would be a good place to enable and disable DP PWR. Perhaps
> attach/detach, but I don't know if enabling HW is something that attach
> is supposed to do.
>
> In any case, I don't think there's much difference in power consumption
> between the version in this patch and enabling the regulator later: if
> the driver probes, supposedly it will attach very soon afterwards, and
> we need to enable the DP PWR as soon as possible.
>
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen at ti.com>
> ---
> drivers/gpu/drm/bridge/display-connector.c | 46 +++++++++++++++++++++-
> 1 file changed, 44 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/display-connector.c b/drivers/gpu/drm/bridge/display-connector.c
> index 4d278573cdb9..04362feccd75 100644
> --- a/drivers/gpu/drm/bridge/display-connector.c
> +++ b/drivers/gpu/drm/bridge/display-connector.c
> @@ -11,6 +11,7 @@
> #include <linux/of.h>
> #include <linux/of_device.h>
> #include <linux/platform_device.h>
> +#include <linux/regulator/consumer.h>
>
> #include <drm/drm_bridge.h>
> #include <drm/drm_edid.h>
> @@ -20,6 +21,8 @@ struct display_connector {
>
> struct gpio_desc *hpd_gpio;
> int hpd_irq;
> +
> + struct regulator *dp_pwr;
> };
>
> static inline struct display_connector *
> @@ -172,11 +175,12 @@ static int display_connector_probe(struct platform_device *pdev)
> of_property_read_string(pdev->dev.of_node, "label", &label);
>
> /*
> - * Get the HPD GPIO for DVI and HDMI connectors. If the GPIO can provide
> + * Get the HPD GPIO for DVI, HDMI and DP connectors. If the GPIO can provide
> * edge interrupts, register an interrupt handler.
> */
> if (type == DRM_MODE_CONNECTOR_DVII ||
> - type == DRM_MODE_CONNECTOR_HDMIA) {
> + type == DRM_MODE_CONNECTOR_HDMIA ||
> + type == DRM_MODE_CONNECTOR_DisplayPort) {
> conn->hpd_gpio = devm_gpiod_get_optional(&pdev->dev, "hpd",
> GPIOD_IN);
> if (IS_ERR(conn->hpd_gpio)) {
> @@ -223,6 +227,38 @@ static int display_connector_probe(struct platform_device *pdev)
> }
> }
>
> + /* Get the DP PWR for DP connector */
s/connector/connector./
> + if (type == DRM_MODE_CONNECTOR_DisplayPort) {
> + int r;
The driver uses "ret".
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> +
> + conn->dp_pwr = devm_regulator_get_optional(&pdev->dev, "dp-pwr");
> +
> + if (IS_ERR(conn->dp_pwr)) {
> + r = PTR_ERR(conn->dp_pwr);
> +
> + switch (r) {
> + case -ENODEV:
> + conn->dp_pwr = NULL;
> + break;
> +
> + case -EPROBE_DEFER:
> + return -EPROBE_DEFER;
> +
> + default:
> + dev_err(&pdev->dev, "failed to get DP PWR regulator: %d\n", r);
> + return r;
> + }
> + }
> +
> + if (conn->dp_pwr) {
> + r = regulator_enable(conn->dp_pwr);
> + if (r) {
> + dev_err(&pdev->dev, "failed to enable DP PWR regulator: %d\n", r);
> + return r;
> + }
> + }
> + }
> +
> conn->bridge.funcs = &display_connector_bridge_funcs;
> conn->bridge.of_node = pdev->dev.of_node;
>
> @@ -251,6 +287,9 @@ static int display_connector_remove(struct platform_device *pdev)
> {
> struct display_connector *conn = platform_get_drvdata(pdev);
>
> + if (conn->dp_pwr)
> + regulator_disable(conn->dp_pwr);
> +
> drm_bridge_remove(&conn->bridge);
>
> if (!IS_ERR(conn->bridge.ddc))
> @@ -275,6 +314,9 @@ static const struct of_device_id display_connector_match[] = {
> }, {
> .compatible = "vga-connector",
> .data = (void *)DRM_MODE_CONNECTOR_VGA,
> + }, {
> + .compatible = "dp-connector",
> + .data = (void *)DRM_MODE_CONNECTOR_DisplayPort,
> },
> {},
> };
--
Regards,
Laurent Pinchart
More information about the dri-devel
mailing list