xref: /OK3568_Linux_fs/kernel/drivers/mfd/rk1000-core.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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