Lines Matching full:aux

46 static ssize_t dp_aux_write(struct dp_aux_private *aux,  in dp_aux_write()  argument
56 if (aux->read) in dp_aux_write()
72 if (aux->read) in dp_aux_write()
87 aux->catalog->aux_data = reg; in dp_aux_write()
88 dp_catalog_aux_write_data(aux->catalog); in dp_aux_write()
91 dp_catalog_aux_clear_trans(aux->catalog, false); in dp_aux_write()
92 dp_catalog_aux_clear_hw_interrupts(aux->catalog); in dp_aux_write()
95 if (!aux->native) { /* i2c */ in dp_aux_write()
98 if (aux->no_send_addr) in dp_aux_write()
101 if (aux->no_send_stop) in dp_aux_write()
106 aux->catalog->aux_data = reg; in dp_aux_write()
107 dp_catalog_aux_write_trans(aux->catalog); in dp_aux_write()
112 static ssize_t dp_aux_cmd_fifo_tx(struct dp_aux_private *aux, in dp_aux_cmd_fifo_tx() argument
118 reinit_completion(&aux->comp); in dp_aux_cmd_fifo_tx()
120 ret = dp_aux_write(aux, msg); in dp_aux_cmd_fifo_tx()
124 time_left = wait_for_completion_timeout(&aux->comp, in dp_aux_cmd_fifo_tx()
132 static ssize_t dp_aux_cmd_fifo_rx(struct dp_aux_private *aux, in dp_aux_cmd_fifo_rx() argument
140 dp_catalog_aux_clear_trans(aux->catalog, true); in dp_aux_cmd_fifo_rx()
145 aux->catalog->aux_data = data; in dp_aux_cmd_fifo_rx()
146 dp_catalog_aux_write_data(aux->catalog); in dp_aux_cmd_fifo_rx()
151 data = dp_catalog_aux_read_data(aux->catalog); in dp_aux_cmd_fifo_rx()
154 data = dp_catalog_aux_read_data(aux->catalog); in dp_aux_cmd_fifo_rx()
165 static void dp_aux_update_offset_and_segment(struct dp_aux_private *aux, in dp_aux_update_offset_and_segment() argument
174 if (aux->native || i2c_read || ((input_msg->address != edid_address) && in dp_aux_update_offset_and_segment()
181 aux->segment = *data; in dp_aux_update_offset_and_segment()
183 aux->offset = *data; in dp_aux_update_offset_and_segment()
189 * @aux: DP AUX private structure
198 static void dp_aux_transfer_helper(struct dp_aux_private *aux, in dp_aux_transfer_helper() argument
216 * duplicate AUX transactions related to this while reading the in dp_aux_transfer_helper()
219 if (!(aux->offset % edid_block_length) || !send_seg) in dp_aux_transfer_helper()
222 aux->read = false; in dp_aux_transfer_helper()
223 aux->cmd_busy = true; in dp_aux_transfer_helper()
224 aux->no_send_addr = true; in dp_aux_transfer_helper()
225 aux->no_send_stop = true; in dp_aux_transfer_helper()
235 if (aux->segment) { in dp_aux_transfer_helper()
238 helper_msg.buffer = &aux->segment; in dp_aux_transfer_helper()
240 dp_aux_cmd_fifo_tx(aux, &helper_msg); in dp_aux_transfer_helper()
248 * native AUX transfer function. in dp_aux_transfer_helper()
252 helper_msg.buffer = &aux->offset; in dp_aux_transfer_helper()
254 dp_aux_cmd_fifo_tx(aux, &helper_msg); in dp_aux_transfer_helper()
257 aux->offset += message_size; in dp_aux_transfer_helper()
258 if (aux->offset == 0x80 || aux->offset == 0x100) in dp_aux_transfer_helper()
259 aux->segment = 0x0; /* reset segment at end of block */ in dp_aux_transfer_helper()
263 * This function does the real job to process an AUX transaction.
264 * It will call aux_reset() function to reset the AUX channel,
273 struct dp_aux_private *aux; in dp_aux_transfer() local
275 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_transfer()
277 aux->native = msg->request & (DP_AUX_NATIVE_WRITE & DP_AUX_NATIVE_READ); in dp_aux_transfer()
281 msg->reply = aux->native ? in dp_aux_transfer()
287 if ((aux->native && msg->size > aux_cmd_native_max) || in dp_aux_transfer()
298 mutex_lock(&aux->mutex); in dp_aux_transfer()
299 if (!aux->initted) { in dp_aux_transfer()
307 * turned on the panel and then tried to do an AUX transfer. The panel in dp_aux_transfer()
312 if (aux->is_edp) { in dp_aux_transfer()
313 ret = dp_catalog_aux_wait_for_hpd_connect_state(aux->catalog); in dp_aux_transfer()
315 DRM_DEBUG_DP("Panel not ready for aux transactions\n"); in dp_aux_transfer()
320 dp_aux_update_offset_and_segment(aux, msg); in dp_aux_transfer()
321 dp_aux_transfer_helper(aux, msg, true); in dp_aux_transfer()
323 aux->read = msg->request & (DP_AUX_I2C_READ & DP_AUX_NATIVE_READ); in dp_aux_transfer()
324 aux->cmd_busy = true; in dp_aux_transfer()
326 if (aux->read) { in dp_aux_transfer()
327 aux->no_send_addr = true; in dp_aux_transfer()
328 aux->no_send_stop = false; in dp_aux_transfer()
330 aux->no_send_addr = true; in dp_aux_transfer()
331 aux->no_send_stop = true; in dp_aux_transfer()
334 ret = dp_aux_cmd_fifo_tx(aux, msg); in dp_aux_transfer()
336 if (aux->native) { in dp_aux_transfer()
337 aux->retry_cnt++; in dp_aux_transfer()
338 if (!(aux->retry_cnt % MAX_AUX_RETRIES)) in dp_aux_transfer()
339 dp_catalog_aux_update_cfg(aux->catalog); in dp_aux_transfer()
341 /* reset aux if link is in connected state */ in dp_aux_transfer()
342 if (dp_catalog_link_is_connected(aux->catalog)) in dp_aux_transfer()
343 dp_catalog_aux_reset(aux->catalog); in dp_aux_transfer()
345 aux->retry_cnt = 0; in dp_aux_transfer()
346 switch (aux->aux_error_num) { in dp_aux_transfer()
348 if (aux->read) in dp_aux_transfer()
349 ret = dp_aux_cmd_fifo_rx(aux, msg); in dp_aux_transfer()
350 msg->reply = aux->native ? DP_AUX_NATIVE_REPLY_ACK : DP_AUX_I2C_REPLY_ACK; in dp_aux_transfer()
353 msg->reply = aux->native ? DP_AUX_NATIVE_REPLY_DEFER : DP_AUX_I2C_REPLY_DEFER; in dp_aux_transfer()
359 msg->reply = aux->native ? DP_AUX_NATIVE_REPLY_NACK : DP_AUX_I2C_REPLY_NACK; in dp_aux_transfer()
367 aux->cmd_busy = false; in dp_aux_transfer()
370 mutex_unlock(&aux->mutex); in dp_aux_transfer()
379 struct dp_aux_private *aux; in dp_aux_isr() local
386 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_isr()
388 isr = dp_catalog_aux_get_irq(aux->catalog); in dp_aux_isr()
394 if (!aux->cmd_busy) { in dp_aux_isr()
395 DRM_ERROR("Unexpected DP AUX IRQ %#010x when not busy\n", isr); in dp_aux_isr()
406 DRM_WARN("Some DP AUX interrupts unhandled: %#010x\n", isr); in dp_aux_isr()
409 aux->aux_error_num = DP_AUX_ERR_PHY; in dp_aux_isr()
410 dp_catalog_aux_clear_hw_interrupts(aux->catalog); in dp_aux_isr()
412 aux->aux_error_num = DP_AUX_ERR_NACK_DEFER; in dp_aux_isr()
414 aux->aux_error_num = DP_AUX_ERR_ADDR; in dp_aux_isr()
416 aux->aux_error_num = DP_AUX_ERR_TOUT; in dp_aux_isr()
417 } else if (!aux->native && (isr & DP_INTR_I2C_NACK)) { in dp_aux_isr()
418 aux->aux_error_num = DP_AUX_ERR_NACK; in dp_aux_isr()
419 } else if (!aux->native && (isr & DP_INTR_I2C_DEFER)) { in dp_aux_isr()
421 aux->aux_error_num = DP_AUX_ERR_NACK; in dp_aux_isr()
423 aux->aux_error_num = DP_AUX_ERR_DEFER; in dp_aux_isr()
425 aux->aux_error_num = DP_AUX_ERR_NONE; in dp_aux_isr()
431 complete(&aux->comp); in dp_aux_isr()
438 struct dp_aux_private *aux; in dp_aux_reconfig() local
440 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_reconfig()
442 dp_catalog_aux_update_cfg(aux->catalog); in dp_aux_reconfig()
443 dp_catalog_aux_reset(aux->catalog); in dp_aux_reconfig()
448 struct dp_aux_private *aux; in dp_aux_init() local
455 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_init()
457 mutex_lock(&aux->mutex); in dp_aux_init()
459 dp_catalog_aux_enable(aux->catalog, true); in dp_aux_init()
460 aux->retry_cnt = 0; in dp_aux_init()
461 aux->initted = true; in dp_aux_init()
463 mutex_unlock(&aux->mutex); in dp_aux_init()
468 struct dp_aux_private *aux; in dp_aux_deinit() local
470 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_deinit()
472 mutex_lock(&aux->mutex); in dp_aux_deinit()
474 aux->initted = false; in dp_aux_deinit()
475 dp_catalog_aux_enable(aux->catalog, false); in dp_aux_deinit()
477 mutex_unlock(&aux->mutex); in dp_aux_deinit()
491 DRM_ERROR("%s: failed to register drm aux: %d\n", __func__, in dp_aux_register()
508 struct dp_aux_private *aux; in dp_wait_hpd_asserted() local
510 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_wait_hpd_asserted()
512 pm_runtime_get_sync(aux->dev); in dp_wait_hpd_asserted()
513 ret = dp_catalog_aux_wait_for_hpd_connect_state(aux->catalog); in dp_wait_hpd_asserted()
514 pm_runtime_put_sync(aux->dev); in dp_wait_hpd_asserted()
522 struct dp_aux_private *aux; in dp_aux_get() local
529 aux = devm_kzalloc(dev, sizeof(*aux), GFP_KERNEL); in dp_aux_get()
530 if (!aux) in dp_aux_get()
533 init_completion(&aux->comp); in dp_aux_get()
534 aux->cmd_busy = false; in dp_aux_get()
535 aux->is_edp = is_edp; in dp_aux_get()
536 mutex_init(&aux->mutex); in dp_aux_get()
538 aux->dev = dev; in dp_aux_get()
539 aux->catalog = catalog; in dp_aux_get()
540 aux->retry_cnt = 0; in dp_aux_get()
543 * Use the drm_dp_aux_init() to use the aux adapter in dp_aux_get()
544 * before registering AUX with the DRM device so that in dp_aux_get()
547 aux->dp_aux.name = "dpu_dp_aux"; in dp_aux_get()
548 aux->dp_aux.dev = dev; in dp_aux_get()
549 aux->dp_aux.transfer = dp_aux_transfer; in dp_aux_get()
550 aux->dp_aux.wait_hpd_asserted = dp_wait_hpd_asserted; in dp_aux_get()
551 drm_dp_aux_init(&aux->dp_aux); in dp_aux_get()
553 return &aux->dp_aux; in dp_aux_get()
558 struct dp_aux_private *aux; in dp_aux_put() local
563 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_put()
565 mutex_destroy(&aux->mutex); in dp_aux_put()
567 devm_kfree(aux->dev, aux); in dp_aux_put()