blob: 5e38d158089b0aa8e822568e156d2e2310978904 [file] [log] [blame]
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001/*
2 * Samsung SoC MIPI DSI Master driver.
3 *
4 * Copyright (c) 2014 Samsung Electronics Co., Ltd
5 *
6 * Contacts: Tomasz Figa <t.figa@samsung.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11*/
12
13#include <drm/drmP.h>
14#include <drm/drm_crtc_helper.h>
15#include <drm/drm_mipi_dsi.h>
16#include <drm/drm_panel.h>
17
18#include <linux/clk.h>
YoungJun Choe17ddec2014-07-22 19:49:44 +090019#include <linux/gpio/consumer.h>
Andrzej Hajda7eb8f062014-04-04 01:19:56 +090020#include <linux/irq.h>
YoungJun Cho9a320412014-07-17 18:01:23 +090021#include <linux/of_device.h>
YoungJun Choe17ddec2014-07-22 19:49:44 +090022#include <linux/of_gpio.h>
Andrzej Hajda7eb8f062014-04-04 01:19:56 +090023#include <linux/phy/phy.h>
24#include <linux/regulator/consumer.h>
Inki Daef37cd5e2014-05-09 14:25:20 +090025#include <linux/component.h>
Andrzej Hajda7eb8f062014-04-04 01:19:56 +090026
27#include <video/mipi_display.h>
28#include <video/videomode.h>
29
YoungJun Choe17ddec2014-07-22 19:49:44 +090030#include "exynos_drm_crtc.h"
Andrzej Hajda7eb8f062014-04-04 01:19:56 +090031#include "exynos_drm_drv.h"
32
33/* returns true iff both arguments logically differs */
34#define NEQV(a, b) (!(a) ^ !(b))
35
36#define DSIM_STATUS_REG 0x0 /* Status register */
37#define DSIM_SWRST_REG 0x4 /* Software reset register */
38#define DSIM_CLKCTRL_REG 0x8 /* Clock control register */
39#define DSIM_TIMEOUT_REG 0xc /* Time out register */
40#define DSIM_CONFIG_REG 0x10 /* Configuration register */
41#define DSIM_ESCMODE_REG 0x14 /* Escape mode register */
42
43/* Main display image resolution register */
44#define DSIM_MDRESOL_REG 0x18
45#define DSIM_MVPORCH_REG 0x1c /* Main display Vporch register */
46#define DSIM_MHPORCH_REG 0x20 /* Main display Hporch register */
47#define DSIM_MSYNC_REG 0x24 /* Main display sync area register */
48
49/* Sub display image resolution register */
50#define DSIM_SDRESOL_REG 0x28
51#define DSIM_INTSRC_REG 0x2c /* Interrupt source register */
52#define DSIM_INTMSK_REG 0x30 /* Interrupt mask register */
53#define DSIM_PKTHDR_REG 0x34 /* Packet Header FIFO register */
54#define DSIM_PAYLOAD_REG 0x38 /* Payload FIFO register */
55#define DSIM_RXFIFO_REG 0x3c /* Read FIFO register */
56#define DSIM_FIFOTHLD_REG 0x40 /* FIFO threshold level register */
57#define DSIM_FIFOCTRL_REG 0x44 /* FIFO status and control register */
58
59/* FIFO memory AC characteristic register */
60#define DSIM_PLLCTRL_REG 0x4c /* PLL control register */
Andrzej Hajda7eb8f062014-04-04 01:19:56 +090061#define DSIM_PHYACCHR_REG 0x54 /* D-PHY AC characteristic register */
62#define DSIM_PHYACCHR1_REG 0x58 /* D-PHY AC characteristic register1 */
YoungJun Cho9a320412014-07-17 18:01:23 +090063#define DSIM_PHYCTRL_REG 0x5c
64#define DSIM_PHYTIMING_REG 0x64
65#define DSIM_PHYTIMING1_REG 0x68
66#define DSIM_PHYTIMING2_REG 0x6c
Andrzej Hajda7eb8f062014-04-04 01:19:56 +090067
68/* DSIM_STATUS */
69#define DSIM_STOP_STATE_DAT(x) (((x) & 0xf) << 0)
70#define DSIM_STOP_STATE_CLK (1 << 8)
71#define DSIM_TX_READY_HS_CLK (1 << 10)
72#define DSIM_PLL_STABLE (1 << 31)
73
74/* DSIM_SWRST */
75#define DSIM_FUNCRST (1 << 16)
76#define DSIM_SWRST (1 << 0)
77
78/* DSIM_TIMEOUT */
79#define DSIM_LPDR_TIMEOUT(x) ((x) << 0)
80#define DSIM_BTA_TIMEOUT(x) ((x) << 16)
81
82/* DSIM_CLKCTRL */
83#define DSIM_ESC_PRESCALER(x) (((x) & 0xffff) << 0)
84#define DSIM_ESC_PRESCALER_MASK (0xffff << 0)
85#define DSIM_LANE_ESC_CLK_EN_CLK (1 << 19)
86#define DSIM_LANE_ESC_CLK_EN_DATA(x) (((x) & 0xf) << 20)
87#define DSIM_LANE_ESC_CLK_EN_DATA_MASK (0xf << 20)
88#define DSIM_BYTE_CLKEN (1 << 24)
89#define DSIM_BYTE_CLK_SRC(x) (((x) & 0x3) << 25)
90#define DSIM_BYTE_CLK_SRC_MASK (0x3 << 25)
91#define DSIM_PLL_BYPASS (1 << 27)
92#define DSIM_ESC_CLKEN (1 << 28)
93#define DSIM_TX_REQUEST_HSCLK (1 << 31)
94
95/* DSIM_CONFIG */
96#define DSIM_LANE_EN_CLK (1 << 0)
97#define DSIM_LANE_EN(x) (((x) & 0xf) << 1)
98#define DSIM_NUM_OF_DATA_LANE(x) (((x) & 0x3) << 5)
99#define DSIM_SUB_PIX_FORMAT(x) (((x) & 0x7) << 8)
100#define DSIM_MAIN_PIX_FORMAT_MASK (0x7 << 12)
101#define DSIM_MAIN_PIX_FORMAT_RGB888 (0x7 << 12)
102#define DSIM_MAIN_PIX_FORMAT_RGB666 (0x6 << 12)
103#define DSIM_MAIN_PIX_FORMAT_RGB666_P (0x5 << 12)
104#define DSIM_MAIN_PIX_FORMAT_RGB565 (0x4 << 12)
105#define DSIM_SUB_VC (((x) & 0x3) << 16)
106#define DSIM_MAIN_VC (((x) & 0x3) << 18)
107#define DSIM_HSA_MODE (1 << 20)
108#define DSIM_HBP_MODE (1 << 21)
109#define DSIM_HFP_MODE (1 << 22)
110#define DSIM_HSE_MODE (1 << 23)
111#define DSIM_AUTO_MODE (1 << 24)
112#define DSIM_VIDEO_MODE (1 << 25)
113#define DSIM_BURST_MODE (1 << 26)
114#define DSIM_SYNC_INFORM (1 << 27)
115#define DSIM_EOT_DISABLE (1 << 28)
116#define DSIM_MFLUSH_VS (1 << 29)
Inki Dae78d3a8c2014-08-13 17:03:12 +0900117/* This flag is valid only for exynos3250/3472/4415/5260/5430 */
118#define DSIM_CLKLANE_STOP (1 << 30)
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900119
120/* DSIM_ESCMODE */
121#define DSIM_TX_TRIGGER_RST (1 << 4)
122#define DSIM_TX_LPDT_LP (1 << 6)
123#define DSIM_CMD_LPDT_LP (1 << 7)
124#define DSIM_FORCE_BTA (1 << 16)
125#define DSIM_FORCE_STOP_STATE (1 << 20)
126#define DSIM_STOP_STATE_CNT(x) (((x) & 0x7ff) << 21)
127#define DSIM_STOP_STATE_CNT_MASK (0x7ff << 21)
128
129/* DSIM_MDRESOL */
130#define DSIM_MAIN_STAND_BY (1 << 31)
131#define DSIM_MAIN_VRESOL(x) (((x) & 0x7ff) << 16)
132#define DSIM_MAIN_HRESOL(x) (((x) & 0X7ff) << 0)
133
134/* DSIM_MVPORCH */
135#define DSIM_CMD_ALLOW(x) ((x) << 28)
136#define DSIM_STABLE_VFP(x) ((x) << 16)
137#define DSIM_MAIN_VBP(x) ((x) << 0)
138#define DSIM_CMD_ALLOW_MASK (0xf << 28)
139#define DSIM_STABLE_VFP_MASK (0x7ff << 16)
140#define DSIM_MAIN_VBP_MASK (0x7ff << 0)
141
142/* DSIM_MHPORCH */
143#define DSIM_MAIN_HFP(x) ((x) << 16)
144#define DSIM_MAIN_HBP(x) ((x) << 0)
145#define DSIM_MAIN_HFP_MASK ((0xffff) << 16)
146#define DSIM_MAIN_HBP_MASK ((0xffff) << 0)
147
148/* DSIM_MSYNC */
149#define DSIM_MAIN_VSA(x) ((x) << 22)
150#define DSIM_MAIN_HSA(x) ((x) << 0)
151#define DSIM_MAIN_VSA_MASK ((0x3ff) << 22)
152#define DSIM_MAIN_HSA_MASK ((0xffff) << 0)
153
154/* DSIM_SDRESOL */
155#define DSIM_SUB_STANDY(x) ((x) << 31)
156#define DSIM_SUB_VRESOL(x) ((x) << 16)
157#define DSIM_SUB_HRESOL(x) ((x) << 0)
158#define DSIM_SUB_STANDY_MASK ((0x1) << 31)
159#define DSIM_SUB_VRESOL_MASK ((0x7ff) << 16)
160#define DSIM_SUB_HRESOL_MASK ((0x7ff) << 0)
161
162/* DSIM_INTSRC */
163#define DSIM_INT_PLL_STABLE (1 << 31)
164#define DSIM_INT_SW_RST_RELEASE (1 << 30)
165#define DSIM_INT_SFR_FIFO_EMPTY (1 << 29)
166#define DSIM_INT_BTA (1 << 25)
167#define DSIM_INT_FRAME_DONE (1 << 24)
168#define DSIM_INT_RX_TIMEOUT (1 << 21)
169#define DSIM_INT_BTA_TIMEOUT (1 << 20)
170#define DSIM_INT_RX_DONE (1 << 18)
171#define DSIM_INT_RX_TE (1 << 17)
172#define DSIM_INT_RX_ACK (1 << 16)
173#define DSIM_INT_RX_ECC_ERR (1 << 15)
174#define DSIM_INT_RX_CRC_ERR (1 << 14)
175
176/* DSIM_FIFOCTRL */
177#define DSIM_RX_DATA_FULL (1 << 25)
178#define DSIM_RX_DATA_EMPTY (1 << 24)
179#define DSIM_SFR_HEADER_FULL (1 << 23)
180#define DSIM_SFR_HEADER_EMPTY (1 << 22)
181#define DSIM_SFR_PAYLOAD_FULL (1 << 21)
182#define DSIM_SFR_PAYLOAD_EMPTY (1 << 20)
183#define DSIM_I80_HEADER_FULL (1 << 19)
184#define DSIM_I80_HEADER_EMPTY (1 << 18)
185#define DSIM_I80_PAYLOAD_FULL (1 << 17)
186#define DSIM_I80_PAYLOAD_EMPTY (1 << 16)
187#define DSIM_SD_HEADER_FULL (1 << 15)
188#define DSIM_SD_HEADER_EMPTY (1 << 14)
189#define DSIM_SD_PAYLOAD_FULL (1 << 13)
190#define DSIM_SD_PAYLOAD_EMPTY (1 << 12)
191#define DSIM_MD_HEADER_FULL (1 << 11)
192#define DSIM_MD_HEADER_EMPTY (1 << 10)
193#define DSIM_MD_PAYLOAD_FULL (1 << 9)
194#define DSIM_MD_PAYLOAD_EMPTY (1 << 8)
195#define DSIM_RX_FIFO (1 << 4)
196#define DSIM_SFR_FIFO (1 << 3)
197#define DSIM_I80_FIFO (1 << 2)
198#define DSIM_SD_FIFO (1 << 1)
199#define DSIM_MD_FIFO (1 << 0)
200
201/* DSIM_PHYACCHR */
202#define DSIM_AFC_EN (1 << 14)
203#define DSIM_AFC_CTL(x) (((x) & 0x7) << 5)
204
205/* DSIM_PLLCTRL */
206#define DSIM_FREQ_BAND(x) ((x) << 24)
207#define DSIM_PLL_EN (1 << 23)
208#define DSIM_PLL_P(x) ((x) << 13)
209#define DSIM_PLL_M(x) ((x) << 4)
210#define DSIM_PLL_S(x) ((x) << 1)
211
YoungJun Cho9a320412014-07-17 18:01:23 +0900212/* DSIM_PHYCTRL */
213#define DSIM_PHYCTRL_ULPS_EXIT(x) (((x) & 0x1ff) << 0)
214
215/* DSIM_PHYTIMING */
216#define DSIM_PHYTIMING_LPX(x) ((x) << 8)
217#define DSIM_PHYTIMING_HS_EXIT(x) ((x) << 0)
218
219/* DSIM_PHYTIMING1 */
220#define DSIM_PHYTIMING1_CLK_PREPARE(x) ((x) << 24)
221#define DSIM_PHYTIMING1_CLK_ZERO(x) ((x) << 16)
222#define DSIM_PHYTIMING1_CLK_POST(x) ((x) << 8)
223#define DSIM_PHYTIMING1_CLK_TRAIL(x) ((x) << 0)
224
225/* DSIM_PHYTIMING2 */
226#define DSIM_PHYTIMING2_HS_PREPARE(x) ((x) << 16)
227#define DSIM_PHYTIMING2_HS_ZERO(x) ((x) << 8)
228#define DSIM_PHYTIMING2_HS_TRAIL(x) ((x) << 0)
229
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900230#define DSI_MAX_BUS_WIDTH 4
231#define DSI_NUM_VIRTUAL_CHANNELS 4
232#define DSI_TX_FIFO_SIZE 2048
233#define DSI_RX_FIFO_SIZE 256
234#define DSI_XFER_TIMEOUT_MS 100
235#define DSI_RX_FIFO_EMPTY 0x30800002
236
237enum exynos_dsi_transfer_type {
238 EXYNOS_DSI_TX,
239 EXYNOS_DSI_RX,
240};
241
242struct exynos_dsi_transfer {
243 struct list_head list;
244 struct completion completed;
245 int result;
246 u8 data_id;
247 u8 data[2];
248 u16 flags;
249
250 const u8 *tx_payload;
251 u16 tx_len;
252 u16 tx_done;
253
254 u8 *rx_payload;
255 u16 rx_len;
256 u16 rx_done;
257};
258
259#define DSIM_STATE_ENABLED BIT(0)
260#define DSIM_STATE_INITIALIZED BIT(1)
261#define DSIM_STATE_CMD_LPM BIT(2)
262
YoungJun Cho9a320412014-07-17 18:01:23 +0900263struct exynos_dsi_driver_data {
264 unsigned int plltmr_reg;
265
266 unsigned int has_freqband:1;
Inki Dae78d3a8c2014-08-13 17:03:12 +0900267 unsigned int has_clklane_stop:1;
YoungJun Cho9a320412014-07-17 18:01:23 +0900268};
269
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900270struct exynos_dsi {
Andrzej Hajda2900c692014-10-07 14:01:08 +0200271 struct exynos_drm_display display;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900272 struct mipi_dsi_host dsi_host;
273 struct drm_connector connector;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900274 struct device_node *panel_node;
275 struct drm_panel *panel;
276 struct device *dev;
277
278 void __iomem *reg_base;
279 struct phy *phy;
280 struct clk *pll_clk;
281 struct clk *bus_clk;
282 struct regulator_bulk_data supplies[2];
283 int irq;
YoungJun Choe17ddec2014-07-22 19:49:44 +0900284 int te_gpio;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900285
286 u32 pll_clk_rate;
287 u32 burst_clk_rate;
288 u32 esc_clk_rate;
289 u32 lanes;
290 u32 mode_flags;
291 u32 format;
292 struct videomode vm;
293
294 int state;
295 struct drm_property *brightness;
296 struct completion completed;
297
298 spinlock_t transfer_lock; /* protects transfer_list */
299 struct list_head transfer_list;
YoungJun Cho9a320412014-07-17 18:01:23 +0900300
301 struct exynos_dsi_driver_data *driver_data;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900302};
303
304#define host_to_dsi(host) container_of(host, struct exynos_dsi, dsi_host)
305#define connector_to_dsi(c) container_of(c, struct exynos_dsi, connector)
306
Andrzej Hajda5cd5db82014-10-07 14:01:11 +0200307static inline struct exynos_dsi *display_to_dsi(struct exynos_drm_display *d)
308{
309 return container_of(d, struct exynos_dsi, display);
310}
311
Inki Dae473462a2014-08-13 17:09:12 +0900312static struct exynos_dsi_driver_data exynos3_dsi_driver_data = {
313 .plltmr_reg = 0x50,
314 .has_freqband = 1,
315 .has_clklane_stop = 1,
316};
317
YoungJun Cho9a320412014-07-17 18:01:23 +0900318static struct exynos_dsi_driver_data exynos4_dsi_driver_data = {
319 .plltmr_reg = 0x50,
320 .has_freqband = 1,
Inki Dae78d3a8c2014-08-13 17:03:12 +0900321 .has_clklane_stop = 1,
YoungJun Cho9a320412014-07-17 18:01:23 +0900322};
323
324static struct exynos_dsi_driver_data exynos5_dsi_driver_data = {
325 .plltmr_reg = 0x58,
326};
327
328static struct of_device_id exynos_dsi_of_match[] = {
Inki Dae473462a2014-08-13 17:09:12 +0900329 { .compatible = "samsung,exynos3250-mipi-dsi",
330 .data = &exynos3_dsi_driver_data },
YoungJun Cho9a320412014-07-17 18:01:23 +0900331 { .compatible = "samsung,exynos4210-mipi-dsi",
332 .data = &exynos4_dsi_driver_data },
333 { .compatible = "samsung,exynos5410-mipi-dsi",
334 .data = &exynos5_dsi_driver_data },
335 { }
336};
337
338static inline struct exynos_dsi_driver_data *exynos_dsi_get_driver_data(
339 struct platform_device *pdev)
340{
341 const struct of_device_id *of_id =
342 of_match_device(exynos_dsi_of_match, &pdev->dev);
343
344 return (struct exynos_dsi_driver_data *)of_id->data;
345}
346
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900347static void exynos_dsi_wait_for_reset(struct exynos_dsi *dsi)
348{
349 if (wait_for_completion_timeout(&dsi->completed, msecs_to_jiffies(300)))
350 return;
351
352 dev_err(dsi->dev, "timeout waiting for reset\n");
353}
354
355static void exynos_dsi_reset(struct exynos_dsi *dsi)
356{
357 reinit_completion(&dsi->completed);
358 writel(DSIM_SWRST, dsi->reg_base + DSIM_SWRST_REG);
359}
360
361#ifndef MHZ
362#define MHZ (1000*1000)
363#endif
364
365static unsigned long exynos_dsi_pll_find_pms(struct exynos_dsi *dsi,
366 unsigned long fin, unsigned long fout, u8 *p, u16 *m, u8 *s)
367{
368 unsigned long best_freq = 0;
369 u32 min_delta = 0xffffffff;
370 u8 p_min, p_max;
371 u8 _p, uninitialized_var(best_p);
372 u16 _m, uninitialized_var(best_m);
373 u8 _s, uninitialized_var(best_s);
374
375 p_min = DIV_ROUND_UP(fin, (12 * MHZ));
376 p_max = fin / (6 * MHZ);
377
378 for (_p = p_min; _p <= p_max; ++_p) {
379 for (_s = 0; _s <= 5; ++_s) {
380 u64 tmp;
381 u32 delta;
382
383 tmp = (u64)fout * (_p << _s);
384 do_div(tmp, fin);
385 _m = tmp;
386 if (_m < 41 || _m > 125)
387 continue;
388
389 tmp = (u64)_m * fin;
390 do_div(tmp, _p);
391 if (tmp < 500 * MHZ || tmp > 1000 * MHZ)
392 continue;
393
394 tmp = (u64)_m * fin;
395 do_div(tmp, _p << _s);
396
397 delta = abs(fout - tmp);
398 if (delta < min_delta) {
399 best_p = _p;
400 best_m = _m;
401 best_s = _s;
402 min_delta = delta;
403 best_freq = tmp;
404 }
405 }
406 }
407
408 if (best_freq) {
409 *p = best_p;
410 *m = best_m;
411 *s = best_s;
412 }
413
414 return best_freq;
415}
416
417static unsigned long exynos_dsi_set_pll(struct exynos_dsi *dsi,
418 unsigned long freq)
419{
YoungJun Cho9a320412014-07-17 18:01:23 +0900420 struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900421 unsigned long fin, fout;
YoungJun Cho9a320412014-07-17 18:01:23 +0900422 int timeout;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900423 u8 p, s;
424 u16 m;
425 u32 reg;
426
427 clk_set_rate(dsi->pll_clk, dsi->pll_clk_rate);
428
429 fin = clk_get_rate(dsi->pll_clk);
430 if (!fin) {
431 dev_err(dsi->dev, "failed to get PLL clock frequency\n");
432 return 0;
433 }
434
435 dev_dbg(dsi->dev, "PLL input frequency: %lu\n", fin);
436
437 fout = exynos_dsi_pll_find_pms(dsi, fin, freq, &p, &m, &s);
438 if (!fout) {
439 dev_err(dsi->dev,
440 "failed to find PLL PMS for requested frequency\n");
YoungJun Cho8525b5e2014-08-14 11:22:36 +0900441 return 0;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900442 }
YoungJun Cho9a320412014-07-17 18:01:23 +0900443 dev_dbg(dsi->dev, "PLL freq %lu, (p %d, m %d, s %d)\n", fout, p, m, s);
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900444
YoungJun Cho9a320412014-07-17 18:01:23 +0900445 writel(500, dsi->reg_base + driver_data->plltmr_reg);
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900446
YoungJun Cho9a320412014-07-17 18:01:23 +0900447 reg = DSIM_PLL_EN | DSIM_PLL_P(p) | DSIM_PLL_M(m) | DSIM_PLL_S(s);
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900448
YoungJun Cho9a320412014-07-17 18:01:23 +0900449 if (driver_data->has_freqband) {
450 static const unsigned long freq_bands[] = {
451 100 * MHZ, 120 * MHZ, 160 * MHZ, 200 * MHZ,
452 270 * MHZ, 320 * MHZ, 390 * MHZ, 450 * MHZ,
453 510 * MHZ, 560 * MHZ, 640 * MHZ, 690 * MHZ,
454 770 * MHZ, 870 * MHZ, 950 * MHZ,
455 };
456 int band;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900457
YoungJun Cho9a320412014-07-17 18:01:23 +0900458 for (band = 0; band < ARRAY_SIZE(freq_bands); ++band)
459 if (fout < freq_bands[band])
460 break;
461
462 dev_dbg(dsi->dev, "band %d\n", band);
463
464 reg |= DSIM_FREQ_BAND(band);
465 }
466
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900467 writel(reg, dsi->reg_base + DSIM_PLLCTRL_REG);
468
469 timeout = 1000;
470 do {
471 if (timeout-- == 0) {
472 dev_err(dsi->dev, "PLL failed to stabilize\n");
YoungJun Cho8525b5e2014-08-14 11:22:36 +0900473 return 0;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900474 }
475 reg = readl(dsi->reg_base + DSIM_STATUS_REG);
476 } while ((reg & DSIM_PLL_STABLE) == 0);
477
478 return fout;
479}
480
481static int exynos_dsi_enable_clock(struct exynos_dsi *dsi)
482{
483 unsigned long hs_clk, byte_clk, esc_clk;
484 unsigned long esc_div;
485 u32 reg;
486
487 hs_clk = exynos_dsi_set_pll(dsi, dsi->burst_clk_rate);
488 if (!hs_clk) {
489 dev_err(dsi->dev, "failed to configure DSI PLL\n");
490 return -EFAULT;
491 }
492
493 byte_clk = hs_clk / 8;
494 esc_div = DIV_ROUND_UP(byte_clk, dsi->esc_clk_rate);
495 esc_clk = byte_clk / esc_div;
496
497 if (esc_clk > 20 * MHZ) {
498 ++esc_div;
499 esc_clk = byte_clk / esc_div;
500 }
501
502 dev_dbg(dsi->dev, "hs_clk = %lu, byte_clk = %lu, esc_clk = %lu\n",
503 hs_clk, byte_clk, esc_clk);
504
505 reg = readl(dsi->reg_base + DSIM_CLKCTRL_REG);
506 reg &= ~(DSIM_ESC_PRESCALER_MASK | DSIM_LANE_ESC_CLK_EN_CLK
507 | DSIM_LANE_ESC_CLK_EN_DATA_MASK | DSIM_PLL_BYPASS
508 | DSIM_BYTE_CLK_SRC_MASK);
509 reg |= DSIM_ESC_CLKEN | DSIM_BYTE_CLKEN
510 | DSIM_ESC_PRESCALER(esc_div)
511 | DSIM_LANE_ESC_CLK_EN_CLK
512 | DSIM_LANE_ESC_CLK_EN_DATA(BIT(dsi->lanes) - 1)
513 | DSIM_BYTE_CLK_SRC(0)
514 | DSIM_TX_REQUEST_HSCLK;
515 writel(reg, dsi->reg_base + DSIM_CLKCTRL_REG);
516
517 return 0;
518}
519
YoungJun Cho9a320412014-07-17 18:01:23 +0900520static void exynos_dsi_set_phy_ctrl(struct exynos_dsi *dsi)
521{
522 struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
523 u32 reg;
524
525 if (driver_data->has_freqband)
526 return;
527
528 /* B D-PHY: D-PHY Master & Slave Analog Block control */
529 reg = DSIM_PHYCTRL_ULPS_EXIT(0x0af);
530 writel(reg, dsi->reg_base + DSIM_PHYCTRL_REG);
531
532 /*
533 * T LPX: Transmitted length of any Low-Power state period
534 * T HS-EXIT: Time that the transmitter drives LP-11 following a HS
535 * burst
536 */
537 reg = DSIM_PHYTIMING_LPX(0x06) | DSIM_PHYTIMING_HS_EXIT(0x0b);
538 writel(reg, dsi->reg_base + DSIM_PHYTIMING_REG);
539
540 /*
541 * T CLK-PREPARE: Time that the transmitter drives the Clock Lane LP-00
542 * Line state immediately before the HS-0 Line state starting the
543 * HS transmission
544 * T CLK-ZERO: Time that the transmitter drives the HS-0 state prior to
545 * transmitting the Clock.
546 * T CLK_POST: Time that the transmitter continues to send HS clock
547 * after the last associated Data Lane has transitioned to LP Mode
548 * Interval is defined as the period from the end of T HS-TRAIL to
549 * the beginning of T CLK-TRAIL
550 * T CLK-TRAIL: Time that the transmitter drives the HS-0 state after
551 * the last payload clock bit of a HS transmission burst
552 */
553 reg = DSIM_PHYTIMING1_CLK_PREPARE(0x07) |
554 DSIM_PHYTIMING1_CLK_ZERO(0x27) |
555 DSIM_PHYTIMING1_CLK_POST(0x0d) |
556 DSIM_PHYTIMING1_CLK_TRAIL(0x08);
557 writel(reg, dsi->reg_base + DSIM_PHYTIMING1_REG);
558
559 /*
560 * T HS-PREPARE: Time that the transmitter drives the Data Lane LP-00
561 * Line state immediately before the HS-0 Line state starting the
562 * HS transmission
563 * T HS-ZERO: Time that the transmitter drives the HS-0 state prior to
564 * transmitting the Sync sequence.
565 * T HS-TRAIL: Time that the transmitter drives the flipped differential
566 * state after last payload data bit of a HS transmission burst
567 */
568 reg = DSIM_PHYTIMING2_HS_PREPARE(0x09) | DSIM_PHYTIMING2_HS_ZERO(0x0d) |
569 DSIM_PHYTIMING2_HS_TRAIL(0x0b);
570 writel(reg, dsi->reg_base + DSIM_PHYTIMING2_REG);
571}
572
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900573static void exynos_dsi_disable_clock(struct exynos_dsi *dsi)
574{
575 u32 reg;
576
577 reg = readl(dsi->reg_base + DSIM_CLKCTRL_REG);
578 reg &= ~(DSIM_LANE_ESC_CLK_EN_CLK | DSIM_LANE_ESC_CLK_EN_DATA_MASK
579 | DSIM_ESC_CLKEN | DSIM_BYTE_CLKEN);
580 writel(reg, dsi->reg_base + DSIM_CLKCTRL_REG);
581
582 reg = readl(dsi->reg_base + DSIM_PLLCTRL_REG);
583 reg &= ~DSIM_PLL_EN;
584 writel(reg, dsi->reg_base + DSIM_PLLCTRL_REG);
585}
586
587static int exynos_dsi_init_link(struct exynos_dsi *dsi)
588{
Inki Dae78d3a8c2014-08-13 17:03:12 +0900589 struct exynos_dsi_driver_data *driver_data = dsi->driver_data;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900590 int timeout;
591 u32 reg;
592 u32 lanes_mask;
593
594 /* Initialize FIFO pointers */
595 reg = readl(dsi->reg_base + DSIM_FIFOCTRL_REG);
596 reg &= ~0x1f;
597 writel(reg, dsi->reg_base + DSIM_FIFOCTRL_REG);
598
599 usleep_range(9000, 11000);
600
601 reg |= 0x1f;
602 writel(reg, dsi->reg_base + DSIM_FIFOCTRL_REG);
603
604 usleep_range(9000, 11000);
605
606 /* DSI configuration */
607 reg = 0;
608
YoungJun Cho2f36e332014-07-17 18:01:16 +0900609 /*
610 * The first bit of mode_flags specifies display configuration.
611 * If this bit is set[= MIPI_DSI_MODE_VIDEO], dsi will support video
612 * mode, otherwise it will support command mode.
613 */
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900614 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) {
615 reg |= DSIM_VIDEO_MODE;
616
YoungJun Cho2f36e332014-07-17 18:01:16 +0900617 /*
618 * The user manual describes that following bits are ignored in
619 * command mode.
620 */
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900621 if (!(dsi->mode_flags & MIPI_DSI_MODE_VSYNC_FLUSH))
622 reg |= DSIM_MFLUSH_VS;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900623 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_SYNC_PULSE)
624 reg |= DSIM_SYNC_INFORM;
625 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST)
626 reg |= DSIM_BURST_MODE;
627 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_AUTO_VERT)
628 reg |= DSIM_AUTO_MODE;
629 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HSE)
630 reg |= DSIM_HSE_MODE;
631 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HFP))
632 reg |= DSIM_HFP_MODE;
633 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HBP))
634 reg |= DSIM_HBP_MODE;
635 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO_HSA))
636 reg |= DSIM_HSA_MODE;
637 }
638
YoungJun Cho2f36e332014-07-17 18:01:16 +0900639 if (!(dsi->mode_flags & MIPI_DSI_MODE_EOT_PACKET))
640 reg |= DSIM_EOT_DISABLE;
641
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900642 switch (dsi->format) {
643 case MIPI_DSI_FMT_RGB888:
644 reg |= DSIM_MAIN_PIX_FORMAT_RGB888;
645 break;
646 case MIPI_DSI_FMT_RGB666:
647 reg |= DSIM_MAIN_PIX_FORMAT_RGB666;
648 break;
649 case MIPI_DSI_FMT_RGB666_PACKED:
650 reg |= DSIM_MAIN_PIX_FORMAT_RGB666_P;
651 break;
652 case MIPI_DSI_FMT_RGB565:
653 reg |= DSIM_MAIN_PIX_FORMAT_RGB565;
654 break;
655 default:
656 dev_err(dsi->dev, "invalid pixel format\n");
657 return -EINVAL;
658 }
659
660 reg |= DSIM_NUM_OF_DATA_LANE(dsi->lanes - 1);
661
662 writel(reg, dsi->reg_base + DSIM_CONFIG_REG);
663
664 reg |= DSIM_LANE_EN_CLK;
665 writel(reg, dsi->reg_base + DSIM_CONFIG_REG);
666
667 lanes_mask = BIT(dsi->lanes) - 1;
668 reg |= DSIM_LANE_EN(lanes_mask);
669 writel(reg, dsi->reg_base + DSIM_CONFIG_REG);
670
Inki Dae78d3a8c2014-08-13 17:03:12 +0900671 /*
672 * Use non-continuous clock mode if the periparal wants and
673 * host controller supports
674 *
675 * In non-continous clock mode, host controller will turn off
676 * the HS clock between high-speed transmissions to reduce
677 * power consumption.
678 */
679 if (driver_data->has_clklane_stop &&
680 dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) {
681 reg |= DSIM_CLKLANE_STOP;
682 writel(reg, dsi->reg_base + DSIM_CONFIG_REG);
683 }
684
Andrzej Hajda7eb8f062014-04-04 01:19:56 +0900685 /* Check clock and data lane state are stop state */
686 timeout = 100;
687 do {
688 if (timeout-- == 0) {
689 dev_err(dsi->dev, "waiting for bus lanes timed out\n");
690 return -EFAULT;
691 }
692
693 reg = readl(dsi->reg_base + DSIM_STATUS_REG);
694 if ((reg & DSIM_STOP_STATE_DAT(lanes_mask))
695 != DSIM_STOP_STATE_DAT(lanes_mask))
696 continue;
697 } while (!(reg & (DSIM_STOP_STATE_CLK | DSIM_TX_READY_HS_CLK)));
698
699 reg = readl(dsi->reg_base + DSIM_ESCMODE_REG);
700 reg &= ~DSIM_STOP_STATE_CNT_MASK;
701 reg |= DSIM_STOP_STATE_CNT(0xf);
702 writel(reg, dsi->reg_base + DSIM_ESCMODE_REG);
703
704 reg = DSIM_BTA_TIMEOUT(0xff) | DSIM_LPDR_TIMEOUT(0xffff);
705 writel(reg, dsi->reg_base + DSIM_TIMEOUT_REG);
706
707 return 0;
708}
709
710static void exynos_dsi_set_display_mode(struct exynos_dsi *dsi)
711{
712 struct videomode *vm = &dsi->vm;
713 u32 reg;
714
715 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) {
716 reg = DSIM_CMD_ALLOW(0xf)
717 | DSIM_STABLE_VFP(vm->vfront_porch)
718 | DSIM_MAIN_VBP(vm->vback_porch);
719 writel(reg, dsi->reg_base + DSIM_MVPORCH_REG);
720
721 reg = DSIM_MAIN_HFP(vm->hfront_porch)
722 | DSIM_MAIN_HBP(vm->hback_porch);
723 writel(reg, dsi->reg_base + DSIM_MHPORCH_REG);
724
725 reg = DSIM_MAIN_VSA(vm->vsync_len)
726 | DSIM_MAIN_HSA(vm->hsync_len);
727 writel(reg, dsi->reg_base + DSIM_MSYNC_REG);
728 }
729
730 reg = DSIM_MAIN_HRESOL(vm->hactive) | DSIM_MAIN_VRESOL(vm->vactive);
731 writel(reg, dsi->reg_base + DSIM_MDRESOL_REG);
732
733 dev_dbg(dsi->dev, "LCD size = %dx%d\n", vm->hactive, vm->vactive);
734}
735
736static void exynos_dsi_set_display_enable(struct exynos_dsi *dsi, bool enable)
737{
738 u32 reg;
739
740 reg = readl(dsi->reg_base + DSIM_MDRESOL_REG);
741 if (enable)
742 reg |= DSIM_MAIN_STAND_BY;
743 else
744 reg &= ~DSIM_MAIN_STAND_BY;
745 writel(reg, dsi->reg_base + DSIM_MDRESOL_REG);
746}
747
748static int exynos_dsi_wait_for_hdr_fifo(struct exynos_dsi *dsi)
749{
750 int timeout = 2000;
751
752 do {
753 u32 reg = readl(dsi->reg_base + DSIM_FIFOCTRL_REG);
754
755 if (!(reg & DSIM_SFR_HEADER_FULL))
756 return 0;
757
758 if (!cond_resched())
759 usleep_range(950, 1050);
760 } while (--timeout);
761
762 return -ETIMEDOUT;
763}
764
765static void exynos_dsi_set_cmd_lpm(struct exynos_dsi *dsi, bool lpm)
766{
767 u32 v = readl(dsi->reg_base + DSIM_ESCMODE_REG);
768
769 if (lpm)
770 v |= DSIM_CMD_LPDT_LP;
771 else
772 v &= ~DSIM_CMD_LPDT_LP;
773
774 writel(v, dsi->reg_base + DSIM_ESCMODE_REG);
775}
776
777static void exynos_dsi_force_bta(struct exynos_dsi *dsi)
778{
779 u32 v = readl(dsi->reg_base + DSIM_ESCMODE_REG);
780
781 v |= DSIM_FORCE_BTA;
782 writel(v, dsi->reg_base + DSIM_ESCMODE_REG);
783}
784
785static void exynos_dsi_send_to_fifo(struct exynos_dsi *dsi,
786 struct exynos_dsi_transfer *xfer)
787{
788 struct device *dev = dsi->dev;
789 const u8 *payload = xfer->tx_payload + xfer->tx_done;
790 u16 length = xfer->tx_len - xfer->tx_done;
791 bool first = !xfer->tx_done;
792 u32 reg;
793
794 dev_dbg(dev, "< xfer %p: tx len %u, done %u, rx len %u, done %u\n",
795 xfer, xfer->tx_len, xfer->tx_done, xfer->rx_len, xfer->rx_done);
796
797 if (length > DSI_TX_FIFO_SIZE)
798 length = DSI_TX_FIFO_SIZE;
799
800 xfer->tx_done += length;
801
802 /* Send payload */
803 while (length >= 4) {
804 reg = (payload[3] << 24) | (payload[2] << 16)
805 | (payload[1] << 8) | payload[0];
806 writel(reg, dsi->reg_base + DSIM_PAYLOAD_REG);
807 payload += 4;
808 length -= 4;
809 }
810
811 reg = 0;
812 switch (length) {
813 case 3:
814 reg |= payload[2] << 16;
815 /* Fall through */
816 case 2:
817 reg |= payload[1] << 8;
818 /* Fall through */
819 case 1:
820 reg |= payload[0];
821 writel(reg, dsi->reg_base + DSIM_PAYLOAD_REG);
822 break;
823 case 0:
824 /* Do nothing */
825 break;
826 }
827
828 /* Send packet header */
829 if (!first)
830 return;
831
832 reg = (xfer->data[1] << 16) | (xfer->data[0] << 8) | xfer->data_id;
833 if (exynos_dsi_wait_for_hdr_fifo(dsi)) {
834 dev_err(dev, "waiting for header FIFO timed out\n");
835 return;
836 }
837
838 if (NEQV(xfer->flags & MIPI_DSI_MSG_USE_LPM,
839 dsi->state & DSIM_STATE_CMD_LPM)) {
840 exynos_dsi_set_cmd_lpm(dsi, xfer->flags & MIPI_DSI_MSG_USE_LPM);
841 dsi->state ^= DSIM_STATE_CMD_LPM;
842 }
843
844 writel(reg, dsi->reg_base + DSIM_PKTHDR_REG);
845
846 if (xfer->flags & MIPI_DSI_MSG_REQ_ACK)
847 exynos_dsi_force_bta(dsi);
848}
849
850static void exynos_dsi_read_from_fifo(struct exynos_dsi *dsi,
851 struct exynos_dsi_transfer *xfer)
852{
853 u8 *payload = xfer->rx_payload + xfer->rx_done;
854 bool first = !xfer->rx_done;
855 struct device *dev = dsi->dev;
856 u16 length;
857 u32 reg;
858
859 if (first) {
860 reg = readl(dsi->reg_base + DSIM_RXFIFO_REG);
861
862 switch (reg & 0x3f) {
863 case MIPI_DSI_RX_GENERIC_SHORT_READ_RESPONSE_2BYTE:
864 case MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_2BYTE:
865 if (xfer->rx_len >= 2) {
866 payload[1] = reg >> 16;
867 ++xfer->rx_done;
868 }
869 /* Fall through */
870 case MIPI_DSI_RX_GENERIC_SHORT_READ_RESPONSE_1BYTE:
871 case MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_1BYTE:
872 payload[0] = reg >> 8;
873 ++xfer->rx_done;
874 xfer->rx_len = xfer->rx_done;
875 xfer->result = 0;
876 goto clear_fifo;
877 case MIPI_DSI_RX_ACKNOWLEDGE_AND_ERROR_REPORT:
878 dev_err(dev, "DSI Error Report: 0x%04x\n",
879 (reg >> 8) & 0xffff);
880 xfer->result = 0;
881 goto clear_fifo;
882 }
883
884 length = (reg >> 8) & 0xffff;
885 if (length > xfer->rx_len) {
886 dev_err(dev,
887 "response too long (%u > %u bytes), stripping\n",
888 xfer->rx_len, length);
889 length = xfer->rx_len;
890 } else if (length < xfer->rx_len)
891 xfer->rx_len = length;
892 }
893
894 length = xfer->rx_len - xfer->rx_done;
895 xfer->rx_done += length;
896
897 /* Receive payload */
898 while (length >= 4) {
899 reg = readl(dsi->reg_base + DSIM_RXFIFO_REG);
900 payload[0] = (reg >> 0) & 0xff;
901 payload[1] = (reg >> 8) & 0xff;
902 payload[2] = (reg >> 16) & 0xff;
903 payload[3] = (reg >> 24) & 0xff;
904 payload += 4;
905 length -= 4;
906 }
907
908 if (length) {
909 reg = readl(dsi->reg_base + DSIM_RXFIFO_REG);
910 switch (length) {
911 case 3:
912 payload[2] = (reg >> 16) & 0xff;
913 /* Fall through */
914 case 2:
915 payload[1] = (reg >> 8) & 0xff;
916 /* Fall through */
917 case 1:
918 payload[0] = reg & 0xff;
919 }
920 }
921
922 if (xfer->rx_done == xfer->rx_len)
923 xfer->result = 0;
924
925clear_fifo:
926 length = DSI_RX_FIFO_SIZE / 4;
927 do {
928 reg = readl(dsi->reg_base + DSIM_RXFIFO_REG);
929 if (reg == DSI_RX_FIFO_EMPTY)
930 break;
931 } while (--length);
932}
933
934static void exynos_dsi_transfer_start(struct exynos_dsi *dsi)
935{
936 unsigned long flags;
937 struct exynos_dsi_transfer *xfer;
938 bool start = false;
939
940again:
941 spin_lock_irqsave(&dsi->transfer_lock, flags);
942
943 if (list_empty(&dsi->transfer_list)) {
944 spin_unlock_irqrestore(&dsi->transfer_lock, flags);
945 return;
946 }
947
948 xfer = list_first_entry(&dsi->transfer_list,
949 struct exynos_dsi_transfer, list);
950
951 spin_unlock_irqrestore(&dsi->transfer_lock, flags);
952
953 if (xfer->tx_len && xfer->tx_done == xfer->tx_len)
954 /* waiting for RX */
955 return;
956
957 exynos_dsi_send_to_fifo(dsi, xfer);
958
959 if (xfer->tx_len || xfer->rx_len)
960 return;
961
962 xfer->result = 0;
963 complete(&xfer->completed);
964
965 spin_lock_irqsave(&dsi->transfer_lock, flags);
966
967 list_del_init(&xfer->list);
968 start = !list_empty(&dsi->transfer_list);
969
970 spin_unlock_irqrestore(&dsi->transfer_lock, flags);
971
972 if (start)
973 goto again;
974}
975
976static bool exynos_dsi_transfer_finish(struct exynos_dsi *dsi)
977{
978 struct exynos_dsi_transfer *xfer;
979 unsigned long flags;
980 bool start = true;
981
982 spin_lock_irqsave(&dsi->transfer_lock, flags);
983
984 if (list_empty(&dsi->transfer_list)) {
985 spin_unlock_irqrestore(&dsi->transfer_lock, flags);
986 return false;
987 }
988
989 xfer = list_first_entry(&dsi->transfer_list,
990 struct exynos_dsi_transfer, list);
991
992 spin_unlock_irqrestore(&dsi->transfer_lock, flags);
993
994 dev_dbg(dsi->dev,
995 "> xfer %p, tx_len %u, tx_done %u, rx_len %u, rx_done %u\n",
996 xfer, xfer->tx_len, xfer->tx_done, xfer->rx_len, xfer->rx_done);
997
998 if (xfer->tx_done != xfer->tx_len)
999 return true;
1000
1001 if (xfer->rx_done != xfer->rx_len)
1002 exynos_dsi_read_from_fifo(dsi, xfer);
1003
1004 if (xfer->rx_done != xfer->rx_len)
1005 return true;
1006
1007 spin_lock_irqsave(&dsi->transfer_lock, flags);
1008
1009 list_del_init(&xfer->list);
1010 start = !list_empty(&dsi->transfer_list);
1011
1012 spin_unlock_irqrestore(&dsi->transfer_lock, flags);
1013
1014 if (!xfer->rx_len)
1015 xfer->result = 0;
1016 complete(&xfer->completed);
1017
1018 return start;
1019}
1020
1021static void exynos_dsi_remove_transfer(struct exynos_dsi *dsi,
1022 struct exynos_dsi_transfer *xfer)
1023{
1024 unsigned long flags;
1025 bool start;
1026
1027 spin_lock_irqsave(&dsi->transfer_lock, flags);
1028
1029 if (!list_empty(&dsi->transfer_list) &&
1030 xfer == list_first_entry(&dsi->transfer_list,
1031 struct exynos_dsi_transfer, list)) {
1032 list_del_init(&xfer->list);
1033 start = !list_empty(&dsi->transfer_list);
1034 spin_unlock_irqrestore(&dsi->transfer_lock, flags);
1035 if (start)
1036 exynos_dsi_transfer_start(dsi);
1037 return;
1038 }
1039
1040 list_del_init(&xfer->list);
1041
1042 spin_unlock_irqrestore(&dsi->transfer_lock, flags);
1043}
1044
1045static int exynos_dsi_transfer(struct exynos_dsi *dsi,
1046 struct exynos_dsi_transfer *xfer)
1047{
1048 unsigned long flags;
1049 bool stopped;
1050
1051 xfer->tx_done = 0;
1052 xfer->rx_done = 0;
1053 xfer->result = -ETIMEDOUT;
1054 init_completion(&xfer->completed);
1055
1056 spin_lock_irqsave(&dsi->transfer_lock, flags);
1057
1058 stopped = list_empty(&dsi->transfer_list);
1059 list_add_tail(&xfer->list, &dsi->transfer_list);
1060
1061 spin_unlock_irqrestore(&dsi->transfer_lock, flags);
1062
1063 if (stopped)
1064 exynos_dsi_transfer_start(dsi);
1065
1066 wait_for_completion_timeout(&xfer->completed,
1067 msecs_to_jiffies(DSI_XFER_TIMEOUT_MS));
1068 if (xfer->result == -ETIMEDOUT) {
1069 exynos_dsi_remove_transfer(dsi, xfer);
1070 dev_err(dsi->dev, "xfer timed out: %*ph %*ph\n", 2, xfer->data,
1071 xfer->tx_len, xfer->tx_payload);
1072 return -ETIMEDOUT;
1073 }
1074
1075 /* Also covers hardware timeout condition */
1076 return xfer->result;
1077}
1078
1079static irqreturn_t exynos_dsi_irq(int irq, void *dev_id)
1080{
1081 struct exynos_dsi *dsi = dev_id;
1082 u32 status;
1083
1084 status = readl(dsi->reg_base + DSIM_INTSRC_REG);
1085 if (!status) {
1086 static unsigned long int j;
1087 if (printk_timed_ratelimit(&j, 500))
1088 dev_warn(dsi->dev, "spurious interrupt\n");
1089 return IRQ_HANDLED;
1090 }
1091 writel(status, dsi->reg_base + DSIM_INTSRC_REG);
1092
1093 if (status & DSIM_INT_SW_RST_RELEASE) {
1094 u32 mask = ~(DSIM_INT_RX_DONE | DSIM_INT_SFR_FIFO_EMPTY);
1095 writel(mask, dsi->reg_base + DSIM_INTMSK_REG);
1096 complete(&dsi->completed);
1097 return IRQ_HANDLED;
1098 }
1099
1100 if (!(status & (DSIM_INT_RX_DONE | DSIM_INT_SFR_FIFO_EMPTY)))
1101 return IRQ_HANDLED;
1102
1103 if (exynos_dsi_transfer_finish(dsi))
1104 exynos_dsi_transfer_start(dsi);
1105
1106 return IRQ_HANDLED;
1107}
1108
YoungJun Choe17ddec2014-07-22 19:49:44 +09001109static irqreturn_t exynos_dsi_te_irq_handler(int irq, void *dev_id)
1110{
1111 struct exynos_dsi *dsi = (struct exynos_dsi *)dev_id;
Andrzej Hajdae5169722014-10-07 14:01:10 +02001112 struct drm_encoder *encoder = dsi->display.encoder;
YoungJun Choe17ddec2014-07-22 19:49:44 +09001113
1114 if (dsi->state & DSIM_STATE_ENABLED)
1115 exynos_drm_crtc_te_handler(encoder->crtc);
1116
1117 return IRQ_HANDLED;
1118}
1119
1120static void exynos_dsi_enable_irq(struct exynos_dsi *dsi)
1121{
1122 enable_irq(dsi->irq);
1123
1124 if (gpio_is_valid(dsi->te_gpio))
1125 enable_irq(gpio_to_irq(dsi->te_gpio));
1126}
1127
1128static void exynos_dsi_disable_irq(struct exynos_dsi *dsi)
1129{
1130 if (gpio_is_valid(dsi->te_gpio))
1131 disable_irq(gpio_to_irq(dsi->te_gpio));
1132
1133 disable_irq(dsi->irq);
1134}
1135
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001136static int exynos_dsi_init(struct exynos_dsi *dsi)
1137{
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001138 exynos_dsi_reset(dsi);
YoungJun Choe17ddec2014-07-22 19:49:44 +09001139 exynos_dsi_enable_irq(dsi);
YoungJun Cho9a320412014-07-17 18:01:23 +09001140 exynos_dsi_enable_clock(dsi);
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001141 exynos_dsi_wait_for_reset(dsi);
YoungJun Cho9a320412014-07-17 18:01:23 +09001142 exynos_dsi_set_phy_ctrl(dsi);
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001143 exynos_dsi_init_link(dsi);
1144
1145 return 0;
1146}
1147
YoungJun Choe17ddec2014-07-22 19:49:44 +09001148static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi)
1149{
1150 int ret;
1151
1152 dsi->te_gpio = of_get_named_gpio(dsi->panel_node, "te-gpios", 0);
1153 if (!gpio_is_valid(dsi->te_gpio)) {
1154 dev_err(dsi->dev, "no te-gpios specified\n");
1155 ret = dsi->te_gpio;
1156 goto out;
1157 }
1158
1159 ret = gpio_request_one(dsi->te_gpio, GPIOF_IN, "te_gpio");
1160 if (ret) {
1161 dev_err(dsi->dev, "gpio request failed with %d\n", ret);
1162 goto out;
1163 }
1164
1165 /*
1166 * This TE GPIO IRQ should not be set to IRQ_NOAUTOEN, because panel
1167 * calls drm_panel_init() first then calls mipi_dsi_attach() in probe().
1168 * It means that te_gpio is invalid when exynos_dsi_enable_irq() is
1169 * called by drm_panel_init() before panel is attached.
1170 */
1171 ret = request_threaded_irq(gpio_to_irq(dsi->te_gpio),
1172 exynos_dsi_te_irq_handler, NULL,
1173 IRQF_TRIGGER_RISING, "TE", dsi);
1174 if (ret) {
1175 dev_err(dsi->dev, "request interrupt failed with %d\n", ret);
1176 gpio_free(dsi->te_gpio);
1177 goto out;
1178 }
1179
1180out:
1181 return ret;
1182}
1183
1184static void exynos_dsi_unregister_te_irq(struct exynos_dsi *dsi)
1185{
1186 if (gpio_is_valid(dsi->te_gpio)) {
1187 free_irq(gpio_to_irq(dsi->te_gpio), dsi);
1188 gpio_free(dsi->te_gpio);
1189 dsi->te_gpio = -ENOENT;
1190 }
1191}
1192
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001193static int exynos_dsi_host_attach(struct mipi_dsi_host *host,
1194 struct mipi_dsi_device *device)
1195{
1196 struct exynos_dsi *dsi = host_to_dsi(host);
1197
1198 dsi->lanes = device->lanes;
1199 dsi->format = device->format;
1200 dsi->mode_flags = device->mode_flags;
1201 dsi->panel_node = device->dev.of_node;
1202
1203 if (dsi->connector.dev)
1204 drm_helper_hpd_irq_event(dsi->connector.dev);
1205
YoungJun Choe17ddec2014-07-22 19:49:44 +09001206 /*
1207 * This is a temporary solution and should be made by more generic way.
1208 *
1209 * If attached panel device is for command mode one, dsi should register
1210 * TE interrupt handler.
1211 */
1212 if (!(dsi->mode_flags & MIPI_DSI_MODE_VIDEO)) {
1213 int ret = exynos_dsi_register_te_irq(dsi);
1214
1215 if (ret)
1216 return ret;
1217 }
1218
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001219 return 0;
1220}
1221
1222static int exynos_dsi_host_detach(struct mipi_dsi_host *host,
1223 struct mipi_dsi_device *device)
1224{
1225 struct exynos_dsi *dsi = host_to_dsi(host);
1226
YoungJun Choe17ddec2014-07-22 19:49:44 +09001227 exynos_dsi_unregister_te_irq(dsi);
1228
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001229 dsi->panel_node = NULL;
1230
1231 if (dsi->connector.dev)
1232 drm_helper_hpd_irq_event(dsi->connector.dev);
1233
1234 return 0;
1235}
1236
1237/* distinguish between short and long DSI packet types */
1238static bool exynos_dsi_is_short_dsi_type(u8 type)
1239{
1240 return (type & 0x0f) <= 8;
1241}
1242
1243static ssize_t exynos_dsi_host_transfer(struct mipi_dsi_host *host,
Thierry Redinged6ff402014-08-05 11:27:56 +02001244 const struct mipi_dsi_msg *msg)
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001245{
1246 struct exynos_dsi *dsi = host_to_dsi(host);
1247 struct exynos_dsi_transfer xfer;
1248 int ret;
1249
1250 if (!(dsi->state & DSIM_STATE_INITIALIZED)) {
1251 ret = exynos_dsi_init(dsi);
1252 if (ret)
1253 return ret;
1254 dsi->state |= DSIM_STATE_INITIALIZED;
1255 }
1256
1257 if (msg->tx_len == 0)
1258 return -EINVAL;
1259
1260 xfer.data_id = msg->type | (msg->channel << 6);
1261
1262 if (exynos_dsi_is_short_dsi_type(msg->type)) {
1263 const char *tx_buf = msg->tx_buf;
1264
1265 if (msg->tx_len > 2)
1266 return -EINVAL;
1267 xfer.tx_len = 0;
1268 xfer.data[0] = tx_buf[0];
1269 xfer.data[1] = (msg->tx_len == 2) ? tx_buf[1] : 0;
1270 } else {
1271 xfer.tx_len = msg->tx_len;
1272 xfer.data[0] = msg->tx_len & 0xff;
1273 xfer.data[1] = msg->tx_len >> 8;
1274 xfer.tx_payload = msg->tx_buf;
1275 }
1276
1277 xfer.rx_len = msg->rx_len;
1278 xfer.rx_payload = msg->rx_buf;
1279 xfer.flags = msg->flags;
1280
1281 ret = exynos_dsi_transfer(dsi, &xfer);
1282 return (ret < 0) ? ret : xfer.rx_done;
1283}
1284
1285static const struct mipi_dsi_host_ops exynos_dsi_ops = {
1286 .attach = exynos_dsi_host_attach,
1287 .detach = exynos_dsi_host_detach,
1288 .transfer = exynos_dsi_host_transfer,
1289};
1290
1291static int exynos_dsi_poweron(struct exynos_dsi *dsi)
1292{
1293 int ret;
1294
1295 ret = regulator_bulk_enable(ARRAY_SIZE(dsi->supplies), dsi->supplies);
1296 if (ret < 0) {
1297 dev_err(dsi->dev, "cannot enable regulators %d\n", ret);
1298 return ret;
1299 }
1300
1301 ret = clk_prepare_enable(dsi->bus_clk);
1302 if (ret < 0) {
1303 dev_err(dsi->dev, "cannot enable bus clock %d\n", ret);
1304 goto err_bus_clk;
1305 }
1306
1307 ret = clk_prepare_enable(dsi->pll_clk);
1308 if (ret < 0) {
1309 dev_err(dsi->dev, "cannot enable pll clock %d\n", ret);
1310 goto err_pll_clk;
1311 }
1312
1313 ret = phy_power_on(dsi->phy);
1314 if (ret < 0) {
1315 dev_err(dsi->dev, "cannot enable phy %d\n", ret);
1316 goto err_phy;
1317 }
1318
1319 return 0;
1320
1321err_phy:
1322 clk_disable_unprepare(dsi->pll_clk);
1323err_pll_clk:
1324 clk_disable_unprepare(dsi->bus_clk);
1325err_bus_clk:
1326 regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies);
1327
1328 return ret;
1329}
1330
1331static void exynos_dsi_poweroff(struct exynos_dsi *dsi)
1332{
1333 int ret;
1334
1335 usleep_range(10000, 20000);
1336
1337 if (dsi->state & DSIM_STATE_INITIALIZED) {
1338 dsi->state &= ~DSIM_STATE_INITIALIZED;
1339
1340 exynos_dsi_disable_clock(dsi);
1341
YoungJun Choe17ddec2014-07-22 19:49:44 +09001342 exynos_dsi_disable_irq(dsi);
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001343 }
1344
1345 dsi->state &= ~DSIM_STATE_CMD_LPM;
1346
1347 phy_power_off(dsi->phy);
1348
1349 clk_disable_unprepare(dsi->pll_clk);
1350 clk_disable_unprepare(dsi->bus_clk);
1351
1352 ret = regulator_bulk_disable(ARRAY_SIZE(dsi->supplies), dsi->supplies);
1353 if (ret < 0)
1354 dev_err(dsi->dev, "cannot disable regulators %d\n", ret);
1355}
1356
1357static int exynos_dsi_enable(struct exynos_dsi *dsi)
1358{
1359 int ret;
1360
1361 if (dsi->state & DSIM_STATE_ENABLED)
1362 return 0;
1363
1364 ret = exynos_dsi_poweron(dsi);
1365 if (ret < 0)
1366 return ret;
1367
Ajay Kumarcdfb8692014-07-31 23:12:06 +05301368 ret = drm_panel_prepare(dsi->panel);
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001369 if (ret < 0) {
1370 exynos_dsi_poweroff(dsi);
1371 return ret;
1372 }
1373
1374 exynos_dsi_set_display_mode(dsi);
1375 exynos_dsi_set_display_enable(dsi, true);
1376
Ajay Kumarcdfb8692014-07-31 23:12:06 +05301377 ret = drm_panel_enable(dsi->panel);
1378 if (ret < 0) {
1379 exynos_dsi_set_display_enable(dsi, false);
1380 drm_panel_unprepare(dsi->panel);
1381 exynos_dsi_poweroff(dsi);
1382 return ret;
1383 }
1384
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001385 dsi->state |= DSIM_STATE_ENABLED;
1386
1387 return 0;
1388}
1389
1390static void exynos_dsi_disable(struct exynos_dsi *dsi)
1391{
1392 if (!(dsi->state & DSIM_STATE_ENABLED))
1393 return;
1394
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001395 drm_panel_disable(dsi->panel);
Ajay Kumarcdfb8692014-07-31 23:12:06 +05301396 exynos_dsi_set_display_enable(dsi, false);
1397 drm_panel_unprepare(dsi->panel);
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001398 exynos_dsi_poweroff(dsi);
1399
1400 dsi->state &= ~DSIM_STATE_ENABLED;
1401}
1402
1403static void exynos_dsi_dpms(struct exynos_drm_display *display, int mode)
1404{
Andrzej Hajda5cd5db82014-10-07 14:01:11 +02001405 struct exynos_dsi *dsi = display_to_dsi(display);
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001406
1407 if (dsi->panel) {
1408 switch (mode) {
1409 case DRM_MODE_DPMS_ON:
1410 exynos_dsi_enable(dsi);
1411 break;
1412 case DRM_MODE_DPMS_STANDBY:
1413 case DRM_MODE_DPMS_SUSPEND:
1414 case DRM_MODE_DPMS_OFF:
1415 exynos_dsi_disable(dsi);
1416 break;
1417 default:
1418 break;
1419 }
1420 }
1421}
1422
1423static enum drm_connector_status
1424exynos_dsi_detect(struct drm_connector *connector, bool force)
1425{
1426 struct exynos_dsi *dsi = connector_to_dsi(connector);
1427
1428 if (!dsi->panel) {
1429 dsi->panel = of_drm_find_panel(dsi->panel_node);
1430 if (dsi->panel)
1431 drm_panel_attach(dsi->panel, &dsi->connector);
1432 } else if (!dsi->panel_node) {
1433 struct exynos_drm_display *display;
1434
1435 display = platform_get_drvdata(to_platform_device(dsi->dev));
1436 exynos_dsi_dpms(display, DRM_MODE_DPMS_OFF);
1437 drm_panel_detach(dsi->panel);
1438 dsi->panel = NULL;
1439 }
1440
1441 if (dsi->panel)
1442 return connector_status_connected;
1443
1444 return connector_status_disconnected;
1445}
1446
1447static void exynos_dsi_connector_destroy(struct drm_connector *connector)
1448{
Andrzej Hajda0ae46012014-09-09 15:16:10 +02001449 drm_connector_unregister(connector);
1450 drm_connector_cleanup(connector);
1451 connector->dev = NULL;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001452}
1453
1454static struct drm_connector_funcs exynos_dsi_connector_funcs = {
1455 .dpms = drm_helper_connector_dpms,
1456 .detect = exynos_dsi_detect,
1457 .fill_modes = drm_helper_probe_single_connector_modes,
1458 .destroy = exynos_dsi_connector_destroy,
1459};
1460
1461static int exynos_dsi_get_modes(struct drm_connector *connector)
1462{
1463 struct exynos_dsi *dsi = connector_to_dsi(connector);
1464
1465 if (dsi->panel)
1466 return dsi->panel->funcs->get_modes(dsi->panel);
1467
1468 return 0;
1469}
1470
1471static int exynos_dsi_mode_valid(struct drm_connector *connector,
1472 struct drm_display_mode *mode)
1473{
1474 return MODE_OK;
1475}
1476
1477static struct drm_encoder *
1478exynos_dsi_best_encoder(struct drm_connector *connector)
1479{
1480 struct exynos_dsi *dsi = connector_to_dsi(connector);
1481
Andrzej Hajdae5169722014-10-07 14:01:10 +02001482 return dsi->display.encoder;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001483}
1484
1485static struct drm_connector_helper_funcs exynos_dsi_connector_helper_funcs = {
1486 .get_modes = exynos_dsi_get_modes,
1487 .mode_valid = exynos_dsi_mode_valid,
1488 .best_encoder = exynos_dsi_best_encoder,
1489};
1490
1491static int exynos_dsi_create_connector(struct exynos_drm_display *display,
1492 struct drm_encoder *encoder)
1493{
Andrzej Hajda5cd5db82014-10-07 14:01:11 +02001494 struct exynos_dsi *dsi = display_to_dsi(display);
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001495 struct drm_connector *connector = &dsi->connector;
1496 int ret;
1497
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001498 connector->polled = DRM_CONNECTOR_POLL_HPD;
1499
1500 ret = drm_connector_init(encoder->dev, connector,
1501 &exynos_dsi_connector_funcs,
1502 DRM_MODE_CONNECTOR_DSI);
1503 if (ret) {
1504 DRM_ERROR("Failed to initialize connector with drm\n");
1505 return ret;
1506 }
1507
1508 drm_connector_helper_add(connector, &exynos_dsi_connector_helper_funcs);
Thomas Wood34ea3d32014-05-29 16:57:41 +01001509 drm_connector_register(connector);
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001510 drm_mode_connector_attach_encoder(connector, encoder);
1511
1512 return 0;
1513}
1514
1515static void exynos_dsi_mode_set(struct exynos_drm_display *display,
1516 struct drm_display_mode *mode)
1517{
Andrzej Hajda5cd5db82014-10-07 14:01:11 +02001518 struct exynos_dsi *dsi = display_to_dsi(display);
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001519 struct videomode *vm = &dsi->vm;
1520
1521 vm->hactive = mode->hdisplay;
1522 vm->vactive = mode->vdisplay;
1523 vm->vfront_porch = mode->vsync_start - mode->vdisplay;
1524 vm->vback_porch = mode->vtotal - mode->vsync_end;
1525 vm->vsync_len = mode->vsync_end - mode->vsync_start;
1526 vm->hfront_porch = mode->hsync_start - mode->hdisplay;
1527 vm->hback_porch = mode->htotal - mode->hsync_end;
1528 vm->hsync_len = mode->hsync_end - mode->hsync_start;
1529}
1530
1531static struct exynos_drm_display_ops exynos_dsi_display_ops = {
1532 .create_connector = exynos_dsi_create_connector,
1533 .mode_set = exynos_dsi_mode_set,
1534 .dpms = exynos_dsi_dpms
1535};
1536
Sjoerd Simonsbd024b82014-07-30 11:29:41 +09001537MODULE_DEVICE_TABLE(of, exynos_dsi_of_match);
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001538
1539/* of_* functions will be removed after merge of of_graph patches */
1540static struct device_node *
1541of_get_child_by_name_reg(struct device_node *parent, const char *name, u32 reg)
1542{
1543 struct device_node *np;
1544
1545 for_each_child_of_node(parent, np) {
1546 u32 r;
1547
1548 if (!np->name || of_node_cmp(np->name, name))
1549 continue;
1550
1551 if (of_property_read_u32(np, "reg", &r) < 0)
1552 r = 0;
1553
1554 if (reg == r)
1555 break;
1556 }
1557
1558 return np;
1559}
1560
1561static struct device_node *of_graph_get_port_by_reg(struct device_node *parent,
1562 u32 reg)
1563{
1564 struct device_node *ports, *port;
1565
1566 ports = of_get_child_by_name(parent, "ports");
1567 if (ports)
1568 parent = ports;
1569
1570 port = of_get_child_by_name_reg(parent, "port", reg);
1571
1572 of_node_put(ports);
1573
1574 return port;
1575}
1576
1577static struct device_node *
1578of_graph_get_endpoint_by_reg(struct device_node *port, u32 reg)
1579{
1580 return of_get_child_by_name_reg(port, "endpoint", reg);
1581}
1582
1583static int exynos_dsi_of_read_u32(const struct device_node *np,
1584 const char *propname, u32 *out_value)
1585{
1586 int ret = of_property_read_u32(np, propname, out_value);
1587
1588 if (ret < 0)
1589 pr_err("%s: failed to get '%s' property\n", np->full_name,
1590 propname);
1591
1592 return ret;
1593}
1594
1595enum {
1596 DSI_PORT_IN,
1597 DSI_PORT_OUT
1598};
1599
1600static int exynos_dsi_parse_dt(struct exynos_dsi *dsi)
1601{
1602 struct device *dev = dsi->dev;
1603 struct device_node *node = dev->of_node;
1604 struct device_node *port, *ep;
1605 int ret;
1606
1607 ret = exynos_dsi_of_read_u32(node, "samsung,pll-clock-frequency",
1608 &dsi->pll_clk_rate);
1609 if (ret < 0)
1610 return ret;
1611
1612 port = of_graph_get_port_by_reg(node, DSI_PORT_OUT);
1613 if (!port) {
1614 dev_err(dev, "no output port specified\n");
1615 return -EINVAL;
1616 }
1617
1618 ep = of_graph_get_endpoint_by_reg(port, 0);
1619 of_node_put(port);
1620 if (!ep) {
1621 dev_err(dev, "no endpoint specified in output port\n");
1622 return -EINVAL;
1623 }
1624
1625 ret = exynos_dsi_of_read_u32(ep, "samsung,burst-clock-frequency",
1626 &dsi->burst_clk_rate);
1627 if (ret < 0)
1628 goto end;
1629
1630 ret = exynos_dsi_of_read_u32(ep, "samsung,esc-clock-frequency",
1631 &dsi->esc_clk_rate);
1632
1633end:
1634 of_node_put(ep);
1635
1636 return ret;
1637}
1638
Inki Daef37cd5e2014-05-09 14:25:20 +09001639static int exynos_dsi_bind(struct device *dev, struct device *master,
1640 void *data)
1641{
Andrzej Hajda2900c692014-10-07 14:01:08 +02001642 struct exynos_drm_display *display = dev_get_drvdata(dev);
Andrzej Hajda5cd5db82014-10-07 14:01:11 +02001643 struct exynos_dsi *dsi = display_to_dsi(display);
Inki Daef37cd5e2014-05-09 14:25:20 +09001644 struct drm_device *drm_dev = data;
Inki Daef37cd5e2014-05-09 14:25:20 +09001645 int ret;
1646
Andrzej Hajda2900c692014-10-07 14:01:08 +02001647 ret = exynos_drm_create_enc_conn(drm_dev, display);
Inki Daef37cd5e2014-05-09 14:25:20 +09001648 if (ret) {
1649 DRM_ERROR("Encoder create [%d] failed with %d\n",
Andrzej Hajda2900c692014-10-07 14:01:08 +02001650 display->type, ret);
Inki Daef37cd5e2014-05-09 14:25:20 +09001651 return ret;
1652 }
1653
Inki Daef37cd5e2014-05-09 14:25:20 +09001654 return mipi_dsi_host_register(&dsi->dsi_host);
1655}
1656
1657static void exynos_dsi_unbind(struct device *dev, struct device *master,
1658 void *data)
1659{
Andrzej Hajda2900c692014-10-07 14:01:08 +02001660 struct exynos_drm_display *display = dev_get_drvdata(dev);
Andrzej Hajda5cd5db82014-10-07 14:01:11 +02001661 struct exynos_dsi *dsi = display_to_dsi(display);
Inki Daef37cd5e2014-05-09 14:25:20 +09001662
Andrzej Hajda2900c692014-10-07 14:01:08 +02001663 exynos_dsi_dpms(display, DRM_MODE_DPMS_OFF);
Inki Daef37cd5e2014-05-09 14:25:20 +09001664
Andrzej Hajda0ae46012014-09-09 15:16:10 +02001665 mipi_dsi_host_unregister(&dsi->dsi_host);
Inki Daef37cd5e2014-05-09 14:25:20 +09001666}
1667
Inki Daef37cd5e2014-05-09 14:25:20 +09001668static const struct component_ops exynos_dsi_component_ops = {
1669 .bind = exynos_dsi_bind,
1670 .unbind = exynos_dsi_unbind,
1671};
1672
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001673static int exynos_dsi_probe(struct platform_device *pdev)
1674{
Andrzej Hajda2900c692014-10-07 14:01:08 +02001675 struct device *dev = &pdev->dev;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001676 struct resource *res;
1677 struct exynos_dsi *dsi;
1678 int ret;
1679
Andrzej Hajda2900c692014-10-07 14:01:08 +02001680 dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL);
1681 if (!dsi)
1682 return -ENOMEM;
1683
1684 dsi->display.type = EXYNOS_DISPLAY_TYPE_LCD;
1685 dsi->display.ops = &exynos_dsi_display_ops;
1686
1687 ret = exynos_drm_component_add(dev, EXYNOS_DEVICE_TYPE_CONNECTOR,
1688 dsi->display.type);
Inki Daedf5225b2014-05-29 18:28:02 +09001689 if (ret)
1690 return ret;
1691
YoungJun Choe17ddec2014-07-22 19:49:44 +09001692 /* To be checked as invalid one */
1693 dsi->te_gpio = -ENOENT;
1694
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001695 init_completion(&dsi->completed);
1696 spin_lock_init(&dsi->transfer_lock);
1697 INIT_LIST_HEAD(&dsi->transfer_list);
1698
1699 dsi->dsi_host.ops = &exynos_dsi_ops;
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001700 dsi->dsi_host.dev = dev;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001701
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001702 dsi->dev = dev;
YoungJun Cho9a320412014-07-17 18:01:23 +09001703 dsi->driver_data = exynos_dsi_get_driver_data(pdev);
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001704
1705 ret = exynos_dsi_parse_dt(dsi);
1706 if (ret)
Inki Daedf5225b2014-05-29 18:28:02 +09001707 goto err_del_component;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001708
1709 dsi->supplies[0].supply = "vddcore";
1710 dsi->supplies[1].supply = "vddio";
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001711 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(dsi->supplies),
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001712 dsi->supplies);
1713 if (ret) {
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001714 dev_info(dev, "failed to get regulators: %d\n", ret);
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001715 return -EPROBE_DEFER;
1716 }
1717
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001718 dsi->pll_clk = devm_clk_get(dev, "pll_clk");
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001719 if (IS_ERR(dsi->pll_clk)) {
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001720 dev_info(dev, "failed to get dsi pll input clock\n");
Inki Daedf5225b2014-05-29 18:28:02 +09001721 ret = PTR_ERR(dsi->pll_clk);
1722 goto err_del_component;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001723 }
1724
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001725 dsi->bus_clk = devm_clk_get(dev, "bus_clk");
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001726 if (IS_ERR(dsi->bus_clk)) {
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001727 dev_info(dev, "failed to get dsi bus clock\n");
Inki Daedf5225b2014-05-29 18:28:02 +09001728 ret = PTR_ERR(dsi->bus_clk);
1729 goto err_del_component;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001730 }
1731
1732 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001733 dsi->reg_base = devm_ioremap_resource(dev, res);
Jingoo Han293d3f62014-04-17 19:08:40 +09001734 if (IS_ERR(dsi->reg_base)) {
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001735 dev_err(dev, "failed to remap io region\n");
Inki Daedf5225b2014-05-29 18:28:02 +09001736 ret = PTR_ERR(dsi->reg_base);
1737 goto err_del_component;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001738 }
1739
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001740 dsi->phy = devm_phy_get(dev, "dsim");
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001741 if (IS_ERR(dsi->phy)) {
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001742 dev_info(dev, "failed to get dsim phy\n");
Inki Daedf5225b2014-05-29 18:28:02 +09001743 ret = PTR_ERR(dsi->phy);
1744 goto err_del_component;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001745 }
1746
1747 dsi->irq = platform_get_irq(pdev, 0);
1748 if (dsi->irq < 0) {
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001749 dev_err(dev, "failed to request dsi irq resource\n");
Inki Daedf5225b2014-05-29 18:28:02 +09001750 ret = dsi->irq;
1751 goto err_del_component;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001752 }
1753
1754 irq_set_status_flags(dsi->irq, IRQ_NOAUTOEN);
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001755 ret = devm_request_threaded_irq(dev, dsi->irq, NULL,
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001756 exynos_dsi_irq, IRQF_ONESHOT,
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001757 dev_name(dev), dsi);
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001758 if (ret) {
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001759 dev_err(dev, "failed to request dsi irq\n");
Inki Daedf5225b2014-05-29 18:28:02 +09001760 goto err_del_component;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001761 }
1762
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001763 platform_set_drvdata(pdev, &dsi->display);
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001764
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001765 ret = component_add(dev, &exynos_dsi_component_ops);
Inki Daedf5225b2014-05-29 18:28:02 +09001766 if (ret)
1767 goto err_del_component;
1768
1769 return ret;
1770
1771err_del_component:
Andrzej Hajdae2d2a1e2014-10-07 14:01:09 +02001772 exynos_drm_component_del(dev, EXYNOS_DEVICE_TYPE_CONNECTOR);
Inki Daedf5225b2014-05-29 18:28:02 +09001773 return ret;
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001774}
1775
1776static int exynos_dsi_remove(struct platform_device *pdev)
1777{
Inki Daedf5225b2014-05-29 18:28:02 +09001778 component_del(&pdev->dev, &exynos_dsi_component_ops);
1779 exynos_drm_component_del(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR);
1780
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001781 return 0;
1782}
1783
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001784struct platform_driver dsi_driver = {
1785 .probe = exynos_dsi_probe,
1786 .remove = exynos_dsi_remove,
1787 .driver = {
1788 .name = "exynos-dsi",
1789 .owner = THIS_MODULE,
Andrzej Hajda7eb8f062014-04-04 01:19:56 +09001790 .of_match_table = exynos_dsi_of_match,
1791 },
1792};
1793
1794MODULE_AUTHOR("Tomasz Figa <t.figa@samsung.com>");
1795MODULE_AUTHOR("Andrzej Hajda <a.hajda@samsung.com>");
1796MODULE_DESCRIPTION("Samsung SoC MIPI DSI Master");
1797MODULE_LICENSE("GPL v2");