xref: /OK3568_Linux_fs/u-boot/drivers/video/drm/rk1000.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
4  */
5 
6 #include <common.h>
7 #include <dm.h>
8 #include <errno.h>
9 #include <i2c.h>
10 #include <dm/pinctrl.h>
11 #include <dm/uclass.h>
12 #include <dm/uclass-id.h>
13 
14 #include "rk1000.h"
15 
16 #define CTRL_ADC		0x00
17 #define ADC_OFF			0x88
18 #define CTRL_CODEC		0x01
19 #define CODEC_OFF		0x0d
20 #define CTRL_I2C		0x02
21 #define I2C_TIMEOUT_PERIOD	0x22
22 #define CTRL_TVE		0x03
23 #define TVE_OFF			0x00
24 
rk1000_ctl_i2c_write(struct rk1000_ctl * rk1000_ctl,u8 reg,u8 val)25 int rk1000_ctl_i2c_write(struct rk1000_ctl *rk1000_ctl, u8 reg, u8 val)
26 {
27 	struct dm_i2c_chip *chip = dev_get_parent_platdata(rk1000_ctl->dev);
28 	struct i2c_msg msg;
29 	u8 buf[2];
30 	int ret;
31 
32 	buf[0] = reg;
33 	buf[1] = val;
34 	msg.addr = chip->chip_addr;
35 	msg.flags = 0;
36 	msg.len = 2;
37 	msg.buf = buf;
38 
39 	ret = dm_i2c_xfer(rk1000_ctl->dev, &msg, 1);
40 	if (ret) {
41 		dev_err(rk1000_ctl->dev, "rk1000 ctrl i2c write failed: %d\n",
42 			ret);
43 		return ret;
44 	}
45 
46 	return 0;
47 }
48 
rk1000_ctl_i2c_read(struct rk1000_ctl * rk1000_ctl,u8 reg,u8 * val)49 int rk1000_ctl_i2c_read(struct rk1000_ctl *rk1000_ctl, u8 reg, u8 *val)
50 {
51 	struct dm_i2c_chip *chip = dev_get_parent_platdata(rk1000_ctl->dev);
52 	u8 data;
53 	struct i2c_msg msg[] = {
54 		{
55 			.addr = chip->chip_addr,
56 			.flags = 0,
57 			.buf = (u8 *)&reg,
58 			.len = 1,
59 		}, {
60 			.addr = chip->chip_addr,
61 			.flags = I2C_M_RD,
62 			.buf = (u8 *)&data,
63 			.len = 1,
64 		}
65 	};
66 	int ret;
67 
68 	ret = dm_i2c_xfer(rk1000_ctl->dev, msg, 2);
69 	if (ret) {
70 		dev_err(rk1000_ctl->dev, "rk1000 ctrl i2c read failed: %d\n",
71 			ret);
72 		return ret;
73 	}
74 
75 	*val = data;
76 
77 	return 0;
78 }
79 
rk1000_ctl_write_block(struct rk1000_ctl * rk1000_ctl,u8 reg,const u8 * buf,u8 len)80 int rk1000_ctl_write_block(struct rk1000_ctl *rk1000_ctl,
81 			   u8 reg, const u8 *buf, u8 len)
82 {
83 	int i, ret;
84 
85 	for (i = 0; i < len; i++) {
86 		ret = rk1000_ctl_i2c_write(rk1000_ctl, reg + i, buf[i]);
87 		if (ret)
88 			break;
89 	}
90 
91 	return ret;
92 }
93 
rk1000_ctl_probe(struct udevice * dev)94 static int rk1000_ctl_probe(struct udevice *dev)
95 {
96 	struct rk1000_ctl *rk1000_ctl = dev_get_priv(dev);
97 	int ret;
98 
99 	rk1000_ctl->dev = dev;
100 
101 	ret = gpio_request_by_name(dev, "reset-gpios", 0,
102 				   &rk1000_ctl->reset_gpio, GPIOD_IS_OUT);
103 	if (ret) {
104 		dev_err(dev, "Cannot get reset GPIO: %d\n", ret);
105 		return ret;
106 	}
107 
108 	ret = clk_get_by_name(dev, "mclk", &rk1000_ctl->mclk);
109 	if (ret < 0) {
110 		dev_err(dev, "failed to get clkin: %d\n", ret);
111 		return ret;
112 	}
113 
114 	clk_enable(&rk1000_ctl->mclk);
115 
116 	pinctrl_select_state(rk1000_ctl->dev, "default");
117 
118 	dm_gpio_set_value(&rk1000_ctl->reset_gpio, 0);
119 	mdelay(1);
120 	dm_gpio_set_value(&rk1000_ctl->reset_gpio, 1);
121 	mdelay(1);
122 	dm_gpio_set_value(&rk1000_ctl->reset_gpio, 0);
123 
124 	return 0;
125 }
126 
127 static const struct udevice_id rk1000_ctl_of_match[] = {
128 	{ .compatible = "rockchip,rk1000-ctl" },
129 	{}
130 };
131 
132 U_BOOT_DRIVER(rk1000) = {
133 	.name = "rk1000_ctl",
134 	.id = UCLASS_I2C_GENERIC,
135 	.of_match = rk1000_ctl_of_match,
136 	.probe = rk1000_ctl_probe,
137 	.bind = dm_scan_fdt_dev,
138 	.priv_auto_alloc_size = sizeof(struct rk1000_ctl),
139 };
140