Lines Matching +full:gmsl +full:- +full:compatible
1 // SPDX-License-Identifier: GPL-2.0
3 * max96712 GMSL2/GMSL1 to CSI-2 Deserializer driver
39 #include <linux/rk-camera-module.h>
41 #include <media/media-entity.h>
42 #include <media/v4l2-async.h>
43 #include <media/v4l2-ctrls.h>
44 #include <media/v4l2-subdev.h>
45 #include <media/v4l2-ctrls.h>
46 #include <media/v4l2-fwnode.h>
47 #include <media/v4l2-subdev.h>
67 /* max96712->link mask: link type = bit[7:4], link mask = bit[3:0] */
72 #define MAXIM_GMSL_TYPE_MASK 0xF0 /* bit[7:4], GMSL link type: 0 = GMSL1, 1 = GMSL2 */
78 #define MAXIM_GMSL_LOCK_MASK 0x0F /* bit[3:0], GMSL link mask: 1 = disable, 1 = enable */
230 …{ I2C_DEV_DES, 2, 0x00F0, 0x62, 0x00, 0x00 }, // Phy A -> Pipe Z -> Pipe 0; Phy B -> Pipe Z -> Pip…
231 …{ I2C_DEV_DES, 2, 0x00F1, 0xea, 0x00, 0x00 }, // Phy C -> Pipe Z -> Pipe 2; Phy D -> Pipe Z -> Pip…
235 { I2C_DEV_DES, 2, 0x092D, 0x15, 0x00, 0x00 }, // SRC/DST 0/1/2 -> CSI2 Controller 1;
245 { I2C_DEV_DES, 2, 0x096D, 0x15, 0x00, 0x00 }, // SRC/DST 0/1/2 -> CSI2 Controller 1;
255 { I2C_DEV_DES, 2, 0x09AD, 0x15, 0x00, 0x00 }, // SRC/DST 0/1/2 -> CSI2 Controller 1;
265 { I2C_DEV_DES, 2, 0x09ED, 0x15, 0x00, 0x00 }, // SRC/DST 0/1/2 -> CSI2 Controller 1;
275 // Set Lane Mapping for 4-lane port A
276 { I2C_DEV_DES, 2, 0x08A3, 0xe4, 0x00, 0x00 }, // PHY1 D1->D3, D0->D2; PHY0 D1->D1, D0->D0
277 // Set 4 lane D-PHY, 2bit VC
284 { I2C_DEV_DES, 2, 0x040E, 0x5e, 0x00, 0x00 }, // pipe 0 DT=0x1E: YUV422 8-bit
285 { I2C_DEV_DES, 2, 0x040F, 0x7e, 0x00, 0x00 }, // pipe 1 DT=0x1E: YUV422 8-bit
286 { I2C_DEV_DES, 2, 0x0410, 0x7a, 0x00, 0x00 }, // pipe 2 DT=0x1E, pipe 3 DT=0x1E: YUV422 8-bit
352 struct i2c_client *client = max96712->client; in max96712_write_reg()
353 u16 client_addr = max96712->i2c_addr[i2c_id]; in max96712_write_reg()
359 dev_info(&client->dev, "addr(0x%02x) write reg(0x%04x, %d, 0x%02x)\n", in max96712_write_reg()
363 return -EINVAL; in max96712_write_reg()
378 val_i = 4 - val_len; in max96712_write_reg()
383 client->addr = client_addr; in max96712_write_reg()
386 dev_err(&client->dev, in max96712_write_reg()
388 __func__, reg, client->addr); in max96712_write_reg()
389 return -EIO; in max96712_write_reg()
398 struct i2c_client *client = max96712->client; in max96712_read_reg()
399 u16 client_addr = max96712->i2c_addr[i2c_id]; in max96712_read_reg()
408 return -EINVAL; in max96712_read_reg()
410 client->addr = client_addr; in max96712_read_reg()
415 msgs[0].addr = client->addr; in max96712_read_reg()
418 msgs[0].buf = ®_be_p[2 - reg_len]; in max96712_read_reg()
421 msgs[1].addr = client->addr; in max96712_read_reg()
424 msgs[1].buf = &data_be_p[4 - val_len]; in max96712_read_reg()
426 ret = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in max96712_read_reg()
428 dev_err(&client->dev, in max96712_read_reg()
430 __func__, reg, client->addr); in max96712_read_reg()
431 return -EIO; in max96712_read_reg()
437 dev_info(&client->dev, "addr(0x%02x) read reg(0x%04x, %d, 0x%02x)\n", in max96712_read_reg()
489 struct device *dev = &max96712->client->dev; in max96712_check_local_chipid()
498 return -ENODEV; in max96712_check_local_chipid()
508 struct device *dev = &max96712->client->dev; in max96712_check_remote_chipid()
522 return -ENODEV; in max96712_check_remote_chipid()
534 return -ENODEV; in max96712_check_remote_chipid()
544 struct device *dev = &max96712->client->dev; in max96712_get_link_lock_state()
548 link_type = max96712->link_mask & MAXIM_GMSL_TYPE_MASK; in max96712_get_link_lock_state()
643 struct device *dev = &max96712->client->dev; in max96712_check_link_lock_state()
666 link_type = max96712->link_mask & MAXIM_GMSL_TYPE_MASK; in max96712_check_link_lock_state()
672 if (max96712->rx_rate == MAX96712_RX_RATE_3GBPS) { in max96712_check_link_lock_state()
712 // Link A ~ Link D One-Shot Reset depend on link_mask in max96712_check_link_lock_state()
713 link_mask = max96712->link_mask & MAXIM_GMSL_LOCK_MASK; in max96712_check_link_lock_state()
768 return -ENODEV; in max96712_check_link_lock_state()
775 struct device *dev = &max96712->client->dev; in max96712_hot_plug_detect_irq_handler()
778 link_mask = max96712->link_mask & MAXIM_GMSL_LOCK_MASK; in max96712_hot_plug_detect_irq_handler()
779 if (max96712->streaming) { in max96712_hot_plug_detect_irq_handler()
793 struct device *dev = &max96712->client->dev; in max96712_dphy_dpll_predef_set()
898 struct device *dev = &max96712->client->dev; in max96712_auto_init_deskew()
903 // D-PHY Deskew Initial Calibration Control in max96712_auto_init_deskew()
929 struct device *dev = &max96712->client->dev; in max96712_frame_sync_period()
954 // Disable Vsync-Fsync overlap window in max96712_frame_sync_period()
964 fsync_peroid = DIV_ROUND_UP(pclk, period) - 1; in max96712_frame_sync_period()
1040 return abs(mode->width - framefmt->width) + in max96712_get_reso_dist()
1041 abs(mode->height - framefmt->height); in max96712_get_reso_dist()
1047 struct v4l2_mbus_framefmt *framefmt = &fmt->format; in max96712_find_best_fit()
1050 int cur_best_fit_dist = -1; in max96712_find_best_fit()
1053 for (i = 0; i < max96712->cfg_modes_num; i++) { in max96712_find_best_fit()
1054 dist = max96712_get_reso_dist(&max96712->supported_modes[i], framefmt); in max96712_find_best_fit()
1055 if ((cur_best_fit_dist == -1 || dist < cur_best_fit_dist) in max96712_find_best_fit()
1056 && (max96712->supported_modes[i].bus_fmt == framefmt->code)) { in max96712_find_best_fit()
1062 return &max96712->supported_modes[cur_best_fit]; in max96712_find_best_fit()
1074 mutex_lock(&max96712->mutex); in max96712_set_fmt()
1078 fmt->format.code = mode->bus_fmt; in max96712_set_fmt()
1079 fmt->format.width = mode->width; in max96712_set_fmt()
1080 fmt->format.height = mode->height; in max96712_set_fmt()
1081 fmt->format.field = V4L2_FIELD_NONE; in max96712_set_fmt()
1082 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in max96712_set_fmt()
1084 *v4l2_subdev_get_try_format(sd, cfg, fmt->pad) = fmt->format; in max96712_set_fmt()
1086 mutex_unlock(&max96712->mutex); in max96712_set_fmt()
1087 return -ENOTTY; in max96712_set_fmt()
1090 if (max96712->streaming) { in max96712_set_fmt()
1091 mutex_unlock(&max96712->mutex); in max96712_set_fmt()
1092 return -EBUSY; in max96712_set_fmt()
1095 max96712->cur_mode = mode; in max96712_set_fmt()
1097 __v4l2_ctrl_s_ctrl(max96712->link_freq, mode->link_freq_idx); in max96712_set_fmt()
1099 data_lanes = max96712->bus_cfg.bus.mipi_csi2.num_data_lanes; in max96712_set_fmt()
1100 pixel_rate = (u32)link_freq_items[mode->link_freq_idx] / mode->bpp * 2 * data_lanes; in max96712_set_fmt()
1101 __v4l2_ctrl_s_ctrl_int64(max96712->pixel_rate, pixel_rate); in max96712_set_fmt()
1103 dev_info(&max96712->client->dev, "mipi_freq_idx = %d, mipi_link_freq = %lld\n", in max96712_set_fmt()
1104 mode->link_freq_idx, link_freq_items[mode->link_freq_idx]); in max96712_set_fmt()
1105 dev_info(&max96712->client->dev, "pixel_rate = %lld, bpp = %d\n", in max96712_set_fmt()
1106 pixel_rate, mode->bpp); in max96712_set_fmt()
1109 mutex_unlock(&max96712->mutex); in max96712_set_fmt()
1119 const struct max96712_mode *mode = max96712->cur_mode; in max96712_get_fmt()
1121 mutex_lock(&max96712->mutex); in max96712_get_fmt()
1122 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) { in max96712_get_fmt()
1124 fmt->format = *v4l2_subdev_get_try_format(sd, cfg, fmt->pad); in max96712_get_fmt()
1126 mutex_unlock(&max96712->mutex); in max96712_get_fmt()
1127 return -ENOTTY; in max96712_get_fmt()
1130 fmt->format.width = mode->width; in max96712_get_fmt()
1131 fmt->format.height = mode->height; in max96712_get_fmt()
1132 fmt->format.code = mode->bus_fmt; in max96712_get_fmt()
1133 fmt->format.field = V4L2_FIELD_NONE; in max96712_get_fmt()
1134 if (fmt->pad < PAD_MAX && fmt->pad >= PAD0) in max96712_get_fmt()
1135 fmt->reserved[0] = mode->vc[fmt->pad]; in max96712_get_fmt()
1137 fmt->reserved[0] = mode->vc[PAD0]; in max96712_get_fmt()
1139 mutex_unlock(&max96712->mutex); in max96712_get_fmt()
1149 const struct max96712_mode *mode = max96712->cur_mode; in max96712_enum_mbus_code()
1151 if (code->index != 0) in max96712_enum_mbus_code()
1152 return -EINVAL; in max96712_enum_mbus_code()
1153 code->code = mode->bus_fmt; in max96712_enum_mbus_code()
1164 if (fse->index >= max96712->cfg_modes_num) in max96712_enum_frame_sizes()
1165 return -EINVAL; in max96712_enum_frame_sizes()
1167 if (fse->code != max96712->supported_modes[fse->index].bus_fmt) in max96712_enum_frame_sizes()
1168 return -EINVAL; in max96712_enum_frame_sizes()
1170 fse->min_width = max96712->supported_modes[fse->index].width; in max96712_enum_frame_sizes()
1171 fse->max_width = max96712->supported_modes[fse->index].width; in max96712_enum_frame_sizes()
1172 fse->max_height = max96712->supported_modes[fse->index].height; in max96712_enum_frame_sizes()
1173 fse->min_height = max96712->supported_modes[fse->index].height; in max96712_enum_frame_sizes()
1182 const struct max96712_mode *mode = max96712->cur_mode; in max96712_g_frame_interval()
1184 mutex_lock(&max96712->mutex); in max96712_g_frame_interval()
1185 fi->interval = mode->max_fps; in max96712_g_frame_interval()
1186 mutex_unlock(&max96712->mutex); in max96712_g_frame_interval()
1195 strscpy(inf->base.sensor, MAX96712_NAME, sizeof(inf->base.sensor)); in max96712_get_module_inf()
1196 strscpy(inf->base.module, max96712->module_name, in max96712_get_module_inf()
1197 sizeof(inf->base.module)); in max96712_get_module_inf()
1198 strscpy(inf->base.lens, max96712->len_name, sizeof(inf->base.lens)); in max96712_get_module_inf()
1205 struct i2c_client *client = max96712->client; in max96712_get_vicap_rst_inf()
1207 rst_info->is_reset = max96712->hot_plug; in max96712_get_vicap_rst_inf()
1208 max96712->hot_plug = false; in max96712_get_vicap_rst_inf()
1209 rst_info->src = RKCIF_RESET_SRC_ERR_HOTPLUG; in max96712_get_vicap_rst_inf()
1210 dev_info(&client->dev, "%s: rst_info->is_reset:%d.\n", __func__, in max96712_get_vicap_rst_inf()
1211 rst_info->is_reset); in max96712_get_vicap_rst_inf()
1218 max96712->is_reset = rst_info.is_reset; in max96712_set_vicap_rst_inf()
1252 if (dphy_param->vendor == rk3588_dcphy_param.vendor) in max96712_ioctl()
1254 dev_dbg(&max96712->client->dev, "sensor set dphy param\n"); in max96712_ioctl()
1258 if (dphy_param->vendor == rk3588_dcphy_param.vendor) in max96712_ioctl()
1260 dev_dbg(&max96712->client->dev, "sensor get dphy param\n"); in max96712_ioctl()
1263 ret = -ENOIOCTLCMD; in max96712_ioctl()
1287 ret = -ENOMEM; in max96712_compat_ioctl32()
1295 ret = -EFAULT; in max96712_compat_ioctl32()
1302 ret = -ENOMEM; in max96712_compat_ioctl32()
1310 ret = -EFAULT; in max96712_compat_ioctl32()
1316 ret = -ENOMEM; in max96712_compat_ioctl32()
1325 ret = -EFAULT; in max96712_compat_ioctl32()
1332 ret = -ENOMEM; in max96712_compat_ioctl32()
1340 ret = -EFAULT; in max96712_compat_ioctl32()
1346 ret = -ENOMEM; in max96712_compat_ioctl32()
1354 ret = -EFAULT; in max96712_compat_ioctl32()
1363 ret = -EFAULT; in max96712_compat_ioctl32()
1368 ret = -ENOMEM; in max96712_compat_ioctl32()
1376 ret = -EFAULT; in max96712_compat_ioctl32()
1382 ret = -ENOMEM; in max96712_compat_ioctl32()
1390 ret = -EFAULT; in max96712_compat_ioctl32()
1395 ret = -ENOIOCTLCMD; in max96712_compat_ioctl32()
1412 if (max96712->hot_plug_irq > 0) in __max96712_start_stream()
1413 enable_irq(max96712->hot_plug_irq); in __max96712_start_stream()
1416 max96712->cur_mode->reg_list); in __max96712_start_stream()
1420 link_freq_idx = max96712->cur_mode->link_freq_idx; in __max96712_start_stream()
1426 if (max96712->auto_init_deskew_mask != 0) { in __max96712_start_stream()
1428 max96712->auto_init_deskew_mask); in __max96712_start_stream()
1433 if (max96712->frame_sync_period != 0) { in __max96712_start_stream()
1435 max96712->frame_sync_period); in __max96712_start_stream()
1441 mutex_unlock(&max96712->mutex); in __max96712_start_stream()
1442 ret = v4l2_ctrl_handler_setup(&max96712->ctrl_handler); in __max96712_start_stream()
1443 mutex_lock(&max96712->mutex); in __max96712_start_stream()
1453 if (max96712->hot_plug_irq > 0) in __max96712_stop_stream()
1454 disable_irq(max96712->hot_plug_irq); in __max96712_stop_stream()
1462 struct i2c_client *client = max96712->client; in max96712_s_stream()
1465 dev_info(&client->dev, "%s: on: %d, %dx%d@%d\n", __func__, on, in max96712_s_stream()
1466 max96712->cur_mode->width, max96712->cur_mode->height, in max96712_s_stream()
1467 DIV_ROUND_CLOSEST(max96712->cur_mode->max_fps.denominator, in max96712_s_stream()
1468 max96712->cur_mode->max_fps.numerator)); in max96712_s_stream()
1470 mutex_lock(&max96712->mutex); in max96712_s_stream()
1472 if (on == max96712->streaming) in max96712_s_stream()
1476 ret = pm_runtime_get_sync(&client->dev); in max96712_s_stream()
1478 pm_runtime_put_noidle(&client->dev); in max96712_s_stream()
1485 pm_runtime_put(&client->dev); in max96712_s_stream()
1490 pm_runtime_put(&client->dev); in max96712_s_stream()
1493 max96712->streaming = on; in max96712_s_stream()
1496 mutex_unlock(&max96712->mutex); in max96712_s_stream()
1504 struct i2c_client *client = max96712->client; in max96712_s_power()
1507 mutex_lock(&max96712->mutex); in max96712_s_power()
1509 /* If the power state is not modified - no work to do. */ in max96712_s_power()
1510 if (max96712->power_on == !!on) in max96712_s_power()
1514 ret = pm_runtime_get_sync(&client->dev); in max96712_s_power()
1516 pm_runtime_put_noidle(&client->dev); in max96712_s_power()
1520 max96712->power_on = true; in max96712_s_power()
1522 pm_runtime_put(&client->dev); in max96712_s_power()
1523 max96712->power_on = false; in max96712_s_power()
1527 mutex_unlock(&max96712->mutex); in max96712_s_power()
1542 struct device *dev = &max96712->client->dev; in __max96712_power_on()
1544 if (!IS_ERR(max96712->power_gpio)) { in __max96712_power_on()
1545 gpiod_set_value_cansleep(max96712->power_gpio, 1); in __max96712_power_on()
1549 if (!IS_ERR(max96712->pocen_gpio)) { in __max96712_power_on()
1550 gpiod_set_value_cansleep(max96712->pocen_gpio, 1); in __max96712_power_on()
1554 if (!IS_ERR_OR_NULL(max96712->pins_default)) { in __max96712_power_on()
1555 ret = pinctrl_select_state(max96712->pinctrl, in __max96712_power_on()
1556 max96712->pins_default); in __max96712_power_on()
1561 if (!IS_ERR(max96712->reset_gpio)) in __max96712_power_on()
1562 gpiod_set_value_cansleep(max96712->reset_gpio, 0); in __max96712_power_on()
1564 ret = regulator_bulk_enable(MAX96712_NUM_SUPPLIES, max96712->supplies); in __max96712_power_on()
1569 if (!IS_ERR(max96712->reset_gpio)) { in __max96712_power_on()
1570 gpiod_set_value_cansleep(max96712->reset_gpio, 1); in __max96712_power_on()
1574 if (!IS_ERR(max96712->pwdn_gpio)) in __max96712_power_on()
1575 gpiod_set_value_cansleep(max96712->pwdn_gpio, 1); in __max96712_power_on()
1584 clk_disable_unprepare(max96712->xvclk); in __max96712_power_on()
1592 struct device *dev = &max96712->client->dev; in __max96712_power_off()
1594 if (!IS_ERR(max96712->pwdn_gpio)) in __max96712_power_off()
1595 gpiod_set_value_cansleep(max96712->pwdn_gpio, 0); in __max96712_power_off()
1596 clk_disable_unprepare(max96712->xvclk); in __max96712_power_off()
1598 if (!IS_ERR(max96712->reset_gpio)) in __max96712_power_off()
1599 gpiod_set_value_cansleep(max96712->reset_gpio, 0); in __max96712_power_off()
1601 if (!IS_ERR_OR_NULL(max96712->pins_sleep)) { in __max96712_power_off()
1602 ret = pinctrl_select_state(max96712->pinctrl, in __max96712_power_off()
1603 max96712->pins_sleep); in __max96712_power_off()
1608 regulator_bulk_disable(MAX96712_NUM_SUPPLIES, max96712->supplies); in __max96712_power_off()
1610 if (!IS_ERR(max96712->pocen_gpio)) in __max96712_power_off()
1611 gpiod_set_value_cansleep(max96712->pocen_gpio, 0); in __max96712_power_off()
1613 if (!IS_ERR(max96712->power_gpio)) in __max96712_power_off()
1614 gpiod_set_value_cansleep(max96712->power_gpio, 0); in __max96712_power_off()
1642 v4l2_subdev_get_try_format(sd, fh->pad, 0); in max96712_open()
1643 const struct max96712_mode *def_mode = &max96712->supported_modes[0]; in max96712_open()
1645 mutex_lock(&max96712->mutex); in max96712_open()
1647 try_fmt->width = def_mode->width; in max96712_open()
1648 try_fmt->height = def_mode->height; in max96712_open()
1649 try_fmt->code = def_mode->bus_fmt; in max96712_open()
1650 try_fmt->field = V4L2_FIELD_NONE; in max96712_open()
1652 mutex_unlock(&max96712->mutex); in max96712_open()
1666 if (fie->index >= max96712->cfg_modes_num) in max96712_enum_frame_interval()
1667 return -EINVAL; in max96712_enum_frame_interval()
1669 fie->code = max96712->supported_modes[fie->index].bus_fmt; in max96712_enum_frame_interval()
1670 fie->width = max96712->supported_modes[fie->index].width; in max96712_enum_frame_interval()
1671 fie->height = max96712->supported_modes[fie->index].height; in max96712_enum_frame_interval()
1672 fie->interval = max96712->supported_modes[fie->index].max_fps; in max96712_enum_frame_interval()
1682 u8 data_lanes = max96712->bus_cfg.bus.mipi_csi2.num_data_lanes; in max96712_g_mbus_config()
1685 val |= (1 << (data_lanes - 1)); in max96712_g_mbus_config()
1702 config->type = V4L2_MBUS_CSI2_DPHY; in max96712_g_mbus_config()
1703 config->flags = val; in max96712_g_mbus_config()
1714 if (sel->target == V4L2_SEL_TGT_CROP_BOUNDS) { in max96712_get_selection()
1715 sel->r.left = 0; in max96712_get_selection()
1716 sel->r.width = max96712->cur_mode->width; in max96712_get_selection()
1717 sel->r.top = 0; in max96712_get_selection()
1718 sel->r.height = max96712->cur_mode->height; in max96712_get_selection()
1722 return -EINVAL; in max96712_get_selection()
1771 handler = &max96712->ctrl_handler; in max96712_initialize_controls()
1773 mode = max96712->cur_mode; in max96712_initialize_controls()
1777 handler->lock = &max96712->mutex; in max96712_initialize_controls()
1779 max96712->link_freq = v4l2_ctrl_new_int_menu(handler, NULL, in max96712_initialize_controls()
1781 ARRAY_SIZE(link_freq_items) - 1, 0, in max96712_initialize_controls()
1783 __v4l2_ctrl_s_ctrl(max96712->link_freq, mode->link_freq_idx); in max96712_initialize_controls()
1784 dev_info(&max96712->client->dev, "mipi_freq_idx = %d, mipi_link_freq = %lld\n", in max96712_initialize_controls()
1785 mode->link_freq_idx, link_freq_items[mode->link_freq_idx]); in max96712_initialize_controls()
1788 data_lanes = max96712->bus_cfg.bus.mipi_csi2.num_data_lanes; in max96712_initialize_controls()
1789 pixel_rate = (u32)link_freq_items[mode->link_freq_idx] / mode->bpp * 2 * data_lanes; in max96712_initialize_controls()
1790 max96712->pixel_rate = in max96712_initialize_controls()
1793 dev_info(&max96712->client->dev, "pixel_rate = %lld, bpp = %d\n", in max96712_initialize_controls()
1794 pixel_rate, mode->bpp); in max96712_initialize_controls()
1796 if (handler->error) { in max96712_initialize_controls()
1797 ret = handler->error; in max96712_initialize_controls()
1798 dev_err(&max96712->client->dev, "Failed to init controls(%d)\n", in max96712_initialize_controls()
1803 max96712->subdev.ctrl_handler = handler; in max96712_initialize_controls()
1818 max96712->supplies[i].supply = max96712_supply_names[i]; in max96712_configure_regulators()
1820 return devm_regulator_bulk_get(&max96712->client->dev, in max96712_configure_regulators()
1822 max96712->supplies); in max96712_configure_regulators()
1827 struct device *dev = &max96712->client->dev; in max96712_parse_dt()
1828 struct device_node *node = dev->of_node; in max96712_parse_dt()
1829 u8 mipi_data_lanes = max96712->bus_cfg.bus.mipi_csi2.num_data_lanes; in max96712_parse_dt()
1834 ret = of_property_read_u32(node, "ser-i2c-addr", &value); in max96712_parse_dt()
1836 max96712->i2c_addr[I2C_DEV_SER] = SER_I2C_ADDR; in max96712_parse_dt()
1838 dev_info(dev, "ser-i2c-addr property: %d\n", value); in max96712_parse_dt()
1839 max96712->i2c_addr[I2C_DEV_SER] = value; in max96712_parse_dt()
1841 dev_info(dev, "serializer i2c address: 0x%02x\n", max96712->i2c_addr[I2C_DEV_SER]); in max96712_parse_dt()
1844 ret = of_property_read_u32(node, "link-rx-rate", in max96712_parse_dt()
1845 &max96712->rx_rate); in max96712_parse_dt()
1847 max96712->rx_rate = MAX96712_RX_RATE_6GBPS; in max96712_parse_dt()
1849 dev_info(dev, "link-rx-rate property: %d\n", max96712->rx_rate); in max96712_parse_dt()
1850 dev_info(dev, "serdes link receiver rate: %d\n", max96712->rx_rate); in max96712_parse_dt()
1854 * bit0 - LinkA, bit1 - LinkB, bit2 - LinkC, bit3 - LinkD in max96712_parse_dt()
1856 * bit4 - LinkA, bit5 - LinkB, bit6 - LinkC, bit7 = LinkD in max96712_parse_dt()
1858 ret = of_property_read_u32(node, "link-mask", in max96712_parse_dt()
1859 &max96712->link_mask); in max96712_parse_dt()
1863 max96712->link_mask = 0xFF; /* Link A/B/C/D: GMSL2 and enable */ in max96712_parse_dt()
1865 max96712->link_mask = 0x33; /* Link A/B: GMSL2 and enable */ in max96712_parse_dt()
1867 dev_info(dev, "link-mask property: 0x%08x\n", max96712->link_mask); in max96712_parse_dt()
1869 dev_info(dev, "serdes link mask: 0x%02x\n", max96712->link_mask); in max96712_parse_dt()
1872 ret = of_property_read_u32(node, "auto-init-deskew-mask", in max96712_parse_dt()
1873 &max96712->auto_init_deskew_mask); in max96712_parse_dt()
1875 max96712->auto_init_deskew_mask = 0x0F; // 0x0F: default enable all in max96712_parse_dt()
1876 dev_info(dev, "auto init deskew mask: 0x%02x\n", max96712->auto_init_deskew_mask); in max96712_parse_dt()
1879 ret = of_property_read_u32(node, "frame-sync-period", in max96712_parse_dt()
1880 &max96712->frame_sync_period); in max96712_parse_dt()
1882 max96712->frame_sync_period = 0; // 0: disable (default) in max96712_parse_dt()
1883 dev_info(dev, "frame sync period: %d\n", max96712->frame_sync_period); in max96712_parse_dt()
1891 struct device *dev = &client->dev; in max96712_probe()
1892 struct device_node *node = dev->of_node; in max96712_probe()
1905 return -ENOMEM; in max96712_probe()
1908 &max96712->module_index); in max96712_probe()
1910 &max96712->module_facing); in max96712_probe()
1912 &max96712->module_name); in max96712_probe()
1914 &max96712->len_name); in max96712_probe()
1917 return -EINVAL; in max96712_probe()
1920 max96712->regmap = devm_regmap_init_i2c(client, &max96712_regmap_config); in max96712_probe()
1921 if (IS_ERR(max96712->regmap)) { in max96712_probe()
1923 return PTR_ERR(max96712->regmap); in max96712_probe()
1926 max96712->client = client; in max96712_probe()
1930 max96712->i2c_addr[I2C_DEV_DES] = client->addr; in max96712_probe()
1931 max96712->i2c_addr[I2C_DEV_SER] = SER_I2C_ADDR; in max96712_probe()
1932 max96712->i2c_addr[I2C_DEV_CAM] = CAM_I2C_ADDR; in max96712_probe()
1934 endpoint = of_graph_get_next_endpoint(dev->of_node, NULL); in max96712_probe()
1937 return -EINVAL; in max96712_probe()
1941 &max96712->bus_cfg); in max96712_probe()
1944 return -EINVAL; in max96712_probe()
1946 mipi_data_lanes = max96712->bus_cfg.bus.mipi_csi2.num_data_lanes; in max96712_probe()
1950 max96712->supported_modes = supported_modes_4lane; in max96712_probe()
1951 max96712->cfg_modes_num = ARRAY_SIZE(supported_modes_4lane); in max96712_probe()
1954 return -EINVAL; in max96712_probe()
1956 max96712->cur_mode = &max96712->supported_modes[0]; in max96712_probe()
1958 max96712->power_gpio = devm_gpiod_get(dev, "power", GPIOD_OUT_LOW); in max96712_probe()
1959 if (IS_ERR(max96712->power_gpio)) in max96712_probe()
1960 dev_warn(dev, "Failed to get power-gpios, maybe no use\n"); in max96712_probe()
1962 max96712->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW); in max96712_probe()
1963 if (IS_ERR(max96712->reset_gpio)) in max96712_probe()
1964 dev_warn(dev, "Failed to get reset-gpios\n"); in max96712_probe()
1966 max96712->pwdn_gpio = devm_gpiod_get(dev, "pwdn", GPIOD_OUT_LOW); in max96712_probe()
1967 if (IS_ERR(max96712->pwdn_gpio)) in max96712_probe()
1968 dev_warn(dev, "Failed to get pwdn-gpios\n"); in max96712_probe()
1970 max96712->pocen_gpio = devm_gpiod_get(dev, "pocen", GPIOD_OUT_LOW); in max96712_probe()
1971 if (IS_ERR(max96712->pocen_gpio)) in max96712_probe()
1972 dev_warn(dev, "Failed to get pocen-gpios\n"); in max96712_probe()
1974 max96712->lock_gpio = devm_gpiod_get(dev, "lock", GPIOD_IN); in max96712_probe()
1975 if (IS_ERR(max96712->lock_gpio)) in max96712_probe()
1976 dev_warn(dev, "Failed to get lock-gpios\n"); in max96712_probe()
1984 max96712->pinctrl = devm_pinctrl_get(dev); in max96712_probe()
1985 if (!IS_ERR(max96712->pinctrl)) { in max96712_probe()
1986 max96712->pins_default = pinctrl_lookup_state( in max96712_probe()
1987 max96712->pinctrl, OF_CAMERA_PINCTRL_STATE_DEFAULT); in max96712_probe()
1988 if (IS_ERR(max96712->pins_default)) in max96712_probe()
1991 max96712->pins_sleep = pinctrl_lookup_state( in max96712_probe()
1992 max96712->pinctrl, OF_CAMERA_PINCTRL_STATE_SLEEP); in max96712_probe()
1993 if (IS_ERR(max96712->pins_sleep)) in max96712_probe()
1999 mutex_init(&max96712->mutex); in max96712_probe()
2001 sd = &max96712->subdev; in max96712_probe()
2016 sd->internal_ops = &max96712_internal_ops; in max96712_probe()
2017 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; in max96712_probe()
2020 max96712->pad.flags = MEDIA_PAD_FL_SOURCE; in max96712_probe()
2021 sd->entity.function = MEDIA_ENT_F_CAM_SENSOR; in max96712_probe()
2022 ret = media_entity_pads_init(&sd->entity, 1, &max96712->pad); in max96712_probe()
2028 if (strcmp(max96712->module_facing, "back") == 0) in max96712_probe()
2035 snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s", in max96712_probe()
2036 max96712->module_index, facing, MAX96712_NAME, in max96712_probe()
2037 dev_name(sd->dev)); in max96712_probe()
2044 if (!IS_ERR(max96712->lock_gpio)) { in max96712_probe()
2045 max96712->hot_plug_irq = gpiod_to_irq(max96712->lock_gpio); in max96712_probe()
2046 if (max96712->hot_plug_irq < 0) { in max96712_probe()
2050 max96712->hot_plug_irq, in max96712_probe()
2058 max96712->hot_plug_irq = -1; in max96712_probe()
2060 disable_irq(max96712->hot_plug_irq); in max96712_probe()
2073 media_entity_cleanup(&sd->entity); in max96712_probe()
2078 v4l2_ctrl_handler_free(&max96712->ctrl_handler); in max96712_probe()
2080 mutex_destroy(&max96712->mutex); in max96712_probe()
2092 media_entity_cleanup(&sd->entity); in max96712_remove()
2094 v4l2_ctrl_handler_free(&max96712->ctrl_handler); in max96712_remove()
2095 mutex_destroy(&max96712->mutex); in max96712_remove()
2097 pm_runtime_disable(&client->dev); in max96712_remove()
2098 if (!pm_runtime_status_suspended(&client->dev)) in max96712_remove()
2100 pm_runtime_set_suspended(&client->dev); in max96712_remove()
2107 { .compatible = "maxim,max96712" },