android13/kernel-5.10/drivers/media/platform/rockchip/cif/hw.h

162 lines
3.7 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Rockchip CIF Driver
*
* Copyright (C) 2020 Rockchip Electronics Co., Ltd.
*/
#ifndef _RKCIF_HW_H
#define _RKCIF_HW_H
#include <linux/mutex.h>
#include <media/media-device.h>
#include <media/media-entity.h>
#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>
#include <media/videobuf2-v4l2.h>
#include <media/v4l2-mc.h>
#include <linux/rk-camera-module.h>
#include "regs.h"
#include "version.h"
#include "dev.h"
#define RKCIF_DEV_MAX 7
#define RKCIF_HW_DRIVER_NAME "rkcifhw"
#define RKCIF_MAX_BUS_CLK 15
#define RKCIF_MAX_RESET 15
#define RKCIF_MAX_GROUP 4
#define write_cif_reg(base, addr, val) \
writel(val, (addr) + (base))
#define read_cif_reg(base, addr) \
readl((addr) + (base))
#define write_cif_reg_or(base, addr, val) \
writel(readl((addr) + (base)) | (val), (addr) + (base))
#define write_cif_reg_and(base, addr, val) \
writel(readl((addr) + (base)) & (val), (addr) + (base))
/*
* multi sensor sync mode
* RKCIF_NOSYNC_MODE: not used sync mode
* RKCIF_MASTER_MASTER: internal master->external master
* RKCIF_MASTER_SLAVE: internal master->slave
* RKCIF_MASTER_MASTER: pwm/gpio->external master
* RKCIF_MASTER_MASTER: pwm/gpio->slave
*/
enum rkcif_sync_mode {
RKCIF_NOSYNC_MODE,
RKCIF_MASTER_MASTER,
RKCIF_MASTER_SLAVE,
RKCIF_EXT_MASTER,
RKCIF_EXT_SLAVE,
};
struct rkcif_sync_dev {
struct rkcif_device *cif_dev[RKCIF_DEV_MAX];
int count;
bool is_streaming[RKCIF_DEV_MAX];
};
struct rkcif_multi_sync_config {
struct rkcif_sync_dev int_master;
struct rkcif_sync_dev ext_master;
struct rkcif_sync_dev slave;
enum rkcif_sync_mode mode;
int dev_cnt;
int streaming_cnt;
u32 sync_code;
u32 sync_mask;
u32 update_code;
u32 update_cache;
u32 frame_idx;
bool is_attach;
};
struct rkcif_dummy_buffer {
struct list_head list;
struct dma_buf *dbuf;
dma_addr_t dma_addr;
struct page **pages;
void *mem_priv;
void *vaddr;
u32 size;
int dma_fd;
bool is_need_vaddr;
bool is_need_dbuf;
bool is_need_dmafd;
bool is_free;
};
/*
* add new chip id in tail in time order
* by increasing to distinguish cif version
*/
enum rkcif_chip_id {
CHIP_PX30_CIF,
CHIP_RK3128_CIF,
CHIP_RK3288_CIF,
CHIP_RK3328_CIF,
CHIP_RK3368_CIF,
CHIP_RK1808_CIF,
CHIP_RV1126_CIF,
CHIP_RV1126_CIF_LITE,
CHIP_RK3568_CIF,
CHIP_RK3588_CIF,
CHIP_RV1106_CIF,
CHIP_RK3562_CIF,
};
struct rkcif_hw_match_data {
int chip_id;
const char * const *clks;
const char * const *rsts;
int clks_num;
int rsts_num;
const struct cif_reg *cif_regs;
};
/*
* struct rkcif_device - ISP platform device
* @base_addr: base register address
* @active_sensor: sensor in-use, set when streaming on
* @stream: capture video device
*/
struct rkcif_hw {
struct device *dev;
int irq;
void __iomem *base_addr;
void __iomem *csi_base;
struct regmap *grf;
struct clk *clks[RKCIF_MAX_BUS_CLK];
int clk_size;
struct iommu_domain *domain;
struct reset_control *cif_rst[RKCIF_MAX_RESET];
int chip_id;
const struct cif_reg *cif_regs;
const struct vb2_mem_ops *mem_ops;
struct rkcif_device *cif_dev[RKCIF_DEV_MAX];
int dev_num;
atomic_t power_cnt;
const struct rkcif_hw_match_data *match_data;
struct mutex dev_lock;
struct rkcif_multi_sync_config sync_config[RKCIF_MAX_GROUP];
spinlock_t group_lock;
struct notifier_block reset_notifier; /* reset for mipi csi crc err */
struct rkcif_dummy_buffer dummy_buf;
bool iommu_en;
bool can_be_reset;
bool is_dma_sg_ops;
bool is_dma_contig;
bool adapt_to_usbcamerahal;
u64 irq_time;
bool is_rk3588s2;
};
void rkcif_hw_soft_reset(struct rkcif_hw *cif_hw, bool is_rst_iommu);
void rkcif_disable_sys_clk(struct rkcif_hw *cif_hw);
int rkcif_enable_sys_clk(struct rkcif_hw *cif_hw);
int rk_cif_plat_drv_init(void);
#endif