Lines Matching +full:1 +full:- +full:sd

1 // SPDX-License-Identifier: GPL-2.0
16 #include <linux/v4l2-dv-timings.h>
19 #include <media/v4l2-ctrls.h>
20 #include <media/v4l2-device.h>
21 #include <media/v4l2-dv-timings.h>
22 #include <media/v4l2-event.h>
23 #include <media/v4l2-fwnode.h>
31 #include <dt-bindings/media/tda1997x.h>
40 MODULE_PARM_DESC(debug, "debug level (0-2)");
46 "OBA", /* One-Bit Audio */
71 "Full Range (0-255)",
72 "Limited Range (16-235)",
78 "YUV422 semi-planar", /* YUV422 16bit data base, 8bpp */
121 "YUV709 -> RGB full",
122 -256, -2048, -2048,
123 4769, -2183, -873,
129 "YUV601 -> RGB full",
130 -256, -2048, -2048,
131 4769, -3330, -1602,
137 "RGB limited -> RGB full",
138 -256, -256, -256,
145 "RGB limited -> ITU601",
146 -256, -256, -256,
148 -1754, 2095, -341,
149 -1388, -707, 2095,
153 "RGB limited -> ITU709",
154 -256, -256, -256,
156 -1894, 2087, -190,
157 -1607, -477, 2087,
161 "RGB full -> ITU601",
164 -1506, 1799, -293,
165 -1192, -607, 1799,
169 "RGB full -> ITU709",
172 -1627, 1792, -163,
173 -1380, -410, 1792,
226 struct v4l2_subdev sd; member
296 static inline struct tda1997x_state *to_state(struct v4l2_subdev *sd) in to_state() argument
298 return container_of(sd, struct tda1997x_state, sd); in to_state()
303 return &container_of(ctrl->handler, struct tda1997x_state, hdl)->sd; in to_sd()
306 static int tda1997x_cec_read(struct v4l2_subdev *sd, u8 reg) in tda1997x_cec_read() argument
308 struct tda1997x_state *state = to_state(sd); in tda1997x_cec_read()
311 val = i2c_smbus_read_byte_data(state->client_cec, reg); in tda1997x_cec_read()
313 v4l_err(state->client, "read reg error: reg=%2x\n", reg); in tda1997x_cec_read()
314 val = -1; in tda1997x_cec_read()
320 static int tda1997x_cec_write(struct v4l2_subdev *sd, u8 reg, u8 val) in tda1997x_cec_write() argument
322 struct tda1997x_state *state = to_state(sd); in tda1997x_cec_write()
325 ret = i2c_smbus_write_byte_data(state->client_cec, reg, val); in tda1997x_cec_write()
327 v4l_err(state->client, "write reg error:reg=%2x,val=%2x\n", in tda1997x_cec_write()
329 ret = -1; in tda1997x_cec_write()
335 /* -----------------------------------------------------------------------------
339 static int tda1997x_setpage(struct v4l2_subdev *sd, u8 page) in tda1997x_setpage() argument
341 struct tda1997x_state *state = to_state(sd); in tda1997x_setpage()
344 if (state->page != page) { in tda1997x_setpage()
345 ret = i2c_smbus_write_byte_data(state->client, in tda1997x_setpage()
348 v4l_err(state->client, in tda1997x_setpage()
353 state->page = page; in tda1997x_setpage()
358 static inline int io_read(struct v4l2_subdev *sd, u16 reg) in io_read() argument
360 struct tda1997x_state *state = to_state(sd); in io_read()
363 mutex_lock(&state->page_lock); in io_read()
364 if (tda1997x_setpage(sd, reg >> 8)) { in io_read()
365 val = -1; in io_read()
369 val = i2c_smbus_read_byte_data(state->client, reg&0xff); in io_read()
371 v4l_err(state->client, "read reg error: reg=%2x\n", reg & 0xff); in io_read()
372 val = -1; in io_read()
377 mutex_unlock(&state->page_lock); in io_read()
381 static inline long io_read16(struct v4l2_subdev *sd, u16 reg) in io_read16() argument
386 val = io_read(sd, reg); in io_read16()
390 val = io_read(sd, reg + 1); in io_read16()
398 static inline long io_read24(struct v4l2_subdev *sd, u16 reg) in io_read24() argument
403 val = io_read(sd, reg); in io_read24()
407 val = io_read(sd, reg + 1); in io_read24()
411 val = io_read(sd, reg + 2); in io_read24()
419 static unsigned int io_readn(struct v4l2_subdev *sd, u16 reg, u8 len, u8 *data) in io_readn() argument
426 val = io_read(sd, reg + i); in io_readn()
436 static int io_write(struct v4l2_subdev *sd, u16 reg, u8 val) in io_write() argument
438 struct tda1997x_state *state = to_state(sd); in io_write()
441 mutex_lock(&state->page_lock); in io_write()
442 if (tda1997x_setpage(sd, reg >> 8)) { in io_write()
443 ret = -1; in io_write()
447 ret = i2c_smbus_write_byte_data(state->client, reg & 0xff, val); in io_write()
449 v4l_err(state->client, "write reg error:reg=%2x,val=%2x\n", in io_write()
451 ret = -1; in io_write()
456 mutex_unlock(&state->page_lock); in io_write()
460 static int io_write16(struct v4l2_subdev *sd, u16 reg, u16 val) in io_write16() argument
464 ret = io_write(sd, reg, (val >> 8) & 0xff); in io_write16()
467 ret = io_write(sd, reg + 1, val & 0xff); in io_write16()
473 static int io_write24(struct v4l2_subdev *sd, u16 reg, u32 val) in io_write24() argument
477 ret = io_write(sd, reg, (val >> 16) & 0xff); in io_write24()
480 ret = io_write(sd, reg + 1, (val >> 8) & 0xff); in io_write24()
483 ret = io_write(sd, reg + 2, val & 0xff); in io_write24()
489 /* -----------------------------------------------------------------------------
502 static int tda1997x_manual_hpd(struct v4l2_subdev *sd, enum hpd_mode mode) in tda1997x_manual_hpd() argument
506 hpd_auto = io_read(sd, REG_HPD_AUTO_CTRL); in tda1997x_manual_hpd()
507 hpd_pwr = io_read(sd, REG_HPD_POWER); in tda1997x_manual_hpd()
508 hpd_man = io_read(sd, REG_HPD_MAN_CTRL); in tda1997x_manual_hpd()
523 io_write(sd, REG_HPD_POWER, hpd_pwr); in tda1997x_manual_hpd()
524 io_write(sd, REG_HPD_MAN_CTRL, hpd_man); in tda1997x_manual_hpd()
528 /* hpd_bp=1 */ in tda1997x_manual_hpd()
530 hpd_pwr |= 1 << HPD_POWER_BP_SHIFT; in tda1997x_manual_hpd()
531 io_write(sd, REG_HPD_POWER, hpd_pwr); in tda1997x_manual_hpd()
539 io_write(sd, REG_HPD_AUTO_CTRL, hpd_auto); in tda1997x_manual_hpd()
540 io_write(sd, REG_HPD_MAN_CTRL, hpd_man); in tda1997x_manual_hpd()
545 io_write(sd, REG_HPD_AUTO_CTRL, hpd_auto); in tda1997x_manual_hpd()
551 io_write(sd, REG_HPD_MAN_CTRL, hpd_man); in tda1997x_manual_hpd()
564 struct v4l2_subdev *sd = &state->sd; in tda1997x_delayed_work_enable_hpd() local
566 v4l2_dbg(2, debug, sd, "%s\n", __func__); in tda1997x_delayed_work_enable_hpd()
569 tda1997x_manual_hpd(sd, HPD_HIGH_OTHER); in tda1997x_delayed_work_enable_hpd()
570 tda1997x_manual_hpd(sd, HPD_HIGH_BP); in tda1997x_delayed_work_enable_hpd()
572 state->edid.present = 1; in tda1997x_delayed_work_enable_hpd()
575 static void tda1997x_disable_edid(struct v4l2_subdev *sd) in tda1997x_disable_edid() argument
577 struct tda1997x_state *state = to_state(sd); in tda1997x_disable_edid()
579 v4l2_dbg(1, debug, sd, "%s\n", __func__); in tda1997x_disable_edid()
580 cancel_delayed_work_sync(&state->delayed_work_enable_hpd); in tda1997x_disable_edid()
583 tda1997x_manual_hpd(sd, HPD_LOW_BP); in tda1997x_disable_edid()
586 static void tda1997x_enable_edid(struct v4l2_subdev *sd) in tda1997x_enable_edid() argument
588 struct tda1997x_state *state = to_state(sd); in tda1997x_enable_edid()
590 v4l2_dbg(1, debug, sd, "%s\n", __func__); in tda1997x_enable_edid()
593 schedule_delayed_work(&state->delayed_work_enable_hpd, HZ / 10); in tda1997x_enable_edid()
596 /* -----------------------------------------------------------------------------
606 v4l_dbg(1, debug, state->client, "%s code=0x%x\n", __func__, code); in tda1997x_setup_format()
612 state->vid_fmt = OF_FMT_444; in tda1997x_setup_format()
617 state->vid_fmt = OF_FMT_422_SMPT; in tda1997x_setup_format()
622 state->vid_fmt = OF_FMT_422_CCIR; in tda1997x_setup_format()
625 v4l_err(state->client, "incompatible format (0x%x)\n", code); in tda1997x_setup_format()
626 return -EINVAL; in tda1997x_setup_format()
628 v4l_dbg(1, debug, state->client, "%s code=0x%x fmt=%s\n", __func__, in tda1997x_setup_format()
629 code, vidfmt_names[state->vid_fmt]); in tda1997x_setup_format()
630 state->mbus_code = code; in tda1997x_setup_format()
638 * full-range and YUV is to be limited range.
640 * RGB full-range uses values from 0 to 255 which is recommended on a monitor
645 tda1997x_configure_csc(struct v4l2_subdev *sd) in tda1997x_configure_csc() argument
647 struct tda1997x_state *state = to_state(sd); in tda1997x_configure_csc()
648 struct hdmi_avi_infoframe *avi = &state->avi_infoframe; in tda1997x_configure_csc()
649 struct v4l2_hdmi_colorimetry *c = &state->colorimetry; in tda1997x_configure_csc()
661 v4l_dbg(1, debug, state->client, "input:%s quant:%s output:%s\n", in tda1997x_configure_csc()
662 hdmi_colorspace_names[avi->colorspace], in tda1997x_configure_csc()
663 v4l2_quantization_names[c->quantization], in tda1997x_configure_csc()
664 vidfmt_names[state->vid_fmt]); in tda1997x_configure_csc()
665 state->conv = NULL; in tda1997x_configure_csc()
666 switch (state->vid_fmt) { in tda1997x_configure_csc()
670 if (c->colorspace == V4L2_COLORSPACE_SRGB) { in tda1997x_configure_csc()
671 if (c->quantization == V4L2_QUANTIZATION_LIM_RANGE) in tda1997x_configure_csc()
672 state->conv = &conv_matrix[RGBLIMITED_RGBFULL]; in tda1997x_configure_csc()
674 if (c->colorspace == V4L2_COLORSPACE_REC709) in tda1997x_configure_csc()
675 state->conv = &conv_matrix[ITU709_RGBFULL]; in tda1997x_configure_csc()
676 else if (c->colorspace == V4L2_COLORSPACE_SMPTE170M) in tda1997x_configure_csc()
677 state->conv = &conv_matrix[ITU601_RGBFULL]; in tda1997x_configure_csc()
682 case OF_FMT_422_SMPT: /* semi-planar */ in tda1997x_configure_csc()
685 if ((c->colorspace == V4L2_COLORSPACE_SRGB) && in tda1997x_configure_csc()
686 (c->quantization == V4L2_QUANTIZATION_FULL_RANGE)) { in tda1997x_configure_csc()
687 if (state->timings.bt.height <= 576) in tda1997x_configure_csc()
688 state->conv = &conv_matrix[RGBFULL_ITU601]; in tda1997x_configure_csc()
690 state->conv = &conv_matrix[RGBFULL_ITU709]; in tda1997x_configure_csc()
691 } else if ((c->colorspace == V4L2_COLORSPACE_SRGB) && in tda1997x_configure_csc()
692 (c->quantization == V4L2_QUANTIZATION_LIM_RANGE)) { in tda1997x_configure_csc()
693 if (state->timings.bt.height <= 576) in tda1997x_configure_csc()
694 state->conv = &conv_matrix[RGBLIMITED_ITU601]; in tda1997x_configure_csc()
696 state->conv = &conv_matrix[RGBLIMITED_ITU709]; in tda1997x_configure_csc()
701 if (state->conv) { in tda1997x_configure_csc()
702 v4l_dbg(1, debug, state->client, "%s\n", in tda1997x_configure_csc()
703 state->conv->name); in tda1997x_configure_csc()
705 reg = io_read(sd, REG_VDP_CTRL); in tda1997x_configure_csc()
707 io_write(sd, REG_VDP_CTRL, reg); in tda1997x_configure_csc()
709 io_write16(sd, REG_VDP_MATRIX + 0, state->conv->offint1); in tda1997x_configure_csc()
710 io_write16(sd, REG_VDP_MATRIX + 2, state->conv->offint2); in tda1997x_configure_csc()
711 io_write16(sd, REG_VDP_MATRIX + 4, state->conv->offint3); in tda1997x_configure_csc()
713 io_write16(sd, REG_VDP_MATRIX + 6, state->conv->p11coef); in tda1997x_configure_csc()
714 io_write16(sd, REG_VDP_MATRIX + 8, state->conv->p12coef); in tda1997x_configure_csc()
715 io_write16(sd, REG_VDP_MATRIX + 10, state->conv->p13coef); in tda1997x_configure_csc()
716 io_write16(sd, REG_VDP_MATRIX + 12, state->conv->p21coef); in tda1997x_configure_csc()
717 io_write16(sd, REG_VDP_MATRIX + 14, state->conv->p22coef); in tda1997x_configure_csc()
718 io_write16(sd, REG_VDP_MATRIX + 16, state->conv->p23coef); in tda1997x_configure_csc()
719 io_write16(sd, REG_VDP_MATRIX + 18, state->conv->p31coef); in tda1997x_configure_csc()
720 io_write16(sd, REG_VDP_MATRIX + 20, state->conv->p32coef); in tda1997x_configure_csc()
721 io_write16(sd, REG_VDP_MATRIX + 22, state->conv->p33coef); in tda1997x_configure_csc()
723 io_write16(sd, REG_VDP_MATRIX + 24, state->conv->offout1); in tda1997x_configure_csc()
724 io_write16(sd, REG_VDP_MATRIX + 26, state->conv->offout2); in tda1997x_configure_csc()
725 io_write16(sd, REG_VDP_MATRIX + 28, state->conv->offout3); in tda1997x_configure_csc()
728 reg = io_read(sd, REG_VDP_CTRL); in tda1997x_configure_csc()
730 io_write(sd, REG_VDP_CTRL, reg); in tda1997x_configure_csc()
735 io_write16(sd, REG_BLK_GY, blanking_codes->code_gy); in tda1997x_configure_csc()
736 io_write16(sd, REG_BLK_BU, blanking_codes->code_bu); in tda1997x_configure_csc()
737 io_write16(sd, REG_BLK_RV, blanking_codes->code_rv); in tda1997x_configure_csc()
743 tda1997x_configure_vhref(struct v4l2_subdev *sd) in tda1997x_configure_vhref() argument
745 struct tda1997x_state *state = to_state(sd); in tda1997x_configure_vhref()
746 const struct v4l2_bt_timings *bt = &state->timings.bt; in tda1997x_configure_vhref()
755 href_start = bt->hbackporch + bt->hsync + 1; in tda1997x_configure_vhref()
756 href_end = href_start + bt->width; in tda1997x_configure_vhref()
757 vref_f1_start = bt->height + bt->vbackporch + bt->vsync + in tda1997x_configure_vhref()
758 bt->il_vbackporch + bt->il_vsync + in tda1997x_configure_vhref()
759 bt->il_vfrontporch; in tda1997x_configure_vhref()
760 vref_f1_width = bt->vbackporch + bt->vsync + bt->vfrontporch; in tda1997x_configure_vhref()
765 if (bt->interlaced) { in tda1997x_configure_vhref()
766 vref_f2_start = (bt->height / 2) + in tda1997x_configure_vhref()
767 (bt->il_vbackporch + bt->il_vsync - 1); in tda1997x_configure_vhref()
768 vref_f2_width = bt->il_vbackporch + bt->il_vsync + in tda1997x_configure_vhref()
769 bt->il_vfrontporch; in tda1997x_configure_vhref()
770 fieldref_f2_start = vref_f2_start + bt->il_vfrontporch + in tda1997x_configure_vhref()
782 io_write16(sd, REG_FDW_S, 0x2ef); /* start position */ in tda1997x_configure_vhref()
783 io_write16(sd, REG_FDW_E, 0x141); /* end position */ in tda1997x_configure_vhref()
786 if (state->chip_revision == 0) in tda1997x_configure_vhref()
787 io_write16(sd, REG_PXCNT_PR, 4); in tda1997x_configure_vhref()
789 io_write16(sd, REG_PXCNT_PR, 1); in tda1997x_configure_vhref()
790 io_write16(sd, REG_PXCNT_NPIX, width & MASK_VHREF); in tda1997x_configure_vhref()
791 io_write16(sd, REG_LCNT_PR, 1); in tda1997x_configure_vhref()
792 io_write16(sd, REG_LCNT_NLIN, lines & MASK_VHREF); in tda1997x_configure_vhref()
800 io_write(sd, REG_VHREF_CTRL, reg); in tda1997x_configure_vhref()
805 * horiz and vert ref values (non-active pixel areas) of the generator in tda1997x_configure_vhref()
809 io_write16(sd, REG_HREF_S, href_start & MASK_VHREF); in tda1997x_configure_vhref()
810 io_write16(sd, REG_HREF_E, href_end & MASK_VHREF); in tda1997x_configure_vhref()
812 io_write16(sd, REG_VREF_F1_S, vref_f1_start & MASK_VHREF); in tda1997x_configure_vhref()
813 io_write(sd, REG_VREF_F1_WIDTH, vref_f1_width); in tda1997x_configure_vhref()
815 io_write16(sd, REG_VREF_F2_S, vref_f2_start & MASK_VHREF); in tda1997x_configure_vhref()
816 io_write(sd, REG_VREF_F2_WIDTH, vref_f2_width); in tda1997x_configure_vhref()
821 io_write16(sd, REG_FREF_F1_S, reg); in tda1997x_configure_vhref()
823 io_write16(sd, REG_FREF_F2_S, reg); in tda1997x_configure_vhref()
830 struct v4l2_subdev *sd = &state->sd; in tda1997x_configure_vidout() local
831 struct tda1997x_platform_data *pdata = &state->pdata; in tda1997x_configure_vidout()
836 reg = (state->vid_fmt == OF_FMT_422_CCIR) ? in tda1997x_configure_vidout()
838 reg |= pdata->vidout_delay_pclk << PCLK_DELAY_SHIFT; in tda1997x_configure_vidout()
839 reg |= pdata->vidout_inv_pclk << PCLK_INV_SHIFT; in tda1997x_configure_vidout()
840 io_write(sd, REG_PCLK, reg); in tda1997x_configure_vidout()
842 /* Configure pre-filter */ in tda1997x_configure_vidout()
845 if ((state->vid_fmt == OF_FMT_422_SMPT) || in tda1997x_configure_vidout()
846 (state->vid_fmt == OF_FMT_422_CCIR)) { in tda1997x_configure_vidout()
851 io_write(sd, REG_FILTERS_CTRL, prefilter); in tda1997x_configure_vidout()
854 reg = state->vid_fmt & OF_FMT_MASK; in tda1997x_configure_vidout()
855 if (state->vid_fmt == OF_FMT_422_CCIR) in tda1997x_configure_vidout()
858 io_write(sd, REG_OF, reg); in tda1997x_configure_vidout()
861 reg = io_read(sd, REG_VDP_CTRL); in tda1997x_configure_vidout()
862 /* pre-filter is needed unless (REG_FILTERS_CTRL == 0) */ in tda1997x_configure_vidout()
868 if (state->vid_fmt == OF_FMT_444) in tda1997x_configure_vidout()
874 if ((pdata->vidout_delay_vs < 4) || (pdata->vidout_delay_hs < 4)) in tda1997x_configure_vidout()
876 io_write(sd, REG_VDP_CTRL, reg); in tda1997x_configure_vidout()
879 reg = pdata->vidout_delay_de << DE_FREF_DELAY_SHIFT | in tda1997x_configure_vidout()
880 pdata->vidout_inv_de << DE_FREF_INV_SHIFT | in tda1997x_configure_vidout()
881 pdata->vidout_sel_de << DE_FREF_SEL_SHIFT; in tda1997x_configure_vidout()
882 io_write(sd, REG_DE_FREF, reg); in tda1997x_configure_vidout()
885 if (state->vid_fmt != OF_FMT_422_CCIR) { in tda1997x_configure_vidout()
886 reg = pdata->vidout_delay_hs << HS_HREF_DELAY_SHIFT | in tda1997x_configure_vidout()
887 pdata->vidout_inv_hs << HS_HREF_INV_SHIFT | in tda1997x_configure_vidout()
888 pdata->vidout_sel_hs << HS_HREF_SEL_SHIFT; in tda1997x_configure_vidout()
891 io_write(sd, REG_HS_HREF, reg); in tda1997x_configure_vidout()
894 if (state->vid_fmt != OF_FMT_422_CCIR) { in tda1997x_configure_vidout()
895 reg = pdata->vidout_delay_vs << VS_VREF_DELAY_SHIFT | in tda1997x_configure_vidout()
896 pdata->vidout_inv_vs << VS_VREF_INV_SHIFT | in tda1997x_configure_vidout()
897 pdata->vidout_sel_vs << VS_VREF_SEL_SHIFT; in tda1997x_configure_vidout()
900 io_write(sd, REG_VS_VREF, reg); in tda1997x_configure_vidout()
907 tda1997x_configure_audout(struct v4l2_subdev *sd, u8 channel_assignment) in tda1997x_configure_audout() argument
909 struct tda1997x_state *state = to_state(sd); in tda1997x_configure_audout()
910 struct tda1997x_platform_data *pdata = &state->pdata; in tda1997x_configure_audout()
914 if (!pdata->audout_format) in tda1997x_configure_audout()
917 /* channel assignment (CEA-861-D Table 20) */ in tda1997x_configure_audout()
918 io_write(sd, REG_AUDIO_PATH, channel_assignment); in tda1997x_configure_audout()
922 switch (pdata->audout_format) { in tda1997x_configure_audout()
930 switch (state->audio_type) { in tda1997x_configure_audout()
943 if (pdata->audout_layout == 1) { in tda1997x_configure_audout()
946 if (pdata->audout_format == AUDFMT_TYPE_SPDIF) in tda1997x_configure_audout()
954 if (pdata->audout_width == 32) in tda1997x_configure_audout()
960 if (pdata->audio_auto_mute) in tda1997x_configure_audout()
963 if (pdata->audout_invert_clk) in tda1997x_configure_audout()
965 io_write(sd, REG_AUDCFG, reg); in tda1997x_configure_audout()
968 reg = (pdata->audout_layout) ? AUDIO_LAYOUT_LAYOUT1 : 0; in tda1997x_configure_audout()
969 if (!pdata->audout_layoutauto) in tda1997x_configure_audout()
973 io_write(sd, REG_AUDIO_LAYOUT, reg); in tda1997x_configure_audout()
976 io_write(sd, REG_FIFO_LATENCY_VAL, 0x80); in tda1997x_configure_audout()
1006 if (pdata->audout_format == AUDFMT_TYPE_I2S) in tda1997x_configure_audout()
1008 io_write(sd, REG_AUDIO_OUT_ENABLE, reg); in tda1997x_configure_audout()
1011 io_write(sd, REG_TEST_MODE, 0x00); in tda1997x_configure_audout()
1018 tda1997x_hdmi_info_reset(struct v4l2_subdev *sd, u8 info_rst, bool reset_sus) in tda1997x_hdmi_info_reset() argument
1023 reg = io_read(sd, REG_HDMI_INFO_RST); in tda1997x_hdmi_info_reset()
1024 io_write(sd, REG_HDMI_INFO_RST, info_rst); in tda1997x_hdmi_info_reset()
1028 reg = io_read(sd, REG_INT_FLG_CLR_MODE); in tda1997x_hdmi_info_reset()
1029 io_write(sd, REG_INT_FLG_CLR_MODE, reg); in tda1997x_hdmi_info_reset()
1032 /* Disable REFTIM to restart start-up-sequencer (SUS) */ in tda1997x_hdmi_info_reset()
1033 reg = io_read(sd, REG_RATE_CTRL); in tda1997x_hdmi_info_reset()
1037 reg = io_write(sd, REG_RATE_CTRL, reg); in tda1997x_hdmi_info_reset()
1045 struct v4l2_subdev *sd = &state->sd; in tda1997x_power_mode() local
1050 io_write(sd, REG_PON_OVR_EN, PON_DIS); in tda1997x_power_mode()
1052 io_write(sd, REG_CFG1, PON_EN); in tda1997x_power_mode()
1054 io_write(sd, REG_DEEP_PLL7_BYP, PON_DIS); in tda1997x_power_mode()
1056 reg = io_read(sd, REG_OF); in tda1997x_power_mode()
1058 io_write(sd, REG_OF, reg); in tda1997x_power_mode()
1062 reg = io_read(sd, REG_OF); in tda1997x_power_mode()
1064 io_write(sd, REG_OF, reg); in tda1997x_power_mode()
1066 io_write(sd, REG_DEEP_PLL7_BYP, PON_EN); in tda1997x_power_mode()
1068 io_write(sd, REG_CFG1, PON_DIS); in tda1997x_power_mode()
1070 io_write(sd, REG_PON_OVR_EN, PON_EN); in tda1997x_power_mode()
1075 tda1997x_detect_tx_5v(struct v4l2_subdev *sd) in tda1997x_detect_tx_5v() argument
1077 u8 reg = io_read(sd, REG_DETECT_5V); in tda1997x_detect_tx_5v()
1079 return ((reg & DETECT_5V_SEL) ? 1 : 0); in tda1997x_detect_tx_5v()
1083 tda1997x_detect_tx_hpd(struct v4l2_subdev *sd) in tda1997x_detect_tx_hpd() argument
1085 u8 reg = io_read(sd, REG_DETECT_5V); in tda1997x_detect_tx_hpd()
1087 return ((reg & DETECT_HPD) ? 1 : 0); in tda1997x_detect_tx_hpd()
1094 struct v4l2_subdev *sd = &state->sd; in tda1997x_detect_std() local
1107 if (!state->input_detect[0] && !state->input_detect[1]) in tda1997x_detect_std()
1108 return -ENOLINK; in tda1997x_detect_std()
1110 vper = io_read24(sd, REG_V_PER); in tda1997x_detect_std()
1111 hper = io_read16(sd, REG_H_PER); in tda1997x_detect_std()
1112 hsper = io_read16(sd, REG_HS_WIDTH); in tda1997x_detect_std()
1119 v4l2_dbg(1, debug, sd, "Signal Timings: %u/%u/%u\n", vper, hper, hsper); in tda1997x_detect_std()
1121 htot = io_read16(sd, REG_FMT_H_TOT); in tda1997x_detect_std()
1122 hact = io_read16(sd, REG_FMT_H_ACT); in tda1997x_detect_std()
1123 hfront = io_read16(sd, REG_FMT_H_FRONT); in tda1997x_detect_std()
1124 hsync = io_read16(sd, REG_FMT_H_SYNC); in tda1997x_detect_std()
1125 hback = io_read16(sd, REG_FMT_H_BACK); in tda1997x_detect_std()
1127 vtot = io_read16(sd, REG_FMT_V_TOT); in tda1997x_detect_std()
1128 vact = io_read16(sd, REG_FMT_V_ACT); in tda1997x_detect_std()
1129 vfront1 = io_read(sd, REG_FMT_V_FRONT_F1); in tda1997x_detect_std()
1130 vfront2 = io_read(sd, REG_FMT_V_FRONT_F2); in tda1997x_detect_std()
1131 vsync = io_read(sd, REG_FMT_V_SYNC); in tda1997x_detect_std()
1132 vback1 = io_read(sd, REG_FMT_V_BACK_F1); in tda1997x_detect_std()
1133 vback2 = io_read(sd, REG_FMT_V_BACK_F2); in tda1997x_detect_std()
1135 v4l2_dbg(1, debug, sd, "Geometry: H %u %u %u %u %u Sync%c V %u %u %u %u %u %u %u Sync%c\n", in tda1997x_detect_std()
1136 htot, hact, hfront, hsync, hback, hsync_pos ? '+' : '-', in tda1997x_detect_std()
1137 vtot, vact, vfront1, vfront2, vsync, vback1, vback2, vsync_pos ? '+' : '-'); in tda1997x_detect_std()
1142 timings->type = V4L2_DV_BT_656_1120; in tda1997x_detect_std()
1143 timings->bt.width = hact; in tda1997x_detect_std()
1144 timings->bt.hfrontporch = hfront; in tda1997x_detect_std()
1145 timings->bt.hsync = hsync; in tda1997x_detect_std()
1146 timings->bt.hbackporch = hback; in tda1997x_detect_std()
1147 timings->bt.height = vact; in tda1997x_detect_std()
1148 timings->bt.vfrontporch = vfront1; in tda1997x_detect_std()
1149 timings->bt.vsync = vsync; in tda1997x_detect_std()
1150 timings->bt.vbackporch = vback1; in tda1997x_detect_std()
1151 timings->bt.interlaced = interlaced ? V4L2_DV_INTERLACED : V4L2_DV_PROGRESSIVE; in tda1997x_detect_std()
1152 timings->bt.polarities = vsync_pos ? V4L2_DV_VSYNC_POS_POL : 0; in tda1997x_detect_std()
1153 timings->bt.polarities |= hsync_pos ? V4L2_DV_HSYNC_POS_POL : 0; in tda1997x_detect_std()
1155 timings->bt.pixelclock = (u64)htot * vtot * 27000000; in tda1997x_detect_std()
1157 timings->bt.il_vfrontporch = vfront2; in tda1997x_detect_std()
1158 timings->bt.il_vsync = timings->bt.vsync; in tda1997x_detect_std()
1159 timings->bt.il_vbackporch = vback2; in tda1997x_detect_std()
1160 do_div(timings->bt.pixelclock, vper * 2 /* full frame */); in tda1997x_detect_std()
1162 timings->bt.il_vfrontporch = 0; in tda1997x_detect_std()
1163 timings->bt.il_vsync = 0; in tda1997x_detect_std()
1164 timings->bt.il_vbackporch = 0; in tda1997x_detect_std()
1165 do_div(timings->bt.pixelclock, vper); in tda1997x_detect_std()
1168 (u32)timings->bt.pixelclock / 500, NULL, NULL); in tda1997x_detect_std()
1169 v4l2_print_dv_timings(sd->name, "Detected format: ", timings, false); in tda1997x_detect_std()
1176 struct v4l2_subdev *sd = &state->sd; in tda1997x_reset_n1() local
1180 io_write(sd, REG_CLK_CFG, CLK_CFG_SEL_ACLK_EN | CLK_CFG_SEL_ACLK); in tda1997x_reset_n1()
1181 io_write(sd, REG_PON_OVR_EN, PON_EN); in tda1997x_reset_n1()
1182 io_write(sd, REG_PON_CBIAS, PON_EN); in tda1997x_reset_n1()
1183 io_write(sd, REG_PON_PLL, PON_EN); in tda1997x_reset_n1()
1185 reg = io_read(sd, REG_MODE_REC_CFG1); in tda1997x_reset_n1()
1188 io_write(sd, REG_MODE_REC_CFG1, reg); in tda1997x_reset_n1()
1189 io_write(sd, REG_CLK_CFG, CLK_CFG_DIS); in tda1997x_reset_n1()
1190 io_write(sd, REG_PON_OVR_EN, PON_DIS); in tda1997x_reset_n1()
1191 reg = io_read(sd, REG_MODE_REC_CFG1); in tda1997x_reset_n1()
1193 io_write(sd, REG_MODE_REC_CFG1, reg); in tda1997x_reset_n1()
1198 * bits are set to 1. If only stable_clk_x bit is set to 1 but not
1203 tda1997x_read_activity_status_regs(struct v4l2_subdev *sd) in tda1997x_read_activity_status_regs() argument
1208 reg = io_read(sd, REG_CLK_A_STATUS); in tda1997x_read_activity_status_regs()
1215 reg = io_read(sd, REG_CLK_B_STATUS); in tda1997x_read_activity_status_regs()
1219 status |= ((reg & MASK_CLK_STABLE) >> 1); in tda1997x_read_activity_status_regs()
1222 reg = io_read(sd, REG_SUS_STATUS); in tda1997x_read_activity_status_regs()
1236 struct v4l2_hdmi_colorimetry *c = &state->colorimetry; in set_rgb_quantization_range()
1238 state->colorimetry = v4l2_hdmi_rx_colorimetry(&state->avi_infoframe, in set_rgb_quantization_range()
1240 state->timings.bt.height); in set_rgb_quantization_range()
1242 if (c->ycbcr_enc == V4L2_YCBCR_ENC_DEFAULT) { in set_rgb_quantization_range()
1243 switch (state->rgb_quantization_range) { in set_rgb_quantization_range()
1245 c->quantization = V4L2_QUANTIZATION_FULL_RANGE; in set_rgb_quantization_range()
1248 c->quantization = V4L2_QUANTIZATION_LIM_RANGE; in set_rgb_quantization_range()
1252 v4l_dbg(1, debug, state->client, in set_rgb_quantization_range()
1254 state->avi_infoframe.colorspace, c->colorspace, in set_rgb_quantization_range()
1255 state->avi_infoframe.colorimetry, in set_rgb_quantization_range()
1256 v4l2_quantization_names[c->quantization], in set_rgb_quantization_range()
1257 state->avi_infoframe.content_type); in set_rgb_quantization_range()
1264 struct v4l2_subdev *sd = &state->sd; in tda1997x_parse_infoframe() local
1271 len = io_readn(sd, addr, sizeof(buffer), buffer); in tda1997x_parse_infoframe()
1274 v4l_err(state->client, in tda1997x_parse_infoframe()
1279 hdmi_infoframe_log(KERN_INFO, &state->client->dev, &frame); in tda1997x_parse_infoframe()
1286 state->audio_samplerate = 32000; in tda1997x_parse_infoframe()
1289 state->audio_samplerate = 44100; in tda1997x_parse_infoframe()
1292 state->audio_samplerate = 48000; in tda1997x_parse_infoframe()
1295 state->audio_samplerate = 88200; in tda1997x_parse_infoframe()
1298 state->audio_samplerate = 96000; in tda1997x_parse_infoframe()
1301 state->audio_samplerate = 176400; in tda1997x_parse_infoframe()
1304 state->audio_samplerate = 192000; in tda1997x_parse_infoframe()
1314 state->audio_samplesize = 16; in tda1997x_parse_infoframe()
1317 state->audio_samplesize = 20; in tda1997x_parse_infoframe()
1320 state->audio_samplesize = 24; in tda1997x_parse_infoframe()
1328 state->audio_channels = frame.audio.channels; in tda1997x_parse_infoframe()
1330 frame.audio.channel_allocation != state->audio_ch_alloc) { in tda1997x_parse_infoframe()
1332 state->audio_ch_alloc = frame.audio.channel_allocation; in tda1997x_parse_infoframe()
1333 tda1997x_configure_audout(sd, state->audio_ch_alloc); in tda1997x_parse_infoframe()
1335 tda1997x_hdmi_info_reset(sd, RESET_AUDIO, false); in tda1997x_parse_infoframe()
1339 /* Auxiliary Video information (AVI) InfoFrame: see HDMI spec 8.2.1 */ in tda1997x_parse_infoframe()
1341 state->avi_infoframe = frame.avi; in tda1997x_parse_infoframe()
1344 /* configure upsampler: 0=bypass 1=repeatchroma 2=interpolate */ in tda1997x_parse_infoframe()
1345 reg = io_read(sd, REG_PIX_REPEAT); in tda1997x_parse_infoframe()
1349 io_write(sd, REG_PIX_REPEAT, reg); in tda1997x_parse_infoframe()
1351 /* ConfigurePixelRepeater: repeat n-times each pixel */ in tda1997x_parse_infoframe()
1352 reg = io_read(sd, REG_PIX_REPEAT); in tda1997x_parse_infoframe()
1355 io_write(sd, REG_PIX_REPEAT, reg); in tda1997x_parse_infoframe()
1358 tda1997x_configure_csc(sd); in tda1997x_parse_infoframe()
1368 struct v4l2_subdev *sd = &state->sd; in tda1997x_irq_sus() local
1371 source = io_read(sd, REG_INT_FLG_CLR_SUS); in tda1997x_irq_sus()
1372 io_write(sd, REG_INT_FLG_CLR_SUS, source); in tda1997x_irq_sus()
1376 if (state->mptrw_in_progress) in tda1997x_irq_sus()
1377 state->mptrw_in_progress = 0; in tda1997x_irq_sus()
1382 reg = io_read(sd, REG_HDMI_INFO_RST); in tda1997x_irq_sus()
1384 io_write(sd, REG_HDMI_INFO_RST, reg); in tda1997x_irq_sus()
1386 io_write(sd, REG_HDMI_INFO_RST, reg); in tda1997x_irq_sus()
1389 state->hdmi_status = 0; in tda1997x_irq_sus()
1393 reg = io_read(sd, REG_SUS_STATUS); in tda1997x_irq_sus()
1400 reg = io_read(sd, REG_SUS_STATUS); in tda1997x_irq_sus()
1402 v4l_err(state->client, "BAD SUS STATUS\n"); in tda1997x_irq_sus()
1408 v4l2_subdev_notify_event(&state->sd, &tda1997x_ev_fmt); in tda1997x_irq_sus()
1414 struct v4l2_subdev *sd = &state->sd; in tda1997x_irq_ddc() local
1417 source = io_read(sd, REG_INT_FLG_CLR_DDC); in tda1997x_irq_ddc()
1418 io_write(sd, REG_INT_FLG_CLR_DDC, source); in tda1997x_irq_ddc()
1421 if (state->mptrw_in_progress) in tda1997x_irq_ddc()
1422 state->mptrw_in_progress = 0; in tda1997x_irq_ddc()
1427 v4l2_ctrl_s_ctrl(state->detect_tx_5v_ctrl, in tda1997x_irq_ddc()
1428 tda1997x_detect_tx_5v(sd)); in tda1997x_irq_ddc()
1434 struct v4l2_subdev *sd = &state->sd; in tda1997x_irq_rate() local
1439 source = io_read(sd, REG_INT_FLG_CLR_RATE); in tda1997x_irq_rate()
1440 io_write(sd, REG_INT_FLG_CLR_RATE, source); in tda1997x_irq_rate()
1443 irq_status = tda1997x_read_activity_status_regs(sd); in tda1997x_irq_rate()
1451 irq_status = tda1997x_read_activity_status_regs(sd); in tda1997x_irq_rate()
1452 reg = io_read(sd, REG_INT_FLG_CLR_RATE); in tda1997x_irq_rate()
1453 io_write(sd, REG_INT_FLG_CLR_RATE, reg); in tda1997x_irq_rate()
1459 int input = (source & MASK_RATE_A_ST)?0:1; in tda1997x_irq_rate()
1460 u8 mask = 1<<input; in tda1997x_irq_rate()
1463 if ((irq_status & mask) != (state->activity_status & mask)) { in tda1997x_irq_rate()
1466 v4l_info(state->client, in tda1997x_irq_rate()
1467 "HDMI-%c: Digital Activity Lost\n", in tda1997x_irq_rate()
1471 reg = io_read(sd, REG_PIX_REPEAT); in tda1997x_irq_rate()
1474 io_write(sd, REG_PIX_REPEAT, reg); in tda1997x_irq_rate()
1476 if (state->chip_revision == 0) in tda1997x_irq_rate()
1479 state->input_detect[input] = 0; in tda1997x_irq_rate()
1480 v4l2_subdev_notify_event(sd, &tda1997x_ev_fmt); in tda1997x_irq_rate()
1485 v4l_info(state->client, in tda1997x_irq_rate()
1486 "HDMI-%c: Digital Activity Detected\n", in tda1997x_irq_rate()
1488 state->input_detect[input] = 1; in tda1997x_irq_rate()
1492 state->activity_status = (irq_status & mask); in tda1997x_irq_rate()
1499 struct v4l2_subdev *sd = &state->sd; in tda1997x_irq_info() local
1502 source = io_read(sd, REG_INT_FLG_CLR_INFO); in tda1997x_irq_info()
1503 io_write(sd, REG_INT_FLG_CLR_INFO, source); in tda1997x_irq_info()
1526 struct v4l2_subdev *sd = &state->sd; in tda1997x_irq_audio() local
1529 source = io_read(sd, REG_INT_FLG_CLR_AUDIO); in tda1997x_irq_audio()
1530 io_write(sd, REG_INT_FLG_CLR_AUDIO, source); in tda1997x_irq_audio()
1536 reg = io_read(sd, REG_SUS_STATUS); in tda1997x_irq_audio()
1538 reg = io_read(sd, REG_HDMI_INFO_RST); in tda1997x_irq_audio()
1540 io_write(sd, REG_HDMI_INFO_RST, reg); in tda1997x_irq_audio()
1542 io_write(sd, REG_HDMI_INFO_RST, reg); in tda1997x_irq_audio()
1552 reg = io_read(sd, REG_AUDIO_FREQ); in tda1997x_irq_audio()
1553 state->audio_samplerate = freq[reg & 7]; in tda1997x_irq_audio()
1554 v4l_info(state->client, "Audio Frequency Change: %dHz\n", in tda1997x_irq_audio()
1555 state->audio_samplerate); in tda1997x_irq_audio()
1558 reg = io_read(sd, REG_AUDIO_FLAGS); in tda1997x_irq_audio()
1560 state->audio_type = AUDCFG_TYPE_DST; in tda1997x_irq_audio()
1562 state->audio_type = AUDCFG_TYPE_OBA; in tda1997x_irq_audio()
1564 state->audio_type = AUDCFG_TYPE_HBR; in tda1997x_irq_audio()
1566 state->audio_type = AUDCFG_TYPE_PCM; in tda1997x_irq_audio()
1567 v4l_info(state->client, "Audio Type: %s\n", in tda1997x_irq_audio()
1568 audtype_names[state->audio_type]); in tda1997x_irq_audio()
1574 struct v4l2_subdev *sd = &state->sd; in tda1997x_irq_hdcp() local
1577 source = io_read(sd, REG_INT_FLG_CLR_HDCP); in tda1997x_irq_hdcp()
1578 io_write(sd, REG_INT_FLG_CLR_HDCP, source); in tda1997x_irq_hdcp()
1582 state->mptrw_in_progress = 0; in tda1997x_irq_hdcp()
1585 reg = io_read(sd, REG_INT_MASK_TOP); in tda1997x_irq_hdcp()
1587 io_write(sd, REG_INT_MASK_TOP, reg); in tda1997x_irq_hdcp()
1595 struct v4l2_subdev *sd = &state->sd; in tda1997x_isr_thread() local
1598 mutex_lock(&state->lock); in tda1997x_isr_thread()
1601 flags = io_read(sd, REG_INT_FLG_CLR_TOP); in tda1997x_isr_thread()
1626 mutex_unlock(&state->lock); in tda1997x_isr_thread()
1631 /* -----------------------------------------------------------------------------
1636 tda1997x_g_input_status(struct v4l2_subdev *sd, u32 *status) in tda1997x_g_input_status() argument
1638 struct tda1997x_state *state = to_state(sd); in tda1997x_g_input_status()
1643 mutex_lock(&state->lock); in tda1997x_g_input_status()
1644 vper = io_read24(sd, REG_V_PER) & MASK_VPER; in tda1997x_g_input_status()
1645 hper = io_read16(sd, REG_H_PER) & MASK_HPER; in tda1997x_g_input_status()
1646 hsper = io_read16(sd, REG_HS_WIDTH) & MASK_HSWIDTH; in tda1997x_g_input_status()
1650 * sets the input_detect array to 0|1 depending on signal presence. in tda1997x_g_input_status()
1658 v4l2_dbg(1, debug, sd, "inputs:%d/%d timings:%d/%d/%d\n", in tda1997x_g_input_status()
1659 state->input_detect[0], state->input_detect[1], in tda1997x_g_input_status()
1661 if (!state->input_detect[0] && !state->input_detect[1]) in tda1997x_g_input_status()
1667 mutex_unlock(&state->lock); in tda1997x_g_input_status()
1672 static int tda1997x_s_dv_timings(struct v4l2_subdev *sd, unsigned int pad, in tda1997x_s_dv_timings() argument
1675 struct tda1997x_state *state = to_state(sd); in tda1997x_s_dv_timings()
1677 v4l_dbg(1, debug, state->client, "%s\n", __func__); in tda1997x_s_dv_timings()
1679 if (v4l2_match_dv_timings(&state->timings, timings, 0, false)) in tda1997x_s_dv_timings()
1684 return -ERANGE; in tda1997x_s_dv_timings()
1686 mutex_lock(&state->lock); in tda1997x_s_dv_timings()
1687 state->timings = *timings; in tda1997x_s_dv_timings()
1689 tda1997x_configure_vhref(sd); in tda1997x_s_dv_timings()
1691 tda1997x_configure_csc(sd); in tda1997x_s_dv_timings()
1692 mutex_unlock(&state->lock); in tda1997x_s_dv_timings()
1697 static int tda1997x_g_dv_timings(struct v4l2_subdev *sd, unsigned int pad, in tda1997x_g_dv_timings() argument
1700 struct tda1997x_state *state = to_state(sd); in tda1997x_g_dv_timings()
1702 v4l_dbg(1, debug, state->client, "%s\n", __func__); in tda1997x_g_dv_timings()
1703 mutex_lock(&state->lock); in tda1997x_g_dv_timings()
1704 *timings = state->timings; in tda1997x_g_dv_timings()
1705 mutex_unlock(&state->lock); in tda1997x_g_dv_timings()
1710 static int tda1997x_query_dv_timings(struct v4l2_subdev *sd, unsigned int pad, in tda1997x_query_dv_timings() argument
1713 struct tda1997x_state *state = to_state(sd); in tda1997x_query_dv_timings()
1716 v4l_dbg(1, debug, state->client, "%s\n", __func__); in tda1997x_query_dv_timings()
1718 mutex_lock(&state->lock); in tda1997x_query_dv_timings()
1720 mutex_unlock(&state->lock); in tda1997x_query_dv_timings()
1730 /* -----------------------------------------------------------------------------
1734 static int tda1997x_init_state(struct v4l2_subdev *sd, in tda1997x_init_state() argument
1737 struct tda1997x_state *state = to_state(sd); in tda1997x_init_state()
1741 mf->code = state->mbus_codes[0]; in tda1997x_init_state()
1746 static int tda1997x_enum_mbus_code(struct v4l2_subdev *sd, in tda1997x_enum_mbus_code() argument
1750 struct tda1997x_state *state = to_state(sd); in tda1997x_enum_mbus_code()
1752 v4l_dbg(1, debug, state->client, "%s %d\n", __func__, code->index); in tda1997x_enum_mbus_code()
1753 if (code->index >= ARRAY_SIZE(state->mbus_codes)) in tda1997x_enum_mbus_code()
1754 return -EINVAL; in tda1997x_enum_mbus_code()
1756 if (!state->mbus_codes[code->index]) in tda1997x_enum_mbus_code()
1757 return -EINVAL; in tda1997x_enum_mbus_code()
1759 code->code = state->mbus_codes[code->index]; in tda1997x_enum_mbus_code()
1770 bt = &state->timings.bt; in tda1997x_fill_format()
1771 format->width = bt->width; in tda1997x_fill_format()
1772 format->height = bt->height; in tda1997x_fill_format()
1773 format->colorspace = state->colorimetry.colorspace; in tda1997x_fill_format()
1774 format->field = (bt->interlaced) ? in tda1997x_fill_format()
1778 static int tda1997x_get_format(struct v4l2_subdev *sd, in tda1997x_get_format() argument
1782 struct tda1997x_state *state = to_state(sd); in tda1997x_get_format()
1784 v4l_dbg(1, debug, state->client, "%s pad=%d which=%d\n", in tda1997x_get_format()
1785 __func__, format->pad, format->which); in tda1997x_get_format()
1787 tda1997x_fill_format(state, &format->format); in tda1997x_get_format()
1789 if (format->which == V4L2_SUBDEV_FORMAT_TRY) { in tda1997x_get_format()
1792 fmt = v4l2_subdev_state_get_format(sd_state, format->pad); in tda1997x_get_format()
1793 format->format.code = fmt->code; in tda1997x_get_format()
1795 format->format.code = state->mbus_code; in tda1997x_get_format()
1800 static int tda1997x_set_format(struct v4l2_subdev *sd, in tda1997x_set_format() argument
1804 struct tda1997x_state *state = to_state(sd); in tda1997x_set_format()
1808 v4l_dbg(1, debug, state->client, "%s pad=%d which=%d fmt=0x%x\n", in tda1997x_set_format()
1809 __func__, format->pad, format->which, format->format.code); in tda1997x_set_format()
1811 for (i = 0; i < ARRAY_SIZE(state->mbus_codes); i++) { in tda1997x_set_format()
1812 if (format->format.code == state->mbus_codes[i]) { in tda1997x_set_format()
1813 code = state->mbus_codes[i]; in tda1997x_set_format()
1818 code = state->mbus_codes[0]; in tda1997x_set_format()
1820 tda1997x_fill_format(state, &format->format); in tda1997x_set_format()
1821 format->format.code = code; in tda1997x_set_format()
1823 if (format->which == V4L2_SUBDEV_FORMAT_TRY) { in tda1997x_set_format()
1826 fmt = v4l2_subdev_state_get_format(sd_state, format->pad); in tda1997x_set_format()
1827 *fmt = format->format; in tda1997x_set_format()
1829 int ret = tda1997x_setup_format(state, format->format.code); in tda1997x_set_format()
1833 /* mbus_code has changed - re-configure csc/vidout */ in tda1997x_set_format()
1834 tda1997x_configure_csc(sd); in tda1997x_set_format()
1841 static int tda1997x_get_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid) in tda1997x_get_edid() argument
1843 struct tda1997x_state *state = to_state(sd); in tda1997x_get_edid()
1845 v4l_dbg(1, debug, state->client, "%s pad=%d\n", __func__, edid->pad); in tda1997x_get_edid()
1846 memset(edid->reserved, 0, sizeof(edid->reserved)); in tda1997x_get_edid()
1848 if (edid->start_block == 0 && edid->blocks == 0) { in tda1997x_get_edid()
1849 edid->blocks = state->edid.blocks; in tda1997x_get_edid()
1853 if (!state->edid.present) in tda1997x_get_edid()
1854 return -ENODATA; in tda1997x_get_edid()
1856 if (edid->start_block >= state->edid.blocks) in tda1997x_get_edid()
1857 return -EINVAL; in tda1997x_get_edid()
1859 if (edid->start_block + edid->blocks > state->edid.blocks) in tda1997x_get_edid()
1860 edid->blocks = state->edid.blocks - edid->start_block; in tda1997x_get_edid()
1862 memcpy(edid->edid, state->edid.edid + edid->start_block * 128, in tda1997x_get_edid()
1863 edid->blocks * 128); in tda1997x_get_edid()
1868 static int tda1997x_set_edid(struct v4l2_subdev *sd, struct v4l2_edid *edid) in tda1997x_set_edid() argument
1870 struct tda1997x_state *state = to_state(sd); in tda1997x_set_edid()
1873 v4l_dbg(1, debug, state->client, "%s pad=%d\n", __func__, edid->pad); in tda1997x_set_edid()
1874 memset(edid->reserved, 0, sizeof(edid->reserved)); in tda1997x_set_edid()
1876 if (edid->start_block != 0) in tda1997x_set_edid()
1877 return -EINVAL; in tda1997x_set_edid()
1879 if (edid->blocks == 0) { in tda1997x_set_edid()
1880 state->edid.blocks = 0; in tda1997x_set_edid()
1881 state->edid.present = 0; in tda1997x_set_edid()
1882 tda1997x_disable_edid(sd); in tda1997x_set_edid()
1886 if (edid->blocks > 2) { in tda1997x_set_edid()
1887 edid->blocks = 2; in tda1997x_set_edid()
1888 return -E2BIG; in tda1997x_set_edid()
1891 tda1997x_disable_edid(sd); in tda1997x_set_edid()
1895 io_write(sd, REG_EDID_IN_BYTE0 + i, edid->edid[i]); in tda1997x_set_edid()
1899 io_write(sd, REG_EDID_IN_BYTE128 + i, edid->edid[i+128]); in tda1997x_set_edid()
1902 memcpy(state->edid.edid, edid->edid, 256); in tda1997x_set_edid()
1903 state->edid.blocks = edid->blocks; in tda1997x_set_edid()
1905 tda1997x_enable_edid(sd); in tda1997x_set_edid()
1910 static int tda1997x_get_dv_timings_cap(struct v4l2_subdev *sd, in tda1997x_get_dv_timings_cap() argument
1917 static int tda1997x_enum_dv_timings(struct v4l2_subdev *sd, in tda1997x_enum_dv_timings() argument
1937 /* -----------------------------------------------------------------------------
1941 static int tda1997x_log_infoframe(struct v4l2_subdev *sd, int addr) in tda1997x_log_infoframe() argument
1943 struct tda1997x_state *state = to_state(sd); in tda1997x_log_infoframe()
1949 len = io_readn(sd, addr, sizeof(buffer), buffer); in tda1997x_log_infoframe()
1950 v4l2_dbg(1, debug, sd, "infoframe: addr=%d len=%d\n", addr, len); in tda1997x_log_infoframe()
1953 v4l_err(state->client, in tda1997x_log_infoframe()
1958 hdmi_infoframe_log(KERN_INFO, &state->client->dev, &frame); in tda1997x_log_infoframe()
1963 static int tda1997x_log_status(struct v4l2_subdev *sd) in tda1997x_log_status() argument
1965 struct tda1997x_state *state = to_state(sd); in tda1997x_log_status()
1967 struct hdmi_avi_infoframe *avi = &state->avi_infoframe; in tda1997x_log_status()
1969 v4l2_info(sd, "-----Chip status-----\n"); in tda1997x_log_status()
1970 v4l2_info(sd, "Chip: %s N%d\n", state->info->name, in tda1997x_log_status()
1971 state->chip_revision + 1); in tda1997x_log_status()
1972 v4l2_info(sd, "EDID Enabled: %s\n", state->edid.present ? "yes" : "no"); in tda1997x_log_status()
1974 v4l2_info(sd, "-----Signal status-----\n"); in tda1997x_log_status()
1975 v4l2_info(sd, "Cable detected (+5V power): %s\n", in tda1997x_log_status()
1976 tda1997x_detect_tx_5v(sd) ? "yes" : "no"); in tda1997x_log_status()
1977 v4l2_info(sd, "HPD detected: %s\n", in tda1997x_log_status()
1978 tda1997x_detect_tx_hpd(sd) ? "yes" : "no"); in tda1997x_log_status()
1980 v4l2_info(sd, "-----Video Timings-----\n"); in tda1997x_log_status()
1982 case -ENOLINK: in tda1997x_log_status()
1983 v4l2_info(sd, "No video detected\n"); in tda1997x_log_status()
1985 case -ERANGE: in tda1997x_log_status()
1986 v4l2_info(sd, "Invalid signal detected\n"); in tda1997x_log_status()
1989 v4l2_print_dv_timings(sd->name, "Configured format: ", in tda1997x_log_status()
1990 &state->timings, true); in tda1997x_log_status()
1992 v4l2_info(sd, "-----Color space-----\n"); in tda1997x_log_status()
1993 v4l2_info(sd, "Input color space: %s %s %s", in tda1997x_log_status()
1994 hdmi_colorspace_names[avi->colorspace], in tda1997x_log_status()
1995 (avi->colorspace == HDMI_COLORSPACE_RGB) ? "" : in tda1997x_log_status()
1996 hdmi_colorimetry_names[avi->colorimetry], in tda1997x_log_status()
1997 v4l2_quantization_names[state->colorimetry.quantization]); in tda1997x_log_status()
1998 v4l2_info(sd, "Output color space: %s", in tda1997x_log_status()
1999 vidfmt_names[state->vid_fmt]); in tda1997x_log_status()
2000 v4l2_info(sd, "Color space conversion: %s", state->conv ? in tda1997x_log_status()
2001 state->conv->name : "None"); in tda1997x_log_status()
2003 v4l2_info(sd, "-----Audio-----\n"); in tda1997x_log_status()
2004 if (state->audio_channels) { in tda1997x_log_status()
2005 v4l2_info(sd, "audio: %dch %dHz\n", state->audio_channels, in tda1997x_log_status()
2006 state->audio_samplerate); in tda1997x_log_status()
2008 v4l2_info(sd, "audio: none\n"); in tda1997x_log_status()
2011 v4l2_info(sd, "-----Infoframes-----\n"); in tda1997x_log_status()
2012 tda1997x_log_infoframe(sd, AUD_IF); in tda1997x_log_status()
2013 tda1997x_log_infoframe(sd, SPD_IF); in tda1997x_log_status()
2014 tda1997x_log_infoframe(sd, AVI_IF); in tda1997x_log_status()
2019 static int tda1997x_subscribe_event(struct v4l2_subdev *sd, in tda1997x_subscribe_event() argument
2023 switch (sub->type) { in tda1997x_subscribe_event()
2025 return v4l2_src_change_event_subdev_subscribe(sd, fh, sub); in tda1997x_subscribe_event()
2027 return v4l2_ctrl_subdev_subscribe_event(sd, fh, sub); in tda1997x_subscribe_event()
2029 return -EINVAL; in tda1997x_subscribe_event()
2039 /* -----------------------------------------------------------------------------
2053 /* -----------------------------------------------------------------------------
2059 struct v4l2_subdev *sd = to_sd(ctrl); in tda1997x_s_ctrl() local
2060 struct tda1997x_state *state = to_state(sd); in tda1997x_s_ctrl()
2062 switch (ctrl->id) { in tda1997x_s_ctrl()
2065 state->rgb_quantization_range = ctrl->val; in tda1997x_s_ctrl()
2067 tda1997x_configure_csc(sd); in tda1997x_s_ctrl()
2071 return -EINVAL; in tda1997x_s_ctrl()
2076 struct v4l2_subdev *sd = to_sd(ctrl); in tda1997x_g_volatile_ctrl() local
2077 struct tda1997x_state *state = to_state(sd); in tda1997x_g_volatile_ctrl()
2079 if (ctrl->id == V4L2_CID_DV_RX_IT_CONTENT_TYPE) { in tda1997x_g_volatile_ctrl()
2080 ctrl->val = state->avi_infoframe.content_type; in tda1997x_g_volatile_ctrl()
2083 return -EINVAL; in tda1997x_g_volatile_ctrl()
2091 static int tda1997x_core_init(struct v4l2_subdev *sd) in tda1997x_core_init() argument
2093 struct tda1997x_state *state = to_state(sd); in tda1997x_core_init()
2094 struct tda1997x_platform_data *pdata = &state->pdata; in tda1997x_core_init()
2099 io_write(sd, REG_HPD_AUTO_CTRL, HPD_AUTO_HPD_UNSEL); in tda1997x_core_init()
2100 if (state->chip_revision == 0) { in tda1997x_core_init()
2101 io_write(sd, REG_MAN_SUS_HDMI_SEL, MAN_DIS_HDCP | MAN_RST_HDCP); in tda1997x_core_init()
2102 io_write(sd, REG_CGU_DBG_SEL, 1 << CGU_DBG_CLK_SEL_SHIFT); in tda1997x_core_init()
2105 /* reset infoframe at end of start-up-sequencer */ in tda1997x_core_init()
2106 io_write(sd, REG_SUS_SET_RGB2, 0x06); in tda1997x_core_init()
2107 io_write(sd, REG_SUS_SET_RGB3, 0x06); in tda1997x_core_init()
2109 /* Enable TMDS pull-ups */ in tda1997x_core_init()
2110 io_write(sd, REG_RT_MAN_CTRL, RT_MAN_CTRL_RT | in tda1997x_core_init()
2114 tda1997x_cec_write(sd, REG_PWR_CONTROL & 0xff, 0x04); in tda1997x_core_init()
2116 tda1997x_cec_write(sd, REG_OSC_DIVIDER & 0xff, 0x03); in tda1997x_core_init()
2117 tda1997x_cec_write(sd, REG_EN_OSC_PERIOD_LSB & 0xff, 0xa0); in tda1997x_core_init()
2118 io_write(sd, REG_TIMER_D, 0x54); in tda1997x_core_init()
2120 reg = tda1997x_cec_read(sd, REG_CONTROL & 0xff); in tda1997x_core_init()
2122 tda1997x_cec_write(sd, REG_CONTROL & 0xff, reg); in tda1997x_core_init()
2126 reg = io_read(sd, REG_VERSION); in tda1997x_core_init()
2128 reg = io_read(sd, REG_CMTP_REG10); in tda1997x_core_init()
2131 io_write(sd, REG_INT_MASK_TOP, in tda1997x_core_init()
2135 io_write(sd, REG_INT_MASK_SUS, MASK_MPT | MASK_FMT | MASK_SUS_END); in tda1997x_core_init()
2137 io_write(sd, REG_INT_MASK_RATE, MASK_RATE_B_ST | MASK_RATE_A_ST); in tda1997x_core_init()
2139 io_write(sd, REG_INT_MASK_INFO, in tda1997x_core_init()
2142 io_write(sd, REG_INT_MASK_AUDIO, in tda1997x_core_init()
2146 io_write(sd, REG_INT_MASK_HDCP, MASK_STATE_C5); in tda1997x_core_init()
2148 io_write(sd, REG_INT_MASK_DDC, MASK_DET_5V); in tda1997x_core_init()
2150 io_write(sd, REG_INT_MASK_AFE, 0); in tda1997x_core_init()
2151 io_write(sd, REG_INT_MASK_MODE, 0); in tda1997x_core_init()
2154 io_write(sd, REG_INT_FLG_CLR_TOP, 0xff); in tda1997x_core_init()
2155 io_write(sd, REG_INT_FLG_CLR_SUS, 0xff); in tda1997x_core_init()
2156 io_write(sd, REG_INT_FLG_CLR_DDC, 0xff); in tda1997x_core_init()
2157 io_write(sd, REG_INT_FLG_CLR_RATE, 0xff); in tda1997x_core_init()
2158 io_write(sd, REG_INT_FLG_CLR_MODE, 0xff); in tda1997x_core_init()
2159 io_write(sd, REG_INT_FLG_CLR_INFO, 0xff); in tda1997x_core_init()
2160 io_write(sd, REG_INT_FLG_CLR_AUDIO, 0xff); in tda1997x_core_init()
2161 io_write(sd, REG_INT_FLG_CLR_HDCP, 0xff); in tda1997x_core_init()
2162 io_write(sd, REG_INT_FLG_CLR_AFE, 0xff); in tda1997x_core_init()
2165 if (state->chip_revision == 0) in tda1997x_core_init()
2166 io_write(sd, REG_CGU_DBG_SEL, 1 << CGU_DBG_CLK_SEL_SHIFT); in tda1997x_core_init()
2167 io_write24(sd, REG_CLK_MIN_RATE, CLK_MIN_RATE); in tda1997x_core_init()
2168 io_write24(sd, REG_CLK_MAX_RATE, CLK_MAX_RATE); in tda1997x_core_init()
2169 if (state->chip_revision == 0) in tda1997x_core_init()
2170 io_write(sd, REG_WDL_CFG, WDL_CFG_VAL); in tda1997x_core_init()
2172 io_write(sd, REG_DEEP_COLOR_CTRL, DC_FILTER_VAL); in tda1997x_core_init()
2174 io_write(sd, REG_SVC_MODE, 0x00); in tda1997x_core_init()
2176 io_write(sd, REG_INFO_CTRL, 0xff); in tda1997x_core_init()
2178 io_write(sd, REG_INFO_EXCEED, 3); in tda1997x_core_init()
2180 if (state->chip_revision == 0) in tda1997x_core_init()
2187 tda1997x_hdmi_info_reset(sd, NACK_HDCP, true); in tda1997x_core_init()
2190 tda1997x_manual_hpd(sd, HPD_LOW_BP); in tda1997x_core_init()
2193 io_write(sd, REG_HDCP_BCAPS, HDCP_HDMI | HDCP_FAST_REAUTH); in tda1997x_core_init()
2198 io_write(sd, REG_HDMI_CTRL, reg); in tda1997x_core_init()
2200 /* reset start-up-sequencer to force format detection */ in tda1997x_core_init()
2201 tda1997x_hdmi_info_reset(sd, 0, true); in tda1997x_core_init()
2204 reg = io_read(sd, REG_VDP_CTRL); in tda1997x_core_init()
2206 io_write(sd, REG_VDP_CTRL, reg); in tda1997x_core_init()
2213 v4l_dbg(1, debug, state->client, "vidout_cfg[%d]=0x%02x\n", i, in tda1997x_core_init()
2214 pdata->vidout_port_cfg[i]); in tda1997x_core_init()
2215 io_write(sd, REG_VP35_32_CTRL + i, pdata->vidout_port_cfg[i]); in tda1997x_core_init()
2219 tda1997x_configure_audout(sd, 0); in tda1997x_core_init()
2222 switch (pdata->audout_mclk_fs) { in tda1997x_core_init()
2242 io_write(sd, REG_AUDIO_CLOCK, reg); in tda1997x_core_init()
2245 tda1997x_hdmi_info_reset(sd, RESET_AI, false); in tda1997x_core_init()
2247 tda1997x_hdmi_info_reset(sd, RESET_IF, false); in tda1997x_core_init()
2249 tda1997x_hdmi_info_reset(sd, RESET_AUDIO, false); in tda1997x_core_init()
2251 tda1997x_hdmi_info_reset(sd, RESET_GAMUT, false); in tda1997x_core_init()
2254 state->hdmi_status = io_read(sd, REG_HDMI_FLAGS); in tda1997x_core_init()
2256 io_write(sd, REG_EDID_ENABLE, EDID_ENABLE_A_EN | EDID_ENABLE_B_EN); in tda1997x_core_init()
2266 state->supplies); in tda1997x_set_power()
2270 state->supplies); in tda1997x_set_power()
2292 struct tda1997x_platform_data *pdata = &state->pdata; in tda1997x_parse_dt()
2303 * - HREF: active high from start to end of row in tda1997x_parse_dt()
2304 * - VS: Vertical Sync active high at beginning of frame in tda1997x_parse_dt()
2305 * - DE: Active high when data valid in tda1997x_parse_dt()
2306 * - A_CLK: 128*Fs in tda1997x_parse_dt()
2308 pdata->vidout_sel_hs = HS_HREF_SEL_HREF_VHREF; in tda1997x_parse_dt()
2309 pdata->vidout_sel_vs = VS_VREF_SEL_VREF_HDMI; in tda1997x_parse_dt()
2310 pdata->vidout_sel_de = DE_FREF_SEL_DE_VHREF; in tda1997x_parse_dt()
2312 np = state->client->dev.of_node; in tda1997x_parse_dt()
2313 ep = of_graph_get_endpoint_by_regs(np, 0, -1); in tda1997x_parse_dt()
2315 return -EINVAL; in tda1997x_parse_dt()
2323 pdata->vidout_bus_type = bus_cfg.bus_type; in tda1997x_parse_dt()
2328 pdata->vidout_inv_hs = 1; in tda1997x_parse_dt()
2330 pdata->vidout_inv_vs = 1; in tda1997x_parse_dt()
2332 pdata->vidout_inv_de = 1; in tda1997x_parse_dt()
2333 pdata->vidout_bus_width = bus_cfg.bus.parallel.bus_width; in tda1997x_parse_dt()
2336 ret = of_property_count_u32_elems(np, "nxp,vidout-portcfg"); in tda1997x_parse_dt()
2341 of_property_read_u32_index(np, "nxp,vidout-portcfg", in tda1997x_parse_dt()
2343 of_property_read_u32_index(np, "nxp,vidout-portcfg", in tda1997x_parse_dt()
2344 i * 2 + 1, &val); in tda1997x_parse_dt()
2346 pdata->vidout_port_cfg[reg] = val; in tda1997x_parse_dt()
2349 v4l_err(state->client, "nxp,vidout-portcfg missing\n"); in tda1997x_parse_dt()
2350 return -EINVAL; in tda1997x_parse_dt()
2354 pdata->audout_layoutauto = true; in tda1997x_parse_dt()
2356 pdata->audout_format = AUDFMT_TYPE_DISABLED; in tda1997x_parse_dt()
2357 if (!of_property_read_string(np, "nxp,audout-format", &str)) { in tda1997x_parse_dt()
2359 pdata->audout_format = AUDFMT_TYPE_I2S; in tda1997x_parse_dt()
2361 pdata->audout_format = AUDFMT_TYPE_SPDIF; in tda1997x_parse_dt()
2363 v4l_err(state->client, "nxp,audout-format invalid\n"); in tda1997x_parse_dt()
2364 return -EINVAL; in tda1997x_parse_dt()
2366 if (!of_property_read_u32(np, "nxp,audout-layout", &v)) { in tda1997x_parse_dt()
2369 case 1: in tda1997x_parse_dt()
2372 v4l_err(state->client, in tda1997x_parse_dt()
2373 "nxp,audout-layout invalid\n"); in tda1997x_parse_dt()
2374 return -EINVAL; in tda1997x_parse_dt()
2376 pdata->audout_layout = v; in tda1997x_parse_dt()
2378 if (!of_property_read_u32(np, "nxp,audout-width", &v)) { in tda1997x_parse_dt()
2384 v4l_err(state->client, in tda1997x_parse_dt()
2385 "nxp,audout-width invalid\n"); in tda1997x_parse_dt()
2386 return -EINVAL; in tda1997x_parse_dt()
2388 pdata->audout_width = v; in tda1997x_parse_dt()
2390 if (!of_property_read_u32(np, "nxp,audout-mclk-fs", &v)) { in tda1997x_parse_dt()
2400 v4l_err(state->client, in tda1997x_parse_dt()
2401 "nxp,audout-mclk-fs invalid\n"); in tda1997x_parse_dt()
2402 return -EINVAL; in tda1997x_parse_dt()
2404 pdata->audout_mclk_fs = v; in tda1997x_parse_dt()
2416 state->supplies[i].supply = tda1997x_supply_name[i]; in tda1997x_get_regulators()
2418 return devm_regulator_bulk_get(&state->client->dev, in tda1997x_get_regulators()
2420 state->supplies); in tda1997x_get_regulators()
2425 struct v4l2_subdev *sd = &state->sd; in tda1997x_identify_module() local
2430 reg = io_read(sd, REG_CMTP_REG10); in tda1997x_identify_module()
2431 state->tmdsb_clk = (reg >> 6) & 0x01; /* use tmds clock B_inv for B */ in tda1997x_identify_module()
2432 state->tmdsb_soc = (reg >> 5) & 0x01; /* tmds of input B */ in tda1997x_identify_module()
2433 state->port_30bit = (reg >> 2) & 0x03; /* 30bit vs 24bit */ in tda1997x_identify_module()
2434 state->output_2p5 = (reg >> 1) & 0x01; /* output supply 2.5v */ in tda1997x_identify_module()
2444 dev_err(&state->client->dev, "unsupported chip ID\n"); in tda1997x_identify_module()
2445 return -EIO; in tda1997x_identify_module()
2447 if (state->info->type != type) { in tda1997x_identify_module()
2448 dev_err(&state->client->dev, "chip id mismatch\n"); in tda1997x_identify_module()
2449 return -EIO; in tda1997x_identify_module()
2453 state->chip_revision = io_read(sd, REG_CMTP_REG11); in tda1997x_identify_module()
2463 /* -----------------------------------------------------------------------------
2467 /* refine sample-rate based on HDMI source */
2471 struct v4l2_subdev *sd = snd_soc_dai_get_drvdata(dai); in tda1997x_pcm_startup() local
2472 struct tda1997x_state *state = to_state(sd); in tda1997x_pcm_startup()
2473 struct snd_soc_component *component = dai->component; in tda1997x_pcm_startup()
2474 struct snd_pcm_runtime *rtd = substream->runtime; in tda1997x_pcm_startup()
2477 rate = state->audio_samplerate; in tda1997x_pcm_startup()
2481 dev_err(component->dev, "failed to constrain samplerate to %dHz\n", in tda1997x_pcm_startup()
2485 dev_info(component->dev, "set samplerate constraint to %dHz\n", rate); in tda1997x_pcm_startup()
2520 .idle_bias_on = 1,
2521 .use_pmdown_time = 1,
2522 .endianness = 1,
2530 struct v4l2_subdev *sd; in tda1997x_probe() local
2539 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) in tda1997x_probe()
2540 return -EIO; in tda1997x_probe()
2544 return -ENOMEM; in tda1997x_probe()
2546 state->client = client; in tda1997x_probe()
2547 pdata = &state->pdata; in tda1997x_probe()
2548 if (IS_ENABLED(CONFIG_OF) && client->dev.of_node) { in tda1997x_probe()
2551 oid = of_match_node(tda1997x_of_id, client->dev.of_node); in tda1997x_probe()
2552 state->info = oid->data; in tda1997x_probe()
2559 } else if (client->dev.platform_data) { in tda1997x_probe()
2561 client->dev.platform_data; in tda1997x_probe()
2562 state->info = in tda1997x_probe()
2563 (const struct tda1997x_chip_info *)id->driver_data; in tda1997x_probe()
2564 state->pdata = *pdata; in tda1997x_probe()
2567 ret = -ENODEV; in tda1997x_probe()
2575 ret = tda1997x_set_power(state, 1); in tda1997x_probe()
2579 mutex_init(&state->page_lock); in tda1997x_probe()
2580 mutex_init(&state->lock); in tda1997x_probe()
2581 state->page = 0xff; in tda1997x_probe()
2583 INIT_DELAYED_WORK(&state->delayed_work_enable_hpd, in tda1997x_probe()
2592 sd = &state->sd; in tda1997x_probe()
2593 v4l2_i2c_subdev_init(sd, client, &tda1997x_subdev_ops); in tda1997x_probe()
2594 sd->internal_ops = &tda1997x_internal_ops; in tda1997x_probe()
2595 snprintf(sd->name, sizeof(sd->name), "%s %d-%04x", in tda1997x_probe()
2596 id->name, i2c_adapter_id(client->adapter), in tda1997x_probe()
2597 client->addr); in tda1997x_probe()
2598 sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS; in tda1997x_probe()
2599 sd->entity.function = MEDIA_ENT_F_DV_DECODER; in tda1997x_probe()
2600 sd->entity.ops = &tda1997x_media_ops; in tda1997x_probe()
2602 /* set allowed mbus modes based on chip, bus-type, and bus-width */ in tda1997x_probe()
2604 mbus_codes = state->mbus_codes; in tda1997x_probe()
2605 switch (state->info->type) { in tda1997x_probe()
2607 switch (pdata->vidout_bus_type) { in tda1997x_probe()
2609 switch (pdata->vidout_bus_width) { in tda1997x_probe()
2620 switch (pdata->vidout_bus_width) { in tda1997x_probe()
2635 switch (pdata->vidout_bus_type) { in tda1997x_probe()
2637 switch (pdata->vidout_bus_width) { in tda1997x_probe()
2652 switch (pdata->vidout_bus_width) { in tda1997x_probe()
2672 if (WARN_ON(i > ARRAY_SIZE(state->mbus_codes))) { in tda1997x_probe()
2673 ret = -EINVAL; in tda1997x_probe()
2678 tda1997x_setup_format(state, state->mbus_codes[0]); in tda1997x_probe()
2679 state->timings = cea1920x1080; in tda1997x_probe()
2685 state->colorimetry.colorspace = V4L2_COLORSPACE_SRGB; in tda1997x_probe()
2686 state->colorimetry.quantization = V4L2_QUANTIZATION_FULL_RANGE; in tda1997x_probe()
2689 io_write(sd, REG_MAN_SUS_HDMI_SEL, MAN_RST_HDCP | MAN_DIS_HDCP); in tda1997x_probe()
2695 if (state->chip_revision != 0) { in tda1997x_probe()
2696 io_write(sd, REG_MAN_SUS_HDMI_SEL, 0x00); in tda1997x_probe()
2697 io_write(sd, REG_VDP_CTRL, 0x1f); in tda1997x_probe()
2700 v4l_info(client, "NXP %s N%d detected\n", state->info->name, in tda1997x_probe()
2701 state->chip_revision + 1); in tda1997x_probe()
2703 pdata->vidout_bus_width, in tda1997x_probe()
2704 (pdata->vidout_bus_type == V4L2_MBUS_PARALLEL) ? in tda1997x_probe()
2707 if (pdata->audout_format) { in tda1997x_probe()
2709 pdata->audout_layout ? 2 : 8, in tda1997x_probe()
2710 audfmt_names[pdata->audout_format], in tda1997x_probe()
2711 pdata->audout_layout, in tda1997x_probe()
2712 pdata->audout_mclk_fs); in tda1997x_probe()
2715 ret = 0x34 + ((io_read(sd, REG_SLAVE_ADDR)>>4) & 0x03); in tda1997x_probe()
2716 state->client_cec = devm_i2c_new_dummy_device(&client->dev, in tda1997x_probe()
2717 client->adapter, ret); in tda1997x_probe()
2718 if (IS_ERR(state->client_cec)) { in tda1997x_probe()
2719 ret = PTR_ERR(state->client_cec); in tda1997x_probe()
2725 ret = tda1997x_core_init(sd); in tda1997x_probe()
2730 hdl = &state->hdl; in tda1997x_probe()
2737 ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE; in tda1997x_probe()
2739 state->detect_tx_5v_ctrl = v4l2_ctrl_new_std(hdl, NULL, in tda1997x_probe()
2740 V4L2_CID_DV_RX_POWER_PRESENT, 0, 1, 0, 0); in tda1997x_probe()
2741 state->rgb_quantization_range_ctrl = v4l2_ctrl_new_std_menu(hdl, in tda1997x_probe()
2745 state->sd.ctrl_handler = hdl; in tda1997x_probe()
2746 if (hdl->error) { in tda1997x_probe()
2747 ret = hdl->error; in tda1997x_probe()
2753 state->pads[TDA1997X_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE; in tda1997x_probe()
2754 ret = media_entity_pads_init(&sd->entity, TDA1997X_NUM_PADS, in tda1997x_probe()
2755 state->pads); in tda1997x_probe()
2761 ret = v4l2_async_register_subdev(sd); in tda1997x_probe()
2766 if (pdata->audout_format) { in tda1997x_probe()
2769 if (pdata->audout_width == 32) in tda1997x_probe()
2774 ret = devm_snd_soc_register_component(&state->client->dev, in tda1997x_probe()
2776 &tda1997x_audio_dai, 1); in tda1997x_probe()
2778 dev_err(&client->dev, "register audio codec failed\n"); in tda1997x_probe()
2781 v4l_info(state->client, "registered audio codec\n"); in tda1997x_probe()
2785 ret = devm_request_threaded_irq(&client->dev, client->irq, in tda1997x_probe()
2790 v4l_err(client, "irq%d reg failed: %d\n", client->irq, ret); in tda1997x_probe()
2797 media_entity_cleanup(&sd->entity); in tda1997x_probe()
2799 v4l2_ctrl_handler_free(&state->hdl); in tda1997x_probe()
2801 cancel_delayed_work(&state->delayed_work_enable_hpd); in tda1997x_probe()
2802 mutex_destroy(&state->page_lock); in tda1997x_probe()
2803 mutex_destroy(&state->lock); in tda1997x_probe()
2807 dev_err(&client->dev, "%s failed: %d\n", __func__, ret); in tda1997x_probe()
2814 struct v4l2_subdev *sd = i2c_get_clientdata(client); in tda1997x_remove() local
2815 struct tda1997x_state *state = to_state(sd); in tda1997x_remove()
2816 struct tda1997x_platform_data *pdata = &state->pdata; in tda1997x_remove()
2818 if (pdata->audout_format) { in tda1997x_remove()
2819 mutex_destroy(&state->audio_lock); in tda1997x_remove()
2822 disable_irq(state->client->irq); in tda1997x_remove()
2825 v4l2_async_unregister_subdev(sd); in tda1997x_remove()
2826 media_entity_cleanup(&sd->entity); in tda1997x_remove()
2827 v4l2_ctrl_handler_free(&state->hdl); in tda1997x_remove()
2828 regulator_bulk_disable(TDA1997X_NUM_SUPPLIES, state->supplies); in tda1997x_remove()
2829 cancel_delayed_work_sync(&state->delayed_work_enable_hpd); in tda1997x_remove()
2830 mutex_destroy(&state->page_lock); in tda1997x_remove()
2831 mutex_destroy(&state->lock); in tda1997x_remove()