video: backlight: Add of_find_backlight helper in backlight.c

Add of_find_backlight, a helper function which is a generic version
of tinydrm_of_find_backlight that can be used by other drivers to avoid
repetition of code and simplify things.

Acked-by: Daniel Thompson <daniel.thompson@linaro.org>
Reviewed-by: Noralf Trønnes <noralf@tronnes.org>
Reviewed-by: Sean Paul <seanpaul@chromium.org>
Reviewed-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Meghana Madhyastha <meghana.madhyastha@gmail.com>
Signed-off-by: Sean Paul <seanpaul@chromium.org>
Link: https://patchwork.freedesktop.org/patch/msgid/116d160ba78be2e6dcbdcb6855622bce67da9472.1516810725.git.meghana.madhyastha@gmail.com
This commit is contained in:
Meghana Madhyastha 2018-01-24 16:35:30 +00:00 committed by Sean Paul
parent 5b698be049
commit c2adda27d2
2 changed files with 62 additions and 0 deletions

View file

@ -580,6 +580,49 @@ struct backlight_device *of_find_backlight_by_node(struct device_node *node)
EXPORT_SYMBOL(of_find_backlight_by_node);
#endif
/**
* of_find_backlight - 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 *of_find_backlight(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);
/*
* Note: gpio_backlight uses brightness as
* power state during probe
*/
if (!bd->props.brightness)
bd->props.brightness = bd->props.max_brightness;
}
}
return bd;
}
EXPORT_SYMBOL(of_find_backlight);
static void __exit backlight_class_exit(void)
{
class_destroy(backlight_class);

View file

@ -162,6 +162,16 @@ static inline int backlight_disable(struct backlight_device *bd)
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);
}
extern struct backlight_device *backlight_device_register(const char *name,
struct device *dev, void *devdata, const struct backlight_ops *ops,
const struct backlight_properties *props);
@ -205,4 +215,13 @@ of_find_backlight_by_node(struct device_node *node)
}
#endif
#if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)
struct backlight_device *of_find_backlight(struct device *dev);
#else
static inline struct backlight_device *of_find_backlight(struct device *dev)
{
return NULL;
}
#endif
#endif