1 /*
2 * Driver for rockchip rk1000 core controller
3 * Copyright (C) 2017 Fuzhou Rockchip Electronics Co.Ltd
4 * Author:
5 * Algea Cao <algea.cao@rock-chips.com>
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2 of the License, or (at your
9 * option) any later version.
10 */
11 #include <linux/clk.h>
12 #include <linux/delay.h>
13 #include <linux/device.h>
14 #include <linux/err.h>
15 #include <linux/i2c.h>
16 #include <linux/init.h>
17 #include <linux/module.h>
18 #include <linux/regmap.h>
19 #include <linux/gpio/consumer.h>
20 #include <linux/mfd/core.h>
21
22 #define CTRL_ADC 0x00
23 #define ADC_OFF 0x88
24 #define CTRL_CODEC 0x01
25 #define CODEC_OFF 0x0d
26 #define CTRL_I2C 0x02
27 #define I2C_TIMEOUT_PERIOD 0x22
28 #define CTRL_TVE 0x03
29 #define TVE_OFF 0x00
30
31 struct rk1000 {
32 struct i2c_client *client;
33 struct device *dev;
34 struct regmap *regmap;
35 struct gpio_desc *io_reset;
36 struct clk *mclk;
37 };
38
39 static const struct mfd_cell rk1000_devs[] = {
40 {
41 .name = "rk1000-tve",
42 .of_compatible = "rockchip,rk1000-tve",
43 },
44 };
45
46 static const struct regmap_range rk1000_ctl_volatile_ranges[] = {
47 { .range_min = 0x00, .range_max = 0x05 },
48 };
49
50 static const struct regmap_access_table rk1000_ctl_reg_table = {
51 .yes_ranges = rk1000_ctl_volatile_ranges,
52 .n_yes_ranges = ARRAY_SIZE(rk1000_ctl_volatile_ranges),
53 };
54
55 struct regmap_config rk1000_regmap_config = {
56 .reg_bits = 8,
57 .val_bits = 8,
58 .volatile_table = &rk1000_ctl_reg_table,
59 };
60
rk1000_probe(struct i2c_client * client,const struct i2c_device_id * id)61 static int rk1000_probe(struct i2c_client *client,
62 const struct i2c_device_id *id)
63 {
64 bool uboot_logo;
65 int ret, val = 0;
66 struct rk1000 *rk1000 = devm_kzalloc(&client->dev, sizeof(*rk1000),
67 GFP_KERNEL);
68 if (!rk1000)
69 return -ENOMEM;
70
71 rk1000->client = client;
72 rk1000->dev = &client->dev;
73
74 rk1000->regmap = devm_regmap_init_i2c(client, &rk1000_regmap_config);
75 if (IS_ERR(rk1000->regmap))
76 return PTR_ERR(rk1000->regmap);
77
78 ret = regmap_read(rk1000->regmap, CTRL_TVE, &val);
79
80 /*
81 * If rk1000's registers can be read and rk1000 cvbs output is
82 * enabled, we think uboot logo is on.
83 */
84 if (!ret && val & BIT(6))
85 uboot_logo = true;
86 else
87 uboot_logo = false;
88
89 if (!uboot_logo) {
90 /********Get reset pin***********/
91 rk1000->io_reset = devm_gpiod_get_optional(rk1000->dev, "reset",
92 GPIOD_OUT_LOW);
93 if (IS_ERR(rk1000->io_reset)) {
94 dev_err(rk1000->dev, "can't get rk1000 reset gpio\n");
95 return PTR_ERR(rk1000->io_reset);
96 }
97
98 gpiod_set_value(rk1000->io_reset, 0);
99 usleep_range(500, 1000);
100 gpiod_set_value(rk1000->io_reset, 1);
101 usleep_range(500, 1000);
102 gpiod_set_value(rk1000->io_reset, 0);
103 }
104
105 rk1000->mclk = devm_clk_get(rk1000->dev, "mclk");
106 if (IS_ERR(rk1000->mclk)) {
107 dev_err(rk1000->dev, "get mclk err\n");
108 return PTR_ERR(rk1000->mclk);
109 }
110
111 ret = clk_prepare_enable(rk1000->mclk);
112 if (ret < 0) {
113 dev_err(rk1000->dev, "prepare mclk err\n");
114 goto clk_err;
115 }
116
117 regmap_write(rk1000->regmap, CTRL_ADC, ADC_OFF);
118 regmap_write(rk1000->regmap, CTRL_CODEC, CODEC_OFF);
119 regmap_write(rk1000->regmap, CTRL_I2C, I2C_TIMEOUT_PERIOD);
120 if (!uboot_logo)
121 regmap_write(rk1000->regmap, CTRL_TVE, TVE_OFF);
122
123 ret = mfd_add_devices(rk1000->dev, -1, rk1000_devs,
124 ARRAY_SIZE(rk1000_devs), NULL, 0, NULL);
125 if (ret) {
126 dev_err(rk1000->dev, "rk1000 mfd_add_devices failed\n");
127 goto mfd_add_err;
128 }
129
130 i2c_set_clientdata(client, rk1000);
131 dev_dbg(rk1000->dev, "rk1000 probe ok!\n");
132 return 0;
133
134 mfd_add_err:
135 mfd_remove_devices(rk1000->dev);
136 clk_err:
137 clk_disable_unprepare(rk1000->mclk);
138 return ret;
139 }
140
rk1000_remove(struct i2c_client * client)141 static int rk1000_remove(struct i2c_client *client)
142 {
143 struct rk1000 *rk1000 = i2c_get_clientdata(client);
144
145 clk_disable_unprepare(rk1000->mclk);
146 mfd_remove_devices(rk1000->dev);
147
148 return 0;
149 }
150
151 static const struct i2c_device_id rk1000_id[] = {
152 { "rk1000-ctl", 0 },
153 { }
154 };
155 MODULE_DEVICE_TABLE(i2c, rk1000_id);
156
157 static const struct of_device_id rk1000_ctl_dt_ids[] = {
158 { .compatible = "rockchip,rk1000-ctl" },
159 { }
160 };
161
162 MODULE_DEVICE_TABLE(of, rk1000_ctl_dt_ids);
163
164 static struct i2c_driver rk1000_driver = {
165 .driver = {
166 .name = "rk1000-ctl",
167 },
168 .probe = rk1000_probe,
169 .remove = rk1000_remove,
170 .id_table = rk1000_id,
171 };
172
173 module_i2c_driver(rk1000_driver);
174
175 MODULE_DESCRIPTION("RK1000 core control driver");
176 MODULE_AUTHOR("Algea Cao <algea.cao@rock-chips.com>");
177 MODULE_LICENSE("GPL");
178