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