blob: 2833df999a4361172de22c2d57bbcd46c4f52d08 [file] [log] [blame]
Rajesh Bharathwajdcc7af82019-12-15 22:42:55 -08001/*
2 * Copyright (c) 2020, The Linux Foundation. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 and
6 * only version 2 as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 */
14
15#include <linux/device.h>
16#include <linux/i2c.h>
17#include <linux/slab.h>
18#include <linux/platform_device.h>
19#include <linux/input.h>
20#include <linux/types.h>
21#include <linux/module.h>
22#include <linux/fs.h>
23#include <linux/of.h>
24#include <linux/of_graph.h>
25#include <linux/kernel.h>
26#include <linux/of_gpio.h>
27#include <linux/gpio.h>
28#include <linux/delay.h>
29#include <linux/regulator/consumer.h>
30#include <linux/rwlock.h>
31#include <linux/leds.h>
32
33struct vxr7200 {
34 struct device *dev;
35 struct device_node *host_node;
36
37 u8 i2c_addr;
38 int irq;
39 u32 vxr_3v3_en;
40 u32 led_5v_en;
41 u32 led_drive_en1;
42 u32 led_drive_en2;
43 u32 display_1v8_en;
44 u32 mipi_sw_1v8_en;
45 u32 display_res1;
46 u32 selab_gpio;
47 u32 oenab_gpio;
48 bool gpioInit;
49
50 struct i2c_client *i2c_client;
51
52 struct regulator *vddio;
53 struct regulator *lab;
54 struct regulator *ibb;
55
56 bool power_on;
57};
58
59static int vxr7200_read(struct vxr7200 *pdata, u8 *reg, u8 *buf, u32 size)
60{
61 struct i2c_client *client = pdata->i2c_client;
62 struct i2c_msg msg[2] = {
63 {
64 .addr = client->addr,
65 .flags = 0,
66 .len = 4,
67 .buf = reg,
68 },
69 {
70 .addr = client->addr,
71 .flags = I2C_M_RD,
72 .len = size,
73 .buf = buf,
74 }
75 };
76
77 if (i2c_transfer(client->adapter, msg, 2) != 2) {
78 pr_err("i2c read failed\n");
79 return -EIO;
80 }
81
82 return 0;
83}
84
85static int turnGpio(struct vxr7200 *pdata, int gpio, char *name, bool on)
86{
87 int ret = -1;
88
89 pr_info("%s vxr7200 gpio:%d, name:%s, on:%d\n", __func__, gpio,
90 name, on);
91 if (!pdata->gpioInit) {
92 ret = gpio_request(gpio, name);
93 if (ret) {
94 pr_err("vxr7200 %s gpio request failed\n", name);
95 goto error;
96 }
97 }
98 if (on) {
99 ret = gpio_direction_output(gpio, 0);
100 if (ret) {
101 pr_err("vxr7200 gpio direction failed\n");
102 goto error;
103 }
104 gpio_set_value(gpio, 1);
105 pr_debug("%s vxr7200 gpio:%d set to high\n", __func__, gpio);
106 } else {
107 ret = gpio_direction_output(gpio, 1);
108 if (ret) {
109 pr_err("vxr7200 gpio direction failed\n");
110 goto error;
111 }
112 gpio_set_value(gpio, 0);
113 pr_debug("%s vxr7200 gpio:%d set to low\n", __func__, gpio);
114 }
115 return 0;
116error:
117 return -EINVAL;
118}
119
120static void vxr7200_set_gpios(struct vxr7200 *pdata, bool turnOn)
121{
122 int rc;
123
124 pr_debug("%s, turnOn:%d\n", __func__, turnOn);
125 if (pdata) {
126 rc = turnGpio(pdata, pdata->vxr_3v3_en, "vxr_3v3_en", turnOn);
127 if (rc)
128 goto gpio1Fail;
129 rc = turnGpio(pdata, pdata->led_5v_en, "led_5v_en", turnOn);
130 if (rc)
131 goto gpio2Fail;
132 rc = turnGpio(pdata, pdata->led_drive_en1,
133 "led_drive_en1", turnOn);
134 if (rc)
135 goto gpio3Fail;
136 rc = turnGpio(pdata, pdata->led_drive_en2,
137 "led_drive_en2", turnOn);
138 if (rc)
139 goto gpio4Fail;
140 rc = turnGpio(pdata, pdata->display_1v8_en,
141 "disp_1v8_en", turnOn);
142 if (rc)
143 goto gpio5Fail;
144 pdata->mipi_sw_1v8_en += 1100;
145 rc = turnGpio(pdata, pdata->mipi_sw_1v8_en,
146 "mipi_sw1v8_en", turnOn);
147 if (rc)
148 goto gpio6Fail;
149 rc = turnGpio(pdata, pdata->display_res1,
150 "display_res1", turnOn);
151 if (rc)
152 goto gpio7Fail;
153 }
154
155gpio7Fail:
156 gpio_free(pdata->display_res1);
157gpio6Fail:
158 gpio_free(pdata->mipi_sw_1v8_en);
159gpio5Fail:
160 gpio_free(pdata->display_1v8_en);
161gpio4Fail:
162 gpio_free(pdata->led_drive_en2);
163gpio3Fail:
164 gpio_free(pdata->led_drive_en1);
165gpio2Fail:
166 gpio_free(pdata->led_5v_en);
167gpio1Fail:
168 gpio_free(pdata->vxr_3v3_en);
169}
170
171static void vxr7200_free_gpios(struct vxr7200 *pdata)
172{
173 if (pdata) {
174 gpio_free(pdata->vxr_3v3_en);
175 gpio_free(pdata->led_5v_en);
176 gpio_free(pdata->led_drive_en1);
177 gpio_free(pdata->led_drive_en2);
178 gpio_free(pdata->display_1v8_en);
179 gpio_free(pdata->mipi_sw_1v8_en);
180 gpio_free(pdata->display_res1);
181 }
182}
183
184
185static int vxr7200_parse_dt(struct device *dev,
186 struct vxr7200 *pdata)
187{
188 struct device_node *np = dev->of_node;
189 int rc = 0;
190
191 pdata->vxr_3v3_en =
192 of_get_named_gpio(np, "qcom,vxr_3v3_en", 0);
193 if (!gpio_is_valid(pdata->vxr_3v3_en)) {
194 pr_err("vxr_3v3_en gpio not specified\n");
195 rc = -EINVAL;
196 }
197
198 pdata->led_5v_en =
199 of_get_named_gpio(np, "qcom,led-5v-en-gpio", 0);
200 if (!gpio_is_valid(pdata->led_5v_en)) {
201 pr_err("led_5v_en gpio not specified\n");
202 rc = -EINVAL;
203 }
204
205 pdata->led_drive_en1 =
206 of_get_named_gpio(np, "qcom,led-driver-en1-gpio", 0);
207 if (!gpio_is_valid(pdata->led_drive_en1)) {
208 pr_err("led_drive_en1 gpio not specified\n");
209 rc = -EINVAL;
210 }
211
212 pdata->led_drive_en2 =
213 of_get_named_gpio(np, "qcom,led-driver-en2-gpio", 0);
214 if (!gpio_is_valid(pdata->led_drive_en2)) {
215 pr_err("led_drive_en2 gpio not specified\n");
216 rc = -EINVAL;
217 }
218
219 pdata->display_1v8_en =
220 of_get_named_gpio(np, "qcom,1p8-en-gpio", 0);
221 if (!gpio_is_valid(pdata->display_1v8_en)) {
222 pr_err("display_1v8_en gpio not specified\n");
223 rc = -EINVAL;
224 }
225
226 pdata->mipi_sw_1v8_en =
227 of_get_named_gpio(np, "qcom,switch-power-gpio", 0);
228 if (!gpio_is_valid(pdata->mipi_sw_1v8_en)) {
229 pr_err("mipi_sw_1v8_en gpio not specified\n");
230 rc = -EINVAL;
231 }
232
233 pdata->display_res1 =
234 of_get_named_gpio(np, "qcom,platform-reset-gpio", 0);
235 if (!gpio_is_valid(pdata->display_res1)) {
236 pr_err("display_res1 gpio not specified\n");
237 rc = -EINVAL;
238 }
239
240 if (!rc)
241 vxr7200_set_gpios(pdata, true);
242
243 pdata->selab_gpio = of_get_named_gpio(np, "qcom,selab-gpio", 0);
244 if (!gpio_is_valid(pdata->selab_gpio)) {
245 pr_err("selab_gpio gpio not specified\n");
246 rc = -EINVAL;
247 goto gpio_selab_fail;
248 } else
249 turnGpio(pdata, pdata->selab_gpio, "selab_gpio", 0);
250
251 pdata->oenab_gpio = of_get_named_gpio(np, "qcom,oenab-gpio", 0);
252 if (!gpio_is_valid(pdata->oenab_gpio)) {
253 pr_err("oenab_gpio gpio not specified\n");
254 rc = -EINVAL;
255 goto gpio_oenab_fail;
256 } else
257 turnGpio(pdata, pdata->oenab_gpio, "oenab_gpio", 0);
258
259 if (!pdata->gpioInit)
260 pdata->gpioInit = true;
261
262 return rc;
263
264gpio_oenab_fail:
265 gpio_free(pdata->oenab_gpio);
266gpio_selab_fail:
267 gpio_free(pdata->selab_gpio);
268 vxr7200_free_gpios(pdata);
269 return rc;
270}
271
272static void vxr7200_display_pwr_enable_vregs(struct vxr7200 *pdata)
273{
274 int rc = 0;
275
276 pdata->vddio = devm_regulator_get(pdata->dev, "pm660_l11");
277 rc = PTR_RET(pdata->vddio);
278 if (rc) {
279 pr_err("Failed to get pm660_l11 regulator %s\n", __func__);
280 goto vddio_fail;
281 }
282 rc = regulator_set_load(pdata->vddio, 62000);
283 if (rc < 0) {
284 pr_err("Load setting failed for vddio %s\n", __func__);
285 goto vddio_fail;
286 }
287 rc = regulator_set_voltage(pdata->vddio, 1800000, 1800000);
288 if (rc) {
289 pr_err("Set voltage(vddio) fail, rc=%d %s\n", rc, __func__);
290 goto vddio_fail;
291 }
292 rc = regulator_enable(pdata->vddio);
293 if (rc) {
294 pr_err("enable failed for vddio, rc=%d %s\n", rc, __func__);
295 goto vddio_fail;
296 }
297
298 pdata->lab = devm_regulator_get(pdata->dev, "lcdb_ldo");
299 rc = PTR_RET(pdata->lab);
300 if (rc) {
301 pr_err("Failed to get lcdb_ldo_vreg regulator %s\n", __func__);
302 goto lab_fail;
303 }
304 rc = regulator_set_load(pdata->lab, 100000);
305 if (rc < 0) {
306 pr_err("Load Setting failed for lab %s\n", __func__);
307 goto lab_fail;
308 }
309 rc = regulator_set_voltage(pdata->lab, 4600000, 6000000);
310 if (rc) {
311 pr_err("Set voltage(lab) fail, rc=%d %s\n", rc, __func__);
312 goto lab_fail;
313 }
314 rc = regulator_enable(pdata->lab);
315 if (rc) {
316 pr_err("enable failed for lab, rc=%d %s\n", rc, __func__);
317 goto lab_fail;
318 }
319
320 pdata->ibb = devm_regulator_get(pdata->dev, "lcdb_ncp");
321 rc = PTR_RET(pdata->ibb);
322 if (rc) {
323 pr_err("Failed to get lcdb_ncp_vreg regulator %s\n", __func__);
324 goto ibb_fail;
325 }
326 rc = regulator_set_load(pdata->ibb, 100000);
327 if (rc < 0) {
328 pr_err("Load Setting failed for ibb %s\n", __func__);
329 goto ibb_fail;
330 }
331 rc = regulator_set_voltage(pdata->ibb, 4600000, 6000000);
332 if (rc) {
333 pr_err("Set voltage(ibb) fail, rc=%d %s\n", rc, __func__);
334 goto ibb_fail;
335 }
336 rc = regulator_enable(pdata->ibb);
337 if (rc) {
338 pr_err("enable failed for ibb, rc=%d %s\n", rc, __func__);
339 goto ibb_fail;
340 }
341
342 return;
343
344ibb_fail:
345 devm_regulator_put(pdata->ibb);
346 (void)regulator_set_load(pdata->ibb, 100);
347 (void)regulator_set_voltage(pdata->ibb, 0, 6000000);
348
349lab_fail:
350 (void)regulator_set_voltage(pdata->lab, 0, 6000000);
351 (void)regulator_set_load(pdata->lab, 100);
352 devm_regulator_put(pdata->lab);
353
354vddio_fail:
355 (void)regulator_set_load(pdata->vddio, 100);
356 (void)regulator_set_voltage(pdata->vddio, 0, 1800000);
357 devm_regulator_put(pdata->vddio);
358}
359
360static __init int vxr7200_probe(struct i2c_client *client,
361 const struct i2c_device_id *id)
362{
363 int rc;
364 struct vxr7200 *pdata;
365 char *cmdline;
366 u8 reg[4] = {0x00, 0x20, 0x01, 0x60};
367 u8 buf[4] = {0x00, 0x0, 0x0, 0x0};
368
369 if (!client || !client->dev.of_node) {
370 pr_err("%s invalid input\n", __func__);
371 return -EINVAL;
372 }
373
374 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
375 pr_err("%s device doesn't support I2C\n", __func__);
376 return -ENODEV;
377 }
378
379 pdata = devm_kzalloc(&client->dev,
380 sizeof(struct vxr7200), GFP_KERNEL);
381 if (!pdata)
382 return -ENOMEM;
383
384 pdata->gpioInit = false;
385
386 cmdline = strnstr(boot_command_line, "msm_drm.dsi_display0=",
387 strlen(boot_command_line));
388 if (cmdline) {
389 cmdline = strnstr(boot_command_line,
390 "msm_drm.dsi_display0=dsi_sim_vid_display",
391 strlen(boot_command_line));
392 if (cmdline) {
393 pr_debug("%s DSI SIM, going to dp init cmdline:%s\n",
394 __func__, cmdline);
395 goto dp_init;
396 }
397 }
398 pr_debug("%s DSI way, cmdline:%s\n", __func__, cmdline);
399 goto dsi_display;
400
401dp_init:
402 rc = vxr7200_parse_dt(&client->dev, pdata);
403 if (rc) {
404 pr_err("%s failed to parse device tree\n", __func__);
405 goto err_dt_parse;
406 }
407 pdata->dev = &client->dev;
408 pdata->i2c_client = client;
409
410 vxr7200_display_pwr_enable_vregs(pdata);
411
412 i2c_set_clientdata(client, pdata);
413 dev_set_drvdata(&client->dev, pdata);
414
415 //vxr7200_write(pdata, 0x0A, 0x02);//Enable 4-lane DP
416 vxr7200_read(pdata, reg, buf, 4);//Enable 4-lane DP
417
418dsi_display:
419 return rc;
420
421err_dt_parse:
422 devm_kfree(&client->dev, pdata);
423
424 return rc;
425}
426
427static int vxr7200_remove(struct i2c_client *client)
428{
429 struct vxr7200 *pdata = i2c_get_clientdata(client);
430
431 if (pdata)
432 devm_kfree(&client->dev, pdata);
433 return 0;
434}
435
436
437static void vxr7200_shutdown(struct i2c_client *client)
438{
439 dev_info(&(client->dev), "shutdown");
440}
441
442static int vxr7200_pm_freeze(struct device *dev)
443{
444 struct i2c_client *client = to_i2c_client(dev);
445 struct vxr7200 *pdata = i2c_get_clientdata(client);
446
447 dev_info(dev, "freeze");
448 vxr7200_set_gpios(pdata, false);
449 return 0;
450}
451static int vxr7200_pm_restore(struct device *dev)
452{
453 struct i2c_client *client = to_i2c_client(dev);
454 struct vxr7200 *pdata = i2c_get_clientdata(client);
455
456 dev_info(dev, "restore");
457 vxr7200_set_gpios(pdata, true);
458 return 0;
459}
460static int vxr7200_pm_suspend(struct device *dev)
461{
462 struct i2c_client *client = to_i2c_client(dev);
463 struct vxr7200 *pdata = i2c_get_clientdata(client);
464
465 dev_info(dev, "suspend");
466 vxr7200_set_gpios(pdata, false);
467 return 0;
468}
469
470static int vxr7200_pm_resume(struct device *dev)
471{
472 struct i2c_client *client = to_i2c_client(dev);
473 struct vxr7200 *pdata = i2c_get_clientdata(client);
474
475 dev_info(dev, "resume");
476 vxr7200_set_gpios(pdata, true);
477 return 0;
478}
479
480static const struct dev_pm_ops vxr7200_dev_pm_ops = {
481 .suspend = vxr7200_pm_suspend,
482 .resume = vxr7200_pm_resume,
483 .freeze = vxr7200_pm_freeze,
484 .restore = vxr7200_pm_restore,
485 .thaw = vxr7200_pm_restore,
486 .poweroff = vxr7200_pm_suspend,
487};
488
489static const struct i2c_device_id vxr7200_id_table[] = {
490 {"vxr7200", 0},
491 {}
492};
493
494static struct i2c_driver vxr7200_i2c_driver = {
495 .probe = vxr7200_probe,
496 .remove = vxr7200_remove,
497 .shutdown = vxr7200_shutdown,
498 .driver = {
499 .name = "vxr7200",
500 .owner = THIS_MODULE,
501 .pm = &vxr7200_dev_pm_ops,
502 },
503 .id_table = vxr7200_id_table,
504};
505module_i2c_driver(vxr7200_i2c_driver);
506MODULE_DEVICE_TABLE(i2c, vxr7200_id_table);
507MODULE_DESCRIPTION("VXR7200 DP2DSI Bridge");