Lines Matching full:aux

60 	struct drm_dp_aux *aux;  member
69 * levels to deal with Display Port sink devices and related things like DP aux
70 * channel transfers, EDID reading over DP aux channels, decoding certain DPCD
228 static int __8b10b_clock_recovery_delay_us(const struct drm_dp_aux *aux, u8 rd_interval) in __8b10b_clock_recovery_delay_us() argument
231 drm_dbg_kms(aux->drm_dev, "%s: invalid AUX interval 0x%02x (max 4)\n", in __8b10b_clock_recovery_delay_us()
232 aux->name, rd_interval); in __8b10b_clock_recovery_delay_us()
240 static int __8b10b_channel_eq_delay_us(const struct drm_dp_aux *aux, u8 rd_interval) in __8b10b_channel_eq_delay_us() argument
243 drm_dbg_kms(aux->drm_dev, "%s: invalid AUX interval 0x%02x (max 4)\n", in __8b10b_channel_eq_delay_us()
244 aux->name, rd_interval); in __8b10b_channel_eq_delay_us()
252 static int __128b132b_channel_eq_delay_us(const struct drm_dp_aux *aux, u8 rd_interval) in __128b132b_channel_eq_delay_us() argument
256 drm_dbg_kms(aux->drm_dev, "%s: invalid AUX interval 0x%02x\n", in __128b132b_channel_eq_delay_us()
257 aux->name, rd_interval); in __128b132b_channel_eq_delay_us()
286 static int __read_delay(struct drm_dp_aux *aux, const u8 dpcd[DP_RECEIVER_CAP_SIZE], in __read_delay() argument
289 int (*parse)(const struct drm_dp_aux *aux, u8 rd_interval); in __read_delay()
330 if (drm_dp_dpcd_readb(aux, offset, &rd_interval) != 1) { in __read_delay()
331 drm_dbg_kms(aux->drm_dev, "%s: failed rd interval read\n", in __read_delay()
332 aux->name); in __read_delay()
338 return parse(aux, rd_interval & mask); in __read_delay()
341 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
344 return __read_delay(aux, dpcd, dp_phy, uhbr, true); in drm_dp_read_clock_recovery_delay()
348 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
351 return __read_delay(aux, dpcd, dp_phy, uhbr, false); in drm_dp_read_channel_eq_delay()
356 int drm_dp_128b132b_read_aux_rd_interval(struct drm_dp_aux *aux) in drm_dp_128b132b_read_aux_rd_interval() argument
361 if (drm_dp_dpcd_readb(aux, DP_128B132B_TRAINING_AUX_RD_INTERVAL, &val) != 1) { in drm_dp_128b132b_read_aux_rd_interval()
362 drm_err(aux->drm_dev, "%s: failed rd interval read\n", in drm_dp_128b132b_read_aux_rd_interval()
363 aux->name); in drm_dp_128b132b_read_aux_rd_interval()
375 void drm_dp_link_train_clock_recovery_delay(const struct drm_dp_aux *aux, in drm_dp_link_train_clock_recovery_delay() argument
385 delay_us = __8b10b_clock_recovery_delay_us(aux, rd_interval); in drm_dp_link_train_clock_recovery_delay()
391 static void __drm_dp_link_train_channel_eq_delay(const struct drm_dp_aux *aux, in __drm_dp_link_train_channel_eq_delay() argument
394 int delay_us = __8b10b_channel_eq_delay_us(aux, rd_interval); in __drm_dp_link_train_channel_eq_delay()
399 void drm_dp_link_train_channel_eq_delay(const struct drm_dp_aux *aux, in drm_dp_link_train_channel_eq_delay() argument
402 __drm_dp_link_train_channel_eq_delay(aux, in drm_dp_link_train_channel_eq_delay()
451 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
458 __drm_dp_link_train_channel_eq_delay(aux, interval); in drm_dp_lttpr_link_train_channel_eq_delay()
464 * @aux: The DP AUX channel to use
469 * the Aux transaction till the granted wake timeout.
470 * If this function is not called all Aux transactions are expected to take
473 void drm_dp_lttpr_wake_timeout_setup(struct drm_dp_aux *aux, bool transparent_mode) in drm_dp_lttpr_wake_timeout_setup() argument
488 ret = drm_dp_dpcd_readb(aux, DP_EXTENDED_DPRX_SLEEP_WAKE_TIMEOUT_REQUEST, &val); in drm_dp_lttpr_wake_timeout_setup()
490 drm_dbg_kms(aux->drm_dev, in drm_dp_lttpr_wake_timeout_setup()
499 drm_dp_dpcd_writeb(aux, in drm_dp_lttpr_wake_timeout_setup()
503 ret = drm_dp_dpcd_readb(aux, DP_PHY_REPEATER_EXTENDED_WAIT_TIMEOUT, &val); in drm_dp_lttpr_wake_timeout_setup()
505 drm_dbg_kms(aux->drm_dev, in drm_dp_lttpr_wake_timeout_setup()
514 drm_dp_dpcd_writeb(aux, DP_PHY_REPEATER_EXTENDED_WAIT_TIMEOUT, in drm_dp_lttpr_wake_timeout_setup()
555 drm_dp_dump_access(const struct drm_dp_aux *aux, in drm_dp_dump_access() argument
561 drm_dbg_dp(aux->drm_dev, "%s: 0x%05x AUX %s (ret=%3d) %*ph\n", in drm_dp_dump_access()
562 aux->name, offset, arrow, ret, min(ret, 20), buffer); in drm_dp_dump_access()
564 drm_dbg_dp(aux->drm_dev, "%s: 0x%05x AUX %s (ret=%3d)\n", in drm_dp_dump_access()
565 aux->name, offset, arrow, ret); in drm_dp_dump_access()
571 * The DisplayPort AUX channel is an abstraction to allow generic, driver-
572 * independent access to AUX functionality. Drivers can take advantage of
577 * Both native and I2C-over-AUX transactions are supported.
580 static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request, in drm_dp_dpcd_access() argument
593 mutex_lock(&aux->hw_mutex); in drm_dp_dpcd_access()
596 * If the device attached to the aux bus is powered down then there's in drm_dp_dpcd_access()
599 if (aux->powered_down) { in drm_dp_dpcd_access()
607 * aux i2c transactions but real world devices this wasn't in drm_dp_dpcd_access()
616 ret = aux->transfer(aux, &msg); in drm_dp_dpcd_access()
637 drm_dbg_kms(aux->drm_dev, "%s: Too many retries, giving up. First error: %d\n", in drm_dp_dpcd_access()
638 aux->name, err); in drm_dp_dpcd_access()
642 mutex_unlock(&aux->hw_mutex); in drm_dp_dpcd_access()
648 * @aux: DisplayPort AUX channel (SST)
657 int drm_dp_dpcd_probe(struct drm_dp_aux *aux, unsigned int offset) in drm_dp_dpcd_probe() argument
662 ret = drm_dp_dpcd_access(aux, DP_AUX_NATIVE_READ, offset, &buffer, 1); in drm_dp_dpcd_probe()
665 drm_dp_dump_access(aux, DP_AUX_NATIVE_READ, offset, &buffer, ret); in drm_dp_dpcd_probe()
673 * @aux: DisplayPort AUX channel; for convenience it's OK to pass NULL here
677 * If the endpoint device on the DP AUX bus is known to be powered down
683 void drm_dp_dpcd_set_powered(struct drm_dp_aux *aux, bool powered) in drm_dp_dpcd_set_powered() argument
685 if (!aux) in drm_dp_dpcd_set_powered()
688 mutex_lock(&aux->hw_mutex); in drm_dp_dpcd_set_powered()
689 aux->powered_down = !powered; in drm_dp_dpcd_set_powered()
690 mutex_unlock(&aux->hw_mutex); in drm_dp_dpcd_set_powered()
696 * @aux: DisplayPort AUX channel (SST or MST)
704 * function returns -EPROTO. Errors from the underlying AUX channel transfer
708 ssize_t drm_dp_dpcd_read(struct drm_dp_aux *aux, unsigned int offset, in drm_dp_dpcd_read() argument
725 if (!aux->is_remote) { in drm_dp_dpcd_read()
726 ret = drm_dp_dpcd_probe(aux, DP_DPCD_REV); in drm_dp_dpcd_read()
731 if (aux->is_remote) in drm_dp_dpcd_read()
732 ret = drm_dp_mst_dpcd_read(aux, offset, buffer, size); in drm_dp_dpcd_read()
734 ret = drm_dp_dpcd_access(aux, DP_AUX_NATIVE_READ, offset, in drm_dp_dpcd_read()
737 drm_dp_dump_access(aux, DP_AUX_NATIVE_READ, offset, buffer, ret); in drm_dp_dpcd_read()
744 * @aux: DisplayPort AUX channel (SST or MST)
752 * function returns -EPROTO. Errors from the underlying AUX channel transfer
756 ssize_t drm_dp_dpcd_write(struct drm_dp_aux *aux, unsigned int offset, in drm_dp_dpcd_write() argument
761 if (aux->is_remote) in drm_dp_dpcd_write()
762 ret = drm_dp_mst_dpcd_write(aux, offset, buffer, size); in drm_dp_dpcd_write()
764 ret = drm_dp_dpcd_access(aux, DP_AUX_NATIVE_WRITE, offset, in drm_dp_dpcd_write()
767 drm_dp_dump_access(aux, DP_AUX_NATIVE_WRITE, offset, buffer, ret); in drm_dp_dpcd_write()
774 * @aux: DisplayPort AUX channel
780 int drm_dp_dpcd_read_link_status(struct drm_dp_aux *aux, in drm_dp_dpcd_read_link_status() argument
783 return drm_dp_dpcd_read(aux, DP_LANE0_1_STATUS, status, in drm_dp_dpcd_read_link_status()
790 * @aux: DisplayPort AUX channel
794 * Fetch the AUX DPCD registers for the DPRX or an LTTPR PHY link status. The
801 int drm_dp_dpcd_read_phy_link_status(struct drm_dp_aux *aux, in drm_dp_dpcd_read_phy_link_status() argument
808 ret = drm_dp_dpcd_read(aux, in drm_dp_dpcd_read_phy_link_status()
821 ret = drm_dp_dpcd_read(aux, in drm_dp_dpcd_read_phy_link_status()
841 static int read_payload_update_status(struct drm_dp_aux *aux) in read_payload_update_status() argument
846 ret = drm_dp_dpcd_readb(aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status); in read_payload_update_status()
855 * @aux: DisplayPort AUX channel
866 int drm_dp_dpcd_write_payload(struct drm_dp_aux *aux, in drm_dp_dpcd_write_payload() argument
873 drm_dp_dpcd_writeb(aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, in drm_dp_dpcd_write_payload()
880 ret = drm_dp_dpcd_write(aux, DP_PAYLOAD_ALLOCATE_SET, payload_alloc, 3); in drm_dp_dpcd_write_payload()
882 drm_dbg_kms(aux->drm_dev, "failed to write payload allocation %d\n", ret); in drm_dp_dpcd_write_payload()
887 ret = drm_dp_dpcd_readb(aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status); in drm_dp_dpcd_write_payload()
889 drm_dbg_kms(aux->drm_dev, "failed to read payload table status %d\n", ret); in drm_dp_dpcd_write_payload()
899 drm_dbg_kms(aux->drm_dev, "status not set after read payload table status %d\n", in drm_dp_dpcd_write_payload()
912 * @aux: DisplayPort AUX channel
918 int drm_dp_dpcd_clear_payload(struct drm_dp_aux *aux) in drm_dp_dpcd_clear_payload() argument
920 return drm_dp_dpcd_write_payload(aux, 0, 0, 0x3f); in drm_dp_dpcd_clear_payload()
926 * @aux: DisplayPort AUX channel
936 int drm_dp_dpcd_poll_act_handled(struct drm_dp_aux *aux, int timeout_ms) in drm_dp_dpcd_poll_act_handled() argument
943 ret = readx_poll_timeout(read_payload_update_status, aux, status, in drm_dp_dpcd_poll_act_handled()
947 drm_err(aux->drm_dev, "Failed to get ACT after %d ms, last status: %02x\n", in drm_dp_dpcd_poll_act_handled()
955 drm_dbg_kms(aux->drm_dev, "Failed to read payload table status: %d\n", status); in drm_dp_dpcd_poll_act_handled()
1032 * @aux: DisplayPort AUX channel
1038 bool drm_dp_send_real_edid_checksum(struct drm_dp_aux *aux, in drm_dp_send_real_edid_checksum() argument
1043 if (drm_dp_dpcd_read(aux, DP_DEVICE_SERVICE_IRQ_VECTOR, in drm_dp_send_real_edid_checksum()
1045 drm_err(aux->drm_dev, "%s: DPCD failed read at register 0x%x\n", in drm_dp_send_real_edid_checksum()
1046 aux->name, DP_DEVICE_SERVICE_IRQ_VECTOR); in drm_dp_send_real_edid_checksum()
1051 if (drm_dp_dpcd_read(aux, DP_TEST_REQUEST, &link_edid_read, 1) < 1) { in drm_dp_send_real_edid_checksum()
1052 drm_err(aux->drm_dev, "%s: DPCD failed read at register 0x%x\n", in drm_dp_send_real_edid_checksum()
1053 aux->name, DP_TEST_REQUEST); in drm_dp_send_real_edid_checksum()
1059 drm_dbg_kms(aux->drm_dev, "%s: Source DUT does not support TEST_EDID_READ\n", in drm_dp_send_real_edid_checksum()
1060 aux->name); in drm_dp_send_real_edid_checksum()
1064 if (drm_dp_dpcd_write(aux, DP_DEVICE_SERVICE_IRQ_VECTOR, in drm_dp_send_real_edid_checksum()
1066 drm_err(aux->drm_dev, "%s: DPCD failed write at register 0x%x\n", in drm_dp_send_real_edid_checksum()
1067 aux->name, DP_DEVICE_SERVICE_IRQ_VECTOR); in drm_dp_send_real_edid_checksum()
1072 if (drm_dp_dpcd_write(aux, DP_TEST_EDID_CHECKSUM, in drm_dp_send_real_edid_checksum()
1074 drm_err(aux->drm_dev, "%s: DPCD failed write at register 0x%x\n", in drm_dp_send_real_edid_checksum()
1075 aux->name, DP_TEST_EDID_CHECKSUM); in drm_dp_send_real_edid_checksum()
1080 if (drm_dp_dpcd_write(aux, DP_TEST_RESPONSE, &test_resp, 1) < 1) { in drm_dp_send_real_edid_checksum()
1081 drm_err(aux->drm_dev, "%s: DPCD failed write at register 0x%x\n", in drm_dp_send_real_edid_checksum()
1082 aux->name, DP_TEST_RESPONSE); in drm_dp_send_real_edid_checksum()
1100 static int drm_dp_read_extended_dpcd_caps(struct drm_dp_aux *aux, in drm_dp_read_extended_dpcd_caps() argument
1117 ret = drm_dp_dpcd_read(aux, DP_DP13_DPCD_REV, &dpcd_ext, in drm_dp_read_extended_dpcd_caps()
1125 drm_dbg_kms(aux->drm_dev, in drm_dp_read_extended_dpcd_caps()
1127 aux->name, dpcd[DP_DPCD_REV], dpcd_ext[DP_DPCD_REV]); in drm_dp_read_extended_dpcd_caps()
1134 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()
1144 * @aux: DisplayPort AUX channel
1147 * Attempts to read the base DPCD caps for @aux. Additionally, this function
1154 int drm_dp_read_dpcd_caps(struct drm_dp_aux *aux, in drm_dp_read_dpcd_caps() argument
1159 ret = drm_dp_dpcd_read(aux, DP_DPCD_REV, dpcd, DP_RECEIVER_CAP_SIZE); in drm_dp_read_dpcd_caps()
1165 ret = drm_dp_read_extended_dpcd_caps(aux, dpcd); in drm_dp_read_dpcd_caps()
1169 drm_dbg_kms(aux->drm_dev, "%s: DPCD: %*ph\n", aux->name, DP_RECEIVER_CAP_SIZE, dpcd); in drm_dp_read_dpcd_caps()
1177 * @aux: DisplayPort AUX channel
1188 int drm_dp_read_downstream_info(struct drm_dp_aux *aux, in drm_dp_read_downstream_info() argument
1212 ret = drm_dp_dpcd_read(aux, DP_DOWNSTREAM_PORT_0, downstream_ports, len); in drm_dp_read_downstream_info()
1218 drm_dbg_kms(aux->drm_dev, "%s: DPCD DFP: %*ph\n", aux->name, len, downstream_ports); in drm_dp_read_downstream_info()
1566 * @aux: DisplayPort AUX channel
1571 int drm_dp_downstream_id(struct drm_dp_aux *aux, char id[6]) in drm_dp_downstream_id() argument
1573 return drm_dp_dpcd_read(aux, DP_BRANCH_ID, id, 6); in drm_dp_downstream_id()
1583 * @aux: DisplayPort AUX channel
1590 struct drm_dp_aux *aux) in drm_dp_downstream_debug() argument
1635 drm_dp_downstream_id(aux, id); in drm_dp_downstream_debug()
1638 len = drm_dp_dpcd_read(aux, DP_BRANCH_HW_REV, &rev[0], 1); in drm_dp_downstream_debug()
1643 len = drm_dp_dpcd_read(aux, DP_BRANCH_SW_REV, rev, 2); in drm_dp_downstream_debug()
1770 * @aux: The DP AUX channel to use
1774 * Returns: The current sink count reported by @aux, or a negative error code
1777 int drm_dp_read_sink_count(struct drm_dp_aux *aux) in drm_dp_read_sink_count() argument
1782 ret = drm_dp_dpcd_readb(aux, DP_SINK_COUNT, &count); in drm_dp_read_sink_count()
1793 * I2C-over-AUX implementation
1826 * Calculate the duration of the AUX request/reply in usec. Gives the
1871 /* AUX bitrate is 1MHz, i2c bitrate as specified */ in drm_dp_i2c_msg_duration()
1880 * i2c and AUX transfers.
1902 * Transfer a single I2C-over-AUX message and handle various error conditions,
1909 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
1916 * before giving up the AUX transaction. in drm_dp_i2c_do_msg()
1923 ret = aux->transfer(aux, msg); in drm_dp_i2c_do_msg()
1935 drm_dbg_kms_ratelimited(aux->drm_dev, "%s: transaction timed out\n", in drm_dp_i2c_do_msg()
1936 aux->name); in drm_dp_i2c_do_msg()
1938 drm_dbg_kms(aux->drm_dev, "%s: transaction failed: %d\n", in drm_dp_i2c_do_msg()
1939 aux->name, ret); in drm_dp_i2c_do_msg()
1947 * For I2C-over-AUX transactions this isn't enough, we in drm_dp_i2c_do_msg()
1953 drm_dbg_kms(aux->drm_dev, "%s: native nack (result=%d, size=%zu)\n", in drm_dp_i2c_do_msg()
1954 aux->name, ret, msg->size); in drm_dp_i2c_do_msg()
1958 drm_dbg_kms(aux->drm_dev, "%s: native defer\n", aux->name); in drm_dp_i2c_do_msg()
1972 drm_err(aux->drm_dev, "%s: invalid native reply %#04x\n", in drm_dp_i2c_do_msg()
1973 aux->name, msg->reply); in drm_dp_i2c_do_msg()
1988 drm_dbg_kms(aux->drm_dev, "%s: I2C nack (result=%d, size=%zu)\n", in drm_dp_i2c_do_msg()
1989 aux->name, ret, msg->size); in drm_dp_i2c_do_msg()
1990 aux->i2c_nack_count++; in drm_dp_i2c_do_msg()
1994 drm_dbg_kms(aux->drm_dev, "%s: I2C defer\n", aux->name); in drm_dp_i2c_do_msg()
1999 aux->i2c_defer_count++; in drm_dp_i2c_do_msg()
2008 drm_err(aux->drm_dev, "%s: invalid I2C reply %#04x\n", in drm_dp_i2c_do_msg()
2009 aux->name, msg->reply); in drm_dp_i2c_do_msg()
2014 drm_dbg_kms(aux->drm_dev, "%s: Too many retries, giving up\n", aux->name); in drm_dp_i2c_do_msg()
2032 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
2038 err = drm_dp_i2c_do_msg(aux, &msg); in drm_dp_i2c_drain_msg()
2043 drm_dbg_kms(aux->drm_dev, in drm_dp_i2c_drain_msg()
2045 aux->name, msg.size, err); in drm_dp_i2c_drain_msg()
2057 * Bizlink designed DP->DVI-D Dual Link adapters require the I2C over AUX
2064 "Number of bytes to transfer in a single I2C over DP AUX CH message, (1-16, default 16)");
2069 struct drm_dp_aux *aux = adapter->algo_data; in drm_dp_i2c_xfer() local
2075 if (aux->powered_down) in drm_dp_i2c_xfer()
2091 err = drm_dp_i2c_do_msg(aux, &msg); in drm_dp_i2c_xfer()
2110 err = drm_dp_i2c_drain_msg(aux, &msg); in drm_dp_i2c_xfer()
2134 (void)drm_dp_i2c_do_msg(aux, &msg); in drm_dp_i2c_xfer()
2170 static int drm_dp_aux_get_crc(struct drm_dp_aux *aux, u8 *crc) in drm_dp_aux_get_crc() argument
2175 ret = drm_dp_dpcd_readb(aux, DP_TEST_SINK, &buf); in drm_dp_aux_get_crc()
2181 ret = drm_dp_dpcd_readb(aux, DP_TEST_SINK_MISC, &buf); in drm_dp_aux_get_crc()
2186 if (count == aux->crc_count) in drm_dp_aux_get_crc()
2189 aux->crc_count = count; in drm_dp_aux_get_crc()
2195 ret = drm_dp_dpcd_read(aux, DP_TEST_CRC_R_CR, crc, 6); in drm_dp_aux_get_crc()
2204 struct drm_dp_aux *aux = container_of(work, struct drm_dp_aux, in drm_dp_aux_crc_work() local
2211 if (WARN_ON(!aux->crtc)) in drm_dp_aux_crc_work()
2214 crtc = aux->crtc; in drm_dp_aux_crc_work()
2220 ret = drm_dp_aux_get_crc(aux, crc_bytes); in drm_dp_aux_crc_work()
2223 ret = drm_dp_aux_get_crc(aux, crc_bytes); in drm_dp_aux_crc_work()
2227 drm_dbg_kms(aux->drm_dev, "%s: Get CRC failed after retrying: %d\n", in drm_dp_aux_crc_work()
2228 aux->name, ret); in drm_dp_aux_crc_work()
2231 drm_dbg_kms(aux->drm_dev, "%s: Failed to get a CRC: %d\n", aux->name, ret); in drm_dp_aux_crc_work()
2243 * drm_dp_remote_aux_init() - minimally initialise a remote aux channel
2244 * @aux: DisplayPort AUX channel
2246 * Used for remote aux channel in general. Merely initialize the crc work
2249 void drm_dp_remote_aux_init(struct drm_dp_aux *aux) in drm_dp_remote_aux_init() argument
2251 INIT_WORK(&aux->crc_work, drm_dp_aux_crc_work); in drm_dp_remote_aux_init()
2256 * drm_dp_aux_init() - minimally initialise an aux channel
2257 * @aux: DisplayPort AUX channel
2261 * grandparents to their AUX adapters (e.g. the AUX adapter is parented by a
2265 * early as possible so that the &drm_device that corresponds to the AUX adapter
2268 * For devices which use a separate platform device for their AUX adapters, this
2272 void drm_dp_aux_init(struct drm_dp_aux *aux) in drm_dp_aux_init() argument
2274 mutex_init(&aux->hw_mutex); in drm_dp_aux_init()
2275 mutex_init(&aux->cec.lock); in drm_dp_aux_init()
2276 INIT_WORK(&aux->crc_work, drm_dp_aux_crc_work); in drm_dp_aux_init()
2278 aux->ddc.algo = &drm_dp_i2c_algo; in drm_dp_aux_init()
2279 aux->ddc.algo_data = aux; in drm_dp_aux_init()
2280 aux->ddc.retries = 3; in drm_dp_aux_init()
2282 aux->ddc.lock_ops = &drm_dp_i2c_lock_ops; in drm_dp_aux_init()
2287 * drm_dp_aux_register() - initialise and register aux channel
2288 * @aux: DisplayPort AUX channel
2291 * should only be called once the parent of @aux, &drm_dp_aux.dev, is
2292 * initialized. For devices which are grandparents of their AUX channels,
2294 * corresponds to @aux. For these devices, it's advised to call
2300 * For devices where the AUX channel is a device that exists independently of
2305 * with the AUX channel (e.g. on bridge detach).
2307 * Drivers which need to use the aux channel before either of the two points
2308 * mentioned above need to call drm_dp_aux_init() in order to use the AUX
2313 int drm_dp_aux_register(struct drm_dp_aux *aux) in drm_dp_aux_register() argument
2317 WARN_ON_ONCE(!aux->drm_dev); in drm_dp_aux_register()
2319 if (!aux->ddc.algo) in drm_dp_aux_register()
2320 drm_dp_aux_init(aux); in drm_dp_aux_register()
2322 aux->ddc.owner = THIS_MODULE; in drm_dp_aux_register()
2323 aux->ddc.dev.parent = aux->dev; in drm_dp_aux_register()
2325 strscpy(aux->ddc.name, aux->name ? aux->name : dev_name(aux->dev), in drm_dp_aux_register()
2326 sizeof(aux->ddc.name)); in drm_dp_aux_register()
2328 ret = drm_dp_aux_register_devnode(aux); in drm_dp_aux_register()
2332 ret = i2c_add_adapter(&aux->ddc); in drm_dp_aux_register()
2334 drm_dp_aux_unregister_devnode(aux); in drm_dp_aux_register()
2343 * drm_dp_aux_unregister() - unregister an AUX adapter
2344 * @aux: DisplayPort AUX channel
2346 void drm_dp_aux_unregister(struct drm_dp_aux *aux) in drm_dp_aux_unregister() argument
2348 drm_dp_aux_unregister_devnode(aux); in drm_dp_aux_unregister()
2349 i2c_del_adapter(&aux->ddc); in drm_dp_aux_unregister()
2388 * @aux: DisplayPort AUX channel
2393 int drm_dp_start_crc(struct drm_dp_aux *aux, struct drm_crtc *crtc) in drm_dp_start_crc() argument
2398 ret = drm_dp_dpcd_readb(aux, DP_TEST_SINK, &buf); in drm_dp_start_crc()
2402 ret = drm_dp_dpcd_writeb(aux, DP_TEST_SINK, buf | DP_TEST_SINK_START); in drm_dp_start_crc()
2406 aux->crc_count = 0; in drm_dp_start_crc()
2407 aux->crtc = crtc; in drm_dp_start_crc()
2408 schedule_work(&aux->crc_work); in drm_dp_start_crc()
2416 * @aux: DisplayPort AUX channel
2420 int drm_dp_stop_crc(struct drm_dp_aux *aux) in drm_dp_stop_crc() argument
2425 ret = drm_dp_dpcd_readb(aux, DP_TEST_SINK, &buf); in drm_dp_stop_crc()
2429 ret = drm_dp_dpcd_writeb(aux, DP_TEST_SINK, buf & ~DP_TEST_SINK_START); in drm_dp_stop_crc()
2433 flush_work(&aux->crc_work); in drm_dp_stop_crc()
2434 aux->crtc = NULL; in drm_dp_stop_crc()
2512 static int drm_dp_read_ident(struct drm_dp_aux *aux, unsigned int offset, in drm_dp_read_ident() argument
2517 ret = drm_dp_dpcd_read(aux, offset, ident, sizeof(*ident)); in drm_dp_read_ident()
2522 static void drm_dp_dump_desc(struct drm_dp_aux *aux, in drm_dp_dump_desc() argument
2527 drm_dbg_kms(aux->drm_dev, in drm_dp_dump_desc()
2529 aux->name, device_name, in drm_dp_dump_desc()
2539 * @aux: DisplayPort AUX channel
2548 int drm_dp_read_desc(struct drm_dp_aux *aux, struct drm_dp_desc *desc, in drm_dp_read_desc() argument
2555 ret = drm_dp_read_ident(aux, offset, ident); in drm_dp_read_desc()
2561 drm_dp_dump_desc(aux, is_branch ? "DP branch" : "DP sink", desc); in drm_dp_read_desc()
2569 * @aux: DisplayPort AUX channel
2577 int drm_dp_dump_lttpr_desc(struct drm_dp_aux *aux, enum drm_dp_phy dp_phy) in drm_dp_dump_lttpr_desc() argument
2582 if (drm_WARN_ON(aux->drm_dev, dp_phy < DP_PHY_LTTPR1 || dp_phy > DP_MAX_LTTPR_COUNT)) in drm_dp_dump_lttpr_desc()
2585 ret = drm_dp_read_ident(aux, DP_OUI_PHY_REPEATER(dp_phy), &desc.ident); in drm_dp_dump_lttpr_desc()
2589 drm_dp_dump_desc(aux, drm_dp_phy_name(dp_phy), &desc); in drm_dp_dump_lttpr_desc()
2763 static int drm_dp_read_lttpr_regs(struct drm_dp_aux *aux, in drm_dp_read_lttpr_regs() argument
2777 ret = drm_dp_dpcd_read(aux, in drm_dp_read_lttpr_regs()
2791 * @aux: DisplayPort AUX channel
2799 int drm_dp_read_lttpr_common_caps(struct drm_dp_aux *aux, in drm_dp_read_lttpr_common_caps() argument
2803 return drm_dp_read_lttpr_regs(aux, dpcd, in drm_dp_read_lttpr_common_caps()
2811 * @aux: DisplayPort AUX channel
2820 int drm_dp_read_lttpr_phy_caps(struct drm_dp_aux *aux, in drm_dp_read_lttpr_phy_caps() argument
2825 return drm_dp_read_lttpr_regs(aux, dpcd, in drm_dp_read_lttpr_phy_caps()
2880 * @aux: DisplayPort AUX channel
2885 int drm_dp_lttpr_set_transparent_mode(struct drm_dp_aux *aux, bool enable) in drm_dp_lttpr_set_transparent_mode() argument
2889 int ret = drm_dp_dpcd_writeb(aux, DP_PHY_REPEATER_MODE, val); in drm_dp_lttpr_set_transparent_mode()
2900 * @aux: DisplayPort AUX channel
2907 int drm_dp_lttpr_init(struct drm_dp_aux *aux, int lttpr_count) in drm_dp_lttpr_init() argument
2919 ret = drm_dp_lttpr_set_transparent_mode(aux, true); in drm_dp_lttpr_init()
2926 if (drm_dp_lttpr_set_transparent_mode(aux, false)) { in drm_dp_lttpr_init()
2931 drm_dp_lttpr_set_transparent_mode(aux, true); in drm_dp_lttpr_init()
2987 * @aux: DisplayPort AUX channel
2992 int drm_dp_get_phy_test_pattern(struct drm_dp_aux *aux, in drm_dp_get_phy_test_pattern() argument
2998 err = drm_dp_dpcd_readb(aux, DP_TEST_LINK_RATE, &rate); in drm_dp_get_phy_test_pattern()
3003 err = drm_dp_dpcd_readb(aux, DP_TEST_LANE_COUNT, &lanes); in drm_dp_get_phy_test_pattern()
3011 err = drm_dp_dpcd_readb(aux, DP_PHY_TEST_PATTERN, &data->phy_pattern); in drm_dp_get_phy_test_pattern()
3017 err = drm_dp_dpcd_read(aux, DP_TEST_80BIT_CUSTOM_PATTERN_7_0, in drm_dp_get_phy_test_pattern()
3024 err = drm_dp_dpcd_read(aux, DP_TEST_HBR2_SCRAMBLER_RESET, in drm_dp_get_phy_test_pattern()
3037 * @aux: DisplayPort AUX channel
3043 int drm_dp_set_phy_test_pattern(struct drm_dp_aux *aux, in drm_dp_set_phy_test_pattern() argument
3053 err = drm_dp_dpcd_writeb(aux, DP_TRAINING_PATTERN_SET, in drm_dp_set_phy_test_pattern()
3059 err = drm_dp_dpcd_writeb(aux, in drm_dp_set_phy_test_pattern()
3256 * @aux: DisplayPort AUX channel
3261 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
3268 if (drm_dp_dpcd_readb(aux, DP_DPRX_FEATURE_ENUMERATION_LIST_CONT_1, in drm_dp_as_sdp_supported()
3270 drm_dbg_dp(aux->drm_dev, in drm_dp_as_sdp_supported()
3281 * @aux: DisplayPort AUX channel
3286 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
3293 if (drm_dp_dpcd_readb(aux, DP_DPRX_FEATURE_ENUMERATION_LIST, &rx_feature) != 1) { in drm_dp_vsc_sdp_supported()
3294 drm_dbg_dp(aux->drm_dev, "failed to read DP_DPRX_FEATURE_ENUMERATION_LIST\n"); in drm_dp_vsc_sdp_supported()
3417 * @aux: DisplayPort AUX channel
3422 int drm_dp_pcon_frl_prepare(struct drm_dp_aux *aux, bool enable_frl_ready_hpd) in drm_dp_pcon_frl_prepare() argument
3431 ret = drm_dp_dpcd_writeb(aux, DP_PCON_HDMI_LINK_CONFIG_1, buf); in drm_dp_pcon_frl_prepare()
3439 * @aux: DisplayPort AUX channel
3443 bool drm_dp_pcon_is_frl_ready(struct drm_dp_aux *aux) in drm_dp_pcon_is_frl_ready() argument
3448 ret = drm_dp_dpcd_readb(aux, DP_PCON_HDMI_TX_LINK_STATUS, &buf); in drm_dp_pcon_is_frl_ready()
3461 * @aux: DisplayPort AUX channel
3471 int drm_dp_pcon_frl_configure_1(struct drm_dp_aux *aux, int max_frl_gbps, in drm_dp_pcon_frl_configure_1() argument
3477 ret = drm_dp_dpcd_readb(aux, DP_PCON_HDMI_LINK_CONFIG_1, &buf); in drm_dp_pcon_frl_configure_1()
3512 ret = drm_dp_dpcd_writeb(aux, DP_PCON_HDMI_LINK_CONFIG_1, buf); in drm_dp_pcon_frl_configure_1()
3522 * @aux: DisplayPort AUX channel
3531 int drm_dp_pcon_frl_configure_2(struct drm_dp_aux *aux, int max_frl_mask, in drm_dp_pcon_frl_configure_2() argument
3542 ret = drm_dp_dpcd_writeb(aux, DP_PCON_HDMI_LINK_CONFIG_2, buf); in drm_dp_pcon_frl_configure_2()
3552 * @aux: DisplayPort AUX channel
3556 int drm_dp_pcon_reset_frl_config(struct drm_dp_aux *aux) in drm_dp_pcon_reset_frl_config() argument
3560 ret = drm_dp_dpcd_writeb(aux, DP_PCON_HDMI_LINK_CONFIG_1, 0x0); in drm_dp_pcon_reset_frl_config()
3570 * @aux: DisplayPort AUX channel
3574 int drm_dp_pcon_frl_enable(struct drm_dp_aux *aux) in drm_dp_pcon_frl_enable() argument
3579 ret = drm_dp_dpcd_readb(aux, DP_PCON_HDMI_LINK_CONFIG_1, &buf); in drm_dp_pcon_frl_enable()
3583 drm_dbg_kms(aux->drm_dev, "%s: PCON in Autonomous mode, can't enable FRL\n", in drm_dp_pcon_frl_enable()
3584 aux->name); in drm_dp_pcon_frl_enable()
3588 ret = drm_dp_dpcd_writeb(aux, DP_PCON_HDMI_LINK_CONFIG_1, buf); in drm_dp_pcon_frl_enable()
3598 * @aux: DisplayPort AUX channel
3602 bool drm_dp_pcon_hdmi_link_active(struct drm_dp_aux *aux) in drm_dp_pcon_hdmi_link_active() argument
3607 ret = drm_dp_dpcd_readb(aux, DP_PCON_HDMI_TX_LINK_STATUS, &buf); in drm_dp_pcon_hdmi_link_active()
3617 * @aux: DisplayPort AUX channel
3626 int drm_dp_pcon_hdmi_link_mode(struct drm_dp_aux *aux, u8 *frl_trained_mask) in drm_dp_pcon_hdmi_link_mode() argument
3632 ret = drm_dp_dpcd_readb(aux, DP_PCON_HDMI_POST_FRL_STATUS, &buf); in drm_dp_pcon_hdmi_link_mode()
3648 * @aux: DisplayPort AUX channel
3653 void drm_dp_pcon_hdmi_frl_link_error_count(struct drm_dp_aux *aux, in drm_dp_pcon_hdmi_frl_link_error_count() argument
3661 if (drm_dp_dpcd_readb(aux, DP_PCON_HDMI_ERROR_STATUS_LN0 + i, &buf) < 0) in drm_dp_pcon_hdmi_frl_link_error_count()
3679 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()
3680 aux->name, num_error, i); in drm_dp_pcon_hdmi_frl_link_error_count()
3791 int drm_dp_pcon_configure_dsc_enc(struct drm_dp_aux *aux, u8 pps_buf_config) in drm_dp_pcon_configure_dsc_enc() argument
3796 ret = drm_dp_dpcd_readb(aux, DP_PROTOCOL_CONVERTER_CONTROL_2, &buf); in drm_dp_pcon_configure_dsc_enc()
3807 ret = drm_dp_dpcd_writeb(aux, DP_PROTOCOL_CONVERTER_CONTROL_2, buf); in drm_dp_pcon_configure_dsc_enc()
3817 * @aux: DisplayPort AUX channel
3821 int drm_dp_pcon_pps_default(struct drm_dp_aux *aux) in drm_dp_pcon_pps_default() argument
3825 ret = drm_dp_pcon_configure_dsc_enc(aux, DP_PCON_ENC_PPS_OVERRIDE_DISABLED); in drm_dp_pcon_pps_default()
3836 * @aux: DisplayPort AUX channel
3841 int drm_dp_pcon_pps_override_buf(struct drm_dp_aux *aux, u8 pps_buf[128]) in drm_dp_pcon_pps_override_buf() argument
3845 ret = drm_dp_dpcd_write(aux, DP_PCON_HDMI_PPS_OVERRIDE_BASE, &pps_buf, 128); in drm_dp_pcon_pps_override_buf()
3849 ret = drm_dp_pcon_configure_dsc_enc(aux, DP_PCON_ENC_PPS_OVERRIDE_EN_BUFFER); in drm_dp_pcon_pps_override_buf()
3860 * @aux: DisplayPort AUX channel
3866 int drm_dp_pcon_pps_override_param(struct drm_dp_aux *aux, u8 pps_param[6]) in drm_dp_pcon_pps_override_param() argument
3870 ret = drm_dp_dpcd_write(aux, DP_PCON_HDMI_PPS_OVRD_SLICE_HEIGHT, &pps_param[0], 2); in drm_dp_pcon_pps_override_param()
3873 ret = drm_dp_dpcd_write(aux, DP_PCON_HDMI_PPS_OVRD_SLICE_WIDTH, &pps_param[2], 2); in drm_dp_pcon_pps_override_param()
3876 ret = drm_dp_dpcd_write(aux, DP_PCON_HDMI_PPS_OVRD_BPP, &pps_param[4], 2); in drm_dp_pcon_pps_override_param()
3880 ret = drm_dp_pcon_configure_dsc_enc(aux, DP_PCON_ENC_PPS_OVERRIDE_EN_BUFFER); in drm_dp_pcon_pps_override_param()
3890 * @aux: displayPort AUX channel
3895 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
3900 ret = drm_dp_dpcd_readb(aux, DP_PROTOCOL_CONVERTER_CONTROL_2, &buf); in drm_dp_pcon_convert_rgb_to_ycbcr()
3909 ret = drm_dp_dpcd_writeb(aux, DP_PROTOCOL_CONVERTER_CONTROL_2, buf); in drm_dp_pcon_convert_rgb_to_ycbcr()
3918 * drm_edp_backlight_set_level() - Set the backlight level of an eDP panel via AUX
3919 * @aux: The DP AUX channel to use
3928 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
3945 ret = drm_dp_dpcd_write(aux, DP_EDP_BACKLIGHT_BRIGHTNESS_MSB, buf, sizeof(buf)); in drm_edp_backlight_set_level()
3947 drm_err(aux->drm_dev, in drm_edp_backlight_set_level()
3948 "%s: Failed to write aux backlight level: %d\n", in drm_edp_backlight_set_level()
3949 aux->name, ret); in drm_edp_backlight_set_level()
3958 drm_edp_backlight_set_enable(struct drm_dp_aux *aux, const struct drm_edp_backlight_info *bl, in drm_edp_backlight_set_enable() argument
3968 ret = drm_dp_dpcd_readb(aux, DP_EDP_DISPLAY_CONTROL_REGISTER, &buf); in drm_edp_backlight_set_enable()
3970 drm_err(aux->drm_dev, "%s: Failed to read eDP display control register: %d\n", in drm_edp_backlight_set_enable()
3971 aux->name, ret); in drm_edp_backlight_set_enable()
3979 ret = drm_dp_dpcd_writeb(aux, DP_EDP_DISPLAY_CONTROL_REGISTER, buf); in drm_edp_backlight_set_enable()
3981 drm_err(aux->drm_dev, "%s: Failed to write eDP display control register: %d\n", in drm_edp_backlight_set_enable()
3982 aux->name, ret); in drm_edp_backlight_set_enable()
3991 * @aux: The DP AUX channel to use
3993 * @level: The initial backlight level to set via AUX, if there is one
4007 int drm_edp_backlight_enable(struct drm_dp_aux *aux, const struct drm_edp_backlight_info *bl, in drm_edp_backlight_enable() argument
4019 ret = drm_dp_dpcd_writeb(aux, DP_EDP_PWMGEN_BIT_COUNT, bl->pwmgen_bit_count); in drm_edp_backlight_enable()
4021 drm_dbg_kms(aux->drm_dev, "%s: Failed to write aux pwmgen bit count: %d\n", in drm_edp_backlight_enable()
4022 aux->name, ret); in drm_edp_backlight_enable()
4026 ret = drm_dp_dpcd_writeb(aux, DP_EDP_BACKLIGHT_FREQ_SET, bl->pwm_freq_pre_divider); in drm_edp_backlight_enable()
4028 drm_dbg_kms(aux->drm_dev, in drm_edp_backlight_enable()
4029 "%s: Failed to write aux backlight frequency: %d\n", in drm_edp_backlight_enable()
4030 aux->name, ret); in drm_edp_backlight_enable()
4035 ret = drm_dp_dpcd_writeb(aux, DP_EDP_BACKLIGHT_MODE_SET_REGISTER, dpcd_buf); in drm_edp_backlight_enable()
4037 drm_dbg_kms(aux->drm_dev, "%s: Failed to write aux backlight mode: %d\n", in drm_edp_backlight_enable()
4038 aux->name, ret); in drm_edp_backlight_enable()
4042 ret = drm_edp_backlight_set_level(aux, bl, level); in drm_edp_backlight_enable()
4045 ret = drm_edp_backlight_set_enable(aux, bl, true); in drm_edp_backlight_enable()
4055 * @aux: The DP AUX channel to use
4058 * This function handles disabling DPCD backlight controls on a panel over AUX.
4068 int drm_edp_backlight_disable(struct drm_dp_aux *aux, const struct drm_edp_backlight_info *bl) in drm_edp_backlight_disable() argument
4072 ret = drm_edp_backlight_set_enable(aux, bl, false); in drm_edp_backlight_disable()
4081 drm_edp_backlight_probe_max(struct drm_dp_aux *aux, struct drm_edp_backlight_info *bl, in drm_edp_backlight_probe_max() argument
4091 ret = drm_dp_dpcd_readb(aux, DP_EDP_PWMGEN_BIT_COUNT, &pn); in drm_edp_backlight_probe_max()
4093 drm_dbg_kms(aux->drm_dev, "%s: Failed to read pwmgen bit count cap: %d\n", in drm_edp_backlight_probe_max()
4094 aux->name, ret); in drm_edp_backlight_probe_max()
4125 ret = drm_dp_dpcd_readb(aux, DP_EDP_PWMGEN_BIT_COUNT_CAP_MIN, &pn_min); in drm_edp_backlight_probe_max()
4127 drm_dbg_kms(aux->drm_dev, "%s: Failed to read pwmgen bit count cap min: %d\n", in drm_edp_backlight_probe_max()
4128 aux->name, ret); in drm_edp_backlight_probe_max()
4131 ret = drm_dp_dpcd_readb(aux, DP_EDP_PWMGEN_BIT_COUNT_CAP_MAX, &pn_max); in drm_edp_backlight_probe_max()
4133 drm_dbg_kms(aux->drm_dev, "%s: Failed to read pwmgen bit count cap max: %d\n", in drm_edp_backlight_probe_max()
4134 aux->name, ret); in drm_edp_backlight_probe_max()
4144 drm_dbg_kms(aux->drm_dev, in drm_edp_backlight_probe_max()
4146 aux->name, driver_pwm_freq_hz); in drm_edp_backlight_probe_max()
4157 ret = drm_dp_dpcd_writeb(aux, DP_EDP_PWMGEN_BIT_COUNT, pn); in drm_edp_backlight_probe_max()
4159 drm_dbg_kms(aux->drm_dev, "%s: Failed to write aux pwmgen bit count: %d\n", in drm_edp_backlight_probe_max()
4160 aux->name, ret); in drm_edp_backlight_probe_max()
4168 drm_dbg_kms(aux->drm_dev, "%s: Using backlight frequency from driver (%dHz)\n", in drm_edp_backlight_probe_max()
4169 aux->name, driver_pwm_freq_hz); in drm_edp_backlight_probe_max()
4176 drm_edp_backlight_probe_state(struct drm_dp_aux *aux, struct drm_edp_backlight_info *bl, in drm_edp_backlight_probe_state() argument
4183 ret = drm_dp_dpcd_readb(aux, DP_EDP_BACKLIGHT_MODE_SET_REGISTER, &mode_reg); in drm_edp_backlight_probe_state()
4185 drm_dbg_kms(aux->drm_dev, "%s: Failed to read backlight mode: %d\n", in drm_edp_backlight_probe_state()
4186 aux->name, ret); in drm_edp_backlight_probe_state()
4197 ret = drm_dp_dpcd_read(aux, DP_EDP_BACKLIGHT_BRIGHTNESS_MSB, buf, size); in drm_edp_backlight_probe_state()
4199 drm_dbg_kms(aux->drm_dev, "%s: Failed to read backlight level: %d\n", in drm_edp_backlight_probe_state()
4200 aux->name, ret); in drm_edp_backlight_probe_state()
4220 * @aux: The DP aux device to use for probing
4227 * Initializes a &drm_edp_backlight_info struct by probing @aux for it's backlight capabilities,
4236 drm_edp_backlight_init(struct drm_dp_aux *aux, struct drm_edp_backlight_info *bl, in drm_edp_backlight_init() argument
4251 drm_dbg_kms(aux->drm_dev, in drm_edp_backlight_init()
4252 "%s: Panel supports neither AUX or PWM brightness control? Aborting\n", in drm_edp_backlight_init()
4253 aux->name); in drm_edp_backlight_init()
4257 ret = drm_edp_backlight_probe_max(aux, bl, driver_pwm_freq_hz, edp_dpcd); in drm_edp_backlight_init()
4261 ret = drm_edp_backlight_probe_state(aux, bl, current_mode); in drm_edp_backlight_init()
4266 drm_dbg_kms(aux->drm_dev, in drm_edp_backlight_init()
4268 aux->name, bl->aux_set, bl->aux_enable, *current_mode); in drm_edp_backlight_init()
4270 drm_dbg_kms(aux->drm_dev, in drm_edp_backlight_init()
4272 aux->name, *current_level, bl->max, bl->pwm_freq_pre_divider, in drm_edp_backlight_init()
4291 drm_edp_backlight_enable(bl->aux, &bl->info, brightness); in dp_aux_backlight_update_status()
4295 ret = drm_edp_backlight_set_level(bl->aux, &bl->info, brightness); in dp_aux_backlight_update_status()
4298 drm_edp_backlight_disable(bl->aux, &bl->info); in dp_aux_backlight_update_status()
4311 * drm_panel_dp_aux_backlight - create and use DP AUX backlight
4313 * @aux: The DP AUX channel to use
4316 * supports backlight control over DP AUX channel using DPCD
4326 * control over DP AUX will call this function at probe time.
4334 int drm_panel_dp_aux_backlight(struct drm_panel *panel, struct drm_dp_aux *aux) in drm_panel_dp_aux_backlight() argument
4343 if (!panel || !panel->dev || !aux) in drm_panel_dp_aux_backlight()
4346 ret = drm_dp_dpcd_read(aux, DP_EDP_DPCD_REV, edp_dpcd, in drm_panel_dp_aux_backlight()
4352 DRM_DEV_INFO(panel->dev, "DP AUX backlight is not supported\n"); in drm_panel_dp_aux_backlight()
4360 bl->aux = aux; in drm_panel_dp_aux_backlight()
4362 ret = drm_edp_backlight_init(aux, &bl->info, 0, edp_dpcd, in drm_panel_dp_aux_backlight()