Lines Matching refs:isc
25 #include <linux/atmel-isc-media.h>
36 #include "atmel-isc-regs.h"
37 #include "atmel-isc.h"
228 static inline void isc_update_v4l2_ctrls(struct isc_device *isc)
230 struct isc_ctrls *ctrls = &isc->ctrls;
233 v4l2_ctrl_s_ctrl(isc->r_gain_ctrl, ctrls->gain[ISC_HIS_CFG_MODE_R]);
234 v4l2_ctrl_s_ctrl(isc->b_gain_ctrl, ctrls->gain[ISC_HIS_CFG_MODE_B]);
235 v4l2_ctrl_s_ctrl(isc->gr_gain_ctrl, ctrls->gain[ISC_HIS_CFG_MODE_GR]);
236 v4l2_ctrl_s_ctrl(isc->gb_gain_ctrl, ctrls->gain[ISC_HIS_CFG_MODE_GB]);
238 v4l2_ctrl_s_ctrl(isc->r_off_ctrl, ctrls->offset[ISC_HIS_CFG_MODE_R]);
239 v4l2_ctrl_s_ctrl(isc->b_off_ctrl, ctrls->offset[ISC_HIS_CFG_MODE_B]);
240 v4l2_ctrl_s_ctrl(isc->gr_off_ctrl, ctrls->offset[ISC_HIS_CFG_MODE_GR]);
241 v4l2_ctrl_s_ctrl(isc->gb_off_ctrl, ctrls->offset[ISC_HIS_CFG_MODE_GB]);
244 static inline void isc_update_awb_ctrls(struct isc_device *isc)
246 struct isc_ctrls *ctrls = &isc->ctrls;
250 regmap_write(isc->regmap, ISC_WB_O_RGR,
253 regmap_write(isc->regmap, ISC_WB_O_BGB,
256 regmap_write(isc->regmap, ISC_WB_G_RGR,
259 regmap_write(isc->regmap, ISC_WB_G_BGB,
264 static inline void isc_reset_awb_ctrls(struct isc_device *isc)
270 isc->ctrls.gain[c] = 1 << 9;
272 isc->ctrls.offset[c] = 0;
483 static int isc_clk_register(struct isc_device *isc, unsigned int id)
485 struct regmap *regmap = isc->regmap;
486 struct device_node *np = isc->dev->of_node;
505 clk_name = "isc-ispck";
513 isc_clk = &isc->isc_clks[id];
517 isc_clk->dev = isc->dev;
520 isc_clk->clk = clk_register(isc->dev, &isc_clk->hw);
522 dev_err(isc->dev, "%s: clock register fail\n", clk_name);
530 int isc_clk_init(struct isc_device *isc)
535 for (i = 0; i < ARRAY_SIZE(isc->isc_clks); i++)
536 isc->isc_clks[i].clk = ERR_PTR(-EINVAL);
538 for (i = 0; i < ARRAY_SIZE(isc->isc_clks); i++) {
539 ret = isc_clk_register(isc, i);
547 void isc_clk_cleanup(struct isc_device *isc)
551 of_clk_del_provider(isc->dev->of_node);
553 for (i = 0; i < ARRAY_SIZE(isc->isc_clks); i++) {
554 struct isc_clk *isc_clk = &isc->isc_clks[i];
565 struct isc_device *isc = vb2_get_drv_priv(vq);
566 unsigned int size = isc->fmt.fmt.pix.sizeimage;
580 struct isc_device *isc = vb2_get_drv_priv(vb->vb2_queue);
581 unsigned long size = isc->fmt.fmt.pix.sizeimage;
584 v4l2_err(&isc->v4l2_dev, "buffer too small (%lu < %lu)\n",
591 vbuf->field = isc->fmt.fmt.pix.field;
596 static void isc_start_dma(struct isc_device *isc)
598 struct regmap *regmap = isc->regmap;
599 u32 sizeimage = isc->fmt.fmt.pix.sizeimage;
604 h = isc->fmt.fmt.pix.height;
605 w = isc->fmt.fmt.pix.width;
613 if (!ISC_IS_FORMAT_RAW(isc->config.sd_format->mbus_code)) {
637 addr0 = vb2_dma_contig_plane_dma_addr(&isc->cur_frm->vb.vb2_buf, 0);
640 switch (isc->config.fourcc) {
653 dctrl_dview = isc->config.dctrl_dview;
656 spin_lock(&isc->awb_lock);
658 spin_unlock(&isc->awb_lock);
661 static void isc_set_pipeline(struct isc_device *isc, u32 pipeline)
663 struct regmap *regmap = isc->regmap;
664 struct isc_ctrls *ctrls = &isc->ctrls;
672 regmap_field_write(isc->pipeline[i], val);
678 bay_cfg = isc->config.sd_format->cfa_baycfg;
681 isc_update_awb_ctrls(isc);
682 isc_update_v4l2_ctrls(isc);
703 static int isc_update_profile(struct isc_device *isc)
705 struct regmap *regmap = isc->regmap;
718 v4l2_warn(&isc->v4l2_dev, "Time out to update profile\n");
725 static void isc_set_histogram(struct isc_device *isc, bool enable)
727 struct regmap *regmap = isc->regmap;
728 struct isc_ctrls *ctrls = &isc->ctrls;
733 (isc->config.sd_format->cfa_baycfg
739 isc_update_profile(isc);
751 static int isc_configure(struct isc_device *isc)
753 struct regmap *regmap = isc->regmap;
755 struct isc_subdev_entity *subdev = isc->current_subdev;
757 pfe_cfg0 = isc->config.sd_format->pfe_cfg0_bps;
758 rlp_mode = isc->config.rlp_cfg_mode;
759 pipeline = isc->config.bits_pipeline;
761 dcfg = isc->config.dcfg_imode |
778 isc_set_pipeline(isc, pipeline);
784 if (isc->ctrls.awb &&
785 ISC_IS_FORMAT_RAW(isc->config.sd_format->mbus_code))
786 isc_set_histogram(isc, true);
788 isc_set_histogram(isc, false);
791 return isc_update_profile(isc);
796 struct isc_device *isc = vb2_get_drv_priv(vq);
797 struct regmap *regmap = isc->regmap;
803 ret = v4l2_subdev_call(isc->current_subdev->sd, video, s_stream, 1);
805 v4l2_err(&isc->v4l2_dev, "stream on failed in subdev %d\n",
810 pm_runtime_get_sync(isc->dev);
812 ret = isc_configure(isc);
819 spin_lock_irqsave(&isc->dma_queue_lock, flags);
821 isc->sequence = 0;
822 isc->stop = false;
823 reinit_completion(&isc->comp);
825 isc->cur_frm = list_first_entry(&isc->dma_queue,
827 list_del(&isc->cur_frm->list);
829 isc_start_dma(isc);
831 spin_unlock_irqrestore(&isc->dma_queue_lock, flags);
834 if (ISC_IS_FORMAT_RAW(isc->config.sd_format->mbus_code))
835 v4l2_ctrl_activate(isc->do_wb_ctrl, true);
840 pm_runtime_put_sync(isc->dev);
842 v4l2_subdev_call(isc->current_subdev->sd, video, s_stream, 0);
845 spin_lock_irqsave(&isc->dma_queue_lock, flags);
846 list_for_each_entry(buf, &isc->dma_queue, list)
848 INIT_LIST_HEAD(&isc->dma_queue);
849 spin_unlock_irqrestore(&isc->dma_queue_lock, flags);
856 struct isc_device *isc = vb2_get_drv_priv(vq);
861 v4l2_ctrl_activate(isc->do_wb_ctrl, false);
863 isc->stop = true;
866 if (isc->cur_frm && !wait_for_completion_timeout(&isc->comp, 5 * HZ))
867 v4l2_err(&isc->v4l2_dev,
871 regmap_write(isc->regmap, ISC_INTDIS, ISC_INT_DDONE);
873 pm_runtime_put_sync(isc->dev);
876 ret = v4l2_subdev_call(isc->current_subdev->sd, video, s_stream, 0);
878 v4l2_err(&isc->v4l2_dev, "stream off failed in subdev\n");
881 spin_lock_irqsave(&isc->dma_queue_lock, flags);
882 if (unlikely(isc->cur_frm)) {
883 vb2_buffer_done(&isc->cur_frm->vb.vb2_buf,
885 isc->cur_frm = NULL;
887 list_for_each_entry(buf, &isc->dma_queue, list)
889 INIT_LIST_HEAD(&isc->dma_queue);
890 spin_unlock_irqrestore(&isc->dma_queue_lock, flags);
897 struct isc_device *isc = vb2_get_drv_priv(vb->vb2_queue);
900 spin_lock_irqsave(&isc->dma_queue_lock, flags);
901 if (!isc->cur_frm && list_empty(&isc->dma_queue) &&
903 isc->cur_frm = buf;
904 isc_start_dma(isc);
906 list_add_tail(&buf->list, &isc->dma_queue);
907 spin_unlock_irqrestore(&isc->dma_queue_lock, flags);
910 static struct isc_format *find_format_by_fourcc(struct isc_device *isc,
913 unsigned int num_formats = isc->num_user_formats;
918 fmt = isc->user_formats[i];
939 struct isc_device *isc = video_drvdata(file);
944 "platform:%s", isc->v4l2_dev.name);
982 struct isc_device *isc = video_drvdata(file);
984 *fmt = isc->fmt;
993 static int isc_try_validate_formats(struct isc_device *isc)
999 switch (isc->try_config.fourcc) {
1040 v4l2_dbg(1, debug, &isc->v4l2_dev,
1045 if ((bayer) && !ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code))
1049 if (grey && !ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code) &&
1050 !ISC_IS_FORMAT_GREY(isc->try_config.sd_format->mbus_code))
1061 static int isc_try_configure_rlp_dma(struct isc_device *isc, bool direct_dump)
1063 switch (isc->try_config.fourcc) {
1068 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_DAT8;
1069 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED8;
1070 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1071 isc->try_config.bpp = 8;
1077 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_DAT10;
1078 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED16;
1079 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1080 isc->try_config.bpp = 16;
1086 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_DAT12;
1087 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED16;
1088 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1089 isc->try_config.bpp = 16;
1092 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_RGB565;
1093 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED16;
1094 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1095 isc->try_config.bpp = 16;
1098 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_ARGB444;
1099 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED16;
1100 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1101 isc->try_config.bpp = 16;
1104 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_ARGB555;
1105 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED16;
1106 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1107 isc->try_config.bpp = 16;
1111 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_ARGB32;
1112 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED32;
1113 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1114 isc->try_config.bpp = 32;
1117 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_YYCC;
1118 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_YC420P;
1119 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PLANAR;
1120 isc->try_config.bpp = 12;
1123 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_YYCC;
1124 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_YC422P;
1125 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PLANAR;
1126 isc->try_config.bpp = 16;
1129 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_YYCC;
1130 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED32;
1131 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1132 isc->try_config.bpp = 16;
1135 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_DATY8;
1136 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED8;
1137 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1138 isc->try_config.bpp = 8;
1141 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_DATY10;
1142 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED16;
1143 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1144 isc->try_config.bpp = 16;
1151 isc->try_config.rlp_cfg_mode = ISC_RLP_CFG_MODE_DAT8;
1152 isc->try_config.dcfg_imode = ISC_DCFG_IMODE_PACKED8;
1153 isc->try_config.dctrl_dview = ISC_DCTRL_DVIEW_PACKED;
1164 static int isc_try_configure_pipeline(struct isc_device *isc)
1166 switch (isc->try_config.fourcc) {
1173 if (ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code)) {
1174 isc->try_config.bits_pipeline = CFA_ENABLE |
1177 isc->try_config.bits_pipeline = 0x0;
1182 if (ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code)) {
1183 isc->try_config.bits_pipeline = CFA_ENABLE |
1187 isc->try_config.bits_pipeline = 0x0;
1192 if (ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code)) {
1193 isc->try_config.bits_pipeline = CFA_ENABLE |
1197 isc->try_config.bits_pipeline = 0x0;
1202 if (ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code)) {
1203 isc->try_config.bits_pipeline = CFA_ENABLE |
1207 isc->try_config.bits_pipeline = 0x0;
1211 if (ISC_IS_FORMAT_RAW(isc->try_config.sd_format->mbus_code)) {
1213 isc->try_config.bits_pipeline = CFA_ENABLE |
1217 isc->try_config.bits_pipeline = 0x0;
1221 isc->try_config.bits_pipeline = 0x0;
1226 static void isc_try_fse(struct isc_device *isc,
1236 if (!isc->try_config.sd_format)
1239 fse.code = isc->try_config.sd_format->mbus_code;
1242 ret = v4l2_subdev_call(isc->current_subdev->sd, pad, enum_frame_size,
1257 static int isc_try_fmt(struct isc_device *isc, struct v4l2_format *f,
1275 for (i = 0; i < isc->num_user_formats; i++) {
1276 if (ISC_IS_FORMAT_RAW(isc->user_formats[i]->mbus_code)) {
1277 sd_fmt = isc->user_formats[i];
1284 direct_fmt = find_format_by_fourcc(isc, pixfmt->pixelformat);
1307 sd_fmt = isc->user_formats[isc->num_user_formats - 1];
1308 v4l2_dbg(1, debug, &isc->v4l2_dev,
1319 v4l2_dbg(1, debug, &isc->v4l2_dev,
1324 isc->try_config.sd_format = sd_fmt;
1342 isc->try_config.fourcc = pixfmt->pixelformat;
1344 if (isc_try_validate_formats(isc)) {
1345 pixfmt->pixelformat = isc->try_config.fourcc = sd_fmt->fourcc;
1347 ret = isc_try_validate_formats(isc);
1352 ret = isc_try_configure_rlp_dma(isc, rlp_dma_direct_dump);
1356 ret = isc_try_configure_pipeline(isc);
1361 isc_try_fse(isc, &pad_cfg);
1364 ret = v4l2_subdev_call(isc->current_subdev->sd, pad, set_fmt,
1372 pixfmt->bytesperline = (pixfmt->width * isc->try_config.bpp) >> 3;
1381 v4l2_err(&isc->v4l2_dev, "Could not find any possible format for a working pipeline\n");
1383 memset(&isc->try_config, 0, sizeof(isc->try_config));
1388 static int isc_set_fmt(struct isc_device *isc, struct v4l2_format *f)
1396 ret = isc_try_fmt(isc, f, &mbus_code);
1401 ret = v4l2_subdev_call(isc->current_subdev->sd, pad,
1406 isc->fmt = *f;
1408 if (isc->try_config.sd_format && isc->config.sd_format &&
1409 isc->try_config.sd_format != isc->config.sd_format) {
1410 isc->ctrls.hist_stat = HIST_INIT;
1411 isc_reset_awb_ctrls(isc);
1412 isc_update_v4l2_ctrls(isc);
1415 isc->config = isc->try_config;
1417 v4l2_dbg(1, debug, &isc->v4l2_dev, "New ISC configuration in place\n");
1425 struct isc_device *isc = video_drvdata(file);
1427 if (vb2_is_streaming(&isc->vb2_vidq))
1430 return isc_set_fmt(isc, f);
1436 struct isc_device *isc = video_drvdata(file);
1438 return isc_try_fmt(isc, f, NULL);
1471 struct isc_device *isc = video_drvdata(file);
1473 return v4l2_g_parm_cap(video_devdata(file), isc->current_subdev->sd, a);
1478 struct isc_device *isc = video_drvdata(file);
1480 return v4l2_s_parm_cap(video_devdata(file), isc->current_subdev->sd, a);
1486 struct isc_device *isc = video_drvdata(file);
1488 .code = isc->config.sd_format->mbus_code,
1495 for (i = 0; i < isc->num_user_formats; i++)
1496 if (isc->user_formats[i]->fourcc == fsize->pixel_format)
1506 ret = v4l2_subdev_call(isc->current_subdev->sd, pad, enum_frame_size,
1521 struct isc_device *isc = video_drvdata(file);
1523 .code = isc->config.sd_format->mbus_code,
1532 for (i = 0; i < isc->num_user_formats; i++)
1533 if (isc->user_formats[i]->fourcc == fival->pixel_format)
1543 ret = v4l2_subdev_call(isc->current_subdev->sd, pad,
1587 struct isc_device *isc = video_drvdata(file);
1588 struct v4l2_subdev *sd = isc->current_subdev->sd;
1591 if (mutex_lock_interruptible(&isc->lock))
1607 ret = isc_set_fmt(isc, &isc->fmt);
1614 mutex_unlock(&isc->lock);
1620 struct isc_device *isc = video_drvdata(file);
1621 struct v4l2_subdev *sd = isc->current_subdev->sd;
1625 mutex_lock(&isc->lock);
1634 mutex_unlock(&isc->lock);
1651 struct isc_device *isc = (struct isc_device *)dev_id;
1652 struct regmap *regmap = isc->regmap;
1662 spin_lock(&isc->dma_queue_lock);
1663 if (isc->cur_frm) {
1664 struct vb2_v4l2_buffer *vbuf = &isc->cur_frm->vb;
1668 vbuf->sequence = isc->sequence++;
1670 isc->cur_frm = NULL;
1673 if (!list_empty(&isc->dma_queue) && !isc->stop) {
1674 isc->cur_frm = list_first_entry(&isc->dma_queue,
1676 list_del(&isc->cur_frm->list);
1678 isc_start_dma(isc);
1681 if (isc->stop)
1682 complete(&isc->comp);
1685 spin_unlock(&isc->dma_queue_lock);
1689 schedule_work(&isc->awb_work);
1696 static void isc_hist_count(struct isc_device *isc, u32 *min, u32 *max)
1698 struct regmap *regmap = isc->regmap;
1699 struct isc_ctrls *ctrls = &isc->ctrls;
1804 struct isc_device *isc =
1806 struct regmap *regmap = isc->regmap;
1807 struct isc_ctrls *ctrls = &isc->ctrls;
1814 if (isc->stop)
1820 isc_hist_count(isc, &min, &max);
1832 baysel = isc->config.sd_format->cfa_baycfg << ISC_HIS_CFG_BAYSEL_SHIFT;
1834 pm_runtime_get_sync(isc->dev);
1847 spin_lock_irqsave(&isc->awb_lock, flags);
1848 isc_update_awb_ctrls(isc);
1849 spin_unlock_irqrestore(&isc->awb_lock, flags);
1856 v4l2_info(&isc->v4l2_dev,
1859 isc_update_v4l2_ctrls(isc);
1864 isc_update_profile(isc);
1869 pm_runtime_put_sync(isc->dev);
1874 struct isc_device *isc = container_of(ctrl->handler,
1876 struct isc_ctrls *ctrls = &isc->ctrls;
1904 struct isc_device *isc = container_of(ctrl->handler,
1906 struct isc_ctrls *ctrls = &isc->ctrls;
1919 if (!isc->config.sd_format)
1924 ctrls->gain[ISC_HIS_CFG_MODE_R] = isc->r_gain_ctrl->val;
1926 ctrls->gain[ISC_HIS_CFG_MODE_B] = isc->b_gain_ctrl->val;
1928 ctrls->gain[ISC_HIS_CFG_MODE_GR] = isc->gr_gain_ctrl->val;
1930 ctrls->gain[ISC_HIS_CFG_MODE_GB] = isc->gb_gain_ctrl->val;
1933 ctrls->offset[ISC_HIS_CFG_MODE_R] = isc->r_off_ctrl->val;
1935 ctrls->offset[ISC_HIS_CFG_MODE_B] = isc->b_off_ctrl->val;
1937 ctrls->offset[ISC_HIS_CFG_MODE_GR] = isc->gr_off_ctrl->val;
1939 ctrls->offset[ISC_HIS_CFG_MODE_GB] = isc->gb_off_ctrl->val;
1941 isc_update_awb_ctrls(isc);
1943 if (vb2_is_streaming(&isc->vb2_vidq)) {
1948 isc_update_profile(isc);
1955 v4l2_ctrl_activate(isc->do_wb_ctrl, false);
1960 vb2_is_streaming(&isc->vb2_vidq) &&
1961 ISC_IS_FORMAT_RAW(isc->config.sd_format->mbus_code))
1962 isc_set_histogram(isc, true);
1973 isc_set_histogram(isc, true);
1974 v4l2_dbg(1, debug, &isc->v4l2_dev,
1984 struct isc_device *isc = container_of(ctrl->handler,
1986 struct isc_ctrls *ctrls = &isc->ctrls;
2054 static int isc_ctrl_init(struct isc_device *isc)
2057 struct isc_ctrls *ctrls = &isc->ctrls;
2062 isc_reset_awb_ctrls(isc);
2074 isc->awb_ctrl = v4l2_ctrl_new_std(hdl, &isc_awb_ops,
2079 isc->do_wb_ctrl = v4l2_ctrl_new_std(hdl, &isc_awb_ops,
2083 if (!isc->do_wb_ctrl) {
2089 v4l2_ctrl_activate(isc->do_wb_ctrl, false);
2091 isc->r_gain_ctrl = v4l2_ctrl_new_custom(hdl, &isc_r_gain_ctrl, NULL);
2092 isc->b_gain_ctrl = v4l2_ctrl_new_custom(hdl, &isc_b_gain_ctrl, NULL);
2093 isc->gr_gain_ctrl = v4l2_ctrl_new_custom(hdl, &isc_gr_gain_ctrl, NULL);
2094 isc->gb_gain_ctrl = v4l2_ctrl_new_custom(hdl, &isc_gb_gain_ctrl, NULL);
2095 isc->r_off_ctrl = v4l2_ctrl_new_custom(hdl, &isc_r_off_ctrl, NULL);
2096 isc->b_off_ctrl = v4l2_ctrl_new_custom(hdl, &isc_b_off_ctrl, NULL);
2097 isc->gr_off_ctrl = v4l2_ctrl_new_custom(hdl, &isc_gr_off_ctrl, NULL);
2098 isc->gb_off_ctrl = v4l2_ctrl_new_custom(hdl, &isc_gb_off_ctrl, NULL);
2104 v4l2_ctrl_auto_cluster(10, &isc->awb_ctrl, 0, true);
2115 struct isc_device *isc = container_of(notifier->v4l2_dev,
2120 if (video_is_registered(&isc->video_dev)) {
2121 v4l2_err(&isc->v4l2_dev, "only supports one sub-device.\n");
2134 struct isc_device *isc = container_of(notifier->v4l2_dev,
2136 cancel_work_sync(&isc->awb_work);
2137 video_unregister_device(&isc->video_dev);
2138 v4l2_ctrl_handler_free(&isc->ctrls.handler);
2158 static int isc_formats_init(struct isc_device *isc)
2161 struct v4l2_subdev *subdev = isc->current_subdev->sd;
2175 v4l2_warn(&isc->v4l2_dev, "Mbus code %x not supported\n",
2187 isc->num_user_formats = num_fmts;
2188 isc->user_formats = devm_kcalloc(isc->dev,
2189 num_fmts, sizeof(*isc->user_formats),
2191 if (!isc->user_formats)
2197 isc->user_formats[j++] = fmt;
2204 static int isc_set_default_fmt(struct isc_device *isc)
2212 .pixelformat = isc->user_formats[0]->fourcc,
2217 ret = isc_try_fmt(isc, &f, NULL);
2221 isc->fmt = f;
2227 struct isc_device *isc = container_of(notifier->v4l2_dev,
2229 struct video_device *vdev = &isc->video_dev;
2230 struct vb2_queue *q = &isc->vb2_vidq;
2233 INIT_WORK(&isc->awb_work, isc_awb_work);
2235 ret = v4l2_device_register_subdev_nodes(&isc->v4l2_dev);
2237 v4l2_err(&isc->v4l2_dev, "Failed to register subdev nodes\n");
2241 isc->current_subdev = container_of(notifier,
2243 mutex_init(&isc->lock);
2244 init_completion(&isc->comp);
2249 q->drv_priv = isc;
2254 q->lock = &isc->lock;
2256 q->dev = isc->dev;
2260 v4l2_err(&isc->v4l2_dev,
2266 INIT_LIST_HEAD(&isc->dma_queue);
2267 spin_lock_init(&isc->dma_queue_lock);
2268 spin_lock_init(&isc->awb_lock);
2270 ret = isc_formats_init(isc);
2272 v4l2_err(&isc->v4l2_dev,
2277 ret = isc_set_default_fmt(isc);
2279 v4l2_err(&isc->v4l2_dev, "Could not set default format\n");
2283 ret = isc_ctrl_init(isc);
2285 v4l2_err(&isc->v4l2_dev, "Init isc ctrols failed: %d\n", ret);
2294 vdev->v4l2_dev = &isc->v4l2_dev;
2297 vdev->lock = &isc->lock;
2298 vdev->ctrl_handler = &isc->ctrls.handler;
2300 video_set_drvdata(vdev, isc);
2304 v4l2_err(&isc->v4l2_dev,
2312 mutex_destroy(&isc->lock);
2322 void isc_subdev_cleanup(struct isc_device *isc)
2326 list_for_each_entry(subdev_entity, &isc->subdev_entities, list) {
2331 INIT_LIST_HEAD(&isc->subdev_entities);
2334 int isc_pipeline_init(struct isc_device *isc)
2336 struct device *dev = isc->dev;
2337 struct regmap *regmap = isc->regmap;
2361 isc->pipeline[i] = regs;