dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
From: Lyude Paul <lyude@redhat.com>
To: Jani Nikula <jani.nikula@linux.intel.com>,
	Rajeev Nandan <rajeevny@codeaurora.org>,
	dri-devel@lists.freedesktop.org,  linux-arm-msm@vger.kernel.org,
	freedreno@lists.freedesktop.org,  devicetree@vger.kernel.org
Cc: mkrishn@codeaurora.org, Daniel Vetter <daniel.vetter@ffwll.ch>,
	intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	abhinavk@codeaurora.org, dianders@chromium.org,
	seanpaul@chromium.org, Thomas Zimmermann <tzimmermann@suse.de>,
	kalyan_t@codeaurora.org, hoegsberg@chromium.org, "Lankhorst,
	Maarten" <maarten.lankhorst@intel.com>
Subject: Re: [v3 2/2] backlight: Add DisplayPort aux backlight driver
Date: Fri, 30 Apr 2021 14:48:58 -0400	[thread overview]
Message-ID: <7a200cc05d75be9d802d64458b753c35578e84af.camel@redhat.com> (raw)
In-Reply-To: <87zgxl5qar.fsf@intel.com>

JFYI for anyone who is interested, I will be respinning my patches for adding
backlight helpers very soon since we've got pretty much all of the prep work
for it upstream now

On Mon, 2021-04-26 at 12:49 +0300, Jani Nikula wrote:
> On Mon, 26 Apr 2021, Rajeev Nandan <rajeevny@codeaurora.org> wrote:
> > Add backlight driver for the panels supporting backlight control
> > using DPCD registers on the DisplayPort aux channel.
> 
> No, please don't do this.
> 
> I wrote you last week in reply to v1 why I thought merging this would
> not be a good idea [1]. Why have you sent two versions since then
> without replying to me, or Cc'ing me or Lyude?
> 
> I think it's an even worse idea to merge this to
> drivers/video/backlight. With DP AUX backlight you can't pretend it's
> just an independent aux interface for backlight without everything else
> around it. It's not independent of eDP, and exposing it as a direct
> backlight sysfs interface bypasses the encoder.
> 
> And it still remains that there is existing DP AUX backlight code in
> use, in the tree, with more features than this, with plans and
> previously submitted patches to lift from one driver to drm core, and
> with patches to add support to another driver.
> 
> I don't say this lightly, or very often at all, but,
> 
> NAK.
> 
> 
> BR,
> Jani.
> 
> 
> [1] https://lore.kernel.org/dri-devel/871rb5bcf9.fsf@intel.com/
> 
> > 
> > Changes in v2:
> > - New (most of the code reused from drm_dp_aux_backlight.c of v1)
> > 
> > Changes in v3:
> > - Add missing ';' to fix module compilation (kernel test bot)
> > 
> > Signed-off-by: Rajeev Nandan <rajeevny@codeaurora.org>
> > ---
> >  drivers/video/backlight/Kconfig            |   7 +
> >  drivers/video/backlight/Makefile           |   1 +
> >  drivers/video/backlight/dp_aux_backlight.c | 245
> > +++++++++++++++++++++++++++++
> >  3 files changed, 253 insertions(+)
> >  create mode 100644 drivers/video/backlight/dp_aux_backlight.c
> > 
> > diff --git a/drivers/video/backlight/Kconfig
> > b/drivers/video/backlight/Kconfig
> > index d83c87b..82c88f0 100644
> > --- a/drivers/video/backlight/Kconfig
> > +++ b/drivers/video/backlight/Kconfig
> > @@ -456,6 +456,13 @@ config BACKLIGHT_LED
> >           If you have a LCD backlight adjustable by LED class driver, say
> > Y
> >           to enable this driver.
> >  
> > +config BACKLIGHT_DP_AUX
> > +       tristate "DisplayPort aux backlight driver"
> > +       depends on DRM && DRM_KMS_HELPER
> > +       help
> > +         If you have a panel backlight controlled by DPCD registers
> > +         on the DisplayPort aux channel, say Y to enable this driver.
> > +
> >  endif # BACKLIGHT_CLASS_DEVICE
> >  
> >  endmenu
> > diff --git a/drivers/video/backlight/Makefile
> > b/drivers/video/backlight/Makefile
> > index 685f3f1..ba23c7c 100644
> > --- a/drivers/video/backlight/Makefile
> > +++ b/drivers/video/backlight/Makefile
> > @@ -57,3 +57,4 @@ obj-$(CONFIG_BACKLIGHT_WM831X)                +=
> > wm831x_bl.o
> >  obj-$(CONFIG_BACKLIGHT_ARCXCNN)        += arcxcnn_bl.o
> >  obj-$(CONFIG_BACKLIGHT_RAVE_SP)                += rave-sp-backlight.o
> >  obj-$(CONFIG_BACKLIGHT_LED)            += led_bl.o
> > +obj-$(CONFIG_BACKLIGHT_DP_AUX)         += dp_aux_backlight.o
> > diff --git a/drivers/video/backlight/dp_aux_backlight.c
> > b/drivers/video/backlight/dp_aux_backlight.c
> > new file mode 100644
> > index 00000000..3398383
> > --- /dev/null
> > +++ b/drivers/video/backlight/dp_aux_backlight.c
> > @@ -0,0 +1,245 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/*
> > + * Backlight driver to control the brightness over DisplayPort aux
> > channel.
> > + */
> > +
> > +#include <linux/backlight.h>
> > +#include <linux/err.h>
> > +#include <linux/gpio/consumer.h>
> > +#include <linux/kernel.h>
> > +#include <linux/module.h>
> > +#include <linux/platform_device.h>
> > +#include <drm/drm_dp_helper.h>
> > +
> > +#define DP_AUX_MAX_BRIGHTNESS          0xffff
> > +
> > +/**
> > + * struct dp_aux_backlight - DisplayPort aux backlight data
> > + * @dev: pointer to our device.
> > + * @aux: the DisplayPort aux channel.
> > + * @enable_gpio: the backlight enable gpio.
> > + * @enabled: true if backlight is enabled else false.
> > + */
> > +struct dp_aux_backlight {
> > +       struct device *dev;
> > +       struct drm_dp_aux *aux;
> > +       struct gpio_desc *enable_gpio;
> > +       bool enabled;
> > +};
> > +
> > +static struct drm_dp_aux *i2c_to_aux(struct i2c_adapter *i2c)
> > +{
> > +       return container_of(i2c, struct drm_dp_aux, ddc);
> > +}
> > +
> > +static int dp_aux_backlight_enable(struct dp_aux_backlight *aux_bl)
> > +{
> > +       u8 val = 0;
> > +       int ret;
> > +
> > +       if (aux_bl->enabled)
> > +               return 0;
> > +
> > +       /* Set backlight control mode */
> > +       ret = drm_dp_dpcd_readb(aux_bl->aux,
> > DP_EDP_BACKLIGHT_MODE_SET_REGISTER,
> > +                               &val);
> > +       if (ret < 0)
> > +               return ret;
> > +
> > +       val &= ~DP_EDP_BACKLIGHT_CONTROL_MODE_MASK;
> > +       val |= DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD;
> > +       ret = drm_dp_dpcd_writeb(aux_bl->aux,
> > DP_EDP_BACKLIGHT_MODE_SET_REGISTER,
> > +                                val);
> > +       if (ret < 0)
> > +               return ret;
> > +
> > +       /* Enable backlight */
> > +       ret = drm_dp_dpcd_readb(aux_bl->aux,
> > DP_EDP_DISPLAY_CONTROL_REGISTER,
> > +                               &val);
> > +       if (ret < 0)
> > +               return ret;
> > +
> > +       val |= DP_EDP_BACKLIGHT_ENABLE;
> > +       ret = drm_dp_dpcd_writeb(aux_bl->aux,
> > DP_EDP_DISPLAY_CONTROL_REGISTER,
> > +                                val);
> > +       if (ret < 0)
> > +               return ret;
> > +
> > +       if (aux_bl->enable_gpio)
> > +               gpiod_set_value(aux_bl->enable_gpio, 1);
> > +
> > +       aux_bl->enabled = true;
> > +
> > +       return 0;
> > +}
> > +
> > +static int dp_aux_backlight_disable(struct dp_aux_backlight *aux_bl)
> > +{
> > +       u8 val = 0;
> > +       int ret;
> > +
> > +       if (!aux_bl->enabled)
> > +               return 0;
> > +
> > +       if (aux_bl->enable_gpio)
> > +               gpiod_set_value(aux_bl->enable_gpio, 0);
> > +
> > +       ret = drm_dp_dpcd_readb(aux_bl->aux,
> > DP_EDP_DISPLAY_CONTROL_REGISTER,
> > +                               &val);
> > +       if (ret < 0)
> > +               return ret;
> > +
> > +       val &= ~DP_EDP_BACKLIGHT_ENABLE;
> > +       ret = drm_dp_dpcd_writeb(aux_bl->aux,
> > DP_EDP_DISPLAY_CONTROL_REGISTER,
> > +                                val);
> > +       if (ret < 0)
> > +               return ret;
> > +
> > +       aux_bl->enabled = false;
> > +
> > +       return 0;
> > +}
> > +
> > +static int dp_aux_backlight_update_status(struct backlight_device *bd)
> > +{
> > +       struct dp_aux_backlight *aux_bl = bl_get_data(bd);
> > +       u16 brightness = backlight_get_brightness(bd);
> > +       u8 val[2] = { 0x0 };
> > +       int ret = 0;
> > +
> > +       if (brightness > 0) {
> > +               val[0] = brightness >> 8;
> > +               val[1] = brightness & 0xff;
> > +               ret = drm_dp_dpcd_write(aux_bl->aux,
> > DP_EDP_BACKLIGHT_BRIGHTNESS_MSB,
> > +                                       val, sizeof(val));
> > +               if (ret < 0)
> > +                       return ret;
> > +
> > +               dp_aux_backlight_enable(aux_bl);
> > +       } else {
> > +               dp_aux_backlight_disable(aux_bl);
> > +       }
> > +
> > +       return 0;
> > +}
> > +
> > +static int dp_aux_backlight_get_brightness(struct backlight_device *bd)
> > +{
> > +       struct dp_aux_backlight *aux_bl = bl_get_data(bd);
> > +       u8 val[2] = { 0x0 };
> > +       int ret = 0;
> > +
> > +       if (backlight_is_blank(bd))
> > +               return 0;
> > +
> > +       ret = drm_dp_dpcd_read(aux_bl->aux,
> > DP_EDP_BACKLIGHT_BRIGHTNESS_MSB,
> > +                              &val, sizeof(val));
> > +       if (ret < 0)
> > +               return ret;
> > +
> > +       return (val[0] << 8 | val[1]);
> > +}
> > +
> > +static const struct backlight_ops aux_bl_ops = {
> > +       .update_status = dp_aux_backlight_update_status,
> > +       .get_brightness = dp_aux_backlight_get_brightness,
> > +};
> > +
> > +
> > +static int dp_aux_backlight_probe(struct platform_device *pdev)
> > +{
> > +       struct dp_aux_backlight *aux_bl;
> > +       struct backlight_device *bd;
> > +       struct backlight_properties bl_props = { 0 };
> > +       struct device_node *np;
> > +       struct i2c_adapter *ddc;
> > +       int ret = 0;
> > +       u32 val;
> > +
> > +       aux_bl = devm_kzalloc(&pdev->dev, sizeof(*aux_bl), GFP_KERNEL);
> > +       if (!aux_bl)
> > +               return -ENOMEM;
> > +
> > +       aux_bl->dev = &pdev->dev;
> > +
> > +       np = of_parse_phandle(pdev->dev.of_node, "ddc-i2c-bus", 0);
> > +       if (!np) {
> > +               dev_err(&pdev->dev, "failed to get aux ddc I2C bus\n");
> > +               return -ENODEV;
> > +       }
> > +
> > +       ddc = of_find_i2c_adapter_by_node(np);
> > +       of_node_put(np);
> > +       if (!ddc)
> > +               return -EPROBE_DEFER;
> > +
> > +       aux_bl->aux = i2c_to_aux(ddc);
> > +       dev_dbg(&pdev->dev, "using dp aux %s\n", aux_bl->aux->name);
> > +
> > +       aux_bl->enable_gpio = devm_gpiod_get_optional(&pdev->dev,
> > "enable",
> > +                                            GPIOD_OUT_LOW);
> > +       if (IS_ERR(aux_bl->enable_gpio)) {
> > +               ret = PTR_ERR(aux_bl->enable_gpio);
> > +               goto free_ddc;
> > +       }
> > +
> > +       val = DP_AUX_MAX_BRIGHTNESS;
> > +       of_property_read_u32(pdev->dev.of_node, "max-brightness", &val);
> > +       if (val > DP_AUX_MAX_BRIGHTNESS)
> > +               val = DP_AUX_MAX_BRIGHTNESS;
> > +
> > +       bl_props.max_brightness = val;
> > +       bl_props.brightness = val;
> > +       bl_props.type = BACKLIGHT_RAW;
> > +       bd = devm_backlight_device_register(&pdev->dev, dev_name(&pdev-
> > >dev),
> > +                                           &pdev->dev, aux_bl,
> > +                                           &aux_bl_ops, &bl_props);
> > +       if (IS_ERR(bd)) {
> > +               ret = PTR_ERR(bd);
> > +               dev_err(&pdev->dev,
> > +                             "failed to register backlight (%d)\n", ret);
> > +               goto free_ddc;
> > +       }
> > +
> > +       platform_set_drvdata(pdev, bd);
> > +
> > +       return 0;
> > +
> > +free_ddc:
> > +       if (ddc)
> > +               put_device(&ddc->dev);
> > +
> > +       return ret;
> > +}
> > +
> > +static int dp_aux_backlight_remove(struct platform_device *pdev)
> > +{
> > +       struct backlight_device *bd = platform_get_drvdata(pdev);
> > +       struct dp_aux_backlight *aux_bl = bl_get_data(bd);
> > +       struct i2c_adapter *ddc = &aux_bl->aux->ddc;
> > +
> > +       if (ddc)
> > +               put_device(&ddc->dev);
> > +
> > +       return 0;
> > +}
> > +
> > +static const struct of_device_id dp_aux_bl_of_match_table[] = {
> > +       { .compatible = "dp-aux-backlight"},
> > +       {},
> > +};
> > +MODULE_DEVICE_TABLE(of, dp_aux_bl_of_match_table);
> > +
> > +static struct platform_driver dp_aux_backlight_driver = {
> > +       .driver = {
> > +               .name = "dp-aux-backlight",
> > +               .of_match_table = dp_aux_bl_of_match_table,
> > +       },
> > +       .probe = dp_aux_backlight_probe,
> > +       .remove = dp_aux_backlight_remove,
> > +
> > +};
> > +module_platform_driver(dp_aux_backlight_driver);
> > +
> > +MODULE_DESCRIPTION("DisplayPort aux backlight driver");
> > +MODULE_LICENSE("GPL v2");
> 

-- 
Cheers,
 Lyude Paul (she/her)
 Software Engineer at Red Hat

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

      parent reply	other threads:[~2021-04-30 18:49 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-26  5:59 [v3 0/2] drm: Add support for backlight control of eDP panel on ti-sn65dsi86 bridge Rajeev Nandan
2021-04-26  5:59 ` [v3 1/2] dt-bindings: backlight: add DisplayPort aux backlight Rajeev Nandan
2021-04-26 21:04   ` Rob Herring
2021-04-29 18:04   ` Rob Herring
2021-04-29 21:03     ` Doug Anderson
2021-04-30 15:10       ` rajeevny
2021-04-30 21:38         ` Doug Anderson
2021-05-11 18:11           ` rajeevny
2021-05-11 22:33             ` Laurent Pinchart
2021-05-11 23:17             ` Doug Anderson
2021-05-17 20:21               ` Doug Anderson
2021-05-25  8:03                 ` rajeevny
2021-04-26  5:59 ` [v3 2/2] backlight: Add DisplayPort aux backlight driver Rajeev Nandan
2021-04-26  9:49   ` Jani Nikula
2021-04-26 14:57     ` rajeevny
2021-04-30 18:48     ` Lyude Paul [this message]

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=7a200cc05d75be9d802d64458b753c35578e84af.camel@redhat.com \
    --to=lyude@redhat.com \
    --cc=abhinavk@codeaurora.org \
    --cc=daniel.vetter@ffwll.ch \
    --cc=devicetree@vger.kernel.org \
    --cc=dianders@chromium.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=freedreno@lists.freedesktop.org \
    --cc=hoegsberg@chromium.org \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=jani.nikula@linux.intel.com \
    --cc=kalyan_t@codeaurora.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maarten.lankhorst@intel.com \
    --cc=mkrishn@codeaurora.org \
    --cc=rajeevny@codeaurora.org \
    --cc=seanpaul@chromium.org \
    --cc=tzimmermann@suse.de \
    /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).