[PATCH v7 1/3] backlight: Add IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)
Noralf Trønnes
noralf at tronnes.org
Mon Oct 9 15:35:05 UTC 2017
Den 09.10.2017 11.06, skrev Daniel Thompson:
> On 06/10/17 19:01, Noralf Trønnes wrote:
>>
>> Den 03.10.2017 11.04, skrev Daniel Vetter:
>>> On Tue, Oct 03, 2017 at 09:51:49AM +0100, Daniel Thompson wrote:
>>>> On 03/10/17 09:03, Daniel Vetter wrote:
>>>>> On Mon, Oct 02, 2017 at 12:00:54PM +0300, Jani Nikula wrote:
>>>>>> On Mon, 02 Oct 2017, Daniel Thompson <daniel.thompson at linaro.org>
>>>>>> wrote:
>>>>>>> So I'm coming to this patchset cold but can you explain *why*
>>>>>>> something
>>>>>>> wants to call of_find_backlight_by_node() when there is no
>>>>>>> backlight
>>>>>>> support enabled. Why isn't the code that called is conditional on
>>>>>>> BACKLIGHT_CLASS_DEVICE?
>>>>>>>
>>>>>>> The undefined symbol issue is a pain but to be honest I'd rather
>>>>>>> solve
>>>>>>> the use of undefined symbols by avoiding declaring them; this
>>>>>>> making
>>>>>>> them into compile errors rather than link errors.
>>>>>> Typically the kernel header files define static inline stubs of the
>>>>>> functions when the actual functions aren't configured/built. The
>>>>>> code
>>>>>> using the functions looks the same regardless of the config
>>>>>> option, and
>>>>>> handles the -ENODEV or NULL or whatever returns from the stubs
>>>>>> gracefully. With the inlines, the compiler can usually throw out
>>>>>> much of
>>>>>> the code anyway.
>>>>>>
>>>>>> In this regard, the backlight interface is an exception, forcing the
>>>>>> callers to wrap the code around
>>>>>> IS_ENABLED(BACKLIGHT_CLASS_DEVICE), not
>>>>>> the rule.
>>>>> fwiw, I think it'd be great if we can move backlight over to the
>>>>> common
>>>>> pattern, like everyone else. It's pretty big pain as-is ...
>>>> For sure, after Jani's mail yesterday I looked at the GMA500 driver
>>>> and
>>>> concluded I didn't want code related to backlight having to look
>>>> like that!
>>>>
>>>> Currently the three main patterns of use are:
>>>>
>>>> 1. Standalone drivers simple depend on BACKLIGHT_CLASS_DEVICE,
>>>> 2. Some compound drivers select BACKLIGHT_CLASS_DEVICE (the AMD DRM
>>>> driver is an example of this),
>>>> 3. Other compound drivers perform heroics with the pre-processor.
>>>>
>>>> The main reason I'm not just agreeing straight away is that, to
>>>> adopt the
>>>> static inline pattern for the whole API, we have to believe that #3
>>>> above is
>>>> desirable. Given the size and scope of the compound drivers in #3
>>>> above, I
>>>> don't entirely understand why they want to avoid the select.
>>> People love to over-configure their kernels and shave off a few
>>> bytes. And
>>> big gpu drivers might have backlight support, but not always need it
>>> (e.g.
>>> if you run without a panel as e.g. a tv set-top-box). Same with e.g. a
>>> driver that supports both OF/DT and pci to find its devices.
>>>
>>> On the desktop gpu driver side we don't really subscribe to this
>>> idea of
>>> making everything optional, hence select (mostly), except select is
>>> a huge
>>> pain. On the mobile/soc gpu side, #3 seems to be the desired outcome.
>>> Doing static inline helpers for backlights would make both easier
>>> (since
>>> in the end for desktop you just get a distro kernel that enables
>>> everything anyway).
>>>
>>> So yeah, imo if you think backlight should be a Kconfig, then it should
>>> have static inline dummy functions to make life simpler for
>>> everyone. Only
>>> exception are pure driver-only subsystem code which aren't ever
>>> called by
>>> anything outside of your subsystem. But since the point of the
>>> backlight
>>> subsystem is to provide backlight support to other drivers (there's
>>> still
>>> the dream that we don't offload this onto userspace, that just doesn't
>>> work well) we really should have these static inline helpers.
>>
>> I suggest we put all the backlight subsystem only functionality we need,
>> into the backlight subsystem :-)
>> I've put together a suggestion below and I've deliberately dropped the
>> of_ infix in backlight_get() to make room for possible future additions
>> that can make it possible to set the connection between device and
>> backlight using platform table or ACPI, fashioned after gpiolib.
>
> Looks good to me.
>
> If I've read this right, other sub-systems can use these symbols with
> or without BACKLIGHT_CLASS_DEVICE and still compile OK?
>
The code haven't seen a compiler, but that's the idea.
Noralf.
>
> Daniel.
>
>
>>
>>
>> include/linux/backlight.h:
>>
>> /**
>> * backlight_enable - Enable backlight
>> * @bd: the backlight device to enable
>> */
>> static inline int backlight_enable(struct backlight_device *bd)
>> {
>> if (!bd)
>> return 0;
>>
>> bd->props.power = FB_BLANK_UNBLANK;
>> bd->props.state &= ~BL_CORE_FBBLANK;
>>
>> return backlight_update_status(bd);
>> }
>>
>> /**
>> * backlight_disable - Disable backlight
>> * @bd: the backlight device to disable
>> */
>> static inline int backlight_disable(struct backlight_device *bd)
>> {
>> if (!bd)
>> return 0;
>>
>> bd->props.power = FB_BLANK_POWERDOWN;
>> bd->props.state |= BL_CORE_FBBLANK;
>>
>> return backlight_update_status(bd);
>> }
>>
>> /**
>> * backlight_put - Drop backlight reference
>> * @bd: the backlight device to put
>> */
>> static inline void backlight_put(struct backlight_device *bd)
>> {
>> if (bd)
>> put_device(bd->dev);
>> }
>>
>> #if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)
>> struct backlight_device *backlight_get(struct device *dev);
>> struct backlight_device *devm_backlight_get(struct device *dev);
>> #else
>> static inline struct backlight_device *backlight_get(struct device *dev)
>> {
>> return NULL;
>> }
>>
>> static inline struct backlight_device *devm_backlight_get(struct
>> device *dev)
>> {
>> return NULL;
>> }
>> #endif
>>
>>
>>
>> drivers/video/backlight/backlight.c:
>>
>> /**
>> * backlight_get - Get backlight device
>> * @dev: Device
>> *
>> * This function looks for a property named 'backlight' on the DT node
>> * connected to @dev and looks up the backlight device.
>> *
>> * Call backlight_put() to drop the reference on the backlight device.
>> *
>> * Returns:
>> * A pointer to the backlight device if found.
>> * Error pointer -EPROBE_DEFER if the DT property is set, but no
>> backlight
>> * device is found.
>> * NULL if there's no backlight property.
>> */
>> struct backlight_device *backlight_get(struct device *dev)
>> {
>> struct backlight_device *bd = NULL;
>> struct device_node *np;
>>
>> if (!dev)
>> return NULL;
>>
>> if (IS_ENABLED(CONFIG_OF) && dev->of_node) {
>> np = of_parse_phandle(dev->of_node, 'backlight', 0);
>> if (np) {
>> bd = of_find_backlight_by_node(np);
>> of_node_put(np);
>> if (!bd)
>> return ERR_PTR(-EPROBE_DEFER);
>> }
>> }
>>
>> return bd;
>> }
>> EXPORT_SYMBOL(backlight_get);
>>
>> static void devm_backlight_get_release(void *data)
>> {
>> backlight_put(data);
>> }
>>
>> /**
>> * devm_backlight_get - Resource-managed backlight_get()
>> * @dev: Device
>> *
>> * Device managed version of backlight_get(). The reference on the
>> backlight
>> * device is automatically dropped on driver detach.
>> */
>> struct backlight_device *devm_backlight_get(struct device *dev)
>> {
>> struct backlight_device *bd;
>> int ret;
>>
>> bd = backlight_get(dev);
>> if (!bd)
>> return NULL;
>>
>> ret = devm_add_action(dev, devm_backlight_get_release, bd);
>> if (ret) {
>> backlight_put(bd);
>> return ERR_PTR(ret);
>> }
>>
>> return bd;
>> }
>> EXPORT_SYMBOL(devm_backlight_get);
>>
>>
>
More information about the dri-devel
mailing list