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