Lines Matching refs:tc
234 ret = regmap_write(tc->regmap, reg, var); \
240 ret = regmap_read(tc->regmap, reg, var); \
270 static int tc_aux_wait_busy(struct tc_data *tc, unsigned int timeout_ms) in tc_aux_wait_busy() argument
272 return tc_poll_timeout(tc->regmap, DP0_AUXSTATUS, AUX_BUSY, 0, in tc_aux_wait_busy()
276 static int tc_aux_get_status(struct tc_data *tc, u8 *reply) in tc_aux_get_status() argument
281 ret = regmap_read(tc->regmap, DP0_AUXSTATUS, &value); in tc_aux_get_status()
286 dev_err(tc->dev, "i2c access timeout!\n"); in tc_aux_get_status()
299 struct tc_data *tc = aux_to_tc(aux); in tc_aux_transfer() local
310 ret = tc_aux_wait_busy(tc, 100); in tc_aux_transfer()
337 ret = tc_aux_wait_busy(tc, 100); in tc_aux_transfer()
341 ret = tc_aux_get_status(tc, &msg->reply); in tc_aux_transfer()
379 static u32 tc_srcctrl(struct tc_data *tc) in tc_srcctrl() argument
387 if (tc->link.scrambler_dis) in tc_srcctrl()
389 if (tc->link.coding8b10b) in tc_srcctrl()
392 if (tc->link.spread) in tc_srcctrl()
394 if (tc->link.base.num_lanes == 2) in tc_srcctrl()
396 if (tc->link.base.rate != 162000) in tc_srcctrl()
401 static void tc_wait_pll_lock(struct tc_data *tc) in tc_wait_pll_lock() argument
407 static int tc_pxl_pll_en(struct tc_data *tc, u32 refclk, u32 pixelclock) in tc_pxl_pll_en() argument
419 dev_dbg(tc->dev, "PLL: requested %d pixelclock, ref %d\n", pixelclock, in tc_pxl_pll_en()
467 dev_err(tc->dev, "Failed to calc clock for %d pixelclock\n", in tc_pxl_pll_en()
472 dev_dbg(tc->dev, "PLL: got %d, delta %d\n", best_pixelclock, in tc_pxl_pll_en()
474 dev_dbg(tc->dev, "PLL: %d / %d / %d * %d / %d\n", refclk, in tc_pxl_pll_en()
500 tc_wait_pll_lock(tc); in tc_pxl_pll_en()
507 static int tc_pxl_pll_dis(struct tc_data *tc) in tc_pxl_pll_dis() argument
510 return regmap_write(tc->regmap, PXL_PLLCTRL, PLLBYP); in tc_pxl_pll_dis()
513 static int tc_stream_clock_calc(struct tc_data *tc) in tc_stream_clock_calc() argument
538 static int tc_aux_link_setup(struct tc_data *tc) in tc_aux_link_setup() argument
544 rate = clk_get_rate(tc->refclk); in tc_aux_link_setup()
559 dev_err(tc->dev, "Invalid refclk rate: %lu Hz\n", rate); in tc_aux_link_setup()
574 tc_wait_pll_lock(tc); in tc_aux_link_setup()
577 tc_wait_pll_lock(tc); in tc_aux_link_setup()
579 ret = tc_poll_timeout(tc->regmap, DP_PHY_CTRL, PHY_RDY, PHY_RDY, 1, in tc_aux_link_setup()
582 dev_err(tc->dev, "Timeout waiting for PHY to become ready"); in tc_aux_link_setup()
594 dev_err(tc->dev, "tc_aux_link_setup failed: %d\n", ret); in tc_aux_link_setup()
598 static int tc_get_display_props(struct tc_data *tc) in tc_get_display_props() argument
605 ret = drm_dp_link_probe(&tc->aux, &tc->link.base); in tc_get_display_props()
608 if (tc->link.base.rate != 162000 && tc->link.base.rate != 270000) { in tc_get_display_props()
609 dev_dbg(tc->dev, "Falling to 2.7 Gbps rate\n"); in tc_get_display_props()
610 tc->link.base.rate = 270000; in tc_get_display_props()
613 if (tc->link.base.num_lanes > 2) { in tc_get_display_props()
614 dev_dbg(tc->dev, "Falling to 2 lanes\n"); in tc_get_display_props()
615 tc->link.base.num_lanes = 2; in tc_get_display_props()
618 ret = drm_dp_dpcd_readb(&tc->aux, DP_MAX_DOWNSPREAD, tmp); in tc_get_display_props()
621 tc->link.spread = tmp[0] & BIT(0); /* 0.5% down spread */ in tc_get_display_props()
623 ret = drm_dp_dpcd_readb(&tc->aux, DP_MAIN_LINK_CHANNEL_CODING, tmp); in tc_get_display_props()
626 tc->link.coding8b10b = tmp[0] & BIT(0); in tc_get_display_props()
627 tc->link.scrambler_dis = 0; in tc_get_display_props()
629 ret = drm_dp_dpcd_readb(&tc->aux, DP_EDP_CONFIGURATION_SET, tmp); in tc_get_display_props()
632 tc->link.assr = tmp[0] & DP_ALTERNATE_SCRAMBLER_RESET_ENABLE; in tc_get_display_props()
634 dev_dbg(tc->dev, "DPCD rev: %d.%d, rate: %s, lanes: %d, framing: %s\n", in tc_get_display_props()
635 tc->link.base.revision >> 4, tc->link.base.revision & 0x0f, in tc_get_display_props()
636 (tc->link.base.rate == 162000) ? "1.62Gbps" : "2.7Gbps", in tc_get_display_props()
637 tc->link.base.num_lanes, in tc_get_display_props()
638 (tc->link.base.capabilities & DP_LINK_CAP_ENHANCED_FRAMING) ? in tc_get_display_props()
640 dev_dbg(tc->dev, "ANSI 8B/10B: %d\n", tc->link.coding8b10b); in tc_get_display_props()
641 dev_dbg(tc->dev, "Display ASSR: %d, TC358767 ASSR: %d\n", in tc_get_display_props()
642 tc->link.assr, tc->assr); in tc_get_display_props()
647 dev_err(tc->dev, "failed to read DPCD: %d\n", ret); in tc_get_display_props()
651 static int tc_set_video_mode(struct tc_data *tc, struct drm_display_mode *mode) in tc_set_video_mode() argument
672 dev_dbg(tc->dev, "set mode %dx%d\n", in tc_set_video_mode()
674 dev_dbg(tc->dev, "H margin %d,%d sync %d\n", in tc_set_video_mode()
676 dev_dbg(tc->dev, "V margin %d,%d sync %d\n", in tc_set_video_mode()
678 dev_dbg(tc->dev, "total: %dx%d\n", mode->htotal, mode->vtotal); in tc_set_video_mode()
735 static int tc_link_training(struct tc_data *tc, int pattern) in tc_link_training() argument
738 u32 srcctrl = tc_srcctrl(tc) | DP0_SRCCTRL_SCRMBLDIS | in tc_link_training()
776 dev_err(tc->dev, "Link training timeout!\n"); in tc_link_training()
781 dev_dbg(tc->dev, in tc_link_training()
791 if ((tc->link.base.num_lanes == 2) && in tc_link_training()
797 if ((tc->link.base.num_lanes == 1) && in tc_link_training()
808 dev_err(tc->dev, "Failed to finish training phase %d\n", in tc_link_training()
817 static int tc_main_link_setup(struct tc_data *tc) in tc_main_link_setup() argument
819 struct drm_dp_aux *aux = &tc->aux; in tc_main_link_setup()
820 struct device *dev = tc->dev; in tc_main_link_setup()
829 if (!tc->mode) in tc_main_link_setup()
839 rate = clk_get_rate(tc->refclk); in tc_main_link_setup()
865 tc_wait_pll_lock(tc); in tc_main_link_setup()
868 tc_wait_pll_lock(tc); in tc_main_link_setup()
872 ret = tc_pxl_pll_en(tc, clk_get_rate(tc->refclk), in tc_main_link_setup()
873 1000 * tc->mode->clock); in tc_main_link_setup()
897 ret = regmap_update_bits(tc->regmap, DP0_MISC, BPC_8, BPC_8); in tc_main_link_setup()
908 if (tc->assr != tc->link.assr) { in tc_main_link_setup()
910 tc->assr); in tc_main_link_setup()
912 tmp[0] = tc->assr; in tc_main_link_setup()
921 if (tmp[0] != tc->assr) { in tc_main_link_setup()
923 tc->assr); in tc_main_link_setup()
925 tc->link.scrambler_dis = 1; in tc_main_link_setup()
930 ret = drm_dp_link_configure(aux, &tc->link.base); in tc_main_link_setup()
935 tmp[0] = tc->link.spread ? DP_SPREAD_AMP_0_5 : 0x00; in tc_main_link_setup()
937 tmp[1] = tc->link.coding8b10b ? DP_SET_ANSI_8B10B : 0x00; in tc_main_link_setup()
942 ret = tc_link_training(tc, DP_TRAINING_PATTERN_1); in tc_main_link_setup()
946 ret = tc_link_training(tc, DP_TRAINING_PATTERN_2); in tc_main_link_setup()
952 tmp[0] = tc->link.scrambler_dis ? DP_LINK_SCRAMBLING_DISABLE : 0x00; in tc_main_link_setup()
958 tc_write(DP0_SRCCTRL, tc_srcctrl(tc) | DP0_SRCCTRL_AUTOCORRECT); in tc_main_link_setup()
969 !(drm_dp_channel_eq_ok(tmp + 2, tc->link.base.num_lanes))); in tc_main_link_setup()
990 ret = tc_set_video_mode(tc, tc->mode); in tc_main_link_setup()
995 ret = tc_stream_clock_calc(tc); in tc_main_link_setup()
1001 dev_err(tc->dev, "Failed to read DPCD: %d\n", ret); in tc_main_link_setup()
1004 dev_err(tc->dev, "Failed to write DPCD: %d\n", ret); in tc_main_link_setup()
1009 static int tc_main_link_stream(struct tc_data *tc, int state) in tc_main_link_stream() argument
1014 dev_dbg(tc->dev, "stream: %d\n", state); in tc_main_link_stream()
1018 if (tc->link.base.capabilities & DP_LINK_CAP_ENHANCED_FRAMING) in tc_main_link_stream()
1049 struct tc_data *tc = bridge_to_tc(bridge); in tc_bridge_pre_enable() local
1051 drm_panel_prepare(tc->panel); in tc_bridge_pre_enable()
1056 struct tc_data *tc = bridge_to_tc(bridge); in tc_bridge_enable() local
1059 ret = tc_main_link_setup(tc); in tc_bridge_enable()
1061 dev_err(tc->dev, "main link setup error: %d\n", ret); in tc_bridge_enable()
1065 ret = tc_main_link_stream(tc, 1); in tc_bridge_enable()
1067 dev_err(tc->dev, "main link stream start error: %d\n", ret); in tc_bridge_enable()
1071 drm_panel_enable(tc->panel); in tc_bridge_enable()
1076 struct tc_data *tc = bridge_to_tc(bridge); in tc_bridge_disable() local
1079 drm_panel_disable(tc->panel); in tc_bridge_disable()
1081 ret = tc_main_link_stream(tc, 0); in tc_bridge_disable()
1083 dev_err(tc->dev, "main link stream stop error: %d\n", ret); in tc_bridge_disable()
1088 struct tc_data *tc = bridge_to_tc(bridge); in tc_bridge_post_disable() local
1090 drm_panel_unprepare(tc->panel); in tc_bridge_post_disable()
1119 struct tc_data *tc = bridge_to_tc(bridge); in tc_bridge_mode_set() local
1121 tc->mode = mode; in tc_bridge_mode_set()
1126 struct tc_data *tc = connector_to_tc(connector); in tc_connector_get_modes() local
1130 if (tc->panel && tc->panel->funcs && tc->panel->funcs->get_modes) { in tc_connector_get_modes()
1131 count = tc->panel->funcs->get_modes(tc->panel); in tc_connector_get_modes()
1136 edid = drm_get_edid(connector, &tc->aux.ddc); in tc_connector_get_modes()
1138 kfree(tc->edid); in tc_connector_get_modes()
1139 tc->edid = edid; in tc_connector_get_modes()
1149 static void tc_connector_set_polling(struct tc_data *tc, in tc_connector_set_polling() argument
1160 struct tc_data *tc = connector_to_tc(connector); in tc_connector_best_encoder() local
1162 return tc->bridge.encoder; in tc_connector_best_encoder()
1182 struct tc_data *tc = bridge_to_tc(bridge); in tc_bridge_attach() local
1187 drm_connector_helper_add(&tc->connector, &tc_connector_helper_funcs); in tc_bridge_attach()
1188 ret = drm_connector_init(drm, &tc->connector, &tc_connector_funcs, in tc_bridge_attach()
1193 if (tc->panel) in tc_bridge_attach()
1194 drm_panel_attach(tc->panel, &tc->connector); in tc_bridge_attach()
1196 drm_display_info_set_bus_formats(&tc->connector.display_info, in tc_bridge_attach()
1198 drm_connector_attach_encoder(&tc->connector, tc->bridge.encoder); in tc_bridge_attach()
1255 struct tc_data *tc; in tc_probe() local
1258 tc = devm_kzalloc(dev, sizeof(*tc), GFP_KERNEL); in tc_probe()
1259 if (!tc) in tc_probe()
1262 tc->dev = dev; in tc_probe()
1265 ret = drm_of_find_panel_or_bridge(dev->of_node, 2, 0, &tc->panel, NULL); in tc_probe()
1270 tc->sd_gpio = devm_gpiod_get_optional(dev, "shutdown", GPIOD_OUT_HIGH); in tc_probe()
1271 if (IS_ERR(tc->sd_gpio)) in tc_probe()
1272 return PTR_ERR(tc->sd_gpio); in tc_probe()
1274 if (tc->sd_gpio) { in tc_probe()
1275 gpiod_set_value_cansleep(tc->sd_gpio, 0); in tc_probe()
1280 tc->reset_gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); in tc_probe()
1281 if (IS_ERR(tc->reset_gpio)) in tc_probe()
1282 return PTR_ERR(tc->reset_gpio); in tc_probe()
1284 if (tc->reset_gpio) { in tc_probe()
1285 gpiod_set_value_cansleep(tc->reset_gpio, 1); in tc_probe()
1289 tc->refclk = devm_clk_get(dev, "ref"); in tc_probe()
1290 if (IS_ERR(tc->refclk)) { in tc_probe()
1291 ret = PTR_ERR(tc->refclk); in tc_probe()
1296 tc->regmap = devm_regmap_init_i2c(client, &tc_regmap_config); in tc_probe()
1297 if (IS_ERR(tc->regmap)) { in tc_probe()
1298 ret = PTR_ERR(tc->regmap); in tc_probe()
1303 ret = regmap_read(tc->regmap, TC_IDREG, &tc->rev); in tc_probe()
1305 dev_err(tc->dev, "can not read device ID: %d\n", ret); in tc_probe()
1309 if ((tc->rev != 0x6601) && (tc->rev != 0x6603)) { in tc_probe()
1310 dev_err(tc->dev, "invalid device ID: 0x%08x\n", tc->rev); in tc_probe()
1314 tc->assr = (tc->rev == 0x6601); /* Enable ASSR for eDP panels */ in tc_probe()
1316 ret = tc_aux_link_setup(tc); in tc_probe()
1321 tc->aux.name = "TC358767 AUX i2c adapter"; in tc_probe()
1322 tc->aux.dev = tc->dev; in tc_probe()
1323 tc->aux.transfer = tc_aux_transfer; in tc_probe()
1324 ret = drm_dp_aux_register(&tc->aux); in tc_probe()
1328 ret = tc_get_display_props(tc); in tc_probe()
1332 tc_connector_set_polling(tc, &tc->connector); in tc_probe()
1334 tc->bridge.funcs = &tc_bridge_funcs; in tc_probe()
1335 tc->bridge.of_node = dev->of_node; in tc_probe()
1336 drm_bridge_add(&tc->bridge); in tc_probe()
1338 i2c_set_clientdata(client, tc); in tc_probe()
1342 drm_dp_aux_unregister(&tc->aux); in tc_probe()
1348 struct tc_data *tc = i2c_get_clientdata(client); in tc_remove() local
1350 drm_bridge_remove(&tc->bridge); in tc_remove()
1351 drm_dp_aux_unregister(&tc->aux); in tc_remove()
1353 tc_pxl_pll_dis(tc); in tc_remove()