xref: /openbmc/linux/drivers/media/i2c/max9271.c (revision ad01032a)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2017-2020 Jacopo Mondi
4  * Copyright (C) 2017-2020 Kieran Bingham
5  * Copyright (C) 2017-2020 Laurent Pinchart
6  * Copyright (C) 2017-2020 Niklas Söderlund
7  * Copyright (C) 2016 Renesas Electronics Corporation
8  * Copyright (C) 2015 Cogent Embedded, Inc.
9  *
10  * This file exports functions to control the Maxim MAX9271 GMSL serializer
11  * chip. This is not a self-contained driver, as MAX9271 is usually embedded in
12  * camera modules with at least one image sensor and optional additional
13  * components, such as uController units or ISPs/DSPs.
14  *
15  * Drivers for the camera modules (i.e. rdacm20/21) are expected to use
16  * functions exported from this library driver to maximize code re-use.
17  */
18 
19 #include <linux/delay.h>
20 #include <linux/i2c.h>
21 #include <linux/module.h>
22 
23 #include "max9271.h"
24 
25 static int max9271_read(struct max9271_device *dev, u8 reg)
26 {
27 	int ret;
28 
29 	dev_dbg(&dev->client->dev, "%s(0x%02x)\n", __func__, reg);
30 
31 	ret = i2c_smbus_read_byte_data(dev->client, reg);
32 	if (ret < 0)
33 		dev_dbg(&dev->client->dev,
34 			"%s: register 0x%02x read failed (%d)\n",
35 			__func__, reg, ret);
36 
37 	return ret;
38 }
39 
40 static int max9271_write(struct max9271_device *dev, u8 reg, u8 val)
41 {
42 	int ret;
43 
44 	dev_dbg(&dev->client->dev, "%s(0x%02x, 0x%02x)\n", __func__, reg, val);
45 
46 	ret = i2c_smbus_write_byte_data(dev->client, reg, val);
47 	if (ret < 0)
48 		dev_err(&dev->client->dev,
49 			"%s: register 0x%02x write failed (%d)\n",
50 			__func__, reg, ret);
51 
52 	return ret;
53 }
54 
55 /*
56  * max9271_pclk_detect() - Detect valid pixel clock from image sensor
57  *
58  * Wait up to 10ms for a valid pixel clock.
59  *
60  * Returns 0 for success, < 0 for pixel clock not properly detected
61  */
62 static int max9271_pclk_detect(struct max9271_device *dev)
63 {
64 	unsigned int i;
65 	int ret;
66 
67 	for (i = 0; i < 100; i++) {
68 		ret = max9271_read(dev, 0x15);
69 		if (ret < 0)
70 			return ret;
71 
72 		if (ret & MAX9271_PCLKDET)
73 			return 0;
74 
75 		usleep_range(50, 100);
76 	}
77 
78 	dev_err(&dev->client->dev, "Unable to detect valid pixel clock\n");
79 
80 	return -EIO;
81 }
82 
83 int max9271_set_serial_link(struct max9271_device *dev, bool enable)
84 {
85 	int ret;
86 	u8 val = MAX9271_REVCCEN | MAX9271_FWDCCEN;
87 
88 	if (enable) {
89 		ret = max9271_pclk_detect(dev);
90 		if (ret)
91 			return ret;
92 
93 		val |= MAX9271_SEREN;
94 	} else {
95 		val |= MAX9271_CLINKEN;
96 	}
97 
98 	/*
99 	 * The serializer temporarily disables the reverse control channel for
100 	 * 350µs after starting/stopping the forward serial link, but the
101 	 * deserializer synchronization time isn't clearly documented.
102 	 *
103 	 * According to the serializer datasheet we should wait 3ms, while
104 	 * according to the deserializer datasheet we should wait 5ms.
105 	 *
106 	 * Short delays here appear to show bit-errors in the writes following.
107 	 * Therefore a conservative delay seems best here.
108 	 */
109 	ret = max9271_write(dev, 0x04, val);
110 	if (ret < 0)
111 		return ret;
112 
113 	usleep_range(5000, 8000);
114 
115 	return 0;
116 }
117 EXPORT_SYMBOL_GPL(max9271_set_serial_link);
118 
119 int max9271_configure_i2c(struct max9271_device *dev, u8 i2c_config)
120 {
121 	int ret;
122 
123 	ret = max9271_write(dev, 0x0d, i2c_config);
124 	if (ret < 0)
125 		return ret;
126 
127 	/* The delay required after an I2C bus configuration change is not
128 	 * characterized in the serializer manual. Sleep up to 5msec to
129 	 * stay safe.
130 	 */
131 	usleep_range(3500, 5000);
132 
133 	return 0;
134 }
135 EXPORT_SYMBOL_GPL(max9271_configure_i2c);
136 
137 int max9271_set_high_threshold(struct max9271_device *dev, bool enable)
138 {
139 	int ret;
140 
141 	ret = max9271_read(dev, 0x08);
142 	if (ret < 0)
143 		return ret;
144 
145 	/*
146 	 * Enable or disable reverse channel high threshold to increase
147 	 * immunity to power supply noise.
148 	 */
149 	ret = max9271_write(dev, 0x08, enable ? ret | BIT(0) : ret & ~BIT(0));
150 	if (ret < 0)
151 		return ret;
152 
153 	usleep_range(2000, 2500);
154 
155 	return 0;
156 }
157 EXPORT_SYMBOL_GPL(max9271_set_high_threshold);
158 
159 int max9271_configure_gmsl_link(struct max9271_device *dev)
160 {
161 	int ret;
162 
163 	/*
164 	 * Configure the GMSL link:
165 	 *
166 	 * - Double input mode, high data rate, 24-bit mode
167 	 * - Latch input data on PCLKIN rising edge
168 	 * - Enable HS/VS encoding
169 	 * - 1-bit parity error detection
170 	 *
171 	 * TODO: Make the GMSL link configuration parametric.
172 	 */
173 	ret = max9271_write(dev, 0x07, MAX9271_DBL | MAX9271_HVEN |
174 			    MAX9271_EDC_1BIT_PARITY);
175 	if (ret < 0)
176 		return ret;
177 
178 	usleep_range(5000, 8000);
179 
180 	/*
181 	 * Adjust spread spectrum to +4% and auto-detect pixel clock
182 	 * and serial link rate.
183 	 */
184 	ret = max9271_write(dev, 0x02,
185 			    MAX9271_SPREAD_SPECT_4 | MAX9271_R02_RES |
186 			    MAX9271_PCLK_AUTODETECT |
187 			    MAX9271_SERIAL_AUTODETECT);
188 	if (ret < 0)
189 		return ret;
190 
191 	usleep_range(5000, 8000);
192 
193 	return 0;
194 }
195 EXPORT_SYMBOL_GPL(max9271_configure_gmsl_link);
196 
197 int max9271_set_gpios(struct max9271_device *dev, u8 gpio_mask)
198 {
199 	int ret;
200 
201 	ret = max9271_read(dev, 0x0f);
202 	if (ret < 0)
203 		return 0;
204 
205 	ret |= gpio_mask;
206 	ret = max9271_write(dev, 0x0f, ret);
207 	if (ret < 0) {
208 		dev_err(&dev->client->dev, "Failed to set gpio (%d)\n", ret);
209 		return ret;
210 	}
211 
212 	usleep_range(3500, 5000);
213 
214 	return 0;
215 }
216 EXPORT_SYMBOL_GPL(max9271_set_gpios);
217 
218 int max9271_clear_gpios(struct max9271_device *dev, u8 gpio_mask)
219 {
220 	int ret;
221 
222 	ret = max9271_read(dev, 0x0f);
223 	if (ret < 0)
224 		return 0;
225 
226 	ret &= ~gpio_mask;
227 	ret = max9271_write(dev, 0x0f, ret);
228 	if (ret < 0) {
229 		dev_err(&dev->client->dev, "Failed to clear gpio (%d)\n", ret);
230 		return ret;
231 	}
232 
233 	usleep_range(3500, 5000);
234 
235 	return 0;
236 }
237 EXPORT_SYMBOL_GPL(max9271_clear_gpios);
238 
239 int max9271_enable_gpios(struct max9271_device *dev, u8 gpio_mask)
240 {
241 	int ret;
242 
243 	ret = max9271_read(dev, 0x0e);
244 	if (ret < 0)
245 		return 0;
246 
247 	/* BIT(0) reserved: GPO is always enabled. */
248 	ret |= (gpio_mask & ~BIT(0));
249 	ret = max9271_write(dev, 0x0e, ret);
250 	if (ret < 0) {
251 		dev_err(&dev->client->dev, "Failed to enable gpio (%d)\n", ret);
252 		return ret;
253 	}
254 
255 	usleep_range(3500, 5000);
256 
257 	return 0;
258 }
259 EXPORT_SYMBOL_GPL(max9271_enable_gpios);
260 
261 int max9271_disable_gpios(struct max9271_device *dev, u8 gpio_mask)
262 {
263 	int ret;
264 
265 	ret = max9271_read(dev, 0x0e);
266 	if (ret < 0)
267 		return 0;
268 
269 	/* BIT(0) reserved: GPO cannot be disabled */
270 	ret &= ~(gpio_mask | BIT(0));
271 	ret = max9271_write(dev, 0x0e, ret);
272 	if (ret < 0) {
273 		dev_err(&dev->client->dev, "Failed to disable gpio (%d)\n", ret);
274 		return ret;
275 	}
276 
277 	usleep_range(3500, 5000);
278 
279 	return 0;
280 }
281 EXPORT_SYMBOL_GPL(max9271_disable_gpios);
282 
283 int max9271_verify_id(struct max9271_device *dev)
284 {
285 	int ret;
286 
287 	ret = max9271_read(dev, 0x1e);
288 	if (ret < 0) {
289 		dev_err(&dev->client->dev, "MAX9271 ID read failed (%d)\n",
290 			ret);
291 		return ret;
292 	}
293 
294 	if (ret != MAX9271_ID) {
295 		dev_err(&dev->client->dev, "MAX9271 ID mismatch (0x%02x)\n",
296 			ret);
297 		return -ENXIO;
298 	}
299 
300 	return 0;
301 }
302 EXPORT_SYMBOL_GPL(max9271_verify_id);
303 
304 int max9271_set_address(struct max9271_device *dev, u8 addr)
305 {
306 	int ret;
307 
308 	ret = max9271_write(dev, 0x00, addr << 1);
309 	if (ret < 0) {
310 		dev_err(&dev->client->dev,
311 			"MAX9271 I2C address change failed (%d)\n", ret);
312 		return ret;
313 	}
314 	usleep_range(3500, 5000);
315 
316 	return 0;
317 }
318 EXPORT_SYMBOL_GPL(max9271_set_address);
319 
320 int max9271_set_deserializer_address(struct max9271_device *dev, u8 addr)
321 {
322 	int ret;
323 
324 	ret = max9271_write(dev, 0x01, addr << 1);
325 	if (ret < 0) {
326 		dev_err(&dev->client->dev,
327 			"MAX9271 deserializer address set failed (%d)\n", ret);
328 		return ret;
329 	}
330 	usleep_range(3500, 5000);
331 
332 	return 0;
333 }
334 EXPORT_SYMBOL_GPL(max9271_set_deserializer_address);
335 
336 int max9271_set_translation(struct max9271_device *dev, u8 source, u8 dest)
337 {
338 	int ret;
339 
340 	ret = max9271_write(dev, 0x09, source << 1);
341 	if (ret < 0) {
342 		dev_err(&dev->client->dev,
343 			"MAX9271 I2C translation setup failed (%d)\n", ret);
344 		return ret;
345 	}
346 	usleep_range(3500, 5000);
347 
348 	ret = max9271_write(dev, 0x0a, dest << 1);
349 	if (ret < 0) {
350 		dev_err(&dev->client->dev,
351 			"MAX9271 I2C translation setup failed (%d)\n", ret);
352 		return ret;
353 	}
354 	usleep_range(3500, 5000);
355 
356 	return 0;
357 }
358 EXPORT_SYMBOL_GPL(max9271_set_translation);
359 
360 MODULE_DESCRIPTION("Maxim MAX9271 GMSL Serializer");
361 MODULE_AUTHOR("Jacopo Mondi");
362 MODULE_LICENSE("GPL v2");
363