1/* SPDX-License-Identifier: GPL-2.0+
2 *
3 * Copyright (C) 2016  Nexell Co., Ltd.
4 *
5 * Author: junghyun, kim <jhkim@nexell.co.kr>
6 */
7
8#ifndef _S5PXX18_SOC_DPC_H_
9#define _S5PXX18_SOC_DPC_H_
10
11#include "s5pxx18_soc_disptype.h"
12
13#define	IRQ_OFFSET	32
14#define IRQ_DPC_P    (IRQ_OFFSET + 33)
15#define IRQ_DPC_S   (IRQ_OFFSET + 34)
16
17#define NUMBER_OF_DPC_MODULE	2
18#define PHY_BASEADDR_DPC0	0xC0102800
19#define PHY_BASEADDR_DPC1	0xC0102C00
20
21#define	PHY_BASEADDR_DPC_LIST	\
22		{ PHY_BASEADDR_DPC0, PHY_BASEADDR_DPC1 }
23
24struct nx_dpc_register_set {
25	u32 ntsc_stata;
26	u32 ntsc_ecmda;
27	u32 ntsc_ecmdb;
28	u32 ntsc_glk;
29	u32 ntsc_sch;
30	u32 ntsc_hue;
31	u32 ntsc_sat;
32	u32 ntsc_cont;
33	u32 ntsc_bright;
34	u32 ntsc_fsc_adjh;
35	u32 ntsc_fsc_adjl;
36	u32 ntsc_ecmdc;
37	u32 ntsc_csdly;
38	u32 __ntsc_reserved_0_[3];
39	u32 ntsc_dacsel10;
40	u32 ntsc_dacsel32;
41	u32 ntsc_dacsel54;
42	u32 ntsc_daclp;
43	u32 ntsc_dacpd;
44	u32 __ntsc_reserved_1_[(0x20 - 0x15)];
45	u32 ntsc_icntl;
46	u32 ntsc_hvoffst;
47	u32 ntsc_hoffst;
48	u32 ntsc_voffset;
49	u32 ntsc_hsvso;
50	u32 ntsc_hsob;
51	u32 ntsc_hsoe;
52	u32 ntsc_vsob;
53	u32 ntsc_vsoe;
54	u32 __reserved[(0xf8 / 4) - 0x29];
55	u32 dpchtotal;
56	u32 dpchswidth;
57	u32 dpchastart;
58	u32 dpchaend;
59	u32 dpcvtotal;
60	u32 dpcvswidth;
61	u32 dpcvastart;
62	u32 dpcvaend;
63	u32 dpcctrl0;
64	u32 dpcctrl1;
65	u32 dpcevtotal;
66	u32 dpcevswidth;
67	u32 dpcevastart;
68	u32 dpcevaend;
69	u32 dpcctrl2;
70	u32 dpcvseoffset;
71	u32 dpcvssoffset;
72	u32 dpcevseoffset;
73	u32 dpcevssoffset;
74	u32 dpcdelay0;
75	u32 dpcupscalecon0;
76	u32 dpcupscalecon1;
77	u32 dpcupscalecon2;
78
79	u32 dpcrnumgencon0;
80	u32 dpcrnumgencon1;
81	u32 dpcrnumgencon2;
82	u32 dpcrndconformula_l;
83	u32 dpcrndconformula_h;
84	u32 dpcfdtaddr;
85	u32 dpcfrdithervalue;
86	u32 dpcfgdithervalue;
87	u32 dpcfbdithervalue;
88	u32 dpcdelay1;
89	u32 dpcmputime0;
90	u32 dpcmputime1;
91	u32 dpcmpuwrdatal;
92	u32 dpcmpuindex;
93	u32 dpcmpustatus;
94	u32 dpcmpudatah;
95	u32 dpcmpurdatal;
96	u32 dpcdummy12;
97	u32 dpccmdbufferdatal;
98	u32 dpccmdbufferdatah;
99	u32 dpcpolctrl;
100	u32 dpcpadposition[8];
101	u32 dpcrgbmask[2];
102	u32 dpcrgbshift;
103	u32 dpcdataflush;
104	u32 __reserved06[((0x3c0) - (2 * 0x0ec)) / 4];
105
106	u32 dpcclkenb;
107	u32 dpcclkgen[2][2];
108};
109
110enum {
111	nx_dpc_int_vsync = 0
112};
113
114enum nx_dpc_format {
115	nx_dpc_format_rgb555 = 0ul,
116	nx_dpc_format_rgb565 = 1ul,
117	nx_dpc_format_rgb666 = 2ul,
118	nx_dpc_format_rgb666b = 18ul,
119	nx_dpc_format_rgb888 = 3ul,
120	nx_dpc_format_mrgb555a = 4ul,
121	nx_dpc_format_mrgb555b = 5ul,
122	nx_dpc_format_mrgb565 = 6ul,
123	nx_dpc_format_mrgb666 = 7ul,
124	nx_dpc_format_mrgb888a = 8ul,
125	nx_dpc_format_mrgb888b = 9ul,
126	nx_dpc_format_ccir656 = 10ul,
127	nx_dpc_format_ccir601a = 12ul,
128	nx_dpc_format_ccir601b = 13ul,
129	nx_dpc_format_srgb888 = 14ul,
130	nx_dpc_format_srgbd8888 = 15ul,
131	nx_dpc_format_4096color = 1ul,
132	nx_dpc_format_16gray = 3ul
133};
134
135enum nx_dpc_ycorder {
136	nx_dpc_ycorder_cb_ycr_y = 0ul,
137	nx_dpc_ycorder_cr_ycb_y = 1ul,
138	nx_dpc_ycorder_ycbycr = 2ul,
139	nx_dpc_ycorder_ycrycb = 3ul
140};
141
142enum nx_dpc_padclk {
143	nx_dpc_padclk_vclk = 0ul,
144	nx_dpc_padclk_vclk2 = 1ul,
145	nx_dpc_padclk_vclk3 = 2ul
146};
147
148enum nx_dpc_dither {
149	nx_dpc_dither_bypass = 0ul,
150	nx_dpc_dither_4bit = 1ul,
151	nx_dpc_dither_5bit = 2ul,
152	nx_dpc_dither_6bit = 3ul
153};
154
155enum nx_dpc_vbs {
156	nx_dpc_vbs_ntsc_m = 0ul,
157	nx_dpc_vbs_ntsc_n = 1ul,
158	nx_dpc_vbs_ntsc_443 = 2ul,
159	nx_dpc_vbs_pal_m = 3ul,
160	nx_dpc_vbs_pal_n = 4ul,
161	nx_dpc_vbs_pal_bghi = 5ul,
162	nx_dpc_vbs_pseudo_pal = 6ul,
163	nx_dpc_vbs_pseudo_ntsc = 7ul
164};
165
166enum nx_dpc_bandwidth {
167	nx_dpc_bandwidth_low = 0ul,
168	nx_dpc_bandwidth_medium = 1ul,
169	nx_dpc_bandwidth_high = 2ul
170};
171
172int nx_dpc_initialize(void);
173u32 nx_dpc_get_number_of_module(void);
174u32 nx_dpc_get_physical_address(u32 module_index);
175u32 nx_dpc_get_size_of_register_set(void);
176void nx_dpc_set_base_address(u32 module_index, void *base_address);
177void *nx_dpc_get_base_address(u32 module_index);
178int nx_dpc_open_module(u32 module_index);
179int nx_dpc_close_module(u32 module_index);
180int nx_dpc_check_busy(u32 module_index);
181int nx_dpc_can_power_down(u32 module_index);
182int32_t nx_dpc_get_interrupt_number(u32 module_index);
183void nx_dpc_set_interrupt_enable(u32 module_index, int32_t int_num,
184				 int enable);
185int nx_dpc_get_interrupt_enable(u32 module_index, int32_t int_num);
186int nx_dpc_get_interrupt_pending(u32 module_index, int32_t int_num);
187void nx_dpc_clear_interrupt_pending(u32 module_index, int32_t int_num);
188void nx_dpc_set_interrupt_enable_all(u32 module_index, int enable);
189int nx_dpc_get_interrupt_enable_all(u32 module_index);
190int nx_dpc_get_interrupt_pending_all(u32 module_index);
191void nx_dpc_clear_interrupt_pending_all(u32 module_index);
192void nx_dpc_set_interrupt_enable32(u32 module_index, u32 enable_flag);
193u32 nx_dpc_get_interrupt_enable32(u32 module_index);
194u32 nx_dpc_get_interrupt_pending32(u32 module_index);
195void nx_dpc_clear_interrupt_pending32(u32 module_index,
196				      u32 pending_flag);
197int32_t nx_dpc_get_interrupt_pending_number(u32 module_index);
198void nx_dpc_set_clock_pclk_mode(u32 module_index, enum nx_pclkmode mode);
199enum nx_pclkmode nx_dpc_get_clock_pclk_mode(u32 module_index);
200void nx_dpc_set_clock_source(u32 module_index, u32 index, u32 clk_src);
201u32 nx_dpc_get_clock_source(u32 module_index, u32 index);
202void nx_dpc_set_clock_divisor(u32 module_index, u32 index, u32 divisor);
203u32 nx_dpc_get_clock_divisor(u32 module_index, u32 index);
204void nx_dpc_set_clock_out_inv(u32 module_index, u32 index,
205			      int out_clk_inv);
206int nx_dpc_get_clock_out_inv(u32 module_index, u32 index);
207void nx_dpc_set_clock_out_select(u32 module_index, u32 index,
208				 int bbypass);
209int nx_dpc_get_clock_out_select(u32 module_index, u32 index);
210void nx_dpc_set_clock_polarity(u32 module_index, int bpolarity);
211int nx_dpc_get_clock_polarity(u32 module_index);
212void nx_dpc_set_clock_out_enb(u32 module_index, u32 index,
213			      int out_clk_enb);
214int nx_dpc_get_clock_out_enb(u32 module_index, u32 index);
215void nx_dpc_set_clock_out_delay(u32 module_index, u32 index, u32 delay);
216u32 nx_dpc_get_clock_out_delay(u32 module_index, u32 index);
217void nx_dpc_set_clock_divisor_enable(u32 module_index, int enable);
218int nx_dpc_get_clock_divisor_enable(u32 module_index);
219
220void nx_dpc_set_dpc_enable(u32 module_index, int benb);
221int nx_dpc_get_dpc_enable(u32 module_index);
222void nx_dpc_set_delay(u32 module_index, u32 delay_rgb_pvd,
223		      u32 delay_hs_cp1, u32 delay_vs_fram,
224		      u32 delay_de_cp2);
225void nx_dpc_get_delay(u32 module_index, u32 *pdelayrgb_pvd,
226		      u32 *pdelayhs_cp1, u32 *pdelayvs_fram,
227		      u32 *pdelayde_cp2);
228void nx_dpc_set_dither(u32 module_index, enum nx_dpc_dither dither_r,
229		       enum nx_dpc_dither dither_g,
230		       enum nx_dpc_dither dither_b);
231void nx_dpc_get_dither(u32 module_index, enum nx_dpc_dither *pditherr,
232		       enum nx_dpc_dither *pditherg,
233		       enum nx_dpc_dither *pditherb);
234void nx_dpc_set_horizontal_up_scaler(u32 module_index, int benb,
235				     u32 sourcewidth, u32 destwidth);
236void nx_dpc_get_horizontal_up_scaler(u32 module_index, int *pbenb,
237				     u32 *psourcewidth,
238				     u32 *pdestwidth);
239
240void nx_dpc_set_mode(u32 module_index, enum nx_dpc_format format,
241		     int binterlace, int binvertfield, int brgbmode,
242		     int bswaprb, enum nx_dpc_ycorder ycorder,
243		     int bclipyc, int bembeddedsync,
244		     enum nx_dpc_padclk clock, int binvertclock,
245		     int bdualview);
246void nx_dpc_get_mode(u32 module_index, enum nx_dpc_format *pformat,
247		     int *pbinterlace, int *pbinvertfield,
248		     int *pbrgbmode, int *pbswaprb,
249		     enum nx_dpc_ycorder *pycorder, int *pbclipyc,
250		     int *pbembeddedsync, enum nx_dpc_padclk *pclock,
251		     int *pbinvertclock, int *pbdualview);
252void nx_dpc_set_hsync(u32 module_index, u32 avwidth, u32 hsw, u32 hfp,
253		      u32 hbp, int binvhsync);
254void nx_dpc_get_hsync(u32 module_index, u32 *pavwidth, u32 *phsw,
255		      u32 *phfp, u32 *phbp, int *pbinvhsync);
256void nx_dpc_set_vsync(u32 module_index, u32 avheight, u32 vsw, u32 vfp,
257		      u32 vbp, int binvvsync, u32 eavheight, u32 evsw,
258		      u32 evfp, u32 evbp);
259void nx_dpc_get_vsync(u32 module_index, u32 *pavheight, u32 *pvsw,
260		      u32 *pvfp, u32 *pvbp, int *pbinvvsync,
261		      u32 *peavheight, u32 *pevsw, u32 *pevfp,
262		      u32 *pevbp);
263void nx_dpc_set_vsync_offset(u32 module_index, u32 vssoffset,
264			     u32 vseoffset, u32 evssoffset,
265			     u32 evseoffset);
266void nx_dpc_get_vsync_offset(u32 module_index, u32 *pvssoffset,
267			     u32 *pvseoffset, u32 *pevssoffset,
268			     u32 *pevseoffset);
269
270u32 nx_dpc_enable_pad_tft(u32 module_index, u32 mode_index);
271u32 nx_dpc_enable_pad_i80(u32 module_index, u32 mode_index);
272
273enum syncgenmode {
274	progressive = 0,
275	interlace = 1
276};
277
278enum polarity {
279	polarity_activehigh = 0,
280	polarity_activelow = 1
281};
282
283enum outputformat {
284	outputformat_rgb555 = 0,
285	outputformat_rgb565 = 1,
286	outputformat_rgb666 = 2,
287	outputformat_rgb888 = 3,
288	outputformat_mrgb555a = 4,
289	outputformat_mrgb555b = 5,
290	outputformat_mrgb565 = 6,
291	outputformat_mrgb666 = 7,
292	outputformat_mrgb888a = 8,
293	outputformat_mrgb888b = 9,
294	outputformat_bgr555 = 10,
295	outputformat_bgr565 = 11,
296	outputformat_bgr666 = 12,
297	outputformat_bgr888 = 13,
298	outputformat_mbgr555a = 14,
299	outputformat_mbgr555b = 15,
300	outputformat_mbgr565 = 16,
301	outputformat_mbgr666 = 17,
302	outputformat_mbgr888a = 18,
303	outputformat_mbgr888b = 19,
304	outputformat_ccir656 = 20,
305	outputformat_ccir601_8 = 21,
306	outputformat_ccir601_16a = 22,
307	outputformat_ccir601_16b = 23,
308	outputformat_srgb888 = 24,
309	outputformat_srgbd8888 = 25
310};
311
312enum outpadclksel {
313	padvclk = 0,
314	padvclk2 = 1,
315	padvclk3 = 2
316};
317
318enum qmode {
319	qmode_220 = 0,
320	qmode_256 = 1
321};
322
323void nx_dpc_set_sync(u32 module_index, enum syncgenmode sync_gen_mode,
324		     u32 avwidth, u32 avheight, u32 hsw, u32 hfp,
325		     u32 hbp, u32 vsw, u32 vfp, u32 vbp,
326		     enum polarity field_polarity,
327		     enum polarity hsyncpolarity,
328		     enum polarity vsyncpolarity, u32 even_vsw,
329		     u32 even_vfp, u32 even_vbp, u32 vsetpixel,
330		     u32 vsclrpixel, u32 evenvsetpixel,
331		     u32 evenvsclrpixel);
332void nx_dpc_set_output_format(u32 module_index,
333			      enum outputformat output_format,
334			      u8 output_video_config);
335void nx_dpc_set_quantization_mode(u32 module_index, enum qmode rgb2yc,
336				  enum qmode yc2rgb);
337void nx_dpc_set_enable(u32 module_index, int enable, int rgbmode,
338		       int use_ntscsync, int use_analog_output,
339		       int seavenable);
340void nx_dpc_set_enable_with_interlace(u32 module_index, int enable,
341				      int rgbmode, int use_ntscsync,
342				      int use_analog_output,
343				      int seavenable);
344void nx_dpc_set_enable_with_interlace(u32 module_index, int enable,
345				      int rgbmode, int use_ntscsync,
346				      int use_analog_output,
347				      int seavenable);
348void nx_dpc_set_out_video_clk_select(u32 module_index,
349				     enum outpadclksel out_pad_vclk_sel);
350void nx_dpc_set_reg_flush(u32 module_index);
351void nx_dpc_set_sramon(u32 module_index);
352void nx_dpc_set_sync_lcdtype(u32 module_index, int stnlcd,
353			     int dual_view_enb, int bit_widh,
354			     u8 cpcycle);
355void nx_dpc_set_up_scale_control(u32 module_index, int up_scale_enb,
356				 int filter_enb, u32 hscale,
357				 u16 source_width);
358
359void nx_dpc_set_mputime(u32 module_index, u8 setup, u8 hold, u8 acc);
360void nx_dpc_set_index(u32 module_index, u32 index);
361void nx_dpc_set_data(u32 module_index, u32 data);
362void nx_dpc_set_cmd_buffer_flush(u32 module_index);
363void nx_dpc_set_cmd_buffer_clear(u32 module_index);
364void nx_dpc_set_cmd_buffer_write(u32 module_index, u32 cmd_data);
365void nx_dpc_set(u32 module_index);
366u32 nx_dpc_get_data(u32 module_index);
367u32 nx_dpc_get_status(u32 module_index);
368void nx_dpc_rgbmask(u32 module_index, u32 rgbmask);
369void nx_dpc_set_pad_location(u32 module_index, u32 index, u32 regvalue);
370u32 nx_dpc_get_field_flag(u32 module_index);
371
372void nx_dpc_set_sync_v(u32 module_index, u32 avheight, u32 vsw, u32 vfp,
373		       u32 vbp);
374
375int nx_dpc_init_reg_test(u32 module_index);
376void nx_dpc_set_encoder_control_reg(u32 module_index, u32 param_a,
377				    u32 param_b, u32 param_c);
378void nx_dpc_set_encoder_shcphase_control(u32 module_index,
379					 u32 chroma_param);
380void nx_dpc_set_encoder_timing_config_reg(u32 module_index, u32 inctl);
381void nx_dpc_set_encoder_dacoutput_select(u32 module_index, u8 dacsel0,
382					 u8 dacsel1, u8 dacsel2,
383					 u8 dacsel3, u8 dacsel4,
384					 u8 dacsel5);
385void nx_dpc_set_encoder_sync_location(u32 module_index, u16 hsoe,
386				      u16 hsob, u16 vsob, u16 vsoe,
387				      u8 vsost, int novrst);
388void nx_dpc_set_encoder_dacpower_enable(u32 module_index, u8 dacpd);
389void nx_dpc_set_ycorder(u32 module_index, enum nx_dpc_ycorder ycorder);
390void nx_dpc_set_luma_gain(u32 module_index, u32 luma_gain);
391
392void nx_dpc_set_secondary_dpcsync(u32 module_index, int benb);
393int nx_dpc_get_secondary_dpcsync(u32 module_index);
394void nx_dpc_set_encenable(u32 module_index, int benb);
395int nx_dpc_get_encenable(u32 module_index);
396void nx_dpc_set_video_encoder_power_down(u32 module_index, int benb);
397int nx_dpc_get_video_encoder_power_down(u32 module_index);
398void nx_dpc_set_video_encoder_mode(u32 module_index, enum nx_dpc_vbs vbs,
399				   int bpedestal);
400void nx_dpc_set_video_encoder_schlock_control(u32 module_index,
401					      int bfreerun);
402int nx_dpc_get_video_encoder_schlock_control(u32 module_index);
403void nx_dpc_set_video_encoder_bandwidth(u32 module_index,
404					enum nx_dpc_bandwidth luma,
405					enum nx_dpc_bandwidth chroma);
406void nx_dpc_get_video_encoder_bandwidth(u32 module_index,
407					enum nx_dpc_bandwidth *pluma,
408					enum nx_dpc_bandwidth *pchroma);
409void nx_dpc_set_video_encoder_color_control(u32 module_index, s8 sch,
410					    s8 hue, s8 sat,
411					    s8 crt, s8 brt);
412void nx_dpc_get_video_encoder_color_control(u32 module_index,
413					    s8 *psch, s8 *phue,
414					    s8 *psat, s8 *pcrt,
415					    s8 *pbrt);
416void nx_dpc_set_video_encoder_fscadjust(u32 module_index,
417					int16_t adjust);
418u16 nx_dpc_get_video_encoder_fscadjust(u32 module_index);
419void nx_dpc_set_video_encoder_timing(u32 module_index, u32 hsos,
420				     u32 hsoe, u32 vsos, u32 vsoe);
421void nx_dpc_get_video_encoder_timing(u32 module_index, u32 *phsos,
422				     u32 *phsoe, u32 *pvsos,
423				     u32 *pvsoe);
424void nx_dpc_set_sync_v(u32 module_index, u32 avheight, u32 vsw, u32 vfp,
425		       u32 vbp);
426
427int nx_dpc_init_reg_test(u32 module_index);
428void nx_dpc_set_encoder_control_reg(u32 module_index, u32 param_a,
429				    u32 param_b, u32 param_c);
430void nx_dpc_set_encoder_shcphase_control(u32 module_index,
431					 u32 chroma_param);
432void nx_dpc_set_encoder_timing_config_reg(u32 module_index, u32 inctl);
433void nx_dpc_set_encoder_dacoutput_select(u32 module_index, u8 dacsel0,
434					 u8 dacsel1, u8 dacsel2,
435					 u8 dacsel3, u8 dacsel4,
436					 u8 dacsel5);
437void nx_dpc_set_encoder_sync_location(u32 module_index, u16 hsoe,
438				      u16 hsob, u16 vsob, u16 vsoe,
439				      u8 vsost, int novrst);
440void nx_dpc_set_encoder_dacpower_enable(u32 module_index, u8 dacpd);
441void nx_dpc_set_ycorder(u32 module_index, enum nx_dpc_ycorder ycorder);
442void nx_dpc_set_luma_gain(u32 module_index, u32 luma_gain);
443
444#endif
445