Benjamin, On Thu, Jun 8, 2023 at 8:37 AM Benjamin Tissoires <benjamin.tissoires@xxxxxxxxxx> wrote: > > > +static const struct drm_panel_follower_funcs i2c_hid_core_panel_follower_funcs = { > > + .panel_prepared = i2c_hid_core_panel_prepared, > > + .panel_unpreparing = i2c_hid_core_panel_unpreparing, > > +}; > > Can we make that above block at least behind a Kconfig? > > i2c-hid is often used for touchpads, and the notion of drm panel has > nothing to do with them. So I'd be more confident if we could disable > that code if not required. Now that other concerns are addressed, I started trying to write up a v3 and I found myself writing this as the description of the Kconfig entry: -- config I2C_HID_SUPPORT_PANEL_FOLLOWER bool "Support i2c-hid devices that must be power sequenced with a panel" Say Y here if you want support for i2c-hid devices that need to coordinate power sequencing with a panel. This is typically important when you have a panel and a touchscreen that share power rails or reset GPIOs. If you say N here then the kernel will not try to honor any shared power sequencing for your hardware. In the best case, ignoring power sequencing when it's needed will draw extra power. In the worst case this will prevent your hardware from functioning or could even damage your hardware. If unsure, say Y. -- I can certainly go that way, but I just wanted to truly make sure that's what we want. Specifically: 1. If we put the panel follower code behind a Kconfig then we actually have no idea if a touchscreen was intended to be a panel follower. Specifically the panel follower API is the one that detects the connection between the panel and the i2c-hid device, so without being able to call the panel follower API we have no idea that an i2c-hid device was supposed to be a panel follower. 2. It is conceivable that power sequencing a device incorrectly could truly cause hardware damage. Together, those points mean that if you turn off the Kconfig entry and then try to boot on a device that needed that Kconfig setting that you might damage hardware. I can code it up that way if you want, but it worries me... Alternatives that I can think of: a) I could change the panel follower API so that panel followers are in charge of detecting the panel that they follow. Today, that looks like: panel_np = of_parse_phandle(dev->of_node, "panel", 0); if (panel_np) /* It's a panel follower */ of_node_put(panel_np); ...so we could put that code in each touchscreen driver and then fail to probe i2c-hid if we detect that we're supposed to be a panel follower but the Kconfig is turned off. The above doesn't seem massively ideal since it duplicates code. Also, one reason why I put that code in drm_panel_add_follower() is that I think this concept will eventually be needed even for non-DT cases. I don't know how to write the non-DT code right now, though... b) I could open-code detect the panel follower case but leave the actual linking to the panel follower API. AKA add to i2c-hid: if (of_property_read_bool(dev->of_node, "panel")) /* It's a panel follower */ ...that's a smaller bit of code, but feels like an abstraction violation. It also would need to be updated if/when we added support for non-DT panel followers. c) I could add a "static inline" implementation of b) to "drm_panel.h". That sounds great and I started doing it. ...but then realized that it means adding to drm_panel.h: #include <linux/device.h> #include <linux/of.h> ...because otherwise of_property_read_bool() isn't defined and "struct device" can't be dereferenced. That might be OK, but it looks as if folks have been working hard to avoid things like this in header files. Presumably it would get uglier if/when we added the non-DT case, as well. That being said, I can give it a shot... -- At this point, I'm hoping for some advice. How important is it for you to have a Kconfig for "I2C_HID_SUPPORT_PANEL_FOLLOWER"? NOTE: even if I don't add the Kconfig, I could at least create a function for registering the panel follower that would get most of the panel follower logic out of the probe function. Would that be enough? Thanks! -Doug