1801ab9e9SSimon Glass /* 2801ab9e9SSimon Glass * Copyright (C) 2015 Google, Inc 3801ab9e9SSimon Glass * Written by Simon Glass <sjg@chromium.org> 4801ab9e9SSimon Glass * 5801ab9e9SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 6801ab9e9SSimon Glass */ 7801ab9e9SSimon Glass 8801ab9e9SSimon Glass #include <common.h> 9801ab9e9SSimon Glass #include <dm.h> 10801ab9e9SSimon Glass #include <errno.h> 11801ab9e9SSimon Glass #include <video_bridge.h> 12801ab9e9SSimon Glass 13801ab9e9SSimon Glass int video_bridge_set_backlight(struct udevice *dev, int percent) 14801ab9e9SSimon Glass { 15801ab9e9SSimon Glass struct video_bridge_ops *ops = video_bridge_get_ops(dev); 16801ab9e9SSimon Glass 17801ab9e9SSimon Glass if (!ops->set_backlight) 18801ab9e9SSimon Glass return -ENOSYS; 19801ab9e9SSimon Glass 20801ab9e9SSimon Glass return ops->set_backlight(dev, percent); 21801ab9e9SSimon Glass } 22801ab9e9SSimon Glass 23801ab9e9SSimon Glass int video_bridge_attach(struct udevice *dev) 24801ab9e9SSimon Glass { 25801ab9e9SSimon Glass struct video_bridge_ops *ops = video_bridge_get_ops(dev); 26801ab9e9SSimon Glass 27801ab9e9SSimon Glass if (!ops->attach) 28801ab9e9SSimon Glass return -ENOSYS; 29801ab9e9SSimon Glass 30801ab9e9SSimon Glass return ops->attach(dev); 31801ab9e9SSimon Glass } 32801ab9e9SSimon Glass 33801ab9e9SSimon Glass int video_bridge_check_attached(struct udevice *dev) 34801ab9e9SSimon Glass { 35801ab9e9SSimon Glass struct video_bridge_priv *uc_priv = dev_get_uclass_priv(dev); 36801ab9e9SSimon Glass struct video_bridge_ops *ops = video_bridge_get_ops(dev); 37801ab9e9SSimon Glass int ret; 38801ab9e9SSimon Glass 39801ab9e9SSimon Glass if (!ops->check_attached) { 40801ab9e9SSimon Glass ret = dm_gpio_get_value(&uc_priv->hotplug); 41801ab9e9SSimon Glass 42801ab9e9SSimon Glass return ret > 0 ? 0 : ret == 0 ? -ENOTCONN : ret; 43801ab9e9SSimon Glass } 44801ab9e9SSimon Glass 45801ab9e9SSimon Glass return ops->check_attached(dev); 46801ab9e9SSimon Glass } 47801ab9e9SSimon Glass 48801ab9e9SSimon Glass static int video_bridge_pre_probe(struct udevice *dev) 49801ab9e9SSimon Glass { 50801ab9e9SSimon Glass struct video_bridge_priv *uc_priv = dev_get_uclass_priv(dev); 51801ab9e9SSimon Glass int ret; 52801ab9e9SSimon Glass 53801ab9e9SSimon Glass debug("%s\n", __func__); 54801ab9e9SSimon Glass ret = gpio_request_by_name(dev, "sleep-gpios", 0, 55801ab9e9SSimon Glass &uc_priv->sleep, GPIOD_IS_OUT); 56801ab9e9SSimon Glass if (ret) { 57801ab9e9SSimon Glass debug("%s: Could not decode sleep-gpios (%d)\n", __func__, ret); 58*d4bf91adSSimon Glass if (ret != -ENOENT) 59801ab9e9SSimon Glass return ret; 60801ab9e9SSimon Glass } 615eaeadaaSSimon Glass /* 625eaeadaaSSimon Glass * Drop this for now as we do not have driver model pinctrl support 635eaeadaaSSimon Glass * 645eaeadaaSSimon Glass * ret = dm_gpio_set_pull(&uc_priv->sleep, GPIO_PULL_NONE); 655eaeadaaSSimon Glass * if (ret) { 665eaeadaaSSimon Glass * debug("%s: Could not set sleep pull value\n", __func__); 675eaeadaaSSimon Glass * return ret; 685eaeadaaSSimon Glass * } 695eaeadaaSSimon Glass */ 70801ab9e9SSimon Glass ret = gpio_request_by_name(dev, "reset-gpios", 0, &uc_priv->reset, 71801ab9e9SSimon Glass GPIOD_IS_OUT); 72801ab9e9SSimon Glass if (ret) { 73801ab9e9SSimon Glass debug("%s: Could not decode reset-gpios (%d)\n", __func__, ret); 74*d4bf91adSSimon Glass if (ret != -ENOENT) 75801ab9e9SSimon Glass return ret; 76801ab9e9SSimon Glass } 775eaeadaaSSimon Glass /* 785eaeadaaSSimon Glass * Drop this for now as we do not have driver model pinctrl support 795eaeadaaSSimon Glass * 805eaeadaaSSimon Glass * ret = dm_gpio_set_pull(&uc_priv->reset, GPIO_PULL_NONE); 815eaeadaaSSimon Glass * if (ret) { 825eaeadaaSSimon Glass * debug("%s: Could not set reset pull value\n", __func__); 835eaeadaaSSimon Glass * return ret; 845eaeadaaSSimon Glass * } 855eaeadaaSSimon Glass */ 86801ab9e9SSimon Glass ret = gpio_request_by_name(dev, "hotplug-gpios", 0, &uc_priv->hotplug, 87801ab9e9SSimon Glass GPIOD_IS_IN); 88*d4bf91adSSimon Glass if (ret) { 89801ab9e9SSimon Glass debug("%s: Could not decode hotplug (%d)\n", __func__, ret); 90*d4bf91adSSimon Glass if (ret != -ENOENT) 91801ab9e9SSimon Glass return ret; 92801ab9e9SSimon Glass } 93801ab9e9SSimon Glass 94801ab9e9SSimon Glass return 0; 95801ab9e9SSimon Glass } 96801ab9e9SSimon Glass 97801ab9e9SSimon Glass int video_bridge_set_active(struct udevice *dev, bool active) 98801ab9e9SSimon Glass { 99801ab9e9SSimon Glass struct video_bridge_priv *uc_priv = dev_get_uclass_priv(dev); 100801ab9e9SSimon Glass int ret; 101801ab9e9SSimon Glass 102801ab9e9SSimon Glass debug("%s: %d\n", __func__, active); 103801ab9e9SSimon Glass ret = dm_gpio_set_value(&uc_priv->sleep, !active); 104801ab9e9SSimon Glass if (ret) 105801ab9e9SSimon Glass return ret; 106801ab9e9SSimon Glass if (active) { 107801ab9e9SSimon Glass ret = dm_gpio_set_value(&uc_priv->reset, true); 108801ab9e9SSimon Glass if (ret) 109801ab9e9SSimon Glass return ret; 110801ab9e9SSimon Glass udelay(10); 111801ab9e9SSimon Glass ret = dm_gpio_set_value(&uc_priv->reset, false); 112801ab9e9SSimon Glass } 113801ab9e9SSimon Glass 114801ab9e9SSimon Glass return ret; 115801ab9e9SSimon Glass } 116801ab9e9SSimon Glass 117801ab9e9SSimon Glass UCLASS_DRIVER(video_bridge) = { 118801ab9e9SSimon Glass .id = UCLASS_VIDEO_BRIDGE, 119801ab9e9SSimon Glass .name = "video_bridge", 120801ab9e9SSimon Glass .per_device_auto_alloc_size = sizeof(struct video_bridge_priv), 121801ab9e9SSimon Glass .pre_probe = video_bridge_pre_probe, 122801ab9e9SSimon Glass }; 123