[PATCH v3 00/11] leds: lookup-table support + int3472/media privacy LED support

Hans de Goede
2022-12-16T11:31:14Z

Hi All,

Here is my 3th attempt at adjusting the INT3472 code's handling of
the privacy LED on x86 laptops with MIPI camera(s) so that it will also
work on devices which have a privacy-LED GPIO but not a clk-enable GPIO
(so that we cannot just tie the LED state to the clk-enable state).

Due to popular request by multiple people this new version now models
the privacy LED as a LED class device. This requires being able to
"tie" the LED class device to a specific camera sensor (some devices
have multiple sensors + privacy-LEDs).

Patches 1-5 are LED subsystem patches for this. 1 is a bug fix, 2-4
is a bit of refactoring in preparation for patch 5 which adds
generic (non devicetree specific) led_get() and devm_led_get() function
(which will also work with devicetree) and lookup table support to
allow platform code to add LED class-device <-> consumer-dev,function
lookups for non devicetree platforms.

Patch 6 adds generic privacy-LED support to the v4l2-core/v4l2-subdev.c
code automatically enabling the privacy-LED when s_stream(subdev, 1)
is called. So that we don't need to privacy-LED code to all the
camera sensor drivers separately (as requested by Sakari).

These are all new patches in version 3. Patches 7-11 are patches
to the platform specific INT3472 code to register privacy-LED class
devices + lookup table entries for privacy-LEDs described in
the special INT3472 ACPI nodes found on x86 devices with MIPI
cameras (+ prep work + some other INT3472 fixes).

Assuming the LED and media maintainers are happy with the approach
suggested here (if you are please give your Ack / Reviewed-by) we
need to talk about how to merge this since patches 6 and 7-11
depend on the LED subsystem changes. I think it would be best if
the LED subsystem can provide an immutable branch with patches 1-5
(on top of 6.2-rc1 once it is out) and then the media folks and I
can merge that branch and then apply the other patches on top.

This series has been tested on:

- Lenovo ThinkPad X1 Yoga gen 7, IPU6, front: ov2740 with privacy LED
- Dell Latitude 9420, IPU 6, front: ov01a1s with privacy LED
- Mirosoft Surface Go, IPU3, front: ov5693 with privacy LED
back: ov8865 with privacy LED (pled not yet supported)

Regards,

Hans

Hans de Goede (11):
leds: led-class: Add missing put_device() to led_put()
leds: led-class: Add __led_get() helper function
leds: led-class: Add __of_led_get() helper
leds: led-class: Add __devm_led_get() helper
leds: led-class: Add generic [devm_]led_get()
v4l: subdev: Make the v4l2-subdev core code enable/disable the privacy
LED if present
platform/x86: int3472/discrete: Refactor GPIO to sensor mapping
platform/x86: int3472/discrete: Create a LED class device for the
privacy LED
platform/x86: int3472/discrete: Move GPIO request to
skl_int3472_register_clock()
platform/x86: int3472/discrete: Ensure the clk/power enable pins are
in output mode
platform/x86: int3472/discrete: Get the polarity from the _DSM entry

drivers/leds/led-class.c | 174 +++++++++++++++---
drivers/media/v4l2-core/v4l2-subdev.c | 40 ++++
drivers/platform/x86/intel/int3472/Makefile | 2 +-
.../x86/intel/int3472/clk_and_regulator.c | 35 +++-
drivers/platform/x86/intel/int3472/common.h | 18 +-
drivers/platform/x86/intel/int3472/discrete.c | 96 +++++-----
drivers/platform/x86/intel/int3472/led.c | 75 ++++++++
include/linux/leds.h | 18 ++
include/media/v4l2-subdev.h | 3 +
9 files changed, 371 insertions(+), 90 deletions(-)
create mode 100644 drivers/platform/x86/intel/int3472/led.c

--
2.38.1