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