xref: /linux/drivers/media/platform/amd/isp4/isp4_subdev.h (revision 8c13415c8a4383447c21ec832b20b3b283f0e01a)
14e5e7a7dSBin Du /* SPDX-License-Identifier: GPL-2.0+ */
24e5e7a7dSBin Du /*
34e5e7a7dSBin Du  * Copyright (C) 2025 Advanced Micro Devices, Inc.
44e5e7a7dSBin Du  */
54e5e7a7dSBin Du 
64e5e7a7dSBin Du #ifndef _ISP4_SUBDEV_H_
74e5e7a7dSBin Du #define _ISP4_SUBDEV_H_
84e5e7a7dSBin Du 
94e5e7a7dSBin Du #include <linux/debugfs.h>
104e5e7a7dSBin Du #include <linux/delay.h>
114e5e7a7dSBin Du #include <linux/firmware.h>
124e5e7a7dSBin Du #include <linux/pm_runtime.h>
134e5e7a7dSBin Du #include <linux/types.h>
144e5e7a7dSBin Du #include <linux/uaccess.h>
154e5e7a7dSBin Du #include <media/v4l2-device.h>
164e5e7a7dSBin Du 
174e5e7a7dSBin Du #include "isp4_fw_cmd_resp.h"
184e5e7a7dSBin Du #include "isp4_hw_reg.h"
194e5e7a7dSBin Du #include "isp4_interface.h"
202ccf48afSBin Du #include "isp4_video.h"
214e5e7a7dSBin Du 
224e5e7a7dSBin Du /*
234e5e7a7dSBin Du  * One is for none sensor specific response which is not used now.
244e5e7a7dSBin Du  * Another is for sensor specific response
254e5e7a7dSBin Du  */
264e5e7a7dSBin Du #define ISP4SD_MAX_FW_RESP_STREAM_NUM 2
274e5e7a7dSBin Du 
284e5e7a7dSBin Du /* Indicates the ISP status */
294e5e7a7dSBin Du enum isp4sd_status {
304e5e7a7dSBin Du 	ISP4SD_STATUS_PWR_OFF,
314e5e7a7dSBin Du 	ISP4SD_STATUS_PWR_ON,
324e5e7a7dSBin Du 	ISP4SD_STATUS_FW_RUNNING,
334e5e7a7dSBin Du 	ISP4SD_STATUS_MAX
344e5e7a7dSBin Du };
354e5e7a7dSBin Du 
364e5e7a7dSBin Du /* Indicates sensor and output stream status */
374e5e7a7dSBin Du enum isp4sd_start_status {
384e5e7a7dSBin Du 	ISP4SD_START_STATUS_OFF,
394e5e7a7dSBin Du 	ISP4SD_START_STATUS_STARTED,
404e5e7a7dSBin Du 	ISP4SD_START_STATUS_START_FAIL,
414e5e7a7dSBin Du };
424e5e7a7dSBin Du 
434e5e7a7dSBin Du struct isp4sd_img_buf_node {
444e5e7a7dSBin Du 	struct list_head node;
454e5e7a7dSBin Du 	struct isp4if_img_buf_info buf_info;
464e5e7a7dSBin Du };
474e5e7a7dSBin Du 
484e5e7a7dSBin Du /* This is ISP output after processing Bayer raw sensor input */
494e5e7a7dSBin Du struct isp4sd_output_info {
504e5e7a7dSBin Du 	enum isp4sd_start_status start_status;
514e5e7a7dSBin Du 	u32 image_size;
524e5e7a7dSBin Du };
534e5e7a7dSBin Du 
544e5e7a7dSBin Du /*
554e5e7a7dSBin Du  * Struct for sensor info used as ISP input or source.
564e5e7a7dSBin Du  * status: sensor status.
574e5e7a7dSBin Du  * output_info: ISP output after processing the sensor input.
584e5e7a7dSBin Du  * start_stream_cmd_sent: indicates if ISP4FW_CMD_ID_START_STREAM was sent
594e5e7a7dSBin Du  * to firmware.
604e5e7a7dSBin Du  * buf_sent_cnt: number of buffers sent to receive images.
614e5e7a7dSBin Du  */
624e5e7a7dSBin Du struct isp4sd_sensor_info {
634e5e7a7dSBin Du 	struct isp4sd_output_info output_info;
644e5e7a7dSBin Du 	enum isp4sd_start_status status;
654e5e7a7dSBin Du 	bool start_stream_cmd_sent;
664e5e7a7dSBin Du 	u32 buf_sent_cnt;
674e5e7a7dSBin Du };
684e5e7a7dSBin Du 
694e5e7a7dSBin Du /*
704e5e7a7dSBin Du  * The thread is created by the driver to handle firmware responses which will
714e5e7a7dSBin Du  * be waken up when a firmware-to-driver response interrupt occurs.
724e5e7a7dSBin Du  */
734e5e7a7dSBin Du struct isp4sd_thread_handler {
744e5e7a7dSBin Du 	struct task_struct *thread;
754e5e7a7dSBin Du 	wait_queue_head_t waitq;
764e5e7a7dSBin Du 	bool resp_ready;
774e5e7a7dSBin Du };
784e5e7a7dSBin Du 
794e5e7a7dSBin Du struct isp4_subdev_thread_param {
804e5e7a7dSBin Du 	u32 idx;
814e5e7a7dSBin Du 	struct isp4_subdev *isp_subdev;
824e5e7a7dSBin Du };
834e5e7a7dSBin Du 
844e5e7a7dSBin Du struct isp4_subdev {
854e5e7a7dSBin Du 	struct v4l2_subdev sdev;
864e5e7a7dSBin Du 	struct isp4_interface ispif;
872ccf48afSBin Du 	struct isp4vid_dev isp_vdev;
884e5e7a7dSBin Du 
894e5e7a7dSBin Du 	struct media_pad sdev_pad;
904e5e7a7dSBin Du 
914e5e7a7dSBin Du 	enum isp4sd_status isp_status;
924e5e7a7dSBin Du 	/* mutex used to synchronize the operation with firmware */
934e5e7a7dSBin Du 	struct mutex ops_mutex;
944e5e7a7dSBin Du 
954e5e7a7dSBin Du 	struct isp4sd_thread_handler
964e5e7a7dSBin Du 		fw_resp_thread[ISP4SD_MAX_FW_RESP_STREAM_NUM];
974e5e7a7dSBin Du 
984e5e7a7dSBin Du 	u32 host2fw_seq_num;
994e5e7a7dSBin Du 
1004e5e7a7dSBin Du 	struct isp4sd_sensor_info sensor_info;
1014e5e7a7dSBin Du 
1024e5e7a7dSBin Du 	/* gpio descriptor */
1034e5e7a7dSBin Du 	struct gpio_desc *enable_gpio;
1044e5e7a7dSBin Du 	struct device *dev;
1054e5e7a7dSBin Du 	void __iomem *mmio;
1064e5e7a7dSBin Du 	struct isp4_subdev_thread_param
1074e5e7a7dSBin Du 		isp_resp_para[ISP4SD_MAX_FW_RESP_STREAM_NUM];
1084e5e7a7dSBin Du 	int irq[ISP4SD_MAX_FW_RESP_STREAM_NUM];
1094e5e7a7dSBin Du 	bool irq_enabled;
1104e5e7a7dSBin Du 	/* spin lock to access ISP_SYS_INT0_EN exclusively */
1114e5e7a7dSBin Du 	spinlock_t irq_lock;
112*ec4bec22SBin Du #ifdef CONFIG_DEBUG_FS
113*ec4bec22SBin Du 	bool enable_fw_log;
114*ec4bec22SBin Du 	struct dentry *debugfs_dir;
115*ec4bec22SBin Du 	char *fw_log_output;
116*ec4bec22SBin Du #endif
1174e5e7a7dSBin Du };
1184e5e7a7dSBin Du 
1194e5e7a7dSBin Du int isp4sd_init(struct isp4_subdev *isp_subdev, struct v4l2_device *v4l2_dev,
1204e5e7a7dSBin Du 		int irq[ISP4SD_MAX_FW_RESP_STREAM_NUM]);
1214e5e7a7dSBin Du void isp4sd_deinit(struct isp4_subdev *isp_subdev);
1224e5e7a7dSBin Du int isp4sd_ioc_send_img_buf(struct v4l2_subdev *sd,
1234e5e7a7dSBin Du 			    struct isp4if_img_buf_info *buf_info);
1244e5e7a7dSBin Du int isp4sd_pwron_and_init(struct v4l2_subdev *sd);
1254e5e7a7dSBin Du int isp4sd_pwroff_and_deinit(struct v4l2_subdev *sd);
1264e5e7a7dSBin Du 
1274e5e7a7dSBin Du #endif /* _ISP4_SUBDEV_H_ */
128