1b873663bSTodor Tomov /* SPDX-License-Identifier: GPL-2.0 */ 2ec6859b2STodor Tomov /* 3ec6859b2STodor Tomov * camss-csid.h 4ec6859b2STodor Tomov * 5ec6859b2STodor Tomov * Qualcomm MSM Camera Subsystem - CSID (CSI Decoder) Module 6ec6859b2STodor Tomov * 7ec6859b2STodor Tomov * Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. 8ec6859b2STodor Tomov * Copyright (C) 2015-2018 Linaro Ltd. 9ec6859b2STodor Tomov */ 10ec6859b2STodor Tomov #ifndef QC_MSM_CAMSS_CSID_H 11ec6859b2STodor Tomov #define QC_MSM_CAMSS_CSID_H 12ec6859b2STodor Tomov 13ec6859b2STodor Tomov #include <linux/clk.h> 1476005817SRobert Foss #include <linux/interrupt.h> 15ec6859b2STodor Tomov #include <media/media-entity.h> 16ec6859b2STodor Tomov #include <media/v4l2-ctrls.h> 17ec6859b2STodor Tomov #include <media/v4l2-device.h> 18ec6859b2STodor Tomov #include <media/v4l2-mediabus.h> 19ec6859b2STodor Tomov #include <media/v4l2-subdev.h> 20ec6859b2STodor Tomov 21ec6859b2STodor Tomov #define MSM_CSID_PAD_SINK 0 22*3c4ed72aSMilen Mitkov #define MSM_CSID_PAD_FIRST_SRC 1 23*3c4ed72aSMilen Mitkov #define MSM_CSID_PADS_NUM 5 24*3c4ed72aSMilen Mitkov 25*3c4ed72aSMilen Mitkov #define MSM_CSID_PAD_SRC (MSM_CSID_PAD_FIRST_SRC) 26*3c4ed72aSMilen Mitkov 27*3c4ed72aSMilen Mitkov /* CSID hardware can demultiplex up to 4 outputs */ 28*3c4ed72aSMilen Mitkov #define MSM_CSID_MAX_SRC_STREAMS 4 29ec6859b2STodor Tomov 30e19b14b1SRobert Foss #define DATA_TYPE_EMBEDDED_DATA_8BIT 0x12 31e19b14b1SRobert Foss #define DATA_TYPE_YUV420_8BIT 0x18 32e19b14b1SRobert Foss #define DATA_TYPE_YUV420_10BIT 0x19 33e19b14b1SRobert Foss #define DATA_TYPE_YUV420_8BIT_LEGACY 0x1a 34e19b14b1SRobert Foss #define DATA_TYPE_YUV420_8BIT_SHIFTED 0x1c /* Chroma Shifted Pixel Sampling */ 35e19b14b1SRobert Foss #define DATA_TYPE_YUV420_10BIT_SHIFTED 0x1d /* Chroma Shifted Pixel Sampling */ 36e19b14b1SRobert Foss #define DATA_TYPE_YUV422_8BIT 0x1e 37e19b14b1SRobert Foss #define DATA_TYPE_YUV422_10BIT 0x1f 38e19b14b1SRobert Foss #define DATA_TYPE_RGB444 0x20 39e19b14b1SRobert Foss #define DATA_TYPE_RGB555 0x21 40e19b14b1SRobert Foss #define DATA_TYPE_RGB565 0x22 41e19b14b1SRobert Foss #define DATA_TYPE_RGB666 0x23 42e19b14b1SRobert Foss #define DATA_TYPE_RGB888 0x24 43e19b14b1SRobert Foss #define DATA_TYPE_RAW_24BIT 0x27 44e19b14b1SRobert Foss #define DATA_TYPE_RAW_6BIT 0x28 45e19b14b1SRobert Foss #define DATA_TYPE_RAW_7BIT 0x29 46e19b14b1SRobert Foss #define DATA_TYPE_RAW_8BIT 0x2a 47e19b14b1SRobert Foss #define DATA_TYPE_RAW_10BIT 0x2b 48e19b14b1SRobert Foss #define DATA_TYPE_RAW_12BIT 0x2c 49e19b14b1SRobert Foss #define DATA_TYPE_RAW_14BIT 0x2d 50e19b14b1SRobert Foss #define DATA_TYPE_RAW_16BIT 0x2e 51e19b14b1SRobert Foss #define DATA_TYPE_RAW_20BIT 0x2f 52e19b14b1SRobert Foss 5376005817SRobert Foss #define CSID_RESET_TIMEOUT_MS 500 5476005817SRobert Foss 5576005817SRobert Foss enum csid_testgen_mode { 5676005817SRobert Foss CSID_PAYLOAD_MODE_DISABLED = 0, 5776005817SRobert Foss CSID_PAYLOAD_MODE_INCREMENTING = 1, 5876005817SRobert Foss CSID_PAYLOAD_MODE_ALTERNATING_55_AA = 2, 5976005817SRobert Foss CSID_PAYLOAD_MODE_ALL_ZEROES = 3, 6076005817SRobert Foss CSID_PAYLOAD_MODE_ALL_ONES = 4, 6176005817SRobert Foss CSID_PAYLOAD_MODE_RANDOM = 5, 6276005817SRobert Foss CSID_PAYLOAD_MODE_USER_SPECIFIED = 6, 6376005817SRobert Foss CSID_PAYLOAD_MODE_NUM_SUPPORTED_GEN1 = 6, /* excluding disabled */ 64eebe6d00SRobert Foss CSID_PAYLOAD_MODE_COMPLEX_PATTERN = 7, 65eebe6d00SRobert Foss CSID_PAYLOAD_MODE_COLOR_BOX = 8, 66eebe6d00SRobert Foss CSID_PAYLOAD_MODE_COLOR_BARS = 9, 67eebe6d00SRobert Foss CSID_PAYLOAD_MODE_NUM_SUPPORTED_GEN2 = 9, /* excluding disabled */ 6876005817SRobert Foss }; 6976005817SRobert Foss 7076005817SRobert Foss struct csid_format { 7176005817SRobert Foss u32 code; 7276005817SRobert Foss u8 data_type; 7376005817SRobert Foss u8 decode_format; 7476005817SRobert Foss u8 bpp; 7576005817SRobert Foss u8 spp; /* bus samples per pixel */ 76ec6859b2STodor Tomov }; 77ec6859b2STodor Tomov 78ec6859b2STodor Tomov struct csid_testgen_config { 7976005817SRobert Foss enum csid_testgen_mode mode; 8076005817SRobert Foss const char * const*modes; 8176005817SRobert Foss u8 nmodes; 82ec6859b2STodor Tomov u8 enabled; 83ec6859b2STodor Tomov }; 84ec6859b2STodor Tomov 85ec6859b2STodor Tomov struct csid_phy_config { 86ec6859b2STodor Tomov u8 csiphy_id; 87ec6859b2STodor Tomov u8 lane_cnt; 88ec6859b2STodor Tomov u32 lane_assign; 89*3c4ed72aSMilen Mitkov u32 en_vc; 90*3c4ed72aSMilen Mitkov u8 need_vc_update; 91ec6859b2STodor Tomov }; 92ec6859b2STodor Tomov 9376005817SRobert Foss struct csid_device; 9476005817SRobert Foss 9576005817SRobert Foss struct csid_hw_ops { 9676005817SRobert Foss /* 9776005817SRobert Foss * configure_stream - Configures and starts CSID input stream 9876005817SRobert Foss * @csid: CSID device 9976005817SRobert Foss */ 10076005817SRobert Foss void (*configure_stream)(struct csid_device *csid, u8 enable); 10176005817SRobert Foss 10276005817SRobert Foss /* 10376005817SRobert Foss * configure_testgen_pattern - Validates and configures output pattern mode 10476005817SRobert Foss * of test pattern generator 10576005817SRobert Foss * @csid: CSID device 10676005817SRobert Foss */ 10776005817SRobert Foss int (*configure_testgen_pattern)(struct csid_device *csid, s32 val); 10876005817SRobert Foss 10976005817SRobert Foss /* 11076005817SRobert Foss * hw_version - Read hardware version register from hardware 11176005817SRobert Foss * @csid: CSID device 11276005817SRobert Foss */ 11376005817SRobert Foss u32 (*hw_version)(struct csid_device *csid); 11476005817SRobert Foss 11576005817SRobert Foss /* 11676005817SRobert Foss * isr - CSID module interrupt service routine 11776005817SRobert Foss * @irq: Interrupt line 11876005817SRobert Foss * @dev: CSID device 11976005817SRobert Foss * 12076005817SRobert Foss * Return IRQ_HANDLED on success 12176005817SRobert Foss */ 12276005817SRobert Foss irqreturn_t (*isr)(int irq, void *dev); 12376005817SRobert Foss 12476005817SRobert Foss /* 12576005817SRobert Foss * reset - Trigger reset on CSID module and wait to complete 12676005817SRobert Foss * @csid: CSID device 12776005817SRobert Foss * 12876005817SRobert Foss * Return 0 on success or a negative error code otherwise 12976005817SRobert Foss */ 13076005817SRobert Foss int (*reset)(struct csid_device *csid); 13176005817SRobert Foss 13276005817SRobert Foss /* 13376005817SRobert Foss * src_pad_code - Pick an output/src format based on the input/sink format 13476005817SRobert Foss * @csid: CSID device 13576005817SRobert Foss * @sink_code: The sink format of the input 13676005817SRobert Foss * @match_format_idx: Request preferred index, as defined by subdevice csid_format. 13776005817SRobert Foss * Set @match_code to 0 if used. 13876005817SRobert Foss * @match_code: Request preferred code, set @match_format_idx to 0 if used 13976005817SRobert Foss * 14076005817SRobert Foss * Return 0 on failure or src format code otherwise 14176005817SRobert Foss */ 14276005817SRobert Foss u32 (*src_pad_code)(struct csid_device *csid, u32 sink_code, 14376005817SRobert Foss unsigned int match_format_idx, u32 match_code); 14476005817SRobert Foss 14576005817SRobert Foss /* 14676005817SRobert Foss * subdev_init - Initialize CSID device according for hardware revision 14776005817SRobert Foss * @csid: CSID device 14876005817SRobert Foss */ 14976005817SRobert Foss void (*subdev_init)(struct csid_device *csid); 15076005817SRobert Foss }; 15176005817SRobert Foss 152ec6859b2STodor Tomov struct csid_device { 1539c3e59deSTodor Tomov struct camss *camss; 154ec6859b2STodor Tomov u8 id; 155ec6859b2STodor Tomov struct v4l2_subdev subdev; 156ec6859b2STodor Tomov struct media_pad pads[MSM_CSID_PADS_NUM]; 157ec6859b2STodor Tomov void __iomem *base; 158ec6859b2STodor Tomov u32 irq; 159ec6859b2STodor Tomov char irq_name[30]; 160ec6859b2STodor Tomov struct camss_clock *clock; 161ec6859b2STodor Tomov int nclocks; 1620d814017SBryan O'Donoghue struct regulator_bulk_data *supplies; 1630d814017SBryan O'Donoghue int num_supplies; 164ec6859b2STodor Tomov struct completion reset_complete; 165ec6859b2STodor Tomov struct csid_testgen_config testgen; 166ec6859b2STodor Tomov struct csid_phy_config phy; 167ec6859b2STodor Tomov struct v4l2_mbus_framefmt fmt[MSM_CSID_PADS_NUM]; 168ec6859b2STodor Tomov struct v4l2_ctrl_handler ctrls; 169ec6859b2STodor Tomov struct v4l2_ctrl *testgen_mode; 170cba3819dSTodor Tomov const struct csid_format *formats; 171cba3819dSTodor Tomov unsigned int nformats; 17276005817SRobert Foss const struct csid_hw_ops *ops; 173ec6859b2STodor Tomov }; 174ec6859b2STodor Tomov 175ec6859b2STodor Tomov struct resources; 176ec6859b2STodor Tomov 17776005817SRobert Foss /* 17876005817SRobert Foss * csid_find_code - Find a format code in an array using array index or format code 17976005817SRobert Foss * @codes: Array of format codes 18076005817SRobert Foss * @ncodes: Length of @code array 18176005817SRobert Foss * @req_format_idx: Request preferred index, as defined by subdevice csid_format. 18276005817SRobert Foss * Set @match_code to 0 if used. 18376005817SRobert Foss * @match_code: Request preferred code, set @req_format_idx to 0 if used 18476005817SRobert Foss * 18576005817SRobert Foss * Return 0 on failure or format code otherwise 18676005817SRobert Foss */ 18776005817SRobert Foss u32 csid_find_code(u32 *codes, unsigned int ncode, 18876005817SRobert Foss unsigned int match_format_idx, u32 match_code); 18976005817SRobert Foss 19076005817SRobert Foss /* 19176005817SRobert Foss * csid_get_fmt_entry - Find csid_format entry with matching format code 19276005817SRobert Foss * @formats: Array of format csid_format entries 19376005817SRobert Foss * @nformats: Length of @nformats array 19476005817SRobert Foss * @code: Desired format code 19576005817SRobert Foss * 19676005817SRobert Foss * Return formats[0] on failure to find code 19776005817SRobert Foss */ 19876005817SRobert Foss const struct csid_format *csid_get_fmt_entry(const struct csid_format *formats, 19976005817SRobert Foss unsigned int nformats, 20076005817SRobert Foss u32 code); 20176005817SRobert Foss 2029c3e59deSTodor Tomov int msm_csid_subdev_init(struct camss *camss, struct csid_device *csid, 203ec6859b2STodor Tomov const struct resources *res, u8 id); 204ec6859b2STodor Tomov 205ec6859b2STodor Tomov int msm_csid_register_entity(struct csid_device *csid, 206ec6859b2STodor Tomov struct v4l2_device *v4l2_dev); 207ec6859b2STodor Tomov 208ec6859b2STodor Tomov void msm_csid_unregister_entity(struct csid_device *csid); 209ec6859b2STodor Tomov 210ec6859b2STodor Tomov void msm_csid_get_csid_id(struct media_entity *entity, u8 *id); 211ec6859b2STodor Tomov 21276005817SRobert Foss extern const char * const csid_testgen_modes[]; 21376005817SRobert Foss 21476005817SRobert Foss extern const struct csid_hw_ops csid_ops_4_1; 21576005817SRobert Foss extern const struct csid_hw_ops csid_ops_4_7; 216b4436a18SJonathan Marek extern const struct csid_hw_ops csid_ops_gen2; 217eebe6d00SRobert Foss 21876005817SRobert Foss 219ec6859b2STodor Tomov #endif /* QC_MSM_CAMSS_CSID_H */ 220