Lines Matching +full:no +full:- +full:sd
1 // SPDX-License-Identifier: GPL-2.0
5 * lt7911uxc type-c/DP to MIPI CSI-2 bridge driver.
7 * Author: Jianwei Fan <jianwei.fan@rock-chips.com>
33 #include <linux/rk-camera-module.h>
36 #include <linux/v4l2-dv-timings.h>
41 #include <media/v4l2-controls_rockchip.h>
42 #include <media/v4l2-ctrls.h>
43 #include <media/v4l2-device.h>
44 #include <media/v4l2-dv-timings.h>
45 #include <media/v4l2-event.h>
46 #include <media/v4l2-fwnode.h>
52 MODULE_PARM_DESC(debug, "debug level (0-3)");
128 struct v4l2_subdev sd; member
344 static void lt7911uxc_format_change(struct v4l2_subdev *sd);
345 static int lt7911uxc_s_ctrl_detect_tx_5v(struct v4l2_subdev *sd);
346 static int lt7911uxc_s_dv_timings(struct v4l2_subdev *sd,
349 static inline struct lt7911uxc *to_lt7911uxc(struct v4l2_subdev *sd) in to_lt7911uxc() argument
351 return container_of(sd, struct lt7911uxc, sd); in to_lt7911uxc()
354 static void i2c_rd(struct v4l2_subdev *sd, u16 reg, u8 *values, u32 n) in i2c_rd() argument
356 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in i2c_rd()
357 struct i2c_client *client = lt7911uxc->i2c_client; in i2c_rd()
363 msgs[0].addr = client->addr; in i2c_rd()
368 msgs[1].addr = client->addr; in i2c_rd()
373 msgs[2].addr = client->addr; in i2c_rd()
378 err = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in i2c_rd()
380 v4l2_err(sd, "%s: reading register 0x%x from 0x%x failed\n", in i2c_rd()
381 __func__, reg, client->addr); in i2c_rd()
389 v4l2_info(sd, "I2C read 0x%04x = 0x%02x\n", in i2c_rd()
393 v4l2_info(sd, "I2C read 0x%04x = 0x%02x%02x\n", in i2c_rd()
397 v4l2_info(sd, "I2C read 0x%04x = 0x%02x%02x%02x%02x\n", in i2c_rd()
401 v4l2_info(sd, "I2C read %d bytes from address 0x%04x\n", in i2c_rd()
406 static void i2c_wr(struct v4l2_subdev *sd, u16 reg, u8 *values, u32 n) in i2c_wr() argument
408 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in i2c_wr()
409 struct i2c_client *client = lt7911uxc->i2c_client; in i2c_wr()
416 n = I2C_MAX_XFER_SIZE - 1; in i2c_wr()
417 v4l2_warn(sd, "i2c wr reg=%04x: len=%d is too big!\n", in i2c_wr()
421 msgs[0].addr = client->addr; in i2c_wr()
426 msgs[1].addr = client->addr; in i2c_wr()
435 err = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs)); in i2c_wr()
437 v4l2_err(sd, "%s: writing register 0x%x from 0x%x failed\n", in i2c_wr()
438 __func__, reg, client->addr); in i2c_wr()
447 v4l2_info(sd, "I2C write 0x%04x = 0x%02x\n", in i2c_wr()
451 v4l2_info(sd, "I2C write 0x%04x = 0x%02x%02x\n", in i2c_wr()
455 v4l2_info(sd, "I2C write 0x%04x = 0x%02x%02x%02x%02x\n", in i2c_wr()
459 v4l2_info(sd, "I2C write %d bytes from address 0x%04x\n", in i2c_wr()
464 static u8 i2c_rd8(struct v4l2_subdev *sd, u16 reg) in i2c_rd8() argument
468 i2c_rd(sd, reg, (u8 __force *)&val, 1); in i2c_rd8()
472 static void i2c_wr8(struct v4l2_subdev *sd, u16 reg, u8 val) in i2c_wr8() argument
474 i2c_wr(sd, reg, &val, 1); in i2c_wr8()
477 static void lt7911uxc_i2c_enable(struct v4l2_subdev *sd) in lt7911uxc_i2c_enable() argument
479 i2c_wr8(sd, I2C_EN_REG, I2C_ENABLE); in lt7911uxc_i2c_enable()
482 static void lt7911uxc_i2c_disable(struct v4l2_subdev *sd) in lt7911uxc_i2c_disable() argument
484 i2c_wr8(sd, I2C_EN_REG, I2C_DISABLE); in lt7911uxc_i2c_disable()
487 static inline bool tx_5v_power_present(struct v4l2_subdev *sd) in tx_5v_power_present() argument
491 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in tx_5v_power_present()
494 if (!lt7911uxc->plugin_det_gpio) in tx_5v_power_present()
499 val = gpiod_get_value(lt7911uxc->plugin_det_gpio); in tx_5v_power_present()
506 v4l2_dbg(1, debug, sd, "%s: %d\n", __func__, ret); in tx_5v_power_present()
511 static inline bool no_signal(struct v4l2_subdev *sd) in no_signal() argument
513 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in no_signal()
515 v4l2_dbg(1, debug, sd, "%s no signal:%d\n", __func__, in no_signal()
516 lt7911uxc->nosignal); in no_signal()
518 return lt7911uxc->nosignal; in no_signal()
521 static inline bool audio_present(struct v4l2_subdev *sd) in audio_present() argument
523 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in audio_present()
525 return lt7911uxc->is_audio_present; in audio_present()
528 static int get_audio_sampling_rate(struct v4l2_subdev *sd) in get_audio_sampling_rate() argument
535 if (no_signal(sd)) in get_audio_sampling_rate()
546 return DIV_ROUND_CLOSEST((unsigned int)t->pixelclock, in fps_calc()
550 static bool lt7911uxc_rcv_supported_res(struct v4l2_subdev *sd, u32 width, in lt7911uxc_rcv_supported_res() argument
553 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_rcv_supported_res()
556 for (i = 0; i < lt7911uxc->cfg_num; i++) { in lt7911uxc_rcv_supported_res()
557 if ((lt7911uxc->support_modes[i].width == width) && in lt7911uxc_rcv_supported_res()
558 (lt7911uxc->support_modes[i].height == height)) { in lt7911uxc_rcv_supported_res()
563 if (i == lt7911uxc->cfg_num) { in lt7911uxc_rcv_supported_res()
564 v4l2_err(sd, "%s do not support res wxh: %dx%d\n", __func__, in lt7911uxc_rcv_supported_res()
572 static int lt7911uxc_get_detected_timings(struct v4l2_subdev *sd, in lt7911uxc_get_detected_timings() argument
575 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_get_detected_timings()
576 struct v4l2_bt_timings *bt = &timings->bt; in lt7911uxc_get_detected_timings()
585 clk_h = i2c_rd8(sd, PCLK_H); in lt7911uxc_get_detected_timings()
586 clk_m = i2c_rd8(sd, PCLK_M); in lt7911uxc_get_detected_timings()
587 clk_l = i2c_rd8(sd, PCLK_L); in lt7911uxc_get_detected_timings()
591 clk_h = i2c_rd8(sd, BYTE_PCLK_H); in lt7911uxc_get_detected_timings()
592 clk_m = i2c_rd8(sd, BYTE_PCLK_M); in lt7911uxc_get_detected_timings()
593 clk_l = i2c_rd8(sd, BYTE_PCLK_L); in lt7911uxc_get_detected_timings()
598 val_h = i2c_rd8(sd, HTOTAL_H); in lt7911uxc_get_detected_timings()
599 val_l = i2c_rd8(sd, HTOTAL_L); in lt7911uxc_get_detected_timings()
602 val_h = i2c_rd8(sd, VTOTAL_H); in lt7911uxc_get_detected_timings()
603 val_l = i2c_rd8(sd, VTOTAL_L); in lt7911uxc_get_detected_timings()
606 val_h = i2c_rd8(sd, HACT_H); in lt7911uxc_get_detected_timings()
607 val_l = i2c_rd8(sd, HACT_L); in lt7911uxc_get_detected_timings()
610 val_h = i2c_rd8(sd, VACT_H); in lt7911uxc_get_detected_timings()
611 val_l = i2c_rd8(sd, VACT_L); in lt7911uxc_get_detected_timings()
614 lt7911uxc->nosignal = false; in lt7911uxc_get_detected_timings()
615 lt7911uxc->is_audio_present = true; in lt7911uxc_get_detected_timings()
616 timings->type = V4L2_DV_BT_656_1120; in lt7911uxc_get_detected_timings()
617 bt->interlaced = V4L2_DV_PROGRESSIVE; in lt7911uxc_get_detected_timings()
618 bt->width = hact; in lt7911uxc_get_detected_timings()
619 bt->height = vact; in lt7911uxc_get_detected_timings()
620 bt->pixelclock = pixel_clock; in lt7911uxc_get_detected_timings()
623 if (!lt7911uxc_rcv_supported_res(sd, hact, vact)) { in lt7911uxc_get_detected_timings()
624 lt7911uxc->nosignal = true; in lt7911uxc_get_detected_timings()
625 v4l2_err(sd, "%s: rcv err res, return no signal!\n", __func__); in lt7911uxc_get_detected_timings()
626 return -EINVAL; in lt7911uxc_get_detected_timings()
629 v4l2_info(sd, "act:%dx%d, total:%dx%d, pixclk:%d, fps:%d\n", in lt7911uxc_get_detected_timings()
631 v4l2_info(sd, "byte_clk:%llu, mipi_clk:%llu, mipi_data_rate:%llu\n", in lt7911uxc_get_detected_timings()
633 v4l2_info(sd, "inerlaced:%d\n", bt->interlaced); in lt7911uxc_get_detected_timings()
643 struct v4l2_subdev *sd = <7911uxc->sd; in lt7911uxc_delayed_work_hotplug() local
645 lt7911uxc_s_ctrl_detect_tx_5v(sd); in lt7911uxc_delayed_work_hotplug()
648 static void lt7911uxc_s_ctrl_detect_event(struct v4l2_subdev *sd) in lt7911uxc_s_ctrl_detect_event() argument
650 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_s_ctrl_detect_event()
653 val = i2c_rd8(sd, 0xe084); in lt7911uxc_s_ctrl_detect_event()
655 v4l2_ctrl_s_ctrl(lt7911uxc->detect_tx_5v_ctrl, 1); in lt7911uxc_s_ctrl_detect_event()
657 v4l2_ctrl_s_ctrl(lt7911uxc->detect_tx_5v_ctrl, 0); in lt7911uxc_s_ctrl_detect_event()
665 struct v4l2_subdev *sd = <7911uxc->sd; in lt7911uxc_delayed_work_res_change() local
667 lt7911uxc_s_ctrl_detect_event(sd); in lt7911uxc_delayed_work_res_change()
668 lt7911uxc_format_change(sd); in lt7911uxc_delayed_work_res_change()
671 static int lt7911uxc_s_ctrl_detect_tx_5v(struct v4l2_subdev *sd) in lt7911uxc_s_ctrl_detect_tx_5v() argument
673 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_s_ctrl_detect_tx_5v()
675 return v4l2_ctrl_s_ctrl(lt7911uxc->detect_tx_5v_ctrl, in lt7911uxc_s_ctrl_detect_tx_5v()
676 tx_5v_power_present(sd)); in lt7911uxc_s_ctrl_detect_tx_5v()
679 static int lt7911uxc_s_ctrl_audio_sampling_rate(struct v4l2_subdev *sd) in lt7911uxc_s_ctrl_audio_sampling_rate() argument
681 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_s_ctrl_audio_sampling_rate()
683 return v4l2_ctrl_s_ctrl(lt7911uxc->audio_sampling_rate_ctrl, in lt7911uxc_s_ctrl_audio_sampling_rate()
684 get_audio_sampling_rate(sd)); in lt7911uxc_s_ctrl_audio_sampling_rate()
687 static int lt7911uxc_s_ctrl_audio_present(struct v4l2_subdev *sd) in lt7911uxc_s_ctrl_audio_present() argument
689 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_s_ctrl_audio_present()
691 return v4l2_ctrl_s_ctrl(lt7911uxc->audio_present_ctrl, in lt7911uxc_s_ctrl_audio_present()
692 audio_present(sd)); in lt7911uxc_s_ctrl_audio_present()
695 static int lt7911uxc_update_controls(struct v4l2_subdev *sd) in lt7911uxc_update_controls() argument
699 ret |= lt7911uxc_s_ctrl_detect_tx_5v(sd); in lt7911uxc_update_controls()
700 ret |= lt7911uxc_s_ctrl_audio_sampling_rate(sd); in lt7911uxc_update_controls()
701 ret |= lt7911uxc_s_ctrl_audio_present(sd); in lt7911uxc_update_controls()
706 static void lt7911uxc_cphy_timing_config(struct v4l2_subdev *sd) in lt7911uxc_cphy_timing_config() argument
708 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_cphy_timing_config()
710 if (lt7911uxc->bus_cfg.bus_type == V4L2_MBUS_CSI2_CPHY) { in lt7911uxc_cphy_timing_config()
711 lt7911uxc_i2c_enable(sd); in lt7911uxc_cphy_timing_config()
712 while (i2c_rd8(sd, HS_RQST_PRE_REG) != 0x3c) { in lt7911uxc_cphy_timing_config()
713 i2c_wr8(sd, HS_RQST_PRE_REG, 0x3c); in lt7911uxc_cphy_timing_config()
716 // i2c_wr8(sd, HS_TRAIL, 0x0b); in lt7911uxc_cphy_timing_config()
717 lt7911uxc_i2c_disable(sd); in lt7911uxc_cphy_timing_config()
720 v4l2_dbg(1, debug, sd, "%s config timing succeed\n", __func__); in lt7911uxc_cphy_timing_config()
726 if (t1->type != t2->type || t1->type != V4L2_DV_BT_656_1120) in lt7911uxc_match_timings()
728 if (t1->bt.width == t2->bt.width && in lt7911uxc_match_timings()
729 t1->bt.height == t2->bt.height && in lt7911uxc_match_timings()
730 t1->bt.interlaced == t2->bt.interlaced) in lt7911uxc_match_timings()
736 static inline void enable_stream(struct v4l2_subdev *sd, bool enable) in enable_stream() argument
738 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in enable_stream()
740 lt7911uxc_cphy_timing_config(<7911uxc->sd); in enable_stream()
743 i2c_wr8(<7911uxc->sd, STREAM_CTL, ENABLE_STREAM); in enable_stream()
745 i2c_wr8(<7911uxc->sd, STREAM_CTL, DISABLE_STREAM); in enable_stream()
748 v4l2_dbg(2, debug, sd, "%s: %sable\n", in enable_stream()
755 struct v4l2_bt_timings *bt = &timings->bt; in lt7911uxc_get_reso_dist()
759 dist_fps = DIV_ROUND_CLOSEST(mode->max_fps.denominator, mode->max_fps.numerator); in lt7911uxc_get_reso_dist()
761 return abs(mode->width - bt->width) + in lt7911uxc_get_reso_dist()
762 abs(mode->height - bt->height) + abs(dist_fps - cur_fps); in lt7911uxc_get_reso_dist()
770 int cur_best_fit_dist = -1; in lt7911uxc_find_best_fit()
773 for (i = 0; i < lt7911uxc->cfg_num; i++) { in lt7911uxc_find_best_fit()
774 dist = lt7911uxc_get_reso_dist(<7911uxc->support_modes[i], <7911uxc->timings); in lt7911uxc_find_best_fit()
775 if (cur_best_fit_dist == -1 || dist < cur_best_fit_dist) { in lt7911uxc_find_best_fit()
780 dev_dbg(<7911uxc->i2c_client->dev, in lt7911uxc_find_best_fit()
782 cur_best_fit, lt7911uxc->support_modes[cur_best_fit].width, in lt7911uxc_find_best_fit()
783 lt7911uxc->support_modes[cur_best_fit].height, in lt7911uxc_find_best_fit()
784 DIV_ROUND_CLOSEST(lt7911uxc->support_modes[cur_best_fit].max_fps.denominator, in lt7911uxc_find_best_fit()
785 lt7911uxc->support_modes[cur_best_fit].max_fps.numerator)); in lt7911uxc_find_best_fit()
787 return <7911uxc->support_modes[cur_best_fit]; in lt7911uxc_find_best_fit()
790 static void lt7911uxc_print_dv_timings(struct v4l2_subdev *sd, const char *prefix) in lt7911uxc_print_dv_timings() argument
792 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_print_dv_timings()
793 struct device *dev = <7911uxc->i2c_client->dev; in lt7911uxc_print_dv_timings()
794 const struct v4l2_bt_timings *bt = <7911uxc->timings.bt; in lt7911uxc_print_dv_timings()
800 lt7911uxc->cur_mode = mode; in lt7911uxc_print_dv_timings()
801 htot = lt7911uxc->cur_mode->hts_def; in lt7911uxc_print_dv_timings()
802 vtot = lt7911uxc->cur_mode->vts_def; in lt7911uxc_print_dv_timings()
803 if (bt->interlaced) in lt7911uxc_print_dv_timings()
806 fps = (htot * vtot) > 0 ? div_u64((100 * (u64)bt->pixelclock), in lt7911uxc_print_dv_timings()
812 dev_info(dev, "%s: %s%ux%u%s%u.%02u (%ux%u)\n", sd->name, prefix, in lt7911uxc_print_dv_timings()
813 bt->width, bt->height, bt->interlaced ? "i" : "p", in lt7911uxc_print_dv_timings()
817 static void lt7911uxc_format_change(struct v4l2_subdev *sd) in lt7911uxc_format_change() argument
819 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_format_change()
826 if (lt7911uxc_get_detected_timings(sd, &timings)) { in lt7911uxc_format_change()
827 enable_stream(sd, false); in lt7911uxc_format_change()
828 v4l2_dbg(1, debug, sd, "%s: No signal\n", __func__); in lt7911uxc_format_change()
831 if (!lt7911uxc_match_timings(<7911uxc->timings, &timings)) { in lt7911uxc_format_change()
832 enable_stream(sd, false); in lt7911uxc_format_change()
834 lt7911uxc_s_dv_timings(sd, &timings); in lt7911uxc_format_change()
835 lt7911uxc_print_dv_timings(sd, in lt7911uxc_format_change()
838 if (sd->devnode) in lt7911uxc_format_change()
839 v4l2_subdev_notify_event(sd, <7911uxc_ev_fmt); in lt7911uxc_format_change()
842 static int lt7911uxc_isr(struct v4l2_subdev *sd, u32 status, bool *handled) in lt7911uxc_isr() argument
844 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_isr()
846 schedule_delayed_work(<7911uxc->delayed_work_res_change, HZ / 20); in lt7911uxc_isr()
857 lt7911uxc_isr(<7911uxc->sd, 0, &handled); in lt7911uxc_res_change_irq_handler()
867 schedule_delayed_work(<7911uxc->delayed_work_hotplug, in plugin_detect_irq_handler()
877 schedule_work(<7911uxc->work_i2c_poll); in lt7911uxc_irq_poll_timer()
878 mod_timer(<7911uxc->timer, jiffies + msecs_to_jiffies(POLL_INTERVAL_MS)); in lt7911uxc_irq_poll_timer()
885 struct v4l2_subdev *sd = <7911uxc->sd; in lt7911uxc_work_i2c_poll() local
887 lt7911uxc_format_change(sd); in lt7911uxc_work_i2c_poll()
890 static int lt7911uxc_subscribe_event(struct v4l2_subdev *sd, struct v4l2_fh *fh, in lt7911uxc_subscribe_event() argument
893 switch (sub->type) { in lt7911uxc_subscribe_event()
895 return v4l2_src_change_event_subdev_subscribe(sd, fh, sub); in lt7911uxc_subscribe_event()
897 return v4l2_ctrl_subdev_subscribe_event(sd, fh, sub); in lt7911uxc_subscribe_event()
899 return -EINVAL; in lt7911uxc_subscribe_event()
903 static int lt7911uxc_g_input_status(struct v4l2_subdev *sd, u32 *status) in lt7911uxc_g_input_status() argument
906 *status |= no_signal(sd) ? V4L2_IN_ST_NO_SIGNAL : 0; in lt7911uxc_g_input_status()
908 v4l2_dbg(1, debug, sd, "%s: status = 0x%x\n", __func__, *status); in lt7911uxc_g_input_status()
913 static int lt7911uxc_s_dv_timings(struct v4l2_subdev *sd, in lt7911uxc_s_dv_timings() argument
916 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_s_dv_timings()
919 return -EINVAL; in lt7911uxc_s_dv_timings()
922 v4l2_print_dv_timings(sd->name, "s_dv_timings: ", in lt7911uxc_s_dv_timings()
925 if (lt7911uxc_match_timings(<7911uxc->timings, timings)) { in lt7911uxc_s_dv_timings()
926 v4l2_dbg(1, debug, sd, "%s: no change\n", __func__); in lt7911uxc_s_dv_timings()
932 v4l2_dbg(1, debug, sd, "%s: timings out of range\n", __func__); in lt7911uxc_s_dv_timings()
933 return -ERANGE; in lt7911uxc_s_dv_timings()
936 lt7911uxc->timings = *timings; in lt7911uxc_s_dv_timings()
938 enable_stream(sd, false); in lt7911uxc_s_dv_timings()
943 static int lt7911uxc_g_dv_timings(struct v4l2_subdev *sd, in lt7911uxc_g_dv_timings() argument
946 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_g_dv_timings()
948 *timings = lt7911uxc->timings; in lt7911uxc_g_dv_timings()
953 static int lt7911uxc_enum_dv_timings(struct v4l2_subdev *sd, in lt7911uxc_enum_dv_timings() argument
956 if (timings->pad != 0) in lt7911uxc_enum_dv_timings()
957 return -EINVAL; in lt7911uxc_enum_dv_timings()
963 static int lt7911uxc_query_dv_timings(struct v4l2_subdev *sd, in lt7911uxc_query_dv_timings() argument
966 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_query_dv_timings()
968 *timings = lt7911uxc->timings; in lt7911uxc_query_dv_timings()
970 v4l2_print_dv_timings(sd->name, in lt7911uxc_query_dv_timings()
975 v4l2_dbg(1, debug, sd, "%s: timings out of range\n", in lt7911uxc_query_dv_timings()
978 return -ERANGE; in lt7911uxc_query_dv_timings()
984 static int lt7911uxc_dv_timings_cap(struct v4l2_subdev *sd, in lt7911uxc_dv_timings_cap() argument
987 if (cap->pad != 0) in lt7911uxc_dv_timings_cap()
988 return -EINVAL; in lt7911uxc_dv_timings_cap()
995 static int lt7911uxc_g_mbus_config(struct v4l2_subdev *sd, in lt7911uxc_g_mbus_config() argument
998 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_g_mbus_config()
999 u32 lane_num = lt7911uxc->bus_cfg.bus.mipi_csi2.num_data_lanes; in lt7911uxc_g_mbus_config()
1002 val = 1 << (lane_num - 1) | in lt7911uxc_g_mbus_config()
1006 cfg->type = lt7911uxc->bus_cfg.bus_type; in lt7911uxc_g_mbus_config()
1007 cfg->flags = val; in lt7911uxc_g_mbus_config()
1012 static int lt7911uxc_s_stream(struct v4l2_subdev *sd, int on) in lt7911uxc_s_stream() argument
1014 enable_stream(sd, on); in lt7911uxc_s_stream()
1019 static int lt7911uxc_enum_mbus_code(struct v4l2_subdev *sd, in lt7911uxc_enum_mbus_code() argument
1023 switch (code->index) { in lt7911uxc_enum_mbus_code()
1025 code->code = LT7911UXC_MEDIA_BUS_FMT; in lt7911uxc_enum_mbus_code()
1029 return -EINVAL; in lt7911uxc_enum_mbus_code()
1035 static int lt7911uxc_enum_frame_sizes(struct v4l2_subdev *sd, in lt7911uxc_enum_frame_sizes() argument
1039 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_enum_frame_sizes()
1041 if (fse->index >= lt7911uxc->cfg_num) in lt7911uxc_enum_frame_sizes()
1042 return -EINVAL; in lt7911uxc_enum_frame_sizes()
1044 if (fse->code != LT7911UXC_MEDIA_BUS_FMT) in lt7911uxc_enum_frame_sizes()
1045 return -EINVAL; in lt7911uxc_enum_frame_sizes()
1047 fse->min_width = lt7911uxc->support_modes[fse->index].width; in lt7911uxc_enum_frame_sizes()
1048 fse->max_width = lt7911uxc->support_modes[fse->index].width; in lt7911uxc_enum_frame_sizes()
1049 fse->max_height = lt7911uxc->support_modes[fse->index].height; in lt7911uxc_enum_frame_sizes()
1050 fse->min_height = lt7911uxc->support_modes[fse->index].height; in lt7911uxc_enum_frame_sizes()
1055 static int lt7911uxc_get_fmt(struct v4l2_subdev *sd, in lt7911uxc_get_fmt() argument
1059 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_get_fmt()
1062 mutex_lock(<7911uxc->confctl_mutex); in lt7911uxc_get_fmt()
1063 format->format.code = lt7911uxc->mbus_fmt_code; in lt7911uxc_get_fmt()
1064 format->format.width = lt7911uxc->timings.bt.width; in lt7911uxc_get_fmt()
1065 format->format.height = lt7911uxc->timings.bt.height; in lt7911uxc_get_fmt()
1066 format->format.field = in lt7911uxc_get_fmt()
1067 lt7911uxc->timings.bt.interlaced ? in lt7911uxc_get_fmt()
1069 format->format.colorspace = V4L2_COLORSPACE_SRGB; in lt7911uxc_get_fmt()
1070 mutex_unlock(<7911uxc->confctl_mutex); in lt7911uxc_get_fmt()
1073 lt7911uxc->cur_mode = mode; in lt7911uxc_get_fmt()
1075 __v4l2_ctrl_s_ctrl_int64(lt7911uxc->pixel_rate, in lt7911uxc_get_fmt()
1077 __v4l2_ctrl_s_ctrl(lt7911uxc->link_freq, in lt7911uxc_get_fmt()
1078 mode->mipi_freq_idx); in lt7911uxc_get_fmt()
1080 v4l2_dbg(1, debug, sd, "%s: mode->mipi_freq_idx(%d)", in lt7911uxc_get_fmt()
1081 __func__, mode->mipi_freq_idx); in lt7911uxc_get_fmt()
1083 v4l2_dbg(1, debug, sd, "%s: fmt code:%d, w:%d, h:%d, field code:%d\n", in lt7911uxc_get_fmt()
1084 __func__, format->format.code, format->format.width, in lt7911uxc_get_fmt()
1085 format->format.height, format->format.field); in lt7911uxc_get_fmt()
1090 static int lt7911uxc_enum_frame_interval(struct v4l2_subdev *sd, in lt7911uxc_enum_frame_interval() argument
1094 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_enum_frame_interval()
1096 if (fie->index >= lt7911uxc->cfg_num) in lt7911uxc_enum_frame_interval()
1097 return -EINVAL; in lt7911uxc_enum_frame_interval()
1099 fie->code = LT7911UXC_MEDIA_BUS_FMT; in lt7911uxc_enum_frame_interval()
1101 fie->width = lt7911uxc->support_modes[fie->index].width; in lt7911uxc_enum_frame_interval()
1102 fie->height = lt7911uxc->support_modes[fie->index].height; in lt7911uxc_enum_frame_interval()
1103 fie->interval = lt7911uxc->support_modes[fie->index].max_fps; in lt7911uxc_enum_frame_interval()
1108 static int lt7911uxc_set_fmt(struct v4l2_subdev *sd, in lt7911uxc_set_fmt() argument
1112 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_set_fmt()
1116 u32 code = format->format.code; in lt7911uxc_set_fmt()
1117 int ret = lt7911uxc_get_fmt(sd, cfg, format); in lt7911uxc_set_fmt()
1119 format->format.code = code; in lt7911uxc_set_fmt()
1129 return -EINVAL; in lt7911uxc_set_fmt()
1132 if (format->which == V4L2_SUBDEV_FORMAT_TRY) in lt7911uxc_set_fmt()
1135 lt7911uxc->mbus_fmt_code = format->format.code; in lt7911uxc_set_fmt()
1137 lt7911uxc->cur_mode = mode; in lt7911uxc_set_fmt()
1139 enable_stream(sd, false); in lt7911uxc_set_fmt()
1144 static int lt7911uxc_g_frame_interval(struct v4l2_subdev *sd, in lt7911uxc_g_frame_interval() argument
1147 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_g_frame_interval()
1148 const struct lt7911uxc_mode *mode = lt7911uxc->cur_mode; in lt7911uxc_g_frame_interval()
1150 mutex_lock(<7911uxc->confctl_mutex); in lt7911uxc_g_frame_interval()
1151 fi->interval = mode->max_fps; in lt7911uxc_g_frame_interval()
1152 mutex_unlock(<7911uxc->confctl_mutex); in lt7911uxc_g_frame_interval()
1161 strscpy(inf->base.sensor, LT7911UXC_NAME, sizeof(inf->base.sensor)); in lt7911uxc_get_module_inf()
1162 strscpy(inf->base.module, lt7911uxc->module_name, sizeof(inf->base.module)); in lt7911uxc_get_module_inf()
1163 strscpy(inf->base.lens, lt7911uxc->len_name, sizeof(inf->base.lens)); in lt7911uxc_get_module_inf()
1166 static long lt7911uxc_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg) in lt7911uxc_ioctl() argument
1168 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_ioctl()
1181 if (dphy_param->vendor == rk3588_dcphy_param.vendor) in lt7911uxc_ioctl()
1183 dev_dbg(<7911uxc->i2c_client->dev, in lt7911uxc_ioctl()
1188 if (dphy_param->vendor == rk3588_dcphy_param.vendor) in lt7911uxc_ioctl()
1190 dev_dbg(<7911uxc->i2c_client->dev, in lt7911uxc_ioctl()
1194 ret = -ENOIOCTLCMD; in lt7911uxc_ioctl()
1201 static int lt7911uxc_s_power(struct v4l2_subdev *sd, int on) in lt7911uxc_s_power() argument
1203 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_s_power()
1206 mutex_lock(<7911uxc->confctl_mutex); in lt7911uxc_s_power()
1208 if (lt7911uxc->power_on == !!on) in lt7911uxc_s_power()
1212 lt7911uxc->power_on = true; in lt7911uxc_s_power()
1214 lt7911uxc->power_on = false; in lt7911uxc_s_power()
1217 mutex_unlock(<7911uxc->confctl_mutex); in lt7911uxc_s_power()
1223 static long lt7911uxc_compat_ioctl32(struct v4l2_subdev *sd, in lt7911uxc_compat_ioctl32() argument
1236 ret = -ENOMEM; in lt7911uxc_compat_ioctl32()
1240 ret = lt7911uxc_ioctl(sd, cmd, inf); in lt7911uxc_compat_ioctl32()
1244 ret = -EFAULT; in lt7911uxc_compat_ioctl32()
1251 ret = -ENOMEM; in lt7911uxc_compat_ioctl32()
1255 ret = lt7911uxc_ioctl(sd, cmd, seq); in lt7911uxc_compat_ioctl32()
1259 ret = -EFAULT; in lt7911uxc_compat_ioctl32()
1266 ret = -ENOMEM; in lt7911uxc_compat_ioctl32()
1272 ret = lt7911uxc_ioctl(sd, cmd, dphy_param); in lt7911uxc_compat_ioctl32()
1274 ret = -EFAULT; in lt7911uxc_compat_ioctl32()
1280 ret = -ENOMEM; in lt7911uxc_compat_ioctl32()
1284 ret = lt7911uxc_ioctl(sd, cmd, dphy_param); in lt7911uxc_compat_ioctl32()
1288 ret = -EFAULT; in lt7911uxc_compat_ioctl32()
1293 ret = -ENOIOCTLCMD; in lt7911uxc_compat_ioctl32()
1302 static int lt7911uxc_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) in lt7911uxc_open() argument
1304 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_open()
1306 v4l2_subdev_get_try_format(sd, fh->pad, 0); in lt7911uxc_open()
1307 const struct lt7911uxc_mode *def_mode = <7911uxc->support_modes[0]; in lt7911uxc_open()
1309 mutex_lock(<7911uxc->confctl_mutex); in lt7911uxc_open()
1311 try_fmt->width = def_mode->width; in lt7911uxc_open()
1312 try_fmt->height = def_mode->height; in lt7911uxc_open()
1313 try_fmt->code = LT7911UXC_MEDIA_BUS_FMT; in lt7911uxc_open()
1314 try_fmt->field = V4L2_FIELD_NONE; in lt7911uxc_open()
1315 mutex_unlock(<7911uxc->confctl_mutex); in lt7911uxc_open()
1389 struct v4l2_subdev *sd; in lt7911uxc_init_v4l2_ctrls() local
1392 mode = lt7911uxc->cur_mode; in lt7911uxc_init_v4l2_ctrls()
1393 sd = <7911uxc->sd; in lt7911uxc_init_v4l2_ctrls()
1394 ret = v4l2_ctrl_handler_init(<7911uxc->hdl, 5); in lt7911uxc_init_v4l2_ctrls()
1398 lt7911uxc->link_freq = v4l2_ctrl_new_int_menu(<7911uxc->hdl, NULL, in lt7911uxc_init_v4l2_ctrls()
1400 ARRAY_SIZE(link_freq_menu_items) - 1, 0, in lt7911uxc_init_v4l2_ctrls()
1402 lt7911uxc->pixel_rate = v4l2_ctrl_new_std(<7911uxc->hdl, NULL, in lt7911uxc_init_v4l2_ctrls()
1406 lt7911uxc->detect_tx_5v_ctrl = v4l2_ctrl_new_std(<7911uxc->hdl, in lt7911uxc_init_v4l2_ctrls()
1410 lt7911uxc->audio_sampling_rate_ctrl = in lt7911uxc_init_v4l2_ctrls()
1411 v4l2_ctrl_new_custom(<7911uxc->hdl, in lt7911uxc_init_v4l2_ctrls()
1413 lt7911uxc->audio_present_ctrl = v4l2_ctrl_new_custom(<7911uxc->hdl, in lt7911uxc_init_v4l2_ctrls()
1416 sd->ctrl_handler = <7911uxc->hdl; in lt7911uxc_init_v4l2_ctrls()
1417 if (lt7911uxc->hdl.error) { in lt7911uxc_init_v4l2_ctrls()
1418 ret = lt7911uxc->hdl.error; in lt7911uxc_init_v4l2_ctrls()
1419 v4l2_err(sd, "cfg v4l2 ctrls failed! ret:%d\n", ret); in lt7911uxc_init_v4l2_ctrls()
1423 __v4l2_ctrl_s_ctrl(lt7911uxc->link_freq, mode->mipi_freq_idx); in lt7911uxc_init_v4l2_ctrls()
1424 __v4l2_ctrl_s_ctrl_int64(lt7911uxc->pixel_rate, LT7911UXC_PIXEL_RATE); in lt7911uxc_init_v4l2_ctrls()
1426 if (lt7911uxc_update_controls(sd)) { in lt7911uxc_init_v4l2_ctrls()
1427 ret = -ENODEV; in lt7911uxc_init_v4l2_ctrls()
1428 v4l2_err(sd, "update v4l2 ctrls failed! ret:%d\n", ret); in lt7911uxc_init_v4l2_ctrls()
1438 struct device *dev = <7911uxc->i2c_client->dev; in lt7911uxc_probe_of()
1439 struct device_node *node = dev->of_node; in lt7911uxc_probe_of()
1444 <7911uxc->module_index); in lt7911uxc_probe_of()
1446 <7911uxc->module_facing); in lt7911uxc_probe_of()
1448 <7911uxc->module_name); in lt7911uxc_probe_of()
1450 <7911uxc->len_name); in lt7911uxc_probe_of()
1453 return -EINVAL; in lt7911uxc_probe_of()
1456 lt7911uxc->power_gpio = devm_gpiod_get_optional(dev, "power", in lt7911uxc_probe_of()
1458 if (IS_ERR(lt7911uxc->power_gpio)) { in lt7911uxc_probe_of()
1460 ret = PTR_ERR(lt7911uxc->power_gpio); in lt7911uxc_probe_of()
1464 lt7911uxc->reset_gpio = devm_gpiod_get_optional(dev, "reset", in lt7911uxc_probe_of()
1466 if (IS_ERR(lt7911uxc->reset_gpio)) { in lt7911uxc_probe_of()
1468 ret = PTR_ERR(lt7911uxc->reset_gpio); in lt7911uxc_probe_of()
1472 lt7911uxc->plugin_det_gpio = devm_gpiod_get_optional(dev, "plugin-det", in lt7911uxc_probe_of()
1474 if (IS_ERR(lt7911uxc->plugin_det_gpio)) { in lt7911uxc_probe_of()
1476 ret = PTR_ERR(lt7911uxc->plugin_det_gpio); in lt7911uxc_probe_of()
1480 ep = of_graph_get_next_endpoint(dev->of_node, NULL); in lt7911uxc_probe_of()
1483 return -EINVAL; in lt7911uxc_probe_of()
1487 <7911uxc->bus_cfg); in lt7911uxc_probe_of()
1493 if (lt7911uxc->bus_cfg.bus_type == V4L2_MBUS_CSI2_DPHY) { in lt7911uxc_probe_of()
1494 lt7911uxc->support_modes = supported_modes_dphy; in lt7911uxc_probe_of()
1495 lt7911uxc->cfg_num = ARRAY_SIZE(supported_modes_dphy); in lt7911uxc_probe_of()
1497 lt7911uxc->support_modes = supported_modes_cphy; in lt7911uxc_probe_of()
1498 lt7911uxc->cfg_num = ARRAY_SIZE(supported_modes_cphy); in lt7911uxc_probe_of()
1501 lt7911uxc->xvclk = devm_clk_get(dev, "xvclk"); in lt7911uxc_probe_of()
1502 if (IS_ERR(lt7911uxc->xvclk)) { in lt7911uxc_probe_of()
1504 ret = -EINVAL; in lt7911uxc_probe_of()
1508 ret = clk_prepare_enable(lt7911uxc->xvclk); in lt7911uxc_probe_of()
1514 lt7911uxc->enable_hdcp = false; in lt7911uxc_probe_of()
1525 return -ENODEV; in lt7911uxc_probe_of()
1531 struct device *dev = <7911uxc->i2c_client->dev; in __lt7911uxc_power_on()
1534 gpiod_set_value(lt7911uxc->reset_gpio, 1); in __lt7911uxc_power_on()
1536 gpiod_set_value(lt7911uxc->power_gpio, 1); in __lt7911uxc_power_on()
1539 gpiod_set_value(lt7911uxc->reset_gpio, 0); in __lt7911uxc_power_on()
1547 struct device *dev = <7911uxc->i2c_client->dev; in __lt7911uxc_power_off()
1551 if (!IS_ERR(lt7911uxc->reset_gpio)) in __lt7911uxc_power_off()
1552 gpiod_set_value(lt7911uxc->reset_gpio, 1); in __lt7911uxc_power_off()
1554 if (!IS_ERR(lt7911uxc->power_gpio)) in __lt7911uxc_power_off()
1555 gpiod_set_value(lt7911uxc->power_gpio, 0); in __lt7911uxc_power_off()
1561 struct v4l2_subdev *sd = i2c_get_clientdata(client); in lt7911uxc_resume() local
1562 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_resume()
1570 struct v4l2_subdev *sd = i2c_get_clientdata(client); in lt7911uxc_suspend() local
1571 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_suspend()
1585 struct device *dev = <7911uxc->i2c_client->dev; in lt7911uxc_check_chip_id()
1586 struct v4l2_subdev *sd = <7911uxc->sd; in lt7911uxc_check_chip_id() local
1591 lt7911uxc_i2c_enable(sd); in lt7911uxc_check_chip_id()
1592 id_l = i2c_rd8(sd, CHIPID_REGL); in lt7911uxc_check_chip_id()
1593 id_h = i2c_rd8(sd, CHIPID_REGH); in lt7911uxc_check_chip_id()
1594 lt7911uxc_i2c_disable(sd); in lt7911uxc_check_chip_id()
1600 return -EINVAL; in lt7911uxc_check_chip_id()
1613 struct v4l2_subdev *sd; in lt7911uxc_probe() local
1614 struct device *dev = &client->dev; in lt7911uxc_probe()
1625 return -ENOMEM; in lt7911uxc_probe()
1627 sd = <7911uxc->sd; in lt7911uxc_probe()
1628 lt7911uxc->i2c_client = client; in lt7911uxc_probe()
1629 lt7911uxc->mbus_fmt_code = LT7911UXC_MEDIA_BUS_FMT; in lt7911uxc_probe()
1633 v4l2_err(sd, "lt7911uxc_parse_of failed! err:%d\n", err); in lt7911uxc_probe()
1637 lt7911uxc->timings = default_timing; in lt7911uxc_probe()
1638 lt7911uxc->cur_mode = <7911uxc->support_modes[0]; in lt7911uxc_probe()
1645 INIT_DELAYED_WORK(<7911uxc->delayed_work_hotplug, in lt7911uxc_probe()
1647 INIT_DELAYED_WORK(<7911uxc->delayed_work_res_change, in lt7911uxc_probe()
1650 if (lt7911uxc->i2c_client->irq) { in lt7911uxc_probe()
1651 v4l2_dbg(1, debug, sd, "cfg lt7911uxc irq!\n"); in lt7911uxc_probe()
1653 lt7911uxc->i2c_client->irq, in lt7911uxc_probe()
1658 v4l2_err(sd, "request irq failed! err:%d\n", err); in lt7911uxc_probe()
1662 v4l2_dbg(1, debug, sd, "no irq, cfg poll!\n"); in lt7911uxc_probe()
1663 INIT_WORK(<7911uxc->work_i2c_poll, lt7911uxc_work_i2c_poll); in lt7911uxc_probe()
1664 timer_setup(<7911uxc->timer, lt7911uxc_irq_poll_timer, 0); in lt7911uxc_probe()
1665 lt7911uxc->timer.expires = jiffies + in lt7911uxc_probe()
1667 add_timer(<7911uxc->timer); in lt7911uxc_probe()
1670 lt7911uxc->plugin_irq = gpiod_to_irq(lt7911uxc->plugin_det_gpio); in lt7911uxc_probe()
1671 if (lt7911uxc->plugin_irq < 0) in lt7911uxc_probe()
1672 dev_err(dev, "failed to get plugin det irq, maybe no use\n"); in lt7911uxc_probe()
1674 err = devm_request_threaded_irq(dev, lt7911uxc->plugin_irq, NULL, in lt7911uxc_probe()
1679 dev_err(dev, "failed to register plugin det irq (%d), maybe no use\n", err); in lt7911uxc_probe()
1681 mutex_init(<7911uxc->confctl_mutex); in lt7911uxc_probe()
1686 client->flags |= I2C_CLIENT_SCCB; in lt7911uxc_probe()
1688 v4l2_i2c_subdev_init(sd, client, <7911uxc_ops); in lt7911uxc_probe()
1689 sd->internal_ops = <7911uxc_internal_ops; in lt7911uxc_probe()
1690 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS; in lt7911uxc_probe()
1694 lt7911uxc->pad.flags = MEDIA_PAD_FL_SOURCE; in lt7911uxc_probe()
1695 sd->entity.function = MEDIA_ENT_F_CAM_SENSOR; in lt7911uxc_probe()
1696 err = media_entity_pads_init(&sd->entity, 1, <7911uxc->pad); in lt7911uxc_probe()
1698 v4l2_err(sd, "media entity init failed! err:%d\n", err); in lt7911uxc_probe()
1703 if (strcmp(lt7911uxc->module_facing, "back") == 0) in lt7911uxc_probe()
1708 snprintf(sd->name, sizeof(sd->name), "m%02d_%s_%s %s", in lt7911uxc_probe()
1709 lt7911uxc->module_index, facing, in lt7911uxc_probe()
1710 LT7911UXC_NAME, dev_name(sd->dev)); in lt7911uxc_probe()
1711 err = v4l2_async_register_subdev_sensor_common(sd); in lt7911uxc_probe()
1713 v4l2_err(sd, "v4l2 register subdev failed! err:%d\n", err); in lt7911uxc_probe()
1717 err = v4l2_ctrl_handler_setup(sd->ctrl_handler); in lt7911uxc_probe()
1719 v4l2_err(sd, "v4l2 ctrl handler setup failed! err:%d\n", err); in lt7911uxc_probe()
1723 schedule_delayed_work(<7911uxc->delayed_work_res_change, 100); in lt7911uxc_probe()
1725 enable_stream(sd, false); in lt7911uxc_probe()
1726 v4l2_info(sd, "%s found @ 0x%x (%s)\n", client->name, in lt7911uxc_probe()
1727 client->addr << 1, client->adapter->name); in lt7911uxc_probe()
1733 media_entity_cleanup(&sd->entity); in lt7911uxc_probe()
1736 v4l2_ctrl_handler_free(<7911uxc->hdl); in lt7911uxc_probe()
1737 mutex_destroy(<7911uxc->confctl_mutex); in lt7911uxc_probe()
1739 if (!lt7911uxc->i2c_client->irq) in lt7911uxc_probe()
1740 flush_work(<7911uxc->work_i2c_poll); in lt7911uxc_probe()
1741 cancel_delayed_work(<7911uxc->delayed_work_hotplug); in lt7911uxc_probe()
1742 cancel_delayed_work(<7911uxc->delayed_work_res_change); in lt7911uxc_probe()
1749 struct v4l2_subdev *sd = i2c_get_clientdata(client); in lt7911uxc_remove() local
1750 struct lt7911uxc *lt7911uxc = to_lt7911uxc(sd); in lt7911uxc_remove()
1752 if (!lt7911uxc->i2c_client->irq) { in lt7911uxc_remove()
1753 del_timer_sync(<7911uxc->timer); in lt7911uxc_remove()
1754 flush_work(<7911uxc->work_i2c_poll); in lt7911uxc_remove()
1756 cancel_delayed_work_sync(<7911uxc->delayed_work_hotplug); in lt7911uxc_remove()
1757 cancel_delayed_work_sync(<7911uxc->delayed_work_res_change); in lt7911uxc_remove()
1758 v4l2_async_unregister_subdev(sd); in lt7911uxc_remove()
1759 v4l2_device_unregister_subdev(sd); in lt7911uxc_remove()
1761 media_entity_cleanup(&sd->entity); in lt7911uxc_remove()
1763 v4l2_ctrl_handler_free(<7911uxc->hdl); in lt7911uxc_remove()
1764 mutex_destroy(<7911uxc->confctl_mutex); in lt7911uxc_remove()
1765 clk_disable_unprepare(lt7911uxc->xvclk); in lt7911uxc_remove()
1801 MODULE_DESCRIPTION("Lontium lt7911uxc DP/type-c to CSI-2 bridge driver");
1802 MODULE_AUTHOR("Jianwei Fan <jianwei.fan@rock-chips.com>");