1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (c) 2016 Google, Inc 4 * Written by Simon Glass <sjg@chromium.org> 5 */ 6 7 #include <common.h> 8 #include <backlight.h> 9 #include <dm.h> 10 #include <panel.h> 11 #include <asm/gpio.h> 12 #include <power/regulator.h> 13 14 struct simple_panel_priv { 15 struct udevice *reg; 16 struct udevice *backlight; 17 struct gpio_desc enable; 18 }; 19 20 static int simple_panel_enable_backlight(struct udevice *dev) 21 { 22 struct simple_panel_priv *priv = dev_get_priv(dev); 23 int ret; 24 25 debug("%s: start, backlight = '%s'\n", __func__, priv->backlight->name); 26 dm_gpio_set_value(&priv->enable, 1); 27 ret = backlight_enable(priv->backlight); 28 debug("%s: done, ret = %d\n", __func__, ret); 29 if (ret) 30 return ret; 31 32 return 0; 33 } 34 35 static int simple_panel_ofdata_to_platdata(struct udevice *dev) 36 { 37 struct simple_panel_priv *priv = dev_get_priv(dev); 38 int ret; 39 40 if (IS_ENABLED(CONFIG_DM_REGULATOR)) { 41 ret = uclass_get_device_by_phandle(UCLASS_REGULATOR, dev, 42 "power-supply", &priv->reg); 43 if (ret) { 44 debug("%s: Warning: cannot get power supply: ret=%d\n", 45 __func__, ret); 46 if (ret != -ENOENT) 47 return ret; 48 } 49 } 50 ret = uclass_get_device_by_phandle(UCLASS_PANEL_BACKLIGHT, dev, 51 "backlight", &priv->backlight); 52 if (ret) { 53 debug("%s: Cannot get backlight: ret=%d\n", __func__, ret); 54 return ret; 55 } 56 ret = gpio_request_by_name(dev, "enable-gpios", 0, &priv->enable, 57 GPIOD_IS_OUT); 58 if (ret) { 59 debug("%s: Warning: cannot get enable GPIO: ret=%d\n", 60 __func__, ret); 61 if (ret != -ENOENT) 62 return ret; 63 } 64 65 return 0; 66 } 67 68 static int simple_panel_probe(struct udevice *dev) 69 { 70 struct simple_panel_priv *priv = dev_get_priv(dev); 71 int ret; 72 73 if (IS_ENABLED(CONFIG_DM_REGULATOR) && priv->reg) { 74 debug("%s: Enable regulator '%s'\n", __func__, priv->reg->name); 75 ret = regulator_set_enable(priv->reg, true); 76 if (ret) 77 return ret; 78 } 79 80 return 0; 81 } 82 83 static const struct panel_ops simple_panel_ops = { 84 .enable_backlight = simple_panel_enable_backlight, 85 }; 86 87 static const struct udevice_id simple_panel_ids[] = { 88 { .compatible = "simple-panel" }, 89 { .compatible = "auo,b133xtn01" }, 90 { .compatible = "auo,b116xw03" }, 91 { .compatible = "auo,b133htn01" }, 92 { } 93 }; 94 95 U_BOOT_DRIVER(simple_panel) = { 96 .name = "simple_panel", 97 .id = UCLASS_PANEL, 98 .of_match = simple_panel_ids, 99 .ops = &simple_panel_ops, 100 .ofdata_to_platdata = simple_panel_ofdata_to_platdata, 101 .probe = simple_panel_probe, 102 .priv_auto_alloc_size = sizeof(struct simple_panel_priv), 103 }; 104