Lines Matching refs:aux

47 static ssize_t dp_aux_write(struct dp_aux_private *aux,  in dp_aux_write()  argument
57 if (aux->read) in dp_aux_write()
73 if (aux->read) in dp_aux_write()
88 aux->catalog->aux_data = reg; in dp_aux_write()
89 dp_catalog_aux_write_data(aux->catalog); in dp_aux_write()
92 dp_catalog_aux_clear_trans(aux->catalog, false); in dp_aux_write()
93 dp_catalog_aux_clear_hw_interrupts(aux->catalog); in dp_aux_write()
96 if (!aux->native) { /* i2c */ in dp_aux_write()
99 if (aux->no_send_addr) in dp_aux_write()
102 if (aux->no_send_stop) in dp_aux_write()
107 aux->catalog->aux_data = reg; in dp_aux_write()
108 dp_catalog_aux_write_trans(aux->catalog); in dp_aux_write()
113 static ssize_t dp_aux_cmd_fifo_tx(struct dp_aux_private *aux, in dp_aux_cmd_fifo_tx() argument
119 reinit_completion(&aux->comp); in dp_aux_cmd_fifo_tx()
121 ret = dp_aux_write(aux, msg); in dp_aux_cmd_fifo_tx()
125 time_left = wait_for_completion_timeout(&aux->comp, in dp_aux_cmd_fifo_tx()
133 static ssize_t dp_aux_cmd_fifo_rx(struct dp_aux_private *aux, in dp_aux_cmd_fifo_rx() argument
141 dp_catalog_aux_clear_trans(aux->catalog, true); in dp_aux_cmd_fifo_rx()
146 aux->catalog->aux_data = data; in dp_aux_cmd_fifo_rx()
147 dp_catalog_aux_write_data(aux->catalog); in dp_aux_cmd_fifo_rx()
152 data = dp_catalog_aux_read_data(aux->catalog); in dp_aux_cmd_fifo_rx()
155 data = dp_catalog_aux_read_data(aux->catalog); in dp_aux_cmd_fifo_rx()
166 static void dp_aux_update_offset_and_segment(struct dp_aux_private *aux, in dp_aux_update_offset_and_segment() argument
175 if (aux->native || i2c_read || ((input_msg->address != edid_address) && in dp_aux_update_offset_and_segment()
182 aux->segment = *data; in dp_aux_update_offset_and_segment()
184 aux->offset = *data; in dp_aux_update_offset_and_segment()
199 static void dp_aux_transfer_helper(struct dp_aux_private *aux, in dp_aux_transfer_helper() argument
220 if (!(aux->offset % edid_block_length) || !send_seg) in dp_aux_transfer_helper()
223 aux->read = false; in dp_aux_transfer_helper()
224 aux->cmd_busy = true; in dp_aux_transfer_helper()
225 aux->no_send_addr = true; in dp_aux_transfer_helper()
226 aux->no_send_stop = true; in dp_aux_transfer_helper()
236 if (aux->segment) { in dp_aux_transfer_helper()
239 helper_msg.buffer = &aux->segment; in dp_aux_transfer_helper()
241 dp_aux_cmd_fifo_tx(aux, &helper_msg); in dp_aux_transfer_helper()
253 helper_msg.buffer = &aux->offset; in dp_aux_transfer_helper()
255 dp_aux_cmd_fifo_tx(aux, &helper_msg); in dp_aux_transfer_helper()
258 aux->offset += message_size; in dp_aux_transfer_helper()
259 if (aux->offset == 0x80 || aux->offset == 0x100) in dp_aux_transfer_helper()
260 aux->segment = 0x0; /* reset segment at end of block */ in dp_aux_transfer_helper()
274 struct dp_aux_private *aux; in dp_aux_transfer() local
276 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_transfer()
278 aux->native = msg->request & (DP_AUX_NATIVE_WRITE & DP_AUX_NATIVE_READ); in dp_aux_transfer()
282 msg->reply = aux->native ? in dp_aux_transfer()
288 if ((aux->native && msg->size > aux_cmd_native_max) || in dp_aux_transfer()
295 mutex_lock(&aux->mutex); in dp_aux_transfer()
296 if (!aux->initted) { in dp_aux_transfer()
307 if (!aux->is_edp && !aux->enable_xfers) { in dp_aux_transfer()
320 if (aux->is_edp) { in dp_aux_transfer()
321 ret = dp_catalog_aux_wait_for_hpd_connect_state(aux->catalog); in dp_aux_transfer()
328 dp_aux_update_offset_and_segment(aux, msg); in dp_aux_transfer()
329 dp_aux_transfer_helper(aux, msg, true); in dp_aux_transfer()
331 aux->read = msg->request & (DP_AUX_I2C_READ & DP_AUX_NATIVE_READ); in dp_aux_transfer()
332 aux->cmd_busy = true; in dp_aux_transfer()
334 if (aux->read) { in dp_aux_transfer()
335 aux->no_send_addr = true; in dp_aux_transfer()
336 aux->no_send_stop = false; in dp_aux_transfer()
338 aux->no_send_addr = true; in dp_aux_transfer()
339 aux->no_send_stop = true; in dp_aux_transfer()
342 ret = dp_aux_cmd_fifo_tx(aux, msg); in dp_aux_transfer()
344 if (aux->native) { in dp_aux_transfer()
345 aux->retry_cnt++; in dp_aux_transfer()
346 if (!(aux->retry_cnt % MAX_AUX_RETRIES)) in dp_aux_transfer()
347 dp_catalog_aux_update_cfg(aux->catalog); in dp_aux_transfer()
350 if (dp_catalog_link_is_connected(aux->catalog)) in dp_aux_transfer()
351 dp_catalog_aux_reset(aux->catalog); in dp_aux_transfer()
353 aux->retry_cnt = 0; in dp_aux_transfer()
354 switch (aux->aux_error_num) { in dp_aux_transfer()
356 if (aux->read) in dp_aux_transfer()
357 ret = dp_aux_cmd_fifo_rx(aux, msg); in dp_aux_transfer()
358 msg->reply = aux->native ? DP_AUX_NATIVE_REPLY_ACK : DP_AUX_I2C_REPLY_ACK; in dp_aux_transfer()
361 msg->reply = aux->native ? DP_AUX_NATIVE_REPLY_DEFER : DP_AUX_I2C_REPLY_DEFER; in dp_aux_transfer()
367 msg->reply = aux->native ? DP_AUX_NATIVE_REPLY_NACK : DP_AUX_I2C_REPLY_NACK; in dp_aux_transfer()
375 aux->cmd_busy = false; in dp_aux_transfer()
378 mutex_unlock(&aux->mutex); in dp_aux_transfer()
386 struct dp_aux_private *aux; in dp_aux_isr() local
393 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_isr()
395 isr = dp_catalog_aux_get_irq(aux->catalog); in dp_aux_isr()
401 if (!aux->cmd_busy) { in dp_aux_isr()
416 aux->aux_error_num = DP_AUX_ERR_PHY; in dp_aux_isr()
417 dp_catalog_aux_clear_hw_interrupts(aux->catalog); in dp_aux_isr()
419 aux->aux_error_num = DP_AUX_ERR_NACK_DEFER; in dp_aux_isr()
421 aux->aux_error_num = DP_AUX_ERR_ADDR; in dp_aux_isr()
423 aux->aux_error_num = DP_AUX_ERR_TOUT; in dp_aux_isr()
424 } else if (!aux->native && (isr & DP_INTR_I2C_NACK)) { in dp_aux_isr()
425 aux->aux_error_num = DP_AUX_ERR_NACK; in dp_aux_isr()
426 } else if (!aux->native && (isr & DP_INTR_I2C_DEFER)) { in dp_aux_isr()
428 aux->aux_error_num = DP_AUX_ERR_NACK; in dp_aux_isr()
430 aux->aux_error_num = DP_AUX_ERR_DEFER; in dp_aux_isr()
432 aux->aux_error_num = DP_AUX_ERR_NONE; in dp_aux_isr()
438 complete(&aux->comp); in dp_aux_isr()
445 struct dp_aux_private *aux; in dp_aux_enable_xfers() local
447 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_enable_xfers()
448 aux->enable_xfers = enabled; in dp_aux_enable_xfers()
453 struct dp_aux_private *aux; in dp_aux_reconfig() local
455 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_reconfig()
457 dp_catalog_aux_update_cfg(aux->catalog); in dp_aux_reconfig()
458 dp_catalog_aux_reset(aux->catalog); in dp_aux_reconfig()
463 struct dp_aux_private *aux; in dp_aux_init() local
470 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_init()
472 mutex_lock(&aux->mutex); in dp_aux_init()
474 dp_catalog_aux_enable(aux->catalog, true); in dp_aux_init()
475 aux->retry_cnt = 0; in dp_aux_init()
476 aux->initted = true; in dp_aux_init()
478 mutex_unlock(&aux->mutex); in dp_aux_init()
483 struct dp_aux_private *aux; in dp_aux_deinit() local
485 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_deinit()
487 mutex_lock(&aux->mutex); in dp_aux_deinit()
489 aux->initted = false; in dp_aux_deinit()
490 dp_catalog_aux_enable(aux->catalog, false); in dp_aux_deinit()
492 mutex_unlock(&aux->mutex); in dp_aux_deinit()
497 struct dp_aux_private *aux; in dp_aux_register() local
505 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_register()
507 aux->dp_aux.name = "dpu_dp_aux"; in dp_aux_register()
508 aux->dp_aux.dev = aux->dev; in dp_aux_register()
509 aux->dp_aux.transfer = dp_aux_transfer; in dp_aux_register()
510 ret = drm_dp_aux_register(&aux->dp_aux); in dp_aux_register()
528 struct dp_aux_private *aux; in dp_aux_get() local
535 aux = devm_kzalloc(dev, sizeof(*aux), GFP_KERNEL); in dp_aux_get()
536 if (!aux) in dp_aux_get()
539 init_completion(&aux->comp); in dp_aux_get()
540 aux->cmd_busy = false; in dp_aux_get()
541 aux->is_edp = is_edp; in dp_aux_get()
542 mutex_init(&aux->mutex); in dp_aux_get()
544 aux->dev = dev; in dp_aux_get()
545 aux->catalog = catalog; in dp_aux_get()
546 aux->retry_cnt = 0; in dp_aux_get()
548 return &aux->dp_aux; in dp_aux_get()
553 struct dp_aux_private *aux; in dp_aux_put() local
558 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_put()
560 mutex_destroy(&aux->mutex); in dp_aux_put()
562 devm_kfree(aux->dev, aux); in dp_aux_put()