// SPDX-License-Identifier: GPL-2.0 /* * camss-csid.c * * Qualcomm MSM Camera Subsystem - CSID (CSI Decoder) Module * * Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. * Copyright (C) 2015-2018 Linaro Ltd. */ #include <linux/clk.h> #include <linux/completion.h> #include <linux/interrupt.h> #include <linux/io.h> #include <linux/kernel.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/pm_runtime.h> #include <linux/regulator/consumer.h> #include <media/media-entity.h> #include <media/v4l2-device.h> #include <media/v4l2-event.h> #include <media/v4l2-subdev.h> #include "camss-csid.h" #include "camss-csid-gen1.h" #include "camss.h" /* offset of CSID registers in VFE region for VFE 480 */ #define VFE_480_CSID_OFFSET … #define VFE_480_LITE_CSID_OFFSET … #define MSM_CSID_NAME … const char * const csid_testgen_modes[] = …; static const struct csid_format_info formats_4_1[] = …; static const struct csid_format_info formats_4_7[] = …; static const struct csid_format_info formats_gen2[] = …; const struct csid_formats csid_formats_4_1 = …; const struct csid_formats csid_formats_4_7 = …; const struct csid_formats csid_formats_gen2 = …; u32 csid_find_code(u32 *codes, unsigned int ncodes, unsigned int match_format_idx, u32 match_code) { … } const struct csid_format_info *csid_get_fmt_entry(const struct csid_format_info *formats, unsigned int nformats, u32 code) { … } /* * csid_set_clock_rates - Calculate and set clock rates on CSID module * @csiphy: CSID device */ static int csid_set_clock_rates(struct csid_device *csid) { … } /* * csid_set_power - Power on/off CSID module * @sd: CSID V4L2 subdevice * @on: Requested power state * * Return 0 on success or a negative error code otherwise */ static int csid_set_power(struct v4l2_subdev *sd, int on) { … } /* * csid_set_stream - Enable/disable streaming on CSID module * @sd: CSID V4L2 subdevice * @enable: Requested streaming state * * Main configuration of CSID module is also done here. * * Return 0 on success or a negative error code otherwise */ static int csid_set_stream(struct v4l2_subdev *sd, int enable) { … } /* * __csid_get_format - Get pointer to format structure * @csid: CSID device * @sd_state: V4L2 subdev state * @pad: pad from which format is requested * @which: TRY or ACTIVE format * * Return pointer to TRY or ACTIVE format structure */ static struct v4l2_mbus_framefmt * __csid_get_format(struct csid_device *csid, struct v4l2_subdev_state *sd_state, unsigned int pad, enum v4l2_subdev_format_whence which) { … } /* * csid_try_format - Handle try format by pad subdev method * @csid: CSID device * @sd_state: V4L2 subdev state * @pad: pad on which format is requested * @fmt: pointer to v4l2 format structure * @which: wanted subdev format */ static void csid_try_format(struct csid_device *csid, struct v4l2_subdev_state *sd_state, unsigned int pad, struct v4l2_mbus_framefmt *fmt, enum v4l2_subdev_format_whence which) { … } /* * csid_enum_mbus_code - Handle pixel format enumeration * @sd: CSID V4L2 subdevice * @sd_state: V4L2 subdev state * @code: pointer to v4l2_subdev_mbus_code_enum structure * return -EINVAL or zero on success */ static int csid_enum_mbus_code(struct v4l2_subdev *sd, struct v4l2_subdev_state *sd_state, struct v4l2_subdev_mbus_code_enum *code) { … } /* * csid_enum_frame_size - Handle frame size enumeration * @sd: CSID V4L2 subdevice * @sd_state: V4L2 subdev state * @fse: pointer to v4l2_subdev_frame_size_enum structure * return -EINVAL or zero on success */ static int csid_enum_frame_size(struct v4l2_subdev *sd, struct v4l2_subdev_state *sd_state, struct v4l2_subdev_frame_size_enum *fse) { … } /* * csid_get_format - Handle get format by pads subdev method * @sd: CSID V4L2 subdevice * @sd_state: V4L2 subdev state * @fmt: pointer to v4l2 subdev format structure * * Return -EINVAL or zero on success */ static int csid_get_format(struct v4l2_subdev *sd, struct v4l2_subdev_state *sd_state, struct v4l2_subdev_format *fmt) { … } /* * csid_set_format - Handle set format by pads subdev method * @sd: CSID V4L2 subdevice * @sd_state: V4L2 subdev state * @fmt: pointer to v4l2 subdev format structure * * Return -EINVAL or zero on success */ static int csid_set_format(struct v4l2_subdev *sd, struct v4l2_subdev_state *sd_state, struct v4l2_subdev_format *fmt) { … } /* * csid_init_formats - Initialize formats on all pads * @sd: CSID V4L2 subdevice * @fh: V4L2 subdev file handle * * Initialize all pad formats with default values. * * Return 0 on success or a negative error code otherwise */ static int csid_init_formats(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) { … } /* * csid_set_test_pattern - Set test generator's pattern mode * @csid: CSID device * @value: desired test pattern mode * * Return 0 on success or a negative error code otherwise */ static int csid_set_test_pattern(struct csid_device *csid, s32 value) { … } /* * csid_s_ctrl - Handle set control subdev method * @ctrl: pointer to v4l2 control structure * * Return 0 on success or a negative error code otherwise */ static int csid_s_ctrl(struct v4l2_ctrl *ctrl) { … } static const struct v4l2_ctrl_ops csid_ctrl_ops = …; /* * msm_csid_subdev_init - Initialize CSID device structure and resources * @csid: CSID device * @res: CSID module resources table * @id: CSID module id * * Return 0 on success or a negative error code otherwise */ int msm_csid_subdev_init(struct camss *camss, struct csid_device *csid, const struct camss_subdev_resources *res, u8 id) { … } /* * msm_csid_get_csid_id - Get CSID HW module id * @entity: Pointer to CSID media entity structure * @id: Return CSID HW module id here */ void msm_csid_get_csid_id(struct media_entity *entity, u8 *id) { … } /* * csid_get_lane_assign - Calculate CSI2 lane assign configuration parameter * @lane_cfg - CSI2 lane configuration * * Return lane assign */ static u32 csid_get_lane_assign(struct csiphy_lanes_cfg *lane_cfg) { … } /* * csid_link_setup - Setup CSID connections * @entity: Pointer to media entity structure * @local: Pointer to local pad * @remote: Pointer to remote pad * @flags: Link flags * * Return 0 on success */ static int csid_link_setup(struct media_entity *entity, const struct media_pad *local, const struct media_pad *remote, u32 flags) { … } static const struct v4l2_subdev_core_ops csid_core_ops = …; static const struct v4l2_subdev_video_ops csid_video_ops = …; static const struct v4l2_subdev_pad_ops csid_pad_ops = …; static const struct v4l2_subdev_ops csid_v4l2_ops = …; static const struct v4l2_subdev_internal_ops csid_v4l2_internal_ops = …; static const struct media_entity_operations csid_media_ops = …; /* * msm_csid_register_entity - Register subdev node for CSID module * @csid: CSID device * @v4l2_dev: V4L2 device * * Return 0 on success or a negative error code otherwise */ int msm_csid_register_entity(struct csid_device *csid, struct v4l2_device *v4l2_dev) { … } /* * msm_csid_unregister_entity - Unregister CSID module subdev node * @csid: CSID device */ void msm_csid_unregister_entity(struct csid_device *csid) { … } inline bool csid_is_lite(struct csid_device *csid) { … }