Merge "msm: camera: Add AXI arbitration logic for VFE" into msm-3.4
diff --git a/arch/arm/mach-msm/dal_axi.c b/arch/arm/mach-msm/dal_axi.c
index 739b7dc..1d873ca 100644
--- a/arch/arm/mach-msm/dal_axi.c
+++ b/arch/arm/mach-msm/dal_axi.c
@@ -17,6 +17,8 @@
#define DALRPC_PORT_NAME "DAL00"
enum {
+ DALRPC_AXI_ALLOCATE = DALDEVICE_FIRST_DEVICE_API_IDX + 1,
+ DALRPC_AXI_FREE = DALDEVICE_FIRST_DEVICE_API_IDX + 2,
DALRPC_AXI_CONFIGURE_BRIDGE = DALDEVICE_FIRST_DEVICE_API_IDX + 11
};
@@ -38,6 +40,67 @@
};
+static void *cam_dev_handle;
+static int __axi_free(int mode)
+{
+ int rc = 0;
+
+ if (!cam_dev_handle)
+ return rc;
+
+ rc = dalrpc_fcn_0(DALRPC_AXI_FREE, cam_dev_handle, mode);
+ if (rc) {
+ printk(KERN_ERR "%s: AXI bus device (%d) failed to be configured\n",
+ __func__, rc);
+ goto fail_dal_fcn_0;
+ }
+
+ /* close device handle */
+ rc = daldevice_detach(cam_dev_handle);
+ if (rc) {
+ printk(KERN_ERR "%s: failed to detach AXI bus device (%d)\n",
+ __func__, rc);
+ goto fail_dal_attach_detach;
+ }
+ cam_dev_handle = NULL;
+ return 0;
+
+fail_dal_fcn_0:
+ (void)daldevice_detach(cam_dev_handle);
+ cam_dev_handle = NULL;
+fail_dal_attach_detach:
+ return rc;
+}
+
+static int __axi_allocate(int mode)
+{
+ int rc;
+
+ /* get device handle */
+ rc = daldevice_attach(DALDEVICEID_AXI, DALRPC_PORT_NAME,
+ DALRPC_DEST_MODEM, &cam_dev_handle);
+ if (rc) {
+ printk(KERN_ERR "%s: failed to attach AXI bus device (%d)\n",
+ __func__, rc);
+ goto fail_dal_attach_detach;
+ }
+
+ rc = dalrpc_fcn_0(DALRPC_AXI_ALLOCATE, cam_dev_handle, mode);
+ if (rc) {
+ printk(KERN_ERR "%s: AXI bus device (%d) failed to be configured\n",
+ __func__, rc);
+ goto fail_dal_fcn_0;
+ }
+
+ return 0;
+
+fail_dal_fcn_0:
+ (void)daldevice_detach(cam_dev_handle);
+ cam_dev_handle = NULL;
+fail_dal_attach_detach:
+ return rc;
+}
+
static int axi_configure_bridge_grfx_sync_mode(int bridge_mode)
{
int rc;
@@ -82,7 +145,15 @@
return rc;
}
+int axi_free(mode)
+{
+ return __axi_free(mode);
+}
+int axi_allocate(mode)
+{
+ return __axi_allocate(mode);
+}
int set_grp2d_async(void)
{
diff --git a/arch/arm/mach-msm/include/mach/dal_axi.h b/arch/arm/mach-msm/include/mach/dal_axi.h
index 4e32aa3..84cd37f 100644
--- a/arch/arm/mach-msm/include/mach/dal_axi.h
+++ b/arch/arm/mach-msm/include/mach/dal_axi.h
@@ -17,5 +17,7 @@
int set_grp2d_async(void);
int set_grp3d_async(void);
int set_grp_xbar_async(void);
-
+int axi_allocate(int mode);
+int axi_free(int mode);
+#define AXI_FLOW_VIEWFINDER_HI 243
#endif /* _DAL_AXI_H */
diff --git a/drivers/media/video/msm/io/msm_io_7x27a_v4l2.c b/drivers/media/video/msm/io/msm_io_7x27a_v4l2.c
index 7e80145..9549dcc 100644
--- a/drivers/media/video/msm/io/msm_io_7x27a_v4l2.c
+++ b/drivers/media/video/msm/io/msm_io_7x27a_v4l2.c
@@ -21,7 +21,7 @@
#include <mach/clk.h>
#include <mach/msm_bus.h>
#include <mach/msm_bus_board.h>
-
+#include <mach/dal_axi.h>
#define MSM_AXI_QOS_PREVIEW 200000
#define MSM_AXI_QOS_SNAPSHOT 200000
@@ -142,6 +142,7 @@
break;
case S_PREVIEW:
update_axi_qos(MSM_AXI_QOS_PREVIEW);
+ axi_allocate(AXI_FLOW_VIEWFINDER_HI);
break;
case S_VIDEO:
update_axi_qos(MSM_AXI_QOS_RECORDING);
@@ -153,6 +154,7 @@
update_axi_qos(PM_QOS_DEFAULT_VALUE);
break;
case S_EXIT:
+ axi_free(AXI_FLOW_VIEWFINDER_HI);
release_axi_qos();
break;
default:
diff --git a/drivers/media/video/msm/vfe/msm_vfe7x27a_v4l2.c b/drivers/media/video/msm/vfe/msm_vfe7x27a_v4l2.c
index e1d8b48..460eb07 100644
--- a/drivers/media/video/msm/vfe/msm_vfe7x27a_v4l2.c
+++ b/drivers/media/video/msm/vfe/msm_vfe7x27a_v4l2.c
@@ -696,7 +696,6 @@
switch (id) {
case MSG_SNAPSHOT:
- msm_camio_set_perf_lvl(S_PREVIEW);
while (vfe2x_ctrl->snap.frame_cnt <
vfe2x_ctrl->num_snap) {
vfe_7x_ops(driver_data, MSG_OUTPUT_S, len,