blob: 234a90360ad27ff6da647b7ba7a45b18c1cfaf78 [file] [log] [blame]
Rashi Bindra2d498842018-07-12 20:40:32 +05301/* Copyright (c) 2012-2019, 2021, The Linux Foundation. All rights reserved.
Sachin Bhayareeeb88892018-01-02 16:36:01 +05302 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13
14#include <linux/module.h>
15#include <linux/interrupt.h>
16#include <linux/spinlock.h>
17#include <linux/delay.h>
18#include <linux/io.h>
19#include <linux/of_device.h>
20#include <linux/of_gpio.h>
21#include <linux/gpio.h>
22#include <linux/err.h>
23#include <linux/regulator/consumer.h>
24#include <linux/leds-qpnp-wled.h>
25#include <linux/clk.h>
26#include <linux/uaccess.h>
27#include <linux/msm-bus.h>
28#include <linux/pm_qos.h>
Sachin Bhayare3d3767e2018-01-02 21:10:57 +053029#include <linux/mdss_io_util.h>
Sandeep Panda812f5002017-02-24 11:36:59 +053030#include <linux/dma-buf.h>
Sachin Bhayareeeb88892018-01-02 16:36:01 +053031
32#include "mdss.h"
33#include "mdss_panel.h"
34#include "mdss_dsi.h"
35#include "mdss_debug.h"
36#include "mdss_dsi_phy.h"
37#include "mdss_dba_utils.h"
Rashi Bindra2d498842018-07-12 20:40:32 +053038#include "mdss_smmu.h"
Sachin Bhayareeeb88892018-01-02 16:36:01 +053039
40#define XO_CLK_RATE 19200000
41#define CMDLINE_DSI_CTL_NUM_STRING_LEN 2
42
43/* Master structure to hold all the information about the DSI/panel */
44static struct mdss_dsi_data *mdss_dsi_res;
45
46#define DSI_DISABLE_PC_LATENCY 100
47#define DSI_ENABLE_PC_LATENCY PM_QOS_DEFAULT_VALUE
48
49static struct pm_qos_request mdss_dsi_pm_qos_request;
50
Sandeep Panda812f5002017-02-24 11:36:59 +053051void mdss_dump_dsi_debug_bus(u32 bus_dump_flag,
52 u32 **dump_mem)
53{
54 struct mdss_dsi_data *sdata = mdss_dsi_res;
55 struct mdss_dsi_ctrl_pdata *m_ctrl, *s_ctrl;
56 bool in_log, in_mem;
57 u32 *dump_addr = NULL;
58 u32 status0 = 0, status1 = 0;
59 phys_addr_t phys = 0;
60 int list_size = 0;
61 int i;
62 bool dsi0_active = false, dsi1_active = false;
63
64 if (!sdata || !sdata->dbg_bus || !sdata->dbg_bus_size)
65 return;
66
67 m_ctrl = sdata->ctrl_pdata[0];
68 s_ctrl = sdata->ctrl_pdata[1];
69
70 if (!m_ctrl)
71 return;
72
73 if (m_ctrl && m_ctrl->shared_data->dsi0_active)
74 dsi0_active = true;
75 if (s_ctrl && s_ctrl->shared_data->dsi1_active)
76 dsi1_active = true;
77
78 list_size = (sdata->dbg_bus_size * sizeof(sdata->dbg_bus[0]) * 4);
79
80 in_log = (bus_dump_flag & MDSS_DBG_DUMP_IN_LOG);
81 in_mem = (bus_dump_flag & MDSS_DBG_DUMP_IN_MEM);
82
83 if (in_mem) {
84 if (!(*dump_mem))
85 *dump_mem = dma_alloc_coherent(&sdata->pdev->dev,
86 list_size, &phys, GFP_KERNEL);
87
88 if (*dump_mem) {
89 dump_addr = *dump_mem;
90 pr_info("%s: start_addr:0x%pK end_addr:0x%pK\n",
91 __func__, dump_addr, dump_addr + list_size);
92 } else {
93 in_mem = false;
94 pr_err("dump_mem: allocation fails\n");
95 }
96 }
97
98 pr_info("========= Start DSI Debug Bus =========\n");
99
100 mdss_dsi_clk_ctrl(m_ctrl, m_ctrl->dsi_clk_handle,
101 MDSS_DSI_CORE_CLK, MDSS_DSI_CLK_ON);
102
103 for (i = 0; i < sdata->dbg_bus_size; i++) {
104 if (dsi0_active) {
105 writel_relaxed(sdata->dbg_bus[i],
106 m_ctrl->ctrl_base + 0x124);
107 wmb(); /* ensure regsiter is committed */
108 }
109 if (dsi1_active) {
110 writel_relaxed(sdata->dbg_bus[i],
111 s_ctrl->ctrl_base + 0x124);
112 wmb(); /* ensure register is committed */
113 }
114
115 if (dsi0_active) {
116 status0 = readl_relaxed(m_ctrl->ctrl_base + 0x128);
117 if (in_log)
118 pr_err("CTRL:0 bus_ctrl: 0x%x status: 0x%x\n",
119 sdata->dbg_bus[i], status0);
120 }
121 if (dsi1_active) {
122 status1 = readl_relaxed(s_ctrl->ctrl_base + 0x128);
123 if (in_log)
124 pr_err("CTRL:1 bus_ctrl: 0x%x status: 0x%x\n",
125 sdata->dbg_bus[i], status1);
126 }
127
128 if (dump_addr && in_mem) {
129 dump_addr[i*4] = sdata->dbg_bus[i];
130 dump_addr[i*4 + 1] = status0;
131 dump_addr[i*4 + 2] = status1;
132 dump_addr[i*4 + 3] = 0x0;
133 }
134 }
135
136 mdss_dsi_clk_ctrl(m_ctrl, m_ctrl->dsi_clk_handle,
137 MDSS_DSI_CORE_CLK, MDSS_DSI_CLK_OFF);
138
139 pr_info("========End DSI Debug Bus=========\n");
140}
141
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530142static void mdss_dsi_pm_qos_add_request(struct mdss_dsi_ctrl_pdata *ctrl_pdata)
143{
144 struct irq_info *irq_info;
145
146 if (!ctrl_pdata || !ctrl_pdata->shared_data)
147 return;
148
149 irq_info = ctrl_pdata->dsi_hw->irq_info;
150
151 if (!irq_info)
152 return;
153
154 mutex_lock(&ctrl_pdata->shared_data->pm_qos_lock);
155 if (!ctrl_pdata->shared_data->pm_qos_req_cnt) {
156 pr_debug("%s: add request irq\n", __func__);
157
158 mdss_dsi_pm_qos_request.type = PM_QOS_REQ_AFFINE_IRQ;
159 mdss_dsi_pm_qos_request.irq = irq_info->irq;
160 pm_qos_add_request(&mdss_dsi_pm_qos_request,
161 PM_QOS_CPU_DMA_LATENCY, PM_QOS_DEFAULT_VALUE);
162 }
163 ctrl_pdata->shared_data->pm_qos_req_cnt++;
164 mutex_unlock(&ctrl_pdata->shared_data->pm_qos_lock);
165}
166
167static void mdss_dsi_pm_qos_remove_request(struct dsi_shared_data *sdata)
168{
169 if (!sdata)
170 return;
171
172 mutex_lock(&sdata->pm_qos_lock);
173 if (sdata->pm_qos_req_cnt) {
174 sdata->pm_qos_req_cnt--;
175 if (!sdata->pm_qos_req_cnt) {
176 pr_debug("%s: remove request", __func__);
177 pm_qos_remove_request(&mdss_dsi_pm_qos_request);
178 }
179 } else {
180 pr_warn("%s: unbalanced pm_qos ref count\n", __func__);
181 }
182 mutex_unlock(&sdata->pm_qos_lock);
183}
184
185static void mdss_dsi_pm_qos_update_request(int val)
186{
187 pr_debug("%s: update request %d", __func__, val);
188 pm_qos_update_request(&mdss_dsi_pm_qos_request, val);
189}
190
191static int mdss_dsi_pinctrl_set_state(struct mdss_dsi_ctrl_pdata *ctrl_pdata,
192 bool active);
193
194static struct mdss_dsi_ctrl_pdata *mdss_dsi_get_ctrl(u32 ctrl_id)
195{
196 if (ctrl_id >= DSI_CTRL_MAX || !mdss_dsi_res)
197 return NULL;
198
199 return mdss_dsi_res->ctrl_pdata[ctrl_id];
200}
201
202static void mdss_dsi_config_clk_src(struct platform_device *pdev)
203{
204 struct mdss_dsi_data *dsi_res = platform_get_drvdata(pdev);
205 struct dsi_shared_data *sdata = dsi_res->shared_data;
206
207 if (!sdata->ext_byte0_clk || !sdata->ext_pixel0_clk) {
208 pr_debug("%s: DSI-0 ext. clocks not present\n", __func__);
209 return;
210 }
211
212 if (mdss_dsi_is_pll_src_default(sdata)) {
213 /*
214 * Default Mapping:
215 * 1. dual-dsi/single-dsi:
216 * DSI0 <--> PLL0
217 * DSI1 <--> PLL1
218 * 2. split-dsi:
219 * DSI0 <--> PLL0
220 * DSI1 <--> PLL0
221 */
222 sdata->byte0_parent = sdata->ext_byte0_clk;
223 sdata->pixel0_parent = sdata->ext_pixel0_clk;
224
225 if (mdss_dsi_is_hw_config_split(sdata)) {
226 sdata->byte1_parent = sdata->byte0_parent;
227 sdata->pixel1_parent = sdata->pixel0_parent;
228 } else if (sdata->ext_byte1_clk && sdata->ext_pixel1_clk) {
229 sdata->byte1_parent = sdata->ext_byte1_clk;
230 sdata->pixel1_parent = sdata->ext_pixel1_clk;
231 } else {
232 pr_debug("%s: DSI-1 external clocks not present\n",
233 __func__);
234 return;
235 }
236
237 pr_debug("%s: default: DSI0 <--> PLL0, DSI1 <--> %s", __func__,
238 mdss_dsi_is_hw_config_split(sdata) ? "PLL0" : "PLL1");
239 } else {
240 /*
241 * For split-dsi and single-dsi use cases, map the PLL source
242 * based on the pll source configuration. It is possible that
243 * for split-dsi case, the only supported config is to source
244 * the clocks from PLL0. This is not explicitly checked here as
245 * it should have been already enforced when validating the
246 * board configuration.
247 */
248 if (mdss_dsi_is_pll_src_pll0(sdata)) {
249 pr_debug("%s: single source: PLL0", __func__);
250 sdata->byte0_parent = sdata->ext_byte0_clk;
251 sdata->pixel0_parent = sdata->ext_pixel0_clk;
252 } else if (mdss_dsi_is_pll_src_pll1(sdata)) {
253 if (sdata->ext_byte1_clk && sdata->ext_pixel1_clk) {
254 pr_debug("%s: single source: PLL1", __func__);
255 sdata->byte0_parent = sdata->ext_byte1_clk;
256 sdata->pixel0_parent = sdata->ext_pixel1_clk;
257 } else {
258 pr_err("%s: DSI-1 external clocks not present\n",
259 __func__);
260 return;
261 }
262 }
263 sdata->byte1_parent = sdata->byte0_parent;
264 sdata->pixel1_parent = sdata->pixel0_parent;
265 }
266}
267
268static char const *mdss_dsi_get_clk_src(struct mdss_dsi_ctrl_pdata *ctrl)
269{
270 struct dsi_shared_data *sdata;
271
272 if (!ctrl) {
273 pr_err("%s: Invalid input data\n", __func__);
274 return "????";
275 }
276
277 sdata = ctrl->shared_data;
278
279 if (mdss_dsi_is_left_ctrl(ctrl)) {
280 if (sdata->byte0_parent == sdata->ext_byte0_clk)
281 return "PLL0";
282 else
283 return "PLL1";
284 } else {
285 if (sdata->byte1_parent == sdata->ext_byte0_clk)
286 return "PLL0";
287 else
288 return "PLL1";
289 }
290}
291
292static int mdss_dsi_set_clk_src(struct mdss_dsi_ctrl_pdata *ctrl)
293{
294 int rc;
295 struct dsi_shared_data *sdata;
296 struct clk *byte_parent, *pixel_parent;
297
298 if (!ctrl) {
299 pr_err("%s: Invalid input data\n", __func__);
300 return -EINVAL;
301 }
302
303 sdata = ctrl->shared_data;
304
305 if (!ctrl->byte_clk_rcg || !ctrl->pixel_clk_rcg) {
306 pr_debug("%s: set_clk_src not needed\n", __func__);
307 return 0;
308 }
309
310 if (mdss_dsi_is_left_ctrl(ctrl)) {
311 byte_parent = sdata->byte0_parent;
312 pixel_parent = sdata->pixel0_parent;
313 } else {
314 byte_parent = sdata->byte1_parent;
315 pixel_parent = sdata->pixel1_parent;
316 }
317
318 rc = clk_set_parent(ctrl->byte_clk_rcg, byte_parent);
319 if (rc) {
320 pr_err("%s: failed to set parent for byte clk for ctrl%d. rc=%d\n",
321 __func__, ctrl->ndx, rc);
322 goto error;
323 }
324
325 rc = clk_set_parent(ctrl->pixel_clk_rcg, pixel_parent);
326 if (rc) {
327 pr_err("%s: failed to set parent for pixel clk for ctrl%d. rc=%d\n",
328 __func__, ctrl->ndx, rc);
329 goto error;
330 }
331
332 pr_debug("%s: ctrl%d clock source set to %s", __func__, ctrl->ndx,
333 mdss_dsi_get_clk_src(ctrl));
334
335error:
336 return rc;
337}
338
339static int mdss_dsi_regulator_init(struct platform_device *pdev,
340 struct dsi_shared_data *sdata)
341{
342 int rc = 0, i = 0, j = 0;
343
344 if (!pdev || !sdata) {
345 pr_err("%s: invalid input\n", __func__);
346 return -EINVAL;
347 }
348
349 for (i = DSI_CORE_PM; !rc && (i < DSI_MAX_PM); i++) {
Sachin Bhayare5076e252018-01-18 14:56:45 +0530350 rc = msm_mdss_config_vreg(&pdev->dev,
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530351 sdata->power_data[i].vreg_config,
352 sdata->power_data[i].num_vreg, 1);
353 if (rc) {
354 pr_err("%s: failed to init vregs for %s\n",
355 __func__, __mdss_dsi_pm_name(i));
356 for (j = i-1; j >= DSI_CORE_PM; j--) {
Sachin Bhayare5076e252018-01-18 14:56:45 +0530357 msm_mdss_config_vreg(&pdev->dev,
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530358 sdata->power_data[j].vreg_config,
359 sdata->power_data[j].num_vreg, 0);
360 }
361 }
362 }
363
364 return rc;
365}
366
367static int mdss_dsi_panel_power_off(struct mdss_panel_data *pdata)
368{
369 int ret = 0;
370 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
371
372 if (pdata == NULL) {
373 pr_err("%s: Invalid input data\n", __func__);
374 ret = -EINVAL;
375 goto end;
376 }
377
378 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
379 panel_data);
380
381 ret = mdss_dsi_panel_reset(pdata, 0);
382 if (ret) {
383 pr_warn("%s: Panel reset failed. rc=%d\n", __func__, ret);
384 ret = 0;
385 }
386
Narender Ankam4fcd6892018-06-11 13:09:00 +0530387 if (gpio_is_valid(ctrl_pdata->vdd_ext_gpio)) {
388 ret = gpio_direction_output(
389 ctrl_pdata->vdd_ext_gpio, 0);
390 if (ret)
391 pr_err("%s: unable to set dir for vdd gpio\n",
392 __func__);
393 }
394
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530395 if (mdss_dsi_pinctrl_set_state(ctrl_pdata, false))
396 pr_debug("reset disable: pinctrl not enabled\n");
397
Sachin Bhayare5076e252018-01-18 14:56:45 +0530398 ret = msm_mdss_enable_vreg(
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530399 ctrl_pdata->panel_power_data.vreg_config,
400 ctrl_pdata->panel_power_data.num_vreg, 0);
401 if (ret)
402 pr_err("%s: failed to disable vregs for %s\n",
403 __func__, __mdss_dsi_pm_name(DSI_PANEL_PM));
404
405end:
406 return ret;
407}
408
409static int mdss_dsi_panel_power_on(struct mdss_panel_data *pdata)
410{
411 int ret = 0;
412 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
413
414 if (pdata == NULL) {
415 pr_err("%s: Invalid input data\n", __func__);
416 return -EINVAL;
417 }
418
419 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
420 panel_data);
421
Narender Ankam4fcd6892018-06-11 13:09:00 +0530422 if (gpio_is_valid(ctrl_pdata->vdd_ext_gpio)) {
423 ret = gpio_direction_output(
424 ctrl_pdata->vdd_ext_gpio, 1);
425 usleep_range(3000, 4000); /* h/w recommended delay */
426 if (ret)
427 pr_err("%s: unable to set dir for vdd gpio\n",
428 __func__);
429 }
430
Sachin Bhayare5076e252018-01-18 14:56:45 +0530431 ret = msm_mdss_enable_vreg(
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530432 ctrl_pdata->panel_power_data.vreg_config,
433 ctrl_pdata->panel_power_data.num_vreg, 1);
434 if (ret) {
435 pr_err("%s: failed to enable vregs for %s\n",
436 __func__, __mdss_dsi_pm_name(DSI_PANEL_PM));
437 return ret;
438 }
439
440 /*
441 * If continuous splash screen feature is enabled, then we need to
442 * request all the GPIOs that have already been configured in the
443 * bootloader. This needs to be done irresepective of whether
444 * the lp11_init flag is set or not.
445 */
446 if (pdata->panel_info.cont_splash_enabled ||
447 !pdata->panel_info.mipi.lp11_init) {
448 if (mdss_dsi_pinctrl_set_state(ctrl_pdata, true))
449 pr_debug("reset enable: pinctrl not enabled\n");
450
451 ret = mdss_dsi_panel_reset(pdata, 1);
452 if (ret)
453 pr_err("%s: Panel reset failed. rc=%d\n",
454 __func__, ret);
455 }
456
457 return ret;
458}
459
460static int mdss_dsi_panel_power_lp(struct mdss_panel_data *pdata, int enable)
461{
462 /* Panel power control when entering/exiting lp mode */
463 return 0;
464}
465
466static int mdss_dsi_panel_power_ulp(struct mdss_panel_data *pdata,
467 int enable)
468{
469 int ret = 0, i;
470 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
471 u32 mode = enable ? DSS_REG_MODE_ULP : DSS_REG_MODE_ENABLE;
472 struct dsi_shared_data *sdata;
473
474 pr_debug("%s: +\n", __func__);
475 if (pdata == NULL) {
476 pr_err("%s: Invalid input data\n", __func__);
477 return -EINVAL;
478 }
479
480 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
481 panel_data);
482 sdata = ctrl_pdata->shared_data;
483
484 for (i = 0; i < DSI_MAX_PM; i++) {
485 /*
486 * Core power module need to be controlled along with
487 * DSI core clocks.
488 */
489 if (i == DSI_CORE_PM)
490 continue;
491 if (i == DSI_PANEL_PM)
Sachin Bhayare5076e252018-01-18 14:56:45 +0530492 ret = msm_mdss_config_vreg_opt_mode(
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530493 ctrl_pdata->panel_power_data.vreg_config,
494 ctrl_pdata->panel_power_data.num_vreg, mode);
495 else
Sachin Bhayare5076e252018-01-18 14:56:45 +0530496 ret = msm_mdss_config_vreg_opt_mode(
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530497 sdata->power_data[i].vreg_config,
498 sdata->power_data[i].num_vreg, mode);
499 if (ret) {
500 pr_err("%s: failed to config ulp opt mode for %s.rc=%d\n",
501 __func__, __mdss_dsi_pm_name(i), ret);
502 break;
503 }
504 }
505
506 if (ret) {
507 mode = enable ? DSS_REG_MODE_ENABLE : DSS_REG_MODE_ULP;
508 for (; i >= 0; i--)
Sachin Bhayare5076e252018-01-18 14:56:45 +0530509 msm_mdss_config_vreg_opt_mode(
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530510 ctrl_pdata->power_data[i].vreg_config,
511 ctrl_pdata->power_data[i].num_vreg, mode);
512 }
513 return ret;
514}
515
516int mdss_dsi_panel_power_ctrl(struct mdss_panel_data *pdata,
517 int power_state)
518{
Sachin Bhayare3d3767e2018-01-02 21:10:57 +0530519 int ret = 0;
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530520 struct mdss_panel_info *pinfo;
521 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
522
523 if (pdata == NULL) {
524 pr_err("%s: Invalid input data\n", __func__);
525 return -EINVAL;
526 }
527
528 pinfo = &pdata->panel_info;
529 pr_debug("%pS-->%s: cur_power_state=%d req_power_state=%d\n",
530 __builtin_return_address(0), __func__,
531 pinfo->panel_power_state, power_state);
532
533 if (pinfo->panel_power_state == power_state) {
534 pr_debug("%s: no change needed\n", __func__);
535 return 0;
536 }
537
538 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
539 panel_data);
540
541 /*
542 * If a dynamic mode switch is pending, the regulators should not
543 * be turned off or on.
544 */
545 if (pdata->panel_info.dynamic_switch_pending)
546 return 0;
547
548 switch (power_state) {
549 case MDSS_PANEL_POWER_OFF:
550 ret = mdss_dsi_panel_power_off(pdata);
551 break;
552 case MDSS_PANEL_POWER_ON:
553 if (mdss_dsi_is_panel_on_ulp(pdata)) {
554 ret = mdss_dsi_panel_power_ulp(pdata, false);
555 goto end;
556 } else if (mdss_dsi_is_panel_on_lp(pdata)) {
557 ret = mdss_dsi_panel_power_lp(pdata, false);
558 goto end;
559 } else {
560 ret = mdss_dsi_panel_power_on(pdata);
561 }
562 break;
563 case MDSS_PANEL_POWER_LP1:
564 if (mdss_dsi_is_panel_on_ulp(pdata))
565 ret = mdss_dsi_panel_power_ulp(pdata, false);
566 else
567 ret = mdss_dsi_panel_power_lp(pdata, true);
568 /*
569 * temp workaround until framework issues pertaining to LP2
570 * power state transitions are fixed. For now, we internally
571 * transition to LP2 state whenever core power is turned off
572 * in LP1 state
573 */
574 break;
575 case MDSS_PANEL_POWER_LP2:
576 if (!ctrl_pdata->core_power)
577 ret = mdss_dsi_panel_power_ulp(pdata, true);
578 break;
579 default:
580 pr_err("%s: unknown panel power state requested (%d)\n",
581 __func__, power_state);
582 ret = -EINVAL;
583 }
584
585 if (!ret)
586 pinfo->panel_power_state = power_state;
587end:
588 return ret;
589}
590
591static void mdss_dsi_put_dt_vreg_data(struct device *dev,
Sachin Bhayare5076e252018-01-18 14:56:45 +0530592 struct mdss_module_power *module_power)
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530593{
594 if (!module_power) {
595 pr_err("%s: invalid input\n", __func__);
596 return;
597 }
598
599 if (module_power->vreg_config) {
600 devm_kfree(dev, module_power->vreg_config);
601 module_power->vreg_config = NULL;
602 }
603 module_power->num_vreg = 0;
604}
605
606static int mdss_dsi_get_dt_vreg_data(struct device *dev,
Sachin Bhayare5076e252018-01-18 14:56:45 +0530607 struct device_node *of_node, struct mdss_module_power *mp,
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530608 enum dsi_pm_type module)
609{
610 int i = 0, rc = 0;
611 u32 tmp = 0;
612 struct device_node *supply_node = NULL;
613 const char *pm_supply_name = NULL;
614 struct device_node *supply_root_node = NULL;
615
616 if (!dev || !mp) {
617 pr_err("%s: invalid input\n", __func__);
618 rc = -EINVAL;
619 return rc;
620 }
621
622 mp->num_vreg = 0;
623 pm_supply_name = __mdss_dsi_pm_supply_node_name(module);
624 supply_root_node = of_get_child_by_name(of_node, pm_supply_name);
625 if (!supply_root_node) {
626 /*
627 * Try to get the root node for panel power supply using
628 * of_parse_phandle() API if of_get_child_by_name() API fails.
629 */
630 supply_root_node = of_parse_phandle(of_node, pm_supply_name, 0);
631 if (!supply_root_node) {
632 pr_err("no supply entry present: %s\n", pm_supply_name);
633 goto novreg;
634 }
635 }
636
637
638 for_each_child_of_node(supply_root_node, supply_node) {
639 mp->num_vreg++;
640 }
641
642 if (mp->num_vreg == 0) {
643 pr_debug("%s: no vreg\n", __func__);
644 goto novreg;
645 } else {
646 pr_debug("%s: vreg found. count=%d\n", __func__, mp->num_vreg);
647 }
648
Sachin Bhayare5076e252018-01-18 14:56:45 +0530649 mp->vreg_config = devm_kzalloc(dev, sizeof(struct mdss_vreg) *
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530650 mp->num_vreg, GFP_KERNEL);
651 if (!mp->vreg_config) {
652 rc = -ENOMEM;
653 goto error;
654 }
655
656 for_each_child_of_node(supply_root_node, supply_node) {
657 const char *st = NULL;
658 /* vreg-name */
659 rc = of_property_read_string(supply_node,
660 "qcom,supply-name", &st);
661 if (rc) {
662 pr_err("%s: error reading name. rc=%d\n",
663 __func__, rc);
664 goto error;
665 }
666 snprintf(mp->vreg_config[i].vreg_name,
667 ARRAY_SIZE((mp->vreg_config[i].vreg_name)), "%s", st);
668 /* vreg-min-voltage */
669 rc = of_property_read_u32(supply_node,
670 "qcom,supply-min-voltage", &tmp);
671 if (rc) {
672 pr_err("%s: error reading min volt. rc=%d\n",
673 __func__, rc);
674 goto error;
675 }
676 mp->vreg_config[i].min_voltage = tmp;
677
678 /* vreg-max-voltage */
679 rc = of_property_read_u32(supply_node,
680 "qcom,supply-max-voltage", &tmp);
681 if (rc) {
682 pr_err("%s: error reading max volt. rc=%d\n",
683 __func__, rc);
684 goto error;
685 }
686 mp->vreg_config[i].max_voltage = tmp;
687
688 /* enable-load */
689 rc = of_property_read_u32(supply_node,
690 "qcom,supply-enable-load", &tmp);
691 if (rc) {
692 pr_err("%s: error reading enable load. rc=%d\n",
693 __func__, rc);
694 goto error;
695 }
696 mp->vreg_config[i].load[DSS_REG_MODE_ENABLE] = tmp;
697
698 /* disable-load */
699 rc = of_property_read_u32(supply_node,
700 "qcom,supply-disable-load", &tmp);
701 if (rc) {
702 pr_err("%s: error reading disable load. rc=%d\n",
703 __func__, rc);
704 goto error;
705 }
706 mp->vreg_config[i].load[DSS_REG_MODE_DISABLE] = tmp;
707
708 /* ulp-load */
709 rc = of_property_read_u32(supply_node,
710 "qcom,supply-ulp-load", &tmp);
711 if (rc) {
712 pr_warn("%s: error reading ulp load. rc=%d\n",
713 __func__, rc);
714 rc = 0;
715 }
716 mp->vreg_config[i].load[DSS_REG_MODE_ULP] = (!rc ? tmp :
717 mp->vreg_config[i].load[DSS_REG_MODE_ENABLE]);
718
719 /* pre-sleep */
720 rc = of_property_read_u32(supply_node,
721 "qcom,supply-pre-on-sleep", &tmp);
722 if (rc) {
723 pr_debug("%s: error reading supply pre sleep value. rc=%d\n",
724 __func__, rc);
725 rc = 0;
726 } else {
727 mp->vreg_config[i].pre_on_sleep = tmp;
728 }
729
730 rc = of_property_read_u32(supply_node,
731 "qcom,supply-pre-off-sleep", &tmp);
732 if (rc) {
733 pr_debug("%s: error reading supply pre sleep value. rc=%d\n",
734 __func__, rc);
735 rc = 0;
736 } else {
737 mp->vreg_config[i].pre_off_sleep = tmp;
738 }
739
740 /* post-sleep */
741 rc = of_property_read_u32(supply_node,
742 "qcom,supply-post-on-sleep", &tmp);
743 if (rc) {
744 pr_debug("%s: error reading supply post sleep value. rc=%d\n",
745 __func__, rc);
746 rc = 0;
747 } else {
748 mp->vreg_config[i].post_on_sleep = tmp;
749 }
750
751 rc = of_property_read_u32(supply_node,
752 "qcom,supply-post-off-sleep", &tmp);
753 if (rc) {
754 pr_debug("%s: error reading supply post sleep value. rc=%d\n",
755 __func__, rc);
756 rc = 0;
757 } else {
758 mp->vreg_config[i].post_off_sleep = tmp;
759 }
760
761 pr_debug("%s: %s min=%d, max=%d, enable=%d, disable=%d, ulp_load=%d preonsleep=%d, postonsleep=%d, preoffsleep=%d, postoffsleep=%d\n",
762 __func__,
763 mp->vreg_config[i].vreg_name,
764 mp->vreg_config[i].min_voltage,
765 mp->vreg_config[i].max_voltage,
766 mp->vreg_config[i].load[DSS_REG_MODE_ENABLE],
767 mp->vreg_config[i].load[DSS_REG_MODE_DISABLE],
768 mp->vreg_config[i].load[DSS_REG_MODE_ULP],
769 mp->vreg_config[i].pre_on_sleep,
770 mp->vreg_config[i].post_on_sleep,
771 mp->vreg_config[i].pre_off_sleep,
772 mp->vreg_config[i].post_off_sleep
773 );
774 ++i;
775 }
776
777 return rc;
778
779error:
780 if (mp->vreg_config) {
781 devm_kfree(dev, mp->vreg_config);
782 mp->vreg_config = NULL;
783 }
784novreg:
785 mp->num_vreg = 0;
786
787 return rc;
788}
789
790static int mdss_dsi_get_panel_cfg(char *panel_cfg,
791 struct mdss_dsi_ctrl_pdata *ctrl)
792{
793 int rc;
794 struct mdss_panel_cfg *pan_cfg = NULL;
795
796 if (!panel_cfg)
797 return MDSS_PANEL_INTF_INVALID;
798
799 pan_cfg = ctrl->mdss_util->panel_intf_type(MDSS_PANEL_INTF_DSI);
800 if (IS_ERR(pan_cfg)) {
801 return PTR_ERR(pan_cfg);
802 } else if (!pan_cfg) {
803 panel_cfg[0] = 0;
804 return 0;
805 }
806
807 pr_debug("%s:%d: cfg:[%s]\n", __func__, __LINE__,
808 pan_cfg->arg_cfg);
809 rc = strlcpy(panel_cfg, pan_cfg->arg_cfg,
810 sizeof(pan_cfg->arg_cfg));
811 return rc;
812}
813
814struct buf_data {
815 char *buf; /* cmd buf */
816 int blen; /* cmd buf length */
817 char *string_buf; /* cmd buf as string, 3 bytes per number */
818 int sblen; /* string buffer length */
819 int sync_flag;
820 struct mutex dbg_mutex; /* mutex to synchronize read/write/flush */
821};
822
823struct mdss_dsi_debugfs_info {
824 struct dentry *root;
825 struct mdss_dsi_ctrl_pdata ctrl_pdata;
826 struct buf_data on_cmd;
827 struct buf_data off_cmd;
828 u32 override_flag;
829};
830
831static int mdss_dsi_cmd_state_open(struct inode *inode, struct file *file)
832{
833 /* non-seekable */
834 file->private_data = inode->i_private;
835 return nonseekable_open(inode, file);
836}
837
838static ssize_t mdss_dsi_cmd_state_read(struct file *file, char __user *buf,
839 size_t count, loff_t *ppos)
840{
841 int *link_state = file->private_data;
842 char buffer[32];
843 int blen = 0;
844
845 if (*ppos)
846 return 0;
847
848 if ((*link_state) == DSI_HS_MODE)
849 blen = snprintf(buffer, sizeof(buffer), "dsi_hs_mode\n");
850 else
851 blen = snprintf(buffer, sizeof(buffer), "dsi_lp_mode\n");
852
853 if (blen < 0)
854 return 0;
855
Rashi Bindra1dba4522018-04-04 17:58:15 +0530856 if (copy_to_user(buf, buffer, min(count, (size_t)blen+1)))
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530857 return -EFAULT;
858
859 *ppos += blen;
860 return blen;
861}
862
863static ssize_t mdss_dsi_cmd_state_write(struct file *file,
864 const char __user *p, size_t count, loff_t *ppos)
865{
866 int *link_state = file->private_data;
867 char *input;
868
869 if (!count) {
870 pr_err("%s: Zero bytes to be written\n", __func__);
871 return -EINVAL;
872 }
873
874 input = kmalloc(count, GFP_KERNEL);
875 if (!input)
876 return -ENOMEM;
877
878 if (copy_from_user(input, p, count)) {
879 kfree(input);
880 return -EFAULT;
881 }
882 input[count-1] = '\0';
883
884 if (strnstr(input, "dsi_hs_mode", strlen("dsi_hs_mode")))
885 *link_state = DSI_HS_MODE;
886 else
887 *link_state = DSI_LP_MODE;
888
889 kfree(input);
890 return count;
891}
892
893static const struct file_operations mdss_dsi_cmd_state_fop = {
894 .open = mdss_dsi_cmd_state_open,
895 .read = mdss_dsi_cmd_state_read,
896 .write = mdss_dsi_cmd_state_write,
897};
898
899static int mdss_dsi_cmd_open(struct inode *inode, struct file *file)
900{
901 /* non-seekable */
902 file->private_data = inode->i_private;
903 return nonseekable_open(inode, file);
904}
905
906static ssize_t mdss_dsi_cmd_read(struct file *file, char __user *buf,
907 size_t count, loff_t *ppos)
908{
909 struct buf_data *pcmds = file->private_data;
910 char *bp;
911 ssize_t ret = 0;
912
913 mutex_lock(&pcmds->dbg_mutex);
914 if (*ppos == 0) {
915 kfree(pcmds->string_buf);
916 pcmds->string_buf = NULL;
917 pcmds->sblen = 0;
918 }
919
920 if (!pcmds->string_buf) {
921 /*
922 * Buffer size is the sum of cmd length (3 bytes per number)
923 * with NULL terminater
924 */
925 int bsize = ((pcmds->blen)*3 + 1);
926 int blen = 0;
927 char *buffer;
928
929 buffer = kmalloc(bsize, GFP_KERNEL);
930 if (!buffer) {
931 mutex_unlock(&pcmds->dbg_mutex);
932 return -ENOMEM;
933 }
934
935 bp = pcmds->buf;
936 while ((blen < (bsize-1)) &&
937 (bp < ((pcmds->buf) + (pcmds->blen)))) {
938 struct dsi_ctrl_hdr dchdr =
939 *((struct dsi_ctrl_hdr *)bp);
940 int dhrlen = sizeof(dchdr), dlen;
941 char *tmp = (char *)(&dchdr);
942
943 dlen = dchdr.dlen;
944 dchdr.dlen = htons(dchdr.dlen);
945 while (dhrlen--)
946 blen += snprintf(buffer+blen, bsize-blen,
947 "%02x ", (*tmp++));
948
949 bp += sizeof(dchdr);
950 while (dlen--)
951 blen += snprintf(buffer+blen, bsize-blen,
952 "%02x ", (*bp++));
953 buffer[blen-1] = '\n';
954 }
955 buffer[blen] = '\0';
956 pcmds->string_buf = buffer;
957 pcmds->sblen = blen;
958 }
959
960 /*
961 * The max value of count is PAGE_SIZE(4096).
962 * It may need multiple times of reading if string buf is too large
963 */
964 if (*ppos >= (pcmds->sblen)) {
965 kfree(pcmds->string_buf);
966 pcmds->string_buf = NULL;
967 pcmds->sblen = 0;
968 mutex_unlock(&pcmds->dbg_mutex);
969 return 0; /* the end */
970 }
971 ret = simple_read_from_buffer(buf, count, ppos, pcmds->string_buf,
972 pcmds->sblen);
973 mutex_unlock(&pcmds->dbg_mutex);
974 return ret;
975}
976
977static ssize_t mdss_dsi_cmd_write(struct file *file, const char __user *p,
978 size_t count, loff_t *ppos)
979{
980 struct buf_data *pcmds = file->private_data;
981 ssize_t ret = 0;
Nirmal Abraham6d32cea2019-08-16 16:39:17 +0530982 unsigned int blen = 0;
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530983 char *string_buf;
984
985 mutex_lock(&pcmds->dbg_mutex);
986 if (*ppos == 0) {
987 kfree(pcmds->string_buf);
988 pcmds->string_buf = NULL;
989 pcmds->sblen = 0;
990 }
991
992 /* Allocate memory for the received string */
993 blen = count + (pcmds->sblen);
Nirmal Abraham6d32cea2019-08-16 16:39:17 +0530994 if (blen > U32_MAX - 1) {
995 mutex_unlock(&pcmds->dbg_mutex);
996 return -EINVAL;
997 }
998
Sachin Bhayareeeb88892018-01-02 16:36:01 +0530999 string_buf = krealloc(pcmds->string_buf, blen + 1, GFP_KERNEL);
1000 if (!string_buf) {
1001 pr_err("%s: Failed to allocate memory\n", __func__);
1002 mutex_unlock(&pcmds->dbg_mutex);
1003 return -ENOMEM;
1004 }
1005
Nirmal Abraham6d32cea2019-08-16 16:39:17 +05301006 pcmds->string_buf = string_buf;
Sachin Bhayareeeb88892018-01-02 16:36:01 +05301007 /* Writing in batches is possible */
1008 ret = simple_write_to_buffer(string_buf, blen, ppos, p, count);
1009 if (ret < 0) {
1010 pr_err("%s: Failed to copy data\n", __func__);
1011 mutex_unlock(&pcmds->dbg_mutex);
1012 return -EINVAL;
1013 }
1014
1015 string_buf[ret] = '\0';
Sachin Bhayareeeb88892018-01-02 16:36:01 +05301016 pcmds->sblen = count;
1017 mutex_unlock(&pcmds->dbg_mutex);
1018 return ret;
1019}
1020
1021static int mdss_dsi_cmd_flush(struct file *file, fl_owner_t id)
1022{
1023 struct buf_data *pcmds = file->private_data;
raghavendra ambadasa46d3882019-05-22 17:14:21 +05301024 unsigned int len;
1025 int blen, i;
Sachin Bhayareeeb88892018-01-02 16:36:01 +05301026 char *buf, *bufp, *bp;
1027 struct dsi_ctrl_hdr *dchdr;
1028
1029 mutex_lock(&pcmds->dbg_mutex);
1030
1031 if (!pcmds->string_buf) {
1032 mutex_unlock(&pcmds->dbg_mutex);
1033 return 0;
1034 }
1035
1036 /*
1037 * Allocate memory for command buffer
1038 * 3 bytes per number, and 2 bytes for the last one
1039 */
1040 blen = ((pcmds->sblen) + 2) / 3;
1041 buf = kcalloc(1, blen, GFP_KERNEL);
1042 if (!buf) {
1043 pr_err("%s: Failed to allocate memory\n", __func__);
1044 kfree(pcmds->string_buf);
1045 pcmds->string_buf = NULL;
1046 pcmds->sblen = 0;
1047 mutex_unlock(&pcmds->dbg_mutex);
1048 return -ENOMEM;
1049 }
1050
1051 /* Translate the input string to command array */
1052 bufp = pcmds->string_buf;
1053 for (i = 0; i < blen; i++) {
1054 uint32_t value = 0;
1055 int step = 0;
1056
1057 if (sscanf(bufp, "%02x%n", &value, &step) > 0) {
1058 *(buf+i) = (char)value;
1059 bufp += step;
1060 }
1061 }
1062
1063 /* Scan dcs commands */
1064 bp = buf;
1065 len = blen;
1066 while (len >= sizeof(*dchdr)) {
1067 dchdr = (struct dsi_ctrl_hdr *)bp;
1068 dchdr->dlen = ntohs(dchdr->dlen);
raghavendra ambadasa46d3882019-05-22 17:14:21 +05301069 if (dchdr->dlen > (len - sizeof(*dchdr)) || dchdr->dlen < 0) {
Sachin Bhayareeeb88892018-01-02 16:36:01 +05301070 pr_err("%s: dtsi cmd=%x error, len=%d\n",
1071 __func__, dchdr->dtype, dchdr->dlen);
1072 kfree(buf);
1073 mutex_unlock(&pcmds->dbg_mutex);
1074 return -EINVAL;
1075 }
1076 bp += sizeof(*dchdr);
1077 len -= sizeof(*dchdr);
1078 bp += dchdr->dlen;
1079 len -= dchdr->dlen;
1080 }
1081 if (len != 0) {
1082 pr_err("%s: dcs_cmd=%x len=%d error!\n", __func__,
1083 bp[0], len);
1084 kfree(buf);
1085 mutex_unlock(&pcmds->dbg_mutex);
1086 return -EINVAL;
1087 }
1088
1089 if (pcmds->sync_flag) {
1090 pcmds->buf = buf;
1091 pcmds->blen = blen;
1092 pcmds->sync_flag = 0;
1093 } else {
1094 kfree(pcmds->buf);
1095 pcmds->buf = buf;
1096 pcmds->blen = blen;
1097 }
1098 mutex_unlock(&pcmds->dbg_mutex);
1099 return 0;
1100}
1101
1102static const struct file_operations mdss_dsi_cmd_fop = {
1103 .open = mdss_dsi_cmd_open,
1104 .read = mdss_dsi_cmd_read,
1105 .write = mdss_dsi_cmd_write,
1106 .flush = mdss_dsi_cmd_flush,
1107};
1108
1109struct dentry *dsi_debugfs_create_dcs_cmd(const char *name, umode_t mode,
1110 struct dentry *parent, struct buf_data *cmd,
1111 struct dsi_panel_cmds ctrl_cmds)
1112{
1113 mutex_init(&cmd->dbg_mutex);
1114 cmd->buf = ctrl_cmds.buf;
1115 cmd->blen = ctrl_cmds.blen;
1116 cmd->string_buf = NULL;
1117 cmd->sblen = 0;
1118 cmd->sync_flag = 1;
1119
1120 return debugfs_create_file(name, mode, parent,
1121 cmd, &mdss_dsi_cmd_fop);
1122}
1123
1124#define DEBUGFS_CREATE_DCS_CMD(name, node, cmd, ctrl_cmd) \
1125 dsi_debugfs_create_dcs_cmd(name, 0644, node, cmd, ctrl_cmd)
1126
1127static int mdss_dsi_debugfs_setup(struct mdss_panel_data *pdata,
1128 struct dentry *parent)
1129{
1130 struct mdss_dsi_ctrl_pdata *ctrl_pdata, *dfs_ctrl;
1131 struct mdss_dsi_debugfs_info *dfs;
1132
1133 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
1134 panel_data);
1135
1136 dfs = kcalloc(1, sizeof(*dfs), GFP_KERNEL);
1137 if (!dfs)
1138 return -ENOMEM;
1139
1140 dfs->root = debugfs_create_dir("dsi_ctrl_pdata", parent);
1141 if (IS_ERR_OR_NULL(dfs->root)) {
1142 pr_err("%s: debugfs_create_dir dsi fail, error %ld\n",
1143 __func__, PTR_ERR(dfs->root));
1144 kfree(dfs);
1145 return -ENODEV;
1146 }
1147
1148 dfs_ctrl = &dfs->ctrl_pdata;
1149 debugfs_create_u32("override_flag", 0644, dfs->root,
1150 &dfs->override_flag);
1151
1152 debugfs_create_bool("cmd_sync_wait_broadcast", 0644, dfs->root,
Sachin Bhayare3d3767e2018-01-02 21:10:57 +05301153 &dfs_ctrl->cmd_sync_wait_broadcast);
Sachin Bhayareeeb88892018-01-02 16:36:01 +05301154 debugfs_create_bool("cmd_sync_wait_trigger", 0644, dfs->root,
Sachin Bhayare3d3767e2018-01-02 21:10:57 +05301155 &dfs_ctrl->cmd_sync_wait_trigger);
Sachin Bhayareeeb88892018-01-02 16:36:01 +05301156
1157 debugfs_create_file("dsi_on_cmd_state", 0644, dfs->root,
1158 &dfs_ctrl->on_cmds.link_state, &mdss_dsi_cmd_state_fop);
1159 debugfs_create_file("dsi_off_cmd_state", 0644, dfs->root,
1160 &dfs_ctrl->off_cmds.link_state, &mdss_dsi_cmd_state_fop);
1161
1162 DEBUGFS_CREATE_DCS_CMD("dsi_on_cmd", dfs->root, &dfs->on_cmd,
1163 ctrl_pdata->on_cmds);
1164 DEBUGFS_CREATE_DCS_CMD("dsi_off_cmd", dfs->root, &dfs->off_cmd,
1165 ctrl_pdata->off_cmds);
1166
1167 debugfs_create_u32("dsi_err_counter", 0644, dfs->root,
1168 &dfs_ctrl->err_cont.max_err_index);
1169 debugfs_create_u32("dsi_err_time_delta", 0644, dfs->root,
1170 &dfs_ctrl->err_cont.err_time_delta);
1171
1172 dfs->override_flag = 0;
1173 dfs->ctrl_pdata = *ctrl_pdata;
1174 ctrl_pdata->debugfs_info = dfs;
1175 return 0;
1176}
1177
1178static int mdss_dsi_debugfs_init(struct mdss_dsi_ctrl_pdata *ctrl_pdata)
1179{
1180 int rc;
1181 struct mdss_panel_data *pdata;
1182 struct mdss_panel_info panel_info;
1183
1184 if (!ctrl_pdata) {
1185 pr_warn_once("%s: Invalid pdata!\n", __func__);
1186 return -EINVAL;
1187 }
1188
1189 pdata = &ctrl_pdata->panel_data;
1190 if (!pdata)
1191 return -EINVAL;
1192
1193 panel_info = pdata->panel_info;
1194 rc = mdss_dsi_debugfs_setup(pdata, panel_info.debugfs_info->root);
1195 if (rc) {
1196 pr_err("%s: Error in initilizing dsi ctrl debugfs\n",
1197 __func__);
1198 return rc;
1199 }
1200
1201 pr_debug("%s: Initialized mdss_dsi_debugfs_init\n", __func__);
1202 return 0;
1203}
1204
1205static void mdss_dsi_debugfs_cleanup(struct mdss_dsi_ctrl_pdata *ctrl_pdata)
1206{
1207 struct mdss_panel_data *pdata = &ctrl_pdata->panel_data;
1208
1209 do {
1210 struct mdss_dsi_ctrl_pdata *ctrl = container_of(pdata,
1211 struct mdss_dsi_ctrl_pdata, panel_data);
1212 struct mdss_dsi_debugfs_info *dfs = ctrl->debugfs_info;
1213
1214 if (dfs && dfs->root)
1215 debugfs_remove_recursive(dfs->root);
1216 kfree(dfs);
1217 pdata = pdata->next;
1218 } while (pdata);
1219 pr_debug("%s: Cleaned up mdss_dsi_debugfs_info\n", __func__);
1220}
1221
1222static int _mdss_dsi_refresh_cmd(struct buf_data *new_cmds,
1223 struct dsi_panel_cmds *original_pcmds)
1224{
1225 char *bp;
1226 int len, cnt, i;
1227 struct dsi_ctrl_hdr *dchdr;
1228 struct dsi_cmd_desc *cmds;
1229
1230 if (new_cmds->sync_flag)
1231 return 0;
1232
1233 bp = new_cmds->buf;
1234 len = new_cmds->blen;
1235 cnt = 0;
1236 /* Scan dcs commands and get dcs command count */
1237 while (len >= sizeof(*dchdr)) {
1238 dchdr = (struct dsi_ctrl_hdr *)bp;
1239 if (dchdr->dlen > len) {
1240 pr_err("%s: dtsi cmd=%x error, len=%d\n",
1241 __func__, dchdr->dtype, dchdr->dlen);
1242 return -EINVAL;
1243 }
1244 bp += sizeof(*dchdr) + dchdr->dlen;
1245 len -= sizeof(*dchdr) + dchdr->dlen;
1246 cnt++;
1247 }
1248
1249 if (len != 0) {
1250 pr_err("%s: dcs_cmd=%x len=%d error!\n", __func__,
1251 bp[0], len);
1252 return -EINVAL;
1253 }
1254
1255 /* Reallocate space for dcs commands */
1256 cmds = kcalloc(cnt, sizeof(struct dsi_cmd_desc), GFP_KERNEL);
1257 if (!cmds)
1258 return -ENOMEM;
1259
1260 kfree(original_pcmds->buf);
1261 kfree(original_pcmds->cmds);
1262 original_pcmds->cmd_cnt = cnt;
1263 original_pcmds->cmds = cmds;
1264 original_pcmds->buf = new_cmds->buf;
1265 original_pcmds->blen = new_cmds->blen;
1266
1267 bp = original_pcmds->buf;
1268 len = original_pcmds->blen;
1269 for (i = 0; i < cnt; i++) {
1270 dchdr = (struct dsi_ctrl_hdr *)bp;
1271 len -= sizeof(*dchdr);
1272 bp += sizeof(*dchdr);
1273 original_pcmds->cmds[i].dchdr = *dchdr;
1274 original_pcmds->cmds[i].payload = bp;
1275 bp += dchdr->dlen;
1276 len -= dchdr->dlen;
1277 }
1278
1279 new_cmds->sync_flag = 1;
1280 return 0;
1281}
1282
1283static void mdss_dsi_debugfsinfo_to_dsictrl_info(
1284 struct mdss_dsi_ctrl_pdata *ctrl_pdata)
1285{
1286 struct mdss_dsi_debugfs_info *dfs = ctrl_pdata->debugfs_info;
1287 struct dsi_err_container *dfs_err_cont = &dfs->ctrl_pdata.err_cont;
1288 struct dsi_err_container *err_cont = &ctrl_pdata->err_cont;
1289
1290 ctrl_pdata->cmd_sync_wait_broadcast =
1291 dfs->ctrl_pdata.cmd_sync_wait_broadcast;
1292 ctrl_pdata->cmd_sync_wait_trigger =
1293 dfs->ctrl_pdata.cmd_sync_wait_trigger;
1294
1295 _mdss_dsi_refresh_cmd(&dfs->on_cmd, &ctrl_pdata->on_cmds);
1296 _mdss_dsi_refresh_cmd(&dfs->off_cmd, &ctrl_pdata->off_cmds);
1297
1298 ctrl_pdata->on_cmds.link_state =
1299 dfs->ctrl_pdata.on_cmds.link_state;
1300 ctrl_pdata->off_cmds.link_state =
1301 dfs->ctrl_pdata.off_cmds.link_state;
1302
1303 /* keep error counter between 2 to 10 */
1304 if (dfs_err_cont->max_err_index >= 2 &&
1305 dfs_err_cont->max_err_index <= MAX_ERR_INDEX) {
1306 err_cont->max_err_index = dfs_err_cont->max_err_index;
1307 } else {
1308 dfs_err_cont->max_err_index = err_cont->max_err_index;
1309 pr_warn("resetting the dsi error counter to %d\n",
1310 err_cont->max_err_index);
1311 }
1312
1313 /* keep error duration between 16 ms to 100 seconds */
1314 if (dfs_err_cont->err_time_delta >= 16 &&
1315 dfs_err_cont->err_time_delta <= 100000) {
1316 err_cont->err_time_delta = dfs_err_cont->err_time_delta;
1317 } else {
1318 dfs_err_cont->err_time_delta = err_cont->err_time_delta;
1319 pr_warn("resetting the dsi error time delta to %d ms\n",
1320 err_cont->err_time_delta);
1321 }
1322}
1323
1324static void mdss_dsi_validate_debugfs_info(
1325 struct mdss_dsi_ctrl_pdata *ctrl_pdata)
1326{
1327 struct mdss_dsi_debugfs_info *dfs = ctrl_pdata->debugfs_info;
1328
1329 if (dfs->override_flag) {
1330 pr_debug("%s: Overriding dsi ctrl_pdata with debugfs data\n",
1331 __func__);
1332 dfs->override_flag = 0;
1333 mdss_dsi_debugfsinfo_to_dsictrl_info(ctrl_pdata);
1334 }
1335}
1336
1337static int mdss_dsi_off(struct mdss_panel_data *pdata, int power_state)
1338{
1339 int ret = 0;
1340 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
1341 struct mdss_panel_info *panel_info = NULL;
Rashi Bindra2d498842018-07-12 20:40:32 +05301342 struct platform_device *pdev;
1343 struct dsi_buf *tp;
Sachin Bhayareeeb88892018-01-02 16:36:01 +05301344
1345 if (pdata == NULL) {
1346 pr_err("%s: Invalid input data\n", __func__);
1347 return -EINVAL;
1348 }
1349
1350 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
1351 panel_data);
1352
1353 panel_info = &ctrl_pdata->panel_data.panel_info;
1354
Rashi Bindra2d498842018-07-12 20:40:32 +05301355 pdev = mdss_res->pdev;
1356 tp = &ctrl_pdata->tx_buf;
1357 mdss_smmu_dma_free_coherent(&pdev->dev, SZ_4K, tp->start, tp->dmap,
1358 ctrl_pdata->dma_addr, MDSS_IOMMU_DOMAIN_UNSECURE);
1359 tp->end = NULL;
1360 tp->size = 0;
1361 ctrl_pdata->dma_addr = 0;
1362 tp->start = NULL;
1363 tp->dmap = 0;
1364
Sachin Bhayareeeb88892018-01-02 16:36:01 +05301365 pr_debug("%s+: ctrl=%pK ndx=%d power_state=%d\n",
1366 __func__, ctrl_pdata, ctrl_pdata->ndx, power_state);
1367
1368 if (power_state == panel_info->panel_power_state) {
1369 pr_debug("%s: No change in power state %d -> %d\n", __func__,
1370 panel_info->panel_power_state, power_state);
1371 goto end;
1372 }
1373
1374 if (mdss_panel_is_power_on(power_state)) {
1375 pr_debug("%s: dsi_off with panel always on\n", __func__);
1376 goto panel_power_ctrl;
1377 }
1378
1379 /*
1380 * Link clocks should be turned off before PHY can be disabled.
1381 * For command mode panels, all clocks are turned off prior to reaching
1382 * here, so core clocks should be turned on before accessing hardware
1383 * registers. For video mode panel, turn off link clocks and then
1384 * disable PHY
1385 */
1386 if (pdata->panel_info.type == MIPI_CMD_PANEL)
1387 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
1388 MDSS_DSI_CORE_CLK, MDSS_DSI_CLK_ON);
1389 else
1390 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
1391 MDSS_DSI_LINK_CLK, MDSS_DSI_CLK_OFF);
1392
1393 if (!pdata->panel_info.ulps_suspend_enabled) {
1394 /* disable DSI controller */
1395 mdss_dsi_controller_cfg(0, pdata);
1396
1397 /* disable DSI phy */
1398 mdss_dsi_phy_disable(ctrl_pdata);
1399 }
1400 ctrl_pdata->ctrl_state &= ~CTRL_STATE_DSI_ACTIVE;
1401
1402 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
1403 MDSS_DSI_CORE_CLK, MDSS_DSI_CLK_OFF);
1404
1405panel_power_ctrl:
1406 ret = mdss_dsi_panel_power_ctrl(pdata, power_state);
1407 if (ret) {
1408 pr_err("%s: Panel power off failed\n", __func__);
1409 goto end;
1410 }
1411
1412 if (panel_info->dynamic_fps
1413 && (panel_info->dfps_update == DFPS_SUSPEND_RESUME_MODE)
1414 && (panel_info->new_fps != panel_info->mipi.frame_rate))
1415 panel_info->mipi.frame_rate = panel_info->new_fps;
1416
1417 /* Initialize Max Packet size for DCS reads */
1418 ctrl_pdata->cur_max_pkt_size = 0;
1419end:
1420 pr_debug("%s-:\n", __func__);
1421
1422 return ret;
1423}
1424
1425int mdss_dsi_switch_mode(struct mdss_panel_data *pdata, int mode)
1426{
1427 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
1428 struct mipi_panel_info *pinfo;
1429 bool dsi_ctrl_setup_needed = false;
1430
1431 if (!pdata) {
1432 pr_err("%s: Invalid input data\n", __func__);
1433 return -EINVAL;
1434 }
1435 pr_debug("%s, start\n", __func__);
1436
1437 pinfo = &pdata->panel_info.mipi;
1438 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
1439 panel_data);
1440
1441 if ((pinfo->dms_mode != DYNAMIC_MODE_RESOLUTION_SWITCH_IMMEDIATE) &&
1442 (pinfo->dms_mode != DYNAMIC_MODE_SWITCH_IMMEDIATE)) {
1443 pr_debug("%s: Dynamic mode switch not enabled.\n", __func__);
1444 return -EPERM;
1445 }
1446
1447 if (mode == MIPI_VIDEO_PANEL) {
1448 mode = SWITCH_TO_VIDEO_MODE;
1449 } else if (mode == MIPI_CMD_PANEL) {
1450 mode = SWITCH_TO_CMD_MODE;
1451 } else if (mode == SWITCH_RESOLUTION) {
1452 dsi_ctrl_setup_needed = true;
1453 pr_debug("Resolution switch mode selected\n");
1454 } else {
1455 pr_err("Invalid mode selected, mode=%d\n", mode);
1456 return -EINVAL;
1457 }
1458
1459 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
1460 MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON);
1461 if (dsi_ctrl_setup_needed)
1462 mdss_dsi_ctrl_setup(ctrl_pdata);
1463 ctrl_pdata->switch_mode(pdata, mode);
1464 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
1465 MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF);
1466
1467 pr_debug("%s, end\n", __func__);
1468 return 0;
1469}
1470
1471static int mdss_dsi_reconfig(struct mdss_panel_data *pdata, int mode)
1472{
1473 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
1474 struct mipi_panel_info *pinfo;
1475
1476 if (!pdata) {
1477 pr_err("%s: Invalid input data\n", __func__);
1478 return -EINVAL;
1479 }
1480 pr_debug("%s, start\n", __func__);
1481
1482 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
1483 panel_data);
1484 pinfo = &pdata->panel_info.mipi;
1485
1486 if (pinfo->dms_mode == DYNAMIC_MODE_SWITCH_IMMEDIATE) {
1487 /* reset DSI */
1488 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
1489 MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON);
1490 mdss_dsi_sw_reset(ctrl_pdata, true);
1491 mdss_dsi_ctrl_setup(ctrl_pdata);
1492 mdss_dsi_controller_cfg(true, pdata);
1493 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
1494 MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF);
1495 }
1496
1497 pr_debug("%s, end\n", __func__);
1498 return 0;
1499}
1500static int mdss_dsi_update_panel_config(struct mdss_dsi_ctrl_pdata *ctrl_pdata,
1501 int mode)
1502{
1503 int ret = 0;
1504 struct mdss_panel_info *pinfo = &(ctrl_pdata->panel_data.panel_info);
1505
1506 if (mode == DSI_CMD_MODE) {
1507 pinfo->mipi.mode = DSI_CMD_MODE;
1508 pinfo->type = MIPI_CMD_PANEL;
1509 pinfo->mipi.vsync_enable = 1;
1510 pinfo->mipi.hw_vsync_mode = 1;
1511 pinfo->partial_update_enabled = pinfo->partial_update_supported;
1512 } else { /*video mode*/
1513 pinfo->mipi.mode = DSI_VIDEO_MODE;
1514 pinfo->type = MIPI_VIDEO_PANEL;
1515 pinfo->mipi.vsync_enable = 0;
1516 pinfo->mipi.hw_vsync_mode = 0;
1517 pinfo->partial_update_enabled = 0;
1518 }
1519
1520 ctrl_pdata->panel_mode = pinfo->mipi.mode;
1521 mdss_panel_get_dst_fmt(pinfo->bpp, pinfo->mipi.mode,
1522 pinfo->mipi.pixel_packing, &(pinfo->mipi.dst_format));
1523 return ret;
1524}
1525
1526int mdss_dsi_on(struct mdss_panel_data *pdata)
1527{
1528 int ret = 0;
1529 struct mdss_panel_info *pinfo;
1530 struct mipi_panel_info *mipi;
1531 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
1532 int cur_power_state;
Rashi Bindra2d498842018-07-12 20:40:32 +05301533 struct platform_device *pdev;
1534 struct dsi_buf *tp;
Sachin Bhayareeeb88892018-01-02 16:36:01 +05301535
1536 if (pdata == NULL) {
1537 pr_err("%s: Invalid input data\n", __func__);
1538 return -EINVAL;
1539 }
1540
1541 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
1542 panel_data);
1543
Rashi Bindra2d498842018-07-12 20:40:32 +05301544 pdev = mdss_res->pdev;
1545 tp = &ctrl_pdata->tx_buf;
1546 if (!ctrl_pdata->mdss_util->iommu_attached())
1547 pr_err("%s : iommu not attached\n", __func__);
1548
1549 ret = mdss_smmu_dma_alloc_coherent(&pdev->dev, SZ_4K, &tp->dmap,
1550 &ctrl_pdata->dma_addr, (void *)&tp->start, GFP_KERNEL,
1551 MDSS_IOMMU_DOMAIN_UNSECURE);
1552 if (IS_ERR_VALUE((unsigned long)ret))
1553 pr_err("%s : mdss_smmu_dma_alloc_coherent failed\n", __func__);
1554
1555 tp->end = tp->start + SZ_4K;
1556 tp->size = SZ_4K;
1557
Sachin Bhayareeeb88892018-01-02 16:36:01 +05301558 if (ctrl_pdata->debugfs_info)
1559 mdss_dsi_validate_debugfs_info(ctrl_pdata);
1560
1561 cur_power_state = pdata->panel_info.panel_power_state;
1562 pr_debug("%s+: ctrl=%pK ndx=%d cur_power_state=%d\n", __func__,
1563 ctrl_pdata, ctrl_pdata->ndx, cur_power_state);
1564
1565 pinfo = &pdata->panel_info;
1566 mipi = &pdata->panel_info.mipi;
1567
1568 if (mdss_dsi_is_panel_on_interactive(pdata)) {
1569 /*
1570 * all interrupts are disabled at LK
1571 * for cont_splash case, intr mask bits need
1572 * to be restored to allow dcs command be
1573 * sent to panel
1574 */
1575 mdss_dsi_restore_intr_mask(ctrl_pdata);
1576 pr_debug("%s: panel already on\n", __func__);
1577 goto end;
1578 }
1579
1580 ret = mdss_dsi_panel_power_ctrl(pdata, MDSS_PANEL_POWER_ON);
1581 if (ret) {
1582 pr_err("%s:Panel power on failed. rc=%d\n", __func__, ret);
1583 goto end;
1584 }
1585
1586 if (mdss_panel_is_power_on(cur_power_state)) {
1587 pr_debug("%s: dsi_on from panel low power state\n", __func__);
1588 goto end;
1589 }
1590
1591 ret = mdss_dsi_set_clk_src(ctrl_pdata);
1592 if (ret) {
1593 pr_err("%s: failed to set clk src. rc=%d\n", __func__, ret);
1594 goto end;
1595 }
1596
1597 /*
1598 * Enable DSI core clocks prior to resetting and initializing DSI
1599 * Phy. Phy and ctrl setup need to be done before enabling the link
1600 * clocks.
1601 */
1602 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
1603 MDSS_DSI_CORE_CLK, MDSS_DSI_CLK_ON);
1604
1605 /*
1606 * If ULPS during suspend feature is enabled, then DSI PHY was
1607 * left on during suspend. In this case, we do not need to reset/init
1608 * PHY. This would have already been done when the CORE clocks are
1609 * turned on. However, if cont splash is disabled, the first time DSI
1610 * is powered on, phy init needs to be done unconditionally.
1611 */
1612 if (!pdata->panel_info.ulps_suspend_enabled || !ctrl_pdata->ulps) {
1613 mdss_dsi_phy_sw_reset(ctrl_pdata);
1614 mdss_dsi_phy_init(ctrl_pdata);
1615 mdss_dsi_ctrl_setup(ctrl_pdata);
1616 }
1617 ctrl_pdata->ctrl_state |= CTRL_STATE_DSI_ACTIVE;
1618
1619 /* DSI link clocks need to be on prior to ctrl sw reset */
1620 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
1621 MDSS_DSI_LINK_CLK, MDSS_DSI_CLK_ON);
1622 mdss_dsi_sw_reset(ctrl_pdata, true);
1623
1624 /*
1625 * Issue hardware reset line after enabling the DSI clocks and data
1626 * data lanes for LP11 init
1627 */
1628 if (mipi->lp11_init) {
1629 if (mdss_dsi_pinctrl_set_state(ctrl_pdata, true))
1630 pr_debug("reset enable: pinctrl not enabled\n");
1631 mdss_dsi_panel_reset(pdata, 1);
1632 }
1633
1634 if (mipi->init_delay)
1635 usleep_range(mipi->init_delay, mipi->init_delay + 10);
1636
1637 if (mipi->force_clk_lane_hs) {
1638 u32 tmp;
1639
1640 tmp = MIPI_INP((ctrl_pdata->ctrl_base) + 0xac);
1641 tmp |= (1<<28);
1642 MIPI_OUTP((ctrl_pdata->ctrl_base) + 0xac, tmp);
1643 wmb(); /* ensure write is finished before progressing */
1644 }
1645
1646 if (pdata->panel_info.type == MIPI_CMD_PANEL)
1647 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
1648 MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF);
1649
1650end:
1651 pr_debug("%s-:\n", __func__);
1652 return ret;
1653}
1654
1655static int mdss_dsi_pinctrl_set_state(
1656 struct mdss_dsi_ctrl_pdata *ctrl_pdata,
1657 bool active)
1658{
1659 struct pinctrl_state *pin_state;
1660 struct mdss_panel_info *pinfo = NULL;
1661 int rc = -EFAULT;
1662
1663 if (IS_ERR_OR_NULL(ctrl_pdata->pin_res.pinctrl))
1664 return PTR_ERR(ctrl_pdata->pin_res.pinctrl);
1665
1666 pinfo = &ctrl_pdata->panel_data.panel_info;
1667 if ((mdss_dsi_is_right_ctrl(ctrl_pdata) &&
1668 mdss_dsi_is_hw_config_split(ctrl_pdata->shared_data)) ||
1669 pinfo->is_dba_panel) {
1670 pr_debug("%s:%d, right ctrl pinctrl config not needed\n",
1671 __func__, __LINE__);
1672 return 0;
1673 }
1674
1675 pin_state = active ? ctrl_pdata->pin_res.gpio_state_active
1676 : ctrl_pdata->pin_res.gpio_state_suspend;
1677 if (!IS_ERR_OR_NULL(pin_state)) {
1678 rc = pinctrl_select_state(ctrl_pdata->pin_res.pinctrl,
1679 pin_state);
1680 if (rc)
1681 pr_err("%s: can not set %s pins\n", __func__,
1682 active ? MDSS_PINCTRL_STATE_DEFAULT
1683 : MDSS_PINCTRL_STATE_SLEEP);
1684 } else {
1685 pr_err("%s: invalid '%s' pinstate\n", __func__,
1686 active ? MDSS_PINCTRL_STATE_DEFAULT
1687 : MDSS_PINCTRL_STATE_SLEEP);
1688 }
1689 return rc;
1690}
1691
1692static int mdss_dsi_pinctrl_init(struct platform_device *pdev)
1693{
1694 struct mdss_dsi_ctrl_pdata *ctrl_pdata;
1695
1696 ctrl_pdata = platform_get_drvdata(pdev);
1697 ctrl_pdata->pin_res.pinctrl = devm_pinctrl_get(&pdev->dev);
1698 if (IS_ERR_OR_NULL(ctrl_pdata->pin_res.pinctrl)) {
1699 pr_err("%s: failed to get pinctrl\n", __func__);
1700 return PTR_ERR(ctrl_pdata->pin_res.pinctrl);
1701 }
1702
1703 ctrl_pdata->pin_res.gpio_state_active
1704 = pinctrl_lookup_state(ctrl_pdata->pin_res.pinctrl,
1705 MDSS_PINCTRL_STATE_DEFAULT);
1706 if (IS_ERR_OR_NULL(ctrl_pdata->pin_res.gpio_state_active))
1707 pr_warn("%s: can not get default pinstate\n", __func__);
1708
1709 ctrl_pdata->pin_res.gpio_state_suspend
1710 = pinctrl_lookup_state(ctrl_pdata->pin_res.pinctrl,
1711 MDSS_PINCTRL_STATE_SLEEP);
1712 if (IS_ERR_OR_NULL(ctrl_pdata->pin_res.gpio_state_suspend))
1713 pr_warn("%s: can not get sleep pinstate\n", __func__);
1714
1715 return 0;
1716}
1717
1718static int mdss_dsi_unblank(struct mdss_panel_data *pdata)
1719{
1720 int ret = 0;
1721 struct mipi_panel_info *mipi;
1722 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
1723 struct mdss_dsi_ctrl_pdata *sctrl = NULL;
1724
1725 if (pdata == NULL) {
1726 pr_err("%s: Invalid input data\n", __func__);
1727 return -EINVAL;
1728 }
1729
1730 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
1731 panel_data);
1732 mipi = &pdata->panel_info.mipi;
1733
1734 pr_debug("%s+: ctrl=%pK ndx=%d cur_power_state=%d ctrl_state=%x\n",
1735 __func__, ctrl_pdata, ctrl_pdata->ndx,
1736 pdata->panel_info.panel_power_state, ctrl_pdata->ctrl_state);
1737
1738 mdss_dsi_pm_qos_update_request(DSI_DISABLE_PC_LATENCY);
1739
1740 if (mdss_dsi_is_ctrl_clk_master(ctrl_pdata))
1741 sctrl = mdss_dsi_get_ctrl_clk_slave();
1742
1743 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
1744 MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON);
1745 if (sctrl)
1746 mdss_dsi_clk_ctrl(sctrl, sctrl->dsi_clk_handle,
1747 MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON);
1748
1749 if (ctrl_pdata->ctrl_state & CTRL_STATE_PANEL_LP) {
1750 pr_debug("%s: dsi_unblank with panel always on\n", __func__);
1751 if (ctrl_pdata->low_power_config)
1752 ret = ctrl_pdata->low_power_config(pdata, false);
1753 if (!ret)
1754 ctrl_pdata->ctrl_state &= ~CTRL_STATE_PANEL_LP;
1755 goto error;
1756 }
1757
1758 if (!(ctrl_pdata->ctrl_state & CTRL_STATE_PANEL_INIT)) {
1759 if (!pdata->panel_info.dynamic_switch_pending) {
1760 ATRACE_BEGIN("dsi_panel_on");
1761 ret = ctrl_pdata->on(pdata);
1762 if (ret) {
1763 pr_err("%s: unable to initialize the panel\n",
1764 __func__);
1765 goto error;
1766 }
1767 ATRACE_END("dsi_panel_on");
1768 }
1769 }
1770
1771 if ((pdata->panel_info.type == MIPI_CMD_PANEL) &&
1772 mipi->vsync_enable && mipi->hw_vsync_mode) {
1773 mdss_dsi_set_tear_on(ctrl_pdata);
1774 }
1775
1776 ctrl_pdata->ctrl_state |= CTRL_STATE_PANEL_INIT;
1777
1778error:
1779 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
1780 MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF);
1781 if (sctrl)
1782 mdss_dsi_clk_ctrl(sctrl, sctrl->dsi_clk_handle,
1783 MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF);
1784
1785 mdss_dsi_pm_qos_update_request(DSI_ENABLE_PC_LATENCY);
1786
1787 pr_debug("%s-:\n", __func__);
1788
1789 return ret;
1790}
1791
1792static int mdss_dsi_blank(struct mdss_panel_data *pdata, int power_state)
1793{
1794 int ret = 0;
1795 struct mipi_panel_info *mipi;
1796 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
1797
1798 if (pdata == NULL) {
1799 pr_err("%s: Invalid input data\n", __func__);
1800 return -EINVAL;
1801 }
1802
1803 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
1804 panel_data);
1805 mipi = &pdata->panel_info.mipi;
1806
1807 pr_debug("%s+: ctrl=%pK ndx=%d power_state=%d\n",
1808 __func__, ctrl_pdata, ctrl_pdata->ndx, power_state);
1809
1810 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
1811 MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON);
1812
1813 if (mdss_panel_is_power_on_lp(power_state)) {
1814 pr_debug("%s: low power state requested\n", __func__);
1815 if (ctrl_pdata->low_power_config)
1816 ret = ctrl_pdata->low_power_config(pdata, true);
1817 if (!ret)
1818 ctrl_pdata->ctrl_state |= CTRL_STATE_PANEL_LP;
1819 goto error;
1820 }
1821
1822 if (pdata->panel_info.type == MIPI_VIDEO_PANEL &&
1823 ctrl_pdata->off_cmds.link_state == DSI_LP_MODE) {
1824 mdss_dsi_sw_reset(ctrl_pdata, false);
1825 mdss_dsi_host_init(pdata);
1826 }
1827
1828 mdss_dsi_op_mode_config(DSI_CMD_MODE, pdata);
1829
1830 if (pdata->panel_info.dynamic_switch_pending) {
1831 pr_info("%s: switching to %s mode\n", __func__,
1832 (pdata->panel_info.mipi.mode ? "video" : "command"));
1833 if (pdata->panel_info.type == MIPI_CMD_PANEL) {
1834 ctrl_pdata->switch_mode(pdata, SWITCH_TO_VIDEO_MODE);
1835 } else if (pdata->panel_info.type == MIPI_VIDEO_PANEL) {
1836 ctrl_pdata->switch_mode(pdata, SWITCH_TO_CMD_MODE);
1837 mdss_dsi_set_tear_off(ctrl_pdata);
1838 }
1839 }
1840
1841 if ((pdata->panel_info.type == MIPI_CMD_PANEL) &&
1842 mipi->vsync_enable && mipi->hw_vsync_mode) {
1843 mdss_dsi_set_tear_off(ctrl_pdata);
1844 }
1845
1846 if (ctrl_pdata->ctrl_state & CTRL_STATE_PANEL_INIT) {
1847 if (!pdata->panel_info.dynamic_switch_pending) {
1848 ATRACE_BEGIN("dsi_panel_off");
1849 ret = ctrl_pdata->off(pdata);
1850 if (ret) {
Arun kumar162db222018-05-09 17:28:40 +05301851 pr_err("%s: Panel OFF failed\n",
1852 __func__);
Sachin Bhayareeeb88892018-01-02 16:36:01 +05301853 goto error;
1854 }
1855 ATRACE_END("dsi_panel_off");
1856 }
1857 ctrl_pdata->ctrl_state &= ~(CTRL_STATE_PANEL_INIT |
1858 CTRL_STATE_PANEL_LP);
1859 }
1860
1861error:
1862 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
1863 MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF);
1864 pr_debug("%s-:End\n", __func__);
1865 return ret;
1866}
1867
1868static int mdss_dsi_post_panel_on(struct mdss_panel_data *pdata)
1869{
1870 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
1871
1872 if (pdata == NULL) {
1873 pr_err("%s: Invalid input data\n", __func__);
1874 return -EINVAL;
1875 }
1876
1877 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
1878 panel_data);
1879
1880 pr_debug("%s+: ctrl=%pK ndx=%d\n", __func__,
1881 ctrl_pdata, ctrl_pdata->ndx);
1882
1883 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
1884 MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON);
1885
1886 if (ctrl_pdata->post_panel_on)
1887 ctrl_pdata->post_panel_on(pdata);
1888
1889 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
1890 MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF);
1891 pr_debug("%s-:\n", __func__);
1892
1893 return 0;
1894}
1895
1896static irqreturn_t test_hw_vsync_handler(int irq, void *data)
1897{
1898 struct mdss_panel_data *pdata = (struct mdss_panel_data *)data;
1899
1900 pr_debug("HW VSYNC\n");
1901 MDSS_XLOG(0xaaa, irq);
1902 complete_all(&pdata->te_done);
1903 if (pdata->next)
1904 complete_all(&pdata->next->te_done);
1905 return IRQ_HANDLED;
1906}
1907
1908int mdss_dsi_cont_splash_on(struct mdss_panel_data *pdata)
1909{
1910 int ret = 0;
1911 struct mipi_panel_info *mipi;
1912 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
1913
1914 pr_info("%s:%d DSI on for continuous splash.\n", __func__, __LINE__);
1915
1916 if (pdata == NULL) {
1917 pr_err("%s: Invalid input data\n", __func__);
1918 return -EINVAL;
1919 }
1920
1921 mipi = &pdata->panel_info.mipi;
1922
1923 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
1924 panel_data);
1925
1926 pr_debug("%s+: ctrl=%pK ndx=%d\n", __func__,
1927 ctrl_pdata, ctrl_pdata->ndx);
1928
1929 WARN((ctrl_pdata->ctrl_state & CTRL_STATE_PANEL_INIT),
1930 "Incorrect Ctrl state=0x%x\n", ctrl_pdata->ctrl_state);
1931
1932 mdss_dsi_ctrl_setup(ctrl_pdata);
1933 mdss_dsi_sw_reset(ctrl_pdata, true);
1934 pr_debug("%s-:End\n", __func__);
1935 return ret;
1936}
1937
1938static void __mdss_dsi_mask_dfps_errors(struct mdss_dsi_ctrl_pdata *ctrl,
1939 bool mask)
1940{
1941 u32 data = 0;
1942
1943 /*
1944 * Assumption is that the DSI clocks will be enabled
1945 * when this API is called from dfps thread
1946 */
1947 if (mask) {
1948 /* mask FIFO underflow and PLL unlock bits */
1949 mdss_dsi_set_reg(ctrl, 0x10c, 0x7c000000, 0x7c000000);
1950 } else {
1951 data = MIPI_INP((ctrl->ctrl_base) + 0x0120);
1952 if (data & BIT(16)) {
1953 pr_debug("pll unlocked: 0x%x\n", data);
1954 /* clear PLL unlock bit */
1955 MIPI_OUTP((ctrl->ctrl_base) + 0x120, BIT(16));
1956 }
1957
1958 data = MIPI_INP((ctrl->ctrl_base) + 0x00c);
1959 if (data & 0x88880000) {
1960 pr_debug("dsi fifo underflow: 0x%x\n", data);
1961 /* clear DSI FIFO underflow and empty */
1962 MIPI_OUTP((ctrl->ctrl_base) + 0x00c, 0x99990000);
1963 }
1964
1965 /* restore FIFO underflow and PLL unlock bits */
1966 mdss_dsi_set_reg(ctrl, 0x10c, 0x7c000000, 0x0);
1967 }
1968}
1969
1970static void __mdss_dsi_update_video_mode_total(struct mdss_panel_data *pdata,
1971 int new_fps)
1972{
1973 u32 hsync_period, vsync_period;
1974 u32 new_dsi_v_total, current_dsi_v_total;
1975 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
1976
1977 if (pdata == NULL) {
1978 pr_err("%s Invalid pdata\n", __func__);
1979 return;
1980 }
1981
1982 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
1983 panel_data);
1984 if (ctrl_pdata == NULL) {
1985 pr_err("%s Invalid ctrl_pdata\n", __func__);
1986 return;
1987 }
1988
Benjamin Chanabc9f3c2016-06-06 16:50:55 -04001989 if (ctrl_pdata->timing_db_mode)
1990 MIPI_OUTP((ctrl_pdata->ctrl_base) + 0x1e8, 0x1);
1991
Sachin Bhayareeeb88892018-01-02 16:36:01 +05301992 vsync_period =
1993 mdss_panel_get_vtotal(&pdata->panel_info);
1994 hsync_period =
1995 mdss_panel_get_htotal(&pdata->panel_info, true);
1996 current_dsi_v_total =
1997 MIPI_INP((ctrl_pdata->ctrl_base) + 0x2C);
1998 new_dsi_v_total =
1999 ((vsync_period - 1) << 16) | (hsync_period - 1);
2000
Benjamin Chanabc9f3c2016-06-06 16:50:55 -04002001 MIPI_OUTP((ctrl_pdata->ctrl_base) + 0x2C, new_dsi_v_total);
Sachin Bhayareeeb88892018-01-02 16:36:01 +05302002
2003 if (ctrl_pdata->timing_db_mode)
2004 MIPI_OUTP((ctrl_pdata->ctrl_base) + 0x1e4, 0x1);
2005
Benjamin Chanabc9f3c2016-06-06 16:50:55 -04002006 pr_debug("%s new_fps:%d new_vtotal:0x%X cur_vtotal:0x%X frame_rate:%d\n",
2007 __func__, new_fps, new_dsi_v_total, current_dsi_v_total,
Sachin Bhayareeeb88892018-01-02 16:36:01 +05302008 ctrl_pdata->panel_data.panel_info.mipi.frame_rate);
2009
2010 ctrl_pdata->panel_data.panel_info.current_fps = new_fps;
2011 MDSS_XLOG(current_dsi_v_total, new_dsi_v_total, new_fps,
2012 ctrl_pdata->timing_db_mode);
2013
2014}
2015
2016static void __mdss_dsi_dyn_refresh_config(
2017 struct mdss_dsi_ctrl_pdata *ctrl_pdata)
2018{
2019 int reg_data = 0;
2020 u32 phy_rev = ctrl_pdata->shared_data->phy_rev;
2021
2022 /* configure only for master control in split display */
2023 if (mdss_dsi_is_hw_config_split(ctrl_pdata->shared_data) &&
2024 mdss_dsi_is_ctrl_clk_slave(ctrl_pdata))
2025 return;
2026
2027 switch (phy_rev) {
2028 case DSI_PHY_REV_10:
2029 reg_data = MIPI_INP((ctrl_pdata->ctrl_base) +
2030 DSI_DYNAMIC_REFRESH_CTRL);
2031 reg_data &= ~BIT(12);
2032 MIPI_OUTP((ctrl_pdata->ctrl_base)
2033 + DSI_DYNAMIC_REFRESH_CTRL, reg_data);
2034 break;
2035 case DSI_PHY_REV_20:
2036 reg_data = BIT(13);
2037 MIPI_OUTP((ctrl_pdata->ctrl_base)
2038 + DSI_DYNAMIC_REFRESH_CTRL, reg_data);
2039 break;
2040 default:
2041 pr_err("Phy rev %d unsupported\n", phy_rev);
2042 break;
2043 }
2044
2045 pr_debug("Dynamic fps ctrl = 0x%x\n", reg_data);
2046}
2047
2048static void __mdss_dsi_calc_dfps_delay(struct mdss_panel_data *pdata)
2049{
2050 u32 esc_clk_rate = XO_CLK_RATE;
2051 u32 pipe_delay, pipe_delay2 = 0, pll_delay;
2052 u32 hsync_period = 0;
2053 u32 pclk_to_esc_ratio, byte_to_esc_ratio, hr_bit_to_esc_ratio;
2054 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
2055 struct mdss_panel_info *pinfo = NULL;
2056 struct mdss_dsi_phy_ctrl *pd = NULL;
2057
2058 if (pdata == NULL) {
2059 pr_err("%s Invalid pdata\n", __func__);
2060 return;
2061 }
2062
2063 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
2064 panel_data);
2065 if (ctrl_pdata == NULL) {
2066 pr_err("%s Invalid ctrl_pdata\n", __func__);
2067 return;
2068 }
2069
2070 if (mdss_dsi_is_hw_config_split(ctrl_pdata->shared_data) &&
2071 mdss_dsi_is_ctrl_clk_slave(ctrl_pdata))
2072 return;
2073
2074 pinfo = &pdata->panel_info;
2075 pd = &(pinfo->mipi.dsi_phy_db);
2076
2077 pclk_to_esc_ratio = (ctrl_pdata->pclk_rate / esc_clk_rate);
2078 byte_to_esc_ratio = (ctrl_pdata->byte_clk_rate / esc_clk_rate);
2079 hr_bit_to_esc_ratio = ((ctrl_pdata->byte_clk_rate * 4) / esc_clk_rate);
2080
2081 hsync_period = mdss_panel_get_htotal(pinfo, true);
2082 pipe_delay = (hsync_period + 1) / pclk_to_esc_ratio;
2083 if (pinfo->mipi.eof_bllp_power_stop == 0)
2084 pipe_delay += (17 / pclk_to_esc_ratio) +
2085 ((21 + (pinfo->mipi.t_clk_pre + 1) +
2086 (pinfo->mipi.t_clk_post + 1)) /
2087 byte_to_esc_ratio) +
2088 ((((pd->timing[8] >> 1) + 1) +
2089 ((pd->timing[6] >> 1) + 1) +
2090 ((pd->timing[3] * 4) + (pd->timing[5] >> 1) + 1) +
2091 ((pd->timing[7] >> 1) + 1) +
2092 ((pd->timing[1] >> 1) + 1) +
2093 ((pd->timing[4] >> 1) + 1)) / hr_bit_to_esc_ratio);
2094
2095 if (pinfo->mipi.force_clk_lane_hs)
2096 pipe_delay2 = (6 / byte_to_esc_ratio) +
2097 ((((pd->timing[1] >> 1) + 1) +
2098 ((pd->timing[4] >> 1) + 1)) / hr_bit_to_esc_ratio);
2099
2100 /* 130 us pll delay recommended by h/w doc */
2101 pll_delay = ((130 * esc_clk_rate) / 1000000) * 2;
2102
2103 MIPI_OUTP((ctrl_pdata->ctrl_base) + DSI_DYNAMIC_REFRESH_PIPE_DELAY,
2104 pipe_delay);
2105 MIPI_OUTP((ctrl_pdata->ctrl_base) + DSI_DYNAMIC_REFRESH_PIPE_DELAY2,
2106 pipe_delay2);
2107 MIPI_OUTP((ctrl_pdata->ctrl_base) + DSI_DYNAMIC_REFRESH_PLL_DELAY,
2108 pll_delay);
2109}
2110
2111static int __mdss_dsi_dfps_calc_clks(struct mdss_panel_data *pdata,
2112 int new_fps)
2113{
2114 int rc = 0;
2115 u64 clk_rate;
2116 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
2117 struct mdss_panel_info *pinfo;
2118 u32 phy_rev;
2119
2120 if (pdata == NULL) {
2121 pr_err("%s Invalid pdata\n", __func__);
2122 return -EINVAL;
2123 }
2124
2125 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
2126 panel_data);
2127 if (ctrl_pdata == NULL) {
2128 pr_err("%s Invalid ctrl_pdata\n", __func__);
2129 return -EINVAL;
2130 }
2131
2132 pinfo = &pdata->panel_info;
2133 phy_rev = ctrl_pdata->shared_data->phy_rev;
2134
2135 rc = mdss_dsi_clk_div_config
2136 (&ctrl_pdata->panel_data.panel_info, new_fps);
2137 if (rc) {
2138 pr_err("%s: unable to initialize the clk dividers\n",
2139 __func__);
2140 return rc;
2141 }
2142
2143 __mdss_dsi_dyn_refresh_config(ctrl_pdata);
2144
2145 if (phy_rev == DSI_PHY_REV_20)
2146 mdss_dsi_dfps_config_8996(ctrl_pdata);
2147
2148 __mdss_dsi_calc_dfps_delay(pdata);
2149
2150 /* take a backup of current clk rates */
2151 ctrl_pdata->pclk_rate_bkp = ctrl_pdata->pclk_rate;
2152 ctrl_pdata->byte_clk_rate_bkp = ctrl_pdata->byte_clk_rate;
2153
2154 ctrl_pdata->pclk_rate = pinfo->mipi.dsi_pclk_rate;
2155 clk_rate = pinfo->clk_rate;
2156 do_div(clk_rate, 8U);
2157 ctrl_pdata->byte_clk_rate = (u32) clk_rate;
2158
2159 pr_debug("byte_rate=%i\n", ctrl_pdata->byte_clk_rate);
2160 pr_debug("pclk_rate=%i\n", ctrl_pdata->pclk_rate);
2161
2162 return rc;
2163}
2164
2165static int __mdss_dsi_dfps_update_clks(struct mdss_panel_data *pdata,
2166 int new_fps)
2167{
2168 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
2169 struct mdss_dsi_ctrl_pdata *sctrl_pdata = NULL;
Sachin Bhayare3d3767e2018-01-02 21:10:57 +05302170 struct mdss_panel_info *pinfo, *spinfo = NULL;
Sachin Bhayareeeb88892018-01-02 16:36:01 +05302171 int rc = 0;
2172
2173 if (pdata == NULL) {
2174 pr_err("%s Invalid pdata\n", __func__);
2175 return -EINVAL;
2176 }
2177
2178 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
2179 panel_data);
2180 if (IS_ERR_OR_NULL(ctrl_pdata)) {
2181 pr_err("Invalid sctrl_pdata = %lu\n", PTR_ERR(ctrl_pdata));
2182 return PTR_ERR(ctrl_pdata);
2183 }
2184
2185 pinfo = &ctrl_pdata->panel_data.panel_info;
2186
2187 /*
2188 * In split display case, configure and enable dynamic refresh
2189 * register only after both the ctrl data is programmed. So,
2190 * ignore enabling dynamic refresh for the master control and
2191 * configure only when it is slave control.
2192 */
2193 if (mdss_dsi_is_hw_config_split(ctrl_pdata->shared_data) &&
2194 mdss_dsi_is_ctrl_clk_master(ctrl_pdata))
2195 return 0;
2196
2197 if (mdss_dsi_is_hw_config_split(ctrl_pdata->shared_data) &&
2198 mdss_dsi_is_ctrl_clk_slave(ctrl_pdata)) {
2199 sctrl_pdata = ctrl_pdata;
2200 spinfo = pinfo;
2201 ctrl_pdata = mdss_dsi_get_ctrl_clk_master();
2202 if (IS_ERR_OR_NULL(ctrl_pdata)) {
2203 pr_err("Invalid ctrl_pdata = %lu\n",
2204 PTR_ERR(ctrl_pdata));
2205 return PTR_ERR(ctrl_pdata);
2206 }
2207
2208 pinfo = &ctrl_pdata->panel_data.panel_info;
2209 }
2210
2211 /*
2212 * For programming dynamic refresh registers, we need to change
2213 * the parent to shadow clocks for the software byte and pixel mux.
2214 * After switching to shadow clocks, if there is no ref count on
2215 * main byte and pixel clocks, clock driver may shutdown those
2216 * unreferenced byte and pixel clocks. Hence add an extra reference
2217 * count to avoid shutting down the main byte and pixel clocks.
2218 */
2219 rc = clk_prepare_enable(ctrl_pdata->pll_byte_clk);
2220 if (rc) {
2221 pr_err("Unable to add extra refcnt for byte clock\n");
2222 goto error_byte;
2223 }
2224
2225 rc = clk_prepare_enable(ctrl_pdata->pll_pixel_clk);
2226 if (rc) {
2227 pr_err("Unable to add extra refcnt for pixel clock\n");
2228 goto error_pixel;
2229 }
2230
2231 /* change the parent to shadow clocks*/
2232 rc = clk_set_parent(ctrl_pdata->mux_byte_clk,
2233 ctrl_pdata->shadow_byte_clk);
2234 if (rc) {
2235 pr_err("Unable to set parent to shadow byte clock\n");
2236 goto error_shadow_byte;
2237 }
2238
2239 rc = clk_set_parent(ctrl_pdata->mux_pixel_clk,
2240 ctrl_pdata->shadow_pixel_clk);
2241 if (rc) {
2242 pr_err("Unable to set parent to shadow pixel clock\n");
2243 goto error_shadow_pixel;
2244 }
2245
2246 rc = mdss_dsi_clk_set_link_rate(ctrl_pdata->dsi_clk_handle,
2247 MDSS_DSI_LINK_BYTE_CLK, ctrl_pdata->byte_clk_rate, 0);
2248 if (rc) {
2249 pr_err("%s: dsi_byte_clk - clk_set_rate failed\n",
2250 __func__);
2251 goto error_byte_link;
2252 }
2253
2254 rc = mdss_dsi_clk_set_link_rate(ctrl_pdata->dsi_clk_handle,
2255 MDSS_DSI_LINK_PIX_CLK, ctrl_pdata->pclk_rate, 0);
2256 if (rc) {
2257 pr_err("%s: dsi_pixel_clk - clk_set_rate failed\n",
2258 __func__);
2259 goto error_pixel_link;
2260 }
2261
2262 if (sctrl_pdata) {
2263 rc = mdss_dsi_clk_set_link_rate(sctrl_pdata->dsi_clk_handle,
2264 MDSS_DSI_LINK_BYTE_CLK, sctrl_pdata->byte_clk_rate, 0);
2265 if (rc) {
2266 pr_err("%s: slv dsi_byte_clk - clk_set_rate failed\n",
2267 __func__);
2268 goto error_sbyte_link;
2269 }
2270
2271 rc = mdss_dsi_clk_set_link_rate(sctrl_pdata->dsi_clk_handle,
2272 MDSS_DSI_LINK_PIX_CLK, sctrl_pdata->pclk_rate, 0);
2273 if (rc) {
2274 pr_err("%s: slv dsi_pixel_clk - clk_set_rate failed\n",
2275 __func__);
2276 goto error_spixel_link;
2277 }
2278 }
2279
2280 rc = mdss_dsi_en_wait4dynamic_done(ctrl_pdata);
2281 if (rc < 0) {
2282 pr_err("Unsuccessful dynamic fps change");
2283 goto dfps_timeout;
2284 }
2285
2286 MIPI_OUTP((ctrl_pdata->ctrl_base) + DSI_DYNAMIC_REFRESH_CTRL, 0x00);
2287 if (sctrl_pdata)
2288 MIPI_OUTP((sctrl_pdata->ctrl_base) + DSI_DYNAMIC_REFRESH_CTRL,
2289 0x00);
2290
2291 rc = mdss_dsi_phy_pll_reset_status(ctrl_pdata);
2292 if (rc) {
2293 pr_err("%s: pll cannot be locked reset core ready failed %d\n",
2294 __func__, rc);
2295 goto dfps_timeout;
2296 }
2297
2298 __mdss_dsi_mask_dfps_errors(ctrl_pdata, false);
2299 if (sctrl_pdata)
2300 __mdss_dsi_mask_dfps_errors(sctrl_pdata, false);
2301
2302 /* Move the mux clocks to main byte and pixel clocks */
2303 rc = clk_set_parent(ctrl_pdata->mux_byte_clk,
2304 ctrl_pdata->pll_byte_clk);
2305 if (rc)
2306 pr_err("Unable to set parent back to main byte clock\n");
2307
2308 rc = clk_set_parent(ctrl_pdata->mux_pixel_clk,
2309 ctrl_pdata->pll_pixel_clk);
2310 if (rc)
2311 pr_err("Unable to set parent back to main pixel clock\n");
2312
2313 /* Remove extra ref count on parent clocks */
2314 clk_disable_unprepare(ctrl_pdata->pll_byte_clk);
2315 clk_disable_unprepare(ctrl_pdata->pll_pixel_clk);
2316
2317 /* update new fps that at this point is already updated in hw */
2318 pinfo->current_fps = new_fps;
2319 if (sctrl_pdata)
2320 spinfo->current_fps = new_fps;
2321
2322 return rc;
2323
2324dfps_timeout:
2325 if (sctrl_pdata)
2326 mdss_dsi_clk_set_link_rate(sctrl_pdata->dsi_clk_handle,
2327 MDSS_DSI_LINK_PIX_CLK,
2328 sctrl_pdata->pclk_rate_bkp, 0);
2329error_spixel_link:
2330 if (sctrl_pdata)
2331 mdss_dsi_clk_set_link_rate(sctrl_pdata->dsi_clk_handle,
2332 MDSS_DSI_LINK_BYTE_CLK,
2333 sctrl_pdata->byte_clk_rate_bkp, 0);
2334error_sbyte_link:
2335 mdss_dsi_clk_set_link_rate(ctrl_pdata->dsi_clk_handle,
2336 MDSS_DSI_LINK_PIX_CLK, ctrl_pdata->pclk_rate_bkp, 0);
2337error_pixel_link:
2338 mdss_dsi_clk_set_link_rate(ctrl_pdata->dsi_clk_handle,
2339 MDSS_DSI_LINK_BYTE_CLK, ctrl_pdata->byte_clk_rate_bkp, 0);
2340error_byte_link:
2341 clk_set_parent(ctrl_pdata->mux_pixel_clk, ctrl_pdata->pll_pixel_clk);
2342error_shadow_pixel:
2343 clk_set_parent(ctrl_pdata->mux_byte_clk, ctrl_pdata->pll_byte_clk);
2344error_shadow_byte:
2345 clk_disable_unprepare(ctrl_pdata->pll_pixel_clk);
2346error_pixel:
2347 clk_disable_unprepare(ctrl_pdata->pll_byte_clk);
2348error_byte:
2349 return rc;
2350}
2351
2352static int mdss_dsi_check_params(struct mdss_dsi_ctrl_pdata *ctrl, void *arg)
2353{
2354 struct mdss_panel_info *var_pinfo, *pinfo;
2355 int rc = 0;
2356
2357 if (!ctrl || !arg)
2358 return 0;
2359
2360 pinfo = &ctrl->panel_data.panel_info;
2361 if (!pinfo->is_pluggable)
2362 return 0;
2363
2364 var_pinfo = (struct mdss_panel_info *)arg;
2365
2366 pr_debug("%s: reconfig xres: %d yres: %d, current xres: %d yres: %d\n",
2367 __func__, var_pinfo->xres, var_pinfo->yres,
2368 pinfo->xres, pinfo->yres);
2369 if ((var_pinfo->xres != pinfo->xres) ||
2370 (var_pinfo->yres != pinfo->yres) ||
2371 (var_pinfo->lcdc.h_back_porch != pinfo->lcdc.h_back_porch) ||
2372 (var_pinfo->lcdc.h_front_porch != pinfo->lcdc.h_front_porch) ||
2373 (var_pinfo->lcdc.h_pulse_width != pinfo->lcdc.h_pulse_width) ||
2374 (var_pinfo->lcdc.v_back_porch != pinfo->lcdc.v_back_porch) ||
2375 (var_pinfo->lcdc.v_front_porch != pinfo->lcdc.v_front_porch) ||
2376 (var_pinfo->lcdc.v_pulse_width != pinfo->lcdc.v_pulse_width)
2377 )
2378 rc = 1;
2379
2380 return rc;
2381}
2382
2383#ifdef TARGET_HW_MDSS_HDMI
2384static void mdss_dsi_update_params(struct mdss_dsi_ctrl_pdata *ctrl, void *arg)
2385{
2386 struct mdss_panel_info *pinfo;
2387
2388 if (!ctrl || !arg)
2389 return;
2390
2391 pinfo = &ctrl->panel_data.panel_info;
2392 mdss_dba_update_lane_cfg(pinfo);
2393}
2394#else
2395static void mdss_dsi_update_params(struct mdss_dsi_ctrl_pdata *ctrl, void *arg)
2396{
2397}
2398#endif
2399
2400static int mdss_dsi_dfps_config(struct mdss_panel_data *pdata, int new_fps)
2401{
2402 int rc = 0;
2403 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
2404 struct mdss_panel_info *pinfo;
2405 u32 phy_rev;
2406 u32 frame_rate_bkp;
2407
2408 pr_debug("%s+:\n", __func__);
2409
2410 if (pdata == NULL) {
2411 pr_err("%s: Invalid input data\n", __func__);
2412 return -EINVAL;
2413 }
2414
2415 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
2416 panel_data);
2417
2418 if (!ctrl_pdata->panel_data.panel_info.dynamic_fps) {
2419 pr_err("Dynamic fps not enabled for this panel\n");
2420 return -EINVAL;
2421 }
2422
2423 phy_rev = ctrl_pdata->shared_data->phy_rev;
2424 pinfo = &pdata->panel_info;
2425
2426 /* get the fps configured in HW */
2427 frame_rate_bkp = pinfo->current_fps;
2428
2429 if (new_fps == pinfo->current_fps) {
2430 /*
2431 * This is unlikely as mdss driver checks for previously
2432 * configured frame rate.
2433 */
2434 pr_debug("Panel is already at this FPS\n");
2435 goto end_update;
2436 }
2437
2438 if (pinfo->dfps_update == DFPS_IMMEDIATE_PORCH_UPDATE_MODE_HFP ||
2439 pinfo->dfps_update == DFPS_IMMEDIATE_PORCH_UPDATE_MODE_VFP) {
2440 /* Porch method */
2441 __mdss_dsi_update_video_mode_total(pdata, new_fps);
2442 } else if (pinfo->dfps_update == DFPS_IMMEDIATE_CLK_UPDATE_MODE) {
2443 /* Clock update method */
2444
2445 __mdss_dsi_mask_dfps_errors(ctrl_pdata, true);
2446
2447 if (phy_rev == DSI_PHY_REV_20) {
2448 rc = mdss_dsi_phy_calc_timing_param(pinfo, phy_rev,
2449 new_fps);
2450 if (rc) {
2451 pr_err("PHY calculations failed-%d\n", new_fps);
2452 goto end_update;
2453 }
2454 }
2455
2456 rc = __mdss_dsi_dfps_calc_clks(pdata, new_fps);
2457 if (rc) {
2458 pr_err("error calculating clocks for %d\n", new_fps);
2459 goto error_clks;
2460 }
2461
2462 rc = __mdss_dsi_dfps_update_clks(pdata, new_fps);
2463 if (rc) {
2464 pr_err("Dynamic refresh failed-%d\n", new_fps);
2465 goto error_dfps;
2466 }
2467 }
2468
2469 return rc;
2470error_dfps:
2471 if (__mdss_dsi_dfps_calc_clks(pdata, frame_rate_bkp))
2472 pr_err("error reverting clock calculations for %d\n",
2473 frame_rate_bkp);
2474error_clks:
2475 if (mdss_dsi_phy_calc_timing_param(pinfo, phy_rev, frame_rate_bkp))
2476 pr_err("Unable to revert phy timing-%d\n", frame_rate_bkp);
2477end_update:
2478 return rc;
2479}
2480
2481static int mdss_dsi_ctl_partial_roi(struct mdss_panel_data *pdata)
2482{
2483 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
2484 int rc = -EINVAL;
2485
2486 if (pdata == NULL) {
2487 pr_err("%s: Invalid input data\n", __func__);
2488 return -EINVAL;
2489 }
2490
2491 if (!pdata->panel_info.partial_update_enabled)
2492 return 0;
2493
2494 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
2495 panel_data);
2496
2497 if (ctrl_pdata->set_col_page_addr)
2498 rc = ctrl_pdata->set_col_page_addr(pdata, false);
2499
2500 return rc;
2501}
2502
2503static int mdss_dsi_set_stream_size(struct mdss_panel_data *pdata)
2504{
2505 u32 stream_ctrl, stream_total, idle;
2506 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
2507 struct mdss_panel_info *pinfo;
2508 struct dsc_desc *dsc = NULL;
2509 struct mdss_rect *roi;
2510 struct panel_horizontal_idle *pidle;
2511 int i;
2512
2513 if (pdata == NULL) {
2514 pr_err("%s: Invalid input data\n", __func__);
2515 return -EINVAL;
2516 }
2517
2518 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
2519 panel_data);
2520
2521 pinfo = &pdata->panel_info;
2522
2523 if (!pinfo->partial_update_supported)
2524 return -EINVAL;
2525
2526 if (pinfo->compression_mode == COMPRESSION_DSC)
2527 dsc = &pinfo->dsc;
2528
2529 roi = &pinfo->roi;
2530
2531 /* DSI_COMMAND_MODE_MDP_STREAM_CTRL */
2532 if (dsc) {
2533 u16 byte_num = dsc->bytes_per_pkt;
2534
2535 if (pinfo->mipi.insert_dcs_cmd)
2536 byte_num++;
2537
2538 stream_ctrl = (byte_num << 16) | (pinfo->mipi.vc << 8) |
2539 DTYPE_DCS_LWRITE;
2540 stream_total = dsc->pic_height << 16 | dsc->pclk_per_line;
2541 } else {
2542
2543 stream_ctrl = (((roi->w * 3) + 1) << 16) |
2544 (pdata->panel_info.mipi.vc << 8) | DTYPE_DCS_LWRITE;
2545 stream_total = roi->h << 16 | roi->w;
2546 }
2547 MIPI_OUTP((ctrl_pdata->ctrl_base) + 0x60, stream_ctrl);
2548 MIPI_OUTP((ctrl_pdata->ctrl_base) + 0x58, stream_ctrl);
2549
2550 /* DSI_COMMAND_MODE_MDP_STREAM_TOTAL */
2551 MIPI_OUTP((ctrl_pdata->ctrl_base) + 0x64, stream_total);
2552 MIPI_OUTP((ctrl_pdata->ctrl_base) + 0x5C, stream_total);
2553
2554 /* set idle control -- dsi clk cycle */
2555 idle = 0;
2556 pidle = ctrl_pdata->line_idle;
2557 for (i = 0; i < ctrl_pdata->horizontal_idle_cnt; i++) {
2558 if (roi->w > pidle->min && roi->w <= pidle->max) {
2559 idle = pidle->idle;
2560 pr_debug("%s: ndx=%d w=%d range=%d-%d idle=%d\n",
2561 __func__, ctrl_pdata->ndx, roi->w,
2562 pidle->min, pidle->max, pidle->idle);
2563 break;
2564 }
2565 pidle++;
2566 }
2567
2568 if (idle)
2569 idle |= BIT(12); /* enable */
2570
2571 MIPI_OUTP((ctrl_pdata->ctrl_base) + 0x194, idle);
2572
2573 if (dsc)
2574 mdss_dsi_dsc_config(ctrl_pdata, dsc);
2575
2576 return 0;
2577}
2578
2579#ifdef TARGET_HW_MDSS_HDMI
2580static void mdss_dsi_dba_work(struct work_struct *work)
2581{
2582 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
2583 struct delayed_work *dw = to_delayed_work(work);
2584 struct mdss_dba_utils_init_data utils_init_data;
2585 struct mdss_panel_info *pinfo;
2586
2587 ctrl_pdata = container_of(dw, struct mdss_dsi_ctrl_pdata, dba_work);
2588 if (!ctrl_pdata) {
2589 pr_err("%s: invalid ctrl data\n", __func__);
2590 return;
2591 }
2592
2593 pinfo = &ctrl_pdata->panel_data.panel_info;
2594 if (!pinfo) {
2595 pr_err("%s: invalid ctrl data\n", __func__);
2596 return;
2597 }
2598
2599 memset(&utils_init_data, 0, sizeof(utils_init_data));
2600
2601 utils_init_data.chip_name = ctrl_pdata->bridge_name;
2602 utils_init_data.client_name = "dsi";
2603 utils_init_data.instance_id = ctrl_pdata->bridge_index;
2604 utils_init_data.fb_node = ctrl_pdata->fb_node;
2605 utils_init_data.kobj = ctrl_pdata->kobj;
2606 utils_init_data.pinfo = pinfo;
2607 if (ctrl_pdata->mdss_util)
2608 utils_init_data.cont_splash_enabled =
2609 ctrl_pdata->mdss_util->panel_intf_status(
2610 ctrl_pdata->panel_data.panel_info.pdest,
2611 MDSS_PANEL_INTF_DSI) ? true : false;
2612 else
2613 utils_init_data.cont_splash_enabled = false;
2614
2615 pinfo->dba_data = mdss_dba_utils_init(&utils_init_data);
2616
2617 if (!IS_ERR_OR_NULL(pinfo->dba_data)) {
2618 ctrl_pdata->ds_registered = true;
2619 } else {
2620 pr_debug("%s: dba device not ready, queue again\n", __func__);
2621 queue_delayed_work(ctrl_pdata->workq,
2622 &ctrl_pdata->dba_work, HZ);
2623 }
2624}
2625#else
2626static void mdss_dsi_dba_work(struct work_struct *work)
2627{
2628 (void)(*work);
2629}
2630#endif
2631static int mdss_dsi_reset_write_ptr(struct mdss_panel_data *pdata)
2632{
2633
2634 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
2635 struct mdss_panel_info *pinfo;
2636 int rc = 0;
2637
2638 if (pdata == NULL) {
2639 pr_err("%s: Invalid input data\n", __func__);
2640 return -EINVAL;
2641 }
2642
2643 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
2644 panel_data);
2645
2646 pinfo = &ctrl_pdata->panel_data.panel_info;
2647 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
2648 MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON);
2649 /* Need to reset the DSI core since the pixel stream was stopped. */
2650 mdss_dsi_sw_reset(ctrl_pdata, true);
2651
2652 /*
2653 * Reset the partial update co-ordinates to the panel height and
2654 * width
2655 */
2656 if (pinfo->dcs_cmd_by_left && (ctrl_pdata->ndx == 1))
2657 goto skip_cmd_send;
2658
2659 pinfo->roi.x = 0;
2660 pinfo->roi.y = 0;
2661 pinfo->roi.w = pinfo->xres;
2662 if (pinfo->dcs_cmd_by_left)
2663 pinfo->roi.w = pinfo->xres;
2664 if (pdata->next)
2665 pinfo->roi.w += pdata->next->panel_info.xres;
2666 pinfo->roi.h = pinfo->yres;
2667
2668 mdss_dsi_set_stream_size(pdata);
2669
2670 if (ctrl_pdata->set_col_page_addr)
2671 rc = ctrl_pdata->set_col_page_addr(pdata, true);
2672
2673skip_cmd_send:
2674 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
2675 MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF);
2676
2677 pr_debug("%s: DSI%d write ptr reset finished\n", __func__,
2678 ctrl_pdata->ndx);
2679
2680 return rc;
2681}
2682
2683int mdss_dsi_register_recovery_handler(struct mdss_dsi_ctrl_pdata *ctrl,
2684 struct mdss_intf_recovery *recovery)
2685{
2686 mutex_lock(&ctrl->mutex);
2687 ctrl->recovery = recovery;
2688 mutex_unlock(&ctrl->mutex);
2689 return 0;
2690}
2691
2692static int mdss_dsi_register_mdp_callback(struct mdss_dsi_ctrl_pdata *ctrl,
2693 struct mdss_intf_recovery *mdp_callback)
2694{
2695 mutex_lock(&ctrl->mutex);
2696 ctrl->mdp_callback = mdp_callback;
2697 mutex_unlock(&ctrl->mutex);
2698 return 0;
2699}
2700
2701static struct device_node *mdss_dsi_get_fb_node_cb(struct platform_device *pdev)
2702{
2703 struct device_node *fb_node;
2704 struct platform_device *dsi_dev;
2705 struct mdss_dsi_ctrl_pdata *ctrl_pdata;
2706
2707 if (pdev == NULL) {
2708 pr_err("%s: Invalid input data\n", __func__);
2709 return NULL;
2710 }
2711
2712 ctrl_pdata = platform_get_drvdata(pdev);
2713 dsi_dev = of_find_device_by_node(pdev->dev.of_node->parent);
2714 if (!dsi_dev) {
2715 pr_err("Unable to find dsi master device: %s\n",
2716 pdev->dev.of_node->full_name);
2717 return NULL;
2718 }
2719
2720 fb_node = of_parse_phandle(dsi_dev->dev.of_node,
2721 mdss_dsi_get_fb_name(ctrl_pdata), 0);
2722 if (!fb_node) {
2723 pr_err("Unable to find fb node for device: %s\n", pdev->name);
2724 return NULL;
2725 }
2726
2727 return fb_node;
2728}
2729
2730static int mdss_dsi_event_handler(struct mdss_panel_data *pdata,
2731 int event, void *arg)
2732{
2733 int rc = 0;
2734 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
2735 struct fb_info *fbi;
2736 int power_state;
2737 u32 mode;
2738 struct mdss_panel_info *pinfo;
2739
2740 if (pdata == NULL) {
2741 pr_err("%s: Invalid input data\n", __func__);
2742 return -EINVAL;
2743 }
2744 pinfo = &pdata->panel_info;
2745 ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata,
2746 panel_data);
2747 pr_debug("%s+: ctrl=%d event=%d\n", __func__, ctrl_pdata->ndx, event);
2748
2749 MDSS_XLOG(event, arg, ctrl_pdata->ndx, 0x3333);
2750
2751 switch (event) {
2752 case MDSS_EVENT_UPDATE_PARAMS:
2753 pr_debug("%s:Entered Case MDSS_EVENT_UPDATE_PARAMS\n",
2754 __func__);
2755 mdss_dsi_update_params(ctrl_pdata, arg);
2756 break;
2757 case MDSS_EVENT_CHECK_PARAMS:
2758 pr_debug("%s:Entered Case MDSS_EVENT_CHECK_PARAMS\n", __func__);
2759 if (mdss_dsi_check_params(ctrl_pdata, arg)) {
2760 ctrl_pdata->update_phy_timing = true;
2761 /*
2762 * Call to MDSS_EVENT_CHECK_PARAMS expects
2763 * the return value of 1, if there is a change
2764 * in panel timing parameters.
2765 */
2766 rc = 1;
2767 }
2768 ctrl_pdata->refresh_clk_rate = true;
2769 break;
2770 case MDSS_EVENT_LINK_READY:
2771 if (ctrl_pdata->refresh_clk_rate)
2772 rc = mdss_dsi_clk_refresh(pdata,
2773 ctrl_pdata->update_phy_timing);
2774
2775 rc = mdss_dsi_on(pdata);
2776 mdss_dsi_op_mode_config(pdata->panel_info.mipi.mode,
2777 pdata);
2778 break;
2779 case MDSS_EVENT_UNBLANK:
2780 if (ctrl_pdata->on_cmds.link_state == DSI_LP_MODE)
2781 rc = mdss_dsi_unblank(pdata);
2782 break;
2783 case MDSS_EVENT_POST_PANEL_ON:
2784 rc = mdss_dsi_post_panel_on(pdata);
2785 break;
2786 case MDSS_EVENT_PANEL_ON:
2787 ctrl_pdata->ctrl_state |= CTRL_STATE_MDP_ACTIVE;
2788 if (ctrl_pdata->on_cmds.link_state == DSI_HS_MODE)
2789 rc = mdss_dsi_unblank(pdata);
2790 pdata->panel_info.esd_rdy = true;
2791 break;
2792 case MDSS_EVENT_BLANK:
2793 power_state = (int) (unsigned long) arg;
2794 if (ctrl_pdata->off_cmds.link_state == DSI_HS_MODE)
2795 rc = mdss_dsi_blank(pdata, power_state);
2796 break;
2797 case MDSS_EVENT_PANEL_OFF:
2798 power_state = (int) (unsigned long) arg;
Sachin Bhayareeeb88892018-01-02 16:36:01 +05302799 ctrl_pdata->ctrl_state &= ~CTRL_STATE_MDP_ACTIVE;
2800 if (ctrl_pdata->off_cmds.link_state == DSI_LP_MODE)
2801 rc = mdss_dsi_blank(pdata, power_state);
2802 rc = mdss_dsi_off(pdata, power_state);
2803 break;
2804 case MDSS_EVENT_CONT_SPLASH_FINISH:
2805 if (ctrl_pdata->off_cmds.link_state == DSI_LP_MODE)
2806 rc = mdss_dsi_blank(pdata, MDSS_PANEL_POWER_OFF);
2807 ctrl_pdata->ctrl_state &= ~CTRL_STATE_MDP_ACTIVE;
2808 rc = mdss_dsi_cont_splash_on(pdata);
2809 break;
2810 case MDSS_EVENT_PANEL_CLK_CTRL:
2811 mdss_dsi_clk_req(ctrl_pdata,
2812 (struct dsi_panel_clk_ctrl *) arg);
2813 break;
2814 case MDSS_EVENT_DSI_CMDLIST_KOFF:
2815 mdss_dsi_cmdlist_commit(ctrl_pdata, 1);
2816 break;
2817 case MDSS_EVENT_PANEL_UPDATE_FPS:
2818 if (arg != NULL) {
2819 rc = mdss_dsi_dfps_config(pdata,
2820 (int) (unsigned long) arg);
2821 if (rc)
2822 pr_err("unable to change fps-%d, error-%d\n",
2823 (int) (unsigned long) arg, rc);
2824 else
2825 pr_debug("panel frame rate changed to %d\n",
2826 (int) (unsigned long) arg);
2827 }
2828 break;
2829 case MDSS_EVENT_CONT_SPLASH_BEGIN:
2830 if (ctrl_pdata->off_cmds.link_state == DSI_HS_MODE) {
2831 /* Panel is Enabled in Bootloader */
2832 rc = mdss_dsi_blank(pdata, MDSS_PANEL_POWER_OFF);
2833 }
2834 break;
2835 case MDSS_EVENT_DSC_PPS_SEND:
2836 if (pinfo->compression_mode == COMPRESSION_DSC)
2837 mdss_dsi_panel_dsc_pps_send(ctrl_pdata, pinfo);
2838 break;
2839 case MDSS_EVENT_ENABLE_PARTIAL_ROI:
2840 rc = mdss_dsi_ctl_partial_roi(pdata);
2841 break;
2842 case MDSS_EVENT_DSI_RESET_WRITE_PTR:
2843 rc = mdss_dsi_reset_write_ptr(pdata);
2844 break;
2845 case MDSS_EVENT_DSI_STREAM_SIZE:
2846 rc = mdss_dsi_set_stream_size(pdata);
2847 break;
2848 case MDSS_EVENT_DSI_UPDATE_PANEL_DATA:
2849 rc = mdss_dsi_update_panel_config(ctrl_pdata,
2850 (int)(unsigned long) arg);
2851 break;
2852 case MDSS_EVENT_REGISTER_RECOVERY_HANDLER:
2853 rc = mdss_dsi_register_recovery_handler(ctrl_pdata,
2854 (struct mdss_intf_recovery *)arg);
2855 break;
2856 case MDSS_EVENT_REGISTER_MDP_CALLBACK:
2857 rc = mdss_dsi_register_mdp_callback(ctrl_pdata,
2858 (struct mdss_intf_recovery *)arg);
2859 break;
2860 case MDSS_EVENT_DSI_DYNAMIC_SWITCH:
2861 mode = (u32)(unsigned long) arg;
2862 mdss_dsi_switch_mode(pdata, mode);
2863 break;
2864 case MDSS_EVENT_DSI_RECONFIG_CMD:
2865 mode = (u32)(unsigned long) arg;
2866 rc = mdss_dsi_reconfig(pdata, mode);
2867 break;
2868 case MDSS_EVENT_DSI_PANEL_STATUS:
2869 if (ctrl_pdata->check_status)
2870 rc = ctrl_pdata->check_status(ctrl_pdata);
2871 else
2872 rc = true;
2873 break;
2874 case MDSS_EVENT_PANEL_TIMING_SWITCH:
2875 rc = mdss_dsi_panel_timing_switch(ctrl_pdata, arg);
2876 break;
2877 case MDSS_EVENT_FB_REGISTERED:
2878 mdss_dsi_debugfs_init(ctrl_pdata);
2879
2880 fbi = (struct fb_info *)arg;
2881 if (!fbi || !fbi->dev)
2882 break;
2883
2884 ctrl_pdata->kobj = &fbi->dev->kobj;
2885 ctrl_pdata->fb_node = fbi->node;
2886
2887 if (IS_ENABLED(CONFIG_MSM_DBA) &&
2888 pdata->panel_info.is_dba_panel) {
2889 queue_delayed_work(ctrl_pdata->workq,
2890 &ctrl_pdata->dba_work, HZ);
2891 }
2892 break;
2893 default:
2894 pr_debug("%s: unhandled event=%d\n", __func__, event);
2895 break;
2896 }
2897 pr_debug("%s-:event=%d, rc=%d\n", __func__, event, rc);
2898 return rc;
2899}
2900
2901static int mdss_dsi_set_override_cfg(char *override_cfg,
2902 struct mdss_dsi_ctrl_pdata *ctrl_pdata, char *panel_cfg)
2903{
2904 struct mdss_panel_info *pinfo = &ctrl_pdata->panel_data.panel_info;
2905 char *token = NULL;
2906
2907 pr_debug("%s: override config:%s\n", __func__, override_cfg);
2908 while ((token = strsep(&override_cfg, ":"))) {
2909 if (!strcmp(token, OVERRIDE_CFG)) {
2910 continue;
2911 } else if (!strcmp(token, SIM_HW_TE_PANEL)) {
2912 pinfo->sim_panel_mode = SIM_HW_TE_MODE;
2913 } else if (!strcmp(token, SIM_SW_TE_PANEL)) {
2914 pinfo->sim_panel_mode = SIM_SW_TE_MODE;
2915 } else if (!strcmp(token, SIM_PANEL)) {
2916 pinfo->sim_panel_mode = SIM_MODE;
2917 } else {
2918 pr_err("%s: invalid override_cfg token: %s\n",
2919 __func__, token);
2920 return -EINVAL;
2921 }
2922 }
2923 pr_debug("%s:sim_panel_mode:%d\n", __func__, pinfo->sim_panel_mode);
2924
2925 return 0;
2926}
2927
2928static struct device_node *mdss_dsi_pref_prim_panel(
2929 struct platform_device *pdev)
2930{
2931 struct device_node *dsi_pan_node = NULL;
2932
2933 pr_debug("%s:%d: Select primary panel from dt\n",
2934 __func__, __LINE__);
2935 dsi_pan_node = of_parse_phandle(pdev->dev.of_node,
2936 "qcom,dsi-pref-prim-pan", 0);
2937 if (!dsi_pan_node)
2938 pr_err("%s:can't find panel phandle\n", __func__);
2939
2940 return dsi_pan_node;
2941}
2942
2943/**
2944 * mdss_dsi_find_panel_of_node(): find device node of dsi panel
2945 * @pdev: platform_device of the dsi ctrl node
2946 * @panel_cfg: string containing intf specific config data
2947 *
2948 * Function finds the panel device node using the interface
2949 * specific configuration data. This configuration data is
2950 * could be derived from the result of bootloader's GCDB
2951 * panel detection mechanism. If such config data doesn't
2952 * exist then this panel returns the default panel configured
2953 * in the device tree.
2954 *
2955 * returns pointer to panel node on success, NULL on error.
2956 */
2957static struct device_node *mdss_dsi_find_panel_of_node(
2958 struct platform_device *pdev, char *panel_cfg)
2959{
2960 int len, i = 0;
2961 int ctrl_id = pdev->id - 1;
2962 char panel_name[MDSS_MAX_PANEL_LEN] = "";
2963 char ctrl_id_stream[3] = "0:";
2964 char *str1 = NULL, *str2 = NULL, *override_cfg = NULL;
2965 char cfg_np_name[MDSS_MAX_PANEL_LEN] = "";
2966 struct device_node *dsi_pan_node = NULL, *mdss_node = NULL;
2967 struct mdss_dsi_ctrl_pdata *ctrl_pdata = platform_get_drvdata(pdev);
2968 struct mdss_panel_info *pinfo = &ctrl_pdata->panel_data.panel_info;
2969
2970 len = strlen(panel_cfg);
2971 ctrl_pdata->panel_data.dsc_cfg_np_name[0] = '\0';
2972 if (!len) {
2973 /* no panel cfg chg, parse dt */
2974 pr_debug("%s:%d: no cmd line cfg present\n",
2975 __func__, __LINE__);
2976 goto end;
2977 } else {
2978 /* check if any override parameters are set */
2979 pinfo->sim_panel_mode = 0;
2980 override_cfg = strnstr(panel_cfg, "#" OVERRIDE_CFG, len);
2981 if (override_cfg) {
2982 *override_cfg = '\0';
2983 if (mdss_dsi_set_override_cfg(override_cfg + 1,
2984 ctrl_pdata, panel_cfg))
2985 return NULL;
2986 len = strlen(panel_cfg);
2987 }
2988
2989 if (ctrl_id == 1)
2990 strlcpy(ctrl_id_stream, "1:", 3);
2991
2992 /* get controller number */
2993 str1 = strnstr(panel_cfg, ctrl_id_stream, len);
2994 if (!str1) {
2995 pr_err("%s: controller %s is not present in %s\n",
2996 __func__, ctrl_id_stream, panel_cfg);
2997 goto end;
2998 }
2999 if ((str1 != panel_cfg) && (*(str1-1) != ':')) {
3000 str1 += CMDLINE_DSI_CTL_NUM_STRING_LEN;
3001 pr_debug("false match with config node name in \"%s\". search again in \"%s\"\n",
3002 panel_cfg, str1);
3003 str1 = strnstr(str1, ctrl_id_stream, len);
3004 if (!str1) {
3005 pr_err("%s: 2. controller %s is not present in %s\n",
3006 __func__, ctrl_id_stream, str1);
3007 goto end;
3008 }
3009 }
3010 str1 += CMDLINE_DSI_CTL_NUM_STRING_LEN;
3011
3012 /* get panel name */
3013 str2 = strnchr(str1, strlen(str1), ':');
3014 if (!str2) {
3015 strlcpy(panel_name, str1, MDSS_MAX_PANEL_LEN);
3016 } else {
3017 for (i = 0; (str1 + i) < str2; i++)
3018 panel_name[i] = *(str1 + i);
3019 panel_name[i] = 0;
3020 }
3021 pr_info("%s: cmdline:%s panel_name:%s\n",
3022 __func__, panel_cfg, panel_name);
3023 if (!strcmp(panel_name, NONE_PANEL))
3024 goto exit;
3025
3026 mdss_node = of_parse_phandle(pdev->dev.of_node,
3027 "qcom,mdss-mdp", 0);
3028 if (!mdss_node) {
3029 pr_err("%s: %d: mdss_node null\n",
3030 __func__, __LINE__);
3031 return NULL;
3032 }
3033 dsi_pan_node = of_find_node_by_name(mdss_node, panel_name);
3034 if (!dsi_pan_node) {
3035 pr_err("%s: invalid pan node \"%s\"\n",
3036 __func__, panel_name);
3037 goto end;
3038 } else {
3039 /* extract config node name if present */
3040 str1 += i;
3041 str2 = strnstr(str1, "config", strlen(str1));
3042 if (str2) {
3043 str1 = strnchr(str2, strlen(str2), ':');
3044 if (str1) {
3045 for (i = 0; ((str2 + i) < str1) &&
3046 i < (MDSS_MAX_PANEL_LEN - 1); i++)
3047 cfg_np_name[i] = *(str2 + i);
3048 if ((i >= 0)
3049 && (i < MDSS_MAX_PANEL_LEN))
3050 cfg_np_name[i] = 0;
3051 } else {
3052 strlcpy(cfg_np_name, str2,
3053 MDSS_MAX_PANEL_LEN);
3054 }
3055 strlcpy(ctrl_pdata->panel_data.dsc_cfg_np_name,
3056 cfg_np_name, MDSS_MAX_PANEL_LEN);
3057 }
3058 }
3059
3060 return dsi_pan_node;
3061 }
3062end:
3063 if (strcmp(panel_name, NONE_PANEL))
3064 dsi_pan_node = mdss_dsi_pref_prim_panel(pdev);
3065exit:
3066 return dsi_pan_node;
3067}
3068
3069static struct device_node *mdss_dsi_config_panel(struct platform_device *pdev,
3070 int ndx)
3071{
3072 struct mdss_dsi_ctrl_pdata *ctrl_pdata = platform_get_drvdata(pdev);
3073 char panel_cfg[MDSS_MAX_PANEL_LEN];
3074 struct device_node *dsi_pan_node = NULL;
3075 int rc = 0;
3076
3077 if (!ctrl_pdata) {
3078 pr_err("%s: Unable to get the ctrl_pdata\n", __func__);
3079 return NULL;
3080 }
3081
3082 /* DSI panels can be different between controllers */
3083 rc = mdss_dsi_get_panel_cfg(panel_cfg, ctrl_pdata);
3084 if (!rc)
3085 /* dsi panel cfg not present */
3086 pr_warn("%s:%d:dsi specific cfg not present\n",
3087 __func__, __LINE__);
3088
3089 /* find panel device node */
3090 dsi_pan_node = mdss_dsi_find_panel_of_node(pdev, panel_cfg);
3091 if (!dsi_pan_node) {
3092 pr_err("%s: can't find panel node %s\n", __func__, panel_cfg);
3093 of_node_put(dsi_pan_node);
3094 return NULL;
3095 }
3096
3097 rc = mdss_dsi_panel_init(dsi_pan_node, ctrl_pdata, ndx);
3098 if (rc) {
3099 pr_err("%s: dsi panel init failed\n", __func__);
3100 of_node_put(dsi_pan_node);
3101 return NULL;
3102 }
3103
3104 return dsi_pan_node;
3105}
3106
3107static int mdss_dsi_ctrl_clock_init(struct platform_device *ctrl_pdev,
3108 struct mdss_dsi_ctrl_pdata *ctrl_pdata)
3109{
3110 int rc = 0;
3111 struct mdss_dsi_clk_info info;
3112 struct mdss_dsi_clk_client client1 = {"dsi_clk_client"};
3113 struct mdss_dsi_clk_client client2 = {"mdp_event_client"};
3114 void *handle;
3115
3116 if (mdss_dsi_link_clk_init(ctrl_pdev, ctrl_pdata)) {
3117 pr_err("%s: unable to initialize Dsi ctrl clks\n", __func__);
3118 return -EPERM;
3119 }
3120
3121 memset(&info, 0x0, sizeof(info));
3122
3123 info.core_clks.mdp_core_clk = ctrl_pdata->shared_data->mdp_core_clk;
3124 info.core_clks.ahb_clk = ctrl_pdata->shared_data->ahb_clk;
3125 info.core_clks.axi_clk = ctrl_pdata->shared_data->axi_clk;
3126 info.core_clks.mmss_misc_ahb_clk =
3127 ctrl_pdata->shared_data->mmss_misc_ahb_clk;
3128
Padmanabhan Komandurub0008fd2018-04-12 16:25:43 +05303129 info.link_lp_clks.esc_clk = ctrl_pdata->esc_clk;
3130 info.link_hs_clks.byte_clk = ctrl_pdata->byte_clk;
3131 info.link_hs_clks.pixel_clk = ctrl_pdata->pixel_clk;
Sachin Bhayareeeb88892018-01-02 16:36:01 +05303132
3133 info.pre_clkoff_cb = mdss_dsi_pre_clkoff_cb;
3134 info.post_clkon_cb = mdss_dsi_post_clkon_cb;
3135 info.pre_clkon_cb = mdss_dsi_pre_clkon_cb;
3136 info.post_clkoff_cb = mdss_dsi_post_clkoff_cb;
3137 info.priv_data = ctrl_pdata;
3138 snprintf(info.name, DSI_CLK_NAME_LEN, "DSI%d", ctrl_pdata->ndx);
3139 ctrl_pdata->clk_mngr = mdss_dsi_clk_init(&info);
3140 if (IS_ERR_OR_NULL(ctrl_pdata->clk_mngr)) {
3141 rc = PTR_ERR(ctrl_pdata->clk_mngr);
3142 ctrl_pdata->clk_mngr = NULL;
3143 pr_err("dsi clock registration failed, rc = %d\n", rc);
3144 goto error_link_clk_deinit;
3145 }
3146
3147 /*
3148 * There are two clients that control dsi clocks. MDP driver controls
3149 * the clock through MDSS_PANEL_EVENT_CLK_CTRL event and dsi driver
3150 * through clock interface. To differentiate between the votes from the
3151 * two clients, dsi driver will use two different handles to vote for
3152 * clock states from dsi and mdp driver.
3153 */
3154 handle = mdss_dsi_clk_register(ctrl_pdata->clk_mngr, &client1);
3155 if (IS_ERR_OR_NULL(handle)) {
3156 rc = PTR_ERR(handle);
3157 pr_err("failed to register %s client, rc = %d\n",
3158 client1.client_name, rc);
3159 goto error_clk_deinit;
3160 } else {
3161 ctrl_pdata->dsi_clk_handle = handle;
3162 }
3163
3164 handle = mdss_dsi_clk_register(ctrl_pdata->clk_mngr, &client2);
3165 if (IS_ERR_OR_NULL(handle)) {
3166 rc = PTR_ERR(handle);
3167 pr_err("failed to register %s client, rc = %d\n",
3168 client2.client_name, rc);
3169 goto error_clk_client_deregister;
3170 } else {
3171 ctrl_pdata->mdp_clk_handle = handle;
3172 }
3173
3174 return rc;
3175error_clk_client_deregister:
3176 mdss_dsi_clk_deregister(ctrl_pdata->dsi_clk_handle);
3177error_clk_deinit:
3178 mdss_dsi_clk_deinit(ctrl_pdata->clk_mngr);
3179error_link_clk_deinit:
3180 mdss_dsi_link_clk_deinit(&ctrl_pdev->dev, ctrl_pdata);
3181 return rc;
3182}
3183
3184static int mdss_dsi_set_clk_rates(struct mdss_dsi_ctrl_pdata *ctrl_pdata)
3185{
3186 int rc = 0;
3187
3188 rc = mdss_dsi_clk_set_link_rate(ctrl_pdata->dsi_clk_handle,
3189 MDSS_DSI_LINK_BYTE_CLK,
3190 ctrl_pdata->byte_clk_rate,
3191 MDSS_DSI_CLK_UPDATE_CLK_RATE_AT_ON);
3192 if (rc) {
3193 pr_err("%s: dsi_byte_clk - clk_set_rate failed\n",
3194 __func__);
3195 return rc;
3196 }
3197
3198 rc = mdss_dsi_clk_set_link_rate(ctrl_pdata->dsi_clk_handle,
3199 MDSS_DSI_LINK_PIX_CLK,
3200 ctrl_pdata->pclk_rate,
3201 MDSS_DSI_CLK_UPDATE_CLK_RATE_AT_ON);
3202 if (rc) {
3203 pr_err("%s: dsi_pixel_clk - clk_set_rate failed\n",
3204 __func__);
3205 return rc;
3206 }
3207
3208 rc = mdss_dsi_clk_set_link_rate(ctrl_pdata->dsi_clk_handle,
3209 MDSS_DSI_LINK_ESC_CLK,
3210 19200000,
3211 MDSS_DSI_CLK_UPDATE_CLK_RATE_AT_ON);
3212 if (rc) {
3213 pr_err("%s: dsi_esc_clk - clk_set_rate failed\n",
3214 __func__);
3215 return rc;
3216 }
3217
3218 return rc;
3219}
3220
3221static int mdss_dsi_cont_splash_config(struct mdss_panel_info *pinfo,
3222 struct mdss_dsi_ctrl_pdata *ctrl_pdata)
3223{
3224 void *clk_handle;
3225 int rc = 0;
3226
3227 if (pinfo->cont_splash_enabled) {
3228 rc = mdss_dsi_panel_power_ctrl(&(ctrl_pdata->panel_data),
3229 MDSS_PANEL_POWER_ON);
3230 if (rc) {
3231 pr_err("%s: Panel power on failed\n", __func__);
3232 return rc;
3233 }
3234 if (ctrl_pdata->bklt_ctrl == BL_PWM)
3235 mdss_dsi_panel_pwm_enable(ctrl_pdata);
3236 ctrl_pdata->ctrl_state |= (CTRL_STATE_PANEL_INIT |
3237 CTRL_STATE_MDP_ACTIVE | CTRL_STATE_DSI_ACTIVE);
3238
3239 /*
3240 * MDP client removes this extra vote during splash reconfigure
3241 * for command mode panel from interface. DSI removes the vote
3242 * during suspend-resume for video mode panel.
3243 */
3244 if (ctrl_pdata->panel_data.panel_info.type == MIPI_CMD_PANEL)
3245 clk_handle = ctrl_pdata->mdp_clk_handle;
3246 else
3247 clk_handle = ctrl_pdata->dsi_clk_handle;
3248
3249 mdss_dsi_clk_ctrl(ctrl_pdata, clk_handle,
3250 MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON);
3251 mdss_dsi_read_hw_revision(ctrl_pdata);
3252 mdss_dsi_read_phy_revision(ctrl_pdata);
3253 ctrl_pdata->is_phyreg_enabled = 1;
3254 if (pinfo->type == MIPI_CMD_PANEL)
3255 mdss_dsi_set_burst_mode(ctrl_pdata);
3256 } else {
3257 /* Turn on the clocks to read the DSI and PHY revision */
3258 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
3259 MDSS_DSI_CORE_CLK, MDSS_DSI_CLK_ON);
3260 mdss_dsi_read_hw_revision(ctrl_pdata);
3261 mdss_dsi_read_phy_revision(ctrl_pdata);
3262 mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle,
3263 MDSS_DSI_CORE_CLK, MDSS_DSI_CLK_OFF);
3264 pinfo->panel_power_state = MDSS_PANEL_POWER_OFF;
3265 }
3266
3267 return rc;
3268}
3269
3270static int mdss_dsi_get_bridge_chip_params(struct mdss_panel_info *pinfo,
3271 struct mdss_dsi_ctrl_pdata *ctrl_pdata,
3272 struct platform_device *pdev)
3273{
3274 int rc = 0;
3275 u32 temp_val = 0;
3276
3277 if (!ctrl_pdata || !pdev || !pinfo) {
3278 pr_err("%s: Invalid Params ctrl_pdata=%pK, pdev=%pK\n",
3279 __func__, ctrl_pdata, pdev);
3280 rc = -EINVAL;
3281 goto end;
3282 }
3283
3284 if (pinfo->is_dba_panel) {
3285 rc = of_property_read_u32(pdev->dev.of_node,
3286 "qcom,bridge-index", &temp_val);
3287 if (rc) {
3288 pr_err("%s:%d Unable to read qcom,bridge-index, ret=%d\n",
3289 __func__, __LINE__, rc);
3290 goto end;
3291 }
3292 pr_debug("%s: DT property %s is %X\n", __func__,
3293 "qcom,bridge-index", temp_val);
3294 ctrl_pdata->bridge_index = temp_val;
3295 }
3296end:
3297 return rc;
3298}
3299
3300static int mdss_dsi_ctrl_probe(struct platform_device *pdev)
3301{
3302 int rc = 0;
3303 u32 index;
3304 struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL;
3305 struct mdss_panel_info *pinfo = NULL;
3306 struct device_node *dsi_pan_node = NULL;
3307 const char *ctrl_name;
3308 struct mdss_util_intf *util;
3309 static int te_irq_registered;
3310 struct mdss_panel_data *pdata;
Arun kumardb962812018-05-30 16:31:52 +05303311 struct mdss_panel_cfg *pan_cfg = NULL;
Sachin Bhayareeeb88892018-01-02 16:36:01 +05303312
3313 if (!pdev || !pdev->dev.of_node) {
3314 pr_err("%s: pdev not found for DSI controller\n", __func__);
3315 return -ENODEV;
3316 }
3317 rc = of_property_read_u32(pdev->dev.of_node,
3318 "cell-index", &index);
3319 if (rc) {
3320 dev_err(&pdev->dev, "%s: Cell-index not specified, rc=%d\n",
3321 __func__, rc);
3322 return rc;
3323 }
3324
3325 if (index == 0)
3326 pdev->id = 1;
3327 else
3328 pdev->id = 2;
3329
3330 ctrl_pdata = mdss_dsi_get_ctrl(index);
3331 if (!ctrl_pdata) {
3332 pr_err("%s: Unable to get the ctrl_pdata\n", __func__);
3333 return -EINVAL;
3334 }
3335
3336 platform_set_drvdata(pdev, ctrl_pdata);
3337
3338 util = mdss_get_util_intf();
3339 if (util == NULL) {
3340 pr_err("Failed to get mdss utility functions\n");
3341 return -ENODEV;
3342 }
3343
Arun kumardb962812018-05-30 16:31:52 +05303344 pan_cfg = util->panel_intf_type(MDSS_PANEL_INTF_SPI);
3345 if (IS_ERR(pan_cfg)) {
3346 return PTR_ERR(pan_cfg);
3347 } else if (pan_cfg) {
3348 pr_debug("%s: SPI is primary\n", __func__);
3349 return -ENODEV;
3350 }
3351
Sachin Bhayareeeb88892018-01-02 16:36:01 +05303352 ctrl_pdata->mdss_util = util;
3353 atomic_set(&ctrl_pdata->te_irq_ready, 0);
3354
3355 ctrl_name = of_get_property(pdev->dev.of_node, "label", NULL);
3356 if (!ctrl_name)
3357 pr_info("%s:%d, DSI Ctrl name not specified\n",
3358 __func__, __LINE__);
3359 else
3360 pr_info("%s: DSI Ctrl name = %s\n",
3361 __func__, ctrl_name);
3362
3363 rc = mdss_dsi_pinctrl_init(pdev);
3364 if (rc)
3365 pr_warn("%s: failed to get pin resources\n", __func__);
3366
3367 if (index == 0) {
3368 ctrl_pdata->panel_data.panel_info.pdest = DISPLAY_1;
3369 ctrl_pdata->ndx = DSI_CTRL_0;
3370 } else {
3371 ctrl_pdata->panel_data.panel_info.pdest = DISPLAY_2;
3372 ctrl_pdata->ndx = DSI_CTRL_1;
3373 }
3374
3375 if (mdss_dsi_ctrl_clock_init(pdev, ctrl_pdata)) {
3376 pr_err("%s: unable to initialize dsi clk manager\n", __func__);
3377 return -EPERM;
3378 }
3379
3380 dsi_pan_node = mdss_dsi_config_panel(pdev, index);
3381 if (!dsi_pan_node) {
3382 pr_err("%s: panel configuration failed\n", __func__);
3383 return -EINVAL;
3384 }
3385
3386 if (!mdss_dsi_is_hw_config_split(ctrl_pdata->shared_data) ||
3387 (mdss_dsi_is_hw_config_split(ctrl_pdata->shared_data) &&
3388 (ctrl_pdata->panel_data.panel_info.pdest == DISPLAY_1))) {
3389 rc = mdss_panel_parse_bl_settings(dsi_pan_node, ctrl_pdata);
3390 if (rc) {
3391 pr_warn("%s: dsi bl settings parse failed\n", __func__);
3392 /* Panels like AMOLED and dsi2hdmi chip
3393 * does not need backlight control.
3394 * So we should not fail probe here.
3395 */
3396 ctrl_pdata->bklt_ctrl = UNKNOWN_CTRL;
3397 }
3398 } else {
3399 ctrl_pdata->bklt_ctrl = UNKNOWN_CTRL;
3400 }
3401
3402 rc = dsi_panel_device_register(pdev, dsi_pan_node, ctrl_pdata);
3403 if (rc) {
3404 pr_err("%s: dsi panel dev reg failed\n", __func__);
3405 goto error_pan_node;
3406 }
3407
3408 pinfo = &(ctrl_pdata->panel_data.panel_info);
3409 if (!(mdss_dsi_is_hw_config_split(ctrl_pdata->shared_data) &&
3410 mdss_dsi_is_ctrl_clk_slave(ctrl_pdata)) &&
3411 pinfo->dynamic_fps) {
3412 rc = mdss_dsi_shadow_clk_init(pdev, ctrl_pdata);
3413
3414 if (rc) {
3415 pr_err("%s: unable to initialize shadow ctrl clks\n",
3416 __func__);
3417 rc = -EPERM;
3418 }
3419 }
3420
3421 rc = mdss_dsi_set_clk_rates(ctrl_pdata);
3422 if (rc) {
3423 pr_err("%s: Failed to set dsi clk rates\n", __func__);
3424 return rc;
3425 }
3426
3427 rc = mdss_dsi_cont_splash_config(pinfo, ctrl_pdata);
3428 if (rc) {
3429 pr_err("%s: Failed to set dsi splash config\n", __func__);
3430 return rc;
3431 }
3432
3433 if (mdss_dsi_is_te_based_esd(ctrl_pdata)) {
3434 init_completion(&ctrl_pdata->te_irq_comp);
3435 rc = devm_request_irq(&pdev->dev,
3436 gpio_to_irq(ctrl_pdata->disp_te_gpio),
3437 hw_vsync_handler, IRQF_TRIGGER_FALLING,
3438 "VSYNC_GPIO", ctrl_pdata);
3439 if (rc) {
3440 pr_err("%s: TE request_irq failed for ESD\n", __func__);
3441 goto error_shadow_clk_deinit;
3442 }
3443 te_irq_registered = 1;
3444 disable_irq(gpio_to_irq(ctrl_pdata->disp_te_gpio));
3445 }
3446
3447 pdata = &ctrl_pdata->panel_data;
3448 init_completion(&pdata->te_done);
3449 if (pdata->panel_info.type == MIPI_CMD_PANEL) {
3450 if (!te_irq_registered) {
3451 rc = devm_request_irq(&pdev->dev,
3452 gpio_to_irq(pdata->panel_te_gpio),
3453 test_hw_vsync_handler, IRQF_TRIGGER_FALLING,
3454 "VSYNC_GPIO", &ctrl_pdata->panel_data);
3455 if (rc) {
3456 pr_err("%s: TE request_irq failed\n", __func__);
3457 goto error_shadow_clk_deinit;
3458 }
3459 te_irq_registered = 1;
3460 disable_irq_nosync(gpio_to_irq(pdata->panel_te_gpio));
3461 }
3462 }
3463
3464 rc = mdss_dsi_get_bridge_chip_params(pinfo, ctrl_pdata, pdev);
3465 if (rc) {
3466 pr_err("%s: Failed to get bridge params\n", __func__);
3467 goto error_shadow_clk_deinit;
3468 }
3469
3470 ctrl_pdata->workq = create_workqueue("mdss_dsi_dba");
3471 if (!ctrl_pdata->workq) {
3472 pr_err("%s: Error creating workqueue\n", __func__);
3473 rc = -EPERM;
3474 goto error_pan_node;
3475 }
3476
3477 INIT_DELAYED_WORK(&ctrl_pdata->dba_work, mdss_dsi_dba_work);
3478
3479 pr_info("%s: Dsi Ctrl->%d initialized, DSI rev:0x%x, PHY rev:0x%x\n",
3480 __func__, index, ctrl_pdata->shared_data->hw_rev,
3481 ctrl_pdata->shared_data->phy_rev);
3482 mdss_dsi_pm_qos_add_request(ctrl_pdata);
3483
3484 if (index == 0)
3485 ctrl_pdata->shared_data->dsi0_active = true;
3486 else
3487 ctrl_pdata->shared_data->dsi1_active = true;
3488
Sandeep Panda812f5002017-02-24 11:36:59 +05303489 mdss_dsi_debug_bus_init(mdss_dsi_res);
3490
Sachin Bhayareeeb88892018-01-02 16:36:01 +05303491 return 0;
3492
3493error_shadow_clk_deinit:
3494 mdss_dsi_shadow_clk_deinit(&pdev->dev, ctrl_pdata);
3495error_pan_node:
3496 mdss_dsi_unregister_bl_settings(ctrl_pdata);
3497 of_node_put(dsi_pan_node);
3498 return rc;
3499}
3500
3501static int mdss_dsi_bus_scale_init(struct platform_device *pdev,
3502 struct dsi_shared_data *sdata)
3503{
3504 int rc = 0;
3505
3506 sdata->bus_scale_table = msm_bus_cl_get_pdata(pdev);
3507 if (IS_ERR_OR_NULL(sdata->bus_scale_table)) {
3508 rc = PTR_ERR(sdata->bus_scale_table);
3509 pr_err("%s: msm_bus_cl_get_pdata() failed, rc=%d\n", __func__,
3510 rc);
3511 return rc;
3512 sdata->bus_scale_table = NULL;
3513 }
3514
3515 sdata->bus_handle =
3516 msm_bus_scale_register_client(sdata->bus_scale_table);
3517
3518 if (!sdata->bus_handle) {
3519 rc = -EINVAL;
3520 pr_err("%sbus_client register failed\n", __func__);
3521 }
3522
3523 return rc;
3524}
3525
3526static void mdss_dsi_bus_scale_deinit(struct dsi_shared_data *sdata)
3527{
3528 if (sdata->bus_handle) {
3529 if (sdata->bus_refcount)
3530 msm_bus_scale_client_update_request(sdata->bus_handle,
3531 0);
3532
3533 sdata->bus_refcount = 0;
3534 msm_bus_scale_unregister_client(sdata->bus_handle);
3535 sdata->bus_handle = 0;
3536 }
3537}
3538
3539static int mdss_dsi_parse_dt_params(struct platform_device *pdev,
3540 struct dsi_shared_data *sdata)
3541{
3542 int rc = 0;
3543
3544 rc = of_property_read_u32(pdev->dev.of_node,
3545 "qcom,mmss-ulp-clamp-ctrl-offset",
3546 &sdata->ulps_clamp_ctrl_off);
3547 if (!rc) {
3548 rc = of_property_read_u32(pdev->dev.of_node,
3549 "qcom,mmss-phyreset-ctrl-offset",
3550 &sdata->ulps_phyrst_ctrl_off);
3551 }
3552
3553 sdata->cmd_clk_ln_recovery_en =
3554 of_property_read_bool(pdev->dev.of_node,
3555 "qcom,dsi-clk-ln-recovery");
3556
Xipeng Gu28b6d152019-09-11 10:54:17 +08003557 sdata->skip_clamp =
3558 of_property_read_bool(pdev->dev.of_node,
3559 "qcom,mdss-skip-clamp");
3560
Sachin Bhayareeeb88892018-01-02 16:36:01 +05303561 return 0;
3562}
3563
3564#ifdef TARGET_HW_MDSS_HDMI
3565static void mdss_dsi_res_deinit_hdmi(struct platform_device *pdev, int val)
3566{
3567 struct mdss_dsi_data *dsi_res = platform_get_drvdata(pdev);
3568
3569 if (dsi_res->ctrl_pdata[val]->ds_registered) {
3570 struct mdss_panel_info *pinfo =
3571 &dsi_res->ctrl_pdata[val]->
3572 panel_data.panel_info;
3573 if (pinfo)
3574 mdss_dba_utils_deinit(pinfo->dba_data);
3575 }
3576}
3577#else
3578static void mdss_dsi_res_deinit_hdmi(struct platform_device *pdev, int val)
3579{
3580 (void)(*pdev);
3581 (void)(val);
3582}
3583#endif
3584
3585static void mdss_dsi_res_deinit(struct platform_device *pdev)
3586{
3587 int i;
3588 struct mdss_dsi_data *dsi_res = platform_get_drvdata(pdev);
3589 struct dsi_shared_data *sdata;
3590
3591 if (!dsi_res) {
3592 pr_err("%s: DSI root device drvdata not found\n", __func__);
3593 return;
3594 }
3595
3596 for (i = 0; i < DSI_CTRL_MAX; i++) {
3597 if (dsi_res->ctrl_pdata[i]) {
3598 mdss_dsi_res_deinit_hdmi(pdev, i);
3599 devm_kfree(&pdev->dev, dsi_res->ctrl_pdata[i]);
3600 }
3601 }
3602
3603 sdata = dsi_res->shared_data;
3604 if (!sdata)
3605 goto res_release;
3606
3607 for (i = (DSI_MAX_PM - 1); i >= DSI_CORE_PM; i--) {
Sachin Bhayare5076e252018-01-18 14:56:45 +05303608 if (msm_mdss_config_vreg(&pdev->dev,
Sachin Bhayareeeb88892018-01-02 16:36:01 +05303609 sdata->power_data[i].vreg_config,
3610 sdata->power_data[i].num_vreg, 1) < 0)
3611 pr_err("%s: failed to de-init vregs for %s\n",
3612 __func__, __mdss_dsi_pm_name(i));
3613 mdss_dsi_put_dt_vreg_data(&pdev->dev,
3614 &sdata->power_data[i]);
3615 }
3616
3617 mdss_dsi_bus_scale_deinit(sdata);
3618 mdss_dsi_core_clk_deinit(&pdev->dev, sdata);
3619
3620 if (sdata)
3621 devm_kfree(&pdev->dev, sdata);
3622
3623res_release:
3624 if (dsi_res)
3625 devm_kfree(&pdev->dev, dsi_res);
3626
3627}
3628
3629static int mdss_dsi_res_init(struct platform_device *pdev)
3630{
3631 int rc = 0, i;
3632 struct dsi_shared_data *sdata;
3633
3634 mdss_dsi_res = platform_get_drvdata(pdev);
3635 if (!mdss_dsi_res) {
3636 mdss_dsi_res = devm_kzalloc(&pdev->dev,
3637 sizeof(struct mdss_dsi_data),
3638 GFP_KERNEL);
3639 if (!mdss_dsi_res) {
3640 pr_err("%s: FAILED: cannot alloc dsi data\n",
3641 __func__);
3642 rc = -ENOMEM;
3643 goto mem_fail;
3644 }
3645
3646 mdss_dsi_res->shared_data = devm_kzalloc(&pdev->dev,
3647 sizeof(struct dsi_shared_data),
3648 GFP_KERNEL);
3649 pr_debug("%s Allocated shared_data=%pK\n", __func__,
3650 mdss_dsi_res->shared_data);
3651 if (!mdss_dsi_res->shared_data) {
3652 pr_err("%s Unable to alloc mem for shared_data\n",
3653 __func__);
3654 rc = -ENOMEM;
3655 goto mem_fail;
3656 }
3657
3658 sdata = mdss_dsi_res->shared_data;
3659
3660 rc = mdss_dsi_parse_dt_params(pdev, sdata);
3661 if (rc) {
3662 pr_err("%s: failed to parse mdss dsi DT params\n",
3663 __func__);
3664 goto mem_fail;
3665 }
3666
3667 rc = mdss_dsi_core_clk_init(pdev, sdata);
3668 if (rc) {
3669 pr_err("%s: failed to initialize DSI core clocks\n",
3670 __func__);
3671 goto mem_fail;
3672 }
3673
3674 /* Parse the regulator information */
3675 for (i = DSI_CORE_PM; i < DSI_MAX_PM; i++) {
3676 rc = mdss_dsi_get_dt_vreg_data(&pdev->dev,
3677 pdev->dev.of_node, &sdata->power_data[i], i);
3678 if (rc) {
3679 pr_err("%s: '%s' get_dt_vreg_data failed.rc=%d\n",
3680 __func__, __mdss_dsi_pm_name(i), rc);
3681 i--;
3682 for (; i >= DSI_CORE_PM; i--)
3683 mdss_dsi_put_dt_vreg_data(&pdev->dev,
3684 &sdata->power_data[i]);
3685 goto mem_fail;
3686 }
3687 }
3688 rc = mdss_dsi_regulator_init(pdev, sdata);
3689 if (rc) {
3690 pr_err("%s: failed to init regulator, rc=%d\n",
3691 __func__, rc);
3692 goto mem_fail;
3693 }
3694
3695 rc = mdss_dsi_bus_scale_init(pdev, sdata);
3696 if (rc) {
3697 pr_err("%s: failed to init bus scale settings, rc=%d\n",
3698 __func__, rc);
3699 goto mem_fail;
3700 }
3701
3702 mutex_init(&sdata->phy_reg_lock);
3703 mutex_init(&sdata->pm_qos_lock);
3704
3705 for (i = 0; i < DSI_CTRL_MAX; i++) {
3706 mdss_dsi_res->ctrl_pdata[i] = devm_kzalloc(&pdev->dev,
3707 sizeof(struct mdss_dsi_ctrl_pdata),
3708 GFP_KERNEL);
3709 if (!mdss_dsi_res->ctrl_pdata[i]) {
3710 pr_err("%s Unable to alloc mem for ctrl=%d\n",
3711 __func__, i);
3712 rc = -ENOMEM;
3713 goto mem_fail;
3714 }
3715 pr_debug("%s Allocated ctrl_pdata[%d]=%pK\n",
3716 __func__, i, mdss_dsi_res->ctrl_pdata[i]);
3717 mdss_dsi_res->ctrl_pdata[i]->shared_data =
3718 mdss_dsi_res->shared_data;
3719 }
3720
3721 platform_set_drvdata(pdev, mdss_dsi_res);
3722 }
3723
3724 mdss_dsi_res->pdev = pdev;
3725 pr_debug("%s: Setting up mdss_dsi_res=%pK\n", __func__, mdss_dsi_res);
3726
3727 return 0;
3728
3729mem_fail:
3730 mdss_dsi_res_deinit(pdev);
3731 return rc;
3732}
3733
3734static int mdss_dsi_parse_hw_cfg(struct platform_device *pdev, char *pan_cfg)
3735{
3736 const char *data;
3737 struct mdss_dsi_data *dsi_res = platform_get_drvdata(pdev);
3738 struct dsi_shared_data *sdata;
3739 char dsi_cfg[20];
3740 char *cfg_prim = NULL, *cfg_sec = NULL, *ch = NULL;
3741 int i = 0;
3742
3743 if (!dsi_res) {
3744 pr_err("%s: DSI root device drvdata not found\n", __func__);
3745 return -EINVAL;
3746 }
3747
3748 sdata = mdss_dsi_res->shared_data;
3749 if (!sdata) {
3750 pr_err("%s: DSI shared data not found\n", __func__);
3751 return -EINVAL;
3752 }
3753
3754 sdata->hw_config = SINGLE_DSI;
3755
3756 if (pan_cfg)
3757 cfg_prim = strnstr(pan_cfg, "cfg:", strlen(pan_cfg));
3758 if (cfg_prim) {
3759 cfg_prim += 4;
3760
3761 cfg_sec = strnchr(cfg_prim, strlen(cfg_prim), ':');
3762 if (!cfg_sec)
3763 cfg_sec = cfg_prim + strlen(cfg_prim);
3764
3765 for (i = 0; ((cfg_prim + i) < cfg_sec) &&
3766 (*(cfg_prim+i) != '#'); i++)
3767 dsi_cfg[i] = *(cfg_prim + i);
3768
3769 dsi_cfg[i] = '\0';
3770 data = dsi_cfg;
3771 } else {
3772 data = of_get_property(pdev->dev.of_node,
3773 "hw-config", NULL);
3774 }
3775
3776 if (data) {
3777 /*
3778 * To handle the override parameter (#override:sim)
3779 * passed for simulator panels
3780 */
3781 ch = strnstr(data, "#", strlen(data));
3782 ch ? *ch = '\0' : false;
3783
3784 if (!strcmp(data, "dual_dsi"))
3785 sdata->hw_config = DUAL_DSI;
3786 else if (!strcmp(data, "split_dsi"))
3787 sdata->hw_config = SPLIT_DSI;
3788 else if (!strcmp(data, "single_dsi"))
3789 sdata->hw_config = SINGLE_DSI;
3790 else
3791 pr_err("%s: Incorrect string for DSI config:%s. Setting default as SINGLE_DSI\n",
3792 __func__, data);
3793 } else {
3794 pr_err("%s: Error: No DSI HW config found\n",
3795 __func__);
3796 return -EINVAL;
3797 }
3798
3799 pr_debug("%s: DSI h/w configuration is %d\n", __func__,
3800 sdata->hw_config);
3801
3802 return 0;
3803}
3804
3805static void mdss_dsi_parse_pll_src_cfg(struct platform_device *pdev,
3806 char *pan_cfg)
3807{
3808 const char *data;
3809 char *pll_ptr, pll_cfg[10] = {'\0'};
3810 struct dsi_shared_data *sdata = mdss_dsi_res->shared_data;
3811
3812 sdata->pll_src_config = PLL_SRC_DEFAULT;
3813
3814 if (pan_cfg) {
3815 pll_ptr = strnstr(pan_cfg, ":pll0", strlen(pan_cfg));
3816 if (!pll_ptr) {
3817 pll_ptr = strnstr(pan_cfg, ":pll1", strlen(pan_cfg));
3818 if (pll_ptr)
3819 strlcpy(pll_cfg, "PLL1", strlen(pll_cfg));
3820 } else {
3821 strlcpy(pll_cfg, "PLL0", strlen(pll_cfg));
3822 }
3823 }
3824 data = pll_cfg;
3825
3826 if (!data || !strcmp(data, ""))
3827 data = of_get_property(pdev->dev.of_node,
3828 "pll-src-config", NULL);
3829 if (data) {
3830 if (!strcmp(data, "PLL0"))
3831 sdata->pll_src_config = PLL_SRC_0;
3832 else if (!strcmp(data, "PLL1"))
3833 sdata->pll_src_config = PLL_SRC_1;
3834 else
3835 pr_err("%s: invalid pll src config %s\n",
3836 __func__, data);
3837 } else {
3838 pr_debug("%s: PLL src config not specified\n", __func__);
3839 }
3840
3841 pr_debug("%s: pll_src_config = %d", __func__, sdata->pll_src_config);
3842}
3843
3844static int mdss_dsi_validate_pll_src_config(struct dsi_shared_data *sdata)
3845{
3846 int rc = 0;
3847
3848 /*
3849 * DSI PLL1 can only drive DSI PHY1. As such:
3850 * - For split dsi config, only PLL0 is supported
3851 * - For dual dsi config, DSI0-PLL0 and DSI1-PLL1 is the only
3852 * possible configuration
3853 */
3854 if (mdss_dsi_is_hw_config_split(sdata) &&
3855 mdss_dsi_is_pll_src_pll1(sdata)) {
3856 pr_err("%s: unsupported PLL config: using PLL1 for split-dsi\n",
3857 __func__);
3858 rc = -EINVAL;
3859 goto error;
3860 }
3861
3862 if (mdss_dsi_is_hw_config_dual(sdata) &&
3863 !mdss_dsi_is_pll_src_default(sdata)) {
3864 pr_debug("%s: pll src config not applicable for dual-dsi\n",
3865 __func__);
3866 sdata->pll_src_config = PLL_SRC_DEFAULT;
3867 }
3868
3869error:
3870 return rc;
3871}
3872
3873static int mdss_dsi_validate_config(struct platform_device *pdev)
3874{
3875 struct dsi_shared_data *sdata = mdss_dsi_res->shared_data;
3876
3877 return mdss_dsi_validate_pll_src_config(sdata);
3878}
3879
3880static const struct of_device_id mdss_dsi_ctrl_dt_match[] = {
3881 {.compatible = "qcom,mdss-dsi-ctrl"},
3882 {}
3883};
3884MODULE_DEVICE_TABLE(of, mdss_dsi_ctrl_dt_match);
3885
3886static int mdss_dsi_probe(struct platform_device *pdev)
3887{
3888 struct mdss_panel_cfg *pan_cfg = NULL;
3889 struct mdss_util_intf *util;
3890 char *panel_cfg;
3891 int rc = 0;
3892
3893 util = mdss_get_util_intf();
3894 if (util == NULL) {
3895 pr_err("%s: Failed to get mdss utility functions\n", __func__);
3896 return -ENODEV;
3897 }
3898
3899 if (!util->mdp_probe_done) {
3900 pr_err("%s: MDP not probed yet!\n", __func__);
3901 return -EPROBE_DEFER;
3902 }
3903
Sachin Bhayareeeb88892018-01-02 16:36:01 +05303904 if (!pdev || !pdev->dev.of_node) {
3905 pr_err("%s: DSI driver only supports device tree probe\n",
3906 __func__);
3907 return -ENOTSUPP;
3908 }
3909
3910 pan_cfg = util->panel_intf_type(MDSS_PANEL_INTF_HDMI);
3911 if (IS_ERR(pan_cfg)) {
3912 return PTR_ERR(pan_cfg);
3913 } else if (pan_cfg) {
3914 pr_debug("%s: HDMI is primary\n", __func__);
3915 return -ENODEV;
3916 }
3917
3918 pan_cfg = util->panel_intf_type(MDSS_PANEL_INTF_DSI);
3919 if (IS_ERR_OR_NULL(pan_cfg)) {
3920 rc = PTR_ERR(pan_cfg);
3921 goto error;
3922 } else {
3923 panel_cfg = pan_cfg->arg_cfg;
3924 }
3925
3926 rc = mdss_dsi_res_init(pdev);
3927 if (rc) {
3928 pr_err("%s Unable to set dsi res\n", __func__);
3929 return rc;
3930 }
3931
3932 rc = mdss_dsi_parse_hw_cfg(pdev, panel_cfg);
3933 if (rc) {
3934 pr_err("%s Unable to parse dsi h/w config\n", __func__);
3935 mdss_dsi_res_deinit(pdev);
3936 return rc;
3937 }
3938
3939 mdss_dsi_parse_pll_src_cfg(pdev, panel_cfg);
3940
3941 of_platform_populate(pdev->dev.of_node, mdss_dsi_ctrl_dt_match,
3942 NULL, &pdev->dev);
3943
3944 rc = mdss_dsi_validate_config(pdev);
3945 if (rc) {
3946 pr_err("%s: Invalid DSI hw configuration\n", __func__);
3947 goto error;
3948 }
3949
3950 mdss_dsi_config_clk_src(pdev);
3951
3952error:
3953 return rc;
3954}
3955
3956static int mdss_dsi_remove(struct platform_device *pdev)
3957{
3958 mdss_dsi_res_deinit(pdev);
3959 return 0;
3960}
3961
3962static int mdss_dsi_ctrl_remove(struct platform_device *pdev)
3963{
3964 struct msm_fb_data_type *mfd;
3965 struct mdss_dsi_ctrl_pdata *ctrl_pdata = platform_get_drvdata(pdev);
3966
3967 if (!ctrl_pdata) {
3968 pr_err("%s: no driver data\n", __func__);
3969 return -ENODEV;
3970 }
3971
3972 mdss_dsi_pm_qos_remove_request(ctrl_pdata->shared_data);
3973
Sachin Bhayare5076e252018-01-18 14:56:45 +05303974 if (msm_mdss_config_vreg(&pdev->dev,
Sachin Bhayareeeb88892018-01-02 16:36:01 +05303975 ctrl_pdata->panel_power_data.vreg_config,
3976 ctrl_pdata->panel_power_data.num_vreg, 1) < 0)
3977 pr_err("%s: failed to de-init vregs for %s\n",
3978 __func__, __mdss_dsi_pm_name(DSI_PANEL_PM));
3979 mdss_dsi_put_dt_vreg_data(&pdev->dev, &ctrl_pdata->panel_power_data);
3980
3981 mfd = platform_get_drvdata(pdev);
Sachin Bhayare5076e252018-01-18 14:56:45 +05303982 msm_mdss_iounmap(&ctrl_pdata->mmss_misc_io);
3983 msm_mdss_iounmap(&ctrl_pdata->phy_io);
3984 msm_mdss_iounmap(&ctrl_pdata->ctrl_io);
Sachin Bhayareeeb88892018-01-02 16:36:01 +05303985 mdss_dsi_debugfs_cleanup(ctrl_pdata);
3986
3987 if (ctrl_pdata->workq)
3988 destroy_workqueue(ctrl_pdata->workq);
3989
3990 return 0;
3991}
3992
3993struct device dsi_dev;
3994
3995int mdss_dsi_retrieve_ctrl_resources(struct platform_device *pdev, int mode,
3996 struct mdss_dsi_ctrl_pdata *ctrl)
3997{
3998 int rc = 0;
3999 u32 index;
4000
4001 rc = of_property_read_u32(pdev->dev.of_node, "cell-index", &index);
4002 if (rc) {
4003 dev_err(&pdev->dev,
4004 "%s: Cell-index not specified, rc=%d\n",
4005 __func__, rc);
4006 return rc;
4007 }
4008
4009 if (index == 0) {
4010 if (mode != DISPLAY_1) {
4011 pr_err("%s:%d Panel->Ctrl mapping is wrong\n",
4012 __func__, __LINE__);
4013 return -EPERM;
4014 }
4015 } else if (index == 1) {
4016 if (mode != DISPLAY_2) {
4017 pr_err("%s:%d Panel->Ctrl mapping is wrong\n",
4018 __func__, __LINE__);
4019 return -EPERM;
4020 }
4021 } else {
4022 pr_err("%s:%d Unknown Ctrl mapped to panel\n",
4023 __func__, __LINE__);
4024 return -EPERM;
4025 }
4026
Sachin Bhayare5076e252018-01-18 14:56:45 +05304027 rc = msm_mdss_ioremap_byname(pdev, &ctrl->ctrl_io, "dsi_ctrl");
Sachin Bhayareeeb88892018-01-02 16:36:01 +05304028 if (rc) {
4029 pr_err("%s:%d unable to remap dsi ctrl resources\n",
4030 __func__, __LINE__);
4031 return rc;
4032 }
4033
4034 ctrl->ctrl_base = ctrl->ctrl_io.base;
4035 ctrl->reg_size = ctrl->ctrl_io.len;
4036
Sachin Bhayare5076e252018-01-18 14:56:45 +05304037 rc = msm_mdss_ioremap_byname(pdev, &ctrl->phy_io, "dsi_phy");
Sachin Bhayareeeb88892018-01-02 16:36:01 +05304038 if (rc) {
4039 pr_err("%s:%d unable to remap dsi phy resources\n",
4040 __func__, __LINE__);
4041 return rc;
4042 }
4043
Sachin Bhayare5076e252018-01-18 14:56:45 +05304044 rc = msm_mdss_ioremap_byname(pdev, &ctrl->phy_regulator_io,
Sachin Bhayareeeb88892018-01-02 16:36:01 +05304045 "dsi_phy_regulator");
4046 if (rc)
4047 pr_debug("%s:%d unable to remap dsi phy regulator resources\n",
4048 __func__, __LINE__);
4049 else
4050 pr_info("%s: phy_regulator_base=%pK phy_regulator_size=%x\n",
4051 __func__, ctrl->phy_regulator_io.base,
4052 ctrl->phy_regulator_io.len);
4053
4054 pr_info("%s: ctrl_base=%pK ctrl_size=%x phy_base=%pK phy_size=%x\n",
4055 __func__, ctrl->ctrl_base, ctrl->reg_size, ctrl->phy_io.base,
4056 ctrl->phy_io.len);
4057
Sachin Bhayare5076e252018-01-18 14:56:45 +05304058 rc = msm_mdss_ioremap_byname(pdev, &ctrl->mmss_misc_io,
Sachin Bhayareeeb88892018-01-02 16:36:01 +05304059 "mmss_misc_phys");
4060 if (rc) {
4061 pr_debug("%s:%d mmss_misc IO remap failed\n",
4062 __func__, __LINE__);
4063 }
4064
4065 return 0;
4066}
4067
4068static int mdss_dsi_irq_init(struct device *dev, int irq_no,
4069 struct mdss_dsi_ctrl_pdata *ctrl)
4070{
4071 int ret;
4072
4073 ret = devm_request_irq(dev, irq_no, mdss_dsi_isr,
Sachin Bhayare3d3767e2018-01-02 21:10:57 +05304074 0, "DSI", ctrl);
Sachin Bhayareeeb88892018-01-02 16:36:01 +05304075 if (ret) {
4076 pr_err("msm_dsi_irq_init request_irq() failed!\n");
4077 return ret;
4078 }
4079
4080 disable_irq(irq_no);
4081 ctrl->dsi_hw->irq_info = kcalloc(1, sizeof(struct irq_info),
4082 GFP_KERNEL);
4083 if (!ctrl->dsi_hw->irq_info)
4084 return -ENOMEM;
4085
4086 ctrl->dsi_hw->irq_info->irq = irq_no;
4087 ctrl->dsi_hw->irq_info->irq_ena = false;
4088
4089 return ret;
4090}
4091
4092static void mdss_dsi_parse_lane_swap(struct device_node *np, char *dlane_swap)
4093{
4094 const char *data;
4095
4096 *dlane_swap = DSI_LANE_MAP_0123;
4097 data = of_get_property(np, "qcom,lane-map", NULL);
4098 if (data) {
4099 if (!strcmp(data, "lane_map_3012"))
4100 *dlane_swap = DSI_LANE_MAP_3012;
4101 else if (!strcmp(data, "lane_map_2301"))
4102 *dlane_swap = DSI_LANE_MAP_2301;
4103 else if (!strcmp(data, "lane_map_1230"))
4104 *dlane_swap = DSI_LANE_MAP_1230;
4105 else if (!strcmp(data, "lane_map_0321"))
4106 *dlane_swap = DSI_LANE_MAP_0321;
4107 else if (!strcmp(data, "lane_map_1032"))
4108 *dlane_swap = DSI_LANE_MAP_1032;
4109 else if (!strcmp(data, "lane_map_2103"))
4110 *dlane_swap = DSI_LANE_MAP_2103;
4111 else if (!strcmp(data, "lane_map_3210"))
4112 *dlane_swap = DSI_LANE_MAP_3210;
4113 }
4114}
4115
4116static int mdss_dsi_parse_ctrl_params(struct platform_device *ctrl_pdev,
4117 struct device_node *pan_node, struct mdss_dsi_ctrl_pdata *ctrl_pdata)
4118{
4119 int i, len;
4120 struct mdss_panel_info *pinfo = &(ctrl_pdata->panel_data.panel_info);
4121 const char *data;
4122
4123 ctrl_pdata->null_insert_enabled = of_property_read_bool(
4124 ctrl_pdev->dev.of_node, "qcom,null-insertion-enabled");
4125
4126 data = of_get_property(ctrl_pdev->dev.of_node,
4127 "qcom,platform-strength-ctrl", &len);
4128 if (!data) {
4129 pr_err("%s:%d, Unable to read Phy Strength ctrl settings\n",
4130 __func__, __LINE__);
Padmanabhan Komanduru81d8dc522018-03-22 20:00:58 +05304131 } else {
4132 pinfo->mipi.dsi_phy_db.strength_len = len;
4133 for (i = 0; i < len; i++)
4134 pinfo->mipi.dsi_phy_db.strength[i] = data[i];
Sachin Bhayareeeb88892018-01-02 16:36:01 +05304135 }
4136
Sachin Bhayareeeb88892018-01-02 16:36:01 +05304137 pinfo->mipi.dsi_phy_db.reg_ldo_mode = of_property_read_bool(
4138 ctrl_pdev->dev.of_node, "qcom,regulator-ldo-mode");
4139
4140 data = of_get_property(ctrl_pdev->dev.of_node,
4141 "qcom,platform-regulator-settings", &len);
4142 if (!data) {
4143 pr_err("%s:%d, Unable to read Phy regulator settings\n",
4144 __func__, __LINE__);
Padmanabhan Komanduru81d8dc522018-03-22 20:00:58 +05304145 } else {
4146 pinfo->mipi.dsi_phy_db.regulator_len = len;
4147 for (i = 0; i < len; i++)
4148 pinfo->mipi.dsi_phy_db.regulator[i] = data[i];
Sachin Bhayareeeb88892018-01-02 16:36:01 +05304149 }
4150
Sachin Bhayareeeb88892018-01-02 16:36:01 +05304151 data = of_get_property(ctrl_pdev->dev.of_node,
4152 "qcom,platform-bist-ctrl", &len);
4153 if ((!data) || (len != 6))
4154 pr_debug("%s:%d, Unable to read Phy Bist Ctrl settings\n",
4155 __func__, __LINE__);
4156 else
4157 for (i = 0; i < len; i++)
4158 pinfo->mipi.dsi_phy_db.bistctrl[i] = data[i];
4159
4160 data = of_get_property(ctrl_pdev->dev.of_node,
4161 "qcom,platform-lane-config", &len);
4162 if (!data) {
4163 pr_err("%s:%d, Unable to read Phy lane configure settings\n",
4164 __func__, __LINE__);
Padmanabhan Komanduru81d8dc522018-03-22 20:00:58 +05304165 } else {
4166 pinfo->mipi.dsi_phy_db.lanecfg_len = len;
4167 for (i = 0; i < len; i++)
4168 pinfo->mipi.dsi_phy_db.lanecfg[i] = data[i];
Sachin Bhayareeeb88892018-01-02 16:36:01 +05304169 }
4170
Sachin Bhayareeeb88892018-01-02 16:36:01 +05304171 ctrl_pdata->timing_db_mode = of_property_read_bool(
4172 ctrl_pdev->dev.of_node, "qcom,timing-db-mode");
4173
4174 ctrl_pdata->cmd_sync_wait_broadcast = of_property_read_bool(
4175 pan_node, "qcom,cmd-sync-wait-broadcast");
4176
4177 if (ctrl_pdata->cmd_sync_wait_broadcast &&
4178 mdss_dsi_is_hw_config_split(ctrl_pdata->shared_data) &&
4179 (pinfo->pdest == DISPLAY_2))
4180 ctrl_pdata->cmd_sync_wait_trigger = true;
4181
4182 pr_debug("%s: cmd_sync_wait_enable=%d trigger=%d\n", __func__,
4183 ctrl_pdata->cmd_sync_wait_broadcast,
4184 ctrl_pdata->cmd_sync_wait_trigger);
4185
4186 mdss_dsi_parse_lane_swap(ctrl_pdev->dev.of_node,
4187 &(ctrl_pdata->dlane_swap));
4188
4189 pinfo->is_pluggable = of_property_read_bool(ctrl_pdev->dev.of_node,
4190 "qcom,pluggable");
4191
4192 data = of_get_property(ctrl_pdev->dev.of_node,
4193 "qcom,display-id", &len);
4194 if (!data || len <= 0)
4195 pr_err("%s:%d Unable to read qcom,display-id, data=%pK,len=%d\n",
4196 __func__, __LINE__, data, len);
4197 else
4198 snprintf(ctrl_pdata->panel_data.panel_info.display_id,
4199 MDSS_DISPLAY_ID_MAX_LEN, "%s", data);
4200
4201 return 0;
4202
4203
4204}
4205
4206static int mdss_dsi_parse_gpio_params(struct platform_device *ctrl_pdev,
4207 struct mdss_dsi_ctrl_pdata *ctrl_pdata)
4208{
4209 struct mdss_panel_info *pinfo = &(ctrl_pdata->panel_data.panel_info);
4210 struct mdss_panel_data *pdata = &ctrl_pdata->panel_data;
4211
4212 /*
4213 * If disp_en_gpio has been set previously (disp_en_gpio > 0)
4214 * while parsing the panel node, then do not override it
4215 */
4216 if (ctrl_pdata->disp_en_gpio <= 0) {
4217 ctrl_pdata->disp_en_gpio = of_get_named_gpio(
4218 ctrl_pdev->dev.of_node,
4219 "qcom,platform-enable-gpio", 0);
4220
4221 if (!gpio_is_valid(ctrl_pdata->disp_en_gpio))
4222 pr_debug("%s:%d, Disp_en gpio not specified\n",
4223 __func__, __LINE__);
Arun kumarec570b72018-05-09 20:23:38 +05304224 pdata->panel_en_gpio = ctrl_pdata->disp_en_gpio;
Sachin Bhayareeeb88892018-01-02 16:36:01 +05304225 }
4226
4227 ctrl_pdata->disp_te_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,
4228 "qcom,platform-te-gpio", 0);
4229
4230 if (!gpio_is_valid(ctrl_pdata->disp_te_gpio))
4231 pr_err("%s:%d, TE gpio not specified\n",
4232 __func__, __LINE__);
4233 pdata->panel_te_gpio = ctrl_pdata->disp_te_gpio;
4234
4235 ctrl_pdata->bklt_en_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,
4236 "qcom,platform-bklight-en-gpio", 0);
4237 if (!gpio_is_valid(ctrl_pdata->bklt_en_gpio))
4238 pr_info("%s: bklt_en gpio not specified\n", __func__);
4239
Yahui Wang12a6d372016-12-12 22:43:20 +08004240 ctrl_pdata->bklt_en_gpio_invert =
4241 of_property_read_bool(ctrl_pdev->dev.of_node,
4242 "qcom,platform-bklight-en-gpio-invert");
4243
Narender Ankam4fcd6892018-06-11 13:09:00 +05304244 ctrl_pdata->vdd_ext_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,
4245 "qcom,ext-vdd-gpio", 0);
4246 if (!gpio_is_valid(ctrl_pdata->vdd_ext_gpio))
4247 pr_info("%s: ext vdd gpio not specified\n", __func__);
4248
Sachin Bhayareeeb88892018-01-02 16:36:01 +05304249 ctrl_pdata->rst_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,
4250 "qcom,platform-reset-gpio", 0);
4251 if (!gpio_is_valid(ctrl_pdata->rst_gpio))
4252 pr_err("%s:%d, reset gpio not specified\n",
4253 __func__, __LINE__);
4254
4255 if (pinfo->mode_gpio_state != MODE_GPIO_NOT_VALID) {
4256
4257 ctrl_pdata->mode_gpio = of_get_named_gpio(
4258 ctrl_pdev->dev.of_node,
4259 "qcom,platform-mode-gpio", 0);
4260 if (!gpio_is_valid(ctrl_pdata->mode_gpio))
4261 pr_info("%s:%d, mode gpio not specified\n",
4262 __func__, __LINE__);
4263 } else {
4264 ctrl_pdata->mode_gpio = -EINVAL;
4265 }
4266
4267 ctrl_pdata->intf_mux_gpio = of_get_named_gpio(ctrl_pdev->dev.of_node,
4268 "qcom,platform-intf-mux-gpio", 0);
4269 if (!gpio_is_valid(ctrl_pdata->intf_mux_gpio))
4270 pr_debug("%s:%d, intf mux gpio not specified\n",
4271 __func__, __LINE__);
4272
4273 return 0;
4274}
4275
4276static void mdss_dsi_set_prim_panel(struct mdss_dsi_ctrl_pdata *ctrl_pdata)
4277{
4278 struct mdss_dsi_ctrl_pdata *octrl = NULL;
4279 struct mdss_panel_info *pinfo;
4280
4281 pinfo = &ctrl_pdata->panel_data.panel_info;
4282
4283 /*
4284 * for Split and Single DSI case default is always primary
4285 * and for Dual dsi case below assumptions are made.
4286 * 1. DSI controller with bridge chip is always secondary
4287 * 2. When there is no brigde chip, DSI1 is secondary
4288 */
4289 pinfo->is_prim_panel = true;
4290 if (mdss_dsi_is_hw_config_dual(ctrl_pdata->shared_data)) {
4291 if (mdss_dsi_is_right_ctrl(ctrl_pdata)) {
4292 octrl = mdss_dsi_get_other_ctrl(ctrl_pdata);
4293 if (octrl && octrl->panel_data.panel_info.is_prim_panel)
4294 pinfo->is_prim_panel = false;
4295 else
4296 pinfo->is_prim_panel = true;
4297 }
4298 }
4299}
4300
4301int dsi_panel_device_register(struct platform_device *ctrl_pdev,
4302 struct device_node *pan_node, struct mdss_dsi_ctrl_pdata *ctrl_pdata)
4303{
4304 struct mipi_panel_info *mipi;
4305 int rc;
4306 struct dsi_shared_data *sdata;
4307 struct mdss_panel_info *pinfo = &(ctrl_pdata->panel_data.panel_info);
4308 struct resource *res;
4309 u64 clk_rate;
4310
4311 mipi = &(pinfo->mipi);
4312
4313 pinfo->type =
4314 ((mipi->mode == DSI_VIDEO_MODE)
4315 ? MIPI_VIDEO_PANEL : MIPI_CMD_PANEL);
4316
4317 rc = mdss_dsi_clk_div_config(pinfo, mipi->frame_rate);
4318 if (rc) {
4319 pr_err("%s: unable to initialize the clk dividers\n", __func__);
4320 return rc;
4321 }
4322 ctrl_pdata->pclk_rate = mipi->dsi_pclk_rate;
4323 clk_rate = pinfo->clk_rate;
4324 do_div(clk_rate, 8U);
4325 ctrl_pdata->byte_clk_rate = (u32)clk_rate;
4326 pr_debug("%s: pclk=%d, bclk=%d\n", __func__,
4327 ctrl_pdata->pclk_rate, ctrl_pdata->byte_clk_rate);
4328
4329
4330 rc = mdss_dsi_get_dt_vreg_data(&ctrl_pdev->dev, pan_node,
4331 &ctrl_pdata->panel_power_data, DSI_PANEL_PM);
4332 if (rc) {
4333 DEV_ERR("%s: '%s' get_dt_vreg_data failed.rc=%d\n",
4334 __func__, __mdss_dsi_pm_name(DSI_PANEL_PM), rc);
4335 return rc;
4336 }
4337
Sachin Bhayare5076e252018-01-18 14:56:45 +05304338 rc = msm_mdss_config_vreg(&ctrl_pdev->dev,
Sachin Bhayareeeb88892018-01-02 16:36:01 +05304339 ctrl_pdata->panel_power_data.vreg_config,
4340 ctrl_pdata->panel_power_data.num_vreg, 1);
4341 if (rc) {
4342 pr_err("%s: failed to init regulator, rc=%d\n",
4343 __func__, rc);
4344 return rc;
4345 }
4346
4347 rc = mdss_dsi_parse_ctrl_params(ctrl_pdev, pan_node, ctrl_pdata);
4348 if (rc) {
4349 pr_err("%s: failed to parse ctrl settings, rc=%d\n",
4350 __func__, rc);
4351 return rc;
4352 }
4353
4354 pinfo->panel_max_fps = mdss_panel_get_framerate(pinfo,
4355 FPS_RESOLUTION_HZ);
4356 pinfo->panel_max_vtotal = mdss_panel_get_vtotal(pinfo);
4357
4358 rc = mdss_dsi_parse_gpio_params(ctrl_pdev, ctrl_pdata);
4359 if (rc) {
4360 pr_err("%s: failed to parse gpio params, rc=%d\n",
4361 __func__, rc);
4362 return rc;
4363 }
4364
4365 if (mdss_dsi_retrieve_ctrl_resources(ctrl_pdev,
4366 pinfo->pdest,
4367 ctrl_pdata)) {
4368 pr_err("%s: unable to get Dsi controller res\n", __func__);
4369 return -EPERM;
4370 }
4371
4372 ctrl_pdata->panel_data.event_handler = mdss_dsi_event_handler;
4373 ctrl_pdata->panel_data.get_fb_node = mdss_dsi_get_fb_node_cb;
4374
4375 if (ctrl_pdata->status_mode == ESD_REG ||
4376 ctrl_pdata->status_mode == ESD_REG_NT35596)
4377 ctrl_pdata->check_status = mdss_dsi_reg_status_check;
4378 else if (ctrl_pdata->status_mode == ESD_BTA)
4379 ctrl_pdata->check_status = mdss_dsi_bta_status_check;
4380
4381 if (ctrl_pdata->status_mode == ESD_MAX) {
4382 pr_err("%s: Using default BTA for ESD check\n", __func__);
4383 ctrl_pdata->check_status = mdss_dsi_bta_status_check;
4384 }
4385 if (ctrl_pdata->bklt_ctrl == BL_PWM)
4386 mdss_dsi_panel_pwm_cfg(ctrl_pdata);
4387
4388 mdss_dsi_ctrl_init(&ctrl_pdev->dev, ctrl_pdata);
4389 mdss_dsi_set_prim_panel(ctrl_pdata);
4390
4391 ctrl_pdata->dsi_irq_line = of_property_read_bool(
4392 ctrl_pdev->dev.of_node, "qcom,dsi-irq-line");
4393
4394 if (ctrl_pdata->dsi_irq_line) {
4395 /* DSI has it's own irq line */
4396 res = platform_get_resource(ctrl_pdev, IORESOURCE_IRQ, 0);
4397 if (!res || res->start == 0) {
4398 pr_err("%s:%d unable to get the MDSS irq resources\n",
4399 __func__, __LINE__);
4400 return -ENODEV;
4401 }
4402 rc = mdss_dsi_irq_init(&ctrl_pdev->dev, res->start, ctrl_pdata);
4403 if (rc) {
4404 dev_err(&ctrl_pdev->dev, "%s: failed to init irq\n",
4405 __func__);
4406 return rc;
4407 }
4408 }
4409 ctrl_pdata->ctrl_state = CTRL_STATE_UNKNOWN;
4410
4411 /*
4412 * If ULPS during suspend is enabled, add an extra vote for the
4413 * DSI CTRL power module. This keeps the regulator always enabled.
4414 * This is needed for the DSI PHY to maintain ULPS state during
4415 * suspend also.
4416 */
4417 sdata = ctrl_pdata->shared_data;
4418
4419 if (pinfo->ulps_suspend_enabled) {
Sachin Bhayare5076e252018-01-18 14:56:45 +05304420 rc = msm_mdss_enable_vreg(
Sachin Bhayareeeb88892018-01-02 16:36:01 +05304421 sdata->power_data[DSI_PHY_PM].vreg_config,
4422 sdata->power_data[DSI_PHY_PM].num_vreg, 1);
4423 if (rc) {
4424 pr_err("%s: failed to enable vregs for DSI_CTRL_PM\n",
4425 __func__);
4426 return rc;
4427 }
4428 }
4429
4430 pinfo->cont_splash_enabled =
4431 ctrl_pdata->mdss_util->panel_intf_status(pinfo->pdest,
4432 MDSS_PANEL_INTF_DSI) ? true : false;
4433
4434 pr_info("%s: Continuous splash %s\n", __func__,
4435 pinfo->cont_splash_enabled ? "enabled" : "disabled");
4436
4437 rc = mdss_register_panel(ctrl_pdev, &(ctrl_pdata->panel_data));
4438 if (rc) {
4439 pr_err("%s: unable to register MIPI DSI panel\n", __func__);
4440 return rc;
4441 }
4442
4443 if (pinfo->pdest == DISPLAY_1) {
4444 mdss_debug_register_io("dsi0_ctrl", &ctrl_pdata->ctrl_io, NULL);
4445 mdss_debug_register_io("dsi0_phy", &ctrl_pdata->phy_io, NULL);
4446 if (ctrl_pdata->phy_regulator_io.len)
4447 mdss_debug_register_io("dsi0_phy_regulator",
4448 &ctrl_pdata->phy_regulator_io, NULL);
4449 } else {
4450 mdss_debug_register_io("dsi1_ctrl", &ctrl_pdata->ctrl_io, NULL);
4451 mdss_debug_register_io("dsi1_phy", &ctrl_pdata->phy_io, NULL);
4452 if (ctrl_pdata->phy_regulator_io.len)
4453 mdss_debug_register_io("dsi1_phy_regulator",
4454 &ctrl_pdata->phy_regulator_io, NULL);
4455 }
4456
4457 panel_debug_register_base("panel",
4458 ctrl_pdata->ctrl_base, ctrl_pdata->reg_size);
4459
4460 pr_debug("%s: Panel data initialized\n", __func__);
4461 return 0;
4462}
4463
4464static const struct of_device_id mdss_dsi_dt_match[] = {
4465 {.compatible = "qcom,mdss-dsi"},
4466 {}
4467};
4468MODULE_DEVICE_TABLE(of, mdss_dsi_dt_match);
4469
4470static struct platform_driver mdss_dsi_driver = {
4471 .probe = mdss_dsi_probe,
4472 .remove = mdss_dsi_remove,
4473 .shutdown = NULL,
4474 .driver = {
4475 .name = "mdss_dsi",
4476 .of_match_table = mdss_dsi_dt_match,
4477 },
4478};
4479
4480static struct platform_driver mdss_dsi_ctrl_driver = {
4481 .probe = mdss_dsi_ctrl_probe,
4482 .remove = mdss_dsi_ctrl_remove,
4483 .shutdown = NULL,
4484 .driver = {
4485 .name = "mdss_dsi_ctrl",
4486 .of_match_table = mdss_dsi_ctrl_dt_match,
4487 },
4488};
4489
4490static int mdss_dsi_register_driver(void)
4491{
4492 return platform_driver_register(&mdss_dsi_driver);
4493}
4494
4495static int __init mdss_dsi_driver_init(void)
4496{
4497 int ret;
4498
4499 ret = mdss_dsi_register_driver();
4500 if (ret) {
4501 pr_err("mdss_dsi_register_driver() failed!\n");
4502 return ret;
4503 }
4504
4505 return ret;
4506}
4507module_init(mdss_dsi_driver_init);
4508
4509
4510static int mdss_dsi_ctrl_register_driver(void)
4511{
4512 return platform_driver_register(&mdss_dsi_ctrl_driver);
4513}
4514
4515static int __init mdss_dsi_ctrl_driver_init(void)
4516{
4517 int ret;
4518
4519 ret = mdss_dsi_ctrl_register_driver();
4520 if (ret) {
4521 pr_err("mdss_dsi_ctrl_register_driver() failed!\n");
4522 return ret;
4523 }
4524
4525 return ret;
4526}
4527module_init(mdss_dsi_ctrl_driver_init);
4528
4529static void __exit mdss_dsi_driver_cleanup(void)
4530{
4531 platform_driver_unregister(&mdss_dsi_ctrl_driver);
4532}
4533module_exit(mdss_dsi_driver_cleanup);
4534
4535MODULE_LICENSE("GPL v2");
4536MODULE_DESCRIPTION("DSI controller driver");