1b873663bSTodor Tomov /* SPDX-License-Identifier: GPL-2.0 */
2ec6859b2STodor Tomov /*
3ec6859b2STodor Tomov  * camss-ispif.h
4ec6859b2STodor Tomov  *
5ec6859b2STodor Tomov  * Qualcomm MSM Camera Subsystem - ISPIF (ISP Interface) Module
6ec6859b2STodor Tomov  *
7ec6859b2STodor Tomov  * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
8ec6859b2STodor Tomov  * Copyright (C) 2015-2018 Linaro Ltd.
9ec6859b2STodor Tomov  */
10ec6859b2STodor Tomov #ifndef QC_MSM_CAMSS_ISPIF_H
11ec6859b2STodor Tomov #define QC_MSM_CAMSS_ISPIF_H
12ec6859b2STodor Tomov 
13ec6859b2STodor Tomov #include <linux/clk.h>
14ec6859b2STodor Tomov #include <media/media-entity.h>
15ec6859b2STodor Tomov #include <media/v4l2-device.h>
16ec6859b2STodor Tomov #include <media/v4l2-subdev.h>
17ec6859b2STodor Tomov 
18ec6859b2STodor Tomov #define MSM_ISPIF_PAD_SINK 0
19ec6859b2STodor Tomov #define MSM_ISPIF_PAD_SRC 1
20ec6859b2STodor Tomov #define MSM_ISPIF_PADS_NUM 2
21ec6859b2STodor Tomov 
229c3e59deSTodor Tomov #define MSM_ISPIF_VFE_NUM 2
23ec6859b2STodor Tomov 
24ec6859b2STodor Tomov enum ispif_intf {
25ec6859b2STodor Tomov 	PIX0,
26ec6859b2STodor Tomov 	RDI0,
27ec6859b2STodor Tomov 	PIX1,
28ec6859b2STodor Tomov 	RDI1,
29ec6859b2STodor Tomov 	RDI2
30ec6859b2STodor Tomov };
31ec6859b2STodor Tomov 
32ec6859b2STodor Tomov struct ispif_intf_cmd_reg {
33ec6859b2STodor Tomov 	u32 cmd_0;
34ec6859b2STodor Tomov 	u32 cmd_1;
35ec6859b2STodor Tomov };
36ec6859b2STodor Tomov 
37ec6859b2STodor Tomov struct ispif_line {
389c3e59deSTodor Tomov 	struct ispif_device *ispif;
39ec6859b2STodor Tomov 	u8 id;
40ec6859b2STodor Tomov 	u8 csid_id;
41ec6859b2STodor Tomov 	u8 vfe_id;
42ec6859b2STodor Tomov 	enum ispif_intf interface;
43ec6859b2STodor Tomov 	struct v4l2_subdev subdev;
44ec6859b2STodor Tomov 	struct media_pad pads[MSM_ISPIF_PADS_NUM];
45ec6859b2STodor Tomov 	struct v4l2_mbus_framefmt fmt[MSM_ISPIF_PADS_NUM];
46cba3819dSTodor Tomov 	const u32 *formats;
47cba3819dSTodor Tomov 	unsigned int nformats;
48ec6859b2STodor Tomov };
49ec6859b2STodor Tomov 
50ec6859b2STodor Tomov struct ispif_device {
51ec6859b2STodor Tomov 	void __iomem *base;
52ec6859b2STodor Tomov 	void __iomem *base_clk_mux;
53ec6859b2STodor Tomov 	u32 irq;
54ec6859b2STodor Tomov 	char irq_name[30];
55ec6859b2STodor Tomov 	struct camss_clock *clock;
56ec6859b2STodor Tomov 	int nclocks;
57ec6859b2STodor Tomov 	struct camss_clock  *clock_for_reset;
58ec6859b2STodor Tomov 	int nclocks_for_reset;
59864ed874SAngeloGioacchino Del Regno 	struct completion reset_complete[MSM_ISPIF_VFE_NUM];
60ec6859b2STodor Tomov 	int power_count;
61ec6859b2STodor Tomov 	struct mutex power_lock;
62ec6859b2STodor Tomov 	struct ispif_intf_cmd_reg intf_cmd[MSM_ISPIF_VFE_NUM];
63ec6859b2STodor Tomov 	struct mutex config_lock;
649c3e59deSTodor Tomov 	unsigned int line_num;
659c3e59deSTodor Tomov 	struct ispif_line *line;
66*9d95baf9SRobert Foss 	struct camss *camss;
67ec6859b2STodor Tomov };
68ec6859b2STodor Tomov 
69ec6859b2STodor Tomov struct resources_ispif;
70ec6859b2STodor Tomov 
71*9d95baf9SRobert Foss int msm_ispif_subdev_init(struct camss *camss,
72ec6859b2STodor Tomov 			  const struct resources_ispif *res);
73ec6859b2STodor Tomov 
74ec6859b2STodor Tomov int msm_ispif_register_entities(struct ispif_device *ispif,
75ec6859b2STodor Tomov 				struct v4l2_device *v4l2_dev);
76ec6859b2STodor Tomov 
77ec6859b2STodor Tomov void msm_ispif_unregister_entities(struct ispif_device *ispif);
78ec6859b2STodor Tomov 
79ec6859b2STodor Tomov #endif /* QC_MSM_CAMSS_ISPIF_H */
80