2 * Copyright (C) 2012 Spreadtrum Communications Inc.
\r
4 * This software is licensed under the terms of the GNU General Public
\r
5 * License version 2, as published by the Free Software Foundation, and
\r
6 * may be copied, distributed, and modified under those terms.
\r
8 * This program is distributed in the hope that it will be useful,
\r
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
11 * GNU General Public License for more details.
\r
14 #ifndef __GSP_CONFIG_IF_H_
\r
15 #define __GSP_CONFIG_IF_H_
\r
22 /**---------------------------------------------------------------------------*
\r
24 **---------------------------------------------------------------------------*/
\r
27 #include <video/gsp_types_shark.h>
\r
28 #include <soc/sprd/hardware.h>
\r
29 #include <soc/sprd/sci_glb_regs.h>
\r
30 #include <soc/sprd/globalregs.h> //define IRQ_GSP_INT
\r
31 #include <soc/sprd/sci.h>
\r
32 #include <linux/delay.h>
\r
33 #include <linux/clk.h>
\r
34 #include "gsp_drv_common.h"
\r
36 //#include "shark_reg_int.h" //for INT1_IRQ_EN
\r
40 /**---------------------------------------------------------------------------*
\r
41 ** struct Definition *
\r
42 **---------------------------------------------------------------------------*/
\r
44 typedef struct _GSP_LAYER1_REG_T_TAG_
\r
46 union _GSP_LAYER1_CFG_TAG gsp_layer1_cfg_u;
\r
47 union _GSP_LAYER1_Y_ADDR_TAG gsp_layer1_y_addr_u;
\r
48 union _GSP_LAYER1_UV_ADDR_TAG gsp_layer1_uv_addr_u;
\r
49 union _GSP_LAYER1_VA_ADDR_TAG gsp_layer1_va_addr_u;
\r
50 union _GSP_LAYER1_PITCH_TAG gsp_layer1_pitch_u;
\r
51 union _GSP_LAYER1_CLIP_START_TAG gsp_layer1_clip_start_u;
\r
52 union _GSP_LAYER1_CLIP_SIZE_TAG gsp_layer1_clip_size_u;
\r
53 union _GSP_LAYER1_DES_START_TAG gsp_layer1_des_start_u;
\r
54 union _GSP_LAYER1_GREY_RGB_TAG gsp_layer1_grey_rgb_u;
\r
55 union _GSP_LAYER1_ENDIAN_TAG gsp_layer1_endian_u;
\r
56 union _GSP_LAYER1_ALPHA_TAG gsp_layer1_alpha_u;
\r
57 union _GSP_LAYER1_CK_TAG gsp_layer1_ck_u;
\r
61 typedef struct _GSP_CMDQ_REG_T_TAG_
\r
63 union _GSP_CMD_ADDR_TAG gsp_cmd_addr_u;
\r
64 union _GSP_CMD_CFG_TAG gsp_cmd_cfg_u;
\r
68 #define GSP_L1_CMDQ_SET(cfg)\
\r
69 *(GSP_CMDQ_REG_T*)(&((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cmd_addr_u) = (cfg)
\r
72 /**---------------------------------------------------------------------------*
\r
73 ** Macro Definition *
\r
74 **---------------------------------------------------------------------------*/
\r
78 //GSP job config relative
\r
79 #define GSP_MOD_EN (SPRD_AHB_BASE)
\r
80 #define GSP_SOFT_RESET (SPRD_AHB_BASE + 0x04)
\r
82 //GSP DDR access relative
\r
83 //#define SPRD_AONAPB_PHYS 0X402E0000
\r
84 #define GSP_EMC_MATRIX_BASE (SPRD_AONAPB_BASE + 0x04) // GSP access DDR through matrix to AXI, must enable gsp-gate on this matrix
\r
85 #define GSP_EMC_MATRIX_BIT (1<<11) // [11] gsp-gate bit on matrix , EMC is DDR controller, should always enabled
\r
87 //GSP inner work loggy clock ctl
\r
88 //#define SPRD_APBCKG_PHYS 0X71200000
\r
89 #define GSP_CLOCK_BASE (SPRD_APBCKG_BASE + 0x28)
\r
90 #define GSP_CLOCK_256M_BIT (3)// div form PLL clock, use[1:0] 2bit, 0:96M 1:153.6M 2:192M 3:256M
\r
92 //force enable GSP inner work loggy clock, used for debug
\r
93 //#define SPRD_AHB_PHYS 0X20D00000
\r
94 #define GSP_AUTO_GATE_ENABLE_BASE (SPRD_AHB_BASE + 0x40)
\r
95 #define GSP_AUTO_GATE_ENABLE_BIT (1<<8)//[8] is gate switch, 1:GSP work clk enable by busy signal, 0:force enable, control by busy will save power
\r
97 //GSP register set clock , through AHB bus
\r
98 //#define SPRD_APBCKG_PHYS 0X71200000
\r
99 #define GSP_AHB_CLOCK_BASE (SPRD_APBCKG_BASE + 0x20)
\r
100 #define GSP_AHB_CLOCK_26M_BIT (0)// [1:0] is used by GSP, 0:26M
\r
101 #define GSP_AHB_CLOCK_192M_BIT (3)// [1:0] is used by GSP, 0:26M 1:76M 2:128M 3:192M
\r
104 //interrupt relative
\r
105 #define TB_GSP_INT (0x33) //gsp hardware irq number
\r
106 #define GSP_IRQ_BIT (1<<19) //gsp hardware irq bit, == (TB_GSP_INT % 32)
\r
107 #define GSP_SOFT_RST_BIT (1<<3) //gsp chip module soft reset bit
\r
108 #define GSP_MOD_EN_BIT (1<<3) //gsp chip module enable bit
\r
111 //GSP job config relative
\r
112 #define GSP_MOD_EN (REG_AP_AHB_AHB_EB)
\r
113 #define GSP_SOFT_RESET (REG_AP_AHB_AHB_RST)
\r
115 //GSP DDR access relative
\r
116 //#define SPRD_AONAPB_PHYS 0X402E0000
\r
117 #define GSP_EMC_MATRIX_BASE (REG_AON_APB_APB_EB1) // GSP access DDR through matrix to AXI, must enable gsp-gate on this matrix
\r
118 #define GSP_EMC_MATRIX_BIT (BIT_GSP_EMC_EB) // [13] gsp-gate bit on matrix , EMC is DDR controller, should always enabled
\r
119 #define GSP_CLK_SEL_BIT_MASK (0x3)
\r
121 //GSP inner work loggy clock ctl
\r
122 //#define SPRD_APBCKG_PHYS 0X71200000
\r
123 #define GSP_CLOCK_BASE (REG_AP_CLK_GSP_CFG)
\r
124 typedef enum _GSP_core_freq_
\r
127 GSP_CLOCK_153P6M_BIT,
\r
128 GSP_CLOCK_192M_BIT,
\r
134 //force enable GSP inner work loggy clock, used for debug
\r
135 //#define SPRD_AHB_PHYS 0X20D00000
\r
136 #define GSP_AUTO_GATE_ENABLE_BASE (REG_AP_AHB_AP_SYS_AUTO_SLEEP_CFG)
\r
137 #define GSP_AUTO_GATE_ENABLE_BIT (BIT_GSP_AUTO_GATE_EN)//[8] is gate switch, 1:GSP work clk enable by busy signal, 0:force enable, control by busy will save power
\r
138 #define GSP_CKG_FORCE_ENABLE_BIT (BIT_GSP_CKG_FORCE_EN)
\r
140 //GSP register set clock , through AHB bus
\r
141 //#define SPRD_APBCKG_PHYS 0X71200000
\r
142 #define GSP_AHB_CLOCK_BASE (REG_AP_CLK_AP_AHB_CFG)
\r
143 #define GSP_AHB_CLOCK_26M_BIT (0)// [1:0] is used by GSP, 0:26M
\r
144 #define GSP_AHB_CLOCK_192M_BIT (3)// [1:0] is used by GSP, 0:26M 1:76M 2:128M 3:192M
\r
146 //interrupt relative
\r
148 #define TB_GSP_INT (IRQ_GSP_INT) //gsp hardware irq number
\r
149 #define GSP_IRQ_BIT SCI_INTC_IRQ_BIT(TB_GSP_INT) //gsp hardware irq bit, == (TB_GSP_INT % 32)
\r
151 #define GSP_SOFT_RST_BIT (BIT_GSP_SOFT_RST) //gsp chip module soft reset bit
\r
152 #define GSP_MOD_EN_BIT (BIT_GSP_EB) //gsp chip module enable bit
\r
157 #define GSP_REG_BASE (g_gsp_base_addr)
\r
159 #define GSP_REG_BASE (SPRD_GSP_BASE)
\r
161 #define GSP_HOR_COEF_BASE (GSP_REG_BASE + 0x90)
\r
162 #define GSP_VER_COEF_BASE (GSP_REG_BASE + 0x110)
\r
163 #define GSP_L1_BASE (GSP_REG_BASE + 0x60)
\r
167 #define GSP_CLOCK_PARENT3 ("clk_gsp_parent")
\r
169 #define GSP_CLOCK_PARENT3 ("clk_256m")
\r
170 #define GSP_CLOCK_PARENT2 ("clk_192m")
\r
171 #define GSP_CLOCK_PARENT1 ("clk_153m6")
\r
172 #define GSP_CLOCK_PARENT0 ("clk_96m")
\r
174 #define GSP_CLOCK_NAME ("clk_gsp")
\r
175 #define GSP_EMC_CLOCK_PARENT_NAME ("clk_aon_apb")
\r
176 #define GSP_EMC_CLOCK_NAME ("clk_gsp_emc")
\r
180 #define GSP_EMC_MATRIX_ENABLE() (*(volatile uint32_t*)(GSP_EMC_MATRIX_BASE) |= GSP_EMC_MATRIX_BIT)
\r
181 #define GSP_CLOCK_SET(sel)\
\r
183 *(volatile uint32_t*)(GSP_CLOCK_BASE) &= ~3;\
\r
184 *(volatile uint32_t*)(GSP_CLOCK_BASE) |= (sel);\
\r
186 #define GSP_AUTO_GATE_ENABLE() (*(volatile uint32_t*)(GSP_AUTO_GATE_ENABLE_BASE) |= GSP_AUTO_GATE_ENABLE_BIT)
\r
187 #define GSP_AHB_CLOCK_SET(sel)\
\r
189 *(volatile uint32_t*)(GSP_AHB_CLOCK_BASE) &= ~3;\
\r
190 *(volatile uint32_t*)(GSP_AHB_CLOCK_BASE) |= (sel);\
\r
192 #define GSP_AHB_CLOCK_GET(sel) (*(volatile uint32_t*)(GSP_AHB_CLOCK_BASE)&0x3)
\r
195 //0x402B001C multi-media force shutdown [25]
\r
196 //0x402E0000 MM enable
\r
197 #define GSP_ENABLE_MM(addr)\
\r
199 *(volatile unsigned long *)(SPRD_PMU_BASE+0x1c) &= ~(1<<25);\
\r
200 *(volatile unsigned long *)(SPRD_AONAPB_BASE) |= (1<<25);\
\r
203 #define GSP_HWMODULE_SOFTRESET()\
\r
204 *(volatile uint32_t *)(GSP_SOFT_RESET) |= GSP_SOFT_RST_BIT;\
\r
206 *(volatile uint32_t *)(GSP_SOFT_RESET) &= (~GSP_SOFT_RST_BIT)
\r
208 #define GSP_HWMODULE_ENABLE()\
\r
209 *(volatile uint32_t *)(GSP_MOD_EN) |= (GSP_MOD_EN_BIT)
\r
211 #define GSP_HWMODULE_DISABLE(bit)\
\r
212 *(volatile uint32_t *)(GSP_MOD_EN) &= (~(GSP_MOD_EN_BIT))
\r
216 #define GSP_REG_READ(reg) (*(volatile uint32_t*)(reg))
\r
217 #define GSP_REG_WRITE(reg,value) (*(volatile uint32_t*)reg = value)
\r
219 #define GSP_EMC_MATRIX_ENABLE() sci_glb_set(GSP_EMC_MATRIX_BASE, GSP_EMC_MATRIX_BIT)
\r
220 #define GSP_CLOCK_SET(sel) sci_glb_write(GSP_CLOCK_BASE, (sel), 0x3)
\r
221 #define GSP_AUTO_GATE_ENABLE() sci_glb_set(GSP_AUTO_GATE_ENABLE_BASE, GSP_AUTO_GATE_ENABLE_BIT)
\r
222 #define GSP_AUTO_GATE_DISABLE() sci_glb_clr(GSP_AUTO_GATE_ENABLE_BASE, GSP_AUTO_GATE_ENABLE_BIT)
\r
223 #define GSP_FORCE_GATE_ENABLE() sci_glb_set(GSP_AUTO_GATE_ENABLE_BASE, GSP_CKG_FORCE_ENABLE_BIT)
\r
224 #define GSP_AHB_CLOCK_SET(sel) sci_glb_write(GSP_AHB_CLOCK_BASE, (sel), 0x3)
\r
225 #define GSP_AHB_CLOCK_GET() sci_glb_read(GSP_AHB_CLOCK_BASE,0x3)
\r
227 //#define sci_get_chip_id() GSP_REG_READ(SPRD_AONAPB_BASE+0xFC)
\r
231 //0x402B001C multi-media force shutdown [25]
\r
232 //0x402E0000 MM enable
\r
233 #define GSP_ENABLE_MM(addr)\
\r
235 sci_glb_clr((REG_PMU_APB_PD_MM_TOP_CFG),(BIT_PD_MM_TOP_FORCE_SHUTDOWN));\
\r
236 sci_glb_set(REG_AON_APB_APB_EB0,(BIT_PD_MM_TOP_FORCE_SHUTDOWN));\
\r
241 #define GSP_MMU_CTRL_BASE (g_gsp_mmu_ctrl_addr)
\r
243 #define GSP_MMU_CTRL_BASE (SPRD_GSPMMU_BASE+0x8000)
\r
246 #define GSP_HWMODULE_SOFTRESET()\
\r
248 sci_glb_set(GSP_SOFT_RESET,GSP_SOFT_RST_BIT);\
\r
250 sci_glb_clr(GSP_SOFT_RESET,GSP_SOFT_RST_BIT);\
\r
251 GSP_REG_WRITE(GSP_MMU_CTRL_BASE,0x10000001);\
\r
253 #define GSP_HWMODULE_ENABLE() sci_glb_set(GSP_MOD_EN,GSP_MOD_EN_BIT)
\r
254 #define GSP_HWMODULE_DISABLE() sci_glb_clr(GSP_MOD_EN,GSP_MOD_EN_BIT)
\r
257 #define GSP_EMC_GAP_SET(interval)\
\r
258 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.dist_rb = (interval)
\r
260 #ifndef CONFIG_64BIT // arch 32bit
\r
261 #define GSP_L0_ADDR_SET(addr)\
\r
262 *(volatile GSP_DATA_ADDR_T*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_y_addr_u) = (addr)
\r
263 #define GSP_L1_ADDR_SET(addr)\
\r
264 *(volatile GSP_DATA_ADDR_T*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_y_addr_u) = (addr)
\r
265 #define GSP_Ld_ADDR_SET(addr)\
\r
266 *(volatile GSP_DATA_ADDR_T*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_des_y_addr_u) = (addr)
\r
268 #define GSP_L0_CLIPRECT_SET(rect)\
\r
269 *(volatile GSP_RECT_T*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_clip_start_u) = (rect)
\r
270 #define GSP_L1_CLIPRECT_SET(rect)\
\r
271 *(volatile GSP_RECT_T*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_clip_start_u) = (rect)
\r
275 #define GSP_L0_ADDR_SET(addr)\
\r
276 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_y_addr_u.dwValue = (uint32_t)(addr.addr_y);\
\r
277 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_uv_addr_u.dwValue = (uint32_t)(addr.addr_uv);\
\r
278 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_va_addr_u.dwValue = (uint32_t)(addr.addr_v)
\r
280 #define GSP_L1_ADDR_SET(addr)\
\r
281 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_y_addr_u.dwValue = (uint32_t)(addr.addr_y);\
\r
282 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_uv_addr_u.dwValue = (uint32_t)(addr.addr_uv);\
\r
283 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_va_addr_u.dwValue = (uint32_t)(addr.addr_v)
\r
285 #define GSP_Ld_ADDR_SET(addr)\
\r
286 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_des_y_addr_u.dwValue = (uint32_t)(addr.addr_y);\
\r
287 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_des_uv_addr_u.dwValue = (uint32_t)(addr.addr_uv);\
\r
288 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_des_v_addr_u.dwValue = (uint32_t)(addr.addr_v)
\r
290 #define GSP_L0_CLIPRECT_SET(rect)\
\r
291 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_clip_start_u.mBits.clip_start_x_l0 = (rect.st_x);\
\r
292 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_clip_start_u.mBits.clip_start_y_l0 = (rect.st_y);\
\r
293 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_clip_size_u.mBits.clip_size_x_l0 = (rect.rect_w);\
\r
294 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_clip_size_u.mBits.clip_size_y_l0 = (rect.rect_h)
\r
295 #define GSP_L1_CLIPRECT_SET(rect)\
\r
296 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_clip_start_u.mBits.clip_start_x_l1 = (rect.st_x);\
\r
297 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_clip_start_u.mBits.clip_start_y_l1 = (rect.st_y);\
\r
298 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_clip_size_u.mBits.clip_size_x_l1 = (rect.rect_w);\
\r
299 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_clip_size_u.mBits.clip_size_y_l1 = (rect.rect_h)
\r
302 #define GSP_L0_PITCH_GET() (*(volatile uint32_t*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_pitch_u))
\r
303 #define GSP_L0_PITCH_SET(pitch)\
\r
304 *(volatile uint32_t*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_pitch_u) = (pitch)
\r
305 #define GSP_L1_PITCH_SET(pitch)\
\r
306 *(volatile uint32_t*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_pitch_u) = (pitch)
\r
307 #define GSP_Ld_PITCH_SET(pitch)\
\r
308 *(volatile uint32_t*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_des_pitch_u) = (pitch)
\r
311 #define GSP_L0_ADDRY_GET() (((GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_y_addr_u.dwValue)
\r
312 #define GSP_L0_ADDRUV_GET() (((GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_uv_addr_u.dwValue)
\r
313 #define GSP_L0_ADDRVA_GET() (((GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_va_addr_u.dwValue)
\r
314 #define GSP_L1_ADDRY_GET() (((GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_y_addr_u.dwValue)
\r
315 #define GSP_L1_ADDRUV_GET() (((GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_uv_addr_u.dwValue)
\r
316 #define GSP_L1_ADDRVA_GET() (((GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_va_addr_u.dwValue)
\r
317 #define GSP_Ld_ADDRY_GET() (((GSP_REG_T*)GSP_REG_BASE)->gsp_des_y_addr_u.dwValue)
\r
318 #define GSP_Ld_ADDRUV_GET() (((GSP_REG_T*)GSP_REG_BASE)->gsp_des_uv_addr_u.dwValue)
\r
319 #define GSP_Ld_ADDRVA_GET() (((GSP_REG_T*)GSP_REG_BASE)->gsp_des_v_addr_u.dwValue)
\r
322 #define GSP_L0_DESRECT_SET(rect)\
\r
323 *(volatile uint32_t*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_des_start_u) = *((uint32_t*)&(rect).st_x);\
\r
324 *(volatile uint32_t*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_des_size_u) = *((uint32_t*)&(rect).rect_w)
\r
325 #define GSP_L1_DESPOS_SET(pos)\
\r
326 *(volatile uint32_t*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_des_start_u) = *(uint32_t*)(&(pos))
\r
329 #define GSP_L0_GREY_SET(grey)\
\r
330 *(volatile uint32_t*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_grey_rgb_u) = *(uint32_t*)(&(grey))
\r
331 #define GSP_L1_GREY_SET(grey)\
\r
332 *(volatile uint32_t*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_grey_rgb_u) = *(uint32_t*)(&(grey))
\r
335 #define GSP_L0_ENDIAN_SET(endian_mode)\
\r
336 *(volatile uint32_t*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_endian_u) = \
\r
337 (((endian_mode).y_word_endn & 0x03) << 0)\
\r
338 |(((endian_mode).y_lng_wrd_endn & 0x01) << 2)\
\r
339 |(((endian_mode).uv_word_endn & 0x03) << 3)\
\r
340 |(((endian_mode).uv_lng_wrd_endn & 0x01) << 5)\
\r
341 |(((endian_mode).va_word_endn & 0x03) << 6)\
\r
342 |(((endian_mode).va_lng_wrd_endn & 0x01) << 8)\
\r
343 |(((endian_mode).rgb_swap_mode & 0x07) << 9)\
\r
344 |(((endian_mode).a_swap_mode & 0x01) << 12)
\r
345 #define GSP_L1_ENDIAN_SET(endian_mode)\
\r
346 *(volatile uint32_t*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_endian_u) = \
\r
347 (((endian_mode).y_word_endn & 0x03) << 0)\
\r
348 |(((endian_mode).y_lng_wrd_endn & 0x01) << 2)\
\r
349 |(((endian_mode).uv_word_endn & 0x03) << 3)\
\r
350 |(((endian_mode).uv_lng_wrd_endn & 0x01) << 5)\
\r
351 |(((endian_mode).va_word_endn & 0x03) << 6)\
\r
352 |(((endian_mode).va_lng_wrd_endn & 0x01) << 8)\
\r
353 |(((endian_mode).rgb_swap_mode & 0x07) << 9)\
\r
354 |(((endian_mode).a_swap_mode & 0x01) << 12)
\r
355 #define GSP_Ld_ENDIAN_SET(endian_mode)\
\r
356 *(volatile uint32_t*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_des_data_endian_u) = \
\r
357 (((endian_mode).y_word_endn & 0x03) << 0)\
\r
358 |(((endian_mode).y_lng_wrd_endn & 0x01) << 2)\
\r
359 |(((endian_mode).uv_word_endn & 0x03) << 3)\
\r
360 |(((endian_mode).uv_lng_wrd_endn & 0x01) << 5)\
\r
361 |(((endian_mode).va_word_endn & 0x03) << 6)\
\r
362 |(((endian_mode).va_lng_wrd_endn & 0x01) << 8)\
\r
363 |(((endian_mode).rgb_swap_mode & 0x07) << 9)\
\r
364 |(((endian_mode).a_swap_mode & 0x01) << 12)
\r
366 #define GSP_L0_ALPHA_SET(alpha)\
\r
367 *(volatile uint32_t*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_alpha_u) = (alpha)
\r
368 #define GSP_L1_ALPHA_SET(alpha)\
\r
369 *(volatile uint32_t*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_alpha_u) = (alpha)
\r
371 #define GSP_L0_COLORKEY_SET(colorkey)\
\r
372 *(volatile uint32_t*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_ck_u) = *(uint32_t*)(&(colorkey))
\r
373 #define GSP_L1_COLORKEY_SET(colorkey)\
\r
374 *(volatile uint32_t*)(&((GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_ck_u) = *(uint32_t*)(&(colorkey))
\r
376 #define GSP_L0_IMGFORMAT_SET(format)\
\r
377 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_cfg_u.mBits.img_format_l0 = (format)
\r
378 #define GSP_L1_IMGFORMAT_SET(format)\
\r
379 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_cfg_u.mBits.img_format_l1 = (format)
\r
380 #define GSP_Ld_IMGFORMAT_SET(format)\
\r
381 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_des_data_cfg_u.mBits.des_img_format = (format)
\r
382 #define GSP_Ld_COMPRESSRGB888_SET(enable)\
\r
383 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_des_data_cfg_u.mBits.compress_r8 = (enable)
\r
385 #define GSP_L0_ROTMODE_SET(mode)\
\r
386 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_cfg_u.mBits.rot_mod_l0 = (mode)
\r
387 #define GSP_L1_ROTMODE_SET(mode)\
\r
388 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_cfg_u.mBits.rot_mod_l1 = (mode)
\r
390 #define GSP_L0_COLORKEYENABLE_SET(colorkey_en)\
\r
391 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_cfg_u.mBits.ck_en_l0 = (colorkey_en)
\r
392 #define GSP_L1_COLORKEYENABLE_SET(colorkey_en)\
\r
393 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_cfg_u.mBits.ck_en_l1 = (colorkey_en)
\r
395 #define GSP_L0_PALLETENABLE_SET(pallet_en)\
\r
396 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_cfg_u.mBits.pallet_en_l0 = (pallet_en)
\r
397 #define GSP_L1_PALLETENABLE_SET(pallet_en)\
\r
398 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer1_cfg_u.mBits.pallet_en_l1 = (pallet_en)
\r
400 #define GSP_L0_SCALETAPMODE_SET(row_tap,col_tap)\
\r
401 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_cfg_u.mBits.row_tap_mod = (row_tap);\
\r
402 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_layer0_cfg_u.mBits.col_tap_mod = (col_tap)
\r
404 #define GSP_IRQMODE_SET(mode)\
\r
405 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_int_cfg_u.mBits.int_mod = (mode)
\r
406 #define GSP_IRQENABLE_SET(int_enable)\
\r
407 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_int_cfg_u.mBits.int_en = (int_enable)
\r
409 //Level-interrupt clear signal, internal GSP HW module
\r
411 #define GSP_IRQSTATUS_CLEAR()\
\r
412 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_int_cfg_u.mBits.int_clr = 1;\
\r
414 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_int_cfg_u.mBits.int_clr = 0
\r
416 #define GSP_WORKSTATUS_GET() (((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.gsp_busy)
\r
417 #define GSP_ERRFLAG_GET() (((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.error_flag)
\r
418 #define GSP_ERRCODE_GET() (((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.error_code)
\r
420 #define GSP_DITHER_ENABLE_SET(dith_en)\
\r
421 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.dither_en = (dith_en)
\r
422 #define GSP_PMARGB_ENABLE_SET(pm_en)\
\r
423 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.pmargb_en = (pm_en)
\r
424 #define GSP_L0_PMARGBMODE_SET(mode)\
\r
425 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.pmargb_mod0 = (mode)
\r
426 #define GSP_L1_PMARGBMODE_SET(mode)\
\r
427 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.pmargb_mod1 = (mode)
\r
428 #define GSP_SCALE_ENABLE_SET(scal_en)\
\r
429 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.scale_en = (scal_en)
\r
430 #define GSP_SCALE_ENABLE_GET() (((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.scale_en)
\r
432 //v==0:allowed a burst stride 4K boarder; v==1:split a burst into 2 request , when sride 4K boarder.
\r
433 //gsp_cfg_u.mBits.split 0:split 1:don't split
\r
434 #define GSP_PAGES_BOARDER_SPLIT_SET(v)\
\r
435 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.no_split = (!(v))
\r
437 #define GSP_Y2R_OPT_SET(v)\
\r
438 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.y2r_opt = (v)
\r
441 #define GSP_PAGES_BOARDER_SPLIT_GET()\
\r
442 (!((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.no_split)
\r
444 #define GSP_SCALESTATUS_RESET()\
\r
445 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.scale_status_clr = 1;\
\r
447 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.scale_status_clr = 0
\r
449 #define GSP_L0_ENABLE_SET(enable)\
\r
450 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.l0_en = (enable)
\r
451 #define GSP_L1_ENABLE_SET(enable)\
\r
452 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.l1_en = (enable)
\r
453 #define GSP_ENGINE_TRIGGER()\
\r
454 ((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.gsp_run = 1
\r
456 #define GSP_L0_ENABLE_GET() (((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.l0_en)
\r
457 #define GSP_L1_ENABLE_GET() (((volatile GSP_REG_T*)GSP_REG_BASE)->gsp_cfg_u.mBits.l1_en)
\r
459 #define GSP_CFG_L1_PARAM(param)\
\r
460 *(volatile GSP_LAYER1_REG_T *)GSP_L1_BASE = (param)
\r
461 /**---------------------------------------------------------------------------*
\r
462 ** Data Definition *
\r
463 **---------------------------------------------------------------------------*/
\r
465 /**---------------------------------------------------------------------------*
\r
466 ** Function Propertype *
\r
467 **---------------------------------------------------------------------------*/
\r
469 PUBLIC int GSP_Init(gsp_context_t *gspCtx);
\r
470 PUBLIC void GSP_Deinit(gsp_context_t *gspCtx);
\r
471 PUBLIC void GSP_ConfigLayer(GSP_MODULE_ID_E layer_id, gsp_context_t *gspCtx);
\r
472 PUBLIC uint32_t GSP_Trigger(void);
\r
473 PUBLIC void GSP_Wait_Finish(void);
\r
474 PUBLIC void GSP_module_enable(gsp_context_t *gspCtx);
\r
475 PUBLIC void GSP_module_disable(gsp_context_t *gspCtx);
\r
476 PUBLIC int GSP_ClocksCheckPhase0(void);
\r
477 PUBLIC int GSP_ClocksCheckPhase1(void);
\r
484 //the end of Shark_gsp_drv.h
\r