Received: by 2002:a05:6a10:d5a5:0:0:0:0 with SMTP id gn37csp3414072pxb; Mon, 4 Oct 2021 01:41:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzC/2FYgYOLQ9QSuQmjxrKmNFHVc2EYKYaOQB2k9rBcLQjUKZh7LaM+J5fdoqeQmfhzp3sW X-Received: by 2002:a17:906:4fd6:: with SMTP id i22mr15573271ejw.92.1633336905297; Mon, 04 Oct 2021 01:41:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1633336905; cv=none; d=google.com; s=arc-20160816; b=AgFiacFg6B1wWQz1fwoaUOtrqANugR4c7WyrC5PpLb1463yRANUfZoOF/eiSj7Iab/ qOEZ+0gukbr1jcsdNLmSiTXpD/kBYZbGUvx/6EvwSTMBllQl+CrXzwTZkg6Njr6MmyMC UtR+epuhPc8fPNQ8Rzpf0eo91wlbeYD9T/g3VazHDpWywRncnXT26NZu++Vgo79mx9J5 td/Kz30TShrxLko53u4wI6I5WxSA6ytRwGxFunPzOzlhRq3mcmDjHMGC6n7r9fIGUgWd IoJabTon9wBHWWZhznM2Luf9IZn0wX+PO9n8T9DhtL/fLZc61oTNkvkA/e0lQdy10Bxd Bc5w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:organization :message-id:user-agent:references:in-reply-to:reply-to:subject:cc:to :from:date:mime-version; bh=Txan1r4SFtsQFpBLSdoLJjStn31KLziym5NHVxebBJk=; b=MnQG4CZA/mRGqdu/Dz9+A08lVIGP4DF7c1cpjxpK45L1bmjRf/Uhu73uU4BNZxtLI6 Ana3w7lBdArzphmzzK9zJKaGFF3WUJsBUyjBJ+CL6lUcj4ybS2P3raaRcO++uKCkAO5f K9xXI+b1K4mUmVMLsacQ9p6y9TVqO33Ik16BfgxsoF1x0nDDn48jJwDfkZes8gESR0ef BSWpP6rkIixYvH+YI4cc8T1KEH4lOzLNsYb47sxKmu7a584LgVE+nejxDBXs5F8Ri/Rr F79HRqT8jAg835al+ZcPU5LMPPa4jP03atQMxMqipfha1kXe2MeJFVF7hG6y7JG4/BFO yFDw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y97si17037364ede.520.2021.10.04.01.41.21; Mon, 04 Oct 2021 01:41:45 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231355AbhJDI2h (ORCPT + 99 others); Mon, 4 Oct 2021 04:28:37 -0400 Received: from protonic.xs4all.nl ([83.163.252.89]:33382 "EHLO protonic.xs4all.nl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230469AbhJDI2g (ORCPT ); Mon, 4 Oct 2021 04:28:36 -0400 Received: from fiber.protonic.nl (edge2.prtnl [192.168.1.170]) by sparta.prtnl (Postfix) with ESMTP id B0A4A44A024E; Mon, 4 Oct 2021 10:26:45 +0200 (CEST) MIME-Version: 1.0 Date: Mon, 04 Oct 2021 10:26:45 +0200 From: Robin van der Gracht To: Geert Uytterhoeven Cc: Miguel Ojeda , Rob Herring , Paul Burton , Greg Kroah-Hartman , Pavel Machek , Marek Behun , "open list:OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS" , linux-leds , "open list:BROADCOM NVRAM DRIVER" , Linux Kernel Mailing List , =?UTF-8?Q?Marek_Beh=C3=BAn?= Subject: Re: [PATCH v6 19/19] auxdisplay: ht16k33: Add LED support Reply-To: robin@protonic.nl In-Reply-To: References: <20210914143835.511051-1-geert@linux-m68k.org> <20210914143835.511051-20-geert@linux-m68k.org> <4602a8e681db4d0ebc43e4dafee8c28e@protonic.nl> User-Agent: Roundcube Webmail/1.4.11 Message-ID: X-Sender: robin@protonic.nl Organization: Protonic Holland Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Geert, On 2021-10-01 17:51, Geert Uytterhoeven wrote: > Hoi Robin, > > On Thu, Sep 30, 2021 at 12:57 PM Robin van der Gracht > 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::". >> > >> > 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 >> > Reviewed-by: Marek BehĂșn >> > --- >> > 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 = ; >> linux,default-trigger = "backlight"; >> }; > > The latter makes perfect sense to me. Will do. Ack. > >> 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? ;-) Yes it is. The fix is easy and since we're making major driver changes now... I needed the fix to properly test the changes we're making, so I thought we might as well include it. > >> 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. Ack. > >> > + >> > + 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. Ack. I have hardware which uses the ht16k33 in dot matrix mode and I tested both the backlight and led setup. I ran into this with the fbdev + led setup. I noticed ht16k33_bl_update_status() is called in ht16k33_fbdev_probe() before the fbdev device is registered. Which is fine right now, but in theory the fbdev blank state can influence the backlight setting (nitpick since the fbdev device is unblanked by default). The point: Maybe ht16k33_brightness_set() (or ht16k33_bl_update_status() for backlight device) should be called in one central place (i.e at the end of the main probe function). > >> > @@ -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! :) - Robin