Loading drivers/video/msm/ba/msm_ba.c +136 −15 Original line number Diff line number Diff line Loading @@ -99,6 +99,8 @@ int msm_ba_s_priority(void *instance, enum v4l2_priority prio) struct msm_ba_input *ba_input = NULL; int rc = 0; dprintk(BA_DBG, "Enter %s, prio: %d", __func__, prio); if (!inst) return -EINVAL; Loading Loading @@ -174,15 +176,23 @@ int msm_ba_g_input(void *instance, unsigned int *index) if (!inst || !index) return -EINVAL; do { /* First find current input */ ba_input = msm_ba_find_input(inst->sd_input.index); if (ba_input) { if (V4L2_PRIORITY_RECORD == ba_input->prio && inst->input_prio != ba_input->prio) { if (BA_INPUT_USERTYPE_KERNEL == ba_input->input_user_type) { inst->sd_input.index++; continue; } break; } } while (ba_input); if (ba_input) *index = inst->sd_input.index; else rc = -ENOENT; return rc; } Loading Loading @@ -223,6 +233,10 @@ int msm_ba_s_input(void *instance, unsigned int index) ba_input->bridge_chip_ip); rc_sig = v4l2_subdev_call(ba_input->sd, video, s_stream, 0); if (rc_sig) dprintk(BA_ERR, "%s: Error in stream off. rc_sig %d", __func__, rc_sig); } } else { dprintk(BA_WARN, "Sd %d in use", ba_input->ba_out); Loading Loading @@ -252,7 +266,6 @@ int msm_ba_s_input(void *instance, unsigned int index) .id = 0, .type = V4L2_EVENT_MSM_BA_SIGNAL_IN_LOCK}; int *ptr = (int *)sd_event.u.data; ptr[0] = index; ptr[1] = ba_input->signal_status; msm_ba_queue_v4l2_event(inst, &sd_event); Loading Loading @@ -311,7 +324,6 @@ int msm_ba_s_output(void *instance, unsigned int index) dprintk(BA_ERR, "No sd registered"); return -EINVAL; } ba_input->ba_node_addr = index; ba_input->ba_out = index; inst->sd_output.index = index; inst->sd = ba_input->sd; Loading Loading @@ -380,9 +392,11 @@ int msm_ba_g_fmt(void *instance, struct v4l2_format *f) inst->sd_input.std = new_std; } else { rc = v4l2_subdev_call(sd, video, g_dv_timings, &sd_dv_timings); if (rc) if (rc) { dprintk(BA_ERR, "g_dv_timings failed %d for sd: %s", rc, sd->name); return -EINVAL; } } rc = v4l2_subdev_call(sd, video, g_mbus_fmt, &sd_mbus_fmt); Loading Loading @@ -503,6 +517,113 @@ int msm_ba_streamoff(void *instance, enum v4l2_buf_type i) } EXPORT_SYMBOL(msm_ba_streamoff); long msm_ba_private_ioctl(void *instance, int cmd, void *arg) { long rc = 0; struct msm_ba_inst *inst = instance; struct v4l2_subdev *sd = NULL; int *s_ioctl = arg; dprintk(BA_DBG, "Enter %s with command: 0x%x", __func__, cmd); if (!inst) return -EINVAL; switch (cmd) { case VIDIOC_HDMI_RX_CEC_S_LOGICAL: { dprintk(BA_DBG, "VIDIOC_HDMI_RX_CEC_S_LOGICAL"); sd = inst->sd; if (!sd) { dprintk(BA_ERR, "No sd registered"); return -EINVAL; } if (s_ioctl) { rc = v4l2_subdev_call(sd, core, ioctl, cmd, s_ioctl); if (rc) dprintk(BA_ERR, "%s failed: %ld on cmd: 0x%x", __func__, rc, cmd); } else { dprintk(BA_ERR, "%s: NULL argument provided", __func__); rc = -EINVAL; } } break; case VIDIOC_HDMI_RX_CEC_CLEAR_LOGICAL: { dprintk(BA_DBG, "VIDIOC_HDMI_RX_CEC_CLEAR_LOGICAL"); sd = inst->sd; if (!sd) { dprintk(BA_ERR, "No sd registered"); return -EINVAL; } rc = v4l2_subdev_call(sd, core, ioctl, cmd, s_ioctl); if (rc) dprintk(BA_ERR, "%s failed: %ld on cmd: 0x%x", __func__, rc, cmd); } break; case VIDIOC_HDMI_RX_CEC_G_PHYSICAL: { dprintk(BA_DBG, "VIDIOC_HDMI_RX_CEC_G_PHYSICAL"); sd = inst->sd; if (!sd) { dprintk(BA_ERR, "No sd registered"); return -EINVAL; } if (s_ioctl) { rc = v4l2_subdev_call(sd, core, ioctl, cmd, s_ioctl); if (rc) dprintk(BA_ERR, "%s failed: %ld on cmd: 0x%x", __func__, rc, cmd); } else { dprintk(BA_ERR, "%s: NULL argument provided", __func__); rc = -EINVAL; } } break; case VIDIOC_HDMI_RX_CEC_G_CONNECTED: { dprintk(BA_DBG, "VIDIOC_HDMI_RX_CEC_G_CONNECTED"); sd = inst->sd; if (!sd) { dprintk(BA_ERR, "No sd registered"); return -EINVAL; } if (s_ioctl) { rc = v4l2_subdev_call(sd, core, ioctl, cmd, s_ioctl); if (rc) dprintk(BA_ERR, "%s failed: %ld on cmd: 0x%x", __func__, rc, cmd); } else { dprintk(BA_ERR, "%s: NULL argument provided", __func__); rc = -EINVAL; } } break; case VIDIOC_HDMI_RX_CEC_S_ENABLE: { dprintk(BA_DBG, "VIDIOC_HDMI_RX_CEC_S_ENABLE"); sd = inst->sd; if (!sd) { dprintk(BA_ERR, "No sd registered"); return -EINVAL; } if (s_ioctl) { rc = v4l2_subdev_call(sd, core, ioctl, cmd, s_ioctl); if (rc) dprintk(BA_ERR, "%s failed: %ld on cmd: 0x%x", __func__, rc, cmd); } else { dprintk(BA_ERR, "%s: NULL argument provided", __func__); rc = -EINVAL; } } break; default: dprintk(BA_WARN, "Not a typewriter! Command: 0x%x", cmd); rc = -ENOTTY; break; } return rc; } EXPORT_SYMBOL(msm_ba_private_ioctl); int msm_ba_save_restore_input(void *instance, enum msm_ba_save_restore_ip sr) { struct msm_ba_inst *inst = instance; Loading Loading @@ -535,7 +656,10 @@ int msm_ba_save_restore_input(void *instance, enum msm_ba_save_restore_ip sr) rc = msm_ba_streamon(inst, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); } else if (BA_SR_SAVE_IP == sr) { ba_input = msm_ba_find_input(inst->sd_input.index); if (ba_input && ba_input->ba_out_in_use) { if (ba_input == NULL) { dprintk(BA_ERR, "Could not find input %d", inst->sd_input.index); } else if (ba_input->ba_out_in_use) { inst->restore = 1; inst->saved_input = msm_ba_find_ip_in_use_from_sd(inst->sd); Loading @@ -547,9 +671,6 @@ int msm_ba_save_restore_input(void *instance, enum msm_ba_save_restore_ip sr) inst->saved_input); rc = -EBUSY; } if (!ba_input) dprintk(BA_WARN, "Couldn't find input idx %d to save", inst->sd_input.index); } else { dprintk(BA_DBG, "Nothing to do in save and restore"); } Loading drivers/video/msm/ba/msm_ba_common.c +42 −29 Original line number Diff line number Diff line Loading @@ -20,15 +20,22 @@ #include "msm_ba_common.h" struct msm_ba_input_config msm_ba_inp_cfg[] = { /* type, index, name, adv inp, dev id, sd name, signal status */ {BA_INPUT_CVBS, 0, "CVBS-0", BA_IP_CVBS_0, 0, "adv7180", 1}, /* type, index, name, adv inp, dev id, sd name, dev node, input user type */ {BA_INPUT_CVBS, 0, "CVBS-0", BA_IP_CVBS_0, 0, "adv7180", -1, BA_INPUT_USERTYPE_KERNEL}, #ifdef CONFIG_MSM_S_PLATFORM {BA_INPUT_CVBS, 1, "CVBS-1", BA_IP_CVBS_0, 0, "adv7180", 1}, {BA_INPUT_CVBS, 1, "CVBS-1", BA_IP_CVBS_0, 0, "adv7180", 0, BA_INPUT_USERTYPE_USER}, #else {BA_INPUT_CVBS, 1, "CVBS-1", BA_IP_CVBS_0, 1, "adv7180", 1}, {BA_INPUT_CVBS, 2, "CVBS-2", BA_IP_CVBS_1, 1, "adv7180", 1}, {BA_INPUT_CVBS, 1, "CVBS-1", BA_IP_CVBS_0, 1, "adv7180", 0, BA_INPUT_USERTYPE_USER}, {BA_INPUT_CVBS, 2, "CVBS-2", BA_IP_CVBS_1, 1, "adv7180", 0, BA_INPUT_USERTYPE_USER}, #endif {BA_INPUT_HDMI, 1, "HDMI-1", BA_IP_HDMI_1, 2, "adv7481", 1}, {BA_INPUT_HDMI, 1, "HDMI-1", BA_IP_HDMI_1, 2, "adv7481", 2, BA_INPUT_USERTYPE_USER}, }; static struct msm_ba_ctrl msm_ba_ctrls[] = { Loading Loading @@ -82,7 +89,7 @@ struct msm_ba_dev *get_ba_dev(void) } void msm_ba_queue_v4l2_event(struct msm_ba_inst *inst, const struct v4l2_event *sd_event) struct v4l2_event *sd_event) { v4l2_event_queue_fh(&inst->event_handler, sd_event); wake_up(&inst->kernel_event_queue); Loading @@ -91,6 +98,10 @@ void msm_ba_queue_v4l2_event(struct msm_ba_inst *inst, static void msm_ba_print_event(struct v4l2_event *sd_event) { switch (sd_event->type) { case V4L2_EVENT_MSM_BA_PORT_SETTINGS_CHANGED: dprintk(BA_DBG, "Port settings changed for ip_idx %d", ((int *)sd_event->u.data)[0]); break; case V4L2_EVENT_MSM_BA_SIGNAL_IN_LOCK: dprintk(BA_DBG, "Signal in lock for ip_idx %d", ((int *)sd_event->u.data)[0]); Loading @@ -112,6 +123,11 @@ static void msm_ba_print_event(struct v4l2_event *sd_event) case V4L2_EVENT_MSM_BA_CP: dprintk(BA_DBG, "Content protection detected!"); break; case V4L2_EVENT_MSM_BA_CABLE_DETECT: dprintk(BA_DBG, "Cable detected: %d on ip_idx %d", ((int *)sd_event->u.data)[1], ((int *)sd_event->u.data)[0]); break; case V4L2_EVENT_MSM_BA_ERROR: dprintk(BA_DBG, "Subdev error %d!", ((int *)sd_event->u.data)[1]); Loading @@ -126,27 +142,18 @@ static void msm_ba_signal_sessions_event(struct v4l2_event *sd_event) { struct msm_ba_inst *inst = NULL; struct msm_ba_dev *dev_ctxt = NULL; unsigned int *ptr; uintptr_t arg; const struct v4l2_event event = { .id = 0, .type = sd_event->type, .u = sd_event->u}; int *ptr; msm_ba_print_event(sd_event); dev_ctxt = get_ba_dev(); ptr = (unsigned int *)sd_event->u.data; ptr = (int *)sd_event->u.data; list_for_each_entry(inst, &(dev_ctxt->instances), list) { if (inst->ext_ops && inst->ext_ops->msm_ba_cb) { arg = ptr[1]; if (inst->ext_ops && inst->ext_ops->msm_ba_cb) inst->ext_ops->msm_ba_cb( inst, sd_event->id, (void *)arg); } else { msm_ba_queue_v4l2_event(inst, &event); } inst, sd_event->id, (void *)&ptr[1]); else msm_ba_queue_v4l2_event(inst, sd_event); } } Loading Loading @@ -224,8 +231,11 @@ void msm_ba_add_inputs(struct v4l2_subdev *sd) sizeof(input->name)); input->bridge_chip_ip = msm_ba_inp_cfg[i].ba_ip; input->ba_out = msm_ba_inp_cfg[i].ba_out; input->ba_node_addr = msm_ba_inp_cfg[i].ba_node; input->ba_ip_idx = i; input->prio = V4L2_PRIORITY_DEFAULT; input->input_user_type = msm_ba_inp_cfg[i].input_user_type; input->sd = sd; rc = v4l2_subdev_call( sd, video, g_input_status, &status); Loading Loading @@ -582,7 +592,6 @@ int msm_ba_ctrl_init(struct msm_ba_inst *inst) } for (; idx < BA_NUM_CTRLS; idx++) { struct v4l2_ctrl *ctrl = NULL; if (BA_IS_PRIV_CTRL(msm_ba_ctrls[idx].id)) { /* add private control */ ctrl_cfg.def = msm_ba_ctrls[idx].default_value; Loading Loading @@ -620,12 +629,9 @@ int msm_ba_ctrl_init(struct msm_ba_inst *inst) } } switch (msm_ba_ctrls[idx].id) { case MSM_BA_PRIV_SD_NODE_ADDR: case MSM_BA_PRIV_FPS: if (ctrl) ctrl->flags |= msm_ba_ctrls[idx].flags; break; if (!ctrl) { dprintk(BA_ERR, "%s - invalid ctrl", __func__); return -EINVAL; } rc = inst->ctrl_handler.error; Loading @@ -637,6 +643,13 @@ int msm_ba_ctrl_init(struct msm_ba_inst *inst) return rc; } switch (msm_ba_ctrls[idx].id) { case MSM_BA_PRIV_SD_NODE_ADDR: case MSM_BA_PRIV_FPS: ctrl->flags |= msm_ba_ctrls[idx].flags; break; } inst->ctrls[idx] = ctrl; } Loading drivers/video/msm/ba/msm_ba_common.h +2 −2 Original line number Diff line number Diff line /* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-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 @@ -22,7 +22,7 @@ struct msm_ba_dev *get_ba_dev(void); void msm_ba_queue_v4l2_event(struct msm_ba_inst *inst, const struct v4l2_event *sd_event); struct v4l2_event *sd_event); struct v4l2_subdev *msm_ba_sd_find(const char *name); void msm_ba_add_inputs(struct v4l2_subdev *sd); void msm_ba_del_inputs(struct v4l2_subdev *sd); Loading drivers/video/msm/ba/msm_ba_internal.h +10 −1 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ enum ba_dev_state { BA_DEV_UNINIT = 0, BA_DEV_LOADED, BA_DEV_INIT, BA_DEV_INIT_DONE, BA_DEV_INVALID Loading Loading @@ -111,6 +112,12 @@ enum msm_ba_ip_type { BA_INPUT_MAX = 0xffffffff }; enum msm_ba_input_usr_type { BA_INPUT_USERTYPE_KERNEL = 0, BA_INPUT_USERTYPE_USER, BA_INPUT_USERTYPE_MAX = 0xffffffff }; struct msm_ba_input_config { enum msm_ba_ip_type inputType; unsigned int index; Loading @@ -118,7 +125,8 @@ struct msm_ba_input_config { int ba_ip; int ba_out; const char *sd_name; int signal_status; int ba_node; enum msm_ba_input_usr_type input_user_type; }; struct msm_ba_sd_event { Loading @@ -140,6 +148,7 @@ struct msm_ba_input { int in_use; int ba_out_in_use; enum v4l2_priority prio; enum msm_ba_input_usr_type input_user_type; }; struct msm_ba_dev { Loading drivers/video/msm/ba/msm_v4l2_ba.c +1 −1 Original line number Diff line number Diff line Loading @@ -436,7 +436,7 @@ static int msm_ba_remove(struct platform_device *pdev) dprintk(BA_INFO, "Enter %s", __func__); if (!pdev) { dprintk(BA_ERR, "%s invalid input %p", __func__, pdev); dprintk(BA_ERR, "%s invalid input 0x%p", __func__, pdev); rc = -EINVAL; } else { dev_ctxt = pdev->dev.platform_data; Loading Loading
drivers/video/msm/ba/msm_ba.c +136 −15 Original line number Diff line number Diff line Loading @@ -99,6 +99,8 @@ int msm_ba_s_priority(void *instance, enum v4l2_priority prio) struct msm_ba_input *ba_input = NULL; int rc = 0; dprintk(BA_DBG, "Enter %s, prio: %d", __func__, prio); if (!inst) return -EINVAL; Loading Loading @@ -174,15 +176,23 @@ int msm_ba_g_input(void *instance, unsigned int *index) if (!inst || !index) return -EINVAL; do { /* First find current input */ ba_input = msm_ba_find_input(inst->sd_input.index); if (ba_input) { if (V4L2_PRIORITY_RECORD == ba_input->prio && inst->input_prio != ba_input->prio) { if (BA_INPUT_USERTYPE_KERNEL == ba_input->input_user_type) { inst->sd_input.index++; continue; } break; } } while (ba_input); if (ba_input) *index = inst->sd_input.index; else rc = -ENOENT; return rc; } Loading Loading @@ -223,6 +233,10 @@ int msm_ba_s_input(void *instance, unsigned int index) ba_input->bridge_chip_ip); rc_sig = v4l2_subdev_call(ba_input->sd, video, s_stream, 0); if (rc_sig) dprintk(BA_ERR, "%s: Error in stream off. rc_sig %d", __func__, rc_sig); } } else { dprintk(BA_WARN, "Sd %d in use", ba_input->ba_out); Loading Loading @@ -252,7 +266,6 @@ int msm_ba_s_input(void *instance, unsigned int index) .id = 0, .type = V4L2_EVENT_MSM_BA_SIGNAL_IN_LOCK}; int *ptr = (int *)sd_event.u.data; ptr[0] = index; ptr[1] = ba_input->signal_status; msm_ba_queue_v4l2_event(inst, &sd_event); Loading Loading @@ -311,7 +324,6 @@ int msm_ba_s_output(void *instance, unsigned int index) dprintk(BA_ERR, "No sd registered"); return -EINVAL; } ba_input->ba_node_addr = index; ba_input->ba_out = index; inst->sd_output.index = index; inst->sd = ba_input->sd; Loading Loading @@ -380,9 +392,11 @@ int msm_ba_g_fmt(void *instance, struct v4l2_format *f) inst->sd_input.std = new_std; } else { rc = v4l2_subdev_call(sd, video, g_dv_timings, &sd_dv_timings); if (rc) if (rc) { dprintk(BA_ERR, "g_dv_timings failed %d for sd: %s", rc, sd->name); return -EINVAL; } } rc = v4l2_subdev_call(sd, video, g_mbus_fmt, &sd_mbus_fmt); Loading Loading @@ -503,6 +517,113 @@ int msm_ba_streamoff(void *instance, enum v4l2_buf_type i) } EXPORT_SYMBOL(msm_ba_streamoff); long msm_ba_private_ioctl(void *instance, int cmd, void *arg) { long rc = 0; struct msm_ba_inst *inst = instance; struct v4l2_subdev *sd = NULL; int *s_ioctl = arg; dprintk(BA_DBG, "Enter %s with command: 0x%x", __func__, cmd); if (!inst) return -EINVAL; switch (cmd) { case VIDIOC_HDMI_RX_CEC_S_LOGICAL: { dprintk(BA_DBG, "VIDIOC_HDMI_RX_CEC_S_LOGICAL"); sd = inst->sd; if (!sd) { dprintk(BA_ERR, "No sd registered"); return -EINVAL; } if (s_ioctl) { rc = v4l2_subdev_call(sd, core, ioctl, cmd, s_ioctl); if (rc) dprintk(BA_ERR, "%s failed: %ld on cmd: 0x%x", __func__, rc, cmd); } else { dprintk(BA_ERR, "%s: NULL argument provided", __func__); rc = -EINVAL; } } break; case VIDIOC_HDMI_RX_CEC_CLEAR_LOGICAL: { dprintk(BA_DBG, "VIDIOC_HDMI_RX_CEC_CLEAR_LOGICAL"); sd = inst->sd; if (!sd) { dprintk(BA_ERR, "No sd registered"); return -EINVAL; } rc = v4l2_subdev_call(sd, core, ioctl, cmd, s_ioctl); if (rc) dprintk(BA_ERR, "%s failed: %ld on cmd: 0x%x", __func__, rc, cmd); } break; case VIDIOC_HDMI_RX_CEC_G_PHYSICAL: { dprintk(BA_DBG, "VIDIOC_HDMI_RX_CEC_G_PHYSICAL"); sd = inst->sd; if (!sd) { dprintk(BA_ERR, "No sd registered"); return -EINVAL; } if (s_ioctl) { rc = v4l2_subdev_call(sd, core, ioctl, cmd, s_ioctl); if (rc) dprintk(BA_ERR, "%s failed: %ld on cmd: 0x%x", __func__, rc, cmd); } else { dprintk(BA_ERR, "%s: NULL argument provided", __func__); rc = -EINVAL; } } break; case VIDIOC_HDMI_RX_CEC_G_CONNECTED: { dprintk(BA_DBG, "VIDIOC_HDMI_RX_CEC_G_CONNECTED"); sd = inst->sd; if (!sd) { dprintk(BA_ERR, "No sd registered"); return -EINVAL; } if (s_ioctl) { rc = v4l2_subdev_call(sd, core, ioctl, cmd, s_ioctl); if (rc) dprintk(BA_ERR, "%s failed: %ld on cmd: 0x%x", __func__, rc, cmd); } else { dprintk(BA_ERR, "%s: NULL argument provided", __func__); rc = -EINVAL; } } break; case VIDIOC_HDMI_RX_CEC_S_ENABLE: { dprintk(BA_DBG, "VIDIOC_HDMI_RX_CEC_S_ENABLE"); sd = inst->sd; if (!sd) { dprintk(BA_ERR, "No sd registered"); return -EINVAL; } if (s_ioctl) { rc = v4l2_subdev_call(sd, core, ioctl, cmd, s_ioctl); if (rc) dprintk(BA_ERR, "%s failed: %ld on cmd: 0x%x", __func__, rc, cmd); } else { dprintk(BA_ERR, "%s: NULL argument provided", __func__); rc = -EINVAL; } } break; default: dprintk(BA_WARN, "Not a typewriter! Command: 0x%x", cmd); rc = -ENOTTY; break; } return rc; } EXPORT_SYMBOL(msm_ba_private_ioctl); int msm_ba_save_restore_input(void *instance, enum msm_ba_save_restore_ip sr) { struct msm_ba_inst *inst = instance; Loading Loading @@ -535,7 +656,10 @@ int msm_ba_save_restore_input(void *instance, enum msm_ba_save_restore_ip sr) rc = msm_ba_streamon(inst, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); } else if (BA_SR_SAVE_IP == sr) { ba_input = msm_ba_find_input(inst->sd_input.index); if (ba_input && ba_input->ba_out_in_use) { if (ba_input == NULL) { dprintk(BA_ERR, "Could not find input %d", inst->sd_input.index); } else if (ba_input->ba_out_in_use) { inst->restore = 1; inst->saved_input = msm_ba_find_ip_in_use_from_sd(inst->sd); Loading @@ -547,9 +671,6 @@ int msm_ba_save_restore_input(void *instance, enum msm_ba_save_restore_ip sr) inst->saved_input); rc = -EBUSY; } if (!ba_input) dprintk(BA_WARN, "Couldn't find input idx %d to save", inst->sd_input.index); } else { dprintk(BA_DBG, "Nothing to do in save and restore"); } Loading
drivers/video/msm/ba/msm_ba_common.c +42 −29 Original line number Diff line number Diff line Loading @@ -20,15 +20,22 @@ #include "msm_ba_common.h" struct msm_ba_input_config msm_ba_inp_cfg[] = { /* type, index, name, adv inp, dev id, sd name, signal status */ {BA_INPUT_CVBS, 0, "CVBS-0", BA_IP_CVBS_0, 0, "adv7180", 1}, /* type, index, name, adv inp, dev id, sd name, dev node, input user type */ {BA_INPUT_CVBS, 0, "CVBS-0", BA_IP_CVBS_0, 0, "adv7180", -1, BA_INPUT_USERTYPE_KERNEL}, #ifdef CONFIG_MSM_S_PLATFORM {BA_INPUT_CVBS, 1, "CVBS-1", BA_IP_CVBS_0, 0, "adv7180", 1}, {BA_INPUT_CVBS, 1, "CVBS-1", BA_IP_CVBS_0, 0, "adv7180", 0, BA_INPUT_USERTYPE_USER}, #else {BA_INPUT_CVBS, 1, "CVBS-1", BA_IP_CVBS_0, 1, "adv7180", 1}, {BA_INPUT_CVBS, 2, "CVBS-2", BA_IP_CVBS_1, 1, "adv7180", 1}, {BA_INPUT_CVBS, 1, "CVBS-1", BA_IP_CVBS_0, 1, "adv7180", 0, BA_INPUT_USERTYPE_USER}, {BA_INPUT_CVBS, 2, "CVBS-2", BA_IP_CVBS_1, 1, "adv7180", 0, BA_INPUT_USERTYPE_USER}, #endif {BA_INPUT_HDMI, 1, "HDMI-1", BA_IP_HDMI_1, 2, "adv7481", 1}, {BA_INPUT_HDMI, 1, "HDMI-1", BA_IP_HDMI_1, 2, "adv7481", 2, BA_INPUT_USERTYPE_USER}, }; static struct msm_ba_ctrl msm_ba_ctrls[] = { Loading Loading @@ -82,7 +89,7 @@ struct msm_ba_dev *get_ba_dev(void) } void msm_ba_queue_v4l2_event(struct msm_ba_inst *inst, const struct v4l2_event *sd_event) struct v4l2_event *sd_event) { v4l2_event_queue_fh(&inst->event_handler, sd_event); wake_up(&inst->kernel_event_queue); Loading @@ -91,6 +98,10 @@ void msm_ba_queue_v4l2_event(struct msm_ba_inst *inst, static void msm_ba_print_event(struct v4l2_event *sd_event) { switch (sd_event->type) { case V4L2_EVENT_MSM_BA_PORT_SETTINGS_CHANGED: dprintk(BA_DBG, "Port settings changed for ip_idx %d", ((int *)sd_event->u.data)[0]); break; case V4L2_EVENT_MSM_BA_SIGNAL_IN_LOCK: dprintk(BA_DBG, "Signal in lock for ip_idx %d", ((int *)sd_event->u.data)[0]); Loading @@ -112,6 +123,11 @@ static void msm_ba_print_event(struct v4l2_event *sd_event) case V4L2_EVENT_MSM_BA_CP: dprintk(BA_DBG, "Content protection detected!"); break; case V4L2_EVENT_MSM_BA_CABLE_DETECT: dprintk(BA_DBG, "Cable detected: %d on ip_idx %d", ((int *)sd_event->u.data)[1], ((int *)sd_event->u.data)[0]); break; case V4L2_EVENT_MSM_BA_ERROR: dprintk(BA_DBG, "Subdev error %d!", ((int *)sd_event->u.data)[1]); Loading @@ -126,27 +142,18 @@ static void msm_ba_signal_sessions_event(struct v4l2_event *sd_event) { struct msm_ba_inst *inst = NULL; struct msm_ba_dev *dev_ctxt = NULL; unsigned int *ptr; uintptr_t arg; const struct v4l2_event event = { .id = 0, .type = sd_event->type, .u = sd_event->u}; int *ptr; msm_ba_print_event(sd_event); dev_ctxt = get_ba_dev(); ptr = (unsigned int *)sd_event->u.data; ptr = (int *)sd_event->u.data; list_for_each_entry(inst, &(dev_ctxt->instances), list) { if (inst->ext_ops && inst->ext_ops->msm_ba_cb) { arg = ptr[1]; if (inst->ext_ops && inst->ext_ops->msm_ba_cb) inst->ext_ops->msm_ba_cb( inst, sd_event->id, (void *)arg); } else { msm_ba_queue_v4l2_event(inst, &event); } inst, sd_event->id, (void *)&ptr[1]); else msm_ba_queue_v4l2_event(inst, sd_event); } } Loading Loading @@ -224,8 +231,11 @@ void msm_ba_add_inputs(struct v4l2_subdev *sd) sizeof(input->name)); input->bridge_chip_ip = msm_ba_inp_cfg[i].ba_ip; input->ba_out = msm_ba_inp_cfg[i].ba_out; input->ba_node_addr = msm_ba_inp_cfg[i].ba_node; input->ba_ip_idx = i; input->prio = V4L2_PRIORITY_DEFAULT; input->input_user_type = msm_ba_inp_cfg[i].input_user_type; input->sd = sd; rc = v4l2_subdev_call( sd, video, g_input_status, &status); Loading Loading @@ -582,7 +592,6 @@ int msm_ba_ctrl_init(struct msm_ba_inst *inst) } for (; idx < BA_NUM_CTRLS; idx++) { struct v4l2_ctrl *ctrl = NULL; if (BA_IS_PRIV_CTRL(msm_ba_ctrls[idx].id)) { /* add private control */ ctrl_cfg.def = msm_ba_ctrls[idx].default_value; Loading Loading @@ -620,12 +629,9 @@ int msm_ba_ctrl_init(struct msm_ba_inst *inst) } } switch (msm_ba_ctrls[idx].id) { case MSM_BA_PRIV_SD_NODE_ADDR: case MSM_BA_PRIV_FPS: if (ctrl) ctrl->flags |= msm_ba_ctrls[idx].flags; break; if (!ctrl) { dprintk(BA_ERR, "%s - invalid ctrl", __func__); return -EINVAL; } rc = inst->ctrl_handler.error; Loading @@ -637,6 +643,13 @@ int msm_ba_ctrl_init(struct msm_ba_inst *inst) return rc; } switch (msm_ba_ctrls[idx].id) { case MSM_BA_PRIV_SD_NODE_ADDR: case MSM_BA_PRIV_FPS: ctrl->flags |= msm_ba_ctrls[idx].flags; break; } inst->ctrls[idx] = ctrl; } Loading
drivers/video/msm/ba/msm_ba_common.h +2 −2 Original line number Diff line number Diff line /* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. /* Copyright (c) 2012-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 @@ -22,7 +22,7 @@ struct msm_ba_dev *get_ba_dev(void); void msm_ba_queue_v4l2_event(struct msm_ba_inst *inst, const struct v4l2_event *sd_event); struct v4l2_event *sd_event); struct v4l2_subdev *msm_ba_sd_find(const char *name); void msm_ba_add_inputs(struct v4l2_subdev *sd); void msm_ba_del_inputs(struct v4l2_subdev *sd); Loading
drivers/video/msm/ba/msm_ba_internal.h +10 −1 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ enum ba_dev_state { BA_DEV_UNINIT = 0, BA_DEV_LOADED, BA_DEV_INIT, BA_DEV_INIT_DONE, BA_DEV_INVALID Loading Loading @@ -111,6 +112,12 @@ enum msm_ba_ip_type { BA_INPUT_MAX = 0xffffffff }; enum msm_ba_input_usr_type { BA_INPUT_USERTYPE_KERNEL = 0, BA_INPUT_USERTYPE_USER, BA_INPUT_USERTYPE_MAX = 0xffffffff }; struct msm_ba_input_config { enum msm_ba_ip_type inputType; unsigned int index; Loading @@ -118,7 +125,8 @@ struct msm_ba_input_config { int ba_ip; int ba_out; const char *sd_name; int signal_status; int ba_node; enum msm_ba_input_usr_type input_user_type; }; struct msm_ba_sd_event { Loading @@ -140,6 +148,7 @@ struct msm_ba_input { int in_use; int ba_out_in_use; enum v4l2_priority prio; enum msm_ba_input_usr_type input_user_type; }; struct msm_ba_dev { Loading
drivers/video/msm/ba/msm_v4l2_ba.c +1 −1 Original line number Diff line number Diff line Loading @@ -436,7 +436,7 @@ static int msm_ba_remove(struct platform_device *pdev) dprintk(BA_INFO, "Enter %s", __func__); if (!pdev) { dprintk(BA_ERR, "%s invalid input %p", __func__, pdev); dprintk(BA_ERR, "%s invalid input 0x%p", __func__, pdev); rc = -EINVAL; } else { dev_ctxt = pdev->dev.platform_data; Loading