File Index
Files and directories
Sign in
FILE

atomisp_internal.h

File preview with syntax highlighting.

linux-6.19.14/drivers/staging/media/atomisp/pci/atomisp_internal.h C
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 * Support for Medifield PNW Camera Imaging ISP subsystem.
  4 *
  5 * Copyright (c) 2010 Intel Corporation. All Rights Reserved.
  6 *
  7 * Copyright (c) 2010 Silicon Hive www.siliconhive.com.
  8 */
  9#ifndef __ATOMISP_INTERNAL_H__
 10#define __ATOMISP_INTERNAL_H__
 11
 12#include "../../include/linux/atomisp_platform.h"
 13#include <linux/firmware.h>
 14#include <linux/kernel.h>
 15#include <linux/pm_qos.h>
 16#include <linux/idr.h>
 17
 18#include <media/media-device.h>
 19#include <media/v4l2-async.h>
 20#include <media/v4l2-subdev.h>
 21
 22/* ISP2400*/
 23#include "ia_css_types.h"
 24#include "sh_css_legacy.h"
 25
 26#include "atomisp_csi2.h"
 27#include "atomisp_subdev.h"
 28#include "atomisp_compat.h"
 29
 30#include "gp_device.h"
 31#include "irq.h"
 32#include <linux/vmalloc.h>
 33
 34#define V4L2_EVENT_FRAME_END          5
 35
 36#define IS_HWREVISION(isp, rev) \
 37	(((isp)->media_dev.hw_revision & ATOMISP_HW_REVISION_MASK) == \
 38	 ((rev) << ATOMISP_HW_REVISION_SHIFT))
 39
 40#define ATOMISP_PCI_DEVICE_SOC_BYT	0x0f38
 41/* MRFLD with 0x1178: ISP freq can burst to 457MHz */
 42#define ATOMISP_PCI_DEVICE_SOC_MRFLD	0x1178
 43/* MRFLD with 0x1179: max ISP freq limited to 400MHz */
 44#define ATOMISP_PCI_DEVICE_SOC_MRFLD_1179	0x1179
 45/* MRFLD with 0x117a: max ISP freq is 400MHz and max freq at Vmin is 200MHz */
 46#define ATOMISP_PCI_DEVICE_SOC_MRFLD_117A	0x117a
 47#define ATOMISP_PCI_DEVICE_SOC_ANN	0x1478
 48#define ATOMISP_PCI_DEVICE_SOC_CHT	0x22b8
 49
 50#define ATOMISP_PCI_REV_MRFLD_A0_MAX	0
 51#define ATOMISP_PCI_REV_BYT_A0_MAX	4
 52
 53#define ATOM_ISP_STEP_WIDTH	2
 54#define ATOM_ISP_STEP_HEIGHT	2
 55
 56#define ATOM_ISP_MIN_WIDTH	4
 57#define ATOM_ISP_MIN_HEIGHT	4
 58#define ATOM_ISP_MAX_WIDTH	UINT_MAX
 59#define ATOM_ISP_MAX_HEIGHT	UINT_MAX
 60
 61/* sub-QCIF resolution */
 62#define ATOM_RESOLUTION_SUBQCIF_WIDTH	128
 63#define ATOM_RESOLUTION_SUBQCIF_HEIGHT	96
 64
 65#define ATOM_ISP_I2C_BUS_1	4
 66#define ATOM_ISP_I2C_BUS_2	5
 67
 68#define ATOM_ISP_POWER_DOWN	0
 69#define ATOM_ISP_POWER_UP	1
 70
 71#define ATOM_ISP_MAX_INPUTS	3
 72
 73#define ATOMISP_SC_TYPE_SIZE	2
 74
 75#define ATOMISP_ISP_TIMEOUT_DURATION		(2 * HZ)
 76#define ATOMISP_EXT_ISP_TIMEOUT_DURATION        (6 * HZ)
 77#define ATOMISP_WDT_KEEP_CURRENT_DELAY          0
 78#define ATOMISP_ISP_MAX_TIMEOUT_COUNT	2
 79#define ATOMISP_CSS_STOP_TIMEOUT_US	200000
 80
 81#define ATOMISP_CSS_Q_DEPTH	3
 82#define ATOMISP_CSS_EVENTS_MAX  16
 83#define ATOMISP_CONT_RAW_FRAMES 15
 84#define ATOMISP_METADATA_QUEUE_DEPTH_FOR_HAL	8
 85#define ATOMISP_S3A_BUF_QUEUE_DEPTH_FOR_HAL	8
 86
 87/*
 88 * Define how fast CPU should be able to serve ISP interrupts.
 89 * The bigger the value, the higher risk that the ISP is not
 90 * triggered sufficiently fast for it to process image during
 91 * vertical blanking time, increasing risk of dropped frames.
 92 * 1000 us is a reasonable value considering that the processing
 93 * time is typically ~2000 us.
 94 */
 95#define ATOMISP_MAX_ISR_LATENCY	1000
 96
 97/* Add new YUVPP pipe for SOC sensor. */
 98#define ATOMISP_CSS_SUPPORT_YUVPP     1
 99
100#define ATOMISP_CSS_OUTPUT_SECOND_INDEX     1
101#define ATOMISP_CSS_OUTPUT_DEFAULT_INDEX    0
102
103/* ISP2401 */
104#define ATOMISP_ION_DEVICE_FD_OFFSET   16
105#define ATOMISP_ION_SHARED_FD_MASK     (0xFFFF)
106#define ATOMISP_ION_DEVICE_FD_MASK     (~ATOMISP_ION_SHARED_FD_MASK)
107#define ION_FD_UNSET (-1)
108
109#define DIV_NEAREST_STEP(n, d, step) \
110	round_down((2 * (n) + (d) * (step)) / (2 * (d)), (step))
111
112#define SENSOR_ISP_PAD_SINK		0
113#define SENSOR_ISP_PAD_SOURCE		1
114#define SENSOR_ISP_PADS_NUM		2
115
116struct atomisp_input_subdev {
117	enum atomisp_camera_port port;
118	u32 code; /* MEDIA_BUS_FMT_* */
119	bool binning_support;
120	bool crop_support;
121	bool sensor_on;
122	struct v4l2_subdev *sensor;
123	struct v4l2_subdev *sensor_isp;
124	struct v4l2_subdev *csi_port;
125	struct v4l2_subdev *csi_remote_source;
126	/* Sensor rects for sensors which support crop */
127	struct v4l2_rect native_rect;
128	struct v4l2_rect active_rect;
129	/* Sensor state for which == V4L2_SUBDEV_FORMAT_TRY calls */
130	struct v4l2_subdev_state *try_sd_state;
131};
132
133enum atomisp_dfs_mode {
134	ATOMISP_DFS_MODE_AUTO = 0,
135	ATOMISP_DFS_MODE_LOW,
136	ATOMISP_DFS_MODE_MAX,
137};
138
139struct atomisp_regs {
140	/* PCI config space info */
141	u16 pcicmdsts;
142	u32 ispmmadr;
143	u32 msicap;
144	u32 msi_addr;
145	u16 msi_data;
146	u8 intr;
147	u32 interrupt_control;
148	u32 pmcs;
149	u32 cg_dis;
150	u32 i_control;
151
152	/* I-Unit PHY related info */
153	u32 csi_rcomp_config;
154	u32 csi_afe_dly;
155	u32 csi_control;
156
157	/* New for MRFLD */
158	u32 csi_afe_rcomp_config;
159	u32 csi_afe_hs_control;
160	u32 csi_deadline_control;
161	u32 csi_access_viol;
162};
163
164/*
165 * ci device struct
166 */
167struct atomisp_device {
168	struct device *dev;
169	struct v4l2_device v4l2_dev;
170	struct media_device media_dev;
171	struct atomisp_sub_device asd;
172	struct v4l2_async_notifier notifier;
173	void *mmu_l1_base;
174	void __iomem *base;
175	const struct firmware *firmware;
176
177	struct dev_pm_domain pm_domain;
178	struct pm_qos_request pm_qos;
179	s32 max_isr_latency;
180	bool pm_only;
181
182	struct atomisp_mipi_csi2_device csi2_port[ATOMISP_CAMERA_NR_PORTS];
183
184	/* Purpose of mutex is to protect and serialize use of isp data
185	 * structures and css API calls. */
186	struct mutex mutex;
187
188	/*
189	 * Number of lanes used by each sensor per port.
190	 * Note this is indexed by mipi_port_id not atomisp_camera_port.
191	 */
192	int sensor_lanes[N_MIPI_PORT_ID];
193	struct v4l2_subdev *sensor_subdevs[ATOMISP_CAMERA_NR_PORTS];
194	unsigned int input_cnt;
195	struct atomisp_input_subdev inputs[ATOM_ISP_MAX_INPUTS];
196
197	struct atomisp_regs saved_regs;
198	struct atomisp_css_env css_env;
199
200	bool isp_fatal_error;
201	struct work_struct assert_recovery_work;
202
203	spinlock_t lock; /* Protects asd.streaming */
204
205	const struct atomisp_dfs_config *dfs;
206	unsigned int hpll_freq;
207	unsigned int running_freq;
208
209	bool css_initialized;
210};
211
212#define v4l2_dev_to_atomisp_device(dev) \
213	container_of(dev, struct atomisp_device, v4l2_dev)
214
215extern struct device *atomisp_dev;
216
217#endif /* __ATOMISP_INTERNAL_H__ */
~/ Read-only file preview.