Lines Matching refs:aux

61 	struct drm_dp_aux *aux;  member
229 static int __8b10b_clock_recovery_delay_us(const struct drm_dp_aux *aux, u8 rd_interval) in __8b10b_clock_recovery_delay_us() argument
232 drm_dbg_kms(aux->drm_dev, "%s: invalid AUX interval 0x%02x (max 4)\n", in __8b10b_clock_recovery_delay_us()
233 aux->name, rd_interval); in __8b10b_clock_recovery_delay_us()
241 static int __8b10b_channel_eq_delay_us(const struct drm_dp_aux *aux, u8 rd_interval) in __8b10b_channel_eq_delay_us() argument
244 drm_dbg_kms(aux->drm_dev, "%s: invalid AUX interval 0x%02x (max 4)\n", in __8b10b_channel_eq_delay_us()
245 aux->name, rd_interval); in __8b10b_channel_eq_delay_us()
253 static int __128b132b_channel_eq_delay_us(const struct drm_dp_aux *aux, u8 rd_interval) in __128b132b_channel_eq_delay_us() argument
257 drm_dbg_kms(aux->drm_dev, "%s: invalid AUX interval 0x%02x\n", in __128b132b_channel_eq_delay_us()
258 aux->name, rd_interval); in __128b132b_channel_eq_delay_us()
287 static int __read_delay(struct drm_dp_aux *aux, const u8 dpcd[DP_RECEIVER_CAP_SIZE], in __read_delay() argument
290 int (*parse)(const struct drm_dp_aux *aux, u8 rd_interval); in __read_delay()
331 if (drm_dp_dpcd_read_byte(aux, offset, &rd_interval) < 0) { in __read_delay()
332 drm_dbg_kms(aux->drm_dev, "%s: failed rd interval read\n", in __read_delay()
333 aux->name); in __read_delay()
339 return parse(aux, rd_interval & mask); in __read_delay()
342 int drm_dp_read_clock_recovery_delay(struct drm_dp_aux *aux, const u8 dpcd[DP_RECEIVER_CAP_SIZE], in drm_dp_read_clock_recovery_delay() argument
345 return __read_delay(aux, dpcd, dp_phy, uhbr, true); in drm_dp_read_clock_recovery_delay()
349 int drm_dp_read_channel_eq_delay(struct drm_dp_aux *aux, const u8 dpcd[DP_RECEIVER_CAP_SIZE], in drm_dp_read_channel_eq_delay() argument
352 return __read_delay(aux, dpcd, dp_phy, uhbr, false); in drm_dp_read_channel_eq_delay()
357 int drm_dp_128b132b_read_aux_rd_interval(struct drm_dp_aux *aux) in drm_dp_128b132b_read_aux_rd_interval() argument
362 if (drm_dp_dpcd_read_byte(aux, DP_128B132B_TRAINING_AUX_RD_INTERVAL, &val) < 0) { in drm_dp_128b132b_read_aux_rd_interval()
363 drm_err(aux->drm_dev, "%s: failed rd interval read\n", in drm_dp_128b132b_read_aux_rd_interval()
364 aux->name); in drm_dp_128b132b_read_aux_rd_interval()
376 void drm_dp_link_train_clock_recovery_delay(const struct drm_dp_aux *aux, in drm_dp_link_train_clock_recovery_delay() argument
386 delay_us = __8b10b_clock_recovery_delay_us(aux, rd_interval); in drm_dp_link_train_clock_recovery_delay()
392 static void __drm_dp_link_train_channel_eq_delay(const struct drm_dp_aux *aux, in __drm_dp_link_train_channel_eq_delay() argument
395 int delay_us = __8b10b_channel_eq_delay_us(aux, rd_interval); in __drm_dp_link_train_channel_eq_delay()
400 void drm_dp_link_train_channel_eq_delay(const struct drm_dp_aux *aux, in drm_dp_link_train_channel_eq_delay() argument
403 __drm_dp_link_train_channel_eq_delay(aux, in drm_dp_link_train_channel_eq_delay()
452 void drm_dp_lttpr_link_train_channel_eq_delay(const struct drm_dp_aux *aux, in drm_dp_lttpr_link_train_channel_eq_delay() argument
459 __drm_dp_link_train_channel_eq_delay(aux, interval); in drm_dp_lttpr_link_train_channel_eq_delay()
474 void drm_dp_lttpr_wake_timeout_setup(struct drm_dp_aux *aux, bool transparent_mode) in drm_dp_lttpr_wake_timeout_setup() argument
489 ret = drm_dp_dpcd_readb(aux, DP_EXTENDED_DPRX_SLEEP_WAKE_TIMEOUT_REQUEST, &val); in drm_dp_lttpr_wake_timeout_setup()
491 drm_dbg_kms(aux->drm_dev, in drm_dp_lttpr_wake_timeout_setup()
500 drm_dp_dpcd_writeb(aux, in drm_dp_lttpr_wake_timeout_setup()
504 ret = drm_dp_dpcd_readb(aux, DP_PHY_REPEATER_EXTENDED_WAIT_TIMEOUT, &val); in drm_dp_lttpr_wake_timeout_setup()
506 drm_dbg_kms(aux->drm_dev, in drm_dp_lttpr_wake_timeout_setup()
515 drm_dp_dpcd_writeb(aux, DP_PHY_REPEATER_EXTENDED_WAIT_TIMEOUT, in drm_dp_lttpr_wake_timeout_setup()
556 drm_dp_dump_access(const struct drm_dp_aux *aux, in drm_dp_dump_access() argument
562 drm_dbg_dp(aux->drm_dev, "%s: 0x%05x AUX %s (ret=%3d) %*ph\n", in drm_dp_dump_access()
563 aux->name, offset, arrow, ret, min(ret, 20), buffer); in drm_dp_dump_access()
565 drm_dbg_dp(aux->drm_dev, "%s: 0x%05x AUX %s (ret=%3d)\n", in drm_dp_dump_access()
566 aux->name, offset, arrow, ret); in drm_dp_dump_access()
581 static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request, in drm_dp_dpcd_access() argument
594 mutex_lock(&aux->hw_mutex); in drm_dp_dpcd_access()
600 if (aux->powered_down) { in drm_dp_dpcd_access()
617 ret = aux->transfer(aux, &msg); in drm_dp_dpcd_access()
638 drm_dbg_kms(aux->drm_dev, "%s: Too many retries, giving up. First error: %d\n", in drm_dp_dpcd_access()
639 aux->name, err); in drm_dp_dpcd_access()
643 mutex_unlock(&aux->hw_mutex); in drm_dp_dpcd_access()
658 int drm_dp_dpcd_probe(struct drm_dp_aux *aux, unsigned int offset) in drm_dp_dpcd_probe() argument
663 ret = drm_dp_dpcd_access(aux, DP_AUX_NATIVE_READ, offset, &buffer, 1); in drm_dp_dpcd_probe()
666 drm_dp_dump_access(aux, DP_AUX_NATIVE_READ, offset, &buffer, ret); in drm_dp_dpcd_probe()
684 void drm_dp_dpcd_set_powered(struct drm_dp_aux *aux, bool powered) in drm_dp_dpcd_set_powered() argument
686 if (!aux) in drm_dp_dpcd_set_powered()
689 mutex_lock(&aux->hw_mutex); in drm_dp_dpcd_set_powered()
690 aux->powered_down = !powered; in drm_dp_dpcd_set_powered()
691 mutex_unlock(&aux->hw_mutex); in drm_dp_dpcd_set_powered()
700 void drm_dp_dpcd_set_probe(struct drm_dp_aux *aux, bool enable) in drm_dp_dpcd_set_probe() argument
702 WRITE_ONCE(aux->dpcd_probe_disabled, !enable); in drm_dp_dpcd_set_probe()
706 static bool dpcd_access_needs_probe(struct drm_dp_aux *aux) in dpcd_access_needs_probe() argument
720 return !aux->is_remote && !READ_ONCE(aux->dpcd_probe_disabled); in dpcd_access_needs_probe()
739 ssize_t drm_dp_dpcd_read(struct drm_dp_aux *aux, unsigned int offset, in drm_dp_dpcd_read() argument
744 if (dpcd_access_needs_probe(aux)) { in drm_dp_dpcd_read()
745 ret = drm_dp_dpcd_probe(aux, DP_TRAINING_PATTERN_SET); in drm_dp_dpcd_read()
750 if (aux->is_remote) in drm_dp_dpcd_read()
751 ret = drm_dp_mst_dpcd_read(aux, offset, buffer, size); in drm_dp_dpcd_read()
753 ret = drm_dp_dpcd_access(aux, DP_AUX_NATIVE_READ, offset, in drm_dp_dpcd_read()
756 drm_dp_dump_access(aux, DP_AUX_NATIVE_READ, offset, buffer, ret); in drm_dp_dpcd_read()
777 ssize_t drm_dp_dpcd_write(struct drm_dp_aux *aux, unsigned int offset, in drm_dp_dpcd_write() argument
782 if (aux->is_remote) in drm_dp_dpcd_write()
783 ret = drm_dp_mst_dpcd_write(aux, offset, buffer, size); in drm_dp_dpcd_write()
785 ret = drm_dp_dpcd_access(aux, DP_AUX_NATIVE_WRITE, offset, in drm_dp_dpcd_write()
788 drm_dp_dump_access(aux, DP_AUX_NATIVE_WRITE, offset, buffer, ret); in drm_dp_dpcd_write()
800 int drm_dp_dpcd_read_link_status(struct drm_dp_aux *aux, in drm_dp_dpcd_read_link_status() argument
803 return drm_dp_dpcd_read_data(aux, DP_LANE0_1_STATUS, status, in drm_dp_dpcd_read_link_status()
821 int drm_dp_dpcd_read_phy_link_status(struct drm_dp_aux *aux, in drm_dp_dpcd_read_phy_link_status() argument
828 return drm_dp_dpcd_read_data(aux, in drm_dp_dpcd_read_phy_link_status()
833 ret = drm_dp_dpcd_read_data(aux, in drm_dp_dpcd_read_phy_link_status()
858 int drm_dp_link_power_up(struct drm_dp_aux *aux, unsigned char revision) in drm_dp_link_power_up() argument
867 err = drm_dp_dpcd_readb(aux, DP_SET_POWER, &value); in drm_dp_link_power_up()
874 err = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value); in drm_dp_link_power_up()
896 int drm_dp_link_power_down(struct drm_dp_aux *aux, unsigned char revision) in drm_dp_link_power_down() argument
905 err = drm_dp_dpcd_readb(aux, DP_SET_POWER, &value); in drm_dp_link_power_down()
912 err = drm_dp_dpcd_writeb(aux, DP_SET_POWER, value); in drm_dp_link_power_down()
920 static int read_payload_update_status(struct drm_dp_aux *aux) in read_payload_update_status() argument
925 ret = drm_dp_dpcd_read_byte(aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status); in read_payload_update_status()
945 int drm_dp_dpcd_write_payload(struct drm_dp_aux *aux, in drm_dp_dpcd_write_payload() argument
952 drm_dp_dpcd_write_byte(aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, in drm_dp_dpcd_write_payload()
959 ret = drm_dp_dpcd_write_data(aux, DP_PAYLOAD_ALLOCATE_SET, payload_alloc, 3); in drm_dp_dpcd_write_payload()
961 drm_dbg_kms(aux->drm_dev, "failed to write payload allocation %d\n", ret); in drm_dp_dpcd_write_payload()
966 ret = drm_dp_dpcd_read_byte(aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status); in drm_dp_dpcd_write_payload()
968 drm_dbg_kms(aux->drm_dev, "failed to read payload table status %d\n", ret); in drm_dp_dpcd_write_payload()
978 drm_dbg_kms(aux->drm_dev, "status not set after read payload table status %d\n", in drm_dp_dpcd_write_payload()
997 int drm_dp_dpcd_clear_payload(struct drm_dp_aux *aux) in drm_dp_dpcd_clear_payload() argument
999 return drm_dp_dpcd_write_payload(aux, 0, 0, 0x3f); in drm_dp_dpcd_clear_payload()
1015 int drm_dp_dpcd_poll_act_handled(struct drm_dp_aux *aux, int timeout_ms) in drm_dp_dpcd_poll_act_handled() argument
1022 ret = readx_poll_timeout(read_payload_update_status, aux, status, in drm_dp_dpcd_poll_act_handled()
1026 drm_err(aux->drm_dev, "Failed to get ACT after %d ms, last status: %02x\n", in drm_dp_dpcd_poll_act_handled()
1034 drm_dbg_kms(aux->drm_dev, "Failed to read payload table status: %d\n", status); in drm_dp_dpcd_poll_act_handled()
1117 bool drm_dp_send_real_edid_checksum(struct drm_dp_aux *aux, in drm_dp_send_real_edid_checksum() argument
1122 if (drm_dp_dpcd_read_byte(aux, DP_DEVICE_SERVICE_IRQ_VECTOR, in drm_dp_send_real_edid_checksum()
1124 drm_err(aux->drm_dev, "%s: DPCD failed read at register 0x%x\n", in drm_dp_send_real_edid_checksum()
1125 aux->name, DP_DEVICE_SERVICE_IRQ_VECTOR); in drm_dp_send_real_edid_checksum()
1130 if (drm_dp_dpcd_read_byte(aux, DP_TEST_REQUEST, &link_edid_read) < 0) { in drm_dp_send_real_edid_checksum()
1131 drm_err(aux->drm_dev, "%s: DPCD failed read at register 0x%x\n", in drm_dp_send_real_edid_checksum()
1132 aux->name, DP_TEST_REQUEST); in drm_dp_send_real_edid_checksum()
1138 drm_dbg_kms(aux->drm_dev, "%s: Source DUT does not support TEST_EDID_READ\n", in drm_dp_send_real_edid_checksum()
1139 aux->name); in drm_dp_send_real_edid_checksum()
1143 if (drm_dp_dpcd_write_byte(aux, DP_DEVICE_SERVICE_IRQ_VECTOR, in drm_dp_send_real_edid_checksum()
1145 drm_err(aux->drm_dev, "%s: DPCD failed write at register 0x%x\n", in drm_dp_send_real_edid_checksum()
1146 aux->name, DP_DEVICE_SERVICE_IRQ_VECTOR); in drm_dp_send_real_edid_checksum()
1151 if (drm_dp_dpcd_write_byte(aux, DP_TEST_EDID_CHECKSUM, in drm_dp_send_real_edid_checksum()
1153 drm_err(aux->drm_dev, "%s: DPCD failed write at register 0x%x\n", in drm_dp_send_real_edid_checksum()
1154 aux->name, DP_TEST_EDID_CHECKSUM); in drm_dp_send_real_edid_checksum()
1159 if (drm_dp_dpcd_write_byte(aux, DP_TEST_RESPONSE, test_resp) < 0) { in drm_dp_send_real_edid_checksum()
1160 drm_err(aux->drm_dev, "%s: DPCD failed write at register 0x%x\n", in drm_dp_send_real_edid_checksum()
1161 aux->name, DP_TEST_RESPONSE); in drm_dp_send_real_edid_checksum()
1179 static int drm_dp_read_extended_dpcd_caps(struct drm_dp_aux *aux, in drm_dp_read_extended_dpcd_caps() argument
1196 ret = drm_dp_dpcd_read_data(aux, DP_DP13_DPCD_REV, &dpcd_ext, in drm_dp_read_extended_dpcd_caps()
1202 drm_dbg_kms(aux->drm_dev, in drm_dp_read_extended_dpcd_caps()
1204 aux->name, dpcd[DP_DPCD_REV], dpcd_ext[DP_DPCD_REV]); in drm_dp_read_extended_dpcd_caps()
1211 drm_dbg_kms(aux->drm_dev, "%s: Base DPCD: %*ph\n", aux->name, DP_RECEIVER_CAP_SIZE, dpcd); in drm_dp_read_extended_dpcd_caps()
1231 int drm_dp_read_dpcd_caps(struct drm_dp_aux *aux, in drm_dp_read_dpcd_caps() argument
1236 ret = drm_dp_dpcd_read_data(aux, DP_DPCD_REV, dpcd, DP_RECEIVER_CAP_SIZE); in drm_dp_read_dpcd_caps()
1242 ret = drm_dp_read_extended_dpcd_caps(aux, dpcd); in drm_dp_read_dpcd_caps()
1246 drm_dbg_kms(aux->drm_dev, "%s: DPCD: %*ph\n", aux->name, DP_RECEIVER_CAP_SIZE, dpcd); in drm_dp_read_dpcd_caps()
1265 int drm_dp_read_downstream_info(struct drm_dp_aux *aux, in drm_dp_read_downstream_info() argument
1289 ret = drm_dp_dpcd_read_data(aux, DP_DOWNSTREAM_PORT_0, downstream_ports, len); in drm_dp_read_downstream_info()
1293 drm_dbg_kms(aux->drm_dev, "%s: DPCD DFP: %*ph\n", aux->name, len, downstream_ports); in drm_dp_read_downstream_info()
1646 int drm_dp_downstream_id(struct drm_dp_aux *aux, char id[6]) in drm_dp_downstream_id() argument
1648 return drm_dp_dpcd_read_data(aux, DP_BRANCH_ID, id, 6); in drm_dp_downstream_id()
1665 struct drm_dp_aux *aux) in drm_dp_downstream_debug() argument
1710 drm_dp_downstream_id(aux, id); in drm_dp_downstream_debug()
1713 len = drm_dp_dpcd_read_data(aux, DP_BRANCH_HW_REV, &rev[0], 1); in drm_dp_downstream_debug()
1718 len = drm_dp_dpcd_read_data(aux, DP_BRANCH_SW_REV, rev, 2); in drm_dp_downstream_debug()
1852 int drm_dp_read_sink_count(struct drm_dp_aux *aux) in drm_dp_read_sink_count() argument
1857 ret = drm_dp_dpcd_read_byte(aux, DP_SINK_COUNT, &count); in drm_dp_read_sink_count()
1982 static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg) in drm_dp_i2c_do_msg() argument
1996 ret = aux->transfer(aux, msg); in drm_dp_i2c_do_msg()
2008 drm_dbg_kms_ratelimited(aux->drm_dev, "%s: transaction timed out\n", in drm_dp_i2c_do_msg()
2009 aux->name); in drm_dp_i2c_do_msg()
2011 drm_dbg_kms(aux->drm_dev, "%s: transaction failed: %d\n", in drm_dp_i2c_do_msg()
2012 aux->name, ret); in drm_dp_i2c_do_msg()
2026 drm_dbg_kms(aux->drm_dev, "%s: native nack (result=%d, size=%zu)\n", in drm_dp_i2c_do_msg()
2027 aux->name, ret, msg->size); in drm_dp_i2c_do_msg()
2031 drm_dbg_kms(aux->drm_dev, "%s: native defer\n", aux->name); in drm_dp_i2c_do_msg()
2045 drm_err(aux->drm_dev, "%s: invalid native reply %#04x\n", in drm_dp_i2c_do_msg()
2046 aux->name, msg->reply); in drm_dp_i2c_do_msg()
2061 drm_dbg_kms(aux->drm_dev, "%s: I2C nack (result=%d, size=%zu)\n", in drm_dp_i2c_do_msg()
2062 aux->name, ret, msg->size); in drm_dp_i2c_do_msg()
2063 aux->i2c_nack_count++; in drm_dp_i2c_do_msg()
2067 drm_dbg_kms(aux->drm_dev, "%s: I2C defer\n", aux->name); in drm_dp_i2c_do_msg()
2072 aux->i2c_defer_count++; in drm_dp_i2c_do_msg()
2081 drm_err(aux->drm_dev, "%s: invalid I2C reply %#04x\n", in drm_dp_i2c_do_msg()
2082 aux->name, msg->reply); in drm_dp_i2c_do_msg()
2087 drm_dbg_kms(aux->drm_dev, "%s: Too many retries, giving up\n", aux->name); in drm_dp_i2c_do_msg()
2105 static int drm_dp_i2c_drain_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *orig_msg) in drm_dp_i2c_drain_msg() argument
2111 err = drm_dp_i2c_do_msg(aux, &msg); in drm_dp_i2c_drain_msg()
2116 drm_dbg_kms(aux->drm_dev, in drm_dp_i2c_drain_msg()
2118 aux->name, msg.size, err); in drm_dp_i2c_drain_msg()
2142 struct drm_dp_aux *aux = adapter->algo_data; in drm_dp_i2c_xfer() local
2148 if (aux->powered_down) in drm_dp_i2c_xfer()
2158 if (!aux->no_zero_sized) { in drm_dp_i2c_xfer()
2166 err = drm_dp_i2c_do_msg(aux, &msg); in drm_dp_i2c_xfer()
2186 if (j + msg.size == msgs[i].len && aux->no_zero_sized) in drm_dp_i2c_xfer()
2188 err = drm_dp_i2c_drain_msg(aux, &msg); in drm_dp_i2c_xfer()
2206 if (!aux->no_zero_sized) { in drm_dp_i2c_xfer()
2214 (void)drm_dp_i2c_do_msg(aux, &msg); in drm_dp_i2c_xfer()
2250 static int drm_dp_aux_get_crc(struct drm_dp_aux *aux, u8 *crc) in drm_dp_aux_get_crc() argument
2255 ret = drm_dp_dpcd_read_byte(aux, DP_TEST_SINK, &buf); in drm_dp_aux_get_crc()
2261 ret = drm_dp_dpcd_read_byte(aux, DP_TEST_SINK_MISC, &buf); in drm_dp_aux_get_crc()
2266 if (count == aux->crc_count) in drm_dp_aux_get_crc()
2269 aux->crc_count = count; in drm_dp_aux_get_crc()
2275 return drm_dp_dpcd_read_data(aux, DP_TEST_CRC_R_CR, crc, 6); in drm_dp_aux_get_crc()
2280 struct drm_dp_aux *aux = container_of(work, struct drm_dp_aux, in drm_dp_aux_crc_work() local
2287 if (WARN_ON(!aux->crtc)) in drm_dp_aux_crc_work()
2290 crtc = aux->crtc; in drm_dp_aux_crc_work()
2296 ret = drm_dp_aux_get_crc(aux, crc_bytes); in drm_dp_aux_crc_work()
2299 ret = drm_dp_aux_get_crc(aux, crc_bytes); in drm_dp_aux_crc_work()
2303 drm_dbg_kms(aux->drm_dev, "%s: Get CRC failed after retrying: %d\n", in drm_dp_aux_crc_work()
2304 aux->name, ret); in drm_dp_aux_crc_work()
2307 drm_dbg_kms(aux->drm_dev, "%s: Failed to get a CRC: %d\n", aux->name, ret); in drm_dp_aux_crc_work()
2325 void drm_dp_remote_aux_init(struct drm_dp_aux *aux) in drm_dp_remote_aux_init() argument
2327 INIT_WORK(&aux->crc_work, drm_dp_aux_crc_work); in drm_dp_remote_aux_init()
2348 void drm_dp_aux_init(struct drm_dp_aux *aux) in drm_dp_aux_init() argument
2350 mutex_init(&aux->hw_mutex); in drm_dp_aux_init()
2351 mutex_init(&aux->cec.lock); in drm_dp_aux_init()
2352 INIT_WORK(&aux->crc_work, drm_dp_aux_crc_work); in drm_dp_aux_init()
2354 aux->ddc.algo = &drm_dp_i2c_algo; in drm_dp_aux_init()
2355 aux->ddc.algo_data = aux; in drm_dp_aux_init()
2356 aux->ddc.retries = 3; in drm_dp_aux_init()
2358 aux->ddc.lock_ops = &drm_dp_i2c_lock_ops; in drm_dp_aux_init()
2389 int drm_dp_aux_register(struct drm_dp_aux *aux) in drm_dp_aux_register() argument
2393 WARN_ON_ONCE(!aux->drm_dev); in drm_dp_aux_register()
2395 if (!aux->ddc.algo) in drm_dp_aux_register()
2396 drm_dp_aux_init(aux); in drm_dp_aux_register()
2398 aux->ddc.owner = THIS_MODULE; in drm_dp_aux_register()
2399 aux->ddc.dev.parent = aux->dev; in drm_dp_aux_register()
2401 strscpy(aux->ddc.name, aux->name ? aux->name : dev_name(aux->dev), in drm_dp_aux_register()
2402 sizeof(aux->ddc.name)); in drm_dp_aux_register()
2404 ret = drm_dp_aux_register_devnode(aux); in drm_dp_aux_register()
2408 ret = i2c_add_adapter(&aux->ddc); in drm_dp_aux_register()
2410 drm_dp_aux_unregister_devnode(aux); in drm_dp_aux_register()
2422 void drm_dp_aux_unregister(struct drm_dp_aux *aux) in drm_dp_aux_unregister() argument
2424 drm_dp_aux_unregister_devnode(aux); in drm_dp_aux_unregister()
2425 i2c_del_adapter(&aux->ddc); in drm_dp_aux_unregister()
2469 int drm_dp_start_crc(struct drm_dp_aux *aux, struct drm_crtc *crtc) in drm_dp_start_crc() argument
2474 ret = drm_dp_dpcd_read_byte(aux, DP_TEST_SINK, &buf); in drm_dp_start_crc()
2478 ret = drm_dp_dpcd_write_byte(aux, DP_TEST_SINK, buf | DP_TEST_SINK_START); in drm_dp_start_crc()
2482 aux->crc_count = 0; in drm_dp_start_crc()
2483 aux->crtc = crtc; in drm_dp_start_crc()
2484 schedule_work(&aux->crc_work); in drm_dp_start_crc()
2496 int drm_dp_stop_crc(struct drm_dp_aux *aux) in drm_dp_stop_crc() argument
2501 ret = drm_dp_dpcd_read_byte(aux, DP_TEST_SINK, &buf); in drm_dp_stop_crc()
2505 ret = drm_dp_dpcd_write_byte(aux, DP_TEST_SINK, buf & ~DP_TEST_SINK_START); in drm_dp_stop_crc()
2509 flush_work(&aux->crc_work); in drm_dp_stop_crc()
2510 aux->crtc = NULL; in drm_dp_stop_crc()
2588 static int drm_dp_read_ident(struct drm_dp_aux *aux, unsigned int offset, in drm_dp_read_ident() argument
2591 return drm_dp_dpcd_read_data(aux, offset, ident, sizeof(*ident)); in drm_dp_read_ident()
2594 static void drm_dp_dump_desc(struct drm_dp_aux *aux, in drm_dp_dump_desc() argument
2599 drm_dbg_kms(aux->drm_dev, in drm_dp_dump_desc()
2601 aux->name, device_name, in drm_dp_dump_desc()
2620 int drm_dp_read_desc(struct drm_dp_aux *aux, struct drm_dp_desc *desc, in drm_dp_read_desc() argument
2627 ret = drm_dp_read_ident(aux, offset, ident); in drm_dp_read_desc()
2633 drm_dp_dump_desc(aux, is_branch ? "DP branch" : "DP sink", desc); in drm_dp_read_desc()
2649 int drm_dp_dump_lttpr_desc(struct drm_dp_aux *aux, enum drm_dp_phy dp_phy) in drm_dp_dump_lttpr_desc() argument
2654 if (drm_WARN_ON(aux->drm_dev, dp_phy < DP_PHY_LTTPR1 || dp_phy > DP_MAX_LTTPR_COUNT)) in drm_dp_dump_lttpr_desc()
2657 ret = drm_dp_read_ident(aux, DP_OUI_PHY_REPEATER(dp_phy), &desc.ident); in drm_dp_dump_lttpr_desc()
2661 drm_dp_dump_desc(aux, drm_dp_phy_name(dp_phy), &desc); in drm_dp_dump_lttpr_desc()
2835 static int drm_dp_read_lttpr_regs(struct drm_dp_aux *aux, in drm_dp_read_lttpr_regs() argument
2849 ret = drm_dp_dpcd_read_data(aux, in drm_dp_read_lttpr_regs()
2869 int drm_dp_read_lttpr_common_caps(struct drm_dp_aux *aux, in drm_dp_read_lttpr_common_caps() argument
2873 return drm_dp_read_lttpr_regs(aux, dpcd, in drm_dp_read_lttpr_common_caps()
2890 int drm_dp_read_lttpr_phy_caps(struct drm_dp_aux *aux, in drm_dp_read_lttpr_phy_caps() argument
2895 return drm_dp_read_lttpr_regs(aux, dpcd, in drm_dp_read_lttpr_phy_caps()
2955 int drm_dp_lttpr_set_transparent_mode(struct drm_dp_aux *aux, bool enable) in drm_dp_lttpr_set_transparent_mode() argument
2959 int ret = drm_dp_dpcd_writeb(aux, DP_PHY_REPEATER_MODE, val); in drm_dp_lttpr_set_transparent_mode()
2977 int drm_dp_lttpr_init(struct drm_dp_aux *aux, int lttpr_count) in drm_dp_lttpr_init() argument
2989 ret = drm_dp_lttpr_set_transparent_mode(aux, true); in drm_dp_lttpr_init()
2996 if (drm_dp_lttpr_set_transparent_mode(aux, false)) { in drm_dp_lttpr_init()
3001 drm_dp_lttpr_set_transparent_mode(aux, true); in drm_dp_lttpr_init()
3062 int drm_dp_get_phy_test_pattern(struct drm_dp_aux *aux, in drm_dp_get_phy_test_pattern() argument
3068 err = drm_dp_dpcd_read_byte(aux, DP_TEST_LINK_RATE, &rate); in drm_dp_get_phy_test_pattern()
3073 err = drm_dp_dpcd_read_byte(aux, DP_TEST_LANE_COUNT, &lanes); in drm_dp_get_phy_test_pattern()
3081 err = drm_dp_dpcd_read_byte(aux, DP_PHY_TEST_PATTERN, &data->phy_pattern); in drm_dp_get_phy_test_pattern()
3087 err = drm_dp_dpcd_read_data(aux, DP_TEST_80BIT_CUSTOM_PATTERN_7_0, in drm_dp_get_phy_test_pattern()
3094 err = drm_dp_dpcd_read_data(aux, DP_TEST_HBR2_SCRAMBLER_RESET, in drm_dp_get_phy_test_pattern()
3113 int drm_dp_set_phy_test_pattern(struct drm_dp_aux *aux, in drm_dp_set_phy_test_pattern() argument
3123 err = drm_dp_dpcd_write_byte(aux, DP_TRAINING_PATTERN_SET, in drm_dp_set_phy_test_pattern()
3129 err = drm_dp_dpcd_write_byte(aux, in drm_dp_set_phy_test_pattern()
3331 bool drm_dp_as_sdp_supported(struct drm_dp_aux *aux, const u8 dpcd[DP_RECEIVER_CAP_SIZE]) in drm_dp_as_sdp_supported() argument
3338 if (drm_dp_dpcd_read_byte(aux, DP_DPRX_FEATURE_ENUMERATION_LIST_CONT_1, in drm_dp_as_sdp_supported()
3340 drm_dbg_dp(aux->drm_dev, in drm_dp_as_sdp_supported()
3356 bool drm_dp_vsc_sdp_supported(struct drm_dp_aux *aux, const u8 dpcd[DP_RECEIVER_CAP_SIZE]) in drm_dp_vsc_sdp_supported() argument
3363 if (drm_dp_dpcd_read_byte(aux, DP_DPRX_FEATURE_ENUMERATION_LIST, &rx_feature) < 0) { in drm_dp_vsc_sdp_supported()
3364 drm_dbg_dp(aux->drm_dev, "failed to read DP_DPRX_FEATURE_ENUMERATION_LIST\n"); in drm_dp_vsc_sdp_supported()
3492 int drm_dp_pcon_frl_prepare(struct drm_dp_aux *aux, bool enable_frl_ready_hpd) in drm_dp_pcon_frl_prepare() argument
3500 return drm_dp_dpcd_write_byte(aux, DP_PCON_HDMI_LINK_CONFIG_1, buf); in drm_dp_pcon_frl_prepare()
3510 bool drm_dp_pcon_is_frl_ready(struct drm_dp_aux *aux) in drm_dp_pcon_is_frl_ready() argument
3515 ret = drm_dp_dpcd_read_byte(aux, DP_PCON_HDMI_TX_LINK_STATUS, &buf); in drm_dp_pcon_is_frl_ready()
3538 int drm_dp_pcon_frl_configure_1(struct drm_dp_aux *aux, int max_frl_gbps, in drm_dp_pcon_frl_configure_1() argument
3544 ret = drm_dp_dpcd_read_byte(aux, DP_PCON_HDMI_LINK_CONFIG_1, &buf); in drm_dp_pcon_frl_configure_1()
3579 return drm_dp_dpcd_write_byte(aux, DP_PCON_HDMI_LINK_CONFIG_1, buf); in drm_dp_pcon_frl_configure_1()
3594 int drm_dp_pcon_frl_configure_2(struct drm_dp_aux *aux, int max_frl_mask, in drm_dp_pcon_frl_configure_2() argument
3605 return drm_dp_dpcd_write_byte(aux, DP_PCON_HDMI_LINK_CONFIG_2, buf); in drm_dp_pcon_frl_configure_2()
3619 int drm_dp_pcon_reset_frl_config(struct drm_dp_aux *aux) in drm_dp_pcon_reset_frl_config() argument
3621 return drm_dp_dpcd_write_byte(aux, DP_PCON_HDMI_LINK_CONFIG_1, 0x0); in drm_dp_pcon_reset_frl_config()
3631 int drm_dp_pcon_frl_enable(struct drm_dp_aux *aux) in drm_dp_pcon_frl_enable() argument
3636 ret = drm_dp_dpcd_read_byte(aux, DP_PCON_HDMI_LINK_CONFIG_1, &buf); in drm_dp_pcon_frl_enable()
3640 drm_dbg_kms(aux->drm_dev, "%s: PCON in Autonomous mode, can't enable FRL\n", in drm_dp_pcon_frl_enable()
3641 aux->name); in drm_dp_pcon_frl_enable()
3645 return drm_dp_dpcd_write_byte(aux, DP_PCON_HDMI_LINK_CONFIG_1, buf); in drm_dp_pcon_frl_enable()
3655 bool drm_dp_pcon_hdmi_link_active(struct drm_dp_aux *aux) in drm_dp_pcon_hdmi_link_active() argument
3660 ret = drm_dp_dpcd_read_byte(aux, DP_PCON_HDMI_TX_LINK_STATUS, &buf); in drm_dp_pcon_hdmi_link_active()
3679 int drm_dp_pcon_hdmi_link_mode(struct drm_dp_aux *aux, u8 *frl_trained_mask) in drm_dp_pcon_hdmi_link_mode() argument
3685 ret = drm_dp_dpcd_read_byte(aux, DP_PCON_HDMI_POST_FRL_STATUS, &buf); in drm_dp_pcon_hdmi_link_mode()
3706 void drm_dp_pcon_hdmi_frl_link_error_count(struct drm_dp_aux *aux, in drm_dp_pcon_hdmi_frl_link_error_count() argument
3714 if (drm_dp_dpcd_read_byte(aux, DP_PCON_HDMI_ERROR_STATUS_LN0 + i, &buf) < 0) in drm_dp_pcon_hdmi_frl_link_error_count()
3732 drm_err(aux->drm_dev, "%s: More than %d errors since the last read for lane %d", in drm_dp_pcon_hdmi_frl_link_error_count()
3733 aux->name, num_error, i); in drm_dp_pcon_hdmi_frl_link_error_count()
3844 int drm_dp_pcon_configure_dsc_enc(struct drm_dp_aux *aux, u8 pps_buf_config) in drm_dp_pcon_configure_dsc_enc() argument
3849 ret = drm_dp_dpcd_read_byte(aux, DP_PROTOCOL_CONVERTER_CONTROL_2, &buf); in drm_dp_pcon_configure_dsc_enc()
3860 return drm_dp_dpcd_write_byte(aux, DP_PROTOCOL_CONVERTER_CONTROL_2, buf); in drm_dp_pcon_configure_dsc_enc()
3870 int drm_dp_pcon_pps_default(struct drm_dp_aux *aux) in drm_dp_pcon_pps_default() argument
3872 return drm_dp_pcon_configure_dsc_enc(aux, DP_PCON_ENC_PPS_OVERRIDE_DISABLED); in drm_dp_pcon_pps_default()
3884 int drm_dp_pcon_pps_override_buf(struct drm_dp_aux *aux, u8 pps_buf[128]) in drm_dp_pcon_pps_override_buf() argument
3888 ret = drm_dp_dpcd_write_data(aux, DP_PCON_HDMI_PPS_OVERRIDE_BASE, &pps_buf, 128); in drm_dp_pcon_pps_override_buf()
3892 return drm_dp_pcon_configure_dsc_enc(aux, DP_PCON_ENC_PPS_OVERRIDE_EN_BUFFER); in drm_dp_pcon_pps_override_buf()
3905 int drm_dp_pcon_pps_override_param(struct drm_dp_aux *aux, u8 pps_param[6]) in drm_dp_pcon_pps_override_param() argument
3909 ret = drm_dp_dpcd_write_data(aux, DP_PCON_HDMI_PPS_OVRD_SLICE_HEIGHT, &pps_param[0], 2); in drm_dp_pcon_pps_override_param()
3912 ret = drm_dp_dpcd_write_data(aux, DP_PCON_HDMI_PPS_OVRD_SLICE_WIDTH, &pps_param[2], 2); in drm_dp_pcon_pps_override_param()
3915 ret = drm_dp_dpcd_write_data(aux, DP_PCON_HDMI_PPS_OVRD_BPP, &pps_param[4], 2); in drm_dp_pcon_pps_override_param()
3919 return drm_dp_pcon_configure_dsc_enc(aux, DP_PCON_ENC_PPS_OVERRIDE_EN_BUFFER); in drm_dp_pcon_pps_override_param()
3930 int drm_dp_pcon_convert_rgb_to_ycbcr(struct drm_dp_aux *aux, u8 color_spc) in drm_dp_pcon_convert_rgb_to_ycbcr() argument
3935 ret = drm_dp_dpcd_read_byte(aux, DP_PROTOCOL_CONVERTER_CONTROL_2, &buf); in drm_dp_pcon_convert_rgb_to_ycbcr()
3944 return drm_dp_dpcd_write_byte(aux, DP_PROTOCOL_CONVERTER_CONTROL_2, buf); in drm_dp_pcon_convert_rgb_to_ycbcr()
3959 int drm_edp_backlight_set_level(struct drm_dp_aux *aux, const struct drm_edp_backlight_info *bl, in drm_edp_backlight_set_level() argument
3986 ret = drm_dp_dpcd_write_data(aux, offset, buf, len); in drm_edp_backlight_set_level()
3988 drm_err(aux->drm_dev, in drm_edp_backlight_set_level()
3990 aux->name, ret); in drm_edp_backlight_set_level()
3999 drm_edp_backlight_set_enable(struct drm_dp_aux *aux, const struct drm_edp_backlight_info *bl, in drm_edp_backlight_set_enable() argument
4009 ret = drm_dp_dpcd_read_byte(aux, DP_EDP_DISPLAY_CONTROL_REGISTER, &buf); in drm_edp_backlight_set_enable()
4011 drm_err(aux->drm_dev, "%s: Failed to read eDP display control register: %d\n", in drm_edp_backlight_set_enable()
4012 aux->name, ret); in drm_edp_backlight_set_enable()
4020 ret = drm_dp_dpcd_write_byte(aux, DP_EDP_DISPLAY_CONTROL_REGISTER, buf); in drm_edp_backlight_set_enable()
4022 drm_err(aux->drm_dev, "%s: Failed to write eDP display control register: %d\n", in drm_edp_backlight_set_enable()
4023 aux->name, ret); in drm_edp_backlight_set_enable()
4048 int drm_edp_backlight_enable(struct drm_dp_aux *aux, const struct drm_edp_backlight_info *bl, in drm_edp_backlight_enable() argument
4063 ret = drm_dp_dpcd_write_byte(aux, DP_EDP_PWMGEN_BIT_COUNT, bl->pwmgen_bit_count); in drm_edp_backlight_enable()
4065 drm_dbg_kms(aux->drm_dev, "%s: Failed to write aux pwmgen bit count: %d\n", in drm_edp_backlight_enable()
4066 aux->name, ret); in drm_edp_backlight_enable()
4070 ret = drm_dp_dpcd_write_byte(aux, DP_EDP_BACKLIGHT_FREQ_SET, in drm_edp_backlight_enable()
4073 drm_dbg_kms(aux->drm_dev, in drm_edp_backlight_enable()
4075 aux->name, ret); in drm_edp_backlight_enable()
4080 ret = drm_dp_dpcd_write_byte(aux, DP_EDP_BACKLIGHT_MODE_SET_REGISTER, dpcd_buf); in drm_edp_backlight_enable()
4082 drm_dbg_kms(aux->drm_dev, "%s: Failed to write aux backlight mode: %d\n", in drm_edp_backlight_enable()
4083 aux->name, ret); in drm_edp_backlight_enable()
4087 ret = drm_edp_backlight_set_level(aux, bl, level); in drm_edp_backlight_enable()
4090 ret = drm_edp_backlight_set_enable(aux, bl, true); in drm_edp_backlight_enable()
4113 int drm_edp_backlight_disable(struct drm_dp_aux *aux, const struct drm_edp_backlight_info *bl) in drm_edp_backlight_disable() argument
4117 ret = drm_edp_backlight_set_enable(aux, bl, false); in drm_edp_backlight_disable()
4126 drm_edp_backlight_probe_max(struct drm_dp_aux *aux, struct drm_edp_backlight_info *bl, in drm_edp_backlight_probe_max() argument
4136 ret = drm_dp_dpcd_read_byte(aux, DP_EDP_PWMGEN_BIT_COUNT, &pn); in drm_edp_backlight_probe_max()
4138 drm_dbg_kms(aux->drm_dev, "%s: Failed to read pwmgen bit count cap: %d\n", in drm_edp_backlight_probe_max()
4139 aux->name, ret); in drm_edp_backlight_probe_max()
4170 ret = drm_dp_dpcd_read_byte(aux, DP_EDP_PWMGEN_BIT_COUNT_CAP_MIN, &pn_min); in drm_edp_backlight_probe_max()
4172 drm_dbg_kms(aux->drm_dev, "%s: Failed to read pwmgen bit count cap min: %d\n", in drm_edp_backlight_probe_max()
4173 aux->name, ret); in drm_edp_backlight_probe_max()
4176 ret = drm_dp_dpcd_read_byte(aux, DP_EDP_PWMGEN_BIT_COUNT_CAP_MAX, &pn_max); in drm_edp_backlight_probe_max()
4178 drm_dbg_kms(aux->drm_dev, "%s: Failed to read pwmgen bit count cap max: %d\n", in drm_edp_backlight_probe_max()
4179 aux->name, ret); in drm_edp_backlight_probe_max()
4189 drm_dbg_kms(aux->drm_dev, in drm_edp_backlight_probe_max()
4191 aux->name, driver_pwm_freq_hz); in drm_edp_backlight_probe_max()
4202 ret = drm_dp_dpcd_write_byte(aux, DP_EDP_PWMGEN_BIT_COUNT, pn); in drm_edp_backlight_probe_max()
4204 drm_dbg_kms(aux->drm_dev, "%s: Failed to write aux pwmgen bit count: %d\n", in drm_edp_backlight_probe_max()
4205 aux->name, ret); in drm_edp_backlight_probe_max()
4213 drm_dbg_kms(aux->drm_dev, "%s: Using backlight frequency from driver (%dHz)\n", in drm_edp_backlight_probe_max()
4214 aux->name, driver_pwm_freq_hz); in drm_edp_backlight_probe_max()
4221 drm_edp_backlight_probe_state(struct drm_dp_aux *aux, struct drm_edp_backlight_info *bl, in drm_edp_backlight_probe_state() argument
4228 ret = drm_dp_dpcd_read_byte(aux, DP_EDP_BACKLIGHT_MODE_SET_REGISTER, &mode_reg); in drm_edp_backlight_probe_state()
4230 drm_dbg_kms(aux->drm_dev, "%s: Failed to read backlight mode: %d\n", in drm_edp_backlight_probe_state()
4231 aux->name, ret); in drm_edp_backlight_probe_state()
4243 ret = drm_dp_dpcd_read_data(aux, DP_EDP_PANEL_TARGET_LUMINANCE_VALUE, in drm_edp_backlight_probe_state()
4246 drm_dbg_kms(aux->drm_dev, in drm_edp_backlight_probe_state()
4248 aux->name, ret); in drm_edp_backlight_probe_state()
4259 ret = drm_dp_dpcd_read_data(aux, DP_EDP_BACKLIGHT_BRIGHTNESS_MSB, in drm_edp_backlight_probe_state()
4262 drm_dbg_kms(aux->drm_dev, in drm_edp_backlight_probe_state()
4264 aux->name, ret); in drm_edp_backlight_probe_state()
4303 drm_edp_backlight_init(struct drm_dp_aux *aux, struct drm_edp_backlight_info *bl, in drm_edp_backlight_init() argument
4323 drm_dbg_kms(aux->drm_dev, in drm_edp_backlight_init()
4325 aux->name); in drm_edp_backlight_init()
4332 ret = drm_edp_backlight_probe_max(aux, bl, driver_pwm_freq_hz, edp_dpcd); in drm_edp_backlight_init()
4337 ret = drm_edp_backlight_probe_state(aux, bl, current_mode); in drm_edp_backlight_init()
4342 drm_dbg_kms(aux->drm_dev, in drm_edp_backlight_init()
4344 aux->name, bl->aux_set, bl->aux_enable, *current_mode); in drm_edp_backlight_init()
4346 drm_dbg_kms(aux->drm_dev, in drm_edp_backlight_init()
4348 aux->name, *current_level, bl->max, bl->pwm_freq_pre_divider, in drm_edp_backlight_init()
4367 drm_edp_backlight_enable(bl->aux, &bl->info, brightness); in dp_aux_backlight_update_status()
4371 ret = drm_edp_backlight_set_level(bl->aux, &bl->info, brightness); in dp_aux_backlight_update_status()
4374 drm_edp_backlight_disable(bl->aux, &bl->info); in dp_aux_backlight_update_status()
4410 int drm_panel_dp_aux_backlight(struct drm_panel *panel, struct drm_dp_aux *aux) in drm_panel_dp_aux_backlight() argument
4419 if (!panel || !panel->dev || !aux) in drm_panel_dp_aux_backlight()
4422 ret = drm_dp_dpcd_read_data(aux, DP_EDP_DPCD_REV, edp_dpcd, in drm_panel_dp_aux_backlight()
4436 bl->aux = aux; in drm_panel_dp_aux_backlight()
4438 ret = drm_edp_backlight_init(aux, &bl->info, 0, 0, edp_dpcd, in drm_panel_dp_aux_backlight()