blob: 807239206f8fb1eb95d5c8b4794cc0c5e907aab5
1 | /* |
2 | * ATVDEMOD Device Driver |
3 | * |
4 | * Author: dezhi kong <dezhi.kong@amlogic.com> |
5 | * |
6 | * |
7 | * Copyright (C) 2014 Amlogic Inc. |
8 | * |
9 | * This program is free software; you can redistribute it and/or modify |
10 | * it under the terms of the GNU General Public License version 2 as |
11 | * published by the Free Software Foundation. |
12 | */ |
13 | |
14 | #ifndef __ATVDEMOD_FUN_H |
15 | #define __ATVDEMOD_FUN_H |
16 | |
17 | /*#include "../aml_fe.h"*/ |
18 | #include <linux/amlogic/tvin/tvin.h> |
19 | #include "../aml_fe.h" |
20 | #include <linux/amlogic/iomap.h> |
21 | |
22 | /*#define TVFE_APB_BASE_ADDR 0xd0046000*/ |
23 | #define ATV_DMD_APB_BASE_ADDR 0xc8008000 |
24 | #define ATV_DMD_APB_BASE_ADDR_GXTVBB 0xc8840000 |
25 | |
26 | #define HHI_ATV_DMD_SYS_CLK_CNTL 0x10f3 |
27 | |
28 | extern int atvdemod_debug_en; |
29 | extern struct amlatvdemod_device_s *amlatvdemod_devp; |
30 | extern unsigned int reg_23cf; /* IIR filter */ |
31 | extern int broad_std_except_pal_m; |
32 | #undef pr_info |
33 | #define pr_info(args...)\ |
34 | do {\ |
35 | if (atvdemod_debug_en)\ |
36 | printk(args);\ |
37 | } while (0) |
38 | #undef pr_dbg |
39 | #define pr_dbg(a...) \ |
40 | do {\ |
41 | if (1)\ |
42 | printk(a);\ |
43 | } while (0) |
44 | |
45 | #define ATVDEMOD_INTERVAL (HZ/100) /*10ms, #define HZ 100*/ |
46 | |
47 | extern int amlatvdemod_reg_read(unsigned int reg, unsigned int *val); |
48 | extern int amlatvdemod_reg_write(unsigned int reg, unsigned int val); |
49 | extern int amlatvdemod_hiu_reg_read(unsigned int reg, unsigned int *val); |
50 | extern int amlatvdemod_hiu_reg_write(unsigned int reg, unsigned int val); |
51 | |
52 | static inline uint32_t R_ATVDEMOD_REG(uint32_t reg) |
53 | { |
54 | unsigned int val; |
55 | |
56 | amlatvdemod_reg_read(reg, &val); |
57 | return val; |
58 | } |
59 | |
60 | static inline void W_ATVDEMOD_REG(uint32_t reg, |
61 | const uint32_t val) |
62 | { |
63 | amlatvdemod_reg_write(reg, val); |
64 | } |
65 | |
66 | static inline void W_ATVDEMOD_BIT(uint32_t reg, |
67 | const uint32_t value, |
68 | const uint32_t start, |
69 | const uint32_t len) |
70 | { |
71 | W_ATVDEMOD_REG(reg, ((R_ATVDEMOD_REG(reg) & |
72 | ~(((1L << (len)) - 1) << (start))) | |
73 | (((value) & ((1L << (len)) - 1)) << (start)))); |
74 | } |
75 | |
76 | static inline uint32_t R_ATVDEMOD_BIT(uint32_t reg, |
77 | const uint32_t start, |
78 | const uint32_t len) |
79 | { |
80 | uint32_t val; |
81 | |
82 | val = ((R_ATVDEMOD_REG(reg) >> (start)) & ((1L << (len)) - 1)); |
83 | |
84 | return val; |
85 | } |
86 | |
87 | static inline uint32_t R_HIU_REG(uint32_t reg) |
88 | { |
89 | unsigned int val; |
90 | |
91 | amlatvdemod_hiu_reg_read(reg, &val); |
92 | return val; |
93 | } |
94 | |
95 | static inline void W_HIU_REG(uint32_t reg, |
96 | const uint32_t val) |
97 | { |
98 | amlatvdemod_hiu_reg_write(reg, val); |
99 | } |
100 | |
101 | static inline void W_HIU_BIT(uint32_t reg, |
102 | const uint32_t value, |
103 | const uint32_t start, |
104 | const uint32_t len) |
105 | { |
106 | W_HIU_REG(reg, ((R_HIU_REG(reg) & |
107 | ~(((1L << (len)) - 1) << (start))) | |
108 | (((value) & ((1L << (len)) - 1)) << (start)))); |
109 | } |
110 | |
111 | static inline uint32_t R_HIU_BIT(uint32_t reg, |
112 | const uint32_t start, |
113 | const uint32_t len) |
114 | { |
115 | uint32_t val; |
116 | |
117 | val = ((R_HIU_REG(reg) >> (start)) & ((1L << (len)) - 1)); |
118 | |
119 | return val; |
120 | } |
121 | |
122 | enum broadcast_standard_e { |
123 | ATVDEMOD_STD_NTSC = 0, |
124 | ATVDEMOD_STD_NTSC_J, |
125 | ATVDEMOD_STD_PAL_M, |
126 | ATVDEMOD_STD_PAL_BG, |
127 | ATVDEMOD_STD_DTV, |
128 | ATVDEMOD_STD_SECAM_DK2, |
129 | ATVDEMOD_STD_SECAM_DK3, |
130 | ATVDEMOD_STD_PAL_BG_NICAM, |
131 | ATVDEMOD_STD_PAL_DK_CHINA, |
132 | ATVDEMOD_STD_SECAM_L, |
133 | ATVDEMOD_STD_PAL_I, |
134 | ATVDEMOD_STD_PAL_DK1, |
135 | ATVDEMOD_STD_MAX, |
136 | }; |
137 | enum gde_curve_e { |
138 | ATVDEMOD_CURVE_M = 0, |
139 | ATVDEMOD_CURVE_A, |
140 | ATVDEMOD_CURVE_B, |
141 | ATVDEMOD_CURVE_CHINA, |
142 | ATVDEMOD_CURVE_MAX, |
143 | }; |
144 | enum sound_format_e { |
145 | ATVDEMOD_SOUND_STD_MONO = 0, |
146 | ATVDEMOD_SOUND_STD_NICAM, |
147 | ATVDEMOD_SOUND_STD_MAX, |
148 | }; |
149 | extern void atv_dmd_wr_reg(unsigned char block, unsigned char reg, |
150 | unsigned long data); |
151 | extern unsigned long atv_dmd_rd_reg(unsigned char block, unsigned char reg); |
152 | extern unsigned long atv_dmd_rd_byte(unsigned long block_address, |
153 | unsigned long reg_addr); |
154 | extern unsigned long atv_dmd_rd_word(unsigned long block_address, |
155 | unsigned long reg_addr); |
156 | extern unsigned long atv_dmd_rd_long(unsigned long block_address, |
157 | unsigned long reg_addr); |
158 | extern void atv_dmd_wr_long(unsigned long block_address, |
159 | unsigned long reg_addr, |
160 | unsigned long data); |
161 | extern void atv_dmd_wr_word(unsigned long block_address, |
162 | unsigned long reg_addr, |
163 | unsigned long data); |
164 | extern void atv_dmd_wr_byte(unsigned long block_address, |
165 | unsigned long reg_addr, |
166 | unsigned long data); |
167 | extern void set_audio_gain_val(int val); |
168 | extern void set_video_gain_val(int val); |
169 | extern void atv_dmd_soft_reset(void); |
170 | extern void atv_dmd_input_clk_32m(void); |
171 | extern void read_version_register(void); |
172 | extern void check_communication_interface(void); |
173 | extern void power_on_receiver(void); |
174 | extern void atv_dmd_misc(void); |
175 | extern void configure_receiver(int Broadcast_Standard, |
176 | unsigned int Tuner_IF_Frequency, |
177 | int Tuner_Input_IF_inverted, int GDE_Curve, |
178 | int sound_format); |
179 | extern int atvdemod_clk_init(void); |
180 | extern int atvdemod_init(void); |
181 | extern void atvdemod_uninit(void); |
182 | extern void atv_dmd_set_std(void); |
183 | extern void retrieve_vpll_carrier_lock(int *lock); |
184 | extern void retrieve_video_lock(int *lock); |
185 | extern int retrieve_vpll_carrier_afc(void); |
186 | |
187 | extern int get_atvdemod_snr_val(void); |
188 | extern int aml_atvdemod_get_snr(struct dvb_frontend *fe); |
189 | |
190 | /*atv demod block address*/ |
191 | /*address interval is 4, because it's 32bit interface, |
192 | * but the address is in byte |
193 | */ |
194 | #define ATV_DMD_TOP_CTRL 0x0 |
195 | #define ATV_DMD_TOP_CTRL1 0x4 |
196 | #define ATV_DMD_RST_CTRL 0x8 |
197 | |
198 | #define APB_BLOCK_ADDR_SYSTEM_MGT 0x0 |
199 | #define APB_BLOCK_ADDR_AA_LP_NOTCH 0x1 |
200 | #define APB_BLOCK_ADDR_MIXER_1 0x2 |
201 | #define APB_BLOCK_ADDR_MIXER_3 0x3 |
202 | #define APB_BLOCK_ADDR_ADC_SE 0x4 |
203 | #define APB_BLOCK_ADDR_PWR_ANL 0x5 |
204 | #define APB_BLOCK_ADDR_CARR_RCVY 0x6 |
205 | #define APB_BLOCK_ADDR_FE_DROOP_MDF 0x7 |
206 | #define APB_BLOCK_ADDR_SIF_IC_STD 0x8 |
207 | #define APB_BLOCK_ADDR_SIF_STG_2 0x9 |
208 | #define APB_BLOCK_ADDR_SIF_STG_3 0xa |
209 | #define APB_BLOCK_ADDR_IC_AGC 0xb |
210 | #define APB_BLOCK_ADDR_DAC_UPS 0xc |
211 | #define APB_BLOCK_ADDR_GDE_EQUAL 0xd |
212 | #define APB_BLOCK_ADDR_VFORMAT 0xe |
213 | #define APB_BLOCK_ADDR_VDAGC 0xf |
214 | #define APB_BLOCK_ADDR_VERS_REGISTER 0x10 |
215 | #define APB_BLOCK_ADDR_INTERPT_MGT 0x11 |
216 | #define APB_BLOCK_ADDR_ADC_MGR 0x12 |
217 | #define APB_BLOCK_ADDR_GP_VD_FLT 0x13 |
218 | #define APB_BLOCK_ADDR_CARR_DMD 0x14 |
219 | #define APB_BLOCK_ADDR_SIF_VD_IF 0x15 |
220 | #define APB_BLOCK_ADDR_VD_PKING 0x16 |
221 | #define APB_BLOCK_ADDR_FE_DR_SMOOTH 0x17 |
222 | #define APB_BLOCK_ADDR_AGC_PWM 0x18 |
223 | #define APB_BLOCK_ADDR_DAC_UPS_24M 0x19 |
224 | #define APB_BLOCK_ADDR_VFORMAT_DP 0x1a |
225 | #define APB_BLOCK_ADDR_VD_PKING_DAC 0x1b |
226 | #define APB_BLOCK_ADDR_MONO_PROC 0x1c |
227 | #define APB_BLOCK_ADDR_TOP 0x1d |
228 | |
229 | #define SLAVE_BLOCKS_NUMBER 0x1d /*indeed totals 0x1e, adding top*/ |
230 | |
231 | /*Broadcast_Standard*/ |
232 | /* 0: NTSC*/ |
233 | /* 1: NTSC-J*/ |
234 | /* 2: PAL-M,*/ |
235 | /* 3: PAL-BG*/ |
236 | /* 4: DTV*/ |
237 | /* 5: SECAM- DK2*/ |
238 | /* 6: SECAM -DK3*/ |
239 | /* 7: PAL-BG, NICAM*/ |
240 | /* 8: PAL-DK-CHINA*/ |
241 | /* 9: SECAM-L / SECAM-DK3*/ |
242 | /* 10: PAL-I*/ |
243 | /* 11: PAL-DK1*/ |
244 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_NTSC 0 |
245 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_NTSC_J 1 |
246 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_M 2 |
247 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_BG 3 |
248 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_DTV 4 |
249 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_SECAM_DK2 5 |
250 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_SECAM_DK3 6 |
251 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_BG_NICAM 7 |
252 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_DK 8 |
253 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_SECAM_L 9 |
254 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_I 10 |
255 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_PAL_DK1 11 |
256 | /* new add @20150813 begin */ |
257 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_NTSC_DK 12 |
258 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_NTSC_BG 13 |
259 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_NTSC_I 14 |
260 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_NTSC_M 15 |
261 | /* new add @20150813 end */ |
262 | |
263 | /*GDE_Curve*/ |
264 | /* 0: CURVE-M*/ |
265 | /* 1: CURVE-A*/ |
266 | /* 2: CURVE-B*/ |
267 | /* 3: CURVE-CHINA*/ |
268 | /* 4: BYPASS*/ |
269 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_CURVE_M 0 |
270 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_CURVE_A 1 |
271 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_CURVE_B 2 |
272 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_CURVE_CHINA 3 |
273 | #define AML_ATV_DEMOD_VIDEO_MODE_PROP_CURVE_BYPASS 4 |
274 | |
275 | /*sound format 0: MONO;1:NICAM*/ |
276 | #define AML_ATV_DEMOD_SOUND_MODE_PROP_MONO 0 |
277 | #define AML_ATV_DEMOD_SOUND_MODE_PROP_NICAM 1 |
278 | /** |
279 | *freq_hz:hs_freq |
280 | *freq_hz_cvrt=hs_freq/0.23841858 |
281 | *vs_freq==50,freq_hz=15625;freq_hz_cvrt=0xffff |
282 | *vs_freq==60,freq_hz=15734,freq_hz_cvrt=0x101c9 |
283 | ** |
284 | */ |
285 | #define AML_ATV_DEMOD_FREQ_50HZ_VERT 0xffff /*65535*/ |
286 | #define AML_ATV_DEMOD_FREQ_60HZ_VERT 0x101c9 /*65993*/ |
287 | |
288 | #define CARR_AFC_DEFAULT_VAL 0xffff |
289 | |
290 | enum amlatvdemod_snr_level_e { |
291 | very_low = 1, |
292 | low, |
293 | ok_minus, |
294 | ok_plus, |
295 | high, |
296 | }; |
297 | |
298 | enum audio_detect_mode { |
299 | AUDIO_AUTO_DETECT = 0, |
300 | AUDIO_MANUAL_DETECT, |
301 | }; |
302 | |
303 | struct amlatvdemod_device_s { |
304 | struct class *clsp; |
305 | struct device *dev; |
306 | struct analog_parameters parm; |
307 | int fre_offset; |
308 | struct pinctrl *pin; |
309 | const char *pin_name; |
310 | }; |
311 | |
312 | extern void aml_audio_overmodulation(int enable); |
313 | extern void amlatvdemod_set_std(int val); |
314 | extern struct amlatvdemod_device_s *amlatvdemod_devp; |
315 | extern void aml_fix_PWM_adjust(int enable); |
316 | extern void aml_audio_valume_gain_set(unsigned int audio_gain); |
317 | extern unsigned int aml_audio_valume_gain_get(void); |
318 | extern void aml_atvdemod_overmodule_det(void); |
319 | extern int aml_audiomode_autodet(struct dvb_frontend *fe); |
320 | extern void retrieve_frequency_offset(int *freq_offset); |
321 | extern int aml_atvdemod_get_snr_ex(void); |
322 | |
323 | #endif /* __ATVDEMOD_FUN_H */ |
324 |