xref: /linux/drivers/media/platform/qcom/camss/camss-vfe-4-7.c (revision 312e1c858a0f05e27812cd7de87114801fced508)
14e1abf66STodor Tomov // SPDX-License-Identifier: GPL-2.0
24e1abf66STodor Tomov /*
34e1abf66STodor Tomov  * camss-vfe-4-7.c
44e1abf66STodor Tomov  *
54e1abf66STodor Tomov  * Qualcomm MSM Camera Subsystem - VFE (Video Front End) Module v4.7
64e1abf66STodor Tomov  *
74e1abf66STodor Tomov  * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
84e1abf66STodor Tomov  * Copyright (C) 2015-2018 Linaro Ltd.
94e1abf66STodor Tomov  */
104e1abf66STodor Tomov 
114e1abf66STodor Tomov #include <linux/interrupt.h>
124e1abf66STodor Tomov #include <linux/iopoll.h>
134e1abf66STodor Tomov 
144e1abf66STodor Tomov #include "camss-vfe.h"
154e1abf66STodor Tomov 
164e1abf66STodor Tomov #define VFE_0_HW_VERSION		0x000
174e1abf66STodor Tomov 
184e1abf66STodor Tomov #define VFE_0_GLOBAL_RESET_CMD		0x018
194e1abf66STodor Tomov #define VFE_0_GLOBAL_RESET_CMD_CORE	BIT(0)
204e1abf66STodor Tomov #define VFE_0_GLOBAL_RESET_CMD_CAMIF	BIT(1)
214e1abf66STodor Tomov #define VFE_0_GLOBAL_RESET_CMD_BUS	BIT(2)
224e1abf66STodor Tomov #define VFE_0_GLOBAL_RESET_CMD_BUS_BDG	BIT(3)
234e1abf66STodor Tomov #define VFE_0_GLOBAL_RESET_CMD_REGISTER	BIT(4)
244e1abf66STodor Tomov #define VFE_0_GLOBAL_RESET_CMD_PM	BIT(5)
254e1abf66STodor Tomov #define VFE_0_GLOBAL_RESET_CMD_BUS_MISR	BIT(6)
264e1abf66STodor Tomov #define VFE_0_GLOBAL_RESET_CMD_TESTGEN	BIT(7)
274e1abf66STodor Tomov #define VFE_0_GLOBAL_RESET_CMD_DSP	BIT(8)
284e1abf66STodor Tomov #define VFE_0_GLOBAL_RESET_CMD_IDLE_CGC	BIT(9)
294e1abf66STodor Tomov 
304e1abf66STodor Tomov #define VFE_0_MODULE_LENS_EN		0x040
314e1abf66STodor Tomov #define VFE_0_MODULE_LENS_EN_DEMUX		BIT(2)
324e1abf66STodor Tomov #define VFE_0_MODULE_LENS_EN_CHROMA_UPSAMPLE	BIT(3)
334e1abf66STodor Tomov 
344e1abf66STodor Tomov #define VFE_0_MODULE_ZOOM_EN		0x04c
354e1abf66STodor Tomov #define VFE_0_MODULE_ZOOM_EN_SCALE_ENC		BIT(1)
364e1abf66STodor Tomov #define VFE_0_MODULE_ZOOM_EN_CROP_ENC		BIT(2)
37*312e1c85STodor Tomov #define VFE_0_MODULE_ZOOM_EN_REALIGN_BUF	BIT(9)
384e1abf66STodor Tomov 
394e1abf66STodor Tomov #define VFE_0_CORE_CFG			0x050
404e1abf66STodor Tomov #define VFE_0_CORE_CFG_PIXEL_PATTERN_YCBYCR	0x4
414e1abf66STodor Tomov #define VFE_0_CORE_CFG_PIXEL_PATTERN_YCRYCB	0x5
424e1abf66STodor Tomov #define VFE_0_CORE_CFG_PIXEL_PATTERN_CBYCRY	0x6
434e1abf66STodor Tomov #define VFE_0_CORE_CFG_PIXEL_PATTERN_CRYCBY	0x7
444e1abf66STodor Tomov #define VFE_0_CORE_CFG_COMPOSITE_REG_UPDATE_EN	BIT(4)
454e1abf66STodor Tomov 
464e1abf66STodor Tomov #define VFE_0_IRQ_CMD			0x058
474e1abf66STodor Tomov #define VFE_0_IRQ_CMD_GLOBAL_CLEAR	BIT(0)
484e1abf66STodor Tomov 
494e1abf66STodor Tomov #define VFE_0_IRQ_MASK_0		0x05c
504e1abf66STodor Tomov #define VFE_0_IRQ_MASK_0_CAMIF_SOF			BIT(0)
514e1abf66STodor Tomov #define VFE_0_IRQ_MASK_0_CAMIF_EOF			BIT(1)
524e1abf66STodor Tomov #define VFE_0_IRQ_MASK_0_RDIn_REG_UPDATE(n)		BIT((n) + 5)
534e1abf66STodor Tomov #define VFE_0_IRQ_MASK_0_line_n_REG_UPDATE(n)		\
544e1abf66STodor Tomov 	((n) == VFE_LINE_PIX ? BIT(4) : VFE_0_IRQ_MASK_0_RDIn_REG_UPDATE(n))
554e1abf66STodor Tomov #define VFE_0_IRQ_MASK_0_IMAGE_MASTER_n_PING_PONG(n)	BIT((n) + 8)
564e1abf66STodor Tomov #define VFE_0_IRQ_MASK_0_IMAGE_COMPOSITE_DONE_n(n)	BIT((n) + 25)
574e1abf66STodor Tomov #define VFE_0_IRQ_MASK_0_RESET_ACK			BIT(31)
584e1abf66STodor Tomov #define VFE_0_IRQ_MASK_1		0x060
594e1abf66STodor Tomov #define VFE_0_IRQ_MASK_1_CAMIF_ERROR			BIT(0)
604e1abf66STodor Tomov #define VFE_0_IRQ_MASK_1_VIOLATION			BIT(7)
614e1abf66STodor Tomov #define VFE_0_IRQ_MASK_1_BUS_BDG_HALT_ACK		BIT(8)
624e1abf66STodor Tomov #define VFE_0_IRQ_MASK_1_IMAGE_MASTER_n_BUS_OVERFLOW(n)	BIT((n) + 9)
634e1abf66STodor Tomov #define VFE_0_IRQ_MASK_1_RDIn_SOF(n)			BIT((n) + 29)
644e1abf66STodor Tomov 
654e1abf66STodor Tomov #define VFE_0_IRQ_CLEAR_0		0x064
664e1abf66STodor Tomov #define VFE_0_IRQ_CLEAR_1		0x068
674e1abf66STodor Tomov 
684e1abf66STodor Tomov #define VFE_0_IRQ_STATUS_0		0x06c
694e1abf66STodor Tomov #define VFE_0_IRQ_STATUS_0_CAMIF_SOF			BIT(0)
704e1abf66STodor Tomov #define VFE_0_IRQ_STATUS_0_RDIn_REG_UPDATE(n)		BIT((n) + 5)
714e1abf66STodor Tomov #define VFE_0_IRQ_STATUS_0_line_n_REG_UPDATE(n)		\
724e1abf66STodor Tomov 	((n) == VFE_LINE_PIX ? BIT(4) : VFE_0_IRQ_STATUS_0_RDIn_REG_UPDATE(n))
734e1abf66STodor Tomov #define VFE_0_IRQ_STATUS_0_IMAGE_MASTER_n_PING_PONG(n)	BIT((n) + 8)
744e1abf66STodor Tomov #define VFE_0_IRQ_STATUS_0_IMAGE_COMPOSITE_DONE_n(n)	BIT((n) + 25)
754e1abf66STodor Tomov #define VFE_0_IRQ_STATUS_0_RESET_ACK			BIT(31)
764e1abf66STodor Tomov #define VFE_0_IRQ_STATUS_1		0x070
774e1abf66STodor Tomov #define VFE_0_IRQ_STATUS_1_VIOLATION			BIT(7)
784e1abf66STodor Tomov #define VFE_0_IRQ_STATUS_1_BUS_BDG_HALT_ACK		BIT(8)
794e1abf66STodor Tomov #define VFE_0_IRQ_STATUS_1_RDIn_SOF(n)			BIT((n) + 29)
804e1abf66STodor Tomov 
814e1abf66STodor Tomov #define VFE_0_IRQ_COMPOSITE_MASK_0	0x074
824e1abf66STodor Tomov #define VFE_0_VIOLATION_STATUS		0x07c
834e1abf66STodor Tomov 
844e1abf66STodor Tomov #define VFE_0_BUS_CMD			0x80
854e1abf66STodor Tomov #define VFE_0_BUS_CMD_Mx_RLD_CMD(x)	BIT(x)
864e1abf66STodor Tomov 
874e1abf66STodor Tomov #define VFE_0_BUS_CFG			0x084
884e1abf66STodor Tomov 
894e1abf66STodor Tomov #define VFE_0_BUS_XBAR_CFG_x(x)		(0x90 + 0x4 * ((x) / 2))
904e1abf66STodor Tomov #define VFE_0_BUS_XBAR_CFG_x_M_PAIR_STREAM_EN			BIT(2)
91*312e1c85STodor Tomov #define VFE_0_BUS_XBAR_CFG_x_M_REALIGN_BUF_EN			BIT(3)
92*312e1c85STodor Tomov #define VFE_0_BUS_XBAR_CFG_x_M_PAIR_STREAM_SWAP_INTRA		(0x1 << 4)
93*312e1c85STodor Tomov #define VFE_0_BUS_XBAR_CFG_x_M_PAIR_STREAM_SWAP_INTER		(0x2 << 4)
944e1abf66STodor Tomov #define VFE_0_BUS_XBAR_CFG_x_M_PAIR_STREAM_SWAP_INTER_INTRA	(0x3 << 4)
954e1abf66STodor Tomov #define VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_SHIFT		8
964e1abf66STodor Tomov #define VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_LUMA		0x0
974e1abf66STodor Tomov #define VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI0	0xc
984e1abf66STodor Tomov #define VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI1	0xd
994e1abf66STodor Tomov #define VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI2	0xe
1004e1abf66STodor Tomov 
1014e1abf66STodor Tomov #define VFE_0_BUS_IMAGE_MASTER_n_WR_CFG(n)		(0x0a0 + 0x2c * (n))
1024e1abf66STodor Tomov #define VFE_0_BUS_IMAGE_MASTER_n_WR_CFG_WR_PATH_SHIFT	0
1034e1abf66STodor Tomov #define VFE_0_BUS_IMAGE_MASTER_n_WR_PING_ADDR(n)	(0x0a4 + 0x2c * (n))
1044e1abf66STodor Tomov #define VFE_0_BUS_IMAGE_MASTER_n_WR_PONG_ADDR(n)	(0x0ac + 0x2c * (n))
1054e1abf66STodor Tomov #define VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG(n)		(0x0b4 + 0x2c * (n))
1064e1abf66STodor Tomov #define VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG_FRM_BASED_SHIFT	1
1074e1abf66STodor Tomov #define VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG_FRM_DROP_PER_SHIFT	2
1084e1abf66STodor Tomov #define VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG_FRM_DROP_PER_MASK	(0x1f << 2)
1094e1abf66STodor Tomov #define VFE_0_BUS_IMAGE_MASTER_n_WR_UB_CFG(n)		(0x0b8 + 0x2c * (n))
1104e1abf66STodor Tomov #define VFE_0_BUS_IMAGE_MASTER_n_WR_UB_CFG_OFFSET_SHIFT	16
1114e1abf66STodor Tomov #define VFE_0_BUS_IMAGE_MASTER_n_WR_IMAGE_SIZE(n)	(0x0bc + 0x2c * (n))
1124e1abf66STodor Tomov #define VFE_0_BUS_IMAGE_MASTER_n_WR_BUFFER_CFG(n)	(0x0c0 + 0x2c * (n))
1134e1abf66STodor Tomov #define VFE_0_BUS_IMAGE_MASTER_n_WR_FRAMEDROP_PATTERN(n)	\
1144e1abf66STodor Tomov 							(0x0c4 + 0x2c * (n))
1154e1abf66STodor Tomov #define VFE_0_BUS_IMAGE_MASTER_n_WR_IRQ_SUBSAMPLE_PATTERN(n)	\
1164e1abf66STodor Tomov 							(0x0c8 + 0x2c * (n))
1174e1abf66STodor Tomov #define VFE_0_BUS_IMAGE_MASTER_n_WR_IRQ_SUBSAMPLE_PATTERN_DEF	0xffffffff
1184e1abf66STodor Tomov 
1194e1abf66STodor Tomov #define VFE_0_BUS_PING_PONG_STATUS	0x338
1204e1abf66STodor Tomov 
1214e1abf66STodor Tomov #define VFE_0_BUS_BDG_CMD		0x400
1224e1abf66STodor Tomov #define VFE_0_BUS_BDG_CMD_HALT_REQ	1
1234e1abf66STodor Tomov 
1244e1abf66STodor Tomov #define VFE_0_BUS_BDG_QOS_CFG_0		0x404
1254e1abf66STodor Tomov #define VFE_0_BUS_BDG_QOS_CFG_0_CFG	0xaaa9aaa9
1264e1abf66STodor Tomov #define VFE_0_BUS_BDG_QOS_CFG_1		0x408
1274e1abf66STodor Tomov #define VFE_0_BUS_BDG_QOS_CFG_2		0x40c
1284e1abf66STodor Tomov #define VFE_0_BUS_BDG_QOS_CFG_3		0x410
1294e1abf66STodor Tomov #define VFE_0_BUS_BDG_QOS_CFG_4		0x414
1304e1abf66STodor Tomov #define VFE_0_BUS_BDG_QOS_CFG_5		0x418
1314e1abf66STodor Tomov #define VFE_0_BUS_BDG_QOS_CFG_6		0x41c
1324e1abf66STodor Tomov #define VFE_0_BUS_BDG_QOS_CFG_7		0x420
1334e1abf66STodor Tomov #define VFE_0_BUS_BDG_QOS_CFG_7_CFG	0x0001aaa9
1344e1abf66STodor Tomov 
1354e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_0		0x424
1364e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_0_CFG	0xcccc0011
1374e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_1		0x428
1384e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_2		0x42c
1394e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_3		0x430
1404e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_4		0x434
1414e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_5		0x438
1424e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_6		0x43c
1434e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_7		0x440
1444e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_8		0x444
1454e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_9		0x448
1464e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_10		0x44c
1474e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_11		0x450
1484e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_12		0x454
1494e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_13		0x458
1504e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_14		0x45c
1514e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_15		0x460
1524e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_16		0x464
1534e1abf66STodor Tomov #define VFE_0_BUS_BDG_DS_CFG_16_CFG	0x40000103
1544e1abf66STodor Tomov 
1554e1abf66STodor Tomov #define VFE_0_RDI_CFG_x(x)		(0x46c + (0x4 * (x)))
1564e1abf66STodor Tomov #define VFE_0_RDI_CFG_x_RDI_STREAM_SEL_SHIFT	28
1574e1abf66STodor Tomov #define VFE_0_RDI_CFG_x_RDI_STREAM_SEL_MASK	(0xf << 28)
1584e1abf66STodor Tomov #define VFE_0_RDI_CFG_x_RDI_M0_SEL_SHIFT	4
1594e1abf66STodor Tomov #define VFE_0_RDI_CFG_x_RDI_M0_SEL_MASK		(0xf << 4)
1604e1abf66STodor Tomov #define VFE_0_RDI_CFG_x_RDI_EN_BIT		BIT(2)
1614e1abf66STodor Tomov #define VFE_0_RDI_CFG_x_MIPI_EN_BITS		0x3
1624e1abf66STodor Tomov 
1634e1abf66STodor Tomov #define VFE_0_CAMIF_CMD				0x478
1644e1abf66STodor Tomov #define VFE_0_CAMIF_CMD_DISABLE_FRAME_BOUNDARY	0
1654e1abf66STodor Tomov #define VFE_0_CAMIF_CMD_ENABLE_FRAME_BOUNDARY	1
1664e1abf66STodor Tomov #define VFE_0_CAMIF_CMD_NO_CHANGE		3
1674e1abf66STodor Tomov #define VFE_0_CAMIF_CMD_CLEAR_CAMIF_STATUS	BIT(2)
1684e1abf66STodor Tomov #define VFE_0_CAMIF_CFG				0x47c
1694e1abf66STodor Tomov #define VFE_0_CAMIF_CFG_VFE_OUTPUT_EN		BIT(6)
1704e1abf66STodor Tomov #define VFE_0_CAMIF_FRAME_CFG			0x484
1714e1abf66STodor Tomov #define VFE_0_CAMIF_WINDOW_WIDTH_CFG		0x488
1724e1abf66STodor Tomov #define VFE_0_CAMIF_WINDOW_HEIGHT_CFG		0x48c
1734e1abf66STodor Tomov #define VFE_0_CAMIF_SUBSAMPLE_CFG		0x490
1744e1abf66STodor Tomov #define VFE_0_CAMIF_IRQ_FRAMEDROP_PATTERN	0x498
1754e1abf66STodor Tomov #define VFE_0_CAMIF_IRQ_SUBSAMPLE_PATTERN	0x49c
1764e1abf66STodor Tomov #define VFE_0_CAMIF_STATUS			0x4a4
1774e1abf66STodor Tomov #define VFE_0_CAMIF_STATUS_HALT			BIT(31)
1784e1abf66STodor Tomov 
1794e1abf66STodor Tomov #define VFE_0_REG_UPDATE		0x4ac
1804e1abf66STodor Tomov #define VFE_0_REG_UPDATE_RDIn(n)		BIT(1 + (n))
1814e1abf66STodor Tomov #define VFE_0_REG_UPDATE_line_n(n)		\
1824e1abf66STodor Tomov 			((n) == VFE_LINE_PIX ? 1 : VFE_0_REG_UPDATE_RDIn(n))
1834e1abf66STodor Tomov 
1844e1abf66STodor Tomov #define VFE_0_DEMUX_CFG				0x560
1854e1abf66STodor Tomov #define VFE_0_DEMUX_CFG_PERIOD			0x3
1864e1abf66STodor Tomov #define VFE_0_DEMUX_GAIN_0			0x564
1874e1abf66STodor Tomov #define VFE_0_DEMUX_GAIN_0_CH0_EVEN		(0x80 << 0)
1884e1abf66STodor Tomov #define VFE_0_DEMUX_GAIN_0_CH0_ODD		(0x80 << 16)
1894e1abf66STodor Tomov #define VFE_0_DEMUX_GAIN_1			0x568
1904e1abf66STodor Tomov #define VFE_0_DEMUX_GAIN_1_CH1			(0x80 << 0)
1914e1abf66STodor Tomov #define VFE_0_DEMUX_GAIN_1_CH2			(0x80 << 16)
1924e1abf66STodor Tomov #define VFE_0_DEMUX_EVEN_CFG			0x574
1934e1abf66STodor Tomov #define VFE_0_DEMUX_EVEN_CFG_PATTERN_YUYV	0x9cac
1944e1abf66STodor Tomov #define VFE_0_DEMUX_EVEN_CFG_PATTERN_YVYU	0xac9c
1954e1abf66STodor Tomov #define VFE_0_DEMUX_EVEN_CFG_PATTERN_UYVY	0xc9ca
1964e1abf66STodor Tomov #define VFE_0_DEMUX_EVEN_CFG_PATTERN_VYUY	0xcac9
1974e1abf66STodor Tomov #define VFE_0_DEMUX_ODD_CFG			0x578
1984e1abf66STodor Tomov #define VFE_0_DEMUX_ODD_CFG_PATTERN_YUYV	0x9cac
1994e1abf66STodor Tomov #define VFE_0_DEMUX_ODD_CFG_PATTERN_YVYU	0xac9c
2004e1abf66STodor Tomov #define VFE_0_DEMUX_ODD_CFG_PATTERN_UYVY	0xc9ca
2014e1abf66STodor Tomov #define VFE_0_DEMUX_ODD_CFG_PATTERN_VYUY	0xcac9
2024e1abf66STodor Tomov 
2034e1abf66STodor Tomov #define VFE_0_SCALE_ENC_Y_CFG			0x91c
2044e1abf66STodor Tomov #define VFE_0_SCALE_ENC_Y_H_IMAGE_SIZE		0x920
2054e1abf66STodor Tomov #define VFE_0_SCALE_ENC_Y_H_PHASE		0x924
2064e1abf66STodor Tomov #define VFE_0_SCALE_ENC_Y_V_IMAGE_SIZE		0x934
2074e1abf66STodor Tomov #define VFE_0_SCALE_ENC_Y_V_PHASE		0x938
2084e1abf66STodor Tomov #define VFE_0_SCALE_ENC_CBCR_CFG		0x948
2094e1abf66STodor Tomov #define VFE_0_SCALE_ENC_CBCR_H_IMAGE_SIZE	0x94c
2104e1abf66STodor Tomov #define VFE_0_SCALE_ENC_CBCR_H_PHASE		0x950
2114e1abf66STodor Tomov #define VFE_0_SCALE_ENC_CBCR_V_IMAGE_SIZE	0x960
2124e1abf66STodor Tomov #define VFE_0_SCALE_ENC_CBCR_V_PHASE		0x964
2134e1abf66STodor Tomov 
2144e1abf66STodor Tomov #define VFE_0_CROP_ENC_Y_WIDTH			0x974
2154e1abf66STodor Tomov #define VFE_0_CROP_ENC_Y_HEIGHT			0x978
2164e1abf66STodor Tomov #define VFE_0_CROP_ENC_CBCR_WIDTH		0x97c
2174e1abf66STodor Tomov #define VFE_0_CROP_ENC_CBCR_HEIGHT		0x980
2184e1abf66STodor Tomov 
2194e1abf66STodor Tomov #define VFE_0_CLAMP_ENC_MAX_CFG			0x984
2204e1abf66STodor Tomov #define VFE_0_CLAMP_ENC_MAX_CFG_CH0		(0xff << 0)
2214e1abf66STodor Tomov #define VFE_0_CLAMP_ENC_MAX_CFG_CH1		(0xff << 8)
2224e1abf66STodor Tomov #define VFE_0_CLAMP_ENC_MAX_CFG_CH2		(0xff << 16)
2234e1abf66STodor Tomov #define VFE_0_CLAMP_ENC_MIN_CFG			0x988
2244e1abf66STodor Tomov #define VFE_0_CLAMP_ENC_MIN_CFG_CH0		(0x0 << 0)
2254e1abf66STodor Tomov #define VFE_0_CLAMP_ENC_MIN_CFG_CH1		(0x0 << 8)
2264e1abf66STodor Tomov #define VFE_0_CLAMP_ENC_MIN_CFG_CH2		(0x0 << 16)
2274e1abf66STodor Tomov 
228*312e1c85STodor Tomov #define VFE_0_REALIGN_BUF_CFG			0xaac
229*312e1c85STodor Tomov #define VFE_0_REALIGN_BUF_CFG_CB_ODD_PIXEL     BIT(2)
230*312e1c85STodor Tomov #define VFE_0_REALIGN_BUF_CFG_CR_ODD_PIXEL     BIT(3)
231*312e1c85STodor Tomov #define VFE_0_REALIGN_BUF_CFG_HSUB_ENABLE      BIT(4)
232*312e1c85STodor Tomov 
2334e1abf66STodor Tomov #define CAMIF_TIMEOUT_SLEEP_US 1000
2344e1abf66STodor Tomov #define CAMIF_TIMEOUT_ALL_US 1000000
2354e1abf66STodor Tomov 
2364e1abf66STodor Tomov #define MSM_VFE_VFE0_UB_SIZE 2047
2374e1abf66STodor Tomov #define MSM_VFE_VFE0_UB_SIZE_RDI (MSM_VFE_VFE0_UB_SIZE / 3)
2384e1abf66STodor Tomov #define MSM_VFE_VFE1_UB_SIZE 1535
2394e1abf66STodor Tomov #define MSM_VFE_VFE1_UB_SIZE_RDI (MSM_VFE_VFE1_UB_SIZE / 3)
2404e1abf66STodor Tomov 
2414e1abf66STodor Tomov static void vfe_hw_version_read(struct vfe_device *vfe, struct device *dev)
2424e1abf66STodor Tomov {
2434e1abf66STodor Tomov 	u32 hw_version = readl_relaxed(vfe->base + VFE_0_HW_VERSION);
2444e1abf66STodor Tomov 
2454e1abf66STodor Tomov 	dev_err(dev, "VFE HW Version = 0x%08x\n", hw_version);
2464e1abf66STodor Tomov }
2474e1abf66STodor Tomov 
2484e1abf66STodor Tomov static u16 vfe_get_ub_size(u8 vfe_id)
2494e1abf66STodor Tomov {
2504e1abf66STodor Tomov 	if (vfe_id == 0)
2514e1abf66STodor Tomov 		return MSM_VFE_VFE0_UB_SIZE_RDI;
2524e1abf66STodor Tomov 	else if (vfe_id == 1)
2534e1abf66STodor Tomov 		return MSM_VFE_VFE1_UB_SIZE_RDI;
2544e1abf66STodor Tomov 
2554e1abf66STodor Tomov 	return 0;
2564e1abf66STodor Tomov }
2574e1abf66STodor Tomov 
2584e1abf66STodor Tomov static inline void vfe_reg_clr(struct vfe_device *vfe, u32 reg, u32 clr_bits)
2594e1abf66STodor Tomov {
2604e1abf66STodor Tomov 	u32 bits = readl_relaxed(vfe->base + reg);
2614e1abf66STodor Tomov 
2624e1abf66STodor Tomov 	writel_relaxed(bits & ~clr_bits, vfe->base + reg);
2634e1abf66STodor Tomov }
2644e1abf66STodor Tomov 
2654e1abf66STodor Tomov static inline void vfe_reg_set(struct vfe_device *vfe, u32 reg, u32 set_bits)
2664e1abf66STodor Tomov {
2674e1abf66STodor Tomov 	u32 bits = readl_relaxed(vfe->base + reg);
2684e1abf66STodor Tomov 
2694e1abf66STodor Tomov 	writel_relaxed(bits | set_bits, vfe->base + reg);
2704e1abf66STodor Tomov }
2714e1abf66STodor Tomov 
2724e1abf66STodor Tomov static void vfe_global_reset(struct vfe_device *vfe)
2734e1abf66STodor Tomov {
2744e1abf66STodor Tomov 	u32 reset_bits = VFE_0_GLOBAL_RESET_CMD_IDLE_CGC	|
2754e1abf66STodor Tomov 			 VFE_0_GLOBAL_RESET_CMD_DSP		|
2764e1abf66STodor Tomov 			 VFE_0_GLOBAL_RESET_CMD_TESTGEN		|
2774e1abf66STodor Tomov 			 VFE_0_GLOBAL_RESET_CMD_BUS_MISR	|
2784e1abf66STodor Tomov 			 VFE_0_GLOBAL_RESET_CMD_PM		|
2794e1abf66STodor Tomov 			 VFE_0_GLOBAL_RESET_CMD_REGISTER	|
2804e1abf66STodor Tomov 			 VFE_0_GLOBAL_RESET_CMD_BUS_BDG		|
2814e1abf66STodor Tomov 			 VFE_0_GLOBAL_RESET_CMD_BUS		|
2824e1abf66STodor Tomov 			 VFE_0_GLOBAL_RESET_CMD_CAMIF		|
2834e1abf66STodor Tomov 			 VFE_0_GLOBAL_RESET_CMD_CORE;
2844e1abf66STodor Tomov 
2854e1abf66STodor Tomov 	writel_relaxed(BIT(31), vfe->base + VFE_0_IRQ_MASK_0);
2864e1abf66STodor Tomov 	wmb();
2874e1abf66STodor Tomov 	writel_relaxed(reset_bits, vfe->base + VFE_0_GLOBAL_RESET_CMD);
2884e1abf66STodor Tomov }
2894e1abf66STodor Tomov 
2904e1abf66STodor Tomov static void vfe_halt_request(struct vfe_device *vfe)
2914e1abf66STodor Tomov {
2924e1abf66STodor Tomov 	writel_relaxed(VFE_0_BUS_BDG_CMD_HALT_REQ,
2934e1abf66STodor Tomov 		       vfe->base + VFE_0_BUS_BDG_CMD);
2944e1abf66STodor Tomov }
2954e1abf66STodor Tomov 
2964e1abf66STodor Tomov static void vfe_halt_clear(struct vfe_device *vfe)
2974e1abf66STodor Tomov {
2984e1abf66STodor Tomov 	writel_relaxed(0x0, vfe->base + VFE_0_BUS_BDG_CMD);
2994e1abf66STodor Tomov }
3004e1abf66STodor Tomov 
3014e1abf66STodor Tomov static void vfe_wm_enable(struct vfe_device *vfe, u8 wm, u8 enable)
3024e1abf66STodor Tomov {
3034e1abf66STodor Tomov 	if (enable)
3044e1abf66STodor Tomov 		vfe_reg_set(vfe, VFE_0_BUS_IMAGE_MASTER_n_WR_CFG(wm),
3054e1abf66STodor Tomov 			    1 << VFE_0_BUS_IMAGE_MASTER_n_WR_CFG_WR_PATH_SHIFT);
3064e1abf66STodor Tomov 	else
3074e1abf66STodor Tomov 		vfe_reg_clr(vfe, VFE_0_BUS_IMAGE_MASTER_n_WR_CFG(wm),
3084e1abf66STodor Tomov 			    1 << VFE_0_BUS_IMAGE_MASTER_n_WR_CFG_WR_PATH_SHIFT);
3094e1abf66STodor Tomov }
3104e1abf66STodor Tomov 
3114e1abf66STodor Tomov static void vfe_wm_frame_based(struct vfe_device *vfe, u8 wm, u8 enable)
3124e1abf66STodor Tomov {
3134e1abf66STodor Tomov 	if (enable)
3144e1abf66STodor Tomov 		vfe_reg_set(vfe, VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG(wm),
3154e1abf66STodor Tomov 			1 << VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG_FRM_BASED_SHIFT);
3164e1abf66STodor Tomov 	else
3174e1abf66STodor Tomov 		vfe_reg_clr(vfe, VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG(wm),
3184e1abf66STodor Tomov 			1 << VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG_FRM_BASED_SHIFT);
3194e1abf66STodor Tomov }
3204e1abf66STodor Tomov 
3214e1abf66STodor Tomov #define CALC_WORD(width, M, N) (((width) * (M) + (N) - 1) / (N))
3224e1abf66STodor Tomov 
323*312e1c85STodor Tomov static int vfe_word_per_line_by_pixel(u32 format, u32 pixel_per_line)
3244e1abf66STodor Tomov {
3254e1abf66STodor Tomov 	int val = 0;
3264e1abf66STodor Tomov 
3274e1abf66STodor Tomov 	switch (format) {
3284e1abf66STodor Tomov 	case V4L2_PIX_FMT_NV12:
3294e1abf66STodor Tomov 	case V4L2_PIX_FMT_NV21:
3304e1abf66STodor Tomov 	case V4L2_PIX_FMT_NV16:
3314e1abf66STodor Tomov 	case V4L2_PIX_FMT_NV61:
3324e1abf66STodor Tomov 		val = CALC_WORD(pixel_per_line, 1, 8);
3334e1abf66STodor Tomov 		break;
3344e1abf66STodor Tomov 	case V4L2_PIX_FMT_YUYV:
3354e1abf66STodor Tomov 	case V4L2_PIX_FMT_YVYU:
3364e1abf66STodor Tomov 	case V4L2_PIX_FMT_UYVY:
3374e1abf66STodor Tomov 	case V4L2_PIX_FMT_VYUY:
3384e1abf66STodor Tomov 		val = CALC_WORD(pixel_per_line, 2, 8);
3394e1abf66STodor Tomov 		break;
3404e1abf66STodor Tomov 	}
3414e1abf66STodor Tomov 
3424e1abf66STodor Tomov 	return val;
3434e1abf66STodor Tomov }
3444e1abf66STodor Tomov 
345*312e1c85STodor Tomov static int vfe_word_per_line_by_bytes(u32 bytes_per_line)
346*312e1c85STodor Tomov {
347*312e1c85STodor Tomov 	return CALC_WORD(bytes_per_line, 1, 8);
348*312e1c85STodor Tomov }
349*312e1c85STodor Tomov 
3504e1abf66STodor Tomov static void vfe_get_wm_sizes(struct v4l2_pix_format_mplane *pix, u8 plane,
3514e1abf66STodor Tomov 			     u16 *width, u16 *height, u16 *bytesperline)
3524e1abf66STodor Tomov {
3534e1abf66STodor Tomov 	switch (pix->pixelformat) {
3544e1abf66STodor Tomov 	case V4L2_PIX_FMT_NV12:
3554e1abf66STodor Tomov 	case V4L2_PIX_FMT_NV21:
3564e1abf66STodor Tomov 		*width = pix->width;
3574e1abf66STodor Tomov 		*height = pix->height;
3584e1abf66STodor Tomov 		*bytesperline = pix->plane_fmt[0].bytesperline;
3594e1abf66STodor Tomov 		if (plane == 1)
3604e1abf66STodor Tomov 			*height /= 2;
3614e1abf66STodor Tomov 		break;
3624e1abf66STodor Tomov 	case V4L2_PIX_FMT_NV16:
3634e1abf66STodor Tomov 	case V4L2_PIX_FMT_NV61:
3644e1abf66STodor Tomov 		*width = pix->width;
3654e1abf66STodor Tomov 		*height = pix->height;
3664e1abf66STodor Tomov 		*bytesperline = pix->plane_fmt[0].bytesperline;
3674e1abf66STodor Tomov 		break;
368*312e1c85STodor Tomov 	case V4L2_PIX_FMT_YUYV:
369*312e1c85STodor Tomov 	case V4L2_PIX_FMT_YVYU:
370*312e1c85STodor Tomov 	case V4L2_PIX_FMT_VYUY:
371*312e1c85STodor Tomov 	case V4L2_PIX_FMT_UYVY:
372*312e1c85STodor Tomov 		*width = pix->width;
373*312e1c85STodor Tomov 		*height = pix->height;
374*312e1c85STodor Tomov 		*bytesperline = pix->plane_fmt[plane].bytesperline;
375*312e1c85STodor Tomov 		break;
376*312e1c85STodor Tomov 
3774e1abf66STodor Tomov 	}
3784e1abf66STodor Tomov }
3794e1abf66STodor Tomov 
3804e1abf66STodor Tomov static void vfe_wm_line_based(struct vfe_device *vfe, u32 wm,
3814e1abf66STodor Tomov 			      struct v4l2_pix_format_mplane *pix,
3824e1abf66STodor Tomov 			      u8 plane, u32 enable)
3834e1abf66STodor Tomov {
3844e1abf66STodor Tomov 	u32 reg;
3854e1abf66STodor Tomov 
3864e1abf66STodor Tomov 	if (enable) {
3874e1abf66STodor Tomov 		u16 width = 0, height = 0, bytesperline = 0, wpl;
3884e1abf66STodor Tomov 
3894e1abf66STodor Tomov 		vfe_get_wm_sizes(pix, plane, &width, &height, &bytesperline);
3904e1abf66STodor Tomov 
391*312e1c85STodor Tomov 		wpl = vfe_word_per_line_by_pixel(pix->pixelformat, width);
3924e1abf66STodor Tomov 
3934e1abf66STodor Tomov 		reg = height - 1;
3944e1abf66STodor Tomov 		reg |= ((wpl + 3) / 4 - 1) << 16;
3954e1abf66STodor Tomov 
3964e1abf66STodor Tomov 		writel_relaxed(reg, vfe->base +
3974e1abf66STodor Tomov 			       VFE_0_BUS_IMAGE_MASTER_n_WR_IMAGE_SIZE(wm));
3984e1abf66STodor Tomov 
399*312e1c85STodor Tomov 		wpl = vfe_word_per_line_by_bytes(bytesperline);
4004e1abf66STodor Tomov 
4014e1abf66STodor Tomov 		reg = 0x3;
4024e1abf66STodor Tomov 		reg |= (height - 1) << 2;
4034e1abf66STodor Tomov 		reg |= ((wpl + 1) / 2) << 16;
4044e1abf66STodor Tomov 
4054e1abf66STodor Tomov 		writel_relaxed(reg, vfe->base +
4064e1abf66STodor Tomov 			       VFE_0_BUS_IMAGE_MASTER_n_WR_BUFFER_CFG(wm));
4074e1abf66STodor Tomov 	} else {
4084e1abf66STodor Tomov 		writel_relaxed(0, vfe->base +
4094e1abf66STodor Tomov 			       VFE_0_BUS_IMAGE_MASTER_n_WR_IMAGE_SIZE(wm));
4104e1abf66STodor Tomov 		writel_relaxed(0, vfe->base +
4114e1abf66STodor Tomov 			       VFE_0_BUS_IMAGE_MASTER_n_WR_BUFFER_CFG(wm));
4124e1abf66STodor Tomov 	}
4134e1abf66STodor Tomov }
4144e1abf66STodor Tomov 
4154e1abf66STodor Tomov static void vfe_wm_set_framedrop_period(struct vfe_device *vfe, u8 wm, u8 per)
4164e1abf66STodor Tomov {
4174e1abf66STodor Tomov 	u32 reg;
4184e1abf66STodor Tomov 
4194e1abf66STodor Tomov 	reg = readl_relaxed(vfe->base +
4204e1abf66STodor Tomov 			    VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG(wm));
4214e1abf66STodor Tomov 
4224e1abf66STodor Tomov 	reg &= ~(VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG_FRM_DROP_PER_MASK);
4234e1abf66STodor Tomov 
4244e1abf66STodor Tomov 	reg |= (per << VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG_FRM_DROP_PER_SHIFT)
4254e1abf66STodor Tomov 		& VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG_FRM_DROP_PER_MASK;
4264e1abf66STodor Tomov 
4274e1abf66STodor Tomov 	writel_relaxed(reg,
4284e1abf66STodor Tomov 		       vfe->base + VFE_0_BUS_IMAGE_MASTER_n_WR_ADDR_CFG(wm));
4294e1abf66STodor Tomov }
4304e1abf66STodor Tomov 
4314e1abf66STodor Tomov static void vfe_wm_set_framedrop_pattern(struct vfe_device *vfe, u8 wm,
4324e1abf66STodor Tomov 					 u32 pattern)
4334e1abf66STodor Tomov {
4344e1abf66STodor Tomov 	writel_relaxed(pattern,
4354e1abf66STodor Tomov 	       vfe->base + VFE_0_BUS_IMAGE_MASTER_n_WR_FRAMEDROP_PATTERN(wm));
4364e1abf66STodor Tomov }
4374e1abf66STodor Tomov 
4384e1abf66STodor Tomov static void vfe_wm_set_ub_cfg(struct vfe_device *vfe, u8 wm,
4394e1abf66STodor Tomov 			      u16 offset, u16 depth)
4404e1abf66STodor Tomov {
4414e1abf66STodor Tomov 	u32 reg;
4424e1abf66STodor Tomov 
4434e1abf66STodor Tomov 	reg = (offset << VFE_0_BUS_IMAGE_MASTER_n_WR_UB_CFG_OFFSET_SHIFT) |
4444e1abf66STodor Tomov 		depth;
4454e1abf66STodor Tomov 	writel_relaxed(reg, vfe->base + VFE_0_BUS_IMAGE_MASTER_n_WR_UB_CFG(wm));
4464e1abf66STodor Tomov }
4474e1abf66STodor Tomov 
4484e1abf66STodor Tomov static void vfe_bus_reload_wm(struct vfe_device *vfe, u8 wm)
4494e1abf66STodor Tomov {
4504e1abf66STodor Tomov 	wmb();
4514e1abf66STodor Tomov 	writel_relaxed(VFE_0_BUS_CMD_Mx_RLD_CMD(wm), vfe->base + VFE_0_BUS_CMD);
4524e1abf66STodor Tomov 	wmb();
4534e1abf66STodor Tomov }
4544e1abf66STodor Tomov 
4554e1abf66STodor Tomov static void vfe_wm_set_ping_addr(struct vfe_device *vfe, u8 wm, u32 addr)
4564e1abf66STodor Tomov {
4574e1abf66STodor Tomov 	writel_relaxed(addr,
4584e1abf66STodor Tomov 		       vfe->base + VFE_0_BUS_IMAGE_MASTER_n_WR_PING_ADDR(wm));
4594e1abf66STodor Tomov }
4604e1abf66STodor Tomov 
4614e1abf66STodor Tomov static void vfe_wm_set_pong_addr(struct vfe_device *vfe, u8 wm, u32 addr)
4624e1abf66STodor Tomov {
4634e1abf66STodor Tomov 	writel_relaxed(addr,
4644e1abf66STodor Tomov 		       vfe->base + VFE_0_BUS_IMAGE_MASTER_n_WR_PONG_ADDR(wm));
4654e1abf66STodor Tomov }
4664e1abf66STodor Tomov 
4674e1abf66STodor Tomov static int vfe_wm_get_ping_pong_status(struct vfe_device *vfe, u8 wm)
4684e1abf66STodor Tomov {
4694e1abf66STodor Tomov 	u32 reg;
4704e1abf66STodor Tomov 
4714e1abf66STodor Tomov 	reg = readl_relaxed(vfe->base + VFE_0_BUS_PING_PONG_STATUS);
4724e1abf66STodor Tomov 
4734e1abf66STodor Tomov 	return (reg >> wm) & 0x1;
4744e1abf66STodor Tomov }
4754e1abf66STodor Tomov 
4764e1abf66STodor Tomov static void vfe_bus_enable_wr_if(struct vfe_device *vfe, u8 enable)
4774e1abf66STodor Tomov {
4784e1abf66STodor Tomov 	if (enable)
4794e1abf66STodor Tomov 		writel_relaxed(0x101, vfe->base + VFE_0_BUS_CFG);
4804e1abf66STodor Tomov 	else
4814e1abf66STodor Tomov 		writel_relaxed(0, vfe->base + VFE_0_BUS_CFG);
4824e1abf66STodor Tomov }
4834e1abf66STodor Tomov 
4844e1abf66STodor Tomov static void vfe_bus_connect_wm_to_rdi(struct vfe_device *vfe, u8 wm,
4854e1abf66STodor Tomov 				      enum vfe_line_id id)
4864e1abf66STodor Tomov {
4874e1abf66STodor Tomov 	u32 reg;
4884e1abf66STodor Tomov 
4894e1abf66STodor Tomov 	reg = VFE_0_RDI_CFG_x_MIPI_EN_BITS;
4904e1abf66STodor Tomov 	vfe_reg_set(vfe, VFE_0_RDI_CFG_x(0), reg);
4914e1abf66STodor Tomov 
4924e1abf66STodor Tomov 	reg = VFE_0_RDI_CFG_x_RDI_EN_BIT;
4934e1abf66STodor Tomov 	reg |= ((3 * id) << VFE_0_RDI_CFG_x_RDI_STREAM_SEL_SHIFT) &
4944e1abf66STodor Tomov 		VFE_0_RDI_CFG_x_RDI_STREAM_SEL_MASK;
4954e1abf66STodor Tomov 	vfe_reg_set(vfe, VFE_0_RDI_CFG_x(id), reg);
4964e1abf66STodor Tomov 
4974e1abf66STodor Tomov 	switch (id) {
4984e1abf66STodor Tomov 	case VFE_LINE_RDI0:
4994e1abf66STodor Tomov 	default:
5004e1abf66STodor Tomov 		reg = VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI0 <<
5014e1abf66STodor Tomov 		      VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_SHIFT;
5024e1abf66STodor Tomov 		break;
5034e1abf66STodor Tomov 	case VFE_LINE_RDI1:
5044e1abf66STodor Tomov 		reg = VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI1 <<
5054e1abf66STodor Tomov 		      VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_SHIFT;
5064e1abf66STodor Tomov 		break;
5074e1abf66STodor Tomov 	case VFE_LINE_RDI2:
5084e1abf66STodor Tomov 		reg = VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI2 <<
5094e1abf66STodor Tomov 		      VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_SHIFT;
5104e1abf66STodor Tomov 		break;
5114e1abf66STodor Tomov 	}
5124e1abf66STodor Tomov 
5134e1abf66STodor Tomov 	if (wm % 2 == 1)
5144e1abf66STodor Tomov 		reg <<= 16;
5154e1abf66STodor Tomov 
5164e1abf66STodor Tomov 	vfe_reg_set(vfe, VFE_0_BUS_XBAR_CFG_x(wm), reg);
5174e1abf66STodor Tomov }
5184e1abf66STodor Tomov 
5194e1abf66STodor Tomov static void vfe_wm_set_subsample(struct vfe_device *vfe, u8 wm)
5204e1abf66STodor Tomov {
5214e1abf66STodor Tomov 	writel_relaxed(VFE_0_BUS_IMAGE_MASTER_n_WR_IRQ_SUBSAMPLE_PATTERN_DEF,
5224e1abf66STodor Tomov 	       vfe->base +
5234e1abf66STodor Tomov 	       VFE_0_BUS_IMAGE_MASTER_n_WR_IRQ_SUBSAMPLE_PATTERN(wm));
5244e1abf66STodor Tomov }
5254e1abf66STodor Tomov 
5264e1abf66STodor Tomov static void vfe_bus_disconnect_wm_from_rdi(struct vfe_device *vfe, u8 wm,
5274e1abf66STodor Tomov 					   enum vfe_line_id id)
5284e1abf66STodor Tomov {
5294e1abf66STodor Tomov 	u32 reg;
5304e1abf66STodor Tomov 
5314e1abf66STodor Tomov 	reg = VFE_0_RDI_CFG_x_RDI_EN_BIT;
5324e1abf66STodor Tomov 	vfe_reg_clr(vfe, VFE_0_RDI_CFG_x(id), reg);
5334e1abf66STodor Tomov 
5344e1abf66STodor Tomov 	switch (id) {
5354e1abf66STodor Tomov 	case VFE_LINE_RDI0:
5364e1abf66STodor Tomov 	default:
5374e1abf66STodor Tomov 		reg = VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI0 <<
5384e1abf66STodor Tomov 		      VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_SHIFT;
5394e1abf66STodor Tomov 		break;
5404e1abf66STodor Tomov 	case VFE_LINE_RDI1:
5414e1abf66STodor Tomov 		reg = VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI1 <<
5424e1abf66STodor Tomov 		      VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_SHIFT;
5434e1abf66STodor Tomov 		break;
5444e1abf66STodor Tomov 	case VFE_LINE_RDI2:
5454e1abf66STodor Tomov 		reg = VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_VAL_RDI2 <<
5464e1abf66STodor Tomov 		      VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_SHIFT;
5474e1abf66STodor Tomov 		break;
5484e1abf66STodor Tomov 	}
5494e1abf66STodor Tomov 
5504e1abf66STodor Tomov 	if (wm % 2 == 1)
5514e1abf66STodor Tomov 		reg <<= 16;
5524e1abf66STodor Tomov 
5534e1abf66STodor Tomov 	vfe_reg_clr(vfe, VFE_0_BUS_XBAR_CFG_x(wm), reg);
5544e1abf66STodor Tomov }
5554e1abf66STodor Tomov 
5564e1abf66STodor Tomov static void vfe_set_xbar_cfg(struct vfe_device *vfe, struct vfe_output *output,
5574e1abf66STodor Tomov 			     u8 enable)
5584e1abf66STodor Tomov {
5594e1abf66STodor Tomov 	struct vfe_line *line = container_of(output, struct vfe_line, output);
5604e1abf66STodor Tomov 	u32 p = line->video_out.active_fmt.fmt.pix_mp.pixelformat;
5614e1abf66STodor Tomov 	u32 reg;
5624e1abf66STodor Tomov 
563*312e1c85STodor Tomov 	switch (p) {
564*312e1c85STodor Tomov 	case V4L2_PIX_FMT_NV12:
565*312e1c85STodor Tomov 	case V4L2_PIX_FMT_NV21:
566*312e1c85STodor Tomov 	case V4L2_PIX_FMT_NV16:
567*312e1c85STodor Tomov 	case V4L2_PIX_FMT_NV61:
5684e1abf66STodor Tomov 		reg = VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_LUMA <<
5694e1abf66STodor Tomov 			VFE_0_BUS_XBAR_CFG_x_M_SINGLE_STREAM_SEL_SHIFT;
5704e1abf66STodor Tomov 
571*312e1c85STodor Tomov 		if (output->wm_idx[0] % 2 == 1)
5724e1abf66STodor Tomov 			reg <<= 16;
5734e1abf66STodor Tomov 
5744e1abf66STodor Tomov 		if (enable)
5754e1abf66STodor Tomov 			vfe_reg_set(vfe,
576*312e1c85STodor Tomov 				    VFE_0_BUS_XBAR_CFG_x(output->wm_idx[0]),
5774e1abf66STodor Tomov 				    reg);
5784e1abf66STodor Tomov 		else
5794e1abf66STodor Tomov 			vfe_reg_clr(vfe,
580*312e1c85STodor Tomov 				    VFE_0_BUS_XBAR_CFG_x(output->wm_idx[0]),
5814e1abf66STodor Tomov 				    reg);
582*312e1c85STodor Tomov 
583*312e1c85STodor Tomov 		reg = VFE_0_BUS_XBAR_CFG_x_M_PAIR_STREAM_EN;
584*312e1c85STodor Tomov 		if (p == V4L2_PIX_FMT_NV12 || p == V4L2_PIX_FMT_NV16)
585*312e1c85STodor Tomov 			reg |= VFE_0_BUS_XBAR_CFG_x_M_PAIR_STREAM_SWAP_INTER_INTRA;
586*312e1c85STodor Tomov 
587*312e1c85STodor Tomov 		if (output->wm_idx[1] % 2 == 1)
588*312e1c85STodor Tomov 			reg <<= 16;
589*312e1c85STodor Tomov 
590*312e1c85STodor Tomov 		if (enable)
591*312e1c85STodor Tomov 			vfe_reg_set(vfe,
592*312e1c85STodor Tomov 				    VFE_0_BUS_XBAR_CFG_x(output->wm_idx[1]),
593*312e1c85STodor Tomov 				    reg);
594*312e1c85STodor Tomov 		else
595*312e1c85STodor Tomov 			vfe_reg_clr(vfe,
596*312e1c85STodor Tomov 				    VFE_0_BUS_XBAR_CFG_x(output->wm_idx[1]),
597*312e1c85STodor Tomov 				    reg);
598*312e1c85STodor Tomov 		break;
599*312e1c85STodor Tomov 	case V4L2_PIX_FMT_YUYV:
600*312e1c85STodor Tomov 	case V4L2_PIX_FMT_YVYU:
601*312e1c85STodor Tomov 	case V4L2_PIX_FMT_VYUY:
602*312e1c85STodor Tomov 	case V4L2_PIX_FMT_UYVY:
603*312e1c85STodor Tomov 		reg = VFE_0_BUS_XBAR_CFG_x_M_REALIGN_BUF_EN;
604*312e1c85STodor Tomov 		reg |= VFE_0_BUS_XBAR_CFG_x_M_PAIR_STREAM_EN;
605*312e1c85STodor Tomov 
606*312e1c85STodor Tomov 		if (p == V4L2_PIX_FMT_YUYV || p == V4L2_PIX_FMT_YVYU)
607*312e1c85STodor Tomov 			reg |= VFE_0_BUS_XBAR_CFG_x_M_PAIR_STREAM_SWAP_INTER_INTRA;
608*312e1c85STodor Tomov 
609*312e1c85STodor Tomov 		if (output->wm_idx[0] % 2 == 1)
610*312e1c85STodor Tomov 			reg <<= 16;
611*312e1c85STodor Tomov 
612*312e1c85STodor Tomov 		if (enable)
613*312e1c85STodor Tomov 			vfe_reg_set(vfe,
614*312e1c85STodor Tomov 				    VFE_0_BUS_XBAR_CFG_x(output->wm_idx[0]),
615*312e1c85STodor Tomov 				    reg);
616*312e1c85STodor Tomov 		else
617*312e1c85STodor Tomov 			vfe_reg_clr(vfe,
618*312e1c85STodor Tomov 				    VFE_0_BUS_XBAR_CFG_x(output->wm_idx[0]),
619*312e1c85STodor Tomov 				    reg);
620*312e1c85STodor Tomov 		break;
621*312e1c85STodor Tomov 	default:
622*312e1c85STodor Tomov 		break;
6234e1abf66STodor Tomov 	}
6244e1abf66STodor Tomov }
6254e1abf66STodor Tomov 
626*312e1c85STodor Tomov static void vfe_set_realign_cfg(struct vfe_device *vfe, struct vfe_line *line,
627*312e1c85STodor Tomov 				u8 enable)
628*312e1c85STodor Tomov {
629*312e1c85STodor Tomov 	u32 p = line->video_out.active_fmt.fmt.pix_mp.pixelformat;
630*312e1c85STodor Tomov 	u32 val = VFE_0_MODULE_ZOOM_EN_REALIGN_BUF;
631*312e1c85STodor Tomov 
632*312e1c85STodor Tomov 	if (p != V4L2_PIX_FMT_YUYV && p != V4L2_PIX_FMT_YVYU &&
633*312e1c85STodor Tomov 			p != V4L2_PIX_FMT_VYUY && p != V4L2_PIX_FMT_UYVY)
634*312e1c85STodor Tomov 		return;
635*312e1c85STodor Tomov 
636*312e1c85STodor Tomov 	if (enable) {
637*312e1c85STodor Tomov 		vfe_reg_set(vfe, VFE_0_MODULE_ZOOM_EN, val);
638*312e1c85STodor Tomov 	} else {
639*312e1c85STodor Tomov 		vfe_reg_clr(vfe, VFE_0_MODULE_ZOOM_EN, val);
640*312e1c85STodor Tomov 		return;
641*312e1c85STodor Tomov 	}
642*312e1c85STodor Tomov 
643*312e1c85STodor Tomov 	val = VFE_0_REALIGN_BUF_CFG_HSUB_ENABLE;
644*312e1c85STodor Tomov 
645*312e1c85STodor Tomov 	if (p == V4L2_PIX_FMT_UYVY || p == V4L2_PIX_FMT_YUYV)
646*312e1c85STodor Tomov 		val |= VFE_0_REALIGN_BUF_CFG_CR_ODD_PIXEL;
647*312e1c85STodor Tomov 	else
648*312e1c85STodor Tomov 		val |= VFE_0_REALIGN_BUF_CFG_CB_ODD_PIXEL;
649*312e1c85STodor Tomov 
650*312e1c85STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_REALIGN_BUF_CFG);
651*312e1c85STodor Tomov }
652*312e1c85STodor Tomov 
6534e1abf66STodor Tomov static void vfe_set_rdi_cid(struct vfe_device *vfe, enum vfe_line_id id, u8 cid)
6544e1abf66STodor Tomov {
6554e1abf66STodor Tomov 	vfe_reg_clr(vfe, VFE_0_RDI_CFG_x(id),
6564e1abf66STodor Tomov 		    VFE_0_RDI_CFG_x_RDI_M0_SEL_MASK);
6574e1abf66STodor Tomov 
6584e1abf66STodor Tomov 	vfe_reg_set(vfe, VFE_0_RDI_CFG_x(id),
6594e1abf66STodor Tomov 		    cid << VFE_0_RDI_CFG_x_RDI_M0_SEL_SHIFT);
6604e1abf66STodor Tomov }
6614e1abf66STodor Tomov 
6624e1abf66STodor Tomov static void vfe_reg_update(struct vfe_device *vfe, enum vfe_line_id line_id)
6634e1abf66STodor Tomov {
6644e1abf66STodor Tomov 	vfe->reg_update |= VFE_0_REG_UPDATE_line_n(line_id);
6654e1abf66STodor Tomov 	wmb();
6664e1abf66STodor Tomov 	writel_relaxed(vfe->reg_update, vfe->base + VFE_0_REG_UPDATE);
6674e1abf66STodor Tomov 	wmb();
6684e1abf66STodor Tomov }
6694e1abf66STodor Tomov 
6704e1abf66STodor Tomov static inline void vfe_reg_update_clear(struct vfe_device *vfe,
6714e1abf66STodor Tomov 					enum vfe_line_id line_id)
6724e1abf66STodor Tomov {
6734e1abf66STodor Tomov 	vfe->reg_update &= ~VFE_0_REG_UPDATE_line_n(line_id);
6744e1abf66STodor Tomov }
6754e1abf66STodor Tomov 
6764e1abf66STodor Tomov static void vfe_enable_irq_wm_line(struct vfe_device *vfe, u8 wm,
6774e1abf66STodor Tomov 				   enum vfe_line_id line_id, u8 enable)
6784e1abf66STodor Tomov {
6794e1abf66STodor Tomov 	u32 irq_en0 = VFE_0_IRQ_MASK_0_IMAGE_MASTER_n_PING_PONG(wm) |
6804e1abf66STodor Tomov 		      VFE_0_IRQ_MASK_0_line_n_REG_UPDATE(line_id);
6814e1abf66STodor Tomov 	u32 irq_en1 = VFE_0_IRQ_MASK_1_IMAGE_MASTER_n_BUS_OVERFLOW(wm) |
6824e1abf66STodor Tomov 		      VFE_0_IRQ_MASK_1_RDIn_SOF(line_id);
6834e1abf66STodor Tomov 
6844e1abf66STodor Tomov 	if (enable) {
6854e1abf66STodor Tomov 		vfe_reg_set(vfe, VFE_0_IRQ_MASK_0, irq_en0);
6864e1abf66STodor Tomov 		vfe_reg_set(vfe, VFE_0_IRQ_MASK_1, irq_en1);
6874e1abf66STodor Tomov 	} else {
6884e1abf66STodor Tomov 		vfe_reg_clr(vfe, VFE_0_IRQ_MASK_0, irq_en0);
6894e1abf66STodor Tomov 		vfe_reg_clr(vfe, VFE_0_IRQ_MASK_1, irq_en1);
6904e1abf66STodor Tomov 	}
6914e1abf66STodor Tomov }
6924e1abf66STodor Tomov 
6934e1abf66STodor Tomov static void vfe_enable_irq_pix_line(struct vfe_device *vfe, u8 comp,
6944e1abf66STodor Tomov 				    enum vfe_line_id line_id, u8 enable)
6954e1abf66STodor Tomov {
6964e1abf66STodor Tomov 	struct vfe_output *output = &vfe->line[line_id].output;
6974e1abf66STodor Tomov 	unsigned int i;
6984e1abf66STodor Tomov 	u32 irq_en0;
6994e1abf66STodor Tomov 	u32 irq_en1;
7004e1abf66STodor Tomov 	u32 comp_mask = 0;
7014e1abf66STodor Tomov 
7024e1abf66STodor Tomov 	irq_en0 = VFE_0_IRQ_MASK_0_CAMIF_SOF;
7034e1abf66STodor Tomov 	irq_en0 |= VFE_0_IRQ_MASK_0_CAMIF_EOF;
7044e1abf66STodor Tomov 	irq_en0 |= VFE_0_IRQ_MASK_0_IMAGE_COMPOSITE_DONE_n(comp);
7054e1abf66STodor Tomov 	irq_en0 |= VFE_0_IRQ_MASK_0_line_n_REG_UPDATE(line_id);
7064e1abf66STodor Tomov 	irq_en1 = VFE_0_IRQ_MASK_1_CAMIF_ERROR;
7074e1abf66STodor Tomov 	for (i = 0; i < output->wm_num; i++) {
7084e1abf66STodor Tomov 		irq_en1 |= VFE_0_IRQ_MASK_1_IMAGE_MASTER_n_BUS_OVERFLOW(
7094e1abf66STodor Tomov 							output->wm_idx[i]);
7104e1abf66STodor Tomov 		comp_mask |= (1 << output->wm_idx[i]) << comp * 8;
7114e1abf66STodor Tomov 	}
7124e1abf66STodor Tomov 
7134e1abf66STodor Tomov 	if (enable) {
7144e1abf66STodor Tomov 		vfe_reg_set(vfe, VFE_0_IRQ_MASK_0, irq_en0);
7154e1abf66STodor Tomov 		vfe_reg_set(vfe, VFE_0_IRQ_MASK_1, irq_en1);
7164e1abf66STodor Tomov 		vfe_reg_set(vfe, VFE_0_IRQ_COMPOSITE_MASK_0, comp_mask);
7174e1abf66STodor Tomov 	} else {
7184e1abf66STodor Tomov 		vfe_reg_clr(vfe, VFE_0_IRQ_MASK_0, irq_en0);
7194e1abf66STodor Tomov 		vfe_reg_clr(vfe, VFE_0_IRQ_MASK_1, irq_en1);
7204e1abf66STodor Tomov 		vfe_reg_clr(vfe, VFE_0_IRQ_COMPOSITE_MASK_0, comp_mask);
7214e1abf66STodor Tomov 	}
7224e1abf66STodor Tomov }
7234e1abf66STodor Tomov 
7244e1abf66STodor Tomov static void vfe_enable_irq_common(struct vfe_device *vfe)
7254e1abf66STodor Tomov {
7264e1abf66STodor Tomov 	u32 irq_en0 = VFE_0_IRQ_MASK_0_RESET_ACK;
7274e1abf66STodor Tomov 	u32 irq_en1 = VFE_0_IRQ_MASK_1_VIOLATION |
7284e1abf66STodor Tomov 		      VFE_0_IRQ_MASK_1_BUS_BDG_HALT_ACK;
7294e1abf66STodor Tomov 
7304e1abf66STodor Tomov 	vfe_reg_set(vfe, VFE_0_IRQ_MASK_0, irq_en0);
7314e1abf66STodor Tomov 	vfe_reg_set(vfe, VFE_0_IRQ_MASK_1, irq_en1);
7324e1abf66STodor Tomov }
7334e1abf66STodor Tomov 
7344e1abf66STodor Tomov static void vfe_set_demux_cfg(struct vfe_device *vfe, struct vfe_line *line)
7354e1abf66STodor Tomov {
7364e1abf66STodor Tomov 	u32 val, even_cfg, odd_cfg;
7374e1abf66STodor Tomov 
7384e1abf66STodor Tomov 	writel_relaxed(VFE_0_DEMUX_CFG_PERIOD, vfe->base + VFE_0_DEMUX_CFG);
7394e1abf66STodor Tomov 
7404e1abf66STodor Tomov 	val = VFE_0_DEMUX_GAIN_0_CH0_EVEN | VFE_0_DEMUX_GAIN_0_CH0_ODD;
7414e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_DEMUX_GAIN_0);
7424e1abf66STodor Tomov 
7434e1abf66STodor Tomov 	val = VFE_0_DEMUX_GAIN_1_CH1 | VFE_0_DEMUX_GAIN_1_CH2;
7444e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_DEMUX_GAIN_1);
7454e1abf66STodor Tomov 
7464e1abf66STodor Tomov 	switch (line->fmt[MSM_VFE_PAD_SINK].code) {
7474e1abf66STodor Tomov 	case MEDIA_BUS_FMT_YUYV8_2X8:
7484e1abf66STodor Tomov 		even_cfg = VFE_0_DEMUX_EVEN_CFG_PATTERN_YUYV;
7494e1abf66STodor Tomov 		odd_cfg = VFE_0_DEMUX_ODD_CFG_PATTERN_YUYV;
7504e1abf66STodor Tomov 		break;
7514e1abf66STodor Tomov 	case MEDIA_BUS_FMT_YVYU8_2X8:
7524e1abf66STodor Tomov 		even_cfg = VFE_0_DEMUX_EVEN_CFG_PATTERN_YVYU;
7534e1abf66STodor Tomov 		odd_cfg = VFE_0_DEMUX_ODD_CFG_PATTERN_YVYU;
7544e1abf66STodor Tomov 		break;
7554e1abf66STodor Tomov 	case MEDIA_BUS_FMT_UYVY8_2X8:
7564e1abf66STodor Tomov 	default:
7574e1abf66STodor Tomov 		even_cfg = VFE_0_DEMUX_EVEN_CFG_PATTERN_UYVY;
7584e1abf66STodor Tomov 		odd_cfg = VFE_0_DEMUX_ODD_CFG_PATTERN_UYVY;
7594e1abf66STodor Tomov 		break;
7604e1abf66STodor Tomov 	case MEDIA_BUS_FMT_VYUY8_2X8:
7614e1abf66STodor Tomov 		even_cfg = VFE_0_DEMUX_EVEN_CFG_PATTERN_VYUY;
7624e1abf66STodor Tomov 		odd_cfg = VFE_0_DEMUX_ODD_CFG_PATTERN_VYUY;
7634e1abf66STodor Tomov 		break;
7644e1abf66STodor Tomov 	}
7654e1abf66STodor Tomov 
7664e1abf66STodor Tomov 	writel_relaxed(even_cfg, vfe->base + VFE_0_DEMUX_EVEN_CFG);
7674e1abf66STodor Tomov 	writel_relaxed(odd_cfg, vfe->base + VFE_0_DEMUX_ODD_CFG);
7684e1abf66STodor Tomov }
7694e1abf66STodor Tomov 
7704e1abf66STodor Tomov static inline u8 vfe_calc_interp_reso(u16 input, u16 output)
7714e1abf66STodor Tomov {
7724e1abf66STodor Tomov 	if (input / output >= 16)
7734e1abf66STodor Tomov 		return 0;
7744e1abf66STodor Tomov 
7754e1abf66STodor Tomov 	if (input / output >= 8)
7764e1abf66STodor Tomov 		return 1;
7774e1abf66STodor Tomov 
7784e1abf66STodor Tomov 	if (input / output >= 4)
7794e1abf66STodor Tomov 		return 2;
7804e1abf66STodor Tomov 
7814e1abf66STodor Tomov 	return 3;
7824e1abf66STodor Tomov }
7834e1abf66STodor Tomov 
7844e1abf66STodor Tomov static void vfe_set_scale_cfg(struct vfe_device *vfe, struct vfe_line *line)
7854e1abf66STodor Tomov {
7864e1abf66STodor Tomov 	u32 p = line->video_out.active_fmt.fmt.pix_mp.pixelformat;
7874e1abf66STodor Tomov 	u32 reg;
7884e1abf66STodor Tomov 	u16 input, output;
7894e1abf66STodor Tomov 	u8 interp_reso;
7904e1abf66STodor Tomov 	u32 phase_mult;
7914e1abf66STodor Tomov 
7924e1abf66STodor Tomov 	writel_relaxed(0x3, vfe->base + VFE_0_SCALE_ENC_Y_CFG);
7934e1abf66STodor Tomov 
7944e1abf66STodor Tomov 	input = line->fmt[MSM_VFE_PAD_SINK].width - 1;
7954e1abf66STodor Tomov 	output = line->compose.width - 1;
7964e1abf66STodor Tomov 	reg = (output << 16) | input;
7974e1abf66STodor Tomov 	writel_relaxed(reg, vfe->base + VFE_0_SCALE_ENC_Y_H_IMAGE_SIZE);
7984e1abf66STodor Tomov 
7994e1abf66STodor Tomov 	interp_reso = vfe_calc_interp_reso(input, output);
8004e1abf66STodor Tomov 	phase_mult = input * (1 << (14 + interp_reso)) / output;
8014e1abf66STodor Tomov 	reg = (interp_reso << 28) | phase_mult;
8024e1abf66STodor Tomov 	writel_relaxed(reg, vfe->base + VFE_0_SCALE_ENC_Y_H_PHASE);
8034e1abf66STodor Tomov 
8044e1abf66STodor Tomov 	input = line->fmt[MSM_VFE_PAD_SINK].height - 1;
8054e1abf66STodor Tomov 	output = line->compose.height - 1;
8064e1abf66STodor Tomov 	reg = (output << 16) | input;
8074e1abf66STodor Tomov 	writel_relaxed(reg, vfe->base + VFE_0_SCALE_ENC_Y_V_IMAGE_SIZE);
8084e1abf66STodor Tomov 
8094e1abf66STodor Tomov 	interp_reso = vfe_calc_interp_reso(input, output);
8104e1abf66STodor Tomov 	phase_mult = input * (1 << (14 + interp_reso)) / output;
8114e1abf66STodor Tomov 	reg = (interp_reso << 28) | phase_mult;
8124e1abf66STodor Tomov 	writel_relaxed(reg, vfe->base + VFE_0_SCALE_ENC_Y_V_PHASE);
8134e1abf66STodor Tomov 
8144e1abf66STodor Tomov 	writel_relaxed(0x3, vfe->base + VFE_0_SCALE_ENC_CBCR_CFG);
8154e1abf66STodor Tomov 
8164e1abf66STodor Tomov 	input = line->fmt[MSM_VFE_PAD_SINK].width - 1;
8174e1abf66STodor Tomov 	output = line->compose.width / 2 - 1;
8184e1abf66STodor Tomov 	reg = (output << 16) | input;
8194e1abf66STodor Tomov 	writel_relaxed(reg, vfe->base + VFE_0_SCALE_ENC_CBCR_H_IMAGE_SIZE);
8204e1abf66STodor Tomov 
8214e1abf66STodor Tomov 	interp_reso = vfe_calc_interp_reso(input, output);
8224e1abf66STodor Tomov 	phase_mult = input * (1 << (14 + interp_reso)) / output;
8234e1abf66STodor Tomov 	reg = (interp_reso << 28) | phase_mult;
8244e1abf66STodor Tomov 	writel_relaxed(reg, vfe->base + VFE_0_SCALE_ENC_CBCR_H_PHASE);
8254e1abf66STodor Tomov 
8264e1abf66STodor Tomov 	input = line->fmt[MSM_VFE_PAD_SINK].height - 1;
8274e1abf66STodor Tomov 	output = line->compose.height - 1;
8284e1abf66STodor Tomov 	if (p == V4L2_PIX_FMT_NV12 || p == V4L2_PIX_FMT_NV21)
8294e1abf66STodor Tomov 		output = line->compose.height / 2 - 1;
8304e1abf66STodor Tomov 	reg = (output << 16) | input;
8314e1abf66STodor Tomov 	writel_relaxed(reg, vfe->base + VFE_0_SCALE_ENC_CBCR_V_IMAGE_SIZE);
8324e1abf66STodor Tomov 
8334e1abf66STodor Tomov 	interp_reso = vfe_calc_interp_reso(input, output);
8344e1abf66STodor Tomov 	phase_mult = input * (1 << (14 + interp_reso)) / output;
8354e1abf66STodor Tomov 	reg = (interp_reso << 28) | phase_mult;
8364e1abf66STodor Tomov 	writel_relaxed(reg, vfe->base + VFE_0_SCALE_ENC_CBCR_V_PHASE);
8374e1abf66STodor Tomov }
8384e1abf66STodor Tomov 
8394e1abf66STodor Tomov static void vfe_set_crop_cfg(struct vfe_device *vfe, struct vfe_line *line)
8404e1abf66STodor Tomov {
8414e1abf66STodor Tomov 	u32 p = line->video_out.active_fmt.fmt.pix_mp.pixelformat;
8424e1abf66STodor Tomov 	u32 reg;
8434e1abf66STodor Tomov 	u16 first, last;
8444e1abf66STodor Tomov 
8454e1abf66STodor Tomov 	first = line->crop.left;
8464e1abf66STodor Tomov 	last = line->crop.left + line->crop.width - 1;
8474e1abf66STodor Tomov 	reg = (first << 16) | last;
8484e1abf66STodor Tomov 	writel_relaxed(reg, vfe->base + VFE_0_CROP_ENC_Y_WIDTH);
8494e1abf66STodor Tomov 
8504e1abf66STodor Tomov 	first = line->crop.top;
8514e1abf66STodor Tomov 	last = line->crop.top + line->crop.height - 1;
8524e1abf66STodor Tomov 	reg = (first << 16) | last;
8534e1abf66STodor Tomov 	writel_relaxed(reg, vfe->base + VFE_0_CROP_ENC_Y_HEIGHT);
8544e1abf66STodor Tomov 
8554e1abf66STodor Tomov 	first = line->crop.left / 2;
8564e1abf66STodor Tomov 	last = line->crop.left / 2 + line->crop.width / 2 - 1;
8574e1abf66STodor Tomov 	reg = (first << 16) | last;
8584e1abf66STodor Tomov 	writel_relaxed(reg, vfe->base + VFE_0_CROP_ENC_CBCR_WIDTH);
8594e1abf66STodor Tomov 
8604e1abf66STodor Tomov 	first = line->crop.top;
8614e1abf66STodor Tomov 	last = line->crop.top + line->crop.height - 1;
8624e1abf66STodor Tomov 	if (p == V4L2_PIX_FMT_NV12 || p == V4L2_PIX_FMT_NV21) {
8634e1abf66STodor Tomov 		first = line->crop.top / 2;
8644e1abf66STodor Tomov 		last = line->crop.top / 2 + line->crop.height / 2 - 1;
8654e1abf66STodor Tomov 	}
8664e1abf66STodor Tomov 	reg = (first << 16) | last;
8674e1abf66STodor Tomov 	writel_relaxed(reg, vfe->base + VFE_0_CROP_ENC_CBCR_HEIGHT);
8684e1abf66STodor Tomov }
8694e1abf66STodor Tomov 
8704e1abf66STodor Tomov static void vfe_set_clamp_cfg(struct vfe_device *vfe)
8714e1abf66STodor Tomov {
8724e1abf66STodor Tomov 	u32 val = VFE_0_CLAMP_ENC_MAX_CFG_CH0 |
8734e1abf66STodor Tomov 		VFE_0_CLAMP_ENC_MAX_CFG_CH1 |
8744e1abf66STodor Tomov 		VFE_0_CLAMP_ENC_MAX_CFG_CH2;
8754e1abf66STodor Tomov 
8764e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_CLAMP_ENC_MAX_CFG);
8774e1abf66STodor Tomov 
8784e1abf66STodor Tomov 	val = VFE_0_CLAMP_ENC_MIN_CFG_CH0 |
8794e1abf66STodor Tomov 		VFE_0_CLAMP_ENC_MIN_CFG_CH1 |
8804e1abf66STodor Tomov 		VFE_0_CLAMP_ENC_MIN_CFG_CH2;
8814e1abf66STodor Tomov 
8824e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_CLAMP_ENC_MIN_CFG);
8834e1abf66STodor Tomov }
8844e1abf66STodor Tomov 
8854e1abf66STodor Tomov static void vfe_set_qos(struct vfe_device *vfe)
8864e1abf66STodor Tomov {
8874e1abf66STodor Tomov 	u32 val = VFE_0_BUS_BDG_QOS_CFG_0_CFG;
8884e1abf66STodor Tomov 	u32 val7 = VFE_0_BUS_BDG_QOS_CFG_7_CFG;
8894e1abf66STodor Tomov 
8904e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_QOS_CFG_0);
8914e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_QOS_CFG_1);
8924e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_QOS_CFG_2);
8934e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_QOS_CFG_3);
8944e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_QOS_CFG_4);
8954e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_QOS_CFG_5);
8964e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_QOS_CFG_6);
8974e1abf66STodor Tomov 	writel_relaxed(val7, vfe->base + VFE_0_BUS_BDG_QOS_CFG_7);
8984e1abf66STodor Tomov }
8994e1abf66STodor Tomov 
9004e1abf66STodor Tomov static void vfe_set_ds(struct vfe_device *vfe)
9014e1abf66STodor Tomov {
9024e1abf66STodor Tomov 	u32 val = VFE_0_BUS_BDG_DS_CFG_0_CFG;
9034e1abf66STodor Tomov 	u32 val16 = VFE_0_BUS_BDG_DS_CFG_16_CFG;
9044e1abf66STodor Tomov 
9054e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_0);
9064e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_1);
9074e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_2);
9084e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_3);
9094e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_4);
9104e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_5);
9114e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_6);
9124e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_7);
9134e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_8);
9144e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_9);
9154e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_10);
9164e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_11);
9174e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_12);
9184e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_13);
9194e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_14);
9204e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_BUS_BDG_DS_CFG_15);
9214e1abf66STodor Tomov 	writel_relaxed(val16, vfe->base + VFE_0_BUS_BDG_DS_CFG_16);
9224e1abf66STodor Tomov }
9234e1abf66STodor Tomov 
9244e1abf66STodor Tomov static void vfe_set_cgc_override(struct vfe_device *vfe, u8 wm, u8 enable)
9254e1abf66STodor Tomov {
9264e1abf66STodor Tomov 	/* empty */
9274e1abf66STodor Tomov }
9284e1abf66STodor Tomov 
9294e1abf66STodor Tomov static void vfe_set_camif_cfg(struct vfe_device *vfe, struct vfe_line *line)
9304e1abf66STodor Tomov {
9314e1abf66STodor Tomov 	u32 val;
9324e1abf66STodor Tomov 
9334e1abf66STodor Tomov 	switch (line->fmt[MSM_VFE_PAD_SINK].code) {
9344e1abf66STodor Tomov 	case MEDIA_BUS_FMT_YUYV8_2X8:
9354e1abf66STodor Tomov 		val = VFE_0_CORE_CFG_PIXEL_PATTERN_YCBYCR;
9364e1abf66STodor Tomov 		break;
9374e1abf66STodor Tomov 	case MEDIA_BUS_FMT_YVYU8_2X8:
9384e1abf66STodor Tomov 		val = VFE_0_CORE_CFG_PIXEL_PATTERN_YCRYCB;
9394e1abf66STodor Tomov 		break;
9404e1abf66STodor Tomov 	case MEDIA_BUS_FMT_UYVY8_2X8:
9414e1abf66STodor Tomov 	default:
9424e1abf66STodor Tomov 		val = VFE_0_CORE_CFG_PIXEL_PATTERN_CBYCRY;
9434e1abf66STodor Tomov 		break;
9444e1abf66STodor Tomov 	case MEDIA_BUS_FMT_VYUY8_2X8:
9454e1abf66STodor Tomov 		val = VFE_0_CORE_CFG_PIXEL_PATTERN_CRYCBY;
9464e1abf66STodor Tomov 		break;
9474e1abf66STodor Tomov 	}
9484e1abf66STodor Tomov 
9494e1abf66STodor Tomov 	val |= VFE_0_CORE_CFG_COMPOSITE_REG_UPDATE_EN;
9504e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_CORE_CFG);
9514e1abf66STodor Tomov 
9524e1abf66STodor Tomov 	val = line->fmt[MSM_VFE_PAD_SINK].width * 2 - 1;
9534e1abf66STodor Tomov 	val |= (line->fmt[MSM_VFE_PAD_SINK].height - 1) << 16;
9544e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_CAMIF_FRAME_CFG);
9554e1abf66STodor Tomov 
9564e1abf66STodor Tomov 	val = line->fmt[MSM_VFE_PAD_SINK].width * 2 - 1;
9574e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_CAMIF_WINDOW_WIDTH_CFG);
9584e1abf66STodor Tomov 
9594e1abf66STodor Tomov 	val = line->fmt[MSM_VFE_PAD_SINK].height - 1;
9604e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_CAMIF_WINDOW_HEIGHT_CFG);
9614e1abf66STodor Tomov 
9624e1abf66STodor Tomov 	val = 0xffffffff;
9634e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_CAMIF_SUBSAMPLE_CFG);
9644e1abf66STodor Tomov 
9654e1abf66STodor Tomov 	val = 0xffffffff;
9664e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_CAMIF_IRQ_FRAMEDROP_PATTERN);
9674e1abf66STodor Tomov 
9684e1abf66STodor Tomov 	val = 0xffffffff;
9694e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_CAMIF_IRQ_SUBSAMPLE_PATTERN);
9704e1abf66STodor Tomov 
9714e1abf66STodor Tomov 	val = VFE_0_RDI_CFG_x_MIPI_EN_BITS;
9724e1abf66STodor Tomov 	vfe_reg_set(vfe, VFE_0_RDI_CFG_x(0), val);
9734e1abf66STodor Tomov 
9744e1abf66STodor Tomov 	val = VFE_0_CAMIF_CFG_VFE_OUTPUT_EN;
9754e1abf66STodor Tomov 	writel_relaxed(val, vfe->base + VFE_0_CAMIF_CFG);
9764e1abf66STodor Tomov }
9774e1abf66STodor Tomov 
9784e1abf66STodor Tomov static void vfe_set_camif_cmd(struct vfe_device *vfe, u8 enable)
9794e1abf66STodor Tomov {
9804e1abf66STodor Tomov 	u32 cmd;
9814e1abf66STodor Tomov 
9824e1abf66STodor Tomov 	cmd = VFE_0_CAMIF_CMD_CLEAR_CAMIF_STATUS | VFE_0_CAMIF_CMD_NO_CHANGE;
9834e1abf66STodor Tomov 	writel_relaxed(cmd, vfe->base + VFE_0_CAMIF_CMD);
9844e1abf66STodor Tomov 	wmb();
9854e1abf66STodor Tomov 
9864e1abf66STodor Tomov 	if (enable)
9874e1abf66STodor Tomov 		cmd = VFE_0_CAMIF_CMD_ENABLE_FRAME_BOUNDARY;
9884e1abf66STodor Tomov 	else
9894e1abf66STodor Tomov 		cmd = VFE_0_CAMIF_CMD_DISABLE_FRAME_BOUNDARY;
9904e1abf66STodor Tomov 
9914e1abf66STodor Tomov 	writel_relaxed(cmd, vfe->base + VFE_0_CAMIF_CMD);
9924e1abf66STodor Tomov }
9934e1abf66STodor Tomov 
9944e1abf66STodor Tomov static void vfe_set_module_cfg(struct vfe_device *vfe, u8 enable)
9954e1abf66STodor Tomov {
9964e1abf66STodor Tomov 	u32 val_lens = VFE_0_MODULE_LENS_EN_DEMUX |
9974e1abf66STodor Tomov 		       VFE_0_MODULE_LENS_EN_CHROMA_UPSAMPLE;
9984e1abf66STodor Tomov 	u32 val_zoom = VFE_0_MODULE_ZOOM_EN_SCALE_ENC |
9994e1abf66STodor Tomov 		       VFE_0_MODULE_ZOOM_EN_CROP_ENC;
10004e1abf66STodor Tomov 
10014e1abf66STodor Tomov 	if (enable) {
1002*312e1c85STodor Tomov 		vfe_reg_set(vfe, VFE_0_MODULE_LENS_EN, val_lens);
1003*312e1c85STodor Tomov 		vfe_reg_set(vfe, VFE_0_MODULE_ZOOM_EN, val_zoom);
10044e1abf66STodor Tomov 	} else {
1005*312e1c85STodor Tomov 		vfe_reg_clr(vfe, VFE_0_MODULE_LENS_EN, val_lens);
1006*312e1c85STodor Tomov 		vfe_reg_clr(vfe, VFE_0_MODULE_ZOOM_EN, val_zoom);
10074e1abf66STodor Tomov 	}
10084e1abf66STodor Tomov }
10094e1abf66STodor Tomov 
10104e1abf66STodor Tomov static int vfe_camif_wait_for_stop(struct vfe_device *vfe, struct device *dev)
10114e1abf66STodor Tomov {
10124e1abf66STodor Tomov 	u32 val;
10134e1abf66STodor Tomov 	int ret;
10144e1abf66STodor Tomov 
10154e1abf66STodor Tomov 	ret = readl_poll_timeout(vfe->base + VFE_0_CAMIF_STATUS,
10164e1abf66STodor Tomov 				 val,
10174e1abf66STodor Tomov 				 (val & VFE_0_CAMIF_STATUS_HALT),
10184e1abf66STodor Tomov 				 CAMIF_TIMEOUT_SLEEP_US,
10194e1abf66STodor Tomov 				 CAMIF_TIMEOUT_ALL_US);
10204e1abf66STodor Tomov 	if (ret < 0)
10214e1abf66STodor Tomov 		dev_err(dev, "%s: camif stop timeout\n", __func__);
10224e1abf66STodor Tomov 
10234e1abf66STodor Tomov 	return ret;
10244e1abf66STodor Tomov }
10254e1abf66STodor Tomov 
10264e1abf66STodor Tomov static void vfe_isr_read(struct vfe_device *vfe, u32 *value0, u32 *value1)
10274e1abf66STodor Tomov {
10284e1abf66STodor Tomov 	*value0 = readl_relaxed(vfe->base + VFE_0_IRQ_STATUS_0);
10294e1abf66STodor Tomov 	*value1 = readl_relaxed(vfe->base + VFE_0_IRQ_STATUS_1);
10304e1abf66STodor Tomov 
10314e1abf66STodor Tomov 	writel_relaxed(*value0, vfe->base + VFE_0_IRQ_CLEAR_0);
10324e1abf66STodor Tomov 	writel_relaxed(*value1, vfe->base + VFE_0_IRQ_CLEAR_1);
10334e1abf66STodor Tomov 
10344e1abf66STodor Tomov 	wmb();
10354e1abf66STodor Tomov 	writel_relaxed(VFE_0_IRQ_CMD_GLOBAL_CLEAR, vfe->base + VFE_0_IRQ_CMD);
10364e1abf66STodor Tomov }
10374e1abf66STodor Tomov 
10384e1abf66STodor Tomov static void vfe_violation_read(struct vfe_device *vfe)
10394e1abf66STodor Tomov {
10404e1abf66STodor Tomov 	u32 violation = readl_relaxed(vfe->base + VFE_0_VIOLATION_STATUS);
10414e1abf66STodor Tomov 
10424e1abf66STodor Tomov 	pr_err_ratelimited("VFE: violation = 0x%08x\n", violation);
10434e1abf66STodor Tomov }
10444e1abf66STodor Tomov 
10454e1abf66STodor Tomov /*
10464e1abf66STodor Tomov  * vfe_isr - ISPIF module interrupt handler
10474e1abf66STodor Tomov  * @irq: Interrupt line
10484e1abf66STodor Tomov  * @dev: VFE device
10494e1abf66STodor Tomov  *
10504e1abf66STodor Tomov  * Return IRQ_HANDLED on success
10514e1abf66STodor Tomov  */
10524e1abf66STodor Tomov static irqreturn_t vfe_isr(int irq, void *dev)
10534e1abf66STodor Tomov {
10544e1abf66STodor Tomov 	struct vfe_device *vfe = dev;
10554e1abf66STodor Tomov 	u32 value0, value1;
10564e1abf66STodor Tomov 	int i, j;
10574e1abf66STodor Tomov 
10584e1abf66STodor Tomov 	vfe->ops->isr_read(vfe, &value0, &value1);
10594e1abf66STodor Tomov 
10604e1abf66STodor Tomov 	trace_printk("VFE: status0 = 0x%08x, status1 = 0x%08x\n",
10614e1abf66STodor Tomov 		     value0, value1);
10624e1abf66STodor Tomov 
10634e1abf66STodor Tomov 	if (value0 & VFE_0_IRQ_STATUS_0_RESET_ACK)
10644e1abf66STodor Tomov 		vfe->isr_ops.reset_ack(vfe);
10654e1abf66STodor Tomov 
10664e1abf66STodor Tomov 	if (value1 & VFE_0_IRQ_STATUS_1_VIOLATION)
10674e1abf66STodor Tomov 		vfe->ops->violation_read(vfe);
10684e1abf66STodor Tomov 
10694e1abf66STodor Tomov 	if (value1 & VFE_0_IRQ_STATUS_1_BUS_BDG_HALT_ACK)
10704e1abf66STodor Tomov 		vfe->isr_ops.halt_ack(vfe);
10714e1abf66STodor Tomov 
10724e1abf66STodor Tomov 	for (i = VFE_LINE_RDI0; i <= VFE_LINE_PIX; i++)
10734e1abf66STodor Tomov 		if (value0 & VFE_0_IRQ_STATUS_0_line_n_REG_UPDATE(i))
10744e1abf66STodor Tomov 			vfe->isr_ops.reg_update(vfe, i);
10754e1abf66STodor Tomov 
10764e1abf66STodor Tomov 	if (value0 & VFE_0_IRQ_STATUS_0_CAMIF_SOF)
10774e1abf66STodor Tomov 		vfe->isr_ops.sof(vfe, VFE_LINE_PIX);
10784e1abf66STodor Tomov 
10794e1abf66STodor Tomov 	for (i = VFE_LINE_RDI0; i <= VFE_LINE_RDI2; i++)
10804e1abf66STodor Tomov 		if (value1 & VFE_0_IRQ_STATUS_1_RDIn_SOF(i))
10814e1abf66STodor Tomov 			vfe->isr_ops.sof(vfe, i);
10824e1abf66STodor Tomov 
10834e1abf66STodor Tomov 	for (i = 0; i < MSM_VFE_COMPOSITE_IRQ_NUM; i++)
10844e1abf66STodor Tomov 		if (value0 & VFE_0_IRQ_STATUS_0_IMAGE_COMPOSITE_DONE_n(i)) {
10854e1abf66STodor Tomov 			vfe->isr_ops.comp_done(vfe, i);
10864e1abf66STodor Tomov 			for (j = 0; j < ARRAY_SIZE(vfe->wm_output_map); j++)
10874e1abf66STodor Tomov 				if (vfe->wm_output_map[j] == VFE_LINE_PIX)
10884e1abf66STodor Tomov 					value0 &= ~VFE_0_IRQ_MASK_0_IMAGE_MASTER_n_PING_PONG(j);
10894e1abf66STodor Tomov 		}
10904e1abf66STodor Tomov 
10914e1abf66STodor Tomov 	for (i = 0; i < MSM_VFE_IMAGE_MASTERS_NUM; i++)
10924e1abf66STodor Tomov 		if (value0 & VFE_0_IRQ_STATUS_0_IMAGE_MASTER_n_PING_PONG(i))
10934e1abf66STodor Tomov 			vfe->isr_ops.wm_done(vfe, i);
10944e1abf66STodor Tomov 
10954e1abf66STodor Tomov 	return IRQ_HANDLED;
10964e1abf66STodor Tomov }
10974e1abf66STodor Tomov 
10984e1abf66STodor Tomov const struct vfe_hw_ops vfe_ops_4_7 = {
10994e1abf66STodor Tomov 	.hw_version_read = vfe_hw_version_read,
11004e1abf66STodor Tomov 	.get_ub_size = vfe_get_ub_size,
11014e1abf66STodor Tomov 	.global_reset = vfe_global_reset,
11024e1abf66STodor Tomov 	.halt_request = vfe_halt_request,
11034e1abf66STodor Tomov 	.halt_clear = vfe_halt_clear,
11044e1abf66STodor Tomov 	.wm_enable = vfe_wm_enable,
11054e1abf66STodor Tomov 	.wm_frame_based = vfe_wm_frame_based,
11064e1abf66STodor Tomov 	.wm_line_based = vfe_wm_line_based,
11074e1abf66STodor Tomov 	.wm_set_framedrop_period = vfe_wm_set_framedrop_period,
11084e1abf66STodor Tomov 	.wm_set_framedrop_pattern = vfe_wm_set_framedrop_pattern,
11094e1abf66STodor Tomov 	.wm_set_ub_cfg = vfe_wm_set_ub_cfg,
11104e1abf66STodor Tomov 	.bus_reload_wm = vfe_bus_reload_wm,
11114e1abf66STodor Tomov 	.wm_set_ping_addr = vfe_wm_set_ping_addr,
11124e1abf66STodor Tomov 	.wm_set_pong_addr = vfe_wm_set_pong_addr,
11134e1abf66STodor Tomov 	.wm_get_ping_pong_status = vfe_wm_get_ping_pong_status,
11144e1abf66STodor Tomov 	.bus_enable_wr_if = vfe_bus_enable_wr_if,
11154e1abf66STodor Tomov 	.bus_connect_wm_to_rdi = vfe_bus_connect_wm_to_rdi,
11164e1abf66STodor Tomov 	.wm_set_subsample = vfe_wm_set_subsample,
11174e1abf66STodor Tomov 	.bus_disconnect_wm_from_rdi = vfe_bus_disconnect_wm_from_rdi,
11184e1abf66STodor Tomov 	.set_xbar_cfg = vfe_set_xbar_cfg,
1119*312e1c85STodor Tomov 	.set_realign_cfg = vfe_set_realign_cfg,
11204e1abf66STodor Tomov 	.set_rdi_cid = vfe_set_rdi_cid,
11214e1abf66STodor Tomov 	.reg_update = vfe_reg_update,
11224e1abf66STodor Tomov 	.reg_update_clear = vfe_reg_update_clear,
11234e1abf66STodor Tomov 	.enable_irq_wm_line = vfe_enable_irq_wm_line,
11244e1abf66STodor Tomov 	.enable_irq_pix_line = vfe_enable_irq_pix_line,
11254e1abf66STodor Tomov 	.enable_irq_common = vfe_enable_irq_common,
11264e1abf66STodor Tomov 	.set_demux_cfg = vfe_set_demux_cfg,
11274e1abf66STodor Tomov 	.set_scale_cfg = vfe_set_scale_cfg,
11284e1abf66STodor Tomov 	.set_crop_cfg = vfe_set_crop_cfg,
11294e1abf66STodor Tomov 	.set_clamp_cfg = vfe_set_clamp_cfg,
11304e1abf66STodor Tomov 	.set_qos = vfe_set_qos,
11314e1abf66STodor Tomov 	.set_ds = vfe_set_ds,
11324e1abf66STodor Tomov 	.set_cgc_override = vfe_set_cgc_override,
11334e1abf66STodor Tomov 	.set_camif_cfg = vfe_set_camif_cfg,
11344e1abf66STodor Tomov 	.set_camif_cmd = vfe_set_camif_cmd,
11354e1abf66STodor Tomov 	.set_module_cfg = vfe_set_module_cfg,
11364e1abf66STodor Tomov 	.camif_wait_for_stop = vfe_camif_wait_for_stop,
11374e1abf66STodor Tomov 	.isr_read = vfe_isr_read,
11384e1abf66STodor Tomov 	.violation_read = vfe_violation_read,
11394e1abf66STodor Tomov 	.isr = vfe_isr,
11404e1abf66STodor Tomov };
1141