LKML Archive on lore.kernel.org
help / color / mirror / Atom feed
From: Geert Uytterhoeven <geert@linux-m68k.org>
To: Robin van der Gracht <robin@protonic.nl>
Cc: "Miguel Ojeda" <ojeda@kernel.org>,
"Rob Herring" <robh+dt@kernel.org>,
"Paul Burton" <paulburton@kernel.org>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Pavel Machek" <pavel@ucw.cz>, "Marek Behun" <marek.behun@nic.cz>,
"open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS"
<devicetree@vger.kernel.org>,
linux-leds <linux-leds@vger.kernel.org>,
"open list:BROADCOM NVRAM DRIVER" <linux-mips@vger.kernel.org>,
"Linux Kernel Mailing List" <linux-kernel@vger.kernel.org>,
"Marek Behún" <kabel@kernel.org>
Subject: Re: [PATCH v6 19/19] auxdisplay: ht16k33: Add LED support
Date: Fri, 1 Oct 2021 17:51:08 +0200 [thread overview]
Message-ID: <CAMuHMdVOa8DAGJQpJ8AotARxfh9PvpskJJa6k48jE92-P+GLRA@mail.gmail.com> (raw)
In-Reply-To: <4602a8e681db4d0ebc43e4dafee8c28e@protonic.nl>
Hoi Robin,
On Thu, Sep 30, 2021 at 12:57 PM Robin van der Gracht <robin@protonic.nl> wrote:
> On 2021-09-14 16:38, Geert Uytterhoeven wrote:
> > Instantiate a single LED based on the "led" subnode in DT.
> > This allows the user to control display brightness and blinking (backed
> > by hardware support) through the LED class API and triggers, and exposes
> > the display color. The LED will be named
> > "auxdisplay:<color>:<function>".
> >
> > When running in dot-matrix mode and if no "led" subnode is found, the
> > driver falls back to the traditional backlight mode, to preserve
> > backwards compatibility.
> >
> > Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
> > Reviewed-by: Marek Behún <kabel@kernel.org>
> > ---
> > v6:
> > - Add Reviewed-by,
> > - Reorder operations in ht16k33_led_probe() to ease future conversion
> > to device properties,
> > --- a/drivers/auxdisplay/ht16k33.c
> > +++ b/drivers/auxdisplay/ht16k33.c
> > @@ -425,6 +477,35 @@ static void ht16k33_seg14_update(struct work_struct
> > *work)
> > i2c_smbus_write_i2c_block_data(priv->client, 0, ARRAY_SIZE(buf), buf);
> > }
> >
> > +static int ht16k33_led_probe(struct device *dev, struct led_classdev *led,
> > + unsigned int brightness)
> > +{
> > + struct led_init_data init_data = {};
> > + struct device_node *node;
> > + int err;
> > +
> > + /* The LED is optional */
> > + node = of_get_child_by_name(dev->of_node, "led");
> > + if (!node)
> > + return 0;
> > +
> > + init_data.fwnode = of_fwnode_handle(node);
> > + init_data.devicename = "auxdisplay";
> > + init_data.devname_mandatory = true;
> > +
> > + led->brightness_set_blocking = ht16k33_brightness_set_blocking;
> > + led->blink_set = ht16k33_blink_set;
> > + led->flags = LED_CORE_SUSPENDRESUME;
> > + led->brightness = brightness;
> > + led->max_brightness = MAX_BRIGHTNESS;
>
> What do you think about adding a default trigger and making it 'backlight'?
>
> led->default_trigger = "blacklight";
>
> Or as an alternative, suggesting linux,default-trigger = "backlight" in the
> docs? Since the led class won't respond to blank events by just making it's
> function LED_FUNCTION_BACKLIGHT.
>
> led {
> function = LED_FUNCTION_BACKLIGHT;
> color = <LED_COLOR_ID_GREEN>;
> linux,default-trigger = "backlight";
> };
The latter makes perfect sense to me. Will do.
> I noticed blanking is broken. The backlight device (or LED device with
> backlight trigger) doens't get notified when the framebuffer is blanked since
> the driver doesn't implement fb_blank.
>
> Right now:
>
> echo 1 > /sys/class/graphics/fb0/blank
> |
> sh: write error: Invalid argument
>
> Due to:
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/video/fbdev/core/fbmem.c?h=v5.15-rc3#n1078
That's a pre-existing problem, righ? ;-)
> Something like this fixes it.
>
> diff --git a/drivers/auxdisplay/ht16k33.c b/drivers/auxdisplay/ht16k33.c
> index 89ee5b4b3dfc..0883d5252c81 100644
> --- a/drivers/auxdisplay/ht16k33.c
> +++ b/drivers/auxdisplay/ht16k33.c
> @@ -346,6 +346,15 @@ static int ht16k33_mmap(struct fb_info *info, struct
> vm_area_struct *vma)
> return vm_map_pages_zero(vma, &pages, 1);
> }
>
> +/*
> + * Blank events will be passed to the backlight device (or the LED device if
> + * it's trigger is 'backlight') when we return 0 here.
> + */
> +static int ht16k33_blank(int blank, struct fb_info *info)
> +{
> + return 0;
> +}
> +
> static const struct fb_ops ht16k33_fb_ops = {
> .owner = THIS_MODULE,
> .fb_read = fb_sys_read,
> @@ -354,6 +363,7 @@ static const struct fb_ops ht16k33_fb_ops = {
> .fb_copyarea = sys_copyarea,
> .fb_imageblit = sys_imageblit,
> .fb_mmap = ht16k33_mmap,
> + .fb_blank = ht16k33_blank,
> };
>
> /*
>
> Feel free to include (something like) this in the patch stack.
Thanks, will do.
> > +
> > + err = devm_led_classdev_register_ext(dev, led, &init_data);
> > + if (err)
> > + dev_err(dev, "Failed to register LED\n");
>
> You might want to call ht16k33_brightness_set(priv, brightness) here to get a
> know value into the display setup register (0x80).
>
> Right now if I enable hardware blinking and (soft)reboot my board it keeps on
> blinking even after a re-probe.
I don't have that issue.
Aha, ht16k33_seg_probe() calls ht16k33_brightness_set(), but
ht16k33_fbdev_probe() doesn't. The latter should do that, too,
when not using backwards compatibility mode.
> > @@ -575,7 +660,7 @@ static int ht16k33_seg_probe(struct device *dev, struct
> > ht16k33_priv *priv,
> > struct ht16k33_seg *seg = &priv->seg;
> > int err;
> >
> > - err = ht16k33_brightness_set(priv, MAX_BRIGHTNESS);
> > + err = ht16k33_brightness_set(priv, brightness);
>
> This looks like a bugfix for patch 17, maybe move this change there?
Indeed. Bad rebase. Will move.
Thanks a lot for your comments!
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
next prev parent reply other threads:[~2021-10-01 15:51 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-14 14:38 [PATCH v6 00/19] auxdisplay: ht16k33: Add character display support Geert Uytterhoeven
2021-09-14 14:38 ` [PATCH v6 01/19] uapi: Add <linux/map_to_14segment.h> Geert Uytterhoeven
2021-09-14 14:38 ` [PATCH v6 02/19] dt-bindings: auxdisplay: ht16k33: Document Adafruit segment displays Geert Uytterhoeven
2021-09-14 14:38 ` [PATCH v6 03/19] auxdisplay: img-ascii-lcd: Fix lock-up when displaying empty string Geert Uytterhoeven
2021-09-14 14:38 ` [PATCH v6 04/19] auxdisplay: img-ascii-lcd: Add helper variable dev Geert Uytterhoeven
2021-09-14 14:38 ` [PATCH v6 05/19] auxdisplay: img-ascii-lcd: Convert device attribute to sysfs_emit() Geert Uytterhoeven
2021-09-14 14:38 ` [PATCH v6 06/19] auxdisplay: Extract character line display core support Geert Uytterhoeven
2021-09-14 14:38 ` [PATCH v6 07/19] auxdisplay: linedisp: Use kmemdup_nul() helper Geert Uytterhoeven
2021-09-14 14:38 ` [PATCH v6 08/19] auxdisplay: linedisp: Add support for changing scroll rate Geert Uytterhoeven
2021-09-14 14:38 ` [PATCH v6 09/19] auxdisplay: ht16k33: Connect backlight to fbdev Geert Uytterhoeven
2021-09-29 14:21 ` Robin van der Gracht
2021-09-14 14:38 ` [PATCH v6 10/19] auxdisplay: ht16k33: Use HT16K33_FB_SIZE in ht16k33_initialize() Geert Uytterhoeven
2021-09-14 14:38 ` [PATCH v6 11/19] auxdisplay: ht16k33: Remove unneeded error check in keypad probe() Geert Uytterhoeven
2021-09-14 14:38 ` [PATCH v6 12/19] auxdisplay: ht16k33: Convert to simple i2c probe function Geert Uytterhoeven
2021-09-14 14:38 ` [PATCH v6 13/19] auxdisplay: ht16k33: Add helper variable dev Geert Uytterhoeven
2021-09-14 14:38 ` [PATCH v6 14/19] auxdisplay: ht16k33: Move delayed work Geert Uytterhoeven
2021-09-30 6:36 ` Robin van der Gracht
2021-09-14 14:38 ` [PATCH v6 15/19] auxdisplay: ht16k33: Extract ht16k33_brightness_set() Geert Uytterhoeven
2021-09-30 6:58 ` Robin van der Gracht
2021-09-14 14:38 ` [PATCH v6 16/19] auxdisplay: ht16k33: Extract frame buffer probing Geert Uytterhoeven
2021-09-30 7:09 ` Robin van der Gracht
2021-09-14 14:38 ` [PATCH v6 17/19] auxdisplay: ht16k33: Add support for segment displays Geert Uytterhoeven
2021-09-30 7:37 ` Robin van der Gracht
2021-09-14 14:38 ` [PATCH v6 18/19] dt-bindings: auxdisplay: ht16k33: Document LED subnode Geert Uytterhoeven
2021-09-14 14:38 ` [PATCH v6 19/19] auxdisplay: ht16k33: Add LED support Geert Uytterhoeven
2021-09-30 10:57 ` Robin van der Gracht
2021-10-01 15:51 ` Geert Uytterhoeven [this message]
2021-10-04 8:26 ` Robin van der Gracht
2021-10-12 15:08 ` Geert Uytterhoeven
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=CAMuHMdVOa8DAGJQpJ8AotARxfh9PvpskJJa6k48jE92-P+GLRA@mail.gmail.com \
--to=geert@linux-m68k.org \
--cc=devicetree@vger.kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=kabel@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-leds@vger.kernel.org \
--cc=linux-mips@vger.kernel.org \
--cc=marek.behun@nic.cz \
--cc=ojeda@kernel.org \
--cc=paulburton@kernel.org \
--cc=pavel@ucw.cz \
--cc=robh+dt@kernel.org \
--cc=robin@protonic.nl \
--subject='Re: [PATCH v6 19/19] auxdisplay: ht16k33: Add LED support' \
/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
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).