video: backlight: Add of_find_backlight helper in backlight.c
authorMeghana Madhyastha <meghana.madhyastha@gmail.com>
Wed, 24 Jan 2018 16:35:30 +0000 (16:35 +0000)
committerSean Paul <seanpaul@chromium.org>
Mon, 29 Jan 2018 15:34:53 +0000 (10:34 -0500)
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
drivers/video/backlight/backlight.c
include/linux/backlight.h

index 8049e7656daa758dd1bceee187426b2afc40493c..553bf5c4807c9ef7d1c65894e177238229387720 100644 (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);
index ace825e2ca2d7420292f79e70c339e71d8fea943..ddc9bade4fb2905bd063725f77fd7cad88b893f7 100644 (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