blob: 9907109bd6acc47c247bc8ba81d4ac7d34c243e8 [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/* Copyright (c) 2009-2011, Code Aurora Forum. All rights reserved.
2 *
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#ifndef MIPI_DSI_H
15#define MIPI_DSI_H
16
17#include <mach/scm-io.h>
18#include <linux/list.h>
19
20#ifdef BIT
21#undef BIT
22#endif
23
24#define BIT(x) (1<<(x))
25
26#define MMSS_CC_BASE_PHY 0x04000000 /* mmss clcok control */
27#define MMSS_SFPB_BASE_PHY 0x05700000 /* mmss SFPB CFG */
28#define MMSS_SERDES_BASE_PHY 0x04f01000 /* mmss (De)Serializer CFG */
29
30#define MIPI_DSI_BASE mipi_dsi_base
31
32#define MIPI_OUTP(addr, data) writel((data), (addr))
33#define MIPI_INP(addr) readl(addr)
34
35#ifdef CONFIG_MSM_SECURE_IO
36#define MIPI_OUTP_SECURE(addr, data) secure_writel((data), (addr))
37#define MIPI_INP_SECURE(addr) secure_readl(addr)
38#else
39#define MIPI_OUTP_SECURE(addr, data) writel((data), (addr))
40#define MIPI_INP_SECURE(addr) readl(addr)
41#endif
42
43#define MIPI_DSI_PRIM 1
44#define MIPI_DSI_SECD 2
45
46#define MIPI_DSI_PANEL_VGA 0
47#define MIPI_DSI_PANEL_WVGA 1
48#define MIPI_DSI_PANEL_WVGA_PT 2
49#define MIPI_DSI_PANEL_FWVGA_PT 3
Ravishangar Kalyanamc719c542011-07-28 16:49:25 -070050#define MIPI_DSI_PANEL_WSVGA_PT 4
51#define MIPI_DSI_PANEL_QHD_PT 5
52#define MIPI_DSI_PANEL_WXGA 6
53#define DSI_PANEL_MAX 6
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070054
55enum { /* mipi dsi panel */
56 DSI_VIDEO_MODE,
57 DSI_CMD_MODE,
58};
59
60enum {
61 ST_DSI_CLK_OFF,
62 ST_DSI_SUSPEND,
63 ST_DSI_RESUME,
64 ST_DSI_PLAYING,
65 ST_DSI_NUM
66};
67
68enum {
69 EV_DSI_UPDATE,
70 EV_DSI_DONE,
71 EV_DSI_TOUT,
72 EV_DSI_NUM
73};
74
75enum {
76 LANDSCAPE = 1,
77 PORTRAIT = 2,
78};
79
Ravishangar Kalyanam07d19c32011-09-01 11:22:35 -070080enum dsi_trigger_type {
81 DSI_CMD_MODE_DMA,
82 DSI_CMD_MODE_MDP,
83};
84
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070085#define DSI_NON_BURST_SYNCH_PULSE 0
86#define DSI_NON_BURST_SYNCH_EVENT 1
87#define DSI_BURST_MODE 2
88
89
90#define DSI_RGB_SWAP_RGB 0
91#define DSI_RGB_SWAP_RBG 1
92#define DSI_RGB_SWAP_BGR 2
93#define DSI_RGB_SWAP_BRG 3
94#define DSI_RGB_SWAP_GRB 4
95#define DSI_RGB_SWAP_GBR 5
96
97#define DSI_VIDEO_DST_FORMAT_RGB565 0
98#define DSI_VIDEO_DST_FORMAT_RGB666 1
99#define DSI_VIDEO_DST_FORMAT_RGB666_LOOSE 2
100#define DSI_VIDEO_DST_FORMAT_RGB888 3
101
102#define DSI_CMD_DST_FORMAT_RGB111 0
103#define DSI_CMD_DST_FORMAT_RGB332 3
104#define DSI_CMD_DST_FORMAT_RGB444 4
105#define DSI_CMD_DST_FORMAT_RGB565 6
106#define DSI_CMD_DST_FORMAT_RGB666 7
107#define DSI_CMD_DST_FORMAT_RGB888 8
108
109#define DSI_INTR_ERROR_MASK BIT(25)
110#define DSI_INTR_ERROR BIT(24)
111#define DSI_INTR_VIDEO_DONE_MASK BIT(17)
112#define DSI_INTR_VIDEO_DONE BIT(16)
113#define DSI_INTR_CMD_MDP_DONE_MASK BIT(9)
114#define DSI_INTR_CMD_MDP_DONE BIT(8)
115#define DSI_INTR_CMD_DMA_DONE_MASK BIT(1)
116#define DSI_INTR_CMD_DMA_DONE BIT(0)
117
118#define DSI_CMD_TRIGGER_NONE 0x0 /* mdp trigger */
119#define DSI_CMD_TRIGGER_TE 0x02
120#define DSI_CMD_TRIGGER_SW 0x04
121#define DSI_CMD_TRIGGER_SW_SEOF 0x05 /* cmd dma only */
122#define DSI_CMD_TRIGGER_SW_TE 0x06
123
124extern struct device dsi_dev;
125extern int mipi_dsi_clk_on;
126extern u32 dsi_irq;
127
128extern void __iomem *periph_base;
129extern char *mmss_cc_base; /* mutimedia sub system clock control */
130extern char *mmss_sfpb_base; /* mutimedia sub system sfpb */
131
132struct dsiphy_pll_divider_config {
133 u32 clk_rate;
134 u32 fb_divider;
135 u32 ref_divider_ratio;
136 u32 bit_clk_divider; /* oCLK1 */
137 u32 byte_clk_divider; /* oCLK2 */
138 u32 dsi_clk_divider; /* oCLK3 */
139};
140
141extern struct dsiphy_pll_divider_config pll_divider_config;
142
143struct dsi_clk_mnd_table {
144 uint8 lanes;
145 uint8 bpp;
146 uint8 dsiclk_div;
147 uint8 dsiclk_m;
148 uint8 dsiclk_n;
149 uint8 dsiclk_d;
150 uint8 pclk_m;
151 uint8 pclk_n;
152 uint8 pclk_d;
153};
154
155static const struct dsi_clk_mnd_table mnd_table[] = {
156 { 1, 2, 8, 1, 1, 0, 1, 2, 1},
157 { 1, 3, 8, 1, 1, 0, 1, 3, 2},
158 { 2, 2, 4, 1, 1, 0, 1, 2, 1},
159 { 2, 3, 4, 1, 1, 0, 1, 3, 2},
160 { 3, 2, 1, 3, 8, 4, 3, 16, 8},
161 { 3, 3, 1, 3, 8, 4, 1, 8, 4},
162 { 4, 2, 2, 1, 1, 0, 1, 2, 1},
163 { 4, 3, 2, 1, 1, 0, 1, 3, 2},
164};
165
166struct dsi_clk_desc {
167 uint32 src;
168 uint32 m;
169 uint32 n;
170 uint32 d;
171 uint32 mnd_mode;
172 uint32 pre_div_func;
173};
174
175#define DSI_HOST_HDR_SIZE 4
176#define DSI_HDR_LAST BIT(31)
177#define DSI_HDR_LONG_PKT BIT(30)
178#define DSI_HDR_BTA BIT(29)
179#define DSI_HDR_VC(vc) (((vc) & 0x03) << 22)
180#define DSI_HDR_DTYPE(dtype) (((dtype) & 0x03f) << 16)
181#define DSI_HDR_DATA2(data) (((data) & 0x0ff) << 8)
182#define DSI_HDR_DATA1(data) ((data) & 0x0ff)
183#define DSI_HDR_WC(wc) ((wc) & 0x0ffff)
184
185#define DSI_BUF_SIZE 1024
186#define MIPI_DSI_MRPS 0x04 /* Maximum Return Packet Size */
187
188#define MIPI_DSI_LEN 8 /* 4 x 4 - 6 - 2, bytes dcs header+crc-align */
189
190struct dsi_buf {
191 uint32 *hdr; /* dsi host header */
192 char *start; /* buffer start addr */
193 char *end; /* buffer end addr */
194 int size; /* size of buffer */
195 char *data; /* buffer */
196 int len; /* data length */
197 dma_addr_t dmap; /* mapped dma addr */
198};
199
200/* dcs read/write */
201#define DTYPE_DCS_WRITE 0x05 /* short write, 0 parameter */
202#define DTYPE_DCS_WRITE1 0x15 /* short write, 1 parameter */
203#define DTYPE_DCS_READ 0x06 /* read */
204#define DTYPE_DCS_LWRITE 0x39 /* long write */
205
206/* generic read/write */
207#define DTYPE_GEN_WRITE 0x03 /* short write, 0 parameter */
208#define DTYPE_GEN_WRITE1 0x13 /* short write, 1 parameter */
209#define DTYPE_GEN_WRITE2 0x23 /* short write, 2 parameter */
210#define DTYPE_GEN_LWRITE 0x29 /* long write */
211#define DTYPE_GEN_READ 0x04 /* long read, 0 parameter */
212#define DTYPE_GEN_READ1 0x14 /* long read, 1 parameter */
213#define DTYPE_GEN_READ2 0x24 /* long read, 2 parameter */
214
215#define DTYPE_TEAR_ON 0x35 /* set tear on */
216#define DTYPE_MAX_PKTSIZE 0x37 /* set max packet size */
217#define DTYPE_NULL_PKT 0x09 /* null packet, no data */
218#define DTYPE_BLANK_PKT 0x19 /* blankiing packet, no data */
219
220#define DTYPE_CM_ON 0x02 /* color mode off */
221#define DTYPE_CM_OFF 0x12 /* color mode on */
222#define DTYPE_PERIPHERAL_OFF 0x22
223#define DTYPE_PERIPHERAL_ON 0x32
224
kuogee hsieha27bde22011-09-25 13:31:37 -0700225/*
226 * dcs response
227 */
228#define DTYPE_ACK_ERR_RESP 0x02
229#define DTYPE_EOT_RESP 0x08 /* end of tx */
230#define DTYPE_GEN_READ1_RESP 0x11 /* 1 parameter, short */
231#define DTYPE_GEN_READ2_RESP 0x12 /* 2 parameter, short */
232#define DTYPE_GEN_LREAD_RESP 0x1a
233#define DTYPE_DCS_LREAD_RESP 0x1c
234#define DTYPE_DCS_READ1_RESP 0x21 /* 1 parameter, short */
235#define DTYPE_DCS_READ2_RESP 0x22 /* 2 parameter, short */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700236
237struct dsi_cmd_desc {
238 int dtype;
239 int last;
240 int vc;
241 int ack; /* ask ACK from peripheral */
242 int wait;
243 int dlen;
244 char *payload;
245};
246
247
248typedef void (*kickoff_act)(void *);
249
250struct dsi_kickoff_action {
251 struct list_head act_entry;
252 kickoff_act action;
253 void *data;
254};
255
256
257char *mipi_dsi_buf_reserve_hdr(struct dsi_buf *dp, int hlen);
258char *mipi_dsi_buf_init(struct dsi_buf *dp);
259void mipi_dsi_init(void);
260int mipi_dsi_buf_alloc(struct dsi_buf *, int size);
261int mipi_dsi_cmd_dma_add(struct dsi_buf *dp, struct dsi_cmd_desc *cm);
262int mipi_dsi_cmds_tx(struct msm_fb_data_type *mfd,
263 struct dsi_buf *dp, struct dsi_cmd_desc *cmds, int cnt);
264
265int mipi_dsi_cmd_dma_tx(struct dsi_buf *dp);
266int mipi_dsi_cmd_reg_tx(uint32 data);
267int mipi_dsi_cmds_rx(struct msm_fb_data_type *mfd,
268 struct dsi_buf *tp, struct dsi_buf *rp,
269 struct dsi_cmd_desc *cmds, int len);
270int mipi_dsi_cmd_dma_rx(struct dsi_buf *tp, int rlen);
271void mipi_dsi_host_init(struct mipi_panel_info *pinfo);
272void mipi_dsi_op_mode_config(int mode);
273void mipi_dsi_cmd_mode_ctrl(int enable);
274void mdp4_dsi_cmd_trigger(void);
kuogee hsieh8717a172011-09-05 09:57:58 -0700275void mipi_dsi_cmd_mdp_start(void);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700276void mipi_dsi_cmd_bta_sw_trigger(void);
277void mipi_dsi_ack_err_status(void);
278void mipi_dsi_set_tear_on(struct msm_fb_data_type *mfd);
279void mipi_dsi_set_tear_off(struct msm_fb_data_type *mfd);
280void mipi_dsi_clk_enable(void);
281void mipi_dsi_clk_disable(void);
282void mipi_dsi_pre_kickoff_action(void);
283void mipi_dsi_post_kickoff_action(void);
284void mipi_dsi_pre_kickoff_add(struct dsi_kickoff_action *act);
285void mipi_dsi_post_kickoff_add(struct dsi_kickoff_action *act);
286void mipi_dsi_pre_kickoff_del(struct dsi_kickoff_action *act);
287void mipi_dsi_post_kickoff_del(struct dsi_kickoff_action *act);
kuogee hsieh4d3c7792011-07-25 11:02:24 -0700288void mipi_dsi_controller_cfg(int enable);
289void mipi_dsi_sw_reset(void);
kuogee hsieh8717a172011-09-05 09:57:58 -0700290void mipi_dsi_mdp_busy_wait(struct msm_fb_data_type *mfd);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700291
292irqreturn_t mipi_dsi_isr(int irq, void *ptr);
293
294void mipi_set_tx_power_mode(int mode);
295void mipi_dsi_phy_ctrl(int on);
296void mipi_dsi_phy_init(int panel_ndx, struct msm_panel_info const *panel_info,
297 int target_type);
298int mipi_dsi_clk_div_config(uint8 bpp, uint8 lanes,
299 uint32 *expected_dsi_pclk);
300void mipi_dsi_clk_init(struct device *dev);
301void mipi_dsi_clk_deinit(struct device *dev);
Nagamalleswararao Ganji2ca30352011-06-24 18:16:23 -0700302void mipi_dsi_ahb_ctrl(u32 enable);
303void mipi_dsi_turn_on_clks(void);
304void mipi_dsi_turn_off_clks(void);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700305
306#ifdef CONFIG_FB_MSM_MDP303
307void update_lane_config(struct msm_panel_info *pinfo);
308#endif
309
310#endif /* MIPI_DSI_H */