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 *)®,
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