2 * NVIDIA Tegra CSI Device Header
4 * Copyright (c) 2015-2017, NVIDIA CORPORATION. All rights reserved.
6 * Author: Bryan Wu <pengw@nvidia.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
16 #include <media/media-entity.h>
17 #include <media/v4l2-async.h>
18 #include <media/v4l2-ctrls.h>
19 #include <media/v4l2-subdev.h>
20 #include <linux/platform_device.h>
22 #include <media/camera_common.h>
23 #include <linux/platform_device.h>
25 #include "camera/vi/registers.h"
26 #include "camera/csi/csi4_registers.h"
28 #define MAX_CSI_BLOCK_LANES 4
30 enum tegra_csi_port_num {
39 #define csi_port_is_valid(port) (port > PORT_F ? 0 : 1)
41 enum camera_gang_mode {
42 CAMERA_NO_GANG_MODE = 0,
52 struct v4l2_frmsize_discrete frmsize;
59 struct tegra_csi_port {
60 void __iomem *pixel_parser;
64 /* One pair of sink/source pad has one format */
65 struct v4l2_mbus_framefmt format;
66 const struct tegra_video_format *core_format;
68 unsigned int framerate;
72 enum tegra_csi_port_num num;
75 struct tegra_csi_device {
77 struct platform_device *pdev;
79 void __iomem *iomem_base;
80 void __iomem *iomem[3];
84 struct camera_common_data s_data[6];
85 struct tegra_csi_port *ports;
86 struct media_pad *pads;
88 unsigned int clk_freq;
91 struct list_head csi_chans;
92 struct tegra_csi_channel *tpg_start;
93 const struct tegra_csi_fops *fops;
94 const struct tpg_frmfmt *tpg_frmfmt_table;
95 unsigned int tpg_frmfmt_table_size;
98 struct dentry *debugdir;
99 struct mutex source_update;
105 * subdev: channel subdev
106 * numports: Number of CSI ports in use for this channel
107 * numlanes: Number of CIL lanes in use
109 struct tegra_csi_channel {
110 struct list_head list;
111 struct v4l2_subdev subdev;
112 struct media_pad *pads;
113 struct media_pipeline pipe;
115 struct tegra_csi_device *csi;
116 struct tegra_csi_port *ports;
117 unsigned char port[TEGRA_CSI_BLOCKS];
118 struct mutex format_lock;
119 unsigned int numports;
120 unsigned int numlanes;
121 unsigned int pg_mode;
122 struct camera_common_data *s_data;
124 atomic_t is_streaming;
126 struct device_node *of_node;
129 static inline struct tegra_csi_channel *to_csi_chan(struct v4l2_subdev *subdev)
131 return container_of(subdev, struct tegra_csi_channel, subdev);
134 static inline struct tegra_csi_device *to_csi(struct v4l2_subdev *subdev)
136 struct tegra_csi_channel *chan = to_csi_chan(subdev);
141 struct tegra_csi_device *tegra_get_mc_csi(void);
142 void set_csi_portinfo(struct tegra_csi_device *csi,
143 unsigned int port, unsigned int numlanes);
144 void tegra_csi_status(struct tegra_csi_channel *chan,
145 enum tegra_csi_port_num port_num);
146 int tegra_csi_error(struct tegra_csi_channel *chan,
147 enum tegra_csi_port_num port_num);
148 int tegra_csi_start_streaming(struct tegra_csi_channel *chan,
149 enum tegra_csi_port_num port_num);
150 void tegra_csi_stop_streaming(struct tegra_csi_channel *chan,
151 enum tegra_csi_port_num port_num);
152 void tegra_csi_error_recover(struct tegra_csi_channel *chan,
153 enum tegra_csi_port_num port_num);
154 int tegra_csi_mipi_calibrate(struct tegra_csi_device *csi,
156 int tegra_csi_init(struct tegra_csi_device *csi,
157 struct platform_device *pdev);
158 int tegra_csi_media_controller_init(struct tegra_csi_device *csi,
159 struct platform_device *pdev);
160 int tegra_csi_media_controller_remove(struct tegra_csi_device *csi);
161 int tpg_csi_media_controller_init(struct tegra_csi_device *csi, int pg_mode);
162 void tpg_csi_media_controller_cleanup(struct tegra_csi_device *csi);
164 /* helper functions to calculate clock setting times */
165 unsigned int tegra_csi_clk_settling_time(
166 struct tegra_csi_device *csi,
167 const unsigned int csicil_clk_mhz);
168 unsigned int tegra_csi_ths_settling_time(
169 struct tegra_csi_device *csi,
170 const unsigned int csicil_clk_mhz,
171 const unsigned int mipi_clk_mhz);