Loading drivers/media/platform/msm/camera_v2/isp/Makefile +1 −1 Original line number Diff line number Diff line Loading @@ -2,4 +2,4 @@ ccflags-y += -Idrivers/media/platform/msm/camera_v2 ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/io ccflags-y += -Idrivers/media/platform/msm/camera_v2/common/ obj-$(CONFIG_MSMB_CAMERA) += msm_buf_mgr.o msm_isp_util.o msm_isp_axi_util.o msm_isp_stats_util.o obj-$(CONFIG_MSMB_CAMERA) += msm_isp47.o msm_isp46.o msm_isp44.o msm_isp40.o msm_isp.o obj-$(CONFIG_MSMB_CAMERA) += msm_isp48.o msm_isp47.o msm_isp46.o msm_isp44.o msm_isp40.o msm_isp.o drivers/media/platform/msm/camera_v2/isp/msm_isp.c +14 −3 Original line number Diff line number Diff line /* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -29,6 +29,7 @@ #include "msm_isp_axi_util.h" #include "msm_isp_stats_util.h" #include "msm_sd.h" #include "msm_isp48.h" #include "msm_isp47.h" #include "msm_isp46.h" #include "msm_isp44.h" Loading Loading @@ -330,6 +331,17 @@ void msm_isp_update_req_history(uint32_t client, uint64_t ab, spin_unlock(&req_history_lock); } void msm_isp_update_last_overflow_ab_ib(struct vfe_device *vfe_dev) { spin_lock(&req_history_lock); vfe_dev->msm_isp_last_overflow_ab = msm_isp_bw_request_history[msm_isp_bw_request_history_idx].total_ab; vfe_dev->msm_isp_last_overflow_ib = msm_isp_bw_request_history[msm_isp_bw_request_history_idx].total_ib; spin_unlock(&req_history_lock); } #ifdef CONFIG_COMPAT static long msm_isp_dqevent(struct file *file, struct v4l2_fh *vfh, void *arg) { Loading Loading @@ -581,8 +593,7 @@ int vfe_hw_probe(struct platform_device *pdev) vfe_dev->pdev = pdev; rc = vfe_dev->hw_info->vfe_ops.core_ops.get_platform_data(vfe_dev); rc = vfe_dev->hw_info->vfe_ops.platform_ops.get_platform_data(vfe_dev); if (rc < 0) { pr_err("%s: failed to get platform resources\n", __func__); rc = -ENOMEM; Loading drivers/media/platform/msm/camera_v2/isp/msm_isp.h +54 −22 Original line number Diff line number Diff line Loading @@ -154,6 +154,9 @@ struct msm_vfe_irq_ops { uint32_t irq_status0, uint32_t irq_status1, uint32_t pingpong_status, struct msm_isp_timestamp *ts); void (*config_irq)(struct vfe_device *vfe_dev, uint32_t irq_status0, uint32_t irq_status1, enum msm_isp_irq_operation); }; struct msm_vfe_axi_ops { Loading Loading @@ -226,7 +229,6 @@ struct msm_vfe_core_ops { void (*cfg_rdi_reg)(struct vfe_device *vfe_dev, struct msm_vfe_rdi_cfg *rdi_cfg, enum msm_vfe_input_src input_src); int (*get_platform_data)(struct vfe_device *vfe_dev); void (*get_error_mask)(uint32_t *error_mask0, uint32_t *error_mask1); void (*process_error_status)(struct vfe_device *vfe_dev); void (*get_overflow_mask)(uint32_t *overflow_mask); Loading Loading @@ -277,11 +279,52 @@ struct msm_vfe_stats_ops { uint32_t stats_mask, uint8_t enable); }; enum msm_isp_hw_client { ISP_VFE0, ISP_VFE1, ISP_CPP, MAX_ISP_CLIENT, }; struct msm_isp_bandwidth_info { uint32_t active; uint64_t ab; uint64_t ib; }; struct msm_isp_bandwidth_mgr { uint32_t bus_client; uint32_t bus_vector_active_idx; uint32_t use_count; struct msm_isp_bandwidth_info client_info[MAX_ISP_CLIENT]; int (*update_bw)(struct msm_isp_bandwidth_mgr *isp_bandwidth_mgr); void (*deinit_bw_mgr)(struct msm_isp_bandwidth_mgr *isp_bandwidth_mgr); }; struct msm_vfe_platform_ops { int (*get_platform_data)(struct vfe_device *vfe_dev); int (*enable_clks)(struct vfe_device *vfe_dev, int enable); int (*get_clks)(struct vfe_device *vfe_dev); void (*put_clks)(struct vfe_device *vfe_dev); int (*get_clk_rates)(struct vfe_device *vfe_dev, struct msm_isp_clk_rates *rates); int (*get_max_clk_rate)(struct vfe_device *vfe_dev, long *rate); int (*set_clk_rate)(struct vfe_device *vfe_dev, long *rate); int (*enable_regulators)(struct vfe_device *vfe_dev, int enable); int (*get_regulators)(struct vfe_device *vfe_dev); void (*put_regulators)(struct vfe_device *vfe_dev); int (*init_bw_mgr)(struct vfe_device *vfe_dev, struct msm_isp_bandwidth_mgr *isp_bandwidth_mgr); int (*update_bw)(struct msm_isp_bandwidth_mgr *isp_bandwidth_mgr); void (*deinit_bw_mgr)(struct msm_isp_bandwidth_mgr *isp_bandwidth_mgr); }; struct msm_vfe_ops { struct msm_vfe_irq_ops irq_ops; struct msm_vfe_axi_ops axi_ops; struct msm_vfe_core_ops core_ops; struct msm_vfe_stats_ops stats_ops; struct msm_vfe_platform_ops platform_ops; }; struct msm_vfe_hardware_info { Loading @@ -296,6 +339,7 @@ struct msm_vfe_hardware_info { uint32_t dmi_reg_offset; uint32_t min_ab; uint32_t min_ib; const char *regulator_names[]; }; struct msm_vfe_axi_hardware_info { Loading Loading @@ -573,19 +617,6 @@ struct msm_isp_statistics { int64_t cpp_clk_rate; }; enum msm_isp_hw_client { ISP_VFE0, ISP_VFE1, ISP_CPP, MAX_ISP_CLIENT, }; struct msm_isp_bandwidth_info { uint32_t active; uint64_t ab; uint64_t ib; }; struct msm_isp_bw_req_info { uint32_t client; unsigned long long timestamp; Loading Loading @@ -659,18 +690,18 @@ struct vfe_device { /* Resource info */ struct resource *vfe_irq; struct resource *vfe_mem; struct resource *vfe_vbif_mem; struct resource *vfe_io; struct resource *vfe_vbif_io; void __iomem *vfe_base; uint32_t vfe_base_size; void __iomem *vfe_vbif_base; uint32_t vfe_vbif_base_size; struct device *iommu_ctx[MAX_IOMMU_CTX]; struct regulator *fs_vfe; struct regulator *fs_camss; struct regulator *fs_mmagic_camss; struct msm_cam_regulator *regulator_info; uint32_t vfe_num_regulators; struct clk **vfe_clk; uint32_t num_clk; struct msm_cam_clk_info *vfe_clk_info; uint32_t **vfe_clk_rates; size_t num_clk; size_t num_rates; /* Sync variables*/ struct completion reset_complete; Loading Loading @@ -738,5 +769,6 @@ struct vfe_parent_device { }; int vfe_hw_probe(struct platform_device *pdev); void msm_isp_update_last_overflow_ab_ib(struct vfe_device *vfe_dev); #endif drivers/media/platform/msm/camera_v2/isp/msm_isp40.c +21 −154 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include "msm_isp.h" #include "msm.h" #include "msm_camera_io_util.h" #include "msm_isp47.h" #undef CDBG #define CDBG(fmt, args...) pr_debug(fmt, ##args) Loading Loading @@ -94,7 +95,6 @@ static uint8_t stats_pingpong_offset_map[] = { #define VFE40_BUS_BDG_QOS_CFG_7 0x000002E0 #define VFE40_CLK_IDX 2 static struct msm_cam_clk_info msm_vfe40_clk_info[VFE_CLK_INFO_MAX]; static void msm_vfe40_config_irq(struct vfe_device *vfe_dev, uint32_t irq0_mask, uint32_t irq1_mask, Loading Loading @@ -288,114 +288,6 @@ static int32_t msm_vfe40_init_vbif_parms(struct vfe_device *vfe_dev, return 0; } static int msm_vfe40_init_hardware(struct vfe_device *vfe_dev) { int rc = -1; rc = msm_isp_init_bandwidth_mgr(ISP_VFE0 + vfe_dev->pdev->id); if (rc < 0) { pr_err("%s: Bandwidth registration Failed!\n", __func__); goto bus_scale_register_failed; } if (vfe_dev->fs_vfe) { rc = regulator_enable(vfe_dev->fs_vfe); if (rc) { pr_err("%s: Regulator enable failed\n", __func__); goto fs_failed; } } rc = msm_isp_get_clk_info(vfe_dev, vfe_dev->pdev, &msm_vfe40_clk_info[0]); if (rc < 0) { pr_err("msm_isp_get_clk_info() failed\n"); goto fs_failed; } if (vfe_dev->num_clk <= 0) { pr_err("%s: Invalid num of clock\n", __func__); goto fs_failed; } else { vfe_dev->vfe_clk = kzalloc(sizeof(struct clk *) * vfe_dev->num_clk, GFP_KERNEL); if (!vfe_dev->vfe_clk) { pr_err("%s:%d No memory\n", __func__, __LINE__); return -ENOMEM; } } rc = msm_cam_clk_enable(&vfe_dev->pdev->dev, msm_vfe40_clk_info, vfe_dev->vfe_clk, vfe_dev->num_clk, 1); if (rc < 0) goto clk_enable_failed; vfe_dev->vfe_base = ioremap(vfe_dev->vfe_mem->start, resource_size(vfe_dev->vfe_mem)); if (!vfe_dev->vfe_base) { rc = -ENOMEM; pr_err("%s: vfe ioremap failed\n", __func__); goto vfe_remap_failed; } 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)); if (!vfe_dev->vfe_vbif_base) { rc = -ENOMEM; pr_err("%s: vfe ioremap failed\n", __func__); goto vbif_remap_failed; } rc = request_irq(vfe_dev->vfe_irq->start, msm_isp_process_irq, IRQF_TRIGGER_RISING, "vfe", vfe_dev); if (rc < 0) { pr_err("%s: irq request failed\n", __func__); goto irq_req_failed; } return rc; irq_req_failed: iounmap(vfe_dev->vfe_vbif_base); vfe_dev->vfe_vbif_base = NULL; vbif_remap_failed: iounmap(vfe_dev->vfe_base); vfe_dev->vfe_base = NULL; vfe_remap_failed: msm_cam_clk_enable(&vfe_dev->pdev->dev, msm_vfe40_clk_info, vfe_dev->vfe_clk, vfe_dev->num_clk, 0); clk_enable_failed: if (vfe_dev->fs_vfe) regulator_disable(vfe_dev->fs_vfe); kfree(vfe_dev->vfe_clk); fs_failed: msm_isp_deinit_bandwidth_mgr(ISP_VFE0 + vfe_dev->pdev->id); bus_scale_register_failed: return rc; } static void msm_vfe40_release_hardware(struct vfe_device *vfe_dev) { /* disable all mask before tasklet kill */ vfe_dev->irq0_mask = 0; vfe_dev->irq1_mask = 0; msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask, MSM_ISP_IRQ_SET); disable_irq(vfe_dev->vfe_irq->start); free_irq(vfe_dev->vfe_irq->start, vfe_dev); tasklet_kill(&vfe_dev->vfe_tasklet); msm_isp_flush_tasklet(vfe_dev); iounmap(vfe_dev->vfe_vbif_base); 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->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); regulator_disable(vfe_dev->fs_vfe); msm_isp_deinit_bandwidth_mgr(ISP_VFE0 + vfe_dev->pdev->id); } static void msm_vfe40_init_hardware_reg(struct vfe_device *vfe_dev) { struct msm_vfe_hw_init_parms qos_parms; Loading Loading @@ -668,7 +560,7 @@ static void msm_vfe40_process_error_status(struct vfe_device *vfe_dev) /* Update ab/ib values for any overflow that may have occured*/ if ((error_status1 >> 9) & 0x7FFF) msm_isp_util_update_last_overflow_ab_ib(vfe_dev); msm_isp_update_last_overflow_ab_ib(vfe_dev); } static void msm_vfe40_read_irq_status(struct vfe_device *vfe_dev, Loading Loading @@ -2236,47 +2128,6 @@ static uint32_t msm_vfe40_stats_get_frame_id( return vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id; } static int msm_vfe40_get_platform_data(struct vfe_device *vfe_dev) { int rc = 0; vfe_dev->vfe_mem = platform_get_resource_byname(vfe_dev->pdev, IORESOURCE_MEM, "vfe"); if (!vfe_dev->vfe_mem) { pr_err("%s: no mem resource?\n", __func__); rc = -ENODEV; goto vfe_no_resource; } vfe_dev->vfe_vbif_mem = platform_get_resource_byname( vfe_dev->pdev, IORESOURCE_MEM, "vfe_vbif"); if (!vfe_dev->vfe_vbif_mem) { pr_err("%s: no mem resource?\n", __func__); rc = -ENODEV; goto vfe_no_resource; } vfe_dev->vfe_irq = platform_get_resource_byname(vfe_dev->pdev, IORESOURCE_IRQ, "vfe"); if (!vfe_dev->vfe_irq) { pr_err("%s: no irq resource?\n", __func__); rc = -ENODEV; goto vfe_no_resource; } vfe_dev->fs_vfe = regulator_get(&vfe_dev->pdev->dev, "vdd"); if (IS_ERR(vfe_dev->fs_vfe)) { pr_err("%s: Regulator get failed %ld\n", __func__, PTR_ERR(vfe_dev->fs_vfe)); vfe_dev->fs_vfe = NULL; rc = -ENODEV; goto vfe_no_resource; } vfe_no_resource: return rc; } static void msm_vfe40_get_error_mask( uint32_t *error_mask0, uint32_t *error_mask1) { Loading Loading @@ -2347,6 +2198,7 @@ struct msm_vfe_hardware_info vfe40_hw_info = { .process_axi_irq = msm_isp_process_axi_irq, .process_stats_irq = msm_isp_process_stats_irq, .process_epoch_irq = msm_vfe40_process_epoch_irq, .config_irq = msm_vfe40_config_irq, }, .axi_ops = { .reload_wm = msm_vfe40_axi_reload_wm, Loading Loading @@ -2382,11 +2234,10 @@ struct msm_vfe_hardware_info vfe40_hw_info = { .start_fetch_eng = msm_vfe40_start_fetch_engine, .cfg_rdi_reg = msm_vfe40_cfg_rdi_reg, .reset_hw = msm_vfe40_reset_hardware, .init_hw = msm_vfe40_init_hardware, .init_hw = msm_vfe47_init_hardware, .init_hw_reg = msm_vfe40_init_hardware_reg, .clear_status_reg = msm_vfe40_clear_status_reg, .release_hw = msm_vfe40_release_hardware, .get_platform_data = msm_vfe40_get_platform_data, .release_hw = msm_vfe47_release_hardware, .get_error_mask = msm_vfe40_get_error_mask, .get_overflow_mask = msm_vfe40_get_overflow_mask, .get_rdi_wm_mask = msm_vfe40_get_rdi_wm_mask, Loading Loading @@ -2416,10 +2267,26 @@ struct msm_vfe_hardware_info vfe40_hw_info = { .update_cgc_override = msm_vfe40_stats_update_cgc_override, }, .platform_ops = { .get_platform_data = msm_vfe47_get_platform_data, .enable_regulators = msm_vfe47_enable_regulators, .get_regulators = msm_vfe47_get_regulators, .put_regulators = msm_vfe47_put_regulators, .enable_clks = msm_vfe47_enable_clks, .get_clks = msm_vfe47_get_clks, .put_clks = msm_vfe47_put_clks, .get_clk_rates = msm_vfe47_get_clk_rates, .get_max_clk_rate = msm_vfe47_get_max_clk_rate, .set_clk_rate = msm_vfe47_set_clk_rate, .init_bw_mgr = msm_vfe47_init_bandwidth_mgr, .deinit_bw_mgr = msm_vfe47_deinit_bandwidth_mgr, .update_bw = msm_vfe47_update_bandwidth, } }, .dmi_reg_offset = 0x918, .axi_hw_info = &msm_vfe40_axi_hw_info, .stats_hw_info = &msm_vfe40_stats_hw_info, .regulator_names = {"vdd"}, }; EXPORT_SYMBOL(vfe40_hw_info); Loading drivers/media/platform/msm/camera_v2/isp/msm_isp44.c +20 −150 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include "msm_isp.h" #include "msm.h" #include "msm_camera_io_util.h" #include "msm_isp47.h" #undef CDBG #define CDBG(fmt, args...) pr_debug(fmt, ##args) Loading Loading @@ -63,7 +64,6 @@ static uint8_t stats_pingpong_offset_map[] = { (~(ping_pong >> (stats_pingpong_offset_map[idx])) & 0x1)) #define VFE44_CLK_IDX 2 static struct msm_cam_clk_info msm_vfe44_clk_info[VFE_CLK_INFO_MAX]; static void msm_vfe44_config_irq(struct vfe_device *vfe_dev, uint32_t irq0_mask, uint32_t irq1_mask, Loading Loading @@ -158,111 +158,6 @@ static int32_t msm_vfe44_init_dt_parms(struct vfe_device *vfe_dev, return 0; } static int msm_vfe44_init_hardware(struct vfe_device *vfe_dev) { int rc = -1; rc = msm_isp_init_bandwidth_mgr(ISP_VFE0 + vfe_dev->pdev->id); if (rc < 0) { pr_err("%s: Bandwidth registration Failed!\n", __func__); goto bus_scale_register_failed; } if (vfe_dev->fs_vfe) { rc = regulator_enable(vfe_dev->fs_vfe); if (rc) { pr_err("%s: Regulator enable failed\n", __func__); goto fs_failed; } } rc = msm_isp_get_clk_info(vfe_dev, vfe_dev->pdev, msm_vfe44_clk_info); if (rc < 0) { pr_err("msm_isp_get_clk_info() failed\n"); goto fs_failed; } if (vfe_dev->num_clk <= 0) { pr_err("%s: Invalid num of clock\n", __func__); goto fs_failed; } else { vfe_dev->vfe_clk = kzalloc(sizeof(struct clk *) * vfe_dev->num_clk, GFP_KERNEL); if (!vfe_dev->vfe_clk) { pr_err("%s:%d No memory\n", __func__, __LINE__); return -ENOMEM; } } rc = msm_cam_clk_enable(&vfe_dev->pdev->dev, msm_vfe44_clk_info, vfe_dev->vfe_clk, vfe_dev->num_clk, 1); if (rc < 0) goto clk_enable_failed; vfe_dev->vfe_base = ioremap(vfe_dev->vfe_mem->start, resource_size(vfe_dev->vfe_mem)); if (!vfe_dev->vfe_base) { rc = -ENOMEM; pr_err("%s: vfe ioremap failed\n", __func__); goto vfe_remap_failed; } 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)); if (!vfe_dev->vfe_vbif_base) { rc = -ENOMEM; pr_err("%s: vfe ioremap failed\n", __func__); goto vbif_remap_failed; } rc = request_irq(vfe_dev->vfe_irq->start, msm_isp_process_irq, IRQF_TRIGGER_RISING, "vfe", vfe_dev); if (rc < 0) { pr_err("%s: irq request failed\n", __func__); goto irq_req_failed; } return rc; irq_req_failed: iounmap(vfe_dev->vfe_vbif_base); vfe_dev->vfe_vbif_base = NULL; vbif_remap_failed: iounmap(vfe_dev->vfe_base); vfe_dev->vfe_base = NULL; vfe_remap_failed: msm_cam_clk_enable(&vfe_dev->pdev->dev, msm_vfe44_clk_info, vfe_dev->vfe_clk, vfe_dev->num_clk, 0); clk_enable_failed: if (vfe_dev->fs_vfe) regulator_disable(vfe_dev->fs_vfe); kfree(vfe_dev->vfe_clk); fs_failed: msm_isp_deinit_bandwidth_mgr(ISP_VFE0 + vfe_dev->pdev->id); bus_scale_register_failed: return rc; } static void msm_vfe44_release_hardware(struct vfe_device *vfe_dev) { vfe_dev->irq0_mask = 0; vfe_dev->irq1_mask = 0; msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask, MSM_ISP_IRQ_SET); disable_irq(vfe_dev->vfe_irq->start); free_irq(vfe_dev->vfe_irq->start, vfe_dev); tasklet_kill(&vfe_dev->vfe_tasklet); msm_isp_flush_tasklet(vfe_dev); iounmap(vfe_dev->vfe_vbif_base); 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->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); regulator_disable(vfe_dev->fs_vfe); msm_isp_deinit_bandwidth_mgr(ISP_VFE0 + vfe_dev->pdev->id); } static void msm_vfe44_init_hardware_reg(struct vfe_device *vfe_dev) { struct msm_vfe_hw_init_parms qos_parms; Loading Loading @@ -1882,47 +1777,6 @@ static uint32_t msm_vfe44_stats_get_frame_id( return vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id; } static int msm_vfe44_get_platform_data(struct vfe_device *vfe_dev) { int rc = 0; vfe_dev->vfe_mem = platform_get_resource_byname(vfe_dev->pdev, IORESOURCE_MEM, "vfe"); if (!vfe_dev->vfe_mem) { pr_err("%s: no mem resource?\n", __func__); rc = -ENODEV; goto vfe_no_resource; } vfe_dev->vfe_vbif_mem = platform_get_resource_byname( vfe_dev->pdev, IORESOURCE_MEM, "vfe_vbif"); if (!vfe_dev->vfe_vbif_mem) { pr_err("%s: no mem resource?\n", __func__); rc = -ENODEV; goto vfe_no_resource; } vfe_dev->vfe_irq = platform_get_resource_byname(vfe_dev->pdev, IORESOURCE_IRQ, "vfe"); if (!vfe_dev->vfe_irq) { pr_err("%s: no irq resource?\n", __func__); rc = -ENODEV; goto vfe_no_resource; } vfe_dev->fs_vfe = regulator_get(&vfe_dev->pdev->dev, "vdd"); if (IS_ERR(vfe_dev->fs_vfe)) { pr_err("%s: Regulator get failed %ld\n", __func__, PTR_ERR(vfe_dev->fs_vfe)); vfe_dev->fs_vfe = NULL; rc = -ENODEV; goto vfe_no_resource; } vfe_no_resource: return rc; } static void msm_vfe44_get_error_mask( uint32_t *error_mask0, uint32_t *error_mask1) { Loading Loading @@ -1994,6 +1848,7 @@ struct msm_vfe_hardware_info vfe44_hw_info = { .process_axi_irq = msm_isp_process_axi_irq, .process_stats_irq = msm_isp_process_stats_irq, .process_epoch_irq = msm_vfe44_process_epoch_irq, .config_irq = msm_vfe44_config_irq, }, .axi_ops = { .reload_wm = msm_vfe44_axi_reload_wm, Loading Loading @@ -2029,11 +1884,10 @@ struct msm_vfe_hardware_info vfe44_hw_info = { .start_fetch_eng = msm_vfe44_fetch_engine_start, .cfg_rdi_reg = msm_vfe44_cfg_rdi_reg, .reset_hw = msm_vfe44_reset_hardware, .init_hw = msm_vfe44_init_hardware, .init_hw = msm_vfe47_init_hardware, .init_hw_reg = msm_vfe44_init_hardware_reg, .clear_status_reg = msm_vfe44_clear_status_reg, .release_hw = msm_vfe44_release_hardware, .get_platform_data = msm_vfe44_get_platform_data, .release_hw = msm_vfe47_release_hardware, .get_error_mask = msm_vfe44_get_error_mask, .get_overflow_mask = msm_vfe44_get_overflow_mask, .get_rdi_wm_mask = msm_vfe44_get_rdi_wm_mask, Loading Loading @@ -2063,10 +1917,26 @@ struct msm_vfe_hardware_info vfe44_hw_info = { .update_cgc_override = msm_vfe44_stats_update_cgc_override, }, .platform_ops = { .get_platform_data = msm_vfe47_get_platform_data, .enable_regulators = msm_vfe47_enable_regulators, .get_regulators = msm_vfe47_get_regulators, .put_regulators = msm_vfe47_put_regulators, .enable_clks = msm_vfe47_enable_clks, .get_clks = msm_vfe47_get_clks, .put_clks = msm_vfe47_put_clks, .get_clk_rates = msm_vfe47_get_clk_rates, .get_max_clk_rate = msm_vfe47_get_max_clk_rate, .set_clk_rate = msm_vfe47_set_clk_rate, .init_bw_mgr = msm_vfe47_init_bandwidth_mgr, .deinit_bw_mgr = msm_vfe47_deinit_bandwidth_mgr, .update_bw = msm_vfe47_update_bandwidth, } }, .dmi_reg_offset = 0x918, .axi_hw_info = &msm_vfe44_axi_hw_info, .stats_hw_info = &msm_vfe44_stats_hw_info, .regulator_names = {"vdd"}, }; EXPORT_SYMBOL(vfe44_hw_info); Loading Loading
drivers/media/platform/msm/camera_v2/isp/Makefile +1 −1 Original line number Diff line number Diff line Loading @@ -2,4 +2,4 @@ ccflags-y += -Idrivers/media/platform/msm/camera_v2 ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/io ccflags-y += -Idrivers/media/platform/msm/camera_v2/common/ obj-$(CONFIG_MSMB_CAMERA) += msm_buf_mgr.o msm_isp_util.o msm_isp_axi_util.o msm_isp_stats_util.o obj-$(CONFIG_MSMB_CAMERA) += msm_isp47.o msm_isp46.o msm_isp44.o msm_isp40.o msm_isp.o obj-$(CONFIG_MSMB_CAMERA) += msm_isp48.o msm_isp47.o msm_isp46.o msm_isp44.o msm_isp40.o msm_isp.o
drivers/media/platform/msm/camera_v2/isp/msm_isp.c +14 −3 Original line number Diff line number Diff line /* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -29,6 +29,7 @@ #include "msm_isp_axi_util.h" #include "msm_isp_stats_util.h" #include "msm_sd.h" #include "msm_isp48.h" #include "msm_isp47.h" #include "msm_isp46.h" #include "msm_isp44.h" Loading Loading @@ -330,6 +331,17 @@ void msm_isp_update_req_history(uint32_t client, uint64_t ab, spin_unlock(&req_history_lock); } void msm_isp_update_last_overflow_ab_ib(struct vfe_device *vfe_dev) { spin_lock(&req_history_lock); vfe_dev->msm_isp_last_overflow_ab = msm_isp_bw_request_history[msm_isp_bw_request_history_idx].total_ab; vfe_dev->msm_isp_last_overflow_ib = msm_isp_bw_request_history[msm_isp_bw_request_history_idx].total_ib; spin_unlock(&req_history_lock); } #ifdef CONFIG_COMPAT static long msm_isp_dqevent(struct file *file, struct v4l2_fh *vfh, void *arg) { Loading Loading @@ -581,8 +593,7 @@ int vfe_hw_probe(struct platform_device *pdev) vfe_dev->pdev = pdev; rc = vfe_dev->hw_info->vfe_ops.core_ops.get_platform_data(vfe_dev); rc = vfe_dev->hw_info->vfe_ops.platform_ops.get_platform_data(vfe_dev); if (rc < 0) { pr_err("%s: failed to get platform resources\n", __func__); rc = -ENOMEM; Loading
drivers/media/platform/msm/camera_v2/isp/msm_isp.h +54 −22 Original line number Diff line number Diff line Loading @@ -154,6 +154,9 @@ struct msm_vfe_irq_ops { uint32_t irq_status0, uint32_t irq_status1, uint32_t pingpong_status, struct msm_isp_timestamp *ts); void (*config_irq)(struct vfe_device *vfe_dev, uint32_t irq_status0, uint32_t irq_status1, enum msm_isp_irq_operation); }; struct msm_vfe_axi_ops { Loading Loading @@ -226,7 +229,6 @@ struct msm_vfe_core_ops { void (*cfg_rdi_reg)(struct vfe_device *vfe_dev, struct msm_vfe_rdi_cfg *rdi_cfg, enum msm_vfe_input_src input_src); int (*get_platform_data)(struct vfe_device *vfe_dev); void (*get_error_mask)(uint32_t *error_mask0, uint32_t *error_mask1); void (*process_error_status)(struct vfe_device *vfe_dev); void (*get_overflow_mask)(uint32_t *overflow_mask); Loading Loading @@ -277,11 +279,52 @@ struct msm_vfe_stats_ops { uint32_t stats_mask, uint8_t enable); }; enum msm_isp_hw_client { ISP_VFE0, ISP_VFE1, ISP_CPP, MAX_ISP_CLIENT, }; struct msm_isp_bandwidth_info { uint32_t active; uint64_t ab; uint64_t ib; }; struct msm_isp_bandwidth_mgr { uint32_t bus_client; uint32_t bus_vector_active_idx; uint32_t use_count; struct msm_isp_bandwidth_info client_info[MAX_ISP_CLIENT]; int (*update_bw)(struct msm_isp_bandwidth_mgr *isp_bandwidth_mgr); void (*deinit_bw_mgr)(struct msm_isp_bandwidth_mgr *isp_bandwidth_mgr); }; struct msm_vfe_platform_ops { int (*get_platform_data)(struct vfe_device *vfe_dev); int (*enable_clks)(struct vfe_device *vfe_dev, int enable); int (*get_clks)(struct vfe_device *vfe_dev); void (*put_clks)(struct vfe_device *vfe_dev); int (*get_clk_rates)(struct vfe_device *vfe_dev, struct msm_isp_clk_rates *rates); int (*get_max_clk_rate)(struct vfe_device *vfe_dev, long *rate); int (*set_clk_rate)(struct vfe_device *vfe_dev, long *rate); int (*enable_regulators)(struct vfe_device *vfe_dev, int enable); int (*get_regulators)(struct vfe_device *vfe_dev); void (*put_regulators)(struct vfe_device *vfe_dev); int (*init_bw_mgr)(struct vfe_device *vfe_dev, struct msm_isp_bandwidth_mgr *isp_bandwidth_mgr); int (*update_bw)(struct msm_isp_bandwidth_mgr *isp_bandwidth_mgr); void (*deinit_bw_mgr)(struct msm_isp_bandwidth_mgr *isp_bandwidth_mgr); }; struct msm_vfe_ops { struct msm_vfe_irq_ops irq_ops; struct msm_vfe_axi_ops axi_ops; struct msm_vfe_core_ops core_ops; struct msm_vfe_stats_ops stats_ops; struct msm_vfe_platform_ops platform_ops; }; struct msm_vfe_hardware_info { Loading @@ -296,6 +339,7 @@ struct msm_vfe_hardware_info { uint32_t dmi_reg_offset; uint32_t min_ab; uint32_t min_ib; const char *regulator_names[]; }; struct msm_vfe_axi_hardware_info { Loading Loading @@ -573,19 +617,6 @@ struct msm_isp_statistics { int64_t cpp_clk_rate; }; enum msm_isp_hw_client { ISP_VFE0, ISP_VFE1, ISP_CPP, MAX_ISP_CLIENT, }; struct msm_isp_bandwidth_info { uint32_t active; uint64_t ab; uint64_t ib; }; struct msm_isp_bw_req_info { uint32_t client; unsigned long long timestamp; Loading Loading @@ -659,18 +690,18 @@ struct vfe_device { /* Resource info */ struct resource *vfe_irq; struct resource *vfe_mem; struct resource *vfe_vbif_mem; struct resource *vfe_io; struct resource *vfe_vbif_io; void __iomem *vfe_base; uint32_t vfe_base_size; void __iomem *vfe_vbif_base; uint32_t vfe_vbif_base_size; struct device *iommu_ctx[MAX_IOMMU_CTX]; struct regulator *fs_vfe; struct regulator *fs_camss; struct regulator *fs_mmagic_camss; struct msm_cam_regulator *regulator_info; uint32_t vfe_num_regulators; struct clk **vfe_clk; uint32_t num_clk; struct msm_cam_clk_info *vfe_clk_info; uint32_t **vfe_clk_rates; size_t num_clk; size_t num_rates; /* Sync variables*/ struct completion reset_complete; Loading Loading @@ -738,5 +769,6 @@ struct vfe_parent_device { }; int vfe_hw_probe(struct platform_device *pdev); void msm_isp_update_last_overflow_ab_ib(struct vfe_device *vfe_dev); #endif
drivers/media/platform/msm/camera_v2/isp/msm_isp40.c +21 −154 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include "msm_isp.h" #include "msm.h" #include "msm_camera_io_util.h" #include "msm_isp47.h" #undef CDBG #define CDBG(fmt, args...) pr_debug(fmt, ##args) Loading Loading @@ -94,7 +95,6 @@ static uint8_t stats_pingpong_offset_map[] = { #define VFE40_BUS_BDG_QOS_CFG_7 0x000002E0 #define VFE40_CLK_IDX 2 static struct msm_cam_clk_info msm_vfe40_clk_info[VFE_CLK_INFO_MAX]; static void msm_vfe40_config_irq(struct vfe_device *vfe_dev, uint32_t irq0_mask, uint32_t irq1_mask, Loading Loading @@ -288,114 +288,6 @@ static int32_t msm_vfe40_init_vbif_parms(struct vfe_device *vfe_dev, return 0; } static int msm_vfe40_init_hardware(struct vfe_device *vfe_dev) { int rc = -1; rc = msm_isp_init_bandwidth_mgr(ISP_VFE0 + vfe_dev->pdev->id); if (rc < 0) { pr_err("%s: Bandwidth registration Failed!\n", __func__); goto bus_scale_register_failed; } if (vfe_dev->fs_vfe) { rc = regulator_enable(vfe_dev->fs_vfe); if (rc) { pr_err("%s: Regulator enable failed\n", __func__); goto fs_failed; } } rc = msm_isp_get_clk_info(vfe_dev, vfe_dev->pdev, &msm_vfe40_clk_info[0]); if (rc < 0) { pr_err("msm_isp_get_clk_info() failed\n"); goto fs_failed; } if (vfe_dev->num_clk <= 0) { pr_err("%s: Invalid num of clock\n", __func__); goto fs_failed; } else { vfe_dev->vfe_clk = kzalloc(sizeof(struct clk *) * vfe_dev->num_clk, GFP_KERNEL); if (!vfe_dev->vfe_clk) { pr_err("%s:%d No memory\n", __func__, __LINE__); return -ENOMEM; } } rc = msm_cam_clk_enable(&vfe_dev->pdev->dev, msm_vfe40_clk_info, vfe_dev->vfe_clk, vfe_dev->num_clk, 1); if (rc < 0) goto clk_enable_failed; vfe_dev->vfe_base = ioremap(vfe_dev->vfe_mem->start, resource_size(vfe_dev->vfe_mem)); if (!vfe_dev->vfe_base) { rc = -ENOMEM; pr_err("%s: vfe ioremap failed\n", __func__); goto vfe_remap_failed; } 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)); if (!vfe_dev->vfe_vbif_base) { rc = -ENOMEM; pr_err("%s: vfe ioremap failed\n", __func__); goto vbif_remap_failed; } rc = request_irq(vfe_dev->vfe_irq->start, msm_isp_process_irq, IRQF_TRIGGER_RISING, "vfe", vfe_dev); if (rc < 0) { pr_err("%s: irq request failed\n", __func__); goto irq_req_failed; } return rc; irq_req_failed: iounmap(vfe_dev->vfe_vbif_base); vfe_dev->vfe_vbif_base = NULL; vbif_remap_failed: iounmap(vfe_dev->vfe_base); vfe_dev->vfe_base = NULL; vfe_remap_failed: msm_cam_clk_enable(&vfe_dev->pdev->dev, msm_vfe40_clk_info, vfe_dev->vfe_clk, vfe_dev->num_clk, 0); clk_enable_failed: if (vfe_dev->fs_vfe) regulator_disable(vfe_dev->fs_vfe); kfree(vfe_dev->vfe_clk); fs_failed: msm_isp_deinit_bandwidth_mgr(ISP_VFE0 + vfe_dev->pdev->id); bus_scale_register_failed: return rc; } static void msm_vfe40_release_hardware(struct vfe_device *vfe_dev) { /* disable all mask before tasklet kill */ vfe_dev->irq0_mask = 0; vfe_dev->irq1_mask = 0; msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask, MSM_ISP_IRQ_SET); disable_irq(vfe_dev->vfe_irq->start); free_irq(vfe_dev->vfe_irq->start, vfe_dev); tasklet_kill(&vfe_dev->vfe_tasklet); msm_isp_flush_tasklet(vfe_dev); iounmap(vfe_dev->vfe_vbif_base); 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->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); regulator_disable(vfe_dev->fs_vfe); msm_isp_deinit_bandwidth_mgr(ISP_VFE0 + vfe_dev->pdev->id); } static void msm_vfe40_init_hardware_reg(struct vfe_device *vfe_dev) { struct msm_vfe_hw_init_parms qos_parms; Loading Loading @@ -668,7 +560,7 @@ static void msm_vfe40_process_error_status(struct vfe_device *vfe_dev) /* Update ab/ib values for any overflow that may have occured*/ if ((error_status1 >> 9) & 0x7FFF) msm_isp_util_update_last_overflow_ab_ib(vfe_dev); msm_isp_update_last_overflow_ab_ib(vfe_dev); } static void msm_vfe40_read_irq_status(struct vfe_device *vfe_dev, Loading Loading @@ -2236,47 +2128,6 @@ static uint32_t msm_vfe40_stats_get_frame_id( return vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id; } static int msm_vfe40_get_platform_data(struct vfe_device *vfe_dev) { int rc = 0; vfe_dev->vfe_mem = platform_get_resource_byname(vfe_dev->pdev, IORESOURCE_MEM, "vfe"); if (!vfe_dev->vfe_mem) { pr_err("%s: no mem resource?\n", __func__); rc = -ENODEV; goto vfe_no_resource; } vfe_dev->vfe_vbif_mem = platform_get_resource_byname( vfe_dev->pdev, IORESOURCE_MEM, "vfe_vbif"); if (!vfe_dev->vfe_vbif_mem) { pr_err("%s: no mem resource?\n", __func__); rc = -ENODEV; goto vfe_no_resource; } vfe_dev->vfe_irq = platform_get_resource_byname(vfe_dev->pdev, IORESOURCE_IRQ, "vfe"); if (!vfe_dev->vfe_irq) { pr_err("%s: no irq resource?\n", __func__); rc = -ENODEV; goto vfe_no_resource; } vfe_dev->fs_vfe = regulator_get(&vfe_dev->pdev->dev, "vdd"); if (IS_ERR(vfe_dev->fs_vfe)) { pr_err("%s: Regulator get failed %ld\n", __func__, PTR_ERR(vfe_dev->fs_vfe)); vfe_dev->fs_vfe = NULL; rc = -ENODEV; goto vfe_no_resource; } vfe_no_resource: return rc; } static void msm_vfe40_get_error_mask( uint32_t *error_mask0, uint32_t *error_mask1) { Loading Loading @@ -2347,6 +2198,7 @@ struct msm_vfe_hardware_info vfe40_hw_info = { .process_axi_irq = msm_isp_process_axi_irq, .process_stats_irq = msm_isp_process_stats_irq, .process_epoch_irq = msm_vfe40_process_epoch_irq, .config_irq = msm_vfe40_config_irq, }, .axi_ops = { .reload_wm = msm_vfe40_axi_reload_wm, Loading Loading @@ -2382,11 +2234,10 @@ struct msm_vfe_hardware_info vfe40_hw_info = { .start_fetch_eng = msm_vfe40_start_fetch_engine, .cfg_rdi_reg = msm_vfe40_cfg_rdi_reg, .reset_hw = msm_vfe40_reset_hardware, .init_hw = msm_vfe40_init_hardware, .init_hw = msm_vfe47_init_hardware, .init_hw_reg = msm_vfe40_init_hardware_reg, .clear_status_reg = msm_vfe40_clear_status_reg, .release_hw = msm_vfe40_release_hardware, .get_platform_data = msm_vfe40_get_platform_data, .release_hw = msm_vfe47_release_hardware, .get_error_mask = msm_vfe40_get_error_mask, .get_overflow_mask = msm_vfe40_get_overflow_mask, .get_rdi_wm_mask = msm_vfe40_get_rdi_wm_mask, Loading Loading @@ -2416,10 +2267,26 @@ struct msm_vfe_hardware_info vfe40_hw_info = { .update_cgc_override = msm_vfe40_stats_update_cgc_override, }, .platform_ops = { .get_platform_data = msm_vfe47_get_platform_data, .enable_regulators = msm_vfe47_enable_regulators, .get_regulators = msm_vfe47_get_regulators, .put_regulators = msm_vfe47_put_regulators, .enable_clks = msm_vfe47_enable_clks, .get_clks = msm_vfe47_get_clks, .put_clks = msm_vfe47_put_clks, .get_clk_rates = msm_vfe47_get_clk_rates, .get_max_clk_rate = msm_vfe47_get_max_clk_rate, .set_clk_rate = msm_vfe47_set_clk_rate, .init_bw_mgr = msm_vfe47_init_bandwidth_mgr, .deinit_bw_mgr = msm_vfe47_deinit_bandwidth_mgr, .update_bw = msm_vfe47_update_bandwidth, } }, .dmi_reg_offset = 0x918, .axi_hw_info = &msm_vfe40_axi_hw_info, .stats_hw_info = &msm_vfe40_stats_hw_info, .regulator_names = {"vdd"}, }; EXPORT_SYMBOL(vfe40_hw_info); Loading
drivers/media/platform/msm/camera_v2/isp/msm_isp44.c +20 −150 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include "msm_isp.h" #include "msm.h" #include "msm_camera_io_util.h" #include "msm_isp47.h" #undef CDBG #define CDBG(fmt, args...) pr_debug(fmt, ##args) Loading Loading @@ -63,7 +64,6 @@ static uint8_t stats_pingpong_offset_map[] = { (~(ping_pong >> (stats_pingpong_offset_map[idx])) & 0x1)) #define VFE44_CLK_IDX 2 static struct msm_cam_clk_info msm_vfe44_clk_info[VFE_CLK_INFO_MAX]; static void msm_vfe44_config_irq(struct vfe_device *vfe_dev, uint32_t irq0_mask, uint32_t irq1_mask, Loading Loading @@ -158,111 +158,6 @@ static int32_t msm_vfe44_init_dt_parms(struct vfe_device *vfe_dev, return 0; } static int msm_vfe44_init_hardware(struct vfe_device *vfe_dev) { int rc = -1; rc = msm_isp_init_bandwidth_mgr(ISP_VFE0 + vfe_dev->pdev->id); if (rc < 0) { pr_err("%s: Bandwidth registration Failed!\n", __func__); goto bus_scale_register_failed; } if (vfe_dev->fs_vfe) { rc = regulator_enable(vfe_dev->fs_vfe); if (rc) { pr_err("%s: Regulator enable failed\n", __func__); goto fs_failed; } } rc = msm_isp_get_clk_info(vfe_dev, vfe_dev->pdev, msm_vfe44_clk_info); if (rc < 0) { pr_err("msm_isp_get_clk_info() failed\n"); goto fs_failed; } if (vfe_dev->num_clk <= 0) { pr_err("%s: Invalid num of clock\n", __func__); goto fs_failed; } else { vfe_dev->vfe_clk = kzalloc(sizeof(struct clk *) * vfe_dev->num_clk, GFP_KERNEL); if (!vfe_dev->vfe_clk) { pr_err("%s:%d No memory\n", __func__, __LINE__); return -ENOMEM; } } rc = msm_cam_clk_enable(&vfe_dev->pdev->dev, msm_vfe44_clk_info, vfe_dev->vfe_clk, vfe_dev->num_clk, 1); if (rc < 0) goto clk_enable_failed; vfe_dev->vfe_base = ioremap(vfe_dev->vfe_mem->start, resource_size(vfe_dev->vfe_mem)); if (!vfe_dev->vfe_base) { rc = -ENOMEM; pr_err("%s: vfe ioremap failed\n", __func__); goto vfe_remap_failed; } 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)); if (!vfe_dev->vfe_vbif_base) { rc = -ENOMEM; pr_err("%s: vfe ioremap failed\n", __func__); goto vbif_remap_failed; } rc = request_irq(vfe_dev->vfe_irq->start, msm_isp_process_irq, IRQF_TRIGGER_RISING, "vfe", vfe_dev); if (rc < 0) { pr_err("%s: irq request failed\n", __func__); goto irq_req_failed; } return rc; irq_req_failed: iounmap(vfe_dev->vfe_vbif_base); vfe_dev->vfe_vbif_base = NULL; vbif_remap_failed: iounmap(vfe_dev->vfe_base); vfe_dev->vfe_base = NULL; vfe_remap_failed: msm_cam_clk_enable(&vfe_dev->pdev->dev, msm_vfe44_clk_info, vfe_dev->vfe_clk, vfe_dev->num_clk, 0); clk_enable_failed: if (vfe_dev->fs_vfe) regulator_disable(vfe_dev->fs_vfe); kfree(vfe_dev->vfe_clk); fs_failed: msm_isp_deinit_bandwidth_mgr(ISP_VFE0 + vfe_dev->pdev->id); bus_scale_register_failed: return rc; } static void msm_vfe44_release_hardware(struct vfe_device *vfe_dev) { vfe_dev->irq0_mask = 0; vfe_dev->irq1_mask = 0; msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask, MSM_ISP_IRQ_SET); disable_irq(vfe_dev->vfe_irq->start); free_irq(vfe_dev->vfe_irq->start, vfe_dev); tasklet_kill(&vfe_dev->vfe_tasklet); msm_isp_flush_tasklet(vfe_dev); iounmap(vfe_dev->vfe_vbif_base); 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->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); regulator_disable(vfe_dev->fs_vfe); msm_isp_deinit_bandwidth_mgr(ISP_VFE0 + vfe_dev->pdev->id); } static void msm_vfe44_init_hardware_reg(struct vfe_device *vfe_dev) { struct msm_vfe_hw_init_parms qos_parms; Loading Loading @@ -1882,47 +1777,6 @@ static uint32_t msm_vfe44_stats_get_frame_id( return vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id; } static int msm_vfe44_get_platform_data(struct vfe_device *vfe_dev) { int rc = 0; vfe_dev->vfe_mem = platform_get_resource_byname(vfe_dev->pdev, IORESOURCE_MEM, "vfe"); if (!vfe_dev->vfe_mem) { pr_err("%s: no mem resource?\n", __func__); rc = -ENODEV; goto vfe_no_resource; } vfe_dev->vfe_vbif_mem = platform_get_resource_byname( vfe_dev->pdev, IORESOURCE_MEM, "vfe_vbif"); if (!vfe_dev->vfe_vbif_mem) { pr_err("%s: no mem resource?\n", __func__); rc = -ENODEV; goto vfe_no_resource; } vfe_dev->vfe_irq = platform_get_resource_byname(vfe_dev->pdev, IORESOURCE_IRQ, "vfe"); if (!vfe_dev->vfe_irq) { pr_err("%s: no irq resource?\n", __func__); rc = -ENODEV; goto vfe_no_resource; } vfe_dev->fs_vfe = regulator_get(&vfe_dev->pdev->dev, "vdd"); if (IS_ERR(vfe_dev->fs_vfe)) { pr_err("%s: Regulator get failed %ld\n", __func__, PTR_ERR(vfe_dev->fs_vfe)); vfe_dev->fs_vfe = NULL; rc = -ENODEV; goto vfe_no_resource; } vfe_no_resource: return rc; } static void msm_vfe44_get_error_mask( uint32_t *error_mask0, uint32_t *error_mask1) { Loading Loading @@ -1994,6 +1848,7 @@ struct msm_vfe_hardware_info vfe44_hw_info = { .process_axi_irq = msm_isp_process_axi_irq, .process_stats_irq = msm_isp_process_stats_irq, .process_epoch_irq = msm_vfe44_process_epoch_irq, .config_irq = msm_vfe44_config_irq, }, .axi_ops = { .reload_wm = msm_vfe44_axi_reload_wm, Loading Loading @@ -2029,11 +1884,10 @@ struct msm_vfe_hardware_info vfe44_hw_info = { .start_fetch_eng = msm_vfe44_fetch_engine_start, .cfg_rdi_reg = msm_vfe44_cfg_rdi_reg, .reset_hw = msm_vfe44_reset_hardware, .init_hw = msm_vfe44_init_hardware, .init_hw = msm_vfe47_init_hardware, .init_hw_reg = msm_vfe44_init_hardware_reg, .clear_status_reg = msm_vfe44_clear_status_reg, .release_hw = msm_vfe44_release_hardware, .get_platform_data = msm_vfe44_get_platform_data, .release_hw = msm_vfe47_release_hardware, .get_error_mask = msm_vfe44_get_error_mask, .get_overflow_mask = msm_vfe44_get_overflow_mask, .get_rdi_wm_mask = msm_vfe44_get_rdi_wm_mask, Loading Loading @@ -2063,10 +1917,26 @@ struct msm_vfe_hardware_info vfe44_hw_info = { .update_cgc_override = msm_vfe44_stats_update_cgc_override, }, .platform_ops = { .get_platform_data = msm_vfe47_get_platform_data, .enable_regulators = msm_vfe47_enable_regulators, .get_regulators = msm_vfe47_get_regulators, .put_regulators = msm_vfe47_put_regulators, .enable_clks = msm_vfe47_enable_clks, .get_clks = msm_vfe47_get_clks, .put_clks = msm_vfe47_put_clks, .get_clk_rates = msm_vfe47_get_clk_rates, .get_max_clk_rate = msm_vfe47_get_max_clk_rate, .set_clk_rate = msm_vfe47_set_clk_rate, .init_bw_mgr = msm_vfe47_init_bandwidth_mgr, .deinit_bw_mgr = msm_vfe47_deinit_bandwidth_mgr, .update_bw = msm_vfe47_update_bandwidth, } }, .dmi_reg_offset = 0x918, .axi_hw_info = &msm_vfe44_axi_hw_info, .stats_hw_info = &msm_vfe44_stats_hw_info, .regulator_names = {"vdd"}, }; EXPORT_SYMBOL(vfe44_hw_info); Loading