Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0f6b1f97 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: camera: isp: Move delta info to sof_info structure"

parents 77338df0 2641051d
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -542,12 +542,13 @@ int vfe_hw_probe(struct platform_device *pdev)
	ISP_DBG("%s: device id = %d\n", __func__, pdev->id);

	vfe_dev->pdev = pdev;
	vfe_dev->dual_vfe_res = &dualvfe;
	vfe_dev->dual_vfe_res->axi_data[vfe_dev->pdev->id] =
	vfe_dev->common_data->dual_vfe_res = &dualvfe;
	vfe_dev->common_data->dual_vfe_res->axi_data[vfe_dev->pdev->id] =
		&vfe_dev->axi_data;
	vfe_dev->dual_vfe_res->stats_data[vfe_dev->pdev->id] =
	vfe_dev->common_data->dual_vfe_res->stats_data[vfe_dev->pdev->id] =
		&vfe_dev->stats_data;
	vfe_dev->dual_vfe_res->vfe_dev[vfe_dev->pdev->id] = vfe_dev;
	vfe_dev->common_data->dual_vfe_res->vfe_dev[vfe_dev->pdev->id] =
		vfe_dev;

	rc = vfe_dev->hw_info->vfe_ops.core_ops.get_platform_data(vfe_dev);
	if (rc < 0) {
+39 −24
Original line number Diff line number Diff line
@@ -67,15 +67,22 @@ struct msm_vfe_stats_stream;

#define VFE_SD_HW_MAX VFE_SD_COMMON

/* This struct is used to save/track SOF info for some INTF.
 * e.g. used in Master-Slave mode */
struct msm_vfe_sof_info {
	uint32_t timestamp_ms;
	uint32_t mono_timestamp_ms;
	uint32_t frame_id;
};

/* Each INTF in Master-Slave mode uses this struct. */
struct msm_vfe_dual_hw_ms_info {
	/* type is Master/Slave */
	enum msm_vfe_dual_hw_ms_type dual_hw_ms_type;
	/* sof_info is resource from common_data. If NULL, then this INTF
	 * sof does not need to be saved */
	struct msm_vfe_sof_info *sof_info;
	/* slave_id is index in common_data sof_info array for slaves */
	uint8_t slave_id;
};

@@ -598,8 +605,7 @@ struct dual_vfe_resource {
	uint32_t wm_reload_mask[MAX_VFE];
};

struct msm_vfe_common_dev_data {
	spinlock_t common_dev_data_lock;
struct master_slave_resource_info {
	enum msm_vfe_dual_hw_type dual_hw_type;
	struct msm_vfe_sof_info master_sof_info;
	uint8_t master_active;
@@ -610,6 +616,12 @@ struct msm_vfe_common_dev_data {
	struct msm_vfe_sof_info slave_sof_info[MS_NUM_SLAVE_MAX];
};

struct msm_vfe_common_dev_data {
	spinlock_t common_dev_data_lock;
	struct dual_vfe_resource *dual_vfe_res;
	struct master_slave_resource_info ms_resource;
};

struct msm_vfe_common_subdev {
	/* parent reference */
	struct vfe_parent_device *parent;
@@ -625,9 +637,13 @@ struct msm_vfe_common_subdev {
};

struct vfe_device {
	/* Driver private data */
	struct platform_device *pdev;
	struct msm_vfe_common_dev_data *common_data;
	struct msm_sd_subdev subdev;
	struct msm_isp_buf_mgr *buf_mgr;

	/* Resource info */
	struct resource *vfe_irq;
	struct resource *vfe_mem;
	struct resource *vfe_vbif_mem;
@@ -635,19 +651,14 @@ struct vfe_device {
	struct resource *vfe_vbif_io;
	void __iomem *vfe_base;
	void __iomem *vfe_vbif_base;

	struct device *iommu_ctx[MAX_IOMMU_CTX];
	/*Add secure context banks*/
	struct device *iommu_secure_ctx[MAX_IOMMU_CTX];

	struct regulator *fs_vfe;
	struct regulator *fs_camss;
	struct regulator *fs_mmagic_camss;
	struct clk **vfe_clk;
	uint32_t num_clk;

	uint32_t bus_perf_client;

	/* Sync variables*/
	struct completion reset_complete;
	struct completion halt_complete;
	struct completion stream_config_complete;
@@ -655,47 +666,51 @@ struct vfe_device {
	struct mutex realtime_mutex;
	struct mutex core_mutex;
	struct mutex buf_mgr_mutex;
	spinlock_t shared_data_lock;
	spinlock_t reg_update_lock;
	spinlock_t tasklet_lock;

	/* Tasklet info */
	atomic_t irq_cnt;
	uint8_t taskletq_idx;
	spinlock_t tasklet_lock;
	spinlock_t shared_data_lock;
	spinlock_t reg_update_lock;
	struct list_head tasklet_q;
	struct tasklet_struct vfe_tasklet;
	struct msm_vfe_tasklet_queue_cmd
		tasklet_queue_cmd[MSM_VFE_TASKLETQ_SIZE];

	uint32_t vfe_hw_version;
	uint32_t dual_vfe_enable;
	/* Data structures */
	struct msm_vfe_hardware_info *hw_info;
	struct msm_vfe_axi_shared_data axi_data;
	struct msm_vfe_stats_shared_data stats_data;
	struct msm_vfe_error_info error_info;
	struct msm_isp_buf_mgr *buf_mgr;
	int dump_reg;
	struct msm_vfe_fetch_engine_info fetch_engine_info;
	enum msm_vfe_hvx_streaming_cmd hvx_cmd;

	/* State variables */
	uint32_t vfe_hw_version;
	int vfe_clk_idx;
	uint32_t vfe_open_cnt;
	uint8_t vt_enable;
	uint8_t ignore_error;
	uint32_t vfe_ub_policy;
	uint8_t reset_pending;
	uint8_t reg_update_requested;
	uint8_t reg_updated;
	uint32_t is_split;
	uint32_t dual_vfe_enable;
	unsigned long page_fault_addr;

	/* Debug variables */
	int dump_reg;
	struct msm_isp_statistics *stats;
	struct msm_vfe_fetch_engine_info fetch_engine_info;
	uint64_t msm_isp_last_overflow_ab;
	uint64_t msm_isp_last_overflow_ib;
	uint64_t msm_isp_vfe_clk_rate;
	struct msm_isp_ub_info *ub_info;
	uint32_t vfe_ub_policy;
	uint32_t isp_sof_debug;
	uint32_t isp_raw0_debug;
	uint32_t isp_raw1_debug;
	uint32_t isp_raw2_debug;
	uint8_t reset_pending;
	enum msm_vfe_hvx_streaming_cmd hvx_cmd;
	uint8_t reg_update_requested;
	uint8_t reg_updated;
	struct dual_vfe_resource *dual_vfe_res;
	uint32_t is_split;
	unsigned long page_fault_addr;
};

struct vfe_parent_device {
+5 −3
Original line number Diff line number Diff line
@@ -280,7 +280,8 @@ static int msm_vfe32_init_hardware(struct vfe_device *vfe_dev)
		pr_err("%s: vfe ioremap failed\n", __func__);
		goto vfe_remap_failed;
	}
	vfe_dev->dual_vfe_res->vfe_base[vfe_dev->pdev->id] = vfe_dev->vfe_base;
	vfe_dev->common_data->dual_vfe_res->vfe_base[vfe_dev->pdev->id] =
		vfe_dev->vfe_base;

	vfe_dev->vfe_vbif_base = ioremap(vfe_dev->vfe_vbif_mem->start,
		resource_size(vfe_dev->vfe_vbif_mem));
@@ -341,7 +342,7 @@ static void msm_vfe32_release_hardware(struct vfe_device *vfe_dev)
		msm_cam_clk_enable(&vfe_dev->pdev->dev,
				msm_vfe32_2_clk_info, vfe_dev->vfe_clk,
				ARRAY_SIZE(msm_vfe32_2_clk_info), 0);
	vfe_dev->dual_vfe_res->vfe_base[vfe_dev->pdev->id] = NULL;
	vfe_dev->common_data->dual_vfe_res->vfe_base[vfe_dev->pdev->id] = NULL;
	iounmap(vfe_dev->vfe_base);
	vfe_dev->vfe_base = NULL;
	kfree(vfe_dev->vfe_clk);
@@ -646,7 +647,8 @@ static void msm_vfe32_reg_update(struct vfe_device *vfe_dev,
{
	if (vfe_dev->is_split && vfe_dev->pdev->id == ISP_VFE1) {
		msm_camera_io_w_mb(0xF,
			vfe_dev->dual_vfe_res->vfe_base[ISP_VFE0] + 0x260);
			vfe_dev->common_data->dual_vfe_res->vfe_base[ISP_VFE0]
			+ 0x260);
		msm_camera_io_w_mb(0xF, vfe_dev->vfe_base + 0x260);
	} else if (!vfe_dev->is_split) {
		msm_camera_io_w_mb(0xF, vfe_dev->vfe_base + 0x260);
+6 −4
Original line number Diff line number Diff line
@@ -306,7 +306,8 @@ static int msm_vfe40_init_hardware(struct vfe_device *vfe_dev)
		pr_err("%s: vfe ioremap failed\n", __func__);
		goto vfe_remap_failed;
	}
	vfe_dev->dual_vfe_res->vfe_base[vfe_dev->pdev->id] = vfe_dev->vfe_base;
	vfe_dev->common_data->dual_vfe_res->vfe_base[vfe_dev->pdev->id] =
		vfe_dev->vfe_base;

	vfe_dev->vfe_vbif_base = ioremap(vfe_dev->vfe_vbif_mem->start,
		resource_size(vfe_dev->vfe_vbif_mem));
@@ -356,7 +357,7 @@ static void msm_vfe40_release_hardware(struct vfe_device *vfe_dev)
	vfe_dev->vfe_vbif_base = NULL;
	msm_cam_clk_enable(&vfe_dev->pdev->dev, msm_vfe40_clk_info,
		vfe_dev->vfe_clk, vfe_dev->num_clk, 0);
	vfe_dev->dual_vfe_res->vfe_base[vfe_dev->pdev->id] = NULL;
	vfe_dev->common_data->dual_vfe_res->vfe_base[vfe_dev->pdev->id] = NULL;
	iounmap(vfe_dev->vfe_base);
	vfe_dev->vfe_base = NULL;
	kfree(vfe_dev->vfe_clk);
@@ -746,12 +747,13 @@ static void msm_vfe40_reg_update(struct vfe_device *vfe_dev,
	vfe_dev->axi_data.src_info[VFE_PIX_0].reg_update_frame_id =
		vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id;
	vfe_dev->reg_update_requested |= update_mask;
	vfe_dev->dual_vfe_res->reg_update_mask[vfe_dev->pdev->id] =
	vfe_dev->common_data->dual_vfe_res->reg_update_mask[vfe_dev->pdev->id] =
		vfe_dev->reg_update_requested;
	if ((vfe_dev->is_split && vfe_dev->pdev->id == ISP_VFE1) &&
		((frame_src == VFE_PIX_0) || (frame_src == VFE_SRC_MAX))) {
		msm_camera_io_w_mb(update_mask,
			vfe_dev->dual_vfe_res->vfe_base[ISP_VFE0] + 0x378);
			vfe_dev->common_data->dual_vfe_res->vfe_base[ISP_VFE0]
			+ 0x378);
		msm_camera_io_w_mb(update_mask,
			vfe_dev->vfe_base + 0x378);
	} else if (!vfe_dev->is_split ||
+6 −4
Original line number Diff line number Diff line
@@ -174,7 +174,8 @@ static int msm_vfe44_init_hardware(struct vfe_device *vfe_dev)
		pr_err("%s: vfe ioremap failed\n", __func__);
		goto vfe_remap_failed;
	}
	vfe_dev->dual_vfe_res->vfe_base[vfe_dev->pdev->id] = vfe_dev->vfe_base;
	vfe_dev->common_data->dual_vfe_res->vfe_base[vfe_dev->pdev->id] =
		vfe_dev->vfe_base;

	vfe_dev->vfe_vbif_base = ioremap(vfe_dev->vfe_vbif_mem->start,
		resource_size(vfe_dev->vfe_vbif_mem));
@@ -222,7 +223,7 @@ static void msm_vfe44_release_hardware(struct vfe_device *vfe_dev)
	vfe_dev->vfe_vbif_base = NULL;
	msm_cam_clk_enable(&vfe_dev->pdev->dev, msm_vfe44_clk_info,
		vfe_dev->vfe_clk, vfe_dev->num_clk, 0);
	vfe_dev->dual_vfe_res->vfe_base[vfe_dev->pdev->id] = NULL;
	vfe_dev->common_data->dual_vfe_res->vfe_base[vfe_dev->pdev->id] = NULL;
	iounmap(vfe_dev->vfe_base);
	vfe_dev->vfe_base = NULL;
	kfree(vfe_dev->vfe_clk);
@@ -615,12 +616,13 @@ static void msm_vfe44_reg_update(struct vfe_device *vfe_dev,
	vfe_dev->axi_data.src_info[VFE_PIX_0].reg_update_frame_id =
		vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id;
	vfe_dev->reg_update_requested |= update_mask;
	vfe_dev->dual_vfe_res->reg_update_mask[vfe_dev->pdev->id] =
	vfe_dev->common_data->dual_vfe_res->reg_update_mask[vfe_dev->pdev->id] =
		vfe_dev->reg_update_requested;
	if ((vfe_dev->is_split && vfe_dev->pdev->id == ISP_VFE1) &&
		((frame_src == VFE_PIX_0) || (frame_src == VFE_SRC_MAX))) {
		msm_camera_io_w_mb(update_mask,
			vfe_dev->dual_vfe_res->vfe_base[ISP_VFE0] + 0x378);
			vfe_dev->common_data->dual_vfe_res->vfe_base[ISP_VFE0]
			+ 0x378);
		msm_camera_io_w_mb(update_mask,
			vfe_dev->vfe_base + 0x378);
	} else if (!vfe_dev->is_split ||
Loading