static long msm_csid_subdev_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) { int rc = -ENOIOCTLCMD; struct csid_cfg_params cfg_params; struct csid_device *csid_dev = v4l2_get_subdevdata(sd); mutex_lock(&csid_dev->mutex); switch (cmd) { case VIDIOC_MSM_CSID_CFG: cfg_params.subdev = sd; cfg_params.parms = arg; rc = msm_csid_config((struct csid_cfg_params *)&cfg_params); break; case VIDIOC_MSM_CSID_INIT: rc = msm_csid_init(sd, (uint32_t *)arg); break; case VIDIOC_MSM_CSID_RELEASE: rc = msm_csid_release(sd); break; default: pr_err("%s: command not found\n", __func__); } mutex_unlock(&csid_dev->mutex); return rc; }
static long msm_csid_subdev_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) { struct csid_cfg_params cfg_params; switch (cmd) { case VIDIOC_MSM_CSID_CFG: cfg_params.subdev = sd; cfg_params.parms = arg; return msm_csid_config((struct csid_cfg_params *)&cfg_params); case VIDIOC_MSM_CSID_INIT: return msm_csid_init(sd, (uint32_t *)arg); case VIDIOC_MSM_CSID_RELEASE: return msm_csid_release(sd); default: return -ENOIOCTLCMD; } }
static long msm_csid_cmd(struct csid_device *csid_dev, void *arg) { int rc = 0; struct csid_cfg_data *cdata = (struct csid_cfg_data *)arg; if (!csid_dev || !cdata) { pr_err("%s:%d csid_dev %p, cdata %p\n", __func__, __LINE__, csid_dev, cdata); return -EINVAL; } CDBG("%s cfgtype = %d\n", __func__, cdata->cfgtype); switch (cdata->cfgtype) { case CSID_INIT: rc = msm_csid_init(csid_dev, &cdata->cfg.csid_version); CDBG("%s csid version %x\n", __func__, cdata->cfg.csid_version); break; case CSID_CFG: { struct msm_camera_csid_params csid_params; struct msm_camera_csid_vc_cfg *vc_cfg = NULL; int32_t i = 0; if (copy_from_user(&csid_params, (void *)cdata->cfg.csid_params, sizeof(struct msm_camera_csid_params))) { pr_err("%s: %d failed\n", __func__, __LINE__); rc = -EFAULT; break; } for (i = 0; i < csid_params.lut_params.num_cid; i++) { vc_cfg = kzalloc(csid_params.lut_params.num_cid * sizeof(struct msm_camera_csid_vc_cfg), GFP_KERNEL); if (!vc_cfg) { pr_err("%s: %d failed\n", __func__, __LINE__); for (i--; i >= 0; i--) kfree(csid_params.lut_params.vc_cfg[i]); rc = -ENOMEM; break; } if (copy_from_user(vc_cfg, (void *)csid_params.lut_params.vc_cfg[i], (csid_params.lut_params.num_cid * sizeof(struct msm_camera_csid_vc_cfg)))) { pr_err("%s: %d failed\n", __func__, __LINE__); kfree(vc_cfg); for (i--; i >= 0; i--) kfree(csid_params.lut_params.vc_cfg[i]); rc = -EFAULT; break; } csid_params.lut_params.vc_cfg[i] = vc_cfg; } rc = msm_csid_config(csid_dev, &csid_params); for (i--; i >= 0; i--) kfree(csid_params.lut_params.vc_cfg[i]); break; } case CSID_RELEASE: rc = msm_csid_release(csid_dev); break; default: pr_err("%s: %d failed\n", __func__, __LINE__); rc = -ENOIOCTLCMD; break; } return rc; }
static long msm_csid_cmd(struct csid_device *csid_dev, void *arg) { int rc = 0; struct csid_cfg_data cdata; if (!csid_dev) { pr_err("%s:%d csid_dev NULL\n", __func__, __LINE__); return -EINVAL; } if (copy_from_user(&cdata, (void *)arg, sizeof(struct csid_cfg_data))) { pr_err("%s: %d failed\n", __func__, __LINE__); return -EFAULT; } CDBG("%s cfgtype = %d\n", __func__, cdata.cfgtype); switch (cdata.cfgtype) { case CSID_INIT: rc = msm_csid_init(csid_dev, &cdata.cfg.csid_version, 0); if (copy_to_user((void *)arg, &cdata, sizeof(struct csid_cfg_data))) { pr_err("%s: %d failed\n", __func__, __LINE__); rc = -EFAULT; } break; case CSID_CFG: { struct msm_camera_csid_params csid_params; struct msm_camera_csid_vc_cfg *vc_cfg = NULL; if (csid_dev->reserved_adp) { pr_err("CSID is reserved!"); return -EBUSY; } if (copy_from_user(&csid_params, (void *)cdata.cfg.csid_params, sizeof(struct msm_camera_csid_params))) { pr_err("%s: %d failed\n", __func__, __LINE__); rc = -EFAULT; break; } if (csid_params.lut_params.num_cid < 1 || csid_params.lut_params.num_cid > 16) { pr_err("%s: %d num_cid outside range\n", __func__, __LINE__); rc = -EINVAL; break; } vc_cfg = kzalloc(csid_params.lut_params.num_cid * sizeof(struct msm_camera_csid_vc_cfg), GFP_KERNEL); if (!vc_cfg) { pr_err("%s: %d failed\n", __func__, __LINE__); rc = -ENOMEM; break; } if (copy_from_user(vc_cfg, (void *)csid_params.lut_params.vc_cfg, (csid_params.lut_params.num_cid * sizeof(struct msm_camera_csid_vc_cfg)))) { pr_err("%s: %d failed\n", __func__, __LINE__); kfree(vc_cfg); rc = -EFAULT; break; } csid_params.lut_params.vc_cfg = vc_cfg; rc = msm_csid_config(csid_dev, &csid_params); kfree(vc_cfg); break; } default: pr_err("%s: %d failed\n", __func__, __LINE__); rc = -ENOIOCTLCMD; break; } return rc; }
static long msm_csid_cmd(struct csid_device *csid_dev, void *arg) { int rc = 0; struct csid_cfg_data *cdata = (struct csid_cfg_data *)arg; if (!csid_dev || !cdata) { pr_err("%s:%d csid_dev %p, cdata %p\n", __func__, __LINE__, csid_dev, cdata); return -EINVAL; } CDBG("%s cfgtype = %d\n", __func__, cdata->cfgtype); switch (cdata->cfgtype) { case CSID_INIT: rc = msm_csid_init(csid_dev, &cdata->cfg.csid_version); #ifdef CONFIG_HUAWEI_KERNEL_CAMERA read_times = HW_PRINT_PACKET_NUM_TIME; schedule_delayed_work(&csid_dev->packet_num_work, msecs_to_jiffies(HW_FIRST_DELAY_TIME)); pr_info("%s CSID_INIT csid version %x, mem_start=%x\n", __func__,cdata->cfg.csid_version, csid_dev->mem->start); #endif break; case CSID_CFG: { struct msm_camera_csid_params csid_params; struct msm_camera_csid_vc_cfg *vc_cfg = NULL; int8_t i = 0; if (copy_from_user(&csid_params, (void *)cdata->cfg.csid_params, sizeof(struct msm_camera_csid_params))) { pr_err("%s: %d failed\n", __func__, __LINE__); rc = -EFAULT; break; } if (csid_params.lut_params.num_cid < 1 || csid_params.lut_params.num_cid > 16) { pr_err("%s: %d num_cid outside range\n", __func__, __LINE__); rc = -EINVAL; break; } for (i = 0; i < csid_params.lut_params.num_cid; i++) { vc_cfg = kzalloc(csid_params.lut_params.num_cid * sizeof(struct msm_camera_csid_vc_cfg), GFP_KERNEL); if (!vc_cfg) { pr_err("%s: %d failed\n", __func__, __LINE__); for (i--; i >= 0; i--) kfree(csid_params.lut_params.vc_cfg[i]); rc = -ENOMEM; break; } if (copy_from_user(vc_cfg, (void *)csid_params.lut_params.vc_cfg[i], (csid_params.lut_params.num_cid * sizeof(struct msm_camera_csid_vc_cfg)))) { pr_err("%s: %d failed\n", __func__, __LINE__); kfree(vc_cfg); for (i--; i >= 0; i--) kfree(csid_params.lut_params.vc_cfg[i]); rc = -EFAULT; break; } csid_params.lut_params.vc_cfg[i] = vc_cfg; } rc = msm_csid_config(csid_dev, &csid_params); for (i--; i >= 0; i--) kfree(csid_params.lut_params.vc_cfg[i]); break; } case CSID_RELEASE: #ifdef CONFIG_HUAWEI_KERNEL_CAMERA read_times = 0; cancel_delayed_work_sync(&csid_dev->packet_num_work); rc = msm_csid_release(csid_dev); pr_info("%s: CSID_RELEASE\n",__func__); #endif break; default: pr_err("%s: %d failed\n", __func__, __LINE__); rc = -ENOIOCTLCMD; break; } return rc; }
static int32_t msm_csid_cmd32(struct csid_device *csid_dev, void __user *arg) { int rc = 0; struct csid_cfg_data *cdata; struct csid_cfg_data32 *arg32 = (struct csid_cfg_data32 *) (arg); struct csid_cfg_data local_arg; local_arg.cfgtype = arg32->cfgtype; cdata = &local_arg; if (!csid_dev || !cdata) { pr_err("%s:%d csid_dev %p, cdata %p\n", __func__, __LINE__, csid_dev, cdata); return -EINVAL; } CDBG("%s cfgtype = %d\n", __func__, cdata->cfgtype); switch (cdata->cfgtype) { case CSID_INIT: rc = msm_csid_init(csid_dev, &cdata->cfg.csid_version); arg32->cfg.csid_version = local_arg.cfg.csid_version; CDBG("%s csid version 0x%x\n", __func__, cdata->cfg.csid_version); break; case CSID_CFG: { struct msm_camera_csid_params csid_params; struct msm_camera_csid_vc_cfg *vc_cfg = NULL; int8_t i = 0; struct msm_camera_csid_lut_params32 lut_par32; struct msm_camera_csid_params32 csid_params32; struct msm_camera_csid_vc_cfg vc_cfg32; if (copy_from_user(&csid_params32, (void *)compat_ptr(arg32->cfg.csid_params), sizeof(struct msm_camera_csid_params32))) { pr_err("%s: %d failed\n", __func__, __LINE__); rc = -EFAULT; break; } csid_params.lane_cnt = csid_params32.lane_cnt; csid_params.lane_assign = csid_params32.lane_assign; csid_params.phy_sel = csid_params32.phy_sel; csid_params.csi_clk = csid_params32.csi_clk; lut_par32 = csid_params32.lut_params; csid_params.lut_params.num_cid = lut_par32.num_cid; if (csid_params.lut_params.num_cid < 1 || csid_params.lut_params.num_cid > 16) { pr_err("%s: %d num_cid outside range\n", __func__, __LINE__); rc = -EINVAL; break; } for (i = 0; i < lut_par32.num_cid; i++) { vc_cfg = kzalloc(sizeof(struct msm_camera_csid_vc_cfg), GFP_KERNEL); if (!vc_cfg) { pr_err("%s: %d failed\n", __func__, __LINE__); for (i--; i >= 0; i--) kfree(csid_params.lut_params.vc_cfg[i]); rc = -ENOMEM; break; } /* msm_camera_csid_vc_cfg size * does not change in COMPAT MODE */ if (copy_from_user(&vc_cfg32, (void *)compat_ptr(lut_par32.vc_cfg[i]), sizeof(vc_cfg32))) { pr_err("%s: %d failed\n", __func__, __LINE__); for (; i >= 0; i--) kfree(csid_params.lut_params.vc_cfg[i]); rc = -EFAULT; break; } vc_cfg->cid = vc_cfg32.cid; vc_cfg->dt = vc_cfg32.dt; vc_cfg->decode_format = vc_cfg32.decode_format; csid_params.lut_params.vc_cfg[i] = vc_cfg; } if (rc < 0) break; rc = msm_csid_config(csid_dev, &csid_params); for (i--; i >= 0; i--) kfree(csid_params.lut_params.vc_cfg[i]); break; } case CSID_RELEASE: rc = msm_csid_release(csid_dev); break; default: pr_err("%s: %d failed\n", __func__, __LINE__); rc = -ENOIOCTLCMD; break; } return rc; }