/* * Copyright (c) 2012-2015, NVIDIA CORPORATION. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef _TEGRA_CAMERA_COMMON_H_ #define _TEGRA_CAMERA_COMMON_H_ #include #include #include /* Buffer for one video frame */ struct tegra_camera_buffer { struct vb2_buffer vb; /* v4l buffer must be first */ struct list_head queue; struct soc_camera_device *icd; int output_channel; /* * Various buffer addresses shadowed so we don't have to recalculate * per frame. These are calculated during videobuf_prepare. */ dma_addr_t buffer_addr; dma_addr_t buffer_addr_u; dma_addr_t buffer_addr_v; dma_addr_t start_addr; dma_addr_t start_addr_u; dma_addr_t start_addr_v; }; static struct tegra_camera_buffer *to_tegra_vb(struct vb2_buffer *vb) { return container_of(vb, struct tegra_camera_buffer, vb); } struct tegra_camera_dev; struct tegra_camera_clk { const char *name; struct clk *clk; u32 freq; int use_devname; }; struct tegra_camera_ops { int (*clks_init)(struct tegra_camera_dev *cam, int port); void (*clks_deinit)(struct tegra_camera_dev *cam); void (*clks_enable)(struct tegra_camera_dev *cam); void (*clks_disable)(struct tegra_camera_dev *cam); void (*capture_clean)(struct tegra_camera_dev *vi2_cam); int (*capture_setup)(struct tegra_camera_dev *vi2_cam, struct tegra_camera_buffer *buf); int (*capture_start)(struct tegra_camera_dev *vi2_cam, struct tegra_camera_buffer *buf); int (*capture_wait)(struct tegra_camera_dev *vi2_cam, struct tegra_camera_buffer *buf); int (*capture_done)(struct tegra_camera_dev *vi2_cam, int port); int (*capture_stop)(struct tegra_camera_dev *vi2_cam, int port); void (*init_syncpts)(struct tegra_camera_dev *vi2_cam); void (*free_syncpts)(struct tegra_camera_dev *vi2_cam); void (*incr_syncpts)(struct tegra_camera_dev *vi2_cam); void (*save_syncpts)(struct tegra_camera_dev *vi2_cam); void (*activate)(struct tegra_camera_dev *vi2_cam); void (*deactivate)(struct tegra_camera_dev *vi2_cam); int (*port_is_valid)(int port); int (*mipi_calibration)(struct tegra_camera_dev *vi2_cam, struct tegra_camera_buffer *buf); }; struct tegra_camera_dev { struct soc_camera_host ici; struct platform_device *ndev; struct nvhost_device_data *ndata; struct regulator *reg; const char *regulator_name; struct tegra_camera_clk *clks; int num_clks; struct tegra_camera_ops *ops; void __iomem *reg_base; struct list_head capture; spinlock_t capture_lock; struct list_head done; spinlock_t done_lock; struct vb2_buffer *active; struct vb2_alloc_ctx *alloc_ctx; enum v4l2_field field; int sequence_a; int sequence_b; struct task_struct *kthread_capture_start; struct task_struct *kthread_capture_done; wait_queue_head_t capture_start_wait; wait_queue_head_t capture_done_wait; /* syncpt ids */ u32 syncpt_id_csi_a; u32 syncpt_id_csi_b; u32 syncpt_id_vip; /* syncpt values */ u32 syncpt_csi_a; u32 syncpt_csi_b; u32 syncpt_vip; /* Debug */ int num_frames; int enable_refcnt; /* Test Pattern Generator mode */ int tpg_mode; int sof[3]; int cal_done[3]; bool csi_bc_busy; }; #define TC_VI_REG_RD(dev, offset) readl(dev->reg_base + offset) #define TC_VI_REG_WT(dev, offset, val) writel(val, dev->reg_base + offset) int vi2_register(struct tegra_camera_dev *cam); int vi_register(struct tegra_camera_dev *cam); #endif