* LED backlight on Droid 4 and others @ 2020-01-05 18:32 Pavel Machek 2020-01-05 20:24 ` Tony Lindgren 2020-01-06 8:45 ` Lee Jones 0 siblings, 2 replies; 12+ messages in thread From: Pavel Machek @ 2020-01-05 18:32 UTC (permalink / raw) To: kernel list, linux-arm-kernel, linux-omap, tony, sre, nekit1000, mpartap, merlijn, martin_rysavy, agx, lee.jones, daniel.thompson, jingoohan1, dri-devel Cc: tomi.valkeinen, jjhiblot, daniel.thompson [-- Attachment #1: Type: text/plain, Size: 2752 bytes --] Hi! It would be good to get LED backlight to work in clean way for 5.6 kernel. As far as I can see, these are neccessary (but not enough; it does not work for me): lm3532 changes to register LED with of node, plus device tree changes for droid 4, and these generic changes: commit d457d0c97d6d55fe3e62633791ac05d289a37d2e Author: Tomi Valkeinen <tomi.valkeinen@ti.com> Date: Thu Oct 3 10:28:12 2019 +0200 backlight: add led-backlight driver This patch adds a led-backlight driver (led_bl), which is similar to pwm_bl except the driver uses a LED class driver to adjust the brightness in the HW. Multiple LEDs can be used for a single backlight. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com> Acked-by: Pavel Machek <pavel@ucw.cz> Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org> commit 44b7adbf0b07904e4198ae1d0a763917d1c68a23 Author: Jean-Jacques Hiblot <jjhiblot@ti.com> Date: Thu Oct 3 10:28:10 2019 +0200 leds: Add managed API to get a LED from a device driver If the LED is acquired by a consumer device with devm_led_get(), it is automatically released when the device is detached. Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com> Acked-by: Pavel Machek <pavel@ucw.cz> Signed-off-by: Pavel <pavel@ucw.cz> commit 93b98c570d7f898063ab6204e1b3950a3335dd12 Author: Tomi Valkeinen <tomi.valkeinen@ti.com> Date: Thu Oct 3 10:28:09 2019 +0200 leds: Add of_led_get() and led_put() This patch adds basic support for a kernel driver to get a LED device. This will be used by the led-backlight driver. Only OF version is implemented for now, and the behavior is similar to PWM's of_pwm_get() and pwm_put(). Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com> Acked-by: Pavel Machek <pavel@ucw.cz> Signed-off-by: Pavel <pavel@ucw.cz> [If you have an idea what else is needed, it would be welcome; it works for me in development tree but not in tree I'd like to upstream.] Lee, would you be willing to take "backlight: add led-backlight driver"? Would it help if I got "leds: Add managed API to get a LED from a device driver" and "leds: Add of_led_get() and led_put()" into for_next tree of the LED subsystem? It is kind of important as, well, phone without screen looks pretty much dead, and same issue hits Droid 4 and Librem 5 phones at least... Best regards, Pavel -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: LED backlight on Droid 4 and others 2020-01-05 18:32 LED backlight on Droid 4 and others Pavel Machek @ 2020-01-05 20:24 ` Tony Lindgren 2020-01-05 22:18 ` Pavel Machek 2020-01-05 23:55 ` Pavel Machek 2020-01-06 8:45 ` Lee Jones 1 sibling, 2 replies; 12+ messages in thread From: Tony Lindgren @ 2020-01-05 20:24 UTC (permalink / raw) To: Pavel Machek Cc: kernel list, linux-arm-kernel, linux-omap, sre, nekit1000, mpartap, merlijn, martin_rysavy, agx, lee.jones, daniel.thompson, jingoohan1, dri-devel, tomi.valkeinen, jjhiblot * Pavel Machek <pavel@ucw.cz> [200105 18:32]: > Hi! > > It would be good to get LED backlight to work in clean way for 5.6 > kernel. I agree, this is badly needed for many devices. > [If you have an idea what else is needed, it would be welcome; it > works for me in development tree but not in tree I'd like to > upstream.] I have some version of these patches working with modified dts in my droid4-pending-v5.4 branch git branch, maybe try to diff against that. Regards, Tony ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: LED backlight on Droid 4 and others 2020-01-05 20:24 ` Tony Lindgren @ 2020-01-05 22:18 ` Pavel Machek 2020-01-05 23:55 ` Pavel Machek 1 sibling, 0 replies; 12+ messages in thread From: Pavel Machek @ 2020-01-05 22:18 UTC (permalink / raw) To: Tony Lindgren Cc: kernel list, linux-arm-kernel, linux-omap, sre, nekit1000, mpartap, merlijn, martin_rysavy, agx, lee.jones, daniel.thompson, jingoohan1, dri-devel, tomi.valkeinen, jjhiblot Hi! > > It would be good to get LED backlight to work in clean way for 5.6 > > kernel. > > I agree, this is badly needed for many devices. > > > [If you have an idea what else is needed, it would be welcome; it > > works for me in development tree but not in tree I'd like to > > upstream.] > > I have some version of these patches working with modified dts in my > droid4-pending-v5.4 branch git branch, maybe try to diff against that. Thanks a lot. I was missing 7dc08cb9ac7baff1601f65f66c4c611f841abc64. Best regards, Pavel > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: LED backlight on Droid 4 and others 2020-01-05 20:24 ` Tony Lindgren 2020-01-05 22:18 ` Pavel Machek @ 2020-01-05 23:55 ` Pavel Machek 1 sibling, 0 replies; 12+ messages in thread From: Pavel Machek @ 2020-01-05 23:55 UTC (permalink / raw) To: Tony Lindgren, linux-leds Cc: kernel list, linux-arm-kernel, linux-omap, sre, nekit1000, mpartap, merlijn, martin_rysavy, agx, lee.jones, daniel.thompson, jingoohan1, dri-devel, tomi.valkeinen, jjhiblot [-- Attachment #1: Type: text/plain, Size: 1523 bytes --] Hi! > > It would be good to get LED backlight to work in clean way for 5.6 > > kernel. > > I agree, this is badly needed for many devices. > > > [If you have an idea what else is needed, it would be welcome; it > > works for me in development tree but not in tree I'd like to > > upstream.] > > I have some version of these patches working with modified dts in my > droid4-pending-v5.4 branch git branch, maybe try to diff against that. So.. backlight now works for me, and I put the LED parts of the patches to gitolite.kernel.org:pub/scm/linux/kernel/git/pavel/linux-leds.git for-next tree. [I guess I could try to sneak them into 5.5 if that helps.] Could we somehow get this to the backlight tree? commit d457d0c97d6d55fe3e62633791ac05d289a37d2e Author: Tomi Valkeinen <tomi.valkeinen@ti.com> Date: Thu Oct 3 10:28:12 2019 +0200 backlight: add led-backlight driver This patch adds a led-backlight driver (led_bl), which is similar to pwm_bl except the driver uses a LED class driver to adjust the brightness in the HW. Multiple LEDs can be used for a single backlight. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com> Acked-by: Pavel Machek <pavel@ucw.cz> Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org> Best regards, Pavel -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 181 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: LED backlight on Droid 4 and others 2020-01-05 18:32 LED backlight on Droid 4 and others Pavel Machek 2020-01-05 20:24 ` Tony Lindgren @ 2020-01-06 8:45 ` Lee Jones 2020-02-11 17:29 ` Tony Lindgren 1 sibling, 1 reply; 12+ messages in thread From: Lee Jones @ 2020-01-06 8:45 UTC (permalink / raw) To: Pavel Machek Cc: kernel list, linux-arm-kernel, linux-omap, tony, sre, nekit1000, mpartap, merlijn, martin_rysavy, agx, daniel.thompson, jingoohan1, dri-devel, tomi.valkeinen, jjhiblot On Sun, 05 Jan 2020, Pavel Machek wrote: > Hi! > > It would be good to get LED backlight to work in clean way for 5.6 > kernel. > > As far as I can see, these are neccessary (but not enough; it does not > work for me): lm3532 changes to register LED with of node, plus device > tree changes for droid 4, and these generic changes: > > commit d457d0c97d6d55fe3e62633791ac05d289a37d2e > Author: Tomi Valkeinen <tomi.valkeinen@ti.com> > Date: Thu Oct 3 10:28:12 2019 +0200 > > backlight: add led-backlight driver > > This patch adds a led-backlight driver (led_bl), which is similar to > pwm_bl except the driver uses a LED class driver to adjust the > brightness in the HW. Multiple LEDs can be used for a single backlight. > > Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> > Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com> > Acked-by: Pavel Machek <pavel@ucw.cz> > Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org> > > commit 44b7adbf0b07904e4198ae1d0a763917d1c68a23 > Author: Jean-Jacques Hiblot <jjhiblot@ti.com> > Date: Thu Oct 3 10:28:10 2019 +0200 > > leds: Add managed API to get a LED from a device driver > > If the LED is acquired by a consumer device with devm_led_get(), it is > automatically released when the device is detached. > > Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com> > Acked-by: Pavel Machek <pavel@ucw.cz> > Signed-off-by: Pavel <pavel@ucw.cz> > > commit 93b98c570d7f898063ab6204e1b3950a3335dd12 > Author: Tomi Valkeinen <tomi.valkeinen@ti.com> > Date: Thu Oct 3 10:28:09 2019 +0200 > > leds: Add of_led_get() and led_put() > > This patch adds basic support for a kernel driver to get a LED device. > This will be used by the led-backlight driver. > > Only OF version is implemented for now, and the behavior is similar to > PWM's of_pwm_get() and pwm_put(). > > Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> > Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com> > Acked-by: Pavel Machek <pavel@ucw.cz> > Signed-off-by: Pavel <pavel@ucw.cz> > > [If you have an idea what else is needed, it would be welcome; it > works for me in development tree but not in tree I'd like to > upstream.] > > Lee, would you be willing to take "backlight: add led-backlight > driver"? Would it help if I got "leds: Add managed API to get a LED > from a device driver" and "leds: Add of_led_get() and led_put()" into > for_next tree of the LED subsystem? It looks like you have an open question from Tony on v10. Is that patch orthogonal, or are there depend{ants,encies}? > It is kind of important as, well, phone without screen looks pretty > much dead, and same issue hits Droid 4 and Librem 5 phones at least... > > Best regards, > Pavel -- Lee Jones [李琼斯] Linaro Services Technical Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: LED backlight on Droid 4 and others 2020-01-06 8:45 ` Lee Jones @ 2020-02-11 17:29 ` Tony Lindgren 2020-02-12 20:16 ` Pavel Machek 0 siblings, 1 reply; 12+ messages in thread From: Tony Lindgren @ 2020-02-11 17:29 UTC (permalink / raw) To: Lee Jones Cc: Pavel Machek, kernel list, linux-arm-kernel, linux-omap, sre, nekit1000, mpartap, merlijn, martin_rysavy, agx, daniel.thompson, jingoohan1, dri-devel, tomi.valkeinen, jjhiblot * Lee Jones <lee.jones@linaro.org> [200106 08:46]: > On Sun, 05 Jan 2020, Pavel Machek wrote: > > > Hi! > > > > It would be good to get LED backlight to work in clean way for 5.6 > > kernel. ... > > [If you have an idea what else is needed, it would be welcome; it > > works for me in development tree but not in tree I'd like to > > upstream.] > > > > Lee, would you be willing to take "backlight: add led-backlight > > driver"? Would it help if I got "leds: Add managed API to get a LED > > from a device driver" and "leds: Add of_led_get() and led_put()" into > > for_next tree of the LED subsystem? > > It looks like you have an open question from Tony on v10. > > Is that patch orthogonal, or are there depend{ants,encies}? Uhh looks like we messed up a bit with integration. Now droid4 LCD backlight can no longer be enabled at all manually in v5.6-rc1 without the "add led-backlight driver" patch.. Should we just merge it to fix it rather than start scrambling with other temporary hacks? I don't care if we use "default-brightness", or if we use "default-brightness-level". The binding merged says now "default-brightness", so let's go with that one. That's what other LED drivers are using too. Regards, Tony ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: LED backlight on Droid 4 and others 2020-02-11 17:29 ` Tony Lindgren @ 2020-02-12 20:16 ` Pavel Machek 2020-02-18 13:52 ` Lee Jones 0 siblings, 1 reply; 12+ messages in thread From: Pavel Machek @ 2020-02-12 20:16 UTC (permalink / raw) To: Tony Lindgren Cc: Lee Jones, kernel list, linux-arm-kernel, linux-omap, sre, nekit1000, mpartap, merlijn, martin_rysavy, agx, daniel.thompson, jingoohan1, dri-devel, tomi.valkeinen, jjhiblot, tony [-- Attachment #1: Type: text/plain, Size: 1624 bytes --] Hi! > > > It would be good to get LED backlight to work in clean way for 5.6 > > > kernel. > ... > > > [If you have an idea what else is needed, it would be welcome; it > > > works for me in development tree but not in tree I'd like to > > > upstream.] > > > > > > Lee, would you be willing to take "backlight: add led-backlight > > > driver"? Would it help if I got "leds: Add managed API to get a LED > > > from a device driver" and "leds: Add of_led_get() and led_put()" into > > > for_next tree of the LED subsystem? > > > > It looks like you have an open question from Tony on v10. > > > > Is that patch orthogonal, or are there depend{ants,encies}? > > Uhh looks like we messed up a bit with integration. Now droid4 > LCD backlight can no longer be enabled at all manually in v5.6-rc1 > without the "add led-backlight driver" patch.. Should we just > merge it to fix it rather than start scrambling with other > temporary hacks? We should just merge the "add led-backlight driver". Everything should be ready for it. I'm sorry if I broke something working, I was not aware it worked at all. Unfortunately, this is backlight code, not LED, so I can't just merge it. > I don't care if we use "default-brightness", or if we use > "default-brightness-level". The binding merged says now > "default-brightness", so let's go with that one. That's what > other LED drivers are using too. No opinion on that. Best regards, Pavel -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 181 bytes --] ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: LED backlight on Droid 4 and others 2020-02-12 20:16 ` Pavel Machek @ 2020-02-18 13:52 ` Lee Jones 2020-02-18 14:14 ` Tony Lindgren 0 siblings, 1 reply; 12+ messages in thread From: Lee Jones @ 2020-02-18 13:52 UTC (permalink / raw) To: Pavel Machek Cc: Tony Lindgren, kernel list, linux-arm-kernel, linux-omap, sre, nekit1000, mpartap, merlijn, martin_rysavy, agx, daniel.thompson, jingoohan1, dri-devel, tomi.valkeinen, jjhiblot On Wed, 12 Feb 2020, Pavel Machek wrote: > Hi! > > > > > It would be good to get LED backlight to work in clean way for 5.6 > > > > kernel. > > ... > > > > [If you have an idea what else is needed, it would be welcome; it > > > > works for me in development tree but not in tree I'd like to > > > > upstream.] > > > > > > > > Lee, would you be willing to take "backlight: add led-backlight > > > > driver"? Would it help if I got "leds: Add managed API to get a LED > > > > from a device driver" and "leds: Add of_led_get() and led_put()" into > > > > for_next tree of the LED subsystem? > > > > > > It looks like you have an open question from Tony on v10. > > > > > > Is that patch orthogonal, or are there depend{ants,encies}? > > > > Uhh looks like we messed up a bit with integration. Now droid4 > > LCD backlight can no longer be enabled at all manually in v5.6-rc1 > > without the "add led-backlight driver" patch.. Should we just > > merge it to fix it rather than start scrambling with other > > temporary hacks? > > We should just merge the "add led-backlight driver". Everything should > be ready for it. I'm sorry if I broke something working, I was not > aware it worked at all. > > Unfortunately, this is backlight code, not LED, so I can't just merge it. Please go ahead. Apply my Acked-by and merge away ASAP. Acked-by: Lee Jones <lee.jones@linaro.org> -- Lee Jones [李琼斯] Linaro Services Technical Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: LED backlight on Droid 4 and others 2020-02-18 13:52 ` Lee Jones @ 2020-02-18 14:14 ` Tony Lindgren 2020-02-18 23:10 ` Pavel Machek 0 siblings, 1 reply; 12+ messages in thread From: Tony Lindgren @ 2020-02-18 14:14 UTC (permalink / raw) To: Lee Jones Cc: Pavel Machek, kernel list, linux-arm-kernel, linux-omap, sre, nekit1000, mpartap, merlijn, martin_rysavy, agx, daniel.thompson, jingoohan1, dri-devel, tomi.valkeinen, jjhiblot * Lee Jones <lee.jones@linaro.org> [200218 13:52]: > On Wed, 12 Feb 2020, Pavel Machek wrote: > > > Hi! > > > > > > > It would be good to get LED backlight to work in clean way for 5.6 > > > > > kernel. > > > ... > > > > > [If you have an idea what else is needed, it would be welcome; it > > > > > works for me in development tree but not in tree I'd like to > > > > > upstream.] > > > > > > > > > > Lee, would you be willing to take "backlight: add led-backlight > > > > > driver"? Would it help if I got "leds: Add managed API to get a LED > > > > > from a device driver" and "leds: Add of_led_get() and led_put()" into > > > > > for_next tree of the LED subsystem? > > > > > > > > It looks like you have an open question from Tony on v10. > > > > > > > > Is that patch orthogonal, or are there depend{ants,encies}? > > > > > > Uhh looks like we messed up a bit with integration. Now droid4 > > > LCD backlight can no longer be enabled at all manually in v5.6-rc1 > > > without the "add led-backlight driver" patch.. Should we just > > > merge it to fix it rather than start scrambling with other > > > temporary hacks? > > > > We should just merge the "add led-backlight driver". Everything should > > be ready for it. I'm sorry if I broke something working, I was not > > aware it worked at all. > > > > Unfortunately, this is backlight code, not LED, so I can't just merge it. > > Please go ahead. Apply my Acked-by and merge away ASAP. > > Acked-by: Lee Jones <lee.jones@linaro.org> OK best to merge the driver via the LED tree: Acked-by: Tony Lindgren <tony@atomide.com> Tested-by: Tony Lindgren <tony@atomide.com> ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: LED backlight on Droid 4 and others 2020-02-18 14:14 ` Tony Lindgren @ 2020-02-18 23:10 ` Pavel Machek 2020-02-19 7:47 ` Lee Jones 0 siblings, 1 reply; 12+ messages in thread From: Pavel Machek @ 2020-02-18 23:10 UTC (permalink / raw) To: Tony Lindgren Cc: Lee Jones, kernel list, linux-arm-kernel, linux-omap, sre, nekit1000, mpartap, merlijn, martin_rysavy, agx, daniel.thompson, jingoohan1, dri-devel, tomi.valkeinen, jjhiblot [-- Attachment #1: Type: text/plain, Size: 10589 bytes --] Hi! > > > > > > It would be good to get LED backlight to work in clean way for 5.6 > > > > > > kernel. > > > > ... > > > > > > [If you have an idea what else is needed, it would be welcome; it > > > > > > works for me in development tree but not in tree I'd like to > > > > > > upstream.] > > > > > > > > > > > > Lee, would you be willing to take "backlight: add led-backlight > > > > > > driver"? Would it help if I got "leds: Add managed API to get a LED > > > > > > from a device driver" and "leds: Add of_led_get() and led_put()" into > > > > > > for_next tree of the LED subsystem? > > > > > > > > > > It looks like you have an open question from Tony on v10. > > > > > > > > > > Is that patch orthogonal, or are there depend{ants,encies}? > > > > > > > > Uhh looks like we messed up a bit with integration. Now droid4 > > > > LCD backlight can no longer be enabled at all manually in v5.6-rc1 > > > > without the "add led-backlight driver" patch.. Should we just > > > > merge it to fix it rather than start scrambling with other > > > > temporary hacks? > > > > > > We should just merge the "add led-backlight driver". Everything should > > > be ready for it. I'm sorry if I broke something working, I was not > > > aware it worked at all. > > > > > > Unfortunately, this is backlight code, not LED, so I can't just merge it. > > > > Please go ahead. Apply my Acked-by and merge away ASAP. > > > > Acked-by: Lee Jones <lee.jones@linaro.org> > > OK best to merge the driver via the LED tree: > > Acked-by: Tony Lindgren <tony@atomide.com> > Tested-by: Tony Lindgren <tony@atomide.com> Is the patch below the one both of you are talking about? Hmm. I should s/default-brightness-level/default-brightness/ below. Lee, I can of course take it (thanks), but won't Kconfig/Makefile pieces cause rejects? It might be still better if you took it. I can hand-edit it and submit it in form for easy application... tommorow. Best regards, Pavel commit 81a2daadf8dd6c8e0cbc3b60246932436be3c714 Author: Tomi Valkeinen <tomi.valkeinen@ti.com> Date: Thu Oct 3 10:28:12 2019 +0200 backlight: add led-backlight driver This patch adds a led-backlight driver (led_bl), which is similar to pwm_bl except the driver uses a LED class driver to adjust the brightness in the HW. Multiple LEDs can be used for a single backlight. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com> Acked-by: Pavel Machek <pavel@ucw.cz> Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org> diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index 4c8f73394aac..93836ef872f5 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig @@ -463,6 +463,13 @@ config BACKLIGHT_RAVE_SP help Support for backlight control on RAVE SP device. +config BACKLIGHT_LED + tristate "Generic LED based Backlight Driver" + depends on LEDS_CLASS && OF + help + If you have a LCD backlight adjustable by LED class driver, say Y + to enable this driver. + endif # BACKLIGHT_CLASS_DEVICE endmenu diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile index 961fb553b9c0..5e13242f31d6 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile @@ -60,3 +60,4 @@ obj-$(CONFIG_BACKLIGHT_TPS65217) += tps65217_bl.o 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 diff --git a/drivers/video/backlight/led_bl.c b/drivers/video/backlight/led_bl.c new file mode 100644 index 000000000000..3f66549997c8 --- /dev/null +++ b/drivers/video/backlight/led_bl.c @@ -0,0 +1,260 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2015-2019 Texas Instruments Incorporated - http://www.ti.com/ + * Author: Tomi Valkeinen <tomi.valkeinen@ti.com> + * + * Based on pwm_bl.c + */ + +#include <linux/backlight.h> +#include <linux/leds.h> +#include <linux/module.h> +#include <linux/platform_device.h> + +struct led_bl_data { + struct device *dev; + struct backlight_device *bl_dev; + struct led_classdev **leds; + bool enabled; + int nb_leds; + unsigned int *levels; + unsigned int default_brightness; + unsigned int max_brightness; +}; + +static void led_bl_set_brightness(struct led_bl_data *priv, int level) +{ + int i; + int bkl_brightness; + + if (priv->levels) + bkl_brightness = priv->levels[level]; + else + bkl_brightness = level; + + for (i = 0; i < priv->nb_leds; i++) + led_set_brightness(priv->leds[i], bkl_brightness); + + priv->enabled = true; +} + +static void led_bl_power_off(struct led_bl_data *priv) +{ + int i; + + if (!priv->enabled) + return; + + for (i = 0; i < priv->nb_leds; i++) + led_set_brightness(priv->leds[i], LED_OFF); + + priv->enabled = false; +} + +static int led_bl_update_status(struct backlight_device *bl) +{ + struct led_bl_data *priv = bl_get_data(bl); + int brightness = bl->props.brightness; + + if (bl->props.power != FB_BLANK_UNBLANK || + bl->props.fb_blank != FB_BLANK_UNBLANK || + bl->props.state & BL_CORE_FBBLANK) + brightness = 0; + + if (brightness > 0) + led_bl_set_brightness(priv, brightness); + else + led_bl_power_off(priv); + + return 0; +} + +static const struct backlight_ops led_bl_ops = { + .update_status = led_bl_update_status, +}; + +static int led_bl_get_leds(struct device *dev, + struct led_bl_data *priv) +{ + int i, nb_leds, ret; + struct device_node *node = dev->of_node; + struct led_classdev **leds; + unsigned int max_brightness; + unsigned int default_brightness; + + ret = of_count_phandle_with_args(node, "leds", NULL); + if (ret < 0) { + dev_err(dev, "Unable to get led count\n"); + return -EINVAL; + } + + nb_leds = ret; + if (nb_leds < 1) { + dev_err(dev, "At least one LED must be specified!\n"); + return -EINVAL; + } + + leds = devm_kzalloc(dev, sizeof(struct led_classdev *) * nb_leds, + GFP_KERNEL); + if (!leds) + return -ENOMEM; + + for (i = 0; i < nb_leds; i++) { + leds[i] = devm_of_led_get(dev, i); + if (IS_ERR(leds[i])) + return PTR_ERR(leds[i]); + } + + /* check that the LEDs all have the same brightness range */ + max_brightness = leds[0]->max_brightness; + for (i = 1; i < nb_leds; i++) { + if (max_brightness != leds[i]->max_brightness) { + dev_err(dev, "LEDs must have identical ranges\n"); + return -EINVAL; + } + } + + /* get the default brightness from the first LED from the list */ + default_brightness = leds[0]->brightness; + + priv->nb_leds = nb_leds; + priv->leds = leds; + priv->max_brightness = max_brightness; + priv->default_brightness = default_brightness; + + return 0; +} + +static int led_bl_parse_levels(struct device *dev, + struct led_bl_data *priv) +{ + struct device_node *node = dev->of_node; + int num_levels; + u32 value; + int ret; + + if (!node) + return -ENODEV; + + num_levels = of_property_count_u32_elems(node, "brightness-levels"); + if (num_levels > 1) { + int i; + unsigned int db; + u32 *levels = NULL; + + levels = devm_kzalloc(dev, sizeof(u32) * num_levels, + GFP_KERNEL); + if (!levels) + return -ENOMEM; + + ret = of_property_read_u32_array(node, "brightness-levels", + levels, + num_levels); + if (ret < 0) + return ret; + + /* + * Try to map actual LED brightness to backlight brightness + * level + */ + db = priv->default_brightness; + for (i = 0 ; i < num_levels; i++) { + if ((i && db > levels[i-1]) && db <= levels[i]) + break; + } + priv->default_brightness = i; + priv->max_brightness = num_levels - 1; + priv->levels = levels; + } else if (num_levels >= 0) + dev_warn(dev, "Not enough levels defined\n"); + + ret = of_property_read_u32(node, "default-brightness-level", &value); + if (!ret && value <= priv->max_brightness) + priv->default_brightness = value; + else if (!ret && value > priv->max_brightness) + dev_warn(dev, "Invalid default brightness. Ignoring it\n"); + + return 0; +} + +static int led_bl_probe(struct platform_device *pdev) +{ + struct backlight_properties props; + struct led_bl_data *priv; + int ret, i; + + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + platform_set_drvdata(pdev, priv); + + priv->dev = &pdev->dev; + + ret = led_bl_get_leds(&pdev->dev, priv); + if (ret) + return ret; + + ret = led_bl_parse_levels(&pdev->dev, priv); + if (ret < 0) { + dev_err(&pdev->dev, "Failed to parse DT data\n"); + return ret; + } + + memset(&props, 0, sizeof(struct backlight_properties)); + props.type = BACKLIGHT_RAW; + props.max_brightness = priv->max_brightness; + props.brightness = priv->default_brightness; + props.power = (priv->default_brightness > 0) ? FB_BLANK_POWERDOWN : + FB_BLANK_UNBLANK; + priv->bl_dev = backlight_device_register(dev_name(&pdev->dev), + &pdev->dev, priv, &led_bl_ops, &props); + if (IS_ERR(priv->bl_dev)) { + dev_err(&pdev->dev, "Failed to register backlight\n"); + return PTR_ERR(priv->bl_dev); + } + + for (i = 0; i < priv->nb_leds; i++) + led_sysfs_disable(priv->leds[i]); + + backlight_update_status(priv->bl_dev); + + return 0; +} + +static int led_bl_remove(struct platform_device *pdev) +{ + struct led_bl_data *priv = platform_get_drvdata(pdev); + struct backlight_device *bl = priv->bl_dev; + int i; + + backlight_device_unregister(bl); + + led_bl_power_off(priv); + for (i = 0; i < priv->nb_leds; i++) + led_sysfs_enable(priv->leds[i]); + + return 0; +} + +static const struct of_device_id led_bl_of_match[] = { + { .compatible = "led-backlight" }, + { } +}; + +MODULE_DEVICE_TABLE(of, led_bl_of_match); + +static struct platform_driver led_bl_driver = { + .driver = { + .name = "led-backlight", + .of_match_table = of_match_ptr(led_bl_of_match), + }, + .probe = led_bl_probe, + .remove = led_bl_remove, +}; + +module_platform_driver(led_bl_driver); + +MODULE_DESCRIPTION("LED based Backlight Driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:led-backlight"); -- (english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 181 bytes --] ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: LED backlight on Droid 4 and others 2020-02-18 23:10 ` Pavel Machek @ 2020-02-19 7:47 ` Lee Jones 2020-02-19 16:19 ` Tony Lindgren 0 siblings, 1 reply; 12+ messages in thread From: Lee Jones @ 2020-02-19 7:47 UTC (permalink / raw) To: Pavel Machek Cc: Tony Lindgren, kernel list, linux-arm-kernel, linux-omap, sre, nekit1000, mpartap, merlijn, martin_rysavy, agx, daniel.thompson, jingoohan1, dri-devel, tomi.valkeinen, jjhiblot On Wed, 19 Feb 2020, Pavel Machek wrote: > Hi! > > > > > > > > It would be good to get LED backlight to work in clean way for 5.6 > > > > > > > kernel. > > > > > ... > > > > > > > [If you have an idea what else is needed, it would be welcome; it > > > > > > > works for me in development tree but not in tree I'd like to > > > > > > > upstream.] > > > > > > > > > > > > > > Lee, would you be willing to take "backlight: add led-backlight > > > > > > > driver"? Would it help if I got "leds: Add managed API to get a LED > > > > > > > from a device driver" and "leds: Add of_led_get() and led_put()" into > > > > > > > for_next tree of the LED subsystem? > > > > > > > > > > > > It looks like you have an open question from Tony on v10. > > > > > > > > > > > > Is that patch orthogonal, or are there depend{ants,encies}? > > > > > > > > > > Uhh looks like we messed up a bit with integration. Now droid4 > > > > > LCD backlight can no longer be enabled at all manually in v5.6-rc1 > > > > > without the "add led-backlight driver" patch.. Should we just > > > > > merge it to fix it rather than start scrambling with other > > > > > temporary hacks? > > > > > > > > We should just merge the "add led-backlight driver". Everything should > > > > be ready for it. I'm sorry if I broke something working, I was not > > > > aware it worked at all. > > > > > > > > Unfortunately, this is backlight code, not LED, so I can't just merge it. > > > > > > Please go ahead. Apply my Acked-by and merge away ASAP. > > > > > > Acked-by: Lee Jones <lee.jones@linaro.org> > > > > OK best to merge the driver via the LED tree: > > > > Acked-by: Tony Lindgren <tony@atomide.com> > > Tested-by: Tony Lindgren <tony@atomide.com> > > Is the patch below the one both of you are talking about? > > Hmm. I should s/default-brightness-level/default-brightness/ > below. > > Lee, I can of course take it (thanks), but won't Kconfig/Makefile > pieces cause rejects? It might be still better if you took it. I can > hand-edit it and submit it in form for easy application... tommorow. My suggestion would be to send it to Linus ASAP. Ideally it would get into the -rcs, as it 'fixes' things. > Best regards, > > Pavel > > commit 81a2daadf8dd6c8e0cbc3b60246932436be3c714 > Author: Tomi Valkeinen <tomi.valkeinen@ti.com> > Date: Thu Oct 3 10:28:12 2019 +0200 > > backlight: add led-backlight driver > > This patch adds a led-backlight driver (led_bl), which is similar to > pwm_bl except the driver uses a LED class driver to adjust the > brightness in the HW. Multiple LEDs can be used for a single backlight. > > Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> > Signed-off-by: Jean-Jacques Hiblot <jjhiblot@ti.com> > Acked-by: Pavel Machek <pavel@ucw.cz> > Reviewed-by: Daniel Thompson <daniel.thompson@linaro.org> > > diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig > index 4c8f73394aac..93836ef872f5 100644 > --- a/drivers/video/backlight/Kconfig > +++ b/drivers/video/backlight/Kconfig > @@ -463,6 +463,13 @@ config BACKLIGHT_RAVE_SP > help > Support for backlight control on RAVE SP device. > > +config BACKLIGHT_LED > + tristate "Generic LED based Backlight Driver" > + depends on LEDS_CLASS && OF > + help > + If you have a LCD backlight adjustable by LED class driver, say Y > + to enable this driver. > + > endif # BACKLIGHT_CLASS_DEVICE > > endmenu > diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile > index 961fb553b9c0..5e13242f31d6 100644 > --- a/drivers/video/backlight/Makefile > +++ b/drivers/video/backlight/Makefile > @@ -60,3 +60,4 @@ obj-$(CONFIG_BACKLIGHT_TPS65217) += tps65217_bl.o > 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 > diff --git a/drivers/video/backlight/led_bl.c b/drivers/video/backlight/led_bl.c > new file mode 100644 > index 000000000000..3f66549997c8 > --- /dev/null > +++ b/drivers/video/backlight/led_bl.c > @@ -0,0 +1,260 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Copyright (C) 2015-2019 Texas Instruments Incorporated - http://www.ti.com/ > + * Author: Tomi Valkeinen <tomi.valkeinen@ti.com> > + * > + * Based on pwm_bl.c > + */ > + > +#include <linux/backlight.h> > +#include <linux/leds.h> > +#include <linux/module.h> > +#include <linux/platform_device.h> > + > +struct led_bl_data { > + struct device *dev; > + struct backlight_device *bl_dev; > + struct led_classdev **leds; > + bool enabled; > + int nb_leds; > + unsigned int *levels; > + unsigned int default_brightness; > + unsigned int max_brightness; > +}; > + > +static void led_bl_set_brightness(struct led_bl_data *priv, int level) > +{ > + int i; > + int bkl_brightness; > + > + if (priv->levels) > + bkl_brightness = priv->levels[level]; > + else > + bkl_brightness = level; > + > + for (i = 0; i < priv->nb_leds; i++) > + led_set_brightness(priv->leds[i], bkl_brightness); > + > + priv->enabled = true; > +} > + > +static void led_bl_power_off(struct led_bl_data *priv) > +{ > + int i; > + > + if (!priv->enabled) > + return; > + > + for (i = 0; i < priv->nb_leds; i++) > + led_set_brightness(priv->leds[i], LED_OFF); > + > + priv->enabled = false; > +} > + > +static int led_bl_update_status(struct backlight_device *bl) > +{ > + struct led_bl_data *priv = bl_get_data(bl); > + int brightness = bl->props.brightness; > + > + if (bl->props.power != FB_BLANK_UNBLANK || > + bl->props.fb_blank != FB_BLANK_UNBLANK || > + bl->props.state & BL_CORE_FBBLANK) > + brightness = 0; > + > + if (brightness > 0) > + led_bl_set_brightness(priv, brightness); > + else > + led_bl_power_off(priv); > + > + return 0; > +} > + > +static const struct backlight_ops led_bl_ops = { > + .update_status = led_bl_update_status, > +}; > + > +static int led_bl_get_leds(struct device *dev, > + struct led_bl_data *priv) > +{ > + int i, nb_leds, ret; > + struct device_node *node = dev->of_node; > + struct led_classdev **leds; > + unsigned int max_brightness; > + unsigned int default_brightness; > + > + ret = of_count_phandle_with_args(node, "leds", NULL); > + if (ret < 0) { > + dev_err(dev, "Unable to get led count\n"); > + return -EINVAL; > + } > + > + nb_leds = ret; > + if (nb_leds < 1) { > + dev_err(dev, "At least one LED must be specified!\n"); > + return -EINVAL; > + } > + > + leds = devm_kzalloc(dev, sizeof(struct led_classdev *) * nb_leds, > + GFP_KERNEL); > + if (!leds) > + return -ENOMEM; > + > + for (i = 0; i < nb_leds; i++) { > + leds[i] = devm_of_led_get(dev, i); > + if (IS_ERR(leds[i])) > + return PTR_ERR(leds[i]); > + } > + > + /* check that the LEDs all have the same brightness range */ > + max_brightness = leds[0]->max_brightness; > + for (i = 1; i < nb_leds; i++) { > + if (max_brightness != leds[i]->max_brightness) { > + dev_err(dev, "LEDs must have identical ranges\n"); > + return -EINVAL; > + } > + } > + > + /* get the default brightness from the first LED from the list */ > + default_brightness = leds[0]->brightness; > + > + priv->nb_leds = nb_leds; > + priv->leds = leds; > + priv->max_brightness = max_brightness; > + priv->default_brightness = default_brightness; > + > + return 0; > +} > + > +static int led_bl_parse_levels(struct device *dev, > + struct led_bl_data *priv) > +{ > + struct device_node *node = dev->of_node; > + int num_levels; > + u32 value; > + int ret; > + > + if (!node) > + return -ENODEV; > + > + num_levels = of_property_count_u32_elems(node, "brightness-levels"); > + if (num_levels > 1) { > + int i; > + unsigned int db; > + u32 *levels = NULL; > + > + levels = devm_kzalloc(dev, sizeof(u32) * num_levels, > + GFP_KERNEL); > + if (!levels) > + return -ENOMEM; > + > + ret = of_property_read_u32_array(node, "brightness-levels", > + levels, > + num_levels); > + if (ret < 0) > + return ret; > + > + /* > + * Try to map actual LED brightness to backlight brightness > + * level > + */ > + db = priv->default_brightness; > + for (i = 0 ; i < num_levels; i++) { > + if ((i && db > levels[i-1]) && db <= levels[i]) > + break; > + } > + priv->default_brightness = i; > + priv->max_brightness = num_levels - 1; > + priv->levels = levels; > + } else if (num_levels >= 0) > + dev_warn(dev, "Not enough levels defined\n"); > + > + ret = of_property_read_u32(node, "default-brightness-level", &value); > + if (!ret && value <= priv->max_brightness) > + priv->default_brightness = value; > + else if (!ret && value > priv->max_brightness) > + dev_warn(dev, "Invalid default brightness. Ignoring it\n"); > + > + return 0; > +} > + > +static int led_bl_probe(struct platform_device *pdev) > +{ > + struct backlight_properties props; > + struct led_bl_data *priv; > + int ret, i; > + > + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); > + if (!priv) > + return -ENOMEM; > + > + platform_set_drvdata(pdev, priv); > + > + priv->dev = &pdev->dev; > + > + ret = led_bl_get_leds(&pdev->dev, priv); > + if (ret) > + return ret; > + > + ret = led_bl_parse_levels(&pdev->dev, priv); > + if (ret < 0) { > + dev_err(&pdev->dev, "Failed to parse DT data\n"); > + return ret; > + } > + > + memset(&props, 0, sizeof(struct backlight_properties)); > + props.type = BACKLIGHT_RAW; > + props.max_brightness = priv->max_brightness; > + props.brightness = priv->default_brightness; > + props.power = (priv->default_brightness > 0) ? FB_BLANK_POWERDOWN : > + FB_BLANK_UNBLANK; > + priv->bl_dev = backlight_device_register(dev_name(&pdev->dev), > + &pdev->dev, priv, &led_bl_ops, &props); > + if (IS_ERR(priv->bl_dev)) { > + dev_err(&pdev->dev, "Failed to register backlight\n"); > + return PTR_ERR(priv->bl_dev); > + } > + > + for (i = 0; i < priv->nb_leds; i++) > + led_sysfs_disable(priv->leds[i]); > + > + backlight_update_status(priv->bl_dev); > + > + return 0; > +} > + > +static int led_bl_remove(struct platform_device *pdev) > +{ > + struct led_bl_data *priv = platform_get_drvdata(pdev); > + struct backlight_device *bl = priv->bl_dev; > + int i; > + > + backlight_device_unregister(bl); > + > + led_bl_power_off(priv); > + for (i = 0; i < priv->nb_leds; i++) > + led_sysfs_enable(priv->leds[i]); > + > + return 0; > +} > + > +static const struct of_device_id led_bl_of_match[] = { > + { .compatible = "led-backlight" }, > + { } > +}; > + > +MODULE_DEVICE_TABLE(of, led_bl_of_match); > + > +static struct platform_driver led_bl_driver = { > + .driver = { > + .name = "led-backlight", > + .of_match_table = of_match_ptr(led_bl_of_match), > + }, > + .probe = led_bl_probe, > + .remove = led_bl_remove, > +}; > + > +module_platform_driver(led_bl_driver); > + > +MODULE_DESCRIPTION("LED based Backlight Driver"); > +MODULE_LICENSE("GPL"); > +MODULE_ALIAS("platform:led-backlight"); > -- Lee Jones [李琼斯] Linaro Services Technical Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: LED backlight on Droid 4 and others 2020-02-19 7:47 ` Lee Jones @ 2020-02-19 16:19 ` Tony Lindgren 0 siblings, 0 replies; 12+ messages in thread From: Tony Lindgren @ 2020-02-19 16:19 UTC (permalink / raw) To: Lee Jones Cc: Pavel Machek, kernel list, linux-arm-kernel, linux-omap, sre, nekit1000, mpartap, merlijn, martin_rysavy, agx, daniel.thompson, jingoohan1, dri-devel, tomi.valkeinen, jjhiblot * Lee Jones <lee.jones@linaro.org> [200219 07:47]: > On Wed, 19 Feb 2020, Pavel Machek wrote: > > > Hi! > > > > > > > > > > It would be good to get LED backlight to work in clean way for 5.6 > > > > > > > > kernel. > > > > > > ... > > > > > > > > [If you have an idea what else is needed, it would be welcome; it > > > > > > > > works for me in development tree but not in tree I'd like to > > > > > > > > upstream.] > > > > > > > > > > > > > > > > Lee, would you be willing to take "backlight: add led-backlight > > > > > > > > driver"? Would it help if I got "leds: Add managed API to get a LED > > > > > > > > from a device driver" and "leds: Add of_led_get() and led_put()" into > > > > > > > > for_next tree of the LED subsystem? > > > > > > > > > > > > > > It looks like you have an open question from Tony on v10. > > > > > > > > > > > > > > Is that patch orthogonal, or are there depend{ants,encies}? > > > > > > > > > > > > Uhh looks like we messed up a bit with integration. Now droid4 > > > > > > LCD backlight can no longer be enabled at all manually in v5.6-rc1 > > > > > > without the "add led-backlight driver" patch.. Should we just > > > > > > merge it to fix it rather than start scrambling with other > > > > > > temporary hacks? > > > > > > > > > > We should just merge the "add led-backlight driver". Everything should > > > > > be ready for it. I'm sorry if I broke something working, I was not > > > > > aware it worked at all. > > > > > > > > > > Unfortunately, this is backlight code, not LED, so I can't just merge it. > > > > > > > > Please go ahead. Apply my Acked-by and merge away ASAP. > > > > > > > > Acked-by: Lee Jones <lee.jones@linaro.org> > > > > > > OK best to merge the driver via the LED tree: > > > > > > Acked-by: Tony Lindgren <tony@atomide.com> > > > Tested-by: Tony Lindgren <tony@atomide.com> > > > > Is the patch below the one both of you are talking about? > > > > Hmm. I should s/default-brightness-level/default-brightness/ > > below. > > > > Lee, I can of course take it (thanks), but won't Kconfig/Makefile > > pieces cause rejects? It might be still better if you took it. I can > > hand-edit it and submit it in form for easy application... tommorow. > > My suggestion would be to send it to Linus ASAP. > > Ideally it would get into the -rcs, as it 'fixes' things. I agree. Pavel, the version of the patch you posted is all space trashed. Can you please post again so I can verify the related dts changes against it? Regards, Tony ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2020-02-19 16:19 UTC | newest] Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-01-05 18:32 LED backlight on Droid 4 and others Pavel Machek 2020-01-05 20:24 ` Tony Lindgren 2020-01-05 22:18 ` Pavel Machek 2020-01-05 23:55 ` Pavel Machek 2020-01-06 8:45 ` Lee Jones 2020-02-11 17:29 ` Tony Lindgren 2020-02-12 20:16 ` Pavel Machek 2020-02-18 13:52 ` Lee Jones 2020-02-18 14:14 ` Tony Lindgren 2020-02-18 23:10 ` Pavel Machek 2020-02-19 7:47 ` Lee Jones 2020-02-19 16:19 ` Tony Lindgren
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).