xref: /rk3399_rockchip-uboot/drivers/video/bridge/video-bridge-uclass.c (revision d4bf91ada110aeb26f844cbe95cdb9b1ddb87f19)
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