Lines Matching refs:aux

49 static inline u32 msm_dp_read_aux(struct msm_dp_aux_private *aux, u32 offset)  in msm_dp_read_aux()  argument
51 return readl_relaxed(aux->aux_base + offset); in msm_dp_read_aux()
54 static inline void msm_dp_write_aux(struct msm_dp_aux_private *aux, in msm_dp_write_aux() argument
61 writel(data, aux->aux_base + offset); in msm_dp_write_aux()
64 static void msm_dp_aux_clear_hw_interrupts(struct msm_dp_aux_private *aux) in msm_dp_aux_clear_hw_interrupts() argument
66 msm_dp_read_aux(aux, REG_DP_PHY_AUX_INTERRUPT_STATUS); in msm_dp_aux_clear_hw_interrupts()
67 msm_dp_write_aux(aux, REG_DP_PHY_AUX_INTERRUPT_CLEAR, 0x1f); in msm_dp_aux_clear_hw_interrupts()
68 msm_dp_write_aux(aux, REG_DP_PHY_AUX_INTERRUPT_CLEAR, 0x9f); in msm_dp_aux_clear_hw_interrupts()
69 msm_dp_write_aux(aux, REG_DP_PHY_AUX_INTERRUPT_CLEAR, 0); in msm_dp_aux_clear_hw_interrupts()
75 static void msm_dp_aux_reset(struct msm_dp_aux_private *aux) in msm_dp_aux_reset() argument
79 aux_ctrl = msm_dp_read_aux(aux, REG_DP_AUX_CTRL); in msm_dp_aux_reset()
82 msm_dp_write_aux(aux, REG_DP_AUX_CTRL, aux_ctrl); in msm_dp_aux_reset()
86 msm_dp_write_aux(aux, REG_DP_AUX_CTRL, aux_ctrl); in msm_dp_aux_reset()
89 static void msm_dp_aux_enable(struct msm_dp_aux_private *aux) in msm_dp_aux_enable() argument
93 aux_ctrl = msm_dp_read_aux(aux, REG_DP_AUX_CTRL); in msm_dp_aux_enable()
95 msm_dp_write_aux(aux, REG_DP_TIMEOUT_COUNT, 0xffff); in msm_dp_aux_enable()
96 msm_dp_write_aux(aux, REG_DP_AUX_LIMITS, 0xffff); in msm_dp_aux_enable()
99 msm_dp_write_aux(aux, REG_DP_AUX_CTRL, aux_ctrl); in msm_dp_aux_enable()
102 static void msm_dp_aux_disable(struct msm_dp_aux_private *aux) in msm_dp_aux_disable() argument
106 aux_ctrl = msm_dp_read_aux(aux, REG_DP_AUX_CTRL); in msm_dp_aux_disable()
108 msm_dp_write_aux(aux, REG_DP_AUX_CTRL, aux_ctrl); in msm_dp_aux_disable()
111 static int msm_dp_aux_wait_for_hpd_connect_state(struct msm_dp_aux_private *aux, in msm_dp_aux_wait_for_hpd_connect_state() argument
117 return readl_poll_timeout(aux->aux_base + in msm_dp_aux_wait_for_hpd_connect_state()
125 static ssize_t msm_dp_aux_write(struct msm_dp_aux_private *aux, in msm_dp_aux_write() argument
135 if (aux->read) in msm_dp_aux_write()
151 if (aux->read) in msm_dp_aux_write()
166 msm_dp_write_aux(aux, REG_DP_AUX_DATA, reg); in msm_dp_aux_write()
169 msm_dp_write_aux(aux, REG_DP_AUX_TRANS_CTRL, 0); in msm_dp_aux_write()
170 msm_dp_aux_clear_hw_interrupts(aux); in msm_dp_aux_write()
173 if (!aux->native) { /* i2c */ in msm_dp_aux_write()
176 if (aux->no_send_addr) in msm_dp_aux_write()
179 if (aux->no_send_stop) in msm_dp_aux_write()
184 msm_dp_write_aux(aux, REG_DP_AUX_TRANS_CTRL, reg); in msm_dp_aux_write()
189 static ssize_t msm_dp_aux_cmd_fifo_tx(struct msm_dp_aux_private *aux, in msm_dp_aux_cmd_fifo_tx() argument
195 reinit_completion(&aux->comp); in msm_dp_aux_cmd_fifo_tx()
197 ret = msm_dp_aux_write(aux, msg); in msm_dp_aux_cmd_fifo_tx()
201 time_left = wait_for_completion_timeout(&aux->comp, in msm_dp_aux_cmd_fifo_tx()
209 static ssize_t msm_dp_aux_cmd_fifo_rx(struct msm_dp_aux_private *aux, in msm_dp_aux_cmd_fifo_rx() argument
217 data = msm_dp_read_aux(aux, REG_DP_AUX_TRANS_CTRL); in msm_dp_aux_cmd_fifo_rx()
219 msm_dp_write_aux(aux, REG_DP_AUX_TRANS_CTRL, data); in msm_dp_aux_cmd_fifo_rx()
224 msm_dp_write_aux(aux, REG_DP_AUX_DATA, data); in msm_dp_aux_cmd_fifo_rx()
229 data = msm_dp_read_aux(aux, REG_DP_AUX_DATA); in msm_dp_aux_cmd_fifo_rx()
232 data = msm_dp_read_aux(aux, REG_DP_AUX_DATA); in msm_dp_aux_cmd_fifo_rx()
243 static void msm_dp_aux_update_offset_and_segment(struct msm_dp_aux_private *aux, in msm_dp_aux_update_offset_and_segment() argument
252 if (aux->native || i2c_read || ((input_msg->address != edid_address) && in msm_dp_aux_update_offset_and_segment()
259 aux->segment = *data; in msm_dp_aux_update_offset_and_segment()
261 aux->offset = *data; in msm_dp_aux_update_offset_and_segment()
276 static void msm_dp_aux_transfer_helper(struct msm_dp_aux_private *aux, in msm_dp_aux_transfer_helper() argument
297 if (!(aux->offset % edid_block_length) || !send_seg) in msm_dp_aux_transfer_helper()
300 aux->read = false; in msm_dp_aux_transfer_helper()
301 aux->cmd_busy = true; in msm_dp_aux_transfer_helper()
302 aux->no_send_addr = true; in msm_dp_aux_transfer_helper()
303 aux->no_send_stop = true; in msm_dp_aux_transfer_helper()
313 if (aux->segment) { in msm_dp_aux_transfer_helper()
316 helper_msg.buffer = &aux->segment; in msm_dp_aux_transfer_helper()
318 msm_dp_aux_cmd_fifo_tx(aux, &helper_msg); in msm_dp_aux_transfer_helper()
330 helper_msg.buffer = &aux->offset; in msm_dp_aux_transfer_helper()
332 msm_dp_aux_cmd_fifo_tx(aux, &helper_msg); in msm_dp_aux_transfer_helper()
335 aux->offset += message_size; in msm_dp_aux_transfer_helper()
336 if (aux->offset == 0x80 || aux->offset == 0x100) in msm_dp_aux_transfer_helper()
337 aux->segment = 0x0; /* reset segment at end of block */ in msm_dp_aux_transfer_helper()
351 struct msm_dp_aux_private *aux; in msm_dp_aux_transfer() local
353 aux = container_of(msm_dp_aux, struct msm_dp_aux_private, msm_dp_aux); in msm_dp_aux_transfer()
355 aux->native = msg->request & (DP_AUX_NATIVE_WRITE & DP_AUX_NATIVE_READ); in msm_dp_aux_transfer()
359 msg->reply = aux->native ? in msm_dp_aux_transfer()
365 if ((aux->native && msg->size > aux_cmd_native_max) || in msm_dp_aux_transfer()
376 mutex_lock(&aux->mutex); in msm_dp_aux_transfer()
377 if (!aux->initted) { in msm_dp_aux_transfer()
388 if (!aux->is_edp && !aux->enable_xfers) { in msm_dp_aux_transfer()
393 msm_dp_aux_update_offset_and_segment(aux, msg); in msm_dp_aux_transfer()
394 msm_dp_aux_transfer_helper(aux, msg, true); in msm_dp_aux_transfer()
396 aux->read = msg->request & (DP_AUX_I2C_READ & DP_AUX_NATIVE_READ); in msm_dp_aux_transfer()
397 aux->cmd_busy = true; in msm_dp_aux_transfer()
399 if (aux->read) { in msm_dp_aux_transfer()
400 aux->no_send_addr = true; in msm_dp_aux_transfer()
401 aux->no_send_stop = false; in msm_dp_aux_transfer()
403 aux->no_send_addr = true; in msm_dp_aux_transfer()
404 aux->no_send_stop = true; in msm_dp_aux_transfer()
407 ret = msm_dp_aux_cmd_fifo_tx(aux, msg); in msm_dp_aux_transfer()
409 if (aux->native) { in msm_dp_aux_transfer()
410 aux->retry_cnt++; in msm_dp_aux_transfer()
411 if (!(aux->retry_cnt % MAX_AUX_RETRIES)) in msm_dp_aux_transfer()
412 phy_calibrate(aux->phy); in msm_dp_aux_transfer()
416 msm_dp_aux_reset(aux); in msm_dp_aux_transfer()
418 aux->retry_cnt = 0; in msm_dp_aux_transfer()
419 switch (aux->aux_error_num) { in msm_dp_aux_transfer()
421 if (aux->read) in msm_dp_aux_transfer()
422 ret = msm_dp_aux_cmd_fifo_rx(aux, msg); in msm_dp_aux_transfer()
423 msg->reply = aux->native ? DP_AUX_NATIVE_REPLY_ACK : DP_AUX_I2C_REPLY_ACK; in msm_dp_aux_transfer()
426 msg->reply = aux->native ? DP_AUX_NATIVE_REPLY_DEFER : DP_AUX_I2C_REPLY_DEFER; in msm_dp_aux_transfer()
432 msg->reply = aux->native ? DP_AUX_NATIVE_REPLY_NACK : DP_AUX_I2C_REPLY_NACK; in msm_dp_aux_transfer()
440 aux->cmd_busy = false; in msm_dp_aux_transfer()
443 mutex_unlock(&aux->mutex); in msm_dp_aux_transfer()
451 struct msm_dp_aux_private *aux; in msm_dp_aux_isr() local
458 aux = container_of(msm_dp_aux, struct msm_dp_aux_private, msm_dp_aux); in msm_dp_aux_isr()
460 if (!aux->cmd_busy) { in msm_dp_aux_isr()
475 aux->aux_error_num = DP_AUX_ERR_PHY; in msm_dp_aux_isr()
476 msm_dp_aux_clear_hw_interrupts(aux); in msm_dp_aux_isr()
478 aux->aux_error_num = DP_AUX_ERR_NACK_DEFER; in msm_dp_aux_isr()
480 aux->aux_error_num = DP_AUX_ERR_ADDR; in msm_dp_aux_isr()
482 aux->aux_error_num = DP_AUX_ERR_TOUT; in msm_dp_aux_isr()
483 } else if (!aux->native && (isr & DP_INTR_I2C_NACK)) { in msm_dp_aux_isr()
484 aux->aux_error_num = DP_AUX_ERR_NACK; in msm_dp_aux_isr()
485 } else if (!aux->native && (isr & DP_INTR_I2C_DEFER)) { in msm_dp_aux_isr()
487 aux->aux_error_num = DP_AUX_ERR_NACK; in msm_dp_aux_isr()
489 aux->aux_error_num = DP_AUX_ERR_DEFER; in msm_dp_aux_isr()
491 aux->aux_error_num = DP_AUX_ERR_NONE; in msm_dp_aux_isr()
497 complete(&aux->comp); in msm_dp_aux_isr()
504 struct msm_dp_aux_private *aux; in msm_dp_aux_enable_xfers() local
506 aux = container_of(msm_dp_aux, struct msm_dp_aux_private, msm_dp_aux); in msm_dp_aux_enable_xfers()
507 aux->enable_xfers = enabled; in msm_dp_aux_enable_xfers()
512 struct msm_dp_aux_private *aux; in msm_dp_aux_reconfig() local
514 aux = container_of(msm_dp_aux, struct msm_dp_aux_private, msm_dp_aux); in msm_dp_aux_reconfig()
516 phy_calibrate(aux->phy); in msm_dp_aux_reconfig()
517 msm_dp_aux_reset(aux); in msm_dp_aux_reconfig()
522 struct msm_dp_aux_private *aux; in msm_dp_aux_init() local
529 aux = container_of(msm_dp_aux, struct msm_dp_aux_private, msm_dp_aux); in msm_dp_aux_init()
531 mutex_lock(&aux->mutex); in msm_dp_aux_init()
533 msm_dp_aux_enable(aux); in msm_dp_aux_init()
534 aux->retry_cnt = 0; in msm_dp_aux_init()
535 aux->initted = true; in msm_dp_aux_init()
537 mutex_unlock(&aux->mutex); in msm_dp_aux_init()
542 struct msm_dp_aux_private *aux; in msm_dp_aux_deinit() local
544 aux = container_of(msm_dp_aux, struct msm_dp_aux_private, msm_dp_aux); in msm_dp_aux_deinit()
546 mutex_lock(&aux->mutex); in msm_dp_aux_deinit()
548 aux->initted = false; in msm_dp_aux_deinit()
549 msm_dp_aux_disable(aux); in msm_dp_aux_deinit()
551 mutex_unlock(&aux->mutex); in msm_dp_aux_deinit()
582 struct msm_dp_aux_private *aux; in msm_dp_wait_hpd_asserted() local
584 aux = container_of(msm_dp_aux, struct msm_dp_aux_private, msm_dp_aux); in msm_dp_wait_hpd_asserted()
586 ret = pm_runtime_resume_and_get(aux->dev); in msm_dp_wait_hpd_asserted()
590 ret = msm_dp_aux_wait_for_hpd_connect_state(aux, wait_us); in msm_dp_wait_hpd_asserted()
591 pm_runtime_put_sync(aux->dev); in msm_dp_wait_hpd_asserted()
598 struct msm_dp_aux_private *aux = in msm_dp_aux_hpd_enable() local
603 reg = msm_dp_read_aux(aux, REG_DP_DP_HPD_REFTIMER); in msm_dp_aux_hpd_enable()
605 msm_dp_write_aux(aux, REG_DP_DP_HPD_REFTIMER, reg); in msm_dp_aux_hpd_enable()
608 msm_dp_write_aux(aux, REG_DP_DP_HPD_CTRL, DP_DP_HPD_CTRL_HPD_EN); in msm_dp_aux_hpd_enable()
613 struct msm_dp_aux_private *aux = in msm_dp_aux_hpd_disable() local
617 reg = msm_dp_read_aux(aux, REG_DP_DP_HPD_REFTIMER); in msm_dp_aux_hpd_disable()
619 msm_dp_write_aux(aux, REG_DP_DP_HPD_REFTIMER, reg); in msm_dp_aux_hpd_disable()
621 msm_dp_write_aux(aux, REG_DP_DP_HPD_CTRL, 0); in msm_dp_aux_hpd_disable()
626 struct msm_dp_aux_private *aux = in msm_dp_aux_hpd_intr_enable() local
630 reg = msm_dp_read_aux(aux, REG_DP_DP_HPD_INT_MASK); in msm_dp_aux_hpd_intr_enable()
632 msm_dp_write_aux(aux, REG_DP_DP_HPD_INT_MASK, in msm_dp_aux_hpd_intr_enable()
638 struct msm_dp_aux_private *aux = in msm_dp_aux_hpd_intr_disable() local
642 reg = msm_dp_read_aux(aux, REG_DP_DP_HPD_INT_MASK); in msm_dp_aux_hpd_intr_disable()
644 msm_dp_write_aux(aux, REG_DP_DP_HPD_INT_MASK, in msm_dp_aux_hpd_intr_disable()
650 struct msm_dp_aux_private *aux = in msm_dp_aux_get_hpd_intr_status() local
654 isr = msm_dp_read_aux(aux, REG_DP_DP_HPD_INT_STATUS); in msm_dp_aux_get_hpd_intr_status()
655 msm_dp_write_aux(aux, REG_DP_DP_HPD_INT_ACK, in msm_dp_aux_get_hpd_intr_status()
657 mask = msm_dp_read_aux(aux, REG_DP_DP_HPD_INT_MASK); in msm_dp_aux_get_hpd_intr_status()
671 struct msm_dp_aux_private *aux = in msm_dp_aux_is_link_connected() local
675 status = msm_dp_read_aux(aux, REG_DP_DP_HPD_INT_STATUS); in msm_dp_aux_is_link_connected()
687 struct msm_dp_aux_private *aux; in msm_dp_aux_get() local
689 aux = devm_kzalloc(dev, sizeof(*aux), GFP_KERNEL); in msm_dp_aux_get()
690 if (!aux) in msm_dp_aux_get()
693 init_completion(&aux->comp); in msm_dp_aux_get()
694 aux->cmd_busy = false; in msm_dp_aux_get()
695 aux->is_edp = is_edp; in msm_dp_aux_get()
696 mutex_init(&aux->mutex); in msm_dp_aux_get()
698 aux->dev = dev; in msm_dp_aux_get()
699 aux->phy = phy; in msm_dp_aux_get()
700 aux->retry_cnt = 0; in msm_dp_aux_get()
701 aux->aux_base = aux_base; in msm_dp_aux_get()
708 aux->msm_dp_aux.name = "dpu_dp_aux"; in msm_dp_aux_get()
709 aux->msm_dp_aux.dev = dev; in msm_dp_aux_get()
710 aux->msm_dp_aux.transfer = msm_dp_aux_transfer; in msm_dp_aux_get()
711 aux->msm_dp_aux.wait_hpd_asserted = msm_dp_wait_hpd_asserted; in msm_dp_aux_get()
712 drm_dp_aux_init(&aux->msm_dp_aux); in msm_dp_aux_get()
714 return &aux->msm_dp_aux; in msm_dp_aux_get()
719 struct msm_dp_aux_private *aux; in msm_dp_aux_put() local
724 aux = container_of(msm_dp_aux, struct msm_dp_aux_private, msm_dp_aux); in msm_dp_aux_put()
726 mutex_destroy(&aux->mutex); in msm_dp_aux_put()
728 devm_kfree(aux->dev, aux); in msm_dp_aux_put()