1b873663bSTodor Tomov /* SPDX-License-Identifier: GPL-2.0 */
2ec6859b2STodor Tomov /*
3ec6859b2STodor Tomov  * camss-csiphy.h
4ec6859b2STodor Tomov  *
5ec6859b2STodor Tomov  * Qualcomm MSM Camera Subsystem - CSIPHY Module
6ec6859b2STodor Tomov  *
7ec6859b2STodor Tomov  * Copyright (c) 2011-2015, The Linux Foundation. All rights reserved.
8ec6859b2STodor Tomov  * Copyright (C) 2016-2018 Linaro Ltd.
9ec6859b2STodor Tomov  */
10ec6859b2STodor Tomov #ifndef QC_MSM_CAMSS_CSIPHY_H
11ec6859b2STodor Tomov #define QC_MSM_CAMSS_CSIPHY_H
12ec6859b2STodor Tomov 
13ec6859b2STodor Tomov #include <linux/clk.h>
14516e8f0fSTodor Tomov #include <linux/interrupt.h>
15ec6859b2STodor Tomov #include <media/media-entity.h>
16ec6859b2STodor Tomov #include <media/v4l2-device.h>
17ec6859b2STodor Tomov #include <media/v4l2-mediabus.h>
18ec6859b2STodor Tomov #include <media/v4l2-subdev.h>
19ec6859b2STodor Tomov 
20ec6859b2STodor Tomov #define MSM_CSIPHY_PAD_SINK 0
21ec6859b2STodor Tomov #define MSM_CSIPHY_PAD_SRC 1
22ec6859b2STodor Tomov #define MSM_CSIPHY_PADS_NUM 2
23ec6859b2STodor Tomov 
24ec6859b2STodor Tomov struct csiphy_lane {
25ec6859b2STodor Tomov 	u8 pos;
26ec6859b2STodor Tomov 	u8 pol;
27ec6859b2STodor Tomov };
28ec6859b2STodor Tomov 
29ec6859b2STodor Tomov struct csiphy_lanes_cfg {
30ec6859b2STodor Tomov 	int num_data;
31ec6859b2STodor Tomov 	struct csiphy_lane *data;
32ec6859b2STodor Tomov 	struct csiphy_lane clk;
33ec6859b2STodor Tomov };
34ec6859b2STodor Tomov 
35ec6859b2STodor Tomov struct csiphy_csi2_cfg {
36ec6859b2STodor Tomov 	struct csiphy_lanes_cfg lane_cfg;
37ec6859b2STodor Tomov };
38ec6859b2STodor Tomov 
39ec6859b2STodor Tomov struct csiphy_config {
40ec6859b2STodor Tomov 	u8 combo_mode;
41ec6859b2STodor Tomov 	u8 csid_id;
42ec6859b2STodor Tomov 	struct csiphy_csi2_cfg *csi2;
43ec6859b2STodor Tomov };
44ec6859b2STodor Tomov 
45516e8f0fSTodor Tomov struct csiphy_device;
46516e8f0fSTodor Tomov 
47516e8f0fSTodor Tomov struct csiphy_hw_ops {
48*4abb2130SRobert Foss 	/*
49*4abb2130SRobert Foss 	 * csiphy_get_lane_mask - Calculate CSI2 lane mask configuration parameter
50*4abb2130SRobert Foss 	 * @lane_cfg - CSI2 lane configuration
51*4abb2130SRobert Foss 	 *
52*4abb2130SRobert Foss 	 * Return lane mask
53*4abb2130SRobert Foss 	 */
54*4abb2130SRobert Foss 	u8 (*get_lane_mask)(struct csiphy_lanes_cfg *lane_cfg);
55516e8f0fSTodor Tomov 	void (*hw_version_read)(struct csiphy_device *csiphy,
56516e8f0fSTodor Tomov 				struct device *dev);
57516e8f0fSTodor Tomov 	void (*reset)(struct csiphy_device *csiphy);
58516e8f0fSTodor Tomov 	void (*lanes_enable)(struct csiphy_device *csiphy,
59516e8f0fSTodor Tomov 			     struct csiphy_config *cfg,
6078c2cc28SAndrey Konovalov 			     s64 link_freq, u8 lane_mask);
61369f81f3STodor Tomov 	void (*lanes_disable)(struct csiphy_device *csiphy,
62369f81f3STodor Tomov 			      struct csiphy_config *cfg);
63516e8f0fSTodor Tomov 	irqreturn_t (*isr)(int irq, void *dev);
64516e8f0fSTodor Tomov };
65516e8f0fSTodor Tomov 
66ec6859b2STodor Tomov struct csiphy_device {
679c3e59deSTodor Tomov 	struct camss *camss;
68ec6859b2STodor Tomov 	u8 id;
69ec6859b2STodor Tomov 	struct v4l2_subdev subdev;
70ec6859b2STodor Tomov 	struct media_pad pads[MSM_CSIPHY_PADS_NUM];
71ec6859b2STodor Tomov 	void __iomem *base;
72ec6859b2STodor Tomov 	void __iomem *base_clk_mux;
73ec6859b2STodor Tomov 	u32 irq;
74ec6859b2STodor Tomov 	char irq_name[30];
75ec6859b2STodor Tomov 	struct camss_clock *clock;
764863b93cSAngeloGioacchino Del Regno 	bool *rate_set;
77ec6859b2STodor Tomov 	int nclocks;
78ec6859b2STodor Tomov 	u32 timer_clk_rate;
79ec6859b2STodor Tomov 	struct csiphy_config cfg;
80ec6859b2STodor Tomov 	struct v4l2_mbus_framefmt fmt[MSM_CSIPHY_PADS_NUM];
81516e8f0fSTodor Tomov 	const struct csiphy_hw_ops *ops;
82cba3819dSTodor Tomov 	const struct csiphy_format *formats;
83cba3819dSTodor Tomov 	unsigned int nformats;
84ec6859b2STodor Tomov };
85ec6859b2STodor Tomov 
86ec6859b2STodor Tomov struct resources;
87ec6859b2STodor Tomov 
889c3e59deSTodor Tomov int msm_csiphy_subdev_init(struct camss *camss,
899c3e59deSTodor Tomov 			   struct csiphy_device *csiphy,
90ec6859b2STodor Tomov 			   const struct resources *res, u8 id);
91ec6859b2STodor Tomov 
92ec6859b2STodor Tomov int msm_csiphy_register_entity(struct csiphy_device *csiphy,
93ec6859b2STodor Tomov 			       struct v4l2_device *v4l2_dev);
94ec6859b2STodor Tomov 
95ec6859b2STodor Tomov void msm_csiphy_unregister_entity(struct csiphy_device *csiphy);
96ec6859b2STodor Tomov 
97516e8f0fSTodor Tomov extern const struct csiphy_hw_ops csiphy_ops_2ph_1_0;
984138a88bSTodor Tomov extern const struct csiphy_hw_ops csiphy_ops_3ph_1_0;
99516e8f0fSTodor Tomov 
100ec6859b2STodor Tomov #endif /* QC_MSM_CAMSS_CSIPHY_H */
101