1*801ab9e9SSimon Glass /* 2*801ab9e9SSimon Glass * Copyright (C) 2015 Google, Inc 3*801ab9e9SSimon Glass * Written by Simon Glass <sjg@chromium.org> 4*801ab9e9SSimon Glass * 5*801ab9e9SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 6*801ab9e9SSimon Glass */ 7*801ab9e9SSimon Glass 8*801ab9e9SSimon Glass #include <common.h> 9*801ab9e9SSimon Glass #include <dm.h> 10*801ab9e9SSimon Glass #include <errno.h> 11*801ab9e9SSimon Glass #include <video_bridge.h> 12*801ab9e9SSimon Glass 13*801ab9e9SSimon Glass int video_bridge_set_backlight(struct udevice *dev, int percent) 14*801ab9e9SSimon Glass { 15*801ab9e9SSimon Glass struct video_bridge_ops *ops = video_bridge_get_ops(dev); 16*801ab9e9SSimon Glass 17*801ab9e9SSimon Glass if (!ops->set_backlight) 18*801ab9e9SSimon Glass return -ENOSYS; 19*801ab9e9SSimon Glass 20*801ab9e9SSimon Glass return ops->set_backlight(dev, percent); 21*801ab9e9SSimon Glass } 22*801ab9e9SSimon Glass 23*801ab9e9SSimon Glass int video_bridge_attach(struct udevice *dev) 24*801ab9e9SSimon Glass { 25*801ab9e9SSimon Glass struct video_bridge_ops *ops = video_bridge_get_ops(dev); 26*801ab9e9SSimon Glass 27*801ab9e9SSimon Glass if (!ops->attach) 28*801ab9e9SSimon Glass return -ENOSYS; 29*801ab9e9SSimon Glass 30*801ab9e9SSimon Glass return ops->attach(dev); 31*801ab9e9SSimon Glass } 32*801ab9e9SSimon Glass 33*801ab9e9SSimon Glass int video_bridge_check_attached(struct udevice *dev) 34*801ab9e9SSimon Glass { 35*801ab9e9SSimon Glass struct video_bridge_priv *uc_priv = dev_get_uclass_priv(dev); 36*801ab9e9SSimon Glass struct video_bridge_ops *ops = video_bridge_get_ops(dev); 37*801ab9e9SSimon Glass int ret; 38*801ab9e9SSimon Glass 39*801ab9e9SSimon Glass if (!ops->check_attached) { 40*801ab9e9SSimon Glass ret = dm_gpio_get_value(&uc_priv->hotplug); 41*801ab9e9SSimon Glass 42*801ab9e9SSimon Glass return ret > 0 ? 0 : ret == 0 ? -ENOTCONN : ret; 43*801ab9e9SSimon Glass } 44*801ab9e9SSimon Glass 45*801ab9e9SSimon Glass return ops->check_attached(dev); 46*801ab9e9SSimon Glass } 47*801ab9e9SSimon Glass 48*801ab9e9SSimon Glass static int video_bridge_pre_probe(struct udevice *dev) 49*801ab9e9SSimon Glass { 50*801ab9e9SSimon Glass struct video_bridge_priv *uc_priv = dev_get_uclass_priv(dev); 51*801ab9e9SSimon Glass int ret; 52*801ab9e9SSimon Glass 53*801ab9e9SSimon Glass debug("%s\n", __func__); 54*801ab9e9SSimon Glass ret = gpio_request_by_name(dev, "sleep-gpios", 0, 55*801ab9e9SSimon Glass &uc_priv->sleep, GPIOD_IS_OUT); 56*801ab9e9SSimon Glass if (ret) { 57*801ab9e9SSimon Glass debug("%s: Could not decode sleep-gpios (%d)\n", __func__, ret); 58*801ab9e9SSimon Glass return ret; 59*801ab9e9SSimon Glass } 60*801ab9e9SSimon Glass ret = dm_gpio_set_pull(&uc_priv->sleep, GPIO_PULL_NONE); 61*801ab9e9SSimon Glass if (ret) { 62*801ab9e9SSimon Glass debug("%s: Could not set sleep pull value\n", __func__); 63*801ab9e9SSimon Glass return ret; 64*801ab9e9SSimon Glass } 65*801ab9e9SSimon Glass ret = gpio_request_by_name(dev, "reset-gpios", 0, &uc_priv->reset, 66*801ab9e9SSimon Glass GPIOD_IS_OUT); 67*801ab9e9SSimon Glass if (ret) { 68*801ab9e9SSimon Glass debug("%s: Could not decode reset-gpios (%d)\n", __func__, ret); 69*801ab9e9SSimon Glass return ret; 70*801ab9e9SSimon Glass } 71*801ab9e9SSimon Glass ret = dm_gpio_set_pull(&uc_priv->reset, GPIO_PULL_NONE); 72*801ab9e9SSimon Glass if (ret) { 73*801ab9e9SSimon Glass debug("%s: Could not set reset pull value\n", __func__); 74*801ab9e9SSimon Glass return ret; 75*801ab9e9SSimon Glass } 76*801ab9e9SSimon Glass ret = gpio_request_by_name(dev, "hotplug-gpios", 0, &uc_priv->hotplug, 77*801ab9e9SSimon Glass GPIOD_IS_IN); 78*801ab9e9SSimon Glass if (ret && ret != -ENOENT) { 79*801ab9e9SSimon Glass debug("%s: Could not decode hotplug (%d)\n", __func__, ret); 80*801ab9e9SSimon Glass return ret; 81*801ab9e9SSimon Glass } 82*801ab9e9SSimon Glass 83*801ab9e9SSimon Glass return 0; 84*801ab9e9SSimon Glass } 85*801ab9e9SSimon Glass 86*801ab9e9SSimon Glass int video_bridge_set_active(struct udevice *dev, bool active) 87*801ab9e9SSimon Glass { 88*801ab9e9SSimon Glass struct video_bridge_priv *uc_priv = dev_get_uclass_priv(dev); 89*801ab9e9SSimon Glass int ret; 90*801ab9e9SSimon Glass 91*801ab9e9SSimon Glass debug("%s: %d\n", __func__, active); 92*801ab9e9SSimon Glass ret = dm_gpio_set_value(&uc_priv->sleep, !active); 93*801ab9e9SSimon Glass if (ret) 94*801ab9e9SSimon Glass return ret; 95*801ab9e9SSimon Glass if (active) { 96*801ab9e9SSimon Glass ret = dm_gpio_set_value(&uc_priv->reset, true); 97*801ab9e9SSimon Glass if (ret) 98*801ab9e9SSimon Glass return ret; 99*801ab9e9SSimon Glass udelay(10); 100*801ab9e9SSimon Glass ret = dm_gpio_set_value(&uc_priv->reset, false); 101*801ab9e9SSimon Glass } 102*801ab9e9SSimon Glass 103*801ab9e9SSimon Glass return ret; 104*801ab9e9SSimon Glass } 105*801ab9e9SSimon Glass 106*801ab9e9SSimon Glass UCLASS_DRIVER(video_bridge) = { 107*801ab9e9SSimon Glass .id = UCLASS_VIDEO_BRIDGE, 108*801ab9e9SSimon Glass .name = "video_bridge", 109*801ab9e9SSimon Glass .per_device_auto_alloc_size = sizeof(struct video_bridge_priv), 110*801ab9e9SSimon Glass .pre_probe = video_bridge_pre_probe, 111*801ab9e9SSimon Glass }; 112