1*83d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
25b6a6a91SPatrick Delaunay /*
35b6a6a91SPatrick Delaunay * Copyright (C) 2017, STMicroelectronics - All Rights Reserved
45b6a6a91SPatrick Delaunay * Author: Patrick Delaunay <patrick.delaunay@st.com>
55b6a6a91SPatrick Delaunay */
65b6a6a91SPatrick Delaunay
75b6a6a91SPatrick Delaunay #include <common.h>
85b6a6a91SPatrick Delaunay #include <dm.h>
95b6a6a91SPatrick Delaunay #include <backlight.h>
105b6a6a91SPatrick Delaunay #include <asm/gpio.h>
115b6a6a91SPatrick Delaunay
125b6a6a91SPatrick Delaunay struct gpio_backlight_priv {
135b6a6a91SPatrick Delaunay struct gpio_desc gpio;
145b6a6a91SPatrick Delaunay bool def_value;
155b6a6a91SPatrick Delaunay };
165b6a6a91SPatrick Delaunay
gpio_backlight_enable(struct udevice * dev)175b6a6a91SPatrick Delaunay static int gpio_backlight_enable(struct udevice *dev)
185b6a6a91SPatrick Delaunay {
195b6a6a91SPatrick Delaunay struct gpio_backlight_priv *priv = dev_get_priv(dev);
205b6a6a91SPatrick Delaunay
215b6a6a91SPatrick Delaunay dm_gpio_set_value(&priv->gpio, 1);
225b6a6a91SPatrick Delaunay
235b6a6a91SPatrick Delaunay return 0;
245b6a6a91SPatrick Delaunay }
255b6a6a91SPatrick Delaunay
gpio_backlight_ofdata_to_platdata(struct udevice * dev)265b6a6a91SPatrick Delaunay static int gpio_backlight_ofdata_to_platdata(struct udevice *dev)
275b6a6a91SPatrick Delaunay {
285b6a6a91SPatrick Delaunay struct gpio_backlight_priv *priv = dev_get_priv(dev);
295b6a6a91SPatrick Delaunay int ret;
305b6a6a91SPatrick Delaunay
315b6a6a91SPatrick Delaunay ret = gpio_request_by_name(dev, "gpios", 0, &priv->gpio,
325b6a6a91SPatrick Delaunay GPIOD_IS_OUT);
335b6a6a91SPatrick Delaunay if (ret) {
345b6a6a91SPatrick Delaunay debug("%s: Warning: cannot get GPIO: ret=%d\n",
355b6a6a91SPatrick Delaunay __func__, ret);
365b6a6a91SPatrick Delaunay return ret;
375b6a6a91SPatrick Delaunay }
385b6a6a91SPatrick Delaunay
395b6a6a91SPatrick Delaunay priv->def_value = dev_read_bool(dev, "default-on");
405b6a6a91SPatrick Delaunay
415b6a6a91SPatrick Delaunay return 0;
425b6a6a91SPatrick Delaunay }
435b6a6a91SPatrick Delaunay
gpio_backlight_probe(struct udevice * dev)445b6a6a91SPatrick Delaunay static int gpio_backlight_probe(struct udevice *dev)
455b6a6a91SPatrick Delaunay {
465b6a6a91SPatrick Delaunay struct gpio_backlight_priv *priv = dev_get_priv(dev);
475b6a6a91SPatrick Delaunay
485b6a6a91SPatrick Delaunay if (priv->def_value)
495b6a6a91SPatrick Delaunay gpio_backlight_enable(dev);
505b6a6a91SPatrick Delaunay
515b6a6a91SPatrick Delaunay return 0;
525b6a6a91SPatrick Delaunay }
535b6a6a91SPatrick Delaunay
545b6a6a91SPatrick Delaunay static const struct backlight_ops gpio_backlight_ops = {
555b6a6a91SPatrick Delaunay .enable = gpio_backlight_enable,
565b6a6a91SPatrick Delaunay };
575b6a6a91SPatrick Delaunay
585b6a6a91SPatrick Delaunay static const struct udevice_id gpio_backlight_ids[] = {
595b6a6a91SPatrick Delaunay { .compatible = "gpio-backlight" },
605b6a6a91SPatrick Delaunay { }
615b6a6a91SPatrick Delaunay };
625b6a6a91SPatrick Delaunay
635b6a6a91SPatrick Delaunay U_BOOT_DRIVER(gpio_backlight) = {
645b6a6a91SPatrick Delaunay .name = "gpio_backlight",
655b6a6a91SPatrick Delaunay .id = UCLASS_PANEL_BACKLIGHT,
665b6a6a91SPatrick Delaunay .of_match = gpio_backlight_ids,
675b6a6a91SPatrick Delaunay .ops = &gpio_backlight_ops,
685b6a6a91SPatrick Delaunay .ofdata_to_platdata = gpio_backlight_ofdata_to_platdata,
695b6a6a91SPatrick Delaunay .probe = gpio_backlight_probe,
705b6a6a91SPatrick Delaunay .priv_auto_alloc_size = sizeof(struct gpio_backlight_priv),
715b6a6a91SPatrick Delaunay };
72