1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * camss-vfe-4-7.c
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Qualcomm MSM Camera Subsystem - VFE (Video Front End) Module v4.7
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
8*4882a593Smuzhiyun * Copyright (C) 2015-2018 Linaro Ltd.
9*4882a593Smuzhiyun */
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <linux/interrupt.h>
12*4882a593Smuzhiyun #include <linux/io.h>
13*4882a593Smuzhiyun #include <linux/iopoll.h>
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun #include "camss-vfe.h"
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #define VFE_0_HW_VERSION 0x000
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun #define VFE_0_GLOBAL_RESET_CMD 0x018
20*4882a593Smuzhiyun #define VFE_0_GLOBAL_RESET_CMD_CORE BIT(0)
21*4882a593Smuzhiyun #define VFE_0_GLOBAL_RESET_CMD_CAMIF BIT(1)
22*4882a593Smuzhiyun #define VFE_0_GLOBAL_RESET_CMD_BUS BIT(2)
23*4882a593Smuzhiyun #define VFE_0_GLOBAL_RESET_CMD_BUS_BDG BIT(3)
24*4882a593Smuzhiyun #define VFE_0_GLOBAL_RESET_CMD_REGISTER BIT(4)
25*4882a593Smuzhiyun #define VFE_0_GLOBAL_RESET_CMD_PM BIT(5)
26*4882a593Smuzhiyun #define VFE_0_GLOBAL_RESET_CMD_BUS_MISR BIT(6)
27*4882a593Smuzhiyun #define VFE_0_GLOBAL_RESET_CMD_TESTGEN BIT(7)
28*4882a593Smuzhiyun #define VFE_0_GLOBAL_RESET_CMD_DSP BIT(8)
29*4882a593Smuzhiyun #define VFE_0_GLOBAL_RESET_CMD_IDLE_CGC BIT(9)
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun #define VFE_0_MODULE_LENS_EN 0x040
32*4882a593Smuzhiyun #define VFE_0_MODULE_LENS_EN_DEMUX BIT(2)
33*4882a593Smuzhiyun #define VFE_0_MODULE_LENS_EN_CHROMA_UPSAMPLE BIT(3)
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun #define VFE_0_MODULE_ZOOM_EN 0x04c
36*4882a593Smuzhiyun #define VFE_0_MODULE_ZOOM_EN_SCALE_ENC BIT(1)
37*4882a593Smuzhiyun #define VFE_0_MODULE_ZOOM_EN_CROP_ENC BIT(2)
38*4882a593Smuzhiyun #define VFE_0_MODULE_ZOOM_EN_REALIGN_BUF BIT(9)
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun #define VFE_0_CORE_CFG 0x050
41*4882a593Smuzhiyun #define VFE_0_CORE_CFG_PIXEL_PATTERN_YCBYCR 0x4
42*4882a593Smuzhiyun #define VFE_0_CORE_CFG_PIXEL_PATTERN_YCRYCB 0x5
43*4882a593Smuzhiyun #define VFE_0_CORE_CFG_PIXEL_PATTERN_CBYCRY 0x6
44*4882a593Smuzhiyun #define VFE_0_CORE_CFG_PIXEL_PATTERN_CRYCBY 0x7
45*4882a593Smuzhiyun #define VFE_0_CORE_CFG_COMPOSITE_REG_UPDATE_EN BIT(4)
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun #define VFE_0_IRQ_CMD 0x058
48*4882a593Smuzhiyun #define VFE_0_IRQ_CMD_GLOBAL_CLEAR BIT(0)
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun #define VFE_0_IRQ_MASK_0 0x05c
51*4882a593Smuzhiyun #define VFE_0_IRQ_MASK_0_CAMIF_SOF BIT(0)
52*4882a593Smuzhiyun #define VFE_0_IRQ_MASK_0_CAMIF_EOF BIT(1)
53*4882a593Smuzhiyun #define VFE_0_IRQ_MASK_0_RDIn_REG_UPDATE(n) BIT((n) + 5)
54*4882a593Smuzhiyun #define VFE_0_IRQ_MASK_0_line_n_REG_UPDATE(n) \
55*4882a593Smuzhiyun ((n) == VFE_LINE_PIX ? BIT(4) : VFE_0_IRQ_MASK_0_RDIn_REG_UPDATE(n))
56*4882a593Smuzhiyun #define VFE_0_IRQ_MASK_0_IMAGE_MASTER_n_PING_PONG(n) BIT((n) + 8)
57*4882a593Smuzhiyun #define VFE_0_IRQ_MASK_0_IMAGE_COMPOSITE_DONE_n(n) BIT((n) + 25)
58*4882a593Smuzhiyun #define VFE_0_IRQ_MASK_0_RESET_ACK BIT(31)
59*4882a593Smuzhiyun #define VFE_0_IRQ_MASK_1 0x060
60*4882a593Smuzhiyun #define VFE_0_IRQ_MASK_1_CAMIF_ERROR BIT(0)
61*4882a593Smuzhiyun #define VFE_0_IRQ_MASK_1_VIOLATION BIT(7)
62*4882a593Smuzhiyun #define VFE_0_IRQ_MASK_1_BUS_BDG_HALT_ACK BIT(8)
63*4882a593Smuzhiyun #define VFE_0_IRQ_MASK_1_IMAGE_MASTER_n_BUS_OVERFLOW(n) BIT((n) + 9)
64*4882a593Smuzhiyun #define VFE_0_IRQ_MASK_1_RDIn_SOF(n) BIT((n) + 29)
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun #define VFE_0_IRQ_CLEAR_0 0x064
67*4882a593Smuzhiyun #define VFE_0_IRQ_CLEAR_1 0x068
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun #define VFE_0_IRQ_STATUS_0 0x06c
70*4882a593Smuzhiyun #define VFE_0_IRQ_STATUS_0_CAMIF_SOF BIT(0)
71*4882a593Smuzhiyun #define VFE_0_IRQ_STATUS_0_RDIn_REG_UPDATE(n) BIT((n) + 5)
72*4882a593Smuzhiyun #define VFE_0_IRQ_STATUS_0_line_n_REG_UPDATE(n) \
73*4882a593Smuzhiyun ((n) == VFE_LINE_PIX ? BIT(4) : VFE_0_IRQ_STATUS_0_RDIn_REG_UPDATE(n))
74*4882a593Smuzhiyun #define VFE_0_IRQ_STATUS_0_IMAGE_MASTER_n_PING_PONG(n) BIT((n) + 8)
75*4882a593Smuzhiyun #define VFE_0_IRQ_STATUS_0_IMAGE_COMPOSITE_DONE_n(n) BIT((n) + 25)
76*4882a593Smuzhiyun #define VFE_0_IRQ_STATUS_0_RESET_ACK BIT(31)
77*4882a593Smuzhiyun #define VFE_0_IRQ_STATUS_1 0x070
78*4882a593Smuzhiyun #define VFE_0_IRQ_STATUS_1_VIOLATION BIT(7)
79*4882a593Smuzhiyun #define VFE_0_IRQ_STATUS_1_BUS_BDG_HALT_ACK BIT(8)
80*4882a593Smuzhiyun #define VFE_0_IRQ_STATUS_1_RDIn_SOF(n) BIT((n) + 29)
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun #define VFE_0_IRQ_COMPOSITE_MASK_0 0x074
83*4882a593Smuzhiyun #define VFE_0_VIOLATION_STATUS 0x07c
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun #define VFE_0_BUS_CMD 0x80
86*4882a593Smuzhiyun #define VFE_0_BUS_CMD_Mx_RLD_CMD(x) BIT(x)
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun #define VFE_0_BUS_CFG 0x084
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun #define VFE_0_BUS_XBAR_CFG_x(x) (0x90 + 0x4 * ((x) / 2))
91*4882a593Smuzhiyun #define VFE_0_BUS_XBAR_CFG_x_M_PAIR_STREAM_EN BIT(2)
92*4882a593Smuzhiyun #define VFE_0_BUS_XBAR_CFG_x_M_REALIGN_BUF_EN BIT(3)
93*4882a593Smuzhiyun #define VFE_0_BUS_XBAR_CFG_x_M_PAIR_STREAM_SWAP_INTRA (0x1 << 4)
94*4882a593Smuzhiyun #define VFE_0_BUS_XBAR_CFG_x_M_PAIR_STREAM_SWAP_INTER (0x2 << 4)
95*4882a593Smuzhiyun #define VFE_0_BUS_XBAR_CFG_x_M_PAIR_STREAM_SWAP_INTER_INTRA (0x3 << 4)
96*4882a593Smuzhiyun #define VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_SHIFT 8
97*4882a593Smuzhiyun #define VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_LUMA 0x0
98*4882a593Smuzhiyun #define VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI0 0xc
99*4882a593Smuzhiyun #define VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI1 0xd
100*4882a593Smuzhiyun #define VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI2 0xe
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun #define VFE_0_BUS_IMAGE_MASTER_n_WR_CFG(n) (0x0a0 + 0x2c * (n))
103*4882a593Smuzhiyun #define VFE_0_BUS_IMAGE_MASTER_n_WR_CFG_WR_PATH_SHIFT 0
104*4882a593Smuzhiyun #define VFE_0_BUS_IMAGE_MASTER_n_WR_PING_ADDR(n) (0x0a4 + 0x2c * (n))
105*4882a593Smuzhiyun #define VFE_0_BUS_IMAGE_MASTER_n_WR_PONG_ADDR(n) (0x0ac + 0x2c * (n))
106*4882a593Smuzhiyun #define VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG(n) (0x0b4 + 0x2c * (n))
107*4882a593Smuzhiyun #define VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG_FRM_BASED_SHIFT 1
108*4882a593Smuzhiyun #define VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG_FRM_DROP_PER_SHIFT 2
109*4882a593Smuzhiyun #define VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG_FRM_DROP_PER_MASK (0x1f << 2)
110*4882a593Smuzhiyun #define VFE_0_BUS_IMAGE_MASTER_n_WR_UB_CFG(n) (0x0b8 + 0x2c * (n))
111*4882a593Smuzhiyun #define VFE_0_BUS_IMAGE_MASTER_n_WR_UB_CFG_OFFSET_SHIFT 16
112*4882a593Smuzhiyun #define VFE_0_BUS_IMAGE_MASTER_n_WR_IMAGE_SIZE(n) (0x0bc + 0x2c * (n))
113*4882a593Smuzhiyun #define VFE_0_BUS_IMAGE_MASTER_n_WR_BUFFER_CFG(n) (0x0c0 + 0x2c * (n))
114*4882a593Smuzhiyun #define VFE_0_BUS_IMAGE_MASTER_n_WR_FRAMEDROP_PATTERN(n) \
115*4882a593Smuzhiyun (0x0c4 + 0x2c * (n))
116*4882a593Smuzhiyun #define VFE_0_BUS_IMAGE_MASTER_n_WR_IRQ_SUBSAMPLE_PATTERN(n) \
117*4882a593Smuzhiyun (0x0c8 + 0x2c * (n))
118*4882a593Smuzhiyun #define VFE_0_BUS_IMAGE_MASTER_n_WR_IRQ_SUBSAMPLE_PATTERN_DEF 0xffffffff
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun #define VFE_0_BUS_PING_PONG_STATUS 0x338
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun #define VFE_0_BUS_BDG_CMD 0x400
123*4882a593Smuzhiyun #define VFE_0_BUS_BDG_CMD_HALT_REQ 1
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun #define VFE_0_BUS_BDG_QOS_CFG_0 0x404
126*4882a593Smuzhiyun #define VFE_0_BUS_BDG_QOS_CFG_0_CFG 0xaaa9aaa9
127*4882a593Smuzhiyun #define VFE_0_BUS_BDG_QOS_CFG_1 0x408
128*4882a593Smuzhiyun #define VFE_0_BUS_BDG_QOS_CFG_2 0x40c
129*4882a593Smuzhiyun #define VFE_0_BUS_BDG_QOS_CFG_3 0x410
130*4882a593Smuzhiyun #define VFE_0_BUS_BDG_QOS_CFG_4 0x414
131*4882a593Smuzhiyun #define VFE_0_BUS_BDG_QOS_CFG_5 0x418
132*4882a593Smuzhiyun #define VFE_0_BUS_BDG_QOS_CFG_6 0x41c
133*4882a593Smuzhiyun #define VFE_0_BUS_BDG_QOS_CFG_7 0x420
134*4882a593Smuzhiyun #define VFE_0_BUS_BDG_QOS_CFG_7_CFG 0x0001aaa9
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_0 0x424
137*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_0_CFG 0xcccc0011
138*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_1 0x428
139*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_2 0x42c
140*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_3 0x430
141*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_4 0x434
142*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_5 0x438
143*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_6 0x43c
144*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_7 0x440
145*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_8 0x444
146*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_9 0x448
147*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_10 0x44c
148*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_11 0x450
149*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_12 0x454
150*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_13 0x458
151*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_14 0x45c
152*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_15 0x460
153*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_16 0x464
154*4882a593Smuzhiyun #define VFE_0_BUS_BDG_DS_CFG_16_CFG 0x40000103
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun #define VFE_0_RDI_CFG_x(x) (0x46c + (0x4 * (x)))
157*4882a593Smuzhiyun #define VFE_0_RDI_CFG_x_RDI_STREAM_SEL_SHIFT 28
158*4882a593Smuzhiyun #define VFE_0_RDI_CFG_x_RDI_STREAM_SEL_MASK (0xf << 28)
159*4882a593Smuzhiyun #define VFE_0_RDI_CFG_x_RDI_M0_SEL_SHIFT 4
160*4882a593Smuzhiyun #define VFE_0_RDI_CFG_x_RDI_M0_SEL_MASK (0xf << 4)
161*4882a593Smuzhiyun #define VFE_0_RDI_CFG_x_RDI_EN_BIT BIT(2)
162*4882a593Smuzhiyun #define VFE_0_RDI_CFG_x_MIPI_EN_BITS 0x3
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun #define VFE_0_CAMIF_CMD 0x478
165*4882a593Smuzhiyun #define VFE_0_CAMIF_CMD_DISABLE_FRAME_BOUNDARY 0
166*4882a593Smuzhiyun #define VFE_0_CAMIF_CMD_ENABLE_FRAME_BOUNDARY 1
167*4882a593Smuzhiyun #define VFE_0_CAMIF_CMD_NO_CHANGE 3
168*4882a593Smuzhiyun #define VFE_0_CAMIF_CMD_CLEAR_CAMIF_STATUS BIT(2)
169*4882a593Smuzhiyun #define VFE_0_CAMIF_CFG 0x47c
170*4882a593Smuzhiyun #define VFE_0_CAMIF_CFG_VFE_OUTPUT_EN BIT(6)
171*4882a593Smuzhiyun #define VFE_0_CAMIF_FRAME_CFG 0x484
172*4882a593Smuzhiyun #define VFE_0_CAMIF_WINDOW_WIDTH_CFG 0x488
173*4882a593Smuzhiyun #define VFE_0_CAMIF_WINDOW_HEIGHT_CFG 0x48c
174*4882a593Smuzhiyun #define VFE_0_CAMIF_SUBSAMPLE_CFG 0x490
175*4882a593Smuzhiyun #define VFE_0_CAMIF_IRQ_FRAMEDROP_PATTERN 0x498
176*4882a593Smuzhiyun #define VFE_0_CAMIF_IRQ_SUBSAMPLE_PATTERN 0x49c
177*4882a593Smuzhiyun #define VFE_0_CAMIF_STATUS 0x4a4
178*4882a593Smuzhiyun #define VFE_0_CAMIF_STATUS_HALT BIT(31)
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun #define VFE_0_REG_UPDATE 0x4ac
181*4882a593Smuzhiyun #define VFE_0_REG_UPDATE_RDIn(n) BIT(1 + (n))
182*4882a593Smuzhiyun #define VFE_0_REG_UPDATE_line_n(n) \
183*4882a593Smuzhiyun ((n) == VFE_LINE_PIX ? 1 : VFE_0_REG_UPDATE_RDIn(n))
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun #define VFE_0_DEMUX_CFG 0x560
186*4882a593Smuzhiyun #define VFE_0_DEMUX_CFG_PERIOD 0x3
187*4882a593Smuzhiyun #define VFE_0_DEMUX_GAIN_0 0x564
188*4882a593Smuzhiyun #define VFE_0_DEMUX_GAIN_0_CH0_EVEN (0x80 << 0)
189*4882a593Smuzhiyun #define VFE_0_DEMUX_GAIN_0_CH0_ODD (0x80 << 16)
190*4882a593Smuzhiyun #define VFE_0_DEMUX_GAIN_1 0x568
191*4882a593Smuzhiyun #define VFE_0_DEMUX_GAIN_1_CH1 (0x80 << 0)
192*4882a593Smuzhiyun #define VFE_0_DEMUX_GAIN_1_CH2 (0x80 << 16)
193*4882a593Smuzhiyun #define VFE_0_DEMUX_EVEN_CFG 0x574
194*4882a593Smuzhiyun #define VFE_0_DEMUX_EVEN_CFG_PATTERN_YUYV 0x9cac
195*4882a593Smuzhiyun #define VFE_0_DEMUX_EVEN_CFG_PATTERN_YVYU 0xac9c
196*4882a593Smuzhiyun #define VFE_0_DEMUX_EVEN_CFG_PATTERN_UYVY 0xc9ca
197*4882a593Smuzhiyun #define VFE_0_DEMUX_EVEN_CFG_PATTERN_VYUY 0xcac9
198*4882a593Smuzhiyun #define VFE_0_DEMUX_ODD_CFG 0x578
199*4882a593Smuzhiyun #define VFE_0_DEMUX_ODD_CFG_PATTERN_YUYV 0x9cac
200*4882a593Smuzhiyun #define VFE_0_DEMUX_ODD_CFG_PATTERN_YVYU 0xac9c
201*4882a593Smuzhiyun #define VFE_0_DEMUX_ODD_CFG_PATTERN_UYVY 0xc9ca
202*4882a593Smuzhiyun #define VFE_0_DEMUX_ODD_CFG_PATTERN_VYUY 0xcac9
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun #define VFE_0_SCALE_ENC_Y_CFG 0x91c
205*4882a593Smuzhiyun #define VFE_0_SCALE_ENC_Y_H_IMAGE_SIZE 0x920
206*4882a593Smuzhiyun #define VFE_0_SCALE_ENC_Y_H_PHASE 0x924
207*4882a593Smuzhiyun #define VFE_0_SCALE_ENC_Y_V_IMAGE_SIZE 0x934
208*4882a593Smuzhiyun #define VFE_0_SCALE_ENC_Y_V_PHASE 0x938
209*4882a593Smuzhiyun #define VFE_0_SCALE_ENC_CBCR_CFG 0x948
210*4882a593Smuzhiyun #define VFE_0_SCALE_ENC_CBCR_H_IMAGE_SIZE 0x94c
211*4882a593Smuzhiyun #define VFE_0_SCALE_ENC_CBCR_H_PHASE 0x950
212*4882a593Smuzhiyun #define VFE_0_SCALE_ENC_CBCR_V_IMAGE_SIZE 0x960
213*4882a593Smuzhiyun #define VFE_0_SCALE_ENC_CBCR_V_PHASE 0x964
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun #define VFE_0_CROP_ENC_Y_WIDTH 0x974
216*4882a593Smuzhiyun #define VFE_0_CROP_ENC_Y_HEIGHT 0x978
217*4882a593Smuzhiyun #define VFE_0_CROP_ENC_CBCR_WIDTH 0x97c
218*4882a593Smuzhiyun #define VFE_0_CROP_ENC_CBCR_HEIGHT 0x980
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun #define VFE_0_CLAMP_ENC_MAX_CFG 0x984
221*4882a593Smuzhiyun #define VFE_0_CLAMP_ENC_MAX_CFG_CH0 (0xff << 0)
222*4882a593Smuzhiyun #define VFE_0_CLAMP_ENC_MAX_CFG_CH1 (0xff << 8)
223*4882a593Smuzhiyun #define VFE_0_CLAMP_ENC_MAX_CFG_CH2 (0xff << 16)
224*4882a593Smuzhiyun #define VFE_0_CLAMP_ENC_MIN_CFG 0x988
225*4882a593Smuzhiyun #define VFE_0_CLAMP_ENC_MIN_CFG_CH0 (0x0 << 0)
226*4882a593Smuzhiyun #define VFE_0_CLAMP_ENC_MIN_CFG_CH1 (0x0 << 8)
227*4882a593Smuzhiyun #define VFE_0_CLAMP_ENC_MIN_CFG_CH2 (0x0 << 16)
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun #define VFE_0_REALIGN_BUF_CFG 0xaac
230*4882a593Smuzhiyun #define VFE_0_REALIGN_BUF_CFG_CB_ODD_PIXEL BIT(2)
231*4882a593Smuzhiyun #define VFE_0_REALIGN_BUF_CFG_CR_ODD_PIXEL BIT(3)
232*4882a593Smuzhiyun #define VFE_0_REALIGN_BUF_CFG_HSUB_ENABLE BIT(4)
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun #define CAMIF_TIMEOUT_SLEEP_US 1000
235*4882a593Smuzhiyun #define CAMIF_TIMEOUT_ALL_US 1000000
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun #define MSM_VFE_VFE0_UB_SIZE 2047
238*4882a593Smuzhiyun #define MSM_VFE_VFE0_UB_SIZE_RDI (MSM_VFE_VFE0_UB_SIZE / 3)
239*4882a593Smuzhiyun #define MSM_VFE_VFE1_UB_SIZE 1535
240*4882a593Smuzhiyun #define MSM_VFE_VFE1_UB_SIZE_RDI (MSM_VFE_VFE1_UB_SIZE / 3)
241*4882a593Smuzhiyun
vfe_hw_version_read(struct vfe_device * vfe,struct device * dev)242*4882a593Smuzhiyun static void vfe_hw_version_read(struct vfe_device *vfe, struct device *dev)
243*4882a593Smuzhiyun {
244*4882a593Smuzhiyun u32 hw_version = readl_relaxed(vfe->base + VFE_0_HW_VERSION);
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun dev_err(dev, "VFE HW Version = 0x%08x\n", hw_version);
247*4882a593Smuzhiyun }
248*4882a593Smuzhiyun
vfe_get_ub_size(u8 vfe_id)249*4882a593Smuzhiyun static u16 vfe_get_ub_size(u8 vfe_id)
250*4882a593Smuzhiyun {
251*4882a593Smuzhiyun if (vfe_id == 0)
252*4882a593Smuzhiyun return MSM_VFE_VFE0_UB_SIZE_RDI;
253*4882a593Smuzhiyun else if (vfe_id == 1)
254*4882a593Smuzhiyun return MSM_VFE_VFE1_UB_SIZE_RDI;
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun return 0;
257*4882a593Smuzhiyun }
258*4882a593Smuzhiyun
vfe_reg_clr(struct vfe_device * vfe,u32 reg,u32 clr_bits)259*4882a593Smuzhiyun static inline void vfe_reg_clr(struct vfe_device *vfe, u32 reg, u32 clr_bits)
260*4882a593Smuzhiyun {
261*4882a593Smuzhiyun u32 bits = readl_relaxed(vfe->base + reg);
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun writel_relaxed(bits & ~clr_bits, vfe->base + reg);
264*4882a593Smuzhiyun }
265*4882a593Smuzhiyun
vfe_reg_set(struct vfe_device * vfe,u32 reg,u32 set_bits)266*4882a593Smuzhiyun static inline void vfe_reg_set(struct vfe_device *vfe, u32 reg, u32 set_bits)
267*4882a593Smuzhiyun {
268*4882a593Smuzhiyun u32 bits = readl_relaxed(vfe->base + reg);
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun writel_relaxed(bits | set_bits, vfe->base + reg);
271*4882a593Smuzhiyun }
272*4882a593Smuzhiyun
vfe_global_reset(struct vfe_device * vfe)273*4882a593Smuzhiyun static void vfe_global_reset(struct vfe_device *vfe)
274*4882a593Smuzhiyun {
275*4882a593Smuzhiyun u32 reset_bits = VFE_0_GLOBAL_RESET_CMD_IDLE_CGC |
276*4882a593Smuzhiyun VFE_0_GLOBAL_RESET_CMD_DSP |
277*4882a593Smuzhiyun VFE_0_GLOBAL_RESET_CMD_TESTGEN |
278*4882a593Smuzhiyun VFE_0_GLOBAL_RESET_CMD_BUS_MISR |
279*4882a593Smuzhiyun VFE_0_GLOBAL_RESET_CMD_PM |
280*4882a593Smuzhiyun VFE_0_GLOBAL_RESET_CMD_REGISTER |
281*4882a593Smuzhiyun VFE_0_GLOBAL_RESET_CMD_BUS_BDG |
282*4882a593Smuzhiyun VFE_0_GLOBAL_RESET_CMD_BUS |
283*4882a593Smuzhiyun VFE_0_GLOBAL_RESET_CMD_CAMIF |
284*4882a593Smuzhiyun VFE_0_GLOBAL_RESET_CMD_CORE;
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun writel_relaxed(BIT(31), vfe->base + VFE_0_IRQ_MASK_0);
287*4882a593Smuzhiyun wmb();
288*4882a593Smuzhiyun writel_relaxed(reset_bits, vfe->base + VFE_0_GLOBAL_RESET_CMD);
289*4882a593Smuzhiyun }
290*4882a593Smuzhiyun
vfe_halt_request(struct vfe_device * vfe)291*4882a593Smuzhiyun static void vfe_halt_request(struct vfe_device *vfe)
292*4882a593Smuzhiyun {
293*4882a593Smuzhiyun writel_relaxed(VFE_0_BUS_BDG_CMD_HALT_REQ,
294*4882a593Smuzhiyun vfe->base + VFE_0_BUS_BDG_CMD);
295*4882a593Smuzhiyun }
296*4882a593Smuzhiyun
vfe_halt_clear(struct vfe_device * vfe)297*4882a593Smuzhiyun static void vfe_halt_clear(struct vfe_device *vfe)
298*4882a593Smuzhiyun {
299*4882a593Smuzhiyun writel_relaxed(0x0, vfe->base + VFE_0_BUS_BDG_CMD);
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun
vfe_wm_enable(struct vfe_device * vfe,u8 wm,u8 enable)302*4882a593Smuzhiyun static void vfe_wm_enable(struct vfe_device *vfe, u8 wm, u8 enable)
303*4882a593Smuzhiyun {
304*4882a593Smuzhiyun if (enable)
305*4882a593Smuzhiyun vfe_reg_set(vfe, VFE_0_BUS_IMAGE_MASTER_n_WR_CFG(wm),
306*4882a593Smuzhiyun 1 << VFE_0_BUS_IMAGE_MASTER_n_WR_CFG_WR_PATH_SHIFT);
307*4882a593Smuzhiyun else
308*4882a593Smuzhiyun vfe_reg_clr(vfe, VFE_0_BUS_IMAGE_MASTER_n_WR_CFG(wm),
309*4882a593Smuzhiyun 1 << VFE_0_BUS_IMAGE_MASTER_n_WR_CFG_WR_PATH_SHIFT);
310*4882a593Smuzhiyun }
311*4882a593Smuzhiyun
vfe_wm_frame_based(struct vfe_device * vfe,u8 wm,u8 enable)312*4882a593Smuzhiyun static void vfe_wm_frame_based(struct vfe_device *vfe, u8 wm, u8 enable)
313*4882a593Smuzhiyun {
314*4882a593Smuzhiyun if (enable)
315*4882a593Smuzhiyun vfe_reg_set(vfe, VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG(wm),
316*4882a593Smuzhiyun 1 << VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG_FRM_BASED_SHIFT);
317*4882a593Smuzhiyun else
318*4882a593Smuzhiyun vfe_reg_clr(vfe, VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG(wm),
319*4882a593Smuzhiyun 1 << VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG_FRM_BASED_SHIFT);
320*4882a593Smuzhiyun }
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun #define CALC_WORD(width, M, N) (((width) * (M) + (N) - 1) / (N))
323*4882a593Smuzhiyun
vfe_word_per_line_by_pixel(u32 format,u32 pixel_per_line)324*4882a593Smuzhiyun static int vfe_word_per_line_by_pixel(u32 format, u32 pixel_per_line)
325*4882a593Smuzhiyun {
326*4882a593Smuzhiyun int val = 0;
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun switch (format) {
329*4882a593Smuzhiyun case V4L2_PIX_FMT_NV12:
330*4882a593Smuzhiyun case V4L2_PIX_FMT_NV21:
331*4882a593Smuzhiyun case V4L2_PIX_FMT_NV16:
332*4882a593Smuzhiyun case V4L2_PIX_FMT_NV61:
333*4882a593Smuzhiyun val = CALC_WORD(pixel_per_line, 1, 8);
334*4882a593Smuzhiyun break;
335*4882a593Smuzhiyun case V4L2_PIX_FMT_YUYV:
336*4882a593Smuzhiyun case V4L2_PIX_FMT_YVYU:
337*4882a593Smuzhiyun case V4L2_PIX_FMT_UYVY:
338*4882a593Smuzhiyun case V4L2_PIX_FMT_VYUY:
339*4882a593Smuzhiyun val = CALC_WORD(pixel_per_line, 2, 8);
340*4882a593Smuzhiyun break;
341*4882a593Smuzhiyun }
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun return val;
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun
vfe_word_per_line_by_bytes(u32 bytes_per_line)346*4882a593Smuzhiyun static int vfe_word_per_line_by_bytes(u32 bytes_per_line)
347*4882a593Smuzhiyun {
348*4882a593Smuzhiyun return CALC_WORD(bytes_per_line, 1, 8);
349*4882a593Smuzhiyun }
350*4882a593Smuzhiyun
vfe_get_wm_sizes(struct v4l2_pix_format_mplane * pix,u8 plane,u16 * width,u16 * height,u16 * bytesperline)351*4882a593Smuzhiyun static void vfe_get_wm_sizes(struct v4l2_pix_format_mplane *pix, u8 plane,
352*4882a593Smuzhiyun u16 *width, u16 *height, u16 *bytesperline)
353*4882a593Smuzhiyun {
354*4882a593Smuzhiyun switch (pix->pixelformat) {
355*4882a593Smuzhiyun case V4L2_PIX_FMT_NV12:
356*4882a593Smuzhiyun case V4L2_PIX_FMT_NV21:
357*4882a593Smuzhiyun *width = pix->width;
358*4882a593Smuzhiyun *height = pix->height;
359*4882a593Smuzhiyun *bytesperline = pix->plane_fmt[0].bytesperline;
360*4882a593Smuzhiyun if (plane == 1)
361*4882a593Smuzhiyun *height /= 2;
362*4882a593Smuzhiyun break;
363*4882a593Smuzhiyun case V4L2_PIX_FMT_NV16:
364*4882a593Smuzhiyun case V4L2_PIX_FMT_NV61:
365*4882a593Smuzhiyun *width = pix->width;
366*4882a593Smuzhiyun *height = pix->height;
367*4882a593Smuzhiyun *bytesperline = pix->plane_fmt[0].bytesperline;
368*4882a593Smuzhiyun break;
369*4882a593Smuzhiyun case V4L2_PIX_FMT_YUYV:
370*4882a593Smuzhiyun case V4L2_PIX_FMT_YVYU:
371*4882a593Smuzhiyun case V4L2_PIX_FMT_VYUY:
372*4882a593Smuzhiyun case V4L2_PIX_FMT_UYVY:
373*4882a593Smuzhiyun *width = pix->width;
374*4882a593Smuzhiyun *height = pix->height;
375*4882a593Smuzhiyun *bytesperline = pix->plane_fmt[plane].bytesperline;
376*4882a593Smuzhiyun break;
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun }
379*4882a593Smuzhiyun }
380*4882a593Smuzhiyun
vfe_wm_line_based(struct vfe_device * vfe,u32 wm,struct v4l2_pix_format_mplane * pix,u8 plane,u32 enable)381*4882a593Smuzhiyun static void vfe_wm_line_based(struct vfe_device *vfe, u32 wm,
382*4882a593Smuzhiyun struct v4l2_pix_format_mplane *pix,
383*4882a593Smuzhiyun u8 plane, u32 enable)
384*4882a593Smuzhiyun {
385*4882a593Smuzhiyun u32 reg;
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun if (enable) {
388*4882a593Smuzhiyun u16 width = 0, height = 0, bytesperline = 0, wpl;
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun vfe_get_wm_sizes(pix, plane, &width, &height, &bytesperline);
391*4882a593Smuzhiyun
392*4882a593Smuzhiyun wpl = vfe_word_per_line_by_pixel(pix->pixelformat, width);
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun reg = height - 1;
395*4882a593Smuzhiyun reg |= ((wpl + 3) / 4 - 1) << 16;
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun writel_relaxed(reg, vfe->base +
398*4882a593Smuzhiyun VFE_0_BUS_IMAGE_MASTER_n_WR_IMAGE_SIZE(wm));
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun wpl = vfe_word_per_line_by_bytes(bytesperline);
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun reg = 0x3;
403*4882a593Smuzhiyun reg |= (height - 1) << 2;
404*4882a593Smuzhiyun reg |= ((wpl + 1) / 2) << 16;
405*4882a593Smuzhiyun
406*4882a593Smuzhiyun writel_relaxed(reg, vfe->base +
407*4882a593Smuzhiyun VFE_0_BUS_IMAGE_MASTER_n_WR_BUFFER_CFG(wm));
408*4882a593Smuzhiyun } else {
409*4882a593Smuzhiyun writel_relaxed(0, vfe->base +
410*4882a593Smuzhiyun VFE_0_BUS_IMAGE_MASTER_n_WR_IMAGE_SIZE(wm));
411*4882a593Smuzhiyun writel_relaxed(0, vfe->base +
412*4882a593Smuzhiyun VFE_0_BUS_IMAGE_MASTER_n_WR_BUFFER_CFG(wm));
413*4882a593Smuzhiyun }
414*4882a593Smuzhiyun }
415*4882a593Smuzhiyun
vfe_wm_set_framedrop_period(struct vfe_device * vfe,u8 wm,u8 per)416*4882a593Smuzhiyun static void vfe_wm_set_framedrop_period(struct vfe_device *vfe, u8 wm, u8 per)
417*4882a593Smuzhiyun {
418*4882a593Smuzhiyun u32 reg;
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun reg = readl_relaxed(vfe->base +
421*4882a593Smuzhiyun VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG(wm));
422*4882a593Smuzhiyun
423*4882a593Smuzhiyun reg &= ~(VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG_FRM_DROP_PER_MASK);
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun reg |= (per << VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG_FRM_DROP_PER_SHIFT)
426*4882a593Smuzhiyun & VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG_FRM_DROP_PER_MASK;
427*4882a593Smuzhiyun
428*4882a593Smuzhiyun writel_relaxed(reg,
429*4882a593Smuzhiyun vfe->base + VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG(wm));
430*4882a593Smuzhiyun }
431*4882a593Smuzhiyun
vfe_wm_set_framedrop_pattern(struct vfe_device * vfe,u8 wm,u32 pattern)432*4882a593Smuzhiyun static void vfe_wm_set_framedrop_pattern(struct vfe_device *vfe, u8 wm,
433*4882a593Smuzhiyun u32 pattern)
434*4882a593Smuzhiyun {
435*4882a593Smuzhiyun writel_relaxed(pattern,
436*4882a593Smuzhiyun vfe->base + VFE_0_BUS_IMAGE_MASTER_n_WR_FRAMEDROP_PATTERN(wm));
437*4882a593Smuzhiyun }
438*4882a593Smuzhiyun
vfe_wm_set_ub_cfg(struct vfe_device * vfe,u8 wm,u16 offset,u16 depth)439*4882a593Smuzhiyun static void vfe_wm_set_ub_cfg(struct vfe_device *vfe, u8 wm,
440*4882a593Smuzhiyun u16 offset, u16 depth)
441*4882a593Smuzhiyun {
442*4882a593Smuzhiyun u32 reg;
443*4882a593Smuzhiyun
444*4882a593Smuzhiyun reg = (offset << VFE_0_BUS_IMAGE_MASTER_n_WR_UB_CFG_OFFSET_SHIFT) |
445*4882a593Smuzhiyun depth;
446*4882a593Smuzhiyun writel_relaxed(reg, vfe->base + VFE_0_BUS_IMAGE_MASTER_n_WR_UB_CFG(wm));
447*4882a593Smuzhiyun }
448*4882a593Smuzhiyun
vfe_bus_reload_wm(struct vfe_device * vfe,u8 wm)449*4882a593Smuzhiyun static void vfe_bus_reload_wm(struct vfe_device *vfe, u8 wm)
450*4882a593Smuzhiyun {
451*4882a593Smuzhiyun wmb();
452*4882a593Smuzhiyun writel_relaxed(VFE_0_BUS_CMD_Mx_RLD_CMD(wm), vfe->base + VFE_0_BUS_CMD);
453*4882a593Smuzhiyun wmb();
454*4882a593Smuzhiyun }
455*4882a593Smuzhiyun
vfe_wm_set_ping_addr(struct vfe_device * vfe,u8 wm,u32 addr)456*4882a593Smuzhiyun static void vfe_wm_set_ping_addr(struct vfe_device *vfe, u8 wm, u32 addr)
457*4882a593Smuzhiyun {
458*4882a593Smuzhiyun writel_relaxed(addr,
459*4882a593Smuzhiyun vfe->base + VFE_0_BUS_IMAGE_MASTER_n_WR_PING_ADDR(wm));
460*4882a593Smuzhiyun }
461*4882a593Smuzhiyun
vfe_wm_set_pong_addr(struct vfe_device * vfe,u8 wm,u32 addr)462*4882a593Smuzhiyun static void vfe_wm_set_pong_addr(struct vfe_device *vfe, u8 wm, u32 addr)
463*4882a593Smuzhiyun {
464*4882a593Smuzhiyun writel_relaxed(addr,
465*4882a593Smuzhiyun vfe->base + VFE_0_BUS_IMAGE_MASTER_n_WR_PONG_ADDR(wm));
466*4882a593Smuzhiyun }
467*4882a593Smuzhiyun
vfe_wm_get_ping_pong_status(struct vfe_device * vfe,u8 wm)468*4882a593Smuzhiyun static int vfe_wm_get_ping_pong_status(struct vfe_device *vfe, u8 wm)
469*4882a593Smuzhiyun {
470*4882a593Smuzhiyun u32 reg;
471*4882a593Smuzhiyun
472*4882a593Smuzhiyun reg = readl_relaxed(vfe->base + VFE_0_BUS_PING_PONG_STATUS);
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun return (reg >> wm) & 0x1;
475*4882a593Smuzhiyun }
476*4882a593Smuzhiyun
vfe_bus_enable_wr_if(struct vfe_device * vfe,u8 enable)477*4882a593Smuzhiyun static void vfe_bus_enable_wr_if(struct vfe_device *vfe, u8 enable)
478*4882a593Smuzhiyun {
479*4882a593Smuzhiyun if (enable)
480*4882a593Smuzhiyun writel_relaxed(0x101, vfe->base + VFE_0_BUS_CFG);
481*4882a593Smuzhiyun else
482*4882a593Smuzhiyun writel_relaxed(0, vfe->base + VFE_0_BUS_CFG);
483*4882a593Smuzhiyun }
484*4882a593Smuzhiyun
vfe_bus_connect_wm_to_rdi(struct vfe_device * vfe,u8 wm,enum vfe_line_id id)485*4882a593Smuzhiyun static void vfe_bus_connect_wm_to_rdi(struct vfe_device *vfe, u8 wm,
486*4882a593Smuzhiyun enum vfe_line_id id)
487*4882a593Smuzhiyun {
488*4882a593Smuzhiyun u32 reg;
489*4882a593Smuzhiyun
490*4882a593Smuzhiyun reg = VFE_0_RDI_CFG_x_MIPI_EN_BITS;
491*4882a593Smuzhiyun vfe_reg_set(vfe, VFE_0_RDI_CFG_x(0), reg);
492*4882a593Smuzhiyun
493*4882a593Smuzhiyun reg = VFE_0_RDI_CFG_x_RDI_EN_BIT;
494*4882a593Smuzhiyun reg |= ((3 * id) << VFE_0_RDI_CFG_x_RDI_STREAM_SEL_SHIFT) &
495*4882a593Smuzhiyun VFE_0_RDI_CFG_x_RDI_STREAM_SEL_MASK;
496*4882a593Smuzhiyun vfe_reg_set(vfe, VFE_0_RDI_CFG_x(id), reg);
497*4882a593Smuzhiyun
498*4882a593Smuzhiyun switch (id) {
499*4882a593Smuzhiyun case VFE_LINE_RDI0:
500*4882a593Smuzhiyun default:
501*4882a593Smuzhiyun reg = VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI0 <<
502*4882a593Smuzhiyun VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_SHIFT;
503*4882a593Smuzhiyun break;
504*4882a593Smuzhiyun case VFE_LINE_RDI1:
505*4882a593Smuzhiyun reg = VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI1 <<
506*4882a593Smuzhiyun VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_SHIFT;
507*4882a593Smuzhiyun break;
508*4882a593Smuzhiyun case VFE_LINE_RDI2:
509*4882a593Smuzhiyun reg = VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI2 <<
510*4882a593Smuzhiyun VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_SHIFT;
511*4882a593Smuzhiyun break;
512*4882a593Smuzhiyun }
513*4882a593Smuzhiyun
514*4882a593Smuzhiyun if (wm % 2 == 1)
515*4882a593Smuzhiyun reg <<= 16;
516*4882a593Smuzhiyun
517*4882a593Smuzhiyun vfe_reg_set(vfe, VFE_0_BUS_XBAR_CFG_x(wm), reg);
518*4882a593Smuzhiyun }
519*4882a593Smuzhiyun
vfe_wm_set_subsample(struct vfe_device * vfe,u8 wm)520*4882a593Smuzhiyun static void vfe_wm_set_subsample(struct vfe_device *vfe, u8 wm)
521*4882a593Smuzhiyun {
522*4882a593Smuzhiyun writel_relaxed(VFE_0_BUS_IMAGE_MASTER_n_WR_IRQ_SUBSAMPLE_PATTERN_DEF,
523*4882a593Smuzhiyun vfe->base +
524*4882a593Smuzhiyun VFE_0_BUS_IMAGE_MASTER_n_WR_IRQ_SUBSAMPLE_PATTERN(wm));
525*4882a593Smuzhiyun }
526*4882a593Smuzhiyun
vfe_bus_disconnect_wm_from_rdi(struct vfe_device * vfe,u8 wm,enum vfe_line_id id)527*4882a593Smuzhiyun static void vfe_bus_disconnect_wm_from_rdi(struct vfe_device *vfe, u8 wm,
528*4882a593Smuzhiyun enum vfe_line_id id)
529*4882a593Smuzhiyun {
530*4882a593Smuzhiyun u32 reg;
531*4882a593Smuzhiyun
532*4882a593Smuzhiyun reg = VFE_0_RDI_CFG_x_RDI_EN_BIT;
533*4882a593Smuzhiyun vfe_reg_clr(vfe, VFE_0_RDI_CFG_x(id), reg);
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun switch (id) {
536*4882a593Smuzhiyun case VFE_LINE_RDI0:
537*4882a593Smuzhiyun default:
538*4882a593Smuzhiyun reg = VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI0 <<
539*4882a593Smuzhiyun VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_SHIFT;
540*4882a593Smuzhiyun break;
541*4882a593Smuzhiyun case VFE_LINE_RDI1:
542*4882a593Smuzhiyun reg = VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI1 <<
543*4882a593Smuzhiyun VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_SHIFT;
544*4882a593Smuzhiyun break;
545*4882a593Smuzhiyun case VFE_LINE_RDI2:
546*4882a593Smuzhiyun reg = VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI2 <<
547*4882a593Smuzhiyun VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_SHIFT;
548*4882a593Smuzhiyun break;
549*4882a593Smuzhiyun }
550*4882a593Smuzhiyun
551*4882a593Smuzhiyun if (wm % 2 == 1)
552*4882a593Smuzhiyun reg <<= 16;
553*4882a593Smuzhiyun
554*4882a593Smuzhiyun vfe_reg_clr(vfe, VFE_0_BUS_XBAR_CFG_x(wm), reg);
555*4882a593Smuzhiyun }
556*4882a593Smuzhiyun
vfe_set_xbar_cfg(struct vfe_device * vfe,struct vfe_output * output,u8 enable)557*4882a593Smuzhiyun static void vfe_set_xbar_cfg(struct vfe_device *vfe, struct vfe_output *output,
558*4882a593Smuzhiyun u8 enable)
559*4882a593Smuzhiyun {
560*4882a593Smuzhiyun struct vfe_line *line = container_of(output, struct vfe_line, output);
561*4882a593Smuzhiyun u32 p = line->video_out.active_fmt.fmt.pix_mp.pixelformat;
562*4882a593Smuzhiyun u32 reg;
563*4882a593Smuzhiyun
564*4882a593Smuzhiyun switch (p) {
565*4882a593Smuzhiyun case V4L2_PIX_FMT_NV12:
566*4882a593Smuzhiyun case V4L2_PIX_FMT_NV21:
567*4882a593Smuzhiyun case V4L2_PIX_FMT_NV16:
568*4882a593Smuzhiyun case V4L2_PIX_FMT_NV61:
569*4882a593Smuzhiyun reg = VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_LUMA <<
570*4882a593Smuzhiyun VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_SHIFT;
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun if (output->wm_idx[0] % 2 == 1)
573*4882a593Smuzhiyun reg <<= 16;
574*4882a593Smuzhiyun
575*4882a593Smuzhiyun if (enable)
576*4882a593Smuzhiyun vfe_reg_set(vfe,
577*4882a593Smuzhiyun VFE_0_BUS_XBAR_CFG_x(output->wm_idx[0]),
578*4882a593Smuzhiyun reg);
579*4882a593Smuzhiyun else
580*4882a593Smuzhiyun vfe_reg_clr(vfe,
581*4882a593Smuzhiyun VFE_0_BUS_XBAR_CFG_x(output->wm_idx[0]),
582*4882a593Smuzhiyun reg);
583*4882a593Smuzhiyun
584*4882a593Smuzhiyun reg = VFE_0_BUS_XBAR_CFG_x_M_PAIR_STREAM_EN;
585*4882a593Smuzhiyun if (p == V4L2_PIX_FMT_NV12 || p == V4L2_PIX_FMT_NV16)
586*4882a593Smuzhiyun reg |= VFE_0_BUS_XBAR_CFG_x_M_PAIR_STREAM_SWAP_INTER_INTRA;
587*4882a593Smuzhiyun
588*4882a593Smuzhiyun if (output->wm_idx[1] % 2 == 1)
589*4882a593Smuzhiyun reg <<= 16;
590*4882a593Smuzhiyun
591*4882a593Smuzhiyun if (enable)
592*4882a593Smuzhiyun vfe_reg_set(vfe,
593*4882a593Smuzhiyun VFE_0_BUS_XBAR_CFG_x(output->wm_idx[1]),
594*4882a593Smuzhiyun reg);
595*4882a593Smuzhiyun else
596*4882a593Smuzhiyun vfe_reg_clr(vfe,
597*4882a593Smuzhiyun VFE_0_BUS_XBAR_CFG_x(output->wm_idx[1]),
598*4882a593Smuzhiyun reg);
599*4882a593Smuzhiyun break;
600*4882a593Smuzhiyun case V4L2_PIX_FMT_YUYV:
601*4882a593Smuzhiyun case V4L2_PIX_FMT_YVYU:
602*4882a593Smuzhiyun case V4L2_PIX_FMT_VYUY:
603*4882a593Smuzhiyun case V4L2_PIX_FMT_UYVY:
604*4882a593Smuzhiyun reg = VFE_0_BUS_XBAR_CFG_x_M_REALIGN_BUF_EN;
605*4882a593Smuzhiyun reg |= VFE_0_BUS_XBAR_CFG_x_M_PAIR_STREAM_EN;
606*4882a593Smuzhiyun
607*4882a593Smuzhiyun if (p == V4L2_PIX_FMT_YUYV || p == V4L2_PIX_FMT_YVYU)
608*4882a593Smuzhiyun reg |= VFE_0_BUS_XBAR_CFG_x_M_PAIR_STREAM_SWAP_INTER_INTRA;
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun if (output->wm_idx[0] % 2 == 1)
611*4882a593Smuzhiyun reg <<= 16;
612*4882a593Smuzhiyun
613*4882a593Smuzhiyun if (enable)
614*4882a593Smuzhiyun vfe_reg_set(vfe,
615*4882a593Smuzhiyun VFE_0_BUS_XBAR_CFG_x(output->wm_idx[0]),
616*4882a593Smuzhiyun reg);
617*4882a593Smuzhiyun else
618*4882a593Smuzhiyun vfe_reg_clr(vfe,
619*4882a593Smuzhiyun VFE_0_BUS_XBAR_CFG_x(output->wm_idx[0]),
620*4882a593Smuzhiyun reg);
621*4882a593Smuzhiyun break;
622*4882a593Smuzhiyun default:
623*4882a593Smuzhiyun break;
624*4882a593Smuzhiyun }
625*4882a593Smuzhiyun }
626*4882a593Smuzhiyun
vfe_set_realign_cfg(struct vfe_device * vfe,struct vfe_line * line,u8 enable)627*4882a593Smuzhiyun static void vfe_set_realign_cfg(struct vfe_device *vfe, struct vfe_line *line,
628*4882a593Smuzhiyun u8 enable)
629*4882a593Smuzhiyun {
630*4882a593Smuzhiyun u32 p = line->video_out.active_fmt.fmt.pix_mp.pixelformat;
631*4882a593Smuzhiyun u32 val = VFE_0_MODULE_ZOOM_EN_REALIGN_BUF;
632*4882a593Smuzhiyun
633*4882a593Smuzhiyun if (p != V4L2_PIX_FMT_YUYV && p != V4L2_PIX_FMT_YVYU &&
634*4882a593Smuzhiyun p != V4L2_PIX_FMT_VYUY && p != V4L2_PIX_FMT_UYVY)
635*4882a593Smuzhiyun return;
636*4882a593Smuzhiyun
637*4882a593Smuzhiyun if (enable) {
638*4882a593Smuzhiyun vfe_reg_set(vfe, VFE_0_MODULE_ZOOM_EN, val);
639*4882a593Smuzhiyun } else {
640*4882a593Smuzhiyun vfe_reg_clr(vfe, VFE_0_MODULE_ZOOM_EN, val);
641*4882a593Smuzhiyun return;
642*4882a593Smuzhiyun }
643*4882a593Smuzhiyun
644*4882a593Smuzhiyun val = VFE_0_REALIGN_BUF_CFG_HSUB_ENABLE;
645*4882a593Smuzhiyun
646*4882a593Smuzhiyun if (p == V4L2_PIX_FMT_UYVY || p == V4L2_PIX_FMT_YUYV)
647*4882a593Smuzhiyun val |= VFE_0_REALIGN_BUF_CFG_CR_ODD_PIXEL;
648*4882a593Smuzhiyun else
649*4882a593Smuzhiyun val |= VFE_0_REALIGN_BUF_CFG_CB_ODD_PIXEL;
650*4882a593Smuzhiyun
651*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_REALIGN_BUF_CFG);
652*4882a593Smuzhiyun }
653*4882a593Smuzhiyun
vfe_set_rdi_cid(struct vfe_device * vfe,enum vfe_line_id id,u8 cid)654*4882a593Smuzhiyun static void vfe_set_rdi_cid(struct vfe_device *vfe, enum vfe_line_id id, u8 cid)
655*4882a593Smuzhiyun {
656*4882a593Smuzhiyun vfe_reg_clr(vfe, VFE_0_RDI_CFG_x(id),
657*4882a593Smuzhiyun VFE_0_RDI_CFG_x_RDI_M0_SEL_MASK);
658*4882a593Smuzhiyun
659*4882a593Smuzhiyun vfe_reg_set(vfe, VFE_0_RDI_CFG_x(id),
660*4882a593Smuzhiyun cid << VFE_0_RDI_CFG_x_RDI_M0_SEL_SHIFT);
661*4882a593Smuzhiyun }
662*4882a593Smuzhiyun
vfe_reg_update(struct vfe_device * vfe,enum vfe_line_id line_id)663*4882a593Smuzhiyun static void vfe_reg_update(struct vfe_device *vfe, enum vfe_line_id line_id)
664*4882a593Smuzhiyun {
665*4882a593Smuzhiyun vfe->reg_update |= VFE_0_REG_UPDATE_line_n(line_id);
666*4882a593Smuzhiyun wmb();
667*4882a593Smuzhiyun writel_relaxed(vfe->reg_update, vfe->base + VFE_0_REG_UPDATE);
668*4882a593Smuzhiyun wmb();
669*4882a593Smuzhiyun }
670*4882a593Smuzhiyun
vfe_reg_update_clear(struct vfe_device * vfe,enum vfe_line_id line_id)671*4882a593Smuzhiyun static inline void vfe_reg_update_clear(struct vfe_device *vfe,
672*4882a593Smuzhiyun enum vfe_line_id line_id)
673*4882a593Smuzhiyun {
674*4882a593Smuzhiyun vfe->reg_update &= ~VFE_0_REG_UPDATE_line_n(line_id);
675*4882a593Smuzhiyun }
676*4882a593Smuzhiyun
vfe_enable_irq_wm_line(struct vfe_device * vfe,u8 wm,enum vfe_line_id line_id,u8 enable)677*4882a593Smuzhiyun static void vfe_enable_irq_wm_line(struct vfe_device *vfe, u8 wm,
678*4882a593Smuzhiyun enum vfe_line_id line_id, u8 enable)
679*4882a593Smuzhiyun {
680*4882a593Smuzhiyun u32 irq_en0 = VFE_0_IRQ_MASK_0_IMAGE_MASTER_n_PING_PONG(wm) |
681*4882a593Smuzhiyun VFE_0_IRQ_MASK_0_line_n_REG_UPDATE(line_id);
682*4882a593Smuzhiyun u32 irq_en1 = VFE_0_IRQ_MASK_1_IMAGE_MASTER_n_BUS_OVERFLOW(wm) |
683*4882a593Smuzhiyun VFE_0_IRQ_MASK_1_RDIn_SOF(line_id);
684*4882a593Smuzhiyun
685*4882a593Smuzhiyun if (enable) {
686*4882a593Smuzhiyun vfe_reg_set(vfe, VFE_0_IRQ_MASK_0, irq_en0);
687*4882a593Smuzhiyun vfe_reg_set(vfe, VFE_0_IRQ_MASK_1, irq_en1);
688*4882a593Smuzhiyun } else {
689*4882a593Smuzhiyun vfe_reg_clr(vfe, VFE_0_IRQ_MASK_0, irq_en0);
690*4882a593Smuzhiyun vfe_reg_clr(vfe, VFE_0_IRQ_MASK_1, irq_en1);
691*4882a593Smuzhiyun }
692*4882a593Smuzhiyun }
693*4882a593Smuzhiyun
vfe_enable_irq_pix_line(struct vfe_device * vfe,u8 comp,enum vfe_line_id line_id,u8 enable)694*4882a593Smuzhiyun static void vfe_enable_irq_pix_line(struct vfe_device *vfe, u8 comp,
695*4882a593Smuzhiyun enum vfe_line_id line_id, u8 enable)
696*4882a593Smuzhiyun {
697*4882a593Smuzhiyun struct vfe_output *output = &vfe->line[line_id].output;
698*4882a593Smuzhiyun unsigned int i;
699*4882a593Smuzhiyun u32 irq_en0;
700*4882a593Smuzhiyun u32 irq_en1;
701*4882a593Smuzhiyun u32 comp_mask = 0;
702*4882a593Smuzhiyun
703*4882a593Smuzhiyun irq_en0 = VFE_0_IRQ_MASK_0_CAMIF_SOF;
704*4882a593Smuzhiyun irq_en0 |= VFE_0_IRQ_MASK_0_CAMIF_EOF;
705*4882a593Smuzhiyun irq_en0 |= VFE_0_IRQ_MASK_0_IMAGE_COMPOSITE_DONE_n(comp);
706*4882a593Smuzhiyun irq_en0 |= VFE_0_IRQ_MASK_0_line_n_REG_UPDATE(line_id);
707*4882a593Smuzhiyun irq_en1 = VFE_0_IRQ_MASK_1_CAMIF_ERROR;
708*4882a593Smuzhiyun for (i = 0; i < output->wm_num; i++) {
709*4882a593Smuzhiyun irq_en1 |= VFE_0_IRQ_MASK_1_IMAGE_MASTER_n_BUS_OVERFLOW(
710*4882a593Smuzhiyun output->wm_idx[i]);
711*4882a593Smuzhiyun comp_mask |= (1 << output->wm_idx[i]) << comp * 8;
712*4882a593Smuzhiyun }
713*4882a593Smuzhiyun
714*4882a593Smuzhiyun if (enable) {
715*4882a593Smuzhiyun vfe_reg_set(vfe, VFE_0_IRQ_MASK_0, irq_en0);
716*4882a593Smuzhiyun vfe_reg_set(vfe, VFE_0_IRQ_MASK_1, irq_en1);
717*4882a593Smuzhiyun vfe_reg_set(vfe, VFE_0_IRQ_COMPOSITE_MASK_0, comp_mask);
718*4882a593Smuzhiyun } else {
719*4882a593Smuzhiyun vfe_reg_clr(vfe, VFE_0_IRQ_MASK_0, irq_en0);
720*4882a593Smuzhiyun vfe_reg_clr(vfe, VFE_0_IRQ_MASK_1, irq_en1);
721*4882a593Smuzhiyun vfe_reg_clr(vfe, VFE_0_IRQ_COMPOSITE_MASK_0, comp_mask);
722*4882a593Smuzhiyun }
723*4882a593Smuzhiyun }
724*4882a593Smuzhiyun
vfe_enable_irq_common(struct vfe_device * vfe)725*4882a593Smuzhiyun static void vfe_enable_irq_common(struct vfe_device *vfe)
726*4882a593Smuzhiyun {
727*4882a593Smuzhiyun u32 irq_en0 = VFE_0_IRQ_MASK_0_RESET_ACK;
728*4882a593Smuzhiyun u32 irq_en1 = VFE_0_IRQ_MASK_1_VIOLATION |
729*4882a593Smuzhiyun VFE_0_IRQ_MASK_1_BUS_BDG_HALT_ACK;
730*4882a593Smuzhiyun
731*4882a593Smuzhiyun vfe_reg_set(vfe, VFE_0_IRQ_MASK_0, irq_en0);
732*4882a593Smuzhiyun vfe_reg_set(vfe, VFE_0_IRQ_MASK_1, irq_en1);
733*4882a593Smuzhiyun }
734*4882a593Smuzhiyun
vfe_set_demux_cfg(struct vfe_device * vfe,struct vfe_line * line)735*4882a593Smuzhiyun static void vfe_set_demux_cfg(struct vfe_device *vfe, struct vfe_line *line)
736*4882a593Smuzhiyun {
737*4882a593Smuzhiyun u32 val, even_cfg, odd_cfg;
738*4882a593Smuzhiyun
739*4882a593Smuzhiyun writel_relaxed(VFE_0_DEMUX_CFG_PERIOD, vfe->base + VFE_0_DEMUX_CFG);
740*4882a593Smuzhiyun
741*4882a593Smuzhiyun val = VFE_0_DEMUX_GAIN_0_CH0_EVEN | VFE_0_DEMUX_GAIN_0_CH0_ODD;
742*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_DEMUX_GAIN_0);
743*4882a593Smuzhiyun
744*4882a593Smuzhiyun val = VFE_0_DEMUX_GAIN_1_CH1 | VFE_0_DEMUX_GAIN_1_CH2;
745*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_DEMUX_GAIN_1);
746*4882a593Smuzhiyun
747*4882a593Smuzhiyun switch (line->fmt[MSM_VFE_PAD_SINK].code) {
748*4882a593Smuzhiyun case MEDIA_BUS_FMT_YUYV8_2X8:
749*4882a593Smuzhiyun even_cfg = VFE_0_DEMUX_EVEN_CFG_PATTERN_YUYV;
750*4882a593Smuzhiyun odd_cfg = VFE_0_DEMUX_ODD_CFG_PATTERN_YUYV;
751*4882a593Smuzhiyun break;
752*4882a593Smuzhiyun case MEDIA_BUS_FMT_YVYU8_2X8:
753*4882a593Smuzhiyun even_cfg = VFE_0_DEMUX_EVEN_CFG_PATTERN_YVYU;
754*4882a593Smuzhiyun odd_cfg = VFE_0_DEMUX_ODD_CFG_PATTERN_YVYU;
755*4882a593Smuzhiyun break;
756*4882a593Smuzhiyun case MEDIA_BUS_FMT_UYVY8_2X8:
757*4882a593Smuzhiyun default:
758*4882a593Smuzhiyun even_cfg = VFE_0_DEMUX_EVEN_CFG_PATTERN_UYVY;
759*4882a593Smuzhiyun odd_cfg = VFE_0_DEMUX_ODD_CFG_PATTERN_UYVY;
760*4882a593Smuzhiyun break;
761*4882a593Smuzhiyun case MEDIA_BUS_FMT_VYUY8_2X8:
762*4882a593Smuzhiyun even_cfg = VFE_0_DEMUX_EVEN_CFG_PATTERN_VYUY;
763*4882a593Smuzhiyun odd_cfg = VFE_0_DEMUX_ODD_CFG_PATTERN_VYUY;
764*4882a593Smuzhiyun break;
765*4882a593Smuzhiyun }
766*4882a593Smuzhiyun
767*4882a593Smuzhiyun writel_relaxed(even_cfg, vfe->base + VFE_0_DEMUX_EVEN_CFG);
768*4882a593Smuzhiyun writel_relaxed(odd_cfg, vfe->base + VFE_0_DEMUX_ODD_CFG);
769*4882a593Smuzhiyun }
770*4882a593Smuzhiyun
vfe_calc_interp_reso(u16 input,u16 output)771*4882a593Smuzhiyun static inline u8 vfe_calc_interp_reso(u16 input, u16 output)
772*4882a593Smuzhiyun {
773*4882a593Smuzhiyun if (input / output >= 16)
774*4882a593Smuzhiyun return 0;
775*4882a593Smuzhiyun
776*4882a593Smuzhiyun if (input / output >= 8)
777*4882a593Smuzhiyun return 1;
778*4882a593Smuzhiyun
779*4882a593Smuzhiyun if (input / output >= 4)
780*4882a593Smuzhiyun return 2;
781*4882a593Smuzhiyun
782*4882a593Smuzhiyun return 3;
783*4882a593Smuzhiyun }
784*4882a593Smuzhiyun
vfe_set_scale_cfg(struct vfe_device * vfe,struct vfe_line * line)785*4882a593Smuzhiyun static void vfe_set_scale_cfg(struct vfe_device *vfe, struct vfe_line *line)
786*4882a593Smuzhiyun {
787*4882a593Smuzhiyun u32 p = line->video_out.active_fmt.fmt.pix_mp.pixelformat;
788*4882a593Smuzhiyun u32 reg;
789*4882a593Smuzhiyun u16 input, output;
790*4882a593Smuzhiyun u8 interp_reso;
791*4882a593Smuzhiyun u32 phase_mult;
792*4882a593Smuzhiyun
793*4882a593Smuzhiyun writel_relaxed(0x3, vfe->base + VFE_0_SCALE_ENC_Y_CFG);
794*4882a593Smuzhiyun
795*4882a593Smuzhiyun input = line->fmt[MSM_VFE_PAD_SINK].width - 1;
796*4882a593Smuzhiyun output = line->compose.width - 1;
797*4882a593Smuzhiyun reg = (output << 16) | input;
798*4882a593Smuzhiyun writel_relaxed(reg, vfe->base + VFE_0_SCALE_ENC_Y_H_IMAGE_SIZE);
799*4882a593Smuzhiyun
800*4882a593Smuzhiyun interp_reso = vfe_calc_interp_reso(input, output);
801*4882a593Smuzhiyun phase_mult = input * (1 << (14 + interp_reso)) / output;
802*4882a593Smuzhiyun reg = (interp_reso << 28) | phase_mult;
803*4882a593Smuzhiyun writel_relaxed(reg, vfe->base + VFE_0_SCALE_ENC_Y_H_PHASE);
804*4882a593Smuzhiyun
805*4882a593Smuzhiyun input = line->fmt[MSM_VFE_PAD_SINK].height - 1;
806*4882a593Smuzhiyun output = line->compose.height - 1;
807*4882a593Smuzhiyun reg = (output << 16) | input;
808*4882a593Smuzhiyun writel_relaxed(reg, vfe->base + VFE_0_SCALE_ENC_Y_V_IMAGE_SIZE);
809*4882a593Smuzhiyun
810*4882a593Smuzhiyun interp_reso = vfe_calc_interp_reso(input, output);
811*4882a593Smuzhiyun phase_mult = input * (1 << (14 + interp_reso)) / output;
812*4882a593Smuzhiyun reg = (interp_reso << 28) | phase_mult;
813*4882a593Smuzhiyun writel_relaxed(reg, vfe->base + VFE_0_SCALE_ENC_Y_V_PHASE);
814*4882a593Smuzhiyun
815*4882a593Smuzhiyun writel_relaxed(0x3, vfe->base + VFE_0_SCALE_ENC_CBCR_CFG);
816*4882a593Smuzhiyun
817*4882a593Smuzhiyun input = line->fmt[MSM_VFE_PAD_SINK].width - 1;
818*4882a593Smuzhiyun output = line->compose.width / 2 - 1;
819*4882a593Smuzhiyun reg = (output << 16) | input;
820*4882a593Smuzhiyun writel_relaxed(reg, vfe->base + VFE_0_SCALE_ENC_CBCR_H_IMAGE_SIZE);
821*4882a593Smuzhiyun
822*4882a593Smuzhiyun interp_reso = vfe_calc_interp_reso(input, output);
823*4882a593Smuzhiyun phase_mult = input * (1 << (14 + interp_reso)) / output;
824*4882a593Smuzhiyun reg = (interp_reso << 28) | phase_mult;
825*4882a593Smuzhiyun writel_relaxed(reg, vfe->base + VFE_0_SCALE_ENC_CBCR_H_PHASE);
826*4882a593Smuzhiyun
827*4882a593Smuzhiyun input = line->fmt[MSM_VFE_PAD_SINK].height - 1;
828*4882a593Smuzhiyun output = line->compose.height - 1;
829*4882a593Smuzhiyun if (p == V4L2_PIX_FMT_NV12 || p == V4L2_PIX_FMT_NV21)
830*4882a593Smuzhiyun output = line->compose.height / 2 - 1;
831*4882a593Smuzhiyun reg = (output << 16) | input;
832*4882a593Smuzhiyun writel_relaxed(reg, vfe->base + VFE_0_SCALE_ENC_CBCR_V_IMAGE_SIZE);
833*4882a593Smuzhiyun
834*4882a593Smuzhiyun interp_reso = vfe_calc_interp_reso(input, output);
835*4882a593Smuzhiyun phase_mult = input * (1 << (14 + interp_reso)) / output;
836*4882a593Smuzhiyun reg = (interp_reso << 28) | phase_mult;
837*4882a593Smuzhiyun writel_relaxed(reg, vfe->base + VFE_0_SCALE_ENC_CBCR_V_PHASE);
838*4882a593Smuzhiyun }
839*4882a593Smuzhiyun
vfe_set_crop_cfg(struct vfe_device * vfe,struct vfe_line * line)840*4882a593Smuzhiyun static void vfe_set_crop_cfg(struct vfe_device *vfe, struct vfe_line *line)
841*4882a593Smuzhiyun {
842*4882a593Smuzhiyun u32 p = line->video_out.active_fmt.fmt.pix_mp.pixelformat;
843*4882a593Smuzhiyun u32 reg;
844*4882a593Smuzhiyun u16 first, last;
845*4882a593Smuzhiyun
846*4882a593Smuzhiyun first = line->crop.left;
847*4882a593Smuzhiyun last = line->crop.left + line->crop.width - 1;
848*4882a593Smuzhiyun reg = (first << 16) | last;
849*4882a593Smuzhiyun writel_relaxed(reg, vfe->base + VFE_0_CROP_ENC_Y_WIDTH);
850*4882a593Smuzhiyun
851*4882a593Smuzhiyun first = line->crop.top;
852*4882a593Smuzhiyun last = line->crop.top + line->crop.height - 1;
853*4882a593Smuzhiyun reg = (first << 16) | last;
854*4882a593Smuzhiyun writel_relaxed(reg, vfe->base + VFE_0_CROP_ENC_Y_HEIGHT);
855*4882a593Smuzhiyun
856*4882a593Smuzhiyun first = line->crop.left / 2;
857*4882a593Smuzhiyun last = line->crop.left / 2 + line->crop.width / 2 - 1;
858*4882a593Smuzhiyun reg = (first << 16) | last;
859*4882a593Smuzhiyun writel_relaxed(reg, vfe->base + VFE_0_CROP_ENC_CBCR_WIDTH);
860*4882a593Smuzhiyun
861*4882a593Smuzhiyun first = line->crop.top;
862*4882a593Smuzhiyun last = line->crop.top + line->crop.height - 1;
863*4882a593Smuzhiyun if (p == V4L2_PIX_FMT_NV12 || p == V4L2_PIX_FMT_NV21) {
864*4882a593Smuzhiyun first = line->crop.top / 2;
865*4882a593Smuzhiyun last = line->crop.top / 2 + line->crop.height / 2 - 1;
866*4882a593Smuzhiyun }
867*4882a593Smuzhiyun reg = (first << 16) | last;
868*4882a593Smuzhiyun writel_relaxed(reg, vfe->base + VFE_0_CROP_ENC_CBCR_HEIGHT);
869*4882a593Smuzhiyun }
870*4882a593Smuzhiyun
vfe_set_clamp_cfg(struct vfe_device * vfe)871*4882a593Smuzhiyun static void vfe_set_clamp_cfg(struct vfe_device *vfe)
872*4882a593Smuzhiyun {
873*4882a593Smuzhiyun u32 val = VFE_0_CLAMP_ENC_MAX_CFG_CH0 |
874*4882a593Smuzhiyun VFE_0_CLAMP_ENC_MAX_CFG_CH1 |
875*4882a593Smuzhiyun VFE_0_CLAMP_ENC_MAX_CFG_CH2;
876*4882a593Smuzhiyun
877*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_CLAMP_ENC_MAX_CFG);
878*4882a593Smuzhiyun
879*4882a593Smuzhiyun val = VFE_0_CLAMP_ENC_MIN_CFG_CH0 |
880*4882a593Smuzhiyun VFE_0_CLAMP_ENC_MIN_CFG_CH1 |
881*4882a593Smuzhiyun VFE_0_CLAMP_ENC_MIN_CFG_CH2;
882*4882a593Smuzhiyun
883*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_CLAMP_ENC_MIN_CFG);
884*4882a593Smuzhiyun }
885*4882a593Smuzhiyun
vfe_set_qos(struct vfe_device * vfe)886*4882a593Smuzhiyun static void vfe_set_qos(struct vfe_device *vfe)
887*4882a593Smuzhiyun {
888*4882a593Smuzhiyun u32 val = VFE_0_BUS_BDG_QOS_CFG_0_CFG;
889*4882a593Smuzhiyun u32 val7 = VFE_0_BUS_BDG_QOS_CFG_7_CFG;
890*4882a593Smuzhiyun
891*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_QOS_CFG_0);
892*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_QOS_CFG_1);
893*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_QOS_CFG_2);
894*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_QOS_CFG_3);
895*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_QOS_CFG_4);
896*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_QOS_CFG_5);
897*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_QOS_CFG_6);
898*4882a593Smuzhiyun writel_relaxed(val7, vfe->base + VFE_0_BUS_BDG_QOS_CFG_7);
899*4882a593Smuzhiyun }
900*4882a593Smuzhiyun
vfe_set_ds(struct vfe_device * vfe)901*4882a593Smuzhiyun static void vfe_set_ds(struct vfe_device *vfe)
902*4882a593Smuzhiyun {
903*4882a593Smuzhiyun u32 val = VFE_0_BUS_BDG_DS_CFG_0_CFG;
904*4882a593Smuzhiyun u32 val16 = VFE_0_BUS_BDG_DS_CFG_16_CFG;
905*4882a593Smuzhiyun
906*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_0);
907*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_1);
908*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_2);
909*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_3);
910*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_4);
911*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_5);
912*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_6);
913*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_7);
914*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_8);
915*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_9);
916*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_10);
917*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_11);
918*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_12);
919*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_13);
920*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_14);
921*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_15);
922*4882a593Smuzhiyun writel_relaxed(val16, vfe->base + VFE_0_BUS_BDG_DS_CFG_16);
923*4882a593Smuzhiyun }
924*4882a593Smuzhiyun
vfe_set_cgc_override(struct vfe_device * vfe,u8 wm,u8 enable)925*4882a593Smuzhiyun static void vfe_set_cgc_override(struct vfe_device *vfe, u8 wm, u8 enable)
926*4882a593Smuzhiyun {
927*4882a593Smuzhiyun /* empty */
928*4882a593Smuzhiyun }
929*4882a593Smuzhiyun
vfe_set_camif_cfg(struct vfe_device * vfe,struct vfe_line * line)930*4882a593Smuzhiyun static void vfe_set_camif_cfg(struct vfe_device *vfe, struct vfe_line *line)
931*4882a593Smuzhiyun {
932*4882a593Smuzhiyun u32 val;
933*4882a593Smuzhiyun
934*4882a593Smuzhiyun switch (line->fmt[MSM_VFE_PAD_SINK].code) {
935*4882a593Smuzhiyun case MEDIA_BUS_FMT_YUYV8_2X8:
936*4882a593Smuzhiyun val = VFE_0_CORE_CFG_PIXEL_PATTERN_YCBYCR;
937*4882a593Smuzhiyun break;
938*4882a593Smuzhiyun case MEDIA_BUS_FMT_YVYU8_2X8:
939*4882a593Smuzhiyun val = VFE_0_CORE_CFG_PIXEL_PATTERN_YCRYCB;
940*4882a593Smuzhiyun break;
941*4882a593Smuzhiyun case MEDIA_BUS_FMT_UYVY8_2X8:
942*4882a593Smuzhiyun default:
943*4882a593Smuzhiyun val = VFE_0_CORE_CFG_PIXEL_PATTERN_CBYCRY;
944*4882a593Smuzhiyun break;
945*4882a593Smuzhiyun case MEDIA_BUS_FMT_VYUY8_2X8:
946*4882a593Smuzhiyun val = VFE_0_CORE_CFG_PIXEL_PATTERN_CRYCBY;
947*4882a593Smuzhiyun break;
948*4882a593Smuzhiyun }
949*4882a593Smuzhiyun
950*4882a593Smuzhiyun val |= VFE_0_CORE_CFG_COMPOSITE_REG_UPDATE_EN;
951*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_CORE_CFG);
952*4882a593Smuzhiyun
953*4882a593Smuzhiyun val = line->fmt[MSM_VFE_PAD_SINK].width * 2 - 1;
954*4882a593Smuzhiyun val |= (line->fmt[MSM_VFE_PAD_SINK].height - 1) << 16;
955*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_CAMIF_FRAME_CFG);
956*4882a593Smuzhiyun
957*4882a593Smuzhiyun val = line->fmt[MSM_VFE_PAD_SINK].width * 2 - 1;
958*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_CAMIF_WINDOW_WIDTH_CFG);
959*4882a593Smuzhiyun
960*4882a593Smuzhiyun val = line->fmt[MSM_VFE_PAD_SINK].height - 1;
961*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_CAMIF_WINDOW_HEIGHT_CFG);
962*4882a593Smuzhiyun
963*4882a593Smuzhiyun val = 0xffffffff;
964*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_CAMIF_SUBSAMPLE_CFG);
965*4882a593Smuzhiyun
966*4882a593Smuzhiyun val = 0xffffffff;
967*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_CAMIF_IRQ_FRAMEDROP_PATTERN);
968*4882a593Smuzhiyun
969*4882a593Smuzhiyun val = 0xffffffff;
970*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_CAMIF_IRQ_SUBSAMPLE_PATTERN);
971*4882a593Smuzhiyun
972*4882a593Smuzhiyun val = VFE_0_RDI_CFG_x_MIPI_EN_BITS;
973*4882a593Smuzhiyun vfe_reg_set(vfe, VFE_0_RDI_CFG_x(0), val);
974*4882a593Smuzhiyun
975*4882a593Smuzhiyun val = VFE_0_CAMIF_CFG_VFE_OUTPUT_EN;
976*4882a593Smuzhiyun writel_relaxed(val, vfe->base + VFE_0_CAMIF_CFG);
977*4882a593Smuzhiyun }
978*4882a593Smuzhiyun
vfe_set_camif_cmd(struct vfe_device * vfe,u8 enable)979*4882a593Smuzhiyun static void vfe_set_camif_cmd(struct vfe_device *vfe, u8 enable)
980*4882a593Smuzhiyun {
981*4882a593Smuzhiyun u32 cmd;
982*4882a593Smuzhiyun
983*4882a593Smuzhiyun cmd = VFE_0_CAMIF_CMD_CLEAR_CAMIF_STATUS | VFE_0_CAMIF_CMD_NO_CHANGE;
984*4882a593Smuzhiyun writel_relaxed(cmd, vfe->base + VFE_0_CAMIF_CMD);
985*4882a593Smuzhiyun wmb();
986*4882a593Smuzhiyun
987*4882a593Smuzhiyun if (enable)
988*4882a593Smuzhiyun cmd = VFE_0_CAMIF_CMD_ENABLE_FRAME_BOUNDARY;
989*4882a593Smuzhiyun else
990*4882a593Smuzhiyun cmd = VFE_0_CAMIF_CMD_DISABLE_FRAME_BOUNDARY;
991*4882a593Smuzhiyun
992*4882a593Smuzhiyun writel_relaxed(cmd, vfe->base + VFE_0_CAMIF_CMD);
993*4882a593Smuzhiyun }
994*4882a593Smuzhiyun
vfe_set_module_cfg(struct vfe_device * vfe,u8 enable)995*4882a593Smuzhiyun static void vfe_set_module_cfg(struct vfe_device *vfe, u8 enable)
996*4882a593Smuzhiyun {
997*4882a593Smuzhiyun u32 val_lens = VFE_0_MODULE_LENS_EN_DEMUX |
998*4882a593Smuzhiyun VFE_0_MODULE_LENS_EN_CHROMA_UPSAMPLE;
999*4882a593Smuzhiyun u32 val_zoom = VFE_0_MODULE_ZOOM_EN_SCALE_ENC |
1000*4882a593Smuzhiyun VFE_0_MODULE_ZOOM_EN_CROP_ENC;
1001*4882a593Smuzhiyun
1002*4882a593Smuzhiyun if (enable) {
1003*4882a593Smuzhiyun vfe_reg_set(vfe, VFE_0_MODULE_LENS_EN, val_lens);
1004*4882a593Smuzhiyun vfe_reg_set(vfe, VFE_0_MODULE_ZOOM_EN, val_zoom);
1005*4882a593Smuzhiyun } else {
1006*4882a593Smuzhiyun vfe_reg_clr(vfe, VFE_0_MODULE_LENS_EN, val_lens);
1007*4882a593Smuzhiyun vfe_reg_clr(vfe, VFE_0_MODULE_ZOOM_EN, val_zoom);
1008*4882a593Smuzhiyun }
1009*4882a593Smuzhiyun }
1010*4882a593Smuzhiyun
vfe_camif_wait_for_stop(struct vfe_device * vfe,struct device * dev)1011*4882a593Smuzhiyun static int vfe_camif_wait_for_stop(struct vfe_device *vfe, struct device *dev)
1012*4882a593Smuzhiyun {
1013*4882a593Smuzhiyun u32 val;
1014*4882a593Smuzhiyun int ret;
1015*4882a593Smuzhiyun
1016*4882a593Smuzhiyun ret = readl_poll_timeout(vfe->base + VFE_0_CAMIF_STATUS,
1017*4882a593Smuzhiyun val,
1018*4882a593Smuzhiyun (val & VFE_0_CAMIF_STATUS_HALT),
1019*4882a593Smuzhiyun CAMIF_TIMEOUT_SLEEP_US,
1020*4882a593Smuzhiyun CAMIF_TIMEOUT_ALL_US);
1021*4882a593Smuzhiyun if (ret < 0)
1022*4882a593Smuzhiyun dev_err(dev, "%s: camif stop timeout\n", __func__);
1023*4882a593Smuzhiyun
1024*4882a593Smuzhiyun return ret;
1025*4882a593Smuzhiyun }
1026*4882a593Smuzhiyun
vfe_isr_read(struct vfe_device * vfe,u32 * value0,u32 * value1)1027*4882a593Smuzhiyun static void vfe_isr_read(struct vfe_device *vfe, u32 *value0, u32 *value1)
1028*4882a593Smuzhiyun {
1029*4882a593Smuzhiyun *value0 = readl_relaxed(vfe->base + VFE_0_IRQ_STATUS_0);
1030*4882a593Smuzhiyun *value1 = readl_relaxed(vfe->base + VFE_0_IRQ_STATUS_1);
1031*4882a593Smuzhiyun
1032*4882a593Smuzhiyun writel_relaxed(*value0, vfe->base + VFE_0_IRQ_CLEAR_0);
1033*4882a593Smuzhiyun writel_relaxed(*value1, vfe->base + VFE_0_IRQ_CLEAR_1);
1034*4882a593Smuzhiyun
1035*4882a593Smuzhiyun wmb();
1036*4882a593Smuzhiyun writel_relaxed(VFE_0_IRQ_CMD_GLOBAL_CLEAR, vfe->base + VFE_0_IRQ_CMD);
1037*4882a593Smuzhiyun }
1038*4882a593Smuzhiyun
vfe_violation_read(struct vfe_device * vfe)1039*4882a593Smuzhiyun static void vfe_violation_read(struct vfe_device *vfe)
1040*4882a593Smuzhiyun {
1041*4882a593Smuzhiyun u32 violation = readl_relaxed(vfe->base + VFE_0_VIOLATION_STATUS);
1042*4882a593Smuzhiyun
1043*4882a593Smuzhiyun pr_err_ratelimited("VFE: violation = 0x%08x\n", violation);
1044*4882a593Smuzhiyun }
1045*4882a593Smuzhiyun
1046*4882a593Smuzhiyun /*
1047*4882a593Smuzhiyun * vfe_isr - ISPIF module interrupt handler
1048*4882a593Smuzhiyun * @irq: Interrupt line
1049*4882a593Smuzhiyun * @dev: VFE device
1050*4882a593Smuzhiyun *
1051*4882a593Smuzhiyun * Return IRQ_HANDLED on success
1052*4882a593Smuzhiyun */
vfe_isr(int irq,void * dev)1053*4882a593Smuzhiyun static irqreturn_t vfe_isr(int irq, void *dev)
1054*4882a593Smuzhiyun {
1055*4882a593Smuzhiyun struct vfe_device *vfe = dev;
1056*4882a593Smuzhiyun u32 value0, value1;
1057*4882a593Smuzhiyun int i, j;
1058*4882a593Smuzhiyun
1059*4882a593Smuzhiyun vfe->ops->isr_read(vfe, &value0, &value1);
1060*4882a593Smuzhiyun
1061*4882a593Smuzhiyun trace_printk("VFE: status0 = 0x%08x, status1 = 0x%08x\n",
1062*4882a593Smuzhiyun value0, value1);
1063*4882a593Smuzhiyun
1064*4882a593Smuzhiyun if (value0 & VFE_0_IRQ_STATUS_0_RESET_ACK)
1065*4882a593Smuzhiyun vfe->isr_ops.reset_ack(vfe);
1066*4882a593Smuzhiyun
1067*4882a593Smuzhiyun if (value1 & VFE_0_IRQ_STATUS_1_VIOLATION)
1068*4882a593Smuzhiyun vfe->ops->violation_read(vfe);
1069*4882a593Smuzhiyun
1070*4882a593Smuzhiyun if (value1 & VFE_0_IRQ_STATUS_1_BUS_BDG_HALT_ACK)
1071*4882a593Smuzhiyun vfe->isr_ops.halt_ack(vfe);
1072*4882a593Smuzhiyun
1073*4882a593Smuzhiyun for (i = VFE_LINE_RDI0; i <= VFE_LINE_PIX; i++)
1074*4882a593Smuzhiyun if (value0 & VFE_0_IRQ_STATUS_0_line_n_REG_UPDATE(i))
1075*4882a593Smuzhiyun vfe->isr_ops.reg_update(vfe, i);
1076*4882a593Smuzhiyun
1077*4882a593Smuzhiyun if (value0 & VFE_0_IRQ_STATUS_0_CAMIF_SOF)
1078*4882a593Smuzhiyun vfe->isr_ops.sof(vfe, VFE_LINE_PIX);
1079*4882a593Smuzhiyun
1080*4882a593Smuzhiyun for (i = VFE_LINE_RDI0; i <= VFE_LINE_RDI2; i++)
1081*4882a593Smuzhiyun if (value1 & VFE_0_IRQ_STATUS_1_RDIn_SOF(i))
1082*4882a593Smuzhiyun vfe->isr_ops.sof(vfe, i);
1083*4882a593Smuzhiyun
1084*4882a593Smuzhiyun for (i = 0; i < MSM_VFE_COMPOSITE_IRQ_NUM; i++)
1085*4882a593Smuzhiyun if (value0 & VFE_0_IRQ_STATUS_0_IMAGE_COMPOSITE_DONE_n(i)) {
1086*4882a593Smuzhiyun vfe->isr_ops.comp_done(vfe, i);
1087*4882a593Smuzhiyun for (j = 0; j < ARRAY_SIZE(vfe->wm_output_map); j++)
1088*4882a593Smuzhiyun if (vfe->wm_output_map[j] == VFE_LINE_PIX)
1089*4882a593Smuzhiyun value0 &= ~VFE_0_IRQ_MASK_0_IMAGE_MASTER_n_PING_PONG(j);
1090*4882a593Smuzhiyun }
1091*4882a593Smuzhiyun
1092*4882a593Smuzhiyun for (i = 0; i < MSM_VFE_IMAGE_MASTERS_NUM; i++)
1093*4882a593Smuzhiyun if (value0 & VFE_0_IRQ_STATUS_0_IMAGE_MASTER_n_PING_PONG(i))
1094*4882a593Smuzhiyun vfe->isr_ops.wm_done(vfe, i);
1095*4882a593Smuzhiyun
1096*4882a593Smuzhiyun return IRQ_HANDLED;
1097*4882a593Smuzhiyun }
1098*4882a593Smuzhiyun
1099*4882a593Smuzhiyun const struct vfe_hw_ops vfe_ops_4_7 = {
1100*4882a593Smuzhiyun .hw_version_read = vfe_hw_version_read,
1101*4882a593Smuzhiyun .get_ub_size = vfe_get_ub_size,
1102*4882a593Smuzhiyun .global_reset = vfe_global_reset,
1103*4882a593Smuzhiyun .halt_request = vfe_halt_request,
1104*4882a593Smuzhiyun .halt_clear = vfe_halt_clear,
1105*4882a593Smuzhiyun .wm_enable = vfe_wm_enable,
1106*4882a593Smuzhiyun .wm_frame_based = vfe_wm_frame_based,
1107*4882a593Smuzhiyun .wm_line_based = vfe_wm_line_based,
1108*4882a593Smuzhiyun .wm_set_framedrop_period = vfe_wm_set_framedrop_period,
1109*4882a593Smuzhiyun .wm_set_framedrop_pattern = vfe_wm_set_framedrop_pattern,
1110*4882a593Smuzhiyun .wm_set_ub_cfg = vfe_wm_set_ub_cfg,
1111*4882a593Smuzhiyun .bus_reload_wm = vfe_bus_reload_wm,
1112*4882a593Smuzhiyun .wm_set_ping_addr = vfe_wm_set_ping_addr,
1113*4882a593Smuzhiyun .wm_set_pong_addr = vfe_wm_set_pong_addr,
1114*4882a593Smuzhiyun .wm_get_ping_pong_status = vfe_wm_get_ping_pong_status,
1115*4882a593Smuzhiyun .bus_enable_wr_if = vfe_bus_enable_wr_if,
1116*4882a593Smuzhiyun .bus_connect_wm_to_rdi = vfe_bus_connect_wm_to_rdi,
1117*4882a593Smuzhiyun .wm_set_subsample = vfe_wm_set_subsample,
1118*4882a593Smuzhiyun .bus_disconnect_wm_from_rdi = vfe_bus_disconnect_wm_from_rdi,
1119*4882a593Smuzhiyun .set_xbar_cfg = vfe_set_xbar_cfg,
1120*4882a593Smuzhiyun .set_realign_cfg = vfe_set_realign_cfg,
1121*4882a593Smuzhiyun .set_rdi_cid = vfe_set_rdi_cid,
1122*4882a593Smuzhiyun .reg_update = vfe_reg_update,
1123*4882a593Smuzhiyun .reg_update_clear = vfe_reg_update_clear,
1124*4882a593Smuzhiyun .enable_irq_wm_line = vfe_enable_irq_wm_line,
1125*4882a593Smuzhiyun .enable_irq_pix_line = vfe_enable_irq_pix_line,
1126*4882a593Smuzhiyun .enable_irq_common = vfe_enable_irq_common,
1127*4882a593Smuzhiyun .set_demux_cfg = vfe_set_demux_cfg,
1128*4882a593Smuzhiyun .set_scale_cfg = vfe_set_scale_cfg,
1129*4882a593Smuzhiyun .set_crop_cfg = vfe_set_crop_cfg,
1130*4882a593Smuzhiyun .set_clamp_cfg = vfe_set_clamp_cfg,
1131*4882a593Smuzhiyun .set_qos = vfe_set_qos,
1132*4882a593Smuzhiyun .set_ds = vfe_set_ds,
1133*4882a593Smuzhiyun .set_cgc_override = vfe_set_cgc_override,
1134*4882a593Smuzhiyun .set_camif_cfg = vfe_set_camif_cfg,
1135*4882a593Smuzhiyun .set_camif_cmd = vfe_set_camif_cmd,
1136*4882a593Smuzhiyun .set_module_cfg = vfe_set_module_cfg,
1137*4882a593Smuzhiyun .camif_wait_for_stop = vfe_camif_wait_for_stop,
1138*4882a593Smuzhiyun .isr_read = vfe_isr_read,
1139*4882a593Smuzhiyun .violation_read = vfe_violation_read,
1140*4882a593Smuzhiyun .isr = vfe_isr,
1141*4882a593Smuzhiyun };
1142