Lines Matching full:aux
55 static u32 dp_aux_write(struct dp_aux_private *aux, in dp_aux_write() argument
63 if (aux->read) in dp_aux_write()
79 if (aux->read) in dp_aux_write()
93 aux->catalog->aux_data = reg; in dp_aux_write()
94 dp_catalog_aux_write_data(aux->catalog); in dp_aux_write()
97 dp_catalog_aux_clear_trans(aux->catalog, false); in dp_aux_write()
98 dp_catalog_aux_clear_hw_interrupts(aux->catalog); in dp_aux_write()
101 if (!aux->native) { /* i2c */ in dp_aux_write()
104 if (aux->no_send_addr) in dp_aux_write()
107 if (aux->no_send_stop) in dp_aux_write()
112 aux->catalog->aux_data = reg; in dp_aux_write()
113 dp_catalog_aux_write_trans(aux->catalog); in dp_aux_write()
118 static int dp_aux_cmd_fifo_tx(struct dp_aux_private *aux, in dp_aux_cmd_fifo_tx() argument
124 reinit_completion(&aux->comp); in dp_aux_cmd_fifo_tx()
126 len = dp_aux_write(aux, msg); in dp_aux_cmd_fifo_tx()
128 DRM_ERROR("DP AUX write failed\n"); in dp_aux_cmd_fifo_tx()
132 timeout = wait_for_completion_timeout(&aux->comp, aux_timeout_ms); in dp_aux_cmd_fifo_tx()
134 DRM_ERROR("aux %s timeout\n", (aux->read ? "read" : "write")); in dp_aux_cmd_fifo_tx()
138 if (aux->aux_error_num == DP_AUX_ERR_NONE) { in dp_aux_cmd_fifo_tx()
141 DRM_ERROR_RATELIMITED("aux err: %s\n", in dp_aux_cmd_fifo_tx()
142 dp_aux_get_error(aux->aux_error_num)); in dp_aux_cmd_fifo_tx()
150 static void dp_aux_cmd_fifo_rx(struct dp_aux_private *aux, in dp_aux_cmd_fifo_rx() argument
158 dp_catalog_aux_clear_trans(aux->catalog, true); in dp_aux_cmd_fifo_rx()
163 aux->catalog->aux_data = data; in dp_aux_cmd_fifo_rx()
164 dp_catalog_aux_write_data(aux->catalog); in dp_aux_cmd_fifo_rx()
169 data = dp_catalog_aux_read_data(aux->catalog); in dp_aux_cmd_fifo_rx()
172 data = dp_catalog_aux_read_data(aux->catalog); in dp_aux_cmd_fifo_rx()
182 static void dp_aux_native_handler(struct dp_aux_private *aux) in dp_aux_native_handler() argument
184 u32 isr = aux->isr; in dp_aux_native_handler()
187 aux->aux_error_num = DP_AUX_ERR_NONE; in dp_aux_native_handler()
189 aux->aux_error_num = DP_AUX_ERR_ADDR; in dp_aux_native_handler()
191 aux->aux_error_num = DP_AUX_ERR_TOUT; in dp_aux_native_handler()
193 aux->aux_error_num = DP_AUX_ERR_NACK; in dp_aux_native_handler()
195 aux->aux_error_num = DP_AUX_ERR_PHY; in dp_aux_native_handler()
196 dp_catalog_aux_clear_hw_interrupts(aux->catalog); in dp_aux_native_handler()
199 complete(&aux->comp); in dp_aux_native_handler()
202 static void dp_aux_i2c_handler(struct dp_aux_private *aux) in dp_aux_i2c_handler() argument
204 u32 isr = aux->isr; in dp_aux_i2c_handler()
208 aux->aux_error_num = DP_AUX_ERR_NACK; in dp_aux_i2c_handler()
210 aux->aux_error_num = DP_AUX_ERR_NONE; in dp_aux_i2c_handler()
213 aux->aux_error_num = DP_AUX_ERR_ADDR; in dp_aux_i2c_handler()
215 aux->aux_error_num = DP_AUX_ERR_TOUT; in dp_aux_i2c_handler()
217 aux->aux_error_num = DP_AUX_ERR_NACK_DEFER; in dp_aux_i2c_handler()
219 aux->aux_error_num = DP_AUX_ERR_NACK; in dp_aux_i2c_handler()
221 aux->aux_error_num = DP_AUX_ERR_DEFER; in dp_aux_i2c_handler()
223 aux->aux_error_num = DP_AUX_ERR_PHY; in dp_aux_i2c_handler()
224 dp_catalog_aux_clear_hw_interrupts(aux->catalog); in dp_aux_i2c_handler()
228 complete(&aux->comp); in dp_aux_i2c_handler()
231 static void dp_aux_update_offset_and_segment(struct dp_aux_private *aux, in dp_aux_update_offset_and_segment() argument
240 if (aux->native || i2c_read || ((input_msg->address != edid_address) && in dp_aux_update_offset_and_segment()
247 aux->segment = *data; in dp_aux_update_offset_and_segment()
249 aux->offset = *data; in dp_aux_update_offset_and_segment()
255 * @aux: DP AUX private structure
264 static void dp_aux_transfer_helper(struct dp_aux_private *aux, in dp_aux_transfer_helper() argument
282 * duplicate AUX transactions related to this while reading the in dp_aux_transfer_helper()
285 if (!(aux->offset % edid_block_length) || !send_seg) in dp_aux_transfer_helper()
288 aux->read = false; in dp_aux_transfer_helper()
289 aux->cmd_busy = true; in dp_aux_transfer_helper()
290 aux->no_send_addr = true; in dp_aux_transfer_helper()
291 aux->no_send_stop = true; in dp_aux_transfer_helper()
301 if (aux->segment) { in dp_aux_transfer_helper()
304 helper_msg.buffer = &aux->segment; in dp_aux_transfer_helper()
306 dp_aux_cmd_fifo_tx(aux, &helper_msg); in dp_aux_transfer_helper()
314 * native AUX transfer function. in dp_aux_transfer_helper()
318 helper_msg.buffer = &aux->offset; in dp_aux_transfer_helper()
320 dp_aux_cmd_fifo_tx(aux, &helper_msg); in dp_aux_transfer_helper()
323 aux->offset += message_size; in dp_aux_transfer_helper()
324 if (aux->offset == 0x80 || aux->offset == 0x100) in dp_aux_transfer_helper()
325 aux->segment = 0x0; /* reset segment at end of block */ in dp_aux_transfer_helper()
329 * This function does the real job to process an AUX transaction.
330 * It will call aux_reset() function to reset the AUX channel,
340 struct dp_aux_private *aux = container_of(dp_aux, in dp_aux_transfer() local
343 mutex_lock(&aux->mutex); in dp_aux_transfer()
345 aux->native = msg->request & (DP_AUX_NATIVE_WRITE & DP_AUX_NATIVE_READ); in dp_aux_transfer()
349 msg->reply = aux->native ? in dp_aux_transfer()
356 if ((aux->native && (msg->size > aux_cmd_native_max)) || in dp_aux_transfer()
364 dp_aux_update_offset_and_segment(aux, msg); in dp_aux_transfer()
365 dp_aux_transfer_helper(aux, msg, true); in dp_aux_transfer()
367 aux->read = msg->request & (DP_AUX_I2C_READ & DP_AUX_NATIVE_READ); in dp_aux_transfer()
368 aux->cmd_busy = true; in dp_aux_transfer()
370 if (aux->read) { in dp_aux_transfer()
371 aux->no_send_addr = true; in dp_aux_transfer()
372 aux->no_send_stop = false; in dp_aux_transfer()
374 aux->no_send_addr = true; in dp_aux_transfer()
375 aux->no_send_stop = true; in dp_aux_transfer()
378 ret = dp_aux_cmd_fifo_tx(aux, msg); in dp_aux_transfer()
381 if (aux->native) { in dp_aux_transfer()
382 aux->retry_cnt++; in dp_aux_transfer()
383 if (!(aux->retry_cnt % retry_count)) in dp_aux_transfer()
384 dp_catalog_aux_update_cfg(aux->catalog); in dp_aux_transfer()
385 dp_catalog_aux_reset(aux->catalog); in dp_aux_transfer()
391 if (aux->aux_error_num == DP_AUX_ERR_NONE) { in dp_aux_transfer()
392 if (aux->read) in dp_aux_transfer()
393 dp_aux_cmd_fifo_rx(aux, msg); in dp_aux_transfer()
395 msg->reply = aux->native ? in dp_aux_transfer()
399 msg->reply = aux->native ? in dp_aux_transfer()
405 aux->retry_cnt = 0; in dp_aux_transfer()
408 aux->cmd_busy = false; in dp_aux_transfer()
409 mutex_unlock(&aux->mutex); in dp_aux_transfer()
415 struct dp_aux_private *aux; in dp_aux_isr() local
422 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_isr()
424 aux->isr = dp_catalog_aux_get_irq(aux->catalog); in dp_aux_isr()
426 if (!aux->cmd_busy) in dp_aux_isr()
429 if (aux->native) in dp_aux_isr()
430 dp_aux_native_handler(aux); in dp_aux_isr()
432 dp_aux_i2c_handler(aux); in dp_aux_isr()
437 struct dp_aux_private *aux; in dp_aux_reconfig() local
439 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_reconfig()
441 dp_catalog_aux_update_cfg(aux->catalog); in dp_aux_reconfig()
442 dp_catalog_aux_reset(aux->catalog); in dp_aux_reconfig()
447 struct dp_aux_private *aux; in dp_aux_init() local
454 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_init()
456 dp_catalog_aux_enable(aux->catalog, true); in dp_aux_init()
457 aux->retry_cnt = 0; in dp_aux_init()
462 struct dp_aux_private *aux; in dp_aux_deinit() local
464 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_deinit()
466 dp_catalog_aux_enable(aux->catalog, false); in dp_aux_deinit()
471 struct dp_aux_private *aux; in dp_aux_register() local
479 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_register()
481 aux->dp_aux.name = "dpu_dp_aux"; in dp_aux_register()
482 aux->dp_aux.dev = aux->dev; in dp_aux_register()
483 aux->dp_aux.transfer = dp_aux_transfer; in dp_aux_register()
484 ret = drm_dp_aux_register(&aux->dp_aux); in dp_aux_register()
486 DRM_ERROR("%s: failed to register drm aux: %d\n", __func__, in dp_aux_register()
501 struct dp_aux_private *aux; in dp_aux_get() local
508 aux = devm_kzalloc(dev, sizeof(*aux), GFP_KERNEL); in dp_aux_get()
509 if (!aux) in dp_aux_get()
512 init_completion(&aux->comp); in dp_aux_get()
513 aux->cmd_busy = false; in dp_aux_get()
514 mutex_init(&aux->mutex); in dp_aux_get()
516 aux->dev = dev; in dp_aux_get()
517 aux->catalog = catalog; in dp_aux_get()
518 aux->retry_cnt = 0; in dp_aux_get()
520 return &aux->dp_aux; in dp_aux_get()
525 struct dp_aux_private *aux; in dp_aux_put() local
530 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_put()
532 mutex_destroy(&aux->mutex); in dp_aux_put()
534 devm_kfree(aux->dev, aux); in dp_aux_put()