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