Lines Matching +full:dphy +full:- +full:cfg
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2017-2018 Rockchip Electronics Co., Ltd.
18 #include <media/v4l2-ctrls.h>
19 #include <media/v4l2-fwnode.h>
20 #include <media/v4l2-subdev.h>
26 #include <linux/rk-preisp.h>
27 #include <linux/rk-isp1-config.h>
28 #include <linux/rk-camera-module.h>
32 #define RK1608_DPHY_NAME "RK1608-dphy"
35 * Rk1608 is used as the Pre-ISP to link on Soc, which mainly has two
39 * |-----------------------|
41 * |-----------------------|
42 * |-----------||----------|
43 * |-----------||----------|
44 * |-----------\/----------|
45 * | Pre-ISP RK1608 |
46 * |-----------------------|
47 * |-----------||----------|
48 * |-----------||----------|
49 * |-----------\/----------|
51 * |-----------------------|
67 pdata->rk1608_sd->grp_id = pdata->sd.grp_id; in rk1608_s_open()
68 remote_ctrl = v4l2_ctrl_find(pdata->rk1608_sd->ctrl_handler, in rk1608_s_open()
72 __v4l2_ctrl_modify_range(pdata->hblank, in rk1608_s_open()
73 remote_ctrl->minimum, in rk1608_s_open()
74 remote_ctrl->maximum, in rk1608_s_open()
75 remote_ctrl->step, in rk1608_s_open()
76 remote_ctrl->default_value); in rk1608_s_open()
79 remote_ctrl = v4l2_ctrl_find(pdata->rk1608_sd->ctrl_handler, in rk1608_s_open()
83 __v4l2_ctrl_modify_range(pdata->vblank, in rk1608_s_open()
84 remote_ctrl->minimum, in rk1608_s_open()
85 remote_ctrl->maximum, in rk1608_s_open()
86 remote_ctrl->step, in rk1608_s_open()
87 remote_ctrl->default_value); in rk1608_s_open()
97 pdata->rk1608_sd->grp_id = sd->grp_id; in rk1608_s_close()
107 pdata->rk1608_sd->grp_id = sd->grp_id; in rk1608_sensor_power()
108 ret = v4l2_subdev_call(pdata->rk1608_sd, core, s_power, on); in rk1608_sensor_power()
118 u32 idx = pdata->fmt_inf_idx; in rk1608_get_link_sensor_timing()
119 struct rk1608_fmt_inf *fmt_inf = &pdata->fmt_inf[idx]; in rk1608_get_link_sensor_timing()
120 int sub_sensor_num = pdata->sub_sensor_num; in rk1608_get_link_sensor_timing()
123 u32 id = pdata->sd.grp_id; in rk1608_get_link_sensor_timing()
133 if (!IS_ERR_OR_NULL(pdata->link_sensor_client)) { in rk1608_get_link_sensor_timing()
136 pdata->link_sensor_client); in rk1608_get_link_sensor_timing()
138 dev_err(pdata->dev, "can not get link sensor i2c client\n"); in rk1608_get_link_sensor_timing()
139 return -EINVAL; in rk1608_get_link_sensor_timing()
144 dev_info(pdata->dev, "get link fmt fail\n"); in rk1608_get_link_sensor_timing()
145 return -EINVAL; in rk1608_get_link_sensor_timing()
150 dev_info(pdata->dev, "phy[%d] get fmt w:%d h:%d\n", in rk1608_get_link_sensor_timing()
156 dev_info(pdata->dev, "get link interval fail\n"); in rk1608_get_link_sensor_timing()
157 return -EINVAL; in rk1608_get_link_sensor_timing()
161 dev_info(pdata->dev, "phy[%d] get fps:%d (%d/%d)\n", in rk1608_get_link_sensor_timing()
165 width = fmt_inf->mf.width; in rk1608_get_link_sensor_timing()
166 height = fmt_inf->mf.height; in rk1608_get_link_sensor_timing()
167 dev_info(pdata->dev, "phy[%d] no link sensor\n", id); in rk1608_get_link_sensor_timing()
171 dev_err(pdata->dev, "phy[%d] get fmt error!\n", id); in rk1608_get_link_sensor_timing()
172 return -EINVAL; in rk1608_get_link_sensor_timing()
176 if (fmt_inf->in_ch[i].width == 0) in rk1608_get_link_sensor_timing()
179 fmt_inf->in_ch[i].width = width; in rk1608_get_link_sensor_timing()
180 fmt_inf->in_ch[i].height = height; in rk1608_get_link_sensor_timing()
186 if (fmt_inf->out_ch[i].width == 0) in rk1608_get_link_sensor_timing()
189 fmt_inf->out_ch[i].width = out_width; in rk1608_get_link_sensor_timing()
190 fmt_inf->out_ch[i].height = out_height; in rk1608_get_link_sensor_timing()
193 fmt_inf->hactive = out_width; in rk1608_get_link_sensor_timing()
194 fmt_inf->vactive = out_height; in rk1608_get_link_sensor_timing()
195 fmt_inf->htotal = out_width + (width * 1 / 3); //1.33 in rk1608_get_link_sensor_timing()
196 fmt_inf->vtotal = out_height + (height >> 4); in rk1608_get_link_sensor_timing()
199 bps = fmt_inf->htotal * fmt_inf->vtotal in rk1608_get_link_sensor_timing()
200 / fmt_inf->mipi_lane_out * 10 * max_fps; in rk1608_get_link_sensor_timing()
209 pdata->link_freqs = (u32)(bps/2); in rk1608_get_link_sensor_timing()
210 dev_info(pdata->dev, "target mipi bps:%lld\n", bps); in rk1608_get_link_sensor_timing()
219 if (enable && pdata->sub_sensor_num) in rk1608_s_stream()
222 pdata->rk1608_sd->grp_id = sd->grp_id; in rk1608_s_stream()
223 v4l2_subdev_call(pdata->rk1608_sd, video, s_stream, enable); in rk1608_s_stream()
228 struct v4l2_subdev_pad_config *cfg, in rk1608_enum_mbus_code() argument
233 if (code->index >= pdata->fmt_inf_num) in rk1608_enum_mbus_code()
234 return -EINVAL; in rk1608_enum_mbus_code()
236 code->code = pdata->fmt_inf[code->index].mf.code; in rk1608_enum_mbus_code()
242 struct v4l2_subdev_pad_config *cfg, in rk1608_enum_frame_sizes() argument
247 if (fse->index >= pdata->fmt_inf_num) in rk1608_enum_frame_sizes()
248 return -EINVAL; in rk1608_enum_frame_sizes()
250 if (fse->code != pdata->fmt_inf[fse->index].mf.code) in rk1608_enum_frame_sizes()
251 return -EINVAL; in rk1608_enum_frame_sizes()
253 fse->min_width = pdata->fmt_inf[fse->index].mf.width; in rk1608_enum_frame_sizes()
254 fse->max_width = pdata->fmt_inf[fse->index].mf.width; in rk1608_enum_frame_sizes()
255 fse->max_height = pdata->fmt_inf[fse->index].mf.height; in rk1608_enum_frame_sizes()
256 fse->min_height = pdata->fmt_inf[fse->index].mf.height; in rk1608_enum_frame_sizes()
262 struct v4l2_subdev_pad_config *cfg, in rk1608_get_fmt() argument
265 struct v4l2_mbus_framefmt *mf = &fmt->format; in rk1608_get_fmt()
267 u32 idx = pdata->fmt_inf_idx; in rk1608_get_fmt()
269 int ret = -1; in rk1608_get_fmt()
271 if (!IS_ERR_OR_NULL(pdata->link_sensor_client)) { in rk1608_get_fmt()
272 link_sensor = i2c_get_clientdata(pdata->link_sensor_client); in rk1608_get_fmt()
274 dev_err(pdata->dev, "can not get link sensor i2c client\n"); in rk1608_get_fmt()
280 dev_info(pdata->dev, "get link fmt fail\n"); in rk1608_get_fmt()
284 dev_info(pdata->dev, "use link sensor fmt w:%d h:%d code:%d\n", in rk1608_get_fmt()
285 mf->width, mf->height, mf->code); in rk1608_get_fmt()
289 if (ret || !mf->width || !mf->height) { in rk1608_get_fmt()
290 mf->code = pdata->fmt_inf[idx].mf.code; in rk1608_get_fmt()
291 mf->width = pdata->fmt_inf[idx].mf.width; in rk1608_get_fmt()
292 mf->height = pdata->fmt_inf[idx].mf.height; in rk1608_get_fmt()
293 mf->field = pdata->fmt_inf[idx].mf.field; in rk1608_get_fmt()
294 mf->colorspace = pdata->fmt_inf[idx].mf.colorspace; in rk1608_get_fmt()
296 pdata->fmt_inf[idx].mf.code = mf->code; in rk1608_get_fmt()
297 pdata->fmt_inf[idx].mf.width = mf->width; in rk1608_get_fmt()
298 pdata->fmt_inf[idx].mf.height = mf->height; in rk1608_get_fmt()
299 pdata->fmt_inf[idx].mf.field = mf->field; in rk1608_get_fmt()
300 pdata->fmt_inf[idx].mf.colorspace = mf->colorspace; in rk1608_get_fmt()
303 if (pdata->sub_sensor_num) in rk1608_get_fmt()
312 struct v4l2_mbus_framefmt *framefmt = &fmt->format; in rk1608_get_reso_dist()
314 return abs(fmt_inf->mf.width - framefmt->width) + in rk1608_get_reso_dist()
315 abs(fmt_inf->mf.height - framefmt->height); in rk1608_get_reso_dist()
319 struct v4l2_subdev_pad_config *cfg, in rk1608_set_fmt() argument
326 int cur_best_fit_dist = -1; in rk1608_set_fmt()
328 for (i = 0; i < pdata->fmt_inf_num; i++) { in rk1608_set_fmt()
329 dist = rk1608_get_reso_dist(&pdata->fmt_inf[i], fmt); in rk1608_set_fmt()
330 if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) { in rk1608_set_fmt()
336 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) in rk1608_set_fmt()
337 return -ENOTTY; in rk1608_set_fmt()
339 pdata->fmt_inf_idx = idx; in rk1608_set_fmt()
341 pdata->rk1608_sd->grp_id = pdata->sd.grp_id; in rk1608_set_fmt()
342 v4l2_subdev_call(pdata->rk1608_sd, pad, set_fmt, cfg, fmt); in rk1608_set_fmt()
344 remote_ctrl = v4l2_ctrl_find(pdata->rk1608_sd->ctrl_handler, in rk1608_set_fmt()
348 __v4l2_ctrl_modify_range(pdata->hblank, in rk1608_set_fmt()
349 remote_ctrl->minimum, in rk1608_set_fmt()
350 remote_ctrl->maximum, in rk1608_set_fmt()
351 remote_ctrl->step, in rk1608_set_fmt()
352 remote_ctrl->default_value); in rk1608_set_fmt()
355 remote_ctrl = v4l2_ctrl_find(pdata->rk1608_sd->ctrl_handler, in rk1608_set_fmt()
359 __v4l2_ctrl_modify_range(pdata->vblank, in rk1608_set_fmt()
360 remote_ctrl->minimum, in rk1608_set_fmt()
361 remote_ctrl->maximum, in rk1608_set_fmt()
362 remote_ctrl->step, in rk1608_set_fmt()
363 remote_ctrl->default_value); in rk1608_set_fmt()
376 if (!IS_ERR_OR_NULL(pdata->link_sensor_client)) { in rk1608_g_frame_interval()
377 link_sensor = i2c_get_clientdata(pdata->link_sensor_client); in rk1608_g_frame_interval()
379 dev_err(pdata->dev, "can not get link sensor i2c client\n"); in rk1608_g_frame_interval()
380 return -EINVAL; in rk1608_g_frame_interval()
388 dev_info(pdata->dev, "get link interval fail\n"); in rk1608_g_frame_interval()
393 if (!(pdata->rk1608_sd)) { in rk1608_g_frame_interval()
394 dev_info(pdata->dev, "pdata->rk1608_sd NULL\n"); in rk1608_g_frame_interval()
395 return -EFAULT; in rk1608_g_frame_interval()
397 pdata->rk1608_sd->grp_id = sd->grp_id; in rk1608_g_frame_interval()
398 v4l2_subdev_call(pdata->rk1608_sd, in rk1608_g_frame_interval()
419 val = 1 << (pdata->fmt_inf[pdata->fmt_inf_idx].mipi_lane_out - 1) | in rk1608_g_mbus_config()
423 config->type = V4L2_MBUS_CSI2_DPHY; in rk1608_g_mbus_config()
424 config->flags = val; in rk1608_g_mbus_config()
437 ret = v4l2_subdev_call(pdata->rk1608_sd, core, ioctl, in rk1608_ioctl()
455 pdata->rk1608_sd->grp_id = pdata->sd.grp_id; in rk1608_ioctl()
456 ret = v4l2_subdev_call(pdata->rk1608_sd, core, ioctl, in rk1608_ioctl()
461 if (!IS_ERR_OR_NULL(pdata->link_sensor_client)) { in rk1608_ioctl()
462 link_sensor = i2c_get_clientdata(pdata->link_sensor_client); in rk1608_ioctl()
464 dev_err(pdata->dev, "can not get link sensor i2c client\n"); in rk1608_ioctl()
465 return -EINVAL; in rk1608_ioctl()
471 ret = -ENOIOCTLCMD; in rk1608_ioctl()
484 struct rkmodule_awb_cfg *cfg; in rk1608_compat_ioctl32() local
487 long ret = -EFAULT; in rk1608_compat_ioctl32()
492 return -EFAULT; in rk1608_compat_ioctl32()
498 ret = -ENOMEM; in rk1608_compat_ioctl32()
506 return -EFAULT; in rk1608_compat_ioctl32()
511 cfg = kzalloc(sizeof(*cfg), GFP_KERNEL); in rk1608_compat_ioctl32()
512 if (!cfg) { in rk1608_compat_ioctl32()
513 ret = -ENOMEM; in rk1608_compat_ioctl32()
516 if (copy_from_user(cfg, up, sizeof(*cfg))) in rk1608_compat_ioctl32()
517 return -EFAULT; in rk1608_compat_ioctl32()
518 ret = rk1608_ioctl(sd, cmd, cfg); in rk1608_compat_ioctl32()
519 kfree(cfg); in rk1608_compat_ioctl32()
526 ret = -EFAULT; in rk1608_compat_ioctl32()
532 ret = -ENOMEM; in rk1608_compat_ioctl32()
536 return -EFAULT; in rk1608_compat_ioctl32()
541 ret = -ENOIOCTLCMD; in rk1608_compat_ioctl32()
553 container_of(ctrl->handler, in rk1608_g_volatile_ctrl()
556 pdata->rk1608_sd->grp_id = pdata->sd.grp_id; in rk1608_g_volatile_ctrl()
557 remote_ctrl = v4l2_ctrl_find(pdata->rk1608_sd->ctrl_handler, in rk1608_g_volatile_ctrl()
558 ctrl->id); in rk1608_g_volatile_ctrl()
560 ctrl->val = v4l2_ctrl_g_ctrl(remote_ctrl); in rk1608_g_volatile_ctrl()
562 remote_ctrl->minimum, in rk1608_g_volatile_ctrl()
563 remote_ctrl->maximum, in rk1608_g_volatile_ctrl()
564 remote_ctrl->step, in rk1608_g_volatile_ctrl()
565 remote_ctrl->default_value); in rk1608_g_volatile_ctrl()
576 container_of(ctrl->handler, in rk1608_set_ctrl()
579 pdata->rk1608_sd->grp_id = pdata->sd.grp_id; in rk1608_set_ctrl()
580 remote_ctrl = v4l2_ctrl_find(pdata->rk1608_sd->ctrl_handler, in rk1608_set_ctrl()
581 ctrl->id); in rk1608_set_ctrl()
583 ret = v4l2_ctrl_s_ctrl(remote_ctrl, ctrl->val); in rk1608_set_ctrl()
588 #define CROP_START(SRC, DST) (((SRC) - (DST)) / 2 / 4 * 4)
590 struct v4l2_subdev_pad_config *cfg, in rk1608_get_selection() argument
594 u32 idx = pdata->fmt_inf_idx; in rk1608_get_selection()
595 u32 width = pdata->fmt_inf[idx].mf.width; in rk1608_get_selection()
596 u32 height = pdata->fmt_inf[idx].mf.height; in rk1608_get_selection()
598 int ret = -EINVAL; in rk1608_get_selection()
600 if (sel->target != V4L2_SEL_TGT_CROP_BOUNDS) in rk1608_get_selection()
601 return -EINVAL; in rk1608_get_selection()
603 if (!IS_ERR_OR_NULL(pdata->link_sensor_client)) { in rk1608_get_selection()
604 link_sensor = i2c_get_clientdata(pdata->link_sensor_client); in rk1608_get_selection()
606 dev_err(pdata->dev, "can not get link sensor i2c client\n"); in rk1608_get_selection()
616 if (pdata->fmt_inf[idx].hcrop && pdata->fmt_inf[idx].vcrop) { in rk1608_get_selection()
617 width = pdata->fmt_inf[idx].hcrop; in rk1608_get_selection()
618 height = pdata->fmt_inf[idx].vcrop; in rk1608_get_selection()
621 sel->r.left = CROP_START(pdata->fmt_inf[idx].mf.width, width); in rk1608_get_selection()
622 sel->r.top = CROP_START(pdata->fmt_inf[idx].mf.height, height); in rk1608_get_selection()
623 sel->r.width = width; in rk1608_get_selection()
624 sel->r.height = height; in rk1608_get_selection()
630 struct v4l2_subdev_pad_config *cfg, in rk1608_enum_frame_interval() argument
634 u32 idx = pdata->fmt_inf_idx; in rk1608_enum_frame_interval()
642 if (!IS_ERR_OR_NULL(pdata->link_sensor_client)) { in rk1608_enum_frame_interval()
643 link_sensor = i2c_get_clientdata(pdata->link_sensor_client); in rk1608_enum_frame_interval()
645 dev_err(pdata->dev, "can not get link sensor i2c client\n"); in rk1608_enum_frame_interval()
658 if (fie->index >= pdata->fmt_inf_num) in rk1608_enum_frame_interval()
659 return -EINVAL; in rk1608_enum_frame_interval()
661 fie->code = pdata->fmt_inf[idx].mf.code; in rk1608_enum_frame_interval()
662 fie->width = pdata->fmt_inf[idx].mf.width; in rk1608_enum_frame_interval()
663 fie->height = pdata->fmt_inf[idx].mf.height; in rk1608_enum_frame_interval()
664 fie->interval = max_fps; in rk1608_enum_frame_interval()
696 static int rk1608_initialize_controls(struct rk1608_dphy *dphy) in rk1608_initialize_controls() argument
701 u32 idx = dphy->fmt_inf_idx; in rk1608_initialize_controls()
706 handler = &dphy->ctrl_handler; in rk1608_initialize_controls()
711 dphy->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in rk1608_initialize_controls()
713 0, &dphy->link_freqs); in rk1608_initialize_controls()
714 if (dphy->link_freq) in rk1608_initialize_controls()
715 dphy->link_freq->flags |= V4L2_CTRL_FLAG_READ_ONLY; in rk1608_initialize_controls()
717 switch (dphy->fmt_inf[idx].data_type) { in rk1608_initialize_controls()
728 pixel_rate = dphy->link_freqs * dphy->fmt_inf[idx].mipi_lane * 2; in rk1608_initialize_controls()
730 dphy->pixel_rate = v4l2_ctrl_new_std(handler, NULL, in rk1608_initialize_controls()
734 dphy->hblank = v4l2_ctrl_new_std(handler, in rk1608_initialize_controls()
738 if (dphy->hblank) in rk1608_initialize_controls()
739 dphy->hblank->flags |= flags; in rk1608_initialize_controls()
741 dphy->vblank = v4l2_ctrl_new_std(handler, in rk1608_initialize_controls()
745 if (dphy->vblank) in rk1608_initialize_controls()
746 dphy->vblank->flags |= flags; in rk1608_initialize_controls()
748 dphy->exposure = v4l2_ctrl_new_std(handler, in rk1608_initialize_controls()
752 if (dphy->exposure) in rk1608_initialize_controls()
753 dphy->exposure->flags |= flags; in rk1608_initialize_controls()
755 dphy->gain = v4l2_ctrl_new_std(handler, in rk1608_initialize_controls()
759 if (dphy->gain) in rk1608_initialize_controls()
760 dphy->gain->flags |= flags; in rk1608_initialize_controls()
765 if (handler->error) { in rk1608_initialize_controls()
766 ret = handler->error; in rk1608_initialize_controls()
767 dev_err(dphy->dev, in rk1608_initialize_controls()
772 dphy->sd.ctrl_handler = handler; in rk1608_initialize_controls()
817 static int rk1608_dphy_dt_property(struct rk1608_dphy *dphy) in rk1608_dphy_dt_property() argument
820 struct device_node *node = dphy->dev->of_node; in rk1608_dphy_dt_property()
827 ret = of_property_read_u32(node, "id", &dphy->sd.grp_id); in rk1608_dphy_dt_property()
829 dev_warn(dphy->dev, "Can not get id!"); in rk1608_dphy_dt_property()
831 ret = of_property_read_u32(node, "cam_nums", &dphy->cam_nums); in rk1608_dphy_dt_property()
833 dev_warn(dphy->dev, "Can not get cam_nums!"); in rk1608_dphy_dt_property()
835 ret = of_property_read_u32(node, "in_mipi", &dphy->in_mipi); in rk1608_dphy_dt_property()
837 dev_warn(dphy->dev, "Can not get in_mipi!"); in rk1608_dphy_dt_property()
839 ret = of_property_read_u32(node, "out_mipi", &dphy->out_mipi); in rk1608_dphy_dt_property()
841 dev_warn(dphy->dev, "Can not get out_mipi!"); in rk1608_dphy_dt_property()
843 ret = of_property_read_u64(node, "link-freqs", &dphy->link_freqs); in rk1608_dphy_dt_property()
845 dev_warn(dphy->dev, "Can not get link_freqs!"); in rk1608_dphy_dt_property()
847 ret = of_property_read_u32(node, "sensor_i2c_bus", &dphy->i2c_bus); in rk1608_dphy_dt_property()
849 dev_warn(dphy->dev, "Can not get sensor_i2c_bus!"); in rk1608_dphy_dt_property()
851 ret = of_property_read_u32(node, "sensor_i2c_addr", &dphy->i2c_addr); in rk1608_dphy_dt_property()
853 dev_warn(dphy->dev, "Can not get sensor_i2c_addr!"); in rk1608_dphy_dt_property()
855 ret = of_property_read_string(node, "sensor-name", &dphy->sensor_name); in rk1608_dphy_dt_property()
857 dev_warn(dphy->dev, "Can not get sensor-name!"); in rk1608_dphy_dt_property()
862 if (!strncasecmp(node->name, in rk1608_dphy_dt_property()
863 "format-config", in rk1608_dphy_dt_property()
864 strlen("format-config"))) { in rk1608_dphy_dt_property()
866 &dphy->fmt_inf[idx].data_type); in rk1608_dphy_dt_property()
868 dev_warn(dphy->dev, "Can not get data_type!"); in rk1608_dphy_dt_property()
871 &dphy->fmt_inf[idx].mipi_lane); in rk1608_dphy_dt_property()
873 dev_warn(dphy->dev, "Can not get mipi_lane!"); in rk1608_dphy_dt_property()
876 &dphy->fmt_inf[idx].mipi_lane_out); in rk1608_dphy_dt_property()
878 dev_warn(dphy->dev, "Can not get mipi_lane_out!"); in rk1608_dphy_dt_property()
881 &dphy->fmt_inf[idx].mf.field); in rk1608_dphy_dt_property()
883 dev_warn(dphy->dev, "Can not get field!"); in rk1608_dphy_dt_property()
886 &dphy->fmt_inf[idx].mf.colorspace); in rk1608_dphy_dt_property()
888 dev_warn(dphy->dev, "Can not get colorspace!"); in rk1608_dphy_dt_property()
891 &dphy->fmt_inf[idx].mf.code); in rk1608_dphy_dt_property()
893 dev_warn(dphy->dev, "Can not get code!"); in rk1608_dphy_dt_property()
896 &dphy->fmt_inf[idx].mf.width); in rk1608_dphy_dt_property()
898 dev_warn(dphy->dev, "Can not get width!"); in rk1608_dphy_dt_property()
901 &dphy->fmt_inf[idx].mf.height); in rk1608_dphy_dt_property()
903 dev_warn(dphy->dev, "Can not get height!"); in rk1608_dphy_dt_property()
906 &dphy->fmt_inf[idx].hactive); in rk1608_dphy_dt_property()
908 dev_warn(dphy->dev, "Can not get hactive!"); in rk1608_dphy_dt_property()
911 &dphy->fmt_inf[idx].vactive); in rk1608_dphy_dt_property()
913 dev_warn(dphy->dev, "Can not get vactive!"); in rk1608_dphy_dt_property()
916 &dphy->fmt_inf[idx].htotal); in rk1608_dphy_dt_property()
918 dev_warn(dphy->dev, "Can not get htotal!"); in rk1608_dphy_dt_property()
921 &dphy->fmt_inf[idx].vtotal); in rk1608_dphy_dt_property()
923 dev_warn(dphy->dev, "Can not get vtotal!"); in rk1608_dphy_dt_property()
925 ret = of_property_read_u32_array(node, "inch0-info", in rk1608_dphy_dt_property()
926 (u32 *)&dphy->fmt_inf[idx].in_ch[0], 5); in rk1608_dphy_dt_property()
928 dev_warn(dphy->dev, "Can not get inch0-info!"); in rk1608_dphy_dt_property()
930 ret = of_property_read_u32_array(node, "inch1-info", in rk1608_dphy_dt_property()
931 (u32 *)&dphy->fmt_inf[idx].in_ch[1], 5); in rk1608_dphy_dt_property()
933 dev_info(dphy->dev, "Can not get inch1-info!"); in rk1608_dphy_dt_property()
935 ret = of_property_read_u32_array(node, "inch2-info", in rk1608_dphy_dt_property()
936 (u32 *)&dphy->fmt_inf[idx].in_ch[2], 5); in rk1608_dphy_dt_property()
938 dev_info(dphy->dev, "Can not get inch2-info!"); in rk1608_dphy_dt_property()
940 ret = of_property_read_u32_array(node, "inch3-info", in rk1608_dphy_dt_property()
941 (u32 *)&dphy->fmt_inf[idx].in_ch[3], 5); in rk1608_dphy_dt_property()
943 dev_info(dphy->dev, "Can not get inch3-info!"); in rk1608_dphy_dt_property()
945 ret = of_property_read_u32_array(node, "outch0-info", in rk1608_dphy_dt_property()
946 (u32 *)&dphy->fmt_inf[idx].out_ch[0], 5); in rk1608_dphy_dt_property()
948 dev_warn(dphy->dev, "Can not get outch0-info!"); in rk1608_dphy_dt_property()
950 ret = of_property_read_u32_array(node, "outch1-info", in rk1608_dphy_dt_property()
951 (u32 *)&dphy->fmt_inf[idx].out_ch[1], 5); in rk1608_dphy_dt_property()
953 dev_info(dphy->dev, "Can not get outch1-info!"); in rk1608_dphy_dt_property()
955 ret = of_property_read_u32_array(node, "outch2-info", in rk1608_dphy_dt_property()
956 (u32 *)&dphy->fmt_inf[idx].out_ch[2], 5); in rk1608_dphy_dt_property()
958 dev_info(dphy->dev, "Can not get outch2-info!"); in rk1608_dphy_dt_property()
960 ret = of_property_read_u32_array(node, "outch3-info", in rk1608_dphy_dt_property()
961 (u32 *)&dphy->fmt_inf[idx].out_ch[3], 5); in rk1608_dphy_dt_property()
963 dev_info(dphy->dev, "Can not get outch3-info!"); in rk1608_dphy_dt_property()
966 &dphy->fmt_inf[idx].hcrop); in rk1608_dphy_dt_property()
968 dev_warn(dphy->dev, "Can not get hcrop!"); in rk1608_dphy_dt_property()
971 &dphy->fmt_inf[idx].vcrop); in rk1608_dphy_dt_property()
973 dev_warn(dphy->dev, "Can not get vcrop!"); in rk1608_dphy_dt_property()
981 dphy->fmt_inf_num = idx; in rk1608_dphy_dt_property()
988 if (!strncasecmp(node->name, in rk1608_dphy_dt_property()
989 "virtual-sub-sensor-config", in rk1608_dphy_dt_property()
990 strlen("virtual-sub-sensor-config"))) { in rk1608_dphy_dt_property()
993 dev_err(dphy->dev, "get too mach sub_sensor node, max 4.\n"); in rk1608_dphy_dt_property()
998 &dphy->sub_sensor[sub_idx].id); in rk1608_dphy_dt_property()
1000 dev_warn(dphy->dev, "Can not get sub sensor id!"); in rk1608_dphy_dt_property()
1002 dev_info(dphy->dev, "get sub sensor id:%d", in rk1608_dphy_dt_property()
1003 dphy->sub_sensor[sub_idx].id); in rk1608_dphy_dt_property()
1006 &dphy->sub_sensor[sub_idx].in_mipi); in rk1608_dphy_dt_property()
1008 dev_warn(dphy->dev, "Can not get sub sensor in_mipi!"); in rk1608_dphy_dt_property()
1010 dev_info(dphy->dev, "get sub sensor in_mipi:%d", in rk1608_dphy_dt_property()
1011 dphy->sub_sensor[sub_idx].in_mipi); in rk1608_dphy_dt_property()
1014 &dphy->sub_sensor[sub_idx].out_mipi); in rk1608_dphy_dt_property()
1016 dev_warn(dphy->dev, "Can not get sub sensor out_mipi!"); in rk1608_dphy_dt_property()
1018 dev_info(dphy->dev, "get sub sensor out_mipi:%d", in rk1608_dphy_dt_property()
1019 dphy->sub_sensor[sub_idx].out_mipi); in rk1608_dphy_dt_property()
1027 dphy->sub_sensor_num = sub_idx; in rk1608_dphy_dt_property()
1029 node = of_parse_phandle(parent_node, "link-sensor", 0); in rk1608_dphy_dt_property()
1031 dev_info(dphy->dev, "get link sensor node:%s\n", node->full_name); in rk1608_dphy_dt_property()
1036 dev_err(dphy->dev, "can not get link sensor node\n"); in rk1608_dphy_dt_property()
1038 dphy->link_sensor_client = link_sensor_client; in rk1608_dphy_dt_property()
1039 dev_info(dphy->dev, "get link sensor client\n"); in rk1608_dphy_dt_property()
1042 dev_err(dphy->dev, "can not get link-sensor node\n"); in rk1608_dphy_dt_property()
1054 struct rk1608_dphy *dphy; in rk1608_dphy_probe() local
1056 struct device_node *node = pdev->dev.of_node; in rk1608_dphy_probe()
1060 dphy = devm_kzalloc(&pdev->dev, sizeof(*dphy), GFP_KERNEL); in rk1608_dphy_probe()
1061 if (!dphy) in rk1608_dphy_probe()
1062 return -ENOMEM; in rk1608_dphy_probe()
1065 &dphy->module_index); in rk1608_dphy_probe()
1067 &dphy->module_facing); in rk1608_dphy_probe()
1069 &dphy->module_name); in rk1608_dphy_probe()
1071 &dphy->len_name); in rk1608_dphy_probe()
1073 dev_err(dphy->dev, in rk1608_dphy_probe()
1075 return -EINVAL; in rk1608_dphy_probe()
1078 dphy->dev = &pdev->dev; in rk1608_dphy_probe()
1079 platform_set_drvdata(pdev, dphy); in rk1608_dphy_probe()
1080 sd = &dphy->sd; in rk1608_dphy_probe()
1081 sd->dev = &pdev->dev; in rk1608_dphy_probe()
1083 rk1608_dphy_dt_property(dphy); in rk1608_dphy_probe()
1086 if (strcmp(dphy->module_facing, "back") == 0) in rk1608_dphy_probe()
1091 snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s RK1608-dphy%d", in rk1608_dphy_probe()
1092 dphy->module_index, facing, in rk1608_dphy_probe()
1093 RK1608_DPHY_NAME, sd->grp_id); in rk1608_dphy_probe()
1094 rk1608_initialize_controls(dphy); in rk1608_dphy_probe()
1095 sd->internal_ops = &dphy_subdev_internal_ops; in rk1608_dphy_probe()
1096 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in rk1608_dphy_probe()
1097 dphy->pad.flags = MEDIA_PAD_FL_SOURCE; in rk1608_dphy_probe()
1098 sd->entity.function = MEDIA_ENT_F_CAM_SENSOR; in rk1608_dphy_probe()
1100 ret = media_entity_pads_init(&sd->entity, 1, &dphy->pad); in rk1608_dphy_probe()
1107 dev_info(dphy->dev, "RK1608-dphy(%d) probe success!\n", sd->grp_id); in rk1608_dphy_probe()
1111 media_entity_cleanup(&sd->entity); in rk1608_dphy_probe()
1113 v4l2_ctrl_handler_free(dphy->sd.ctrl_handler); in rk1608_dphy_probe()
1114 devm_kfree(&pdev->dev, dphy); in rk1608_dphy_probe()
1120 struct rk1608_dphy *dphy = platform_get_drvdata(pdev); in rk1608_dphy_remove() local
1122 v4l2_async_unregister_subdev(&dphy->sd); in rk1608_dphy_remove()
1123 media_entity_cleanup(&dphy->sd.entity); in rk1608_dphy_remove()
1124 v4l2_ctrl_handler_free(&dphy->ctrl_handler); in rk1608_dphy_remove()
1130 { .compatible = "rockchip,rk1608-dphy" },