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_native_handler(struct dp_aux_private *aux, u32 isr) in dp_aux_native_handler() argument
168 aux->aux_error_num = DP_AUX_ERR_NONE; in dp_aux_native_handler()
170 aux->aux_error_num = DP_AUX_ERR_ADDR; in dp_aux_native_handler()
172 aux->aux_error_num = DP_AUX_ERR_TOUT; in dp_aux_native_handler()
174 aux->aux_error_num = DP_AUX_ERR_NACK; in dp_aux_native_handler()
176 aux->aux_error_num = DP_AUX_ERR_PHY; in dp_aux_native_handler()
177 dp_catalog_aux_clear_hw_interrupts(aux->catalog); in dp_aux_native_handler()
181 static void dp_aux_i2c_handler(struct dp_aux_private *aux, u32 isr) in dp_aux_i2c_handler() argument
185 aux->aux_error_num = DP_AUX_ERR_NACK; in dp_aux_i2c_handler()
187 aux->aux_error_num = DP_AUX_ERR_NONE; in dp_aux_i2c_handler()
190 aux->aux_error_num = DP_AUX_ERR_ADDR; in dp_aux_i2c_handler()
192 aux->aux_error_num = DP_AUX_ERR_TOUT; in dp_aux_i2c_handler()
194 aux->aux_error_num = DP_AUX_ERR_NACK_DEFER; in dp_aux_i2c_handler()
196 aux->aux_error_num = DP_AUX_ERR_NACK; in dp_aux_i2c_handler()
198 aux->aux_error_num = DP_AUX_ERR_DEFER; in dp_aux_i2c_handler()
200 aux->aux_error_num = DP_AUX_ERR_PHY; in dp_aux_i2c_handler()
201 dp_catalog_aux_clear_hw_interrupts(aux->catalog); in dp_aux_i2c_handler()
206 static void dp_aux_update_offset_and_segment(struct dp_aux_private *aux, in dp_aux_update_offset_and_segment() argument
215 if (aux->native || i2c_read || ((input_msg->address != edid_address) && in dp_aux_update_offset_and_segment()
222 aux->segment = *data; in dp_aux_update_offset_and_segment()
224 aux->offset = *data; in dp_aux_update_offset_and_segment()
230 * @aux: DP AUX private structure
239 static void dp_aux_transfer_helper(struct dp_aux_private *aux, in dp_aux_transfer_helper() argument
257 * duplicate AUX transactions related to this while reading the in dp_aux_transfer_helper()
260 if (!(aux->offset % edid_block_length) || !send_seg) in dp_aux_transfer_helper()
263 aux->read = false; in dp_aux_transfer_helper()
264 aux->cmd_busy = true; in dp_aux_transfer_helper()
265 aux->no_send_addr = true; in dp_aux_transfer_helper()
266 aux->no_send_stop = true; in dp_aux_transfer_helper()
276 if (aux->segment) { in dp_aux_transfer_helper()
279 helper_msg.buffer = &aux->segment; in dp_aux_transfer_helper()
281 dp_aux_cmd_fifo_tx(aux, &helper_msg); in dp_aux_transfer_helper()
289 * native AUX transfer function. in dp_aux_transfer_helper()
293 helper_msg.buffer = &aux->offset; in dp_aux_transfer_helper()
295 dp_aux_cmd_fifo_tx(aux, &helper_msg); in dp_aux_transfer_helper()
298 aux->offset += message_size; in dp_aux_transfer_helper()
299 if (aux->offset == 0x80 || aux->offset == 0x100) in dp_aux_transfer_helper()
300 aux->segment = 0x0; /* reset segment at end of block */ in dp_aux_transfer_helper()
304 * This function does the real job to process an AUX transaction.
305 * It will call aux_reset() function to reset the AUX channel,
314 struct dp_aux_private *aux; in dp_aux_transfer() local
316 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_transfer()
318 aux->native = msg->request & (DP_AUX_NATIVE_WRITE & DP_AUX_NATIVE_READ); in dp_aux_transfer()
322 msg->reply = aux->native ? in dp_aux_transfer()
328 if ((aux->native && msg->size > aux_cmd_native_max) || in dp_aux_transfer()
335 mutex_lock(&aux->mutex); in dp_aux_transfer()
336 if (!aux->initted) { in dp_aux_transfer()
344 * turned on the panel and then tried to do an AUX transfer. The panel in dp_aux_transfer()
349 if (aux->is_edp) { in dp_aux_transfer()
350 ret = dp_catalog_aux_wait_for_hpd_connect_state(aux->catalog); in dp_aux_transfer()
352 DRM_DEBUG_DP("Panel not ready for aux transactions\n"); in dp_aux_transfer()
357 dp_aux_update_offset_and_segment(aux, msg); in dp_aux_transfer()
358 dp_aux_transfer_helper(aux, msg, true); in dp_aux_transfer()
360 aux->read = msg->request & (DP_AUX_I2C_READ & DP_AUX_NATIVE_READ); in dp_aux_transfer()
361 aux->cmd_busy = true; in dp_aux_transfer()
363 if (aux->read) { in dp_aux_transfer()
364 aux->no_send_addr = true; in dp_aux_transfer()
365 aux->no_send_stop = false; in dp_aux_transfer()
367 aux->no_send_addr = true; in dp_aux_transfer()
368 aux->no_send_stop = true; in dp_aux_transfer()
371 ret = dp_aux_cmd_fifo_tx(aux, msg); in dp_aux_transfer()
373 if (aux->native) { in dp_aux_transfer()
374 aux->retry_cnt++; in dp_aux_transfer()
375 if (!(aux->retry_cnt % MAX_AUX_RETRIES)) in dp_aux_transfer()
376 dp_catalog_aux_update_cfg(aux->catalog); in dp_aux_transfer()
378 /* reset aux if link is in connected state */ in dp_aux_transfer()
379 if (dp_catalog_link_is_connected(aux->catalog)) in dp_aux_transfer()
380 dp_catalog_aux_reset(aux->catalog); in dp_aux_transfer()
382 aux->retry_cnt = 0; in dp_aux_transfer()
383 switch (aux->aux_error_num) { in dp_aux_transfer()
385 if (aux->read) in dp_aux_transfer()
386 ret = dp_aux_cmd_fifo_rx(aux, msg); in dp_aux_transfer()
387 msg->reply = aux->native ? DP_AUX_NATIVE_REPLY_ACK : DP_AUX_I2C_REPLY_ACK; in dp_aux_transfer()
390 msg->reply = aux->native ? DP_AUX_NATIVE_REPLY_DEFER : DP_AUX_I2C_REPLY_DEFER; in dp_aux_transfer()
396 msg->reply = aux->native ? DP_AUX_NATIVE_REPLY_NACK : DP_AUX_I2C_REPLY_NACK; in dp_aux_transfer()
404 aux->cmd_busy = false; in dp_aux_transfer()
407 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 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, isr); in dp_aux_isr()
432 dp_aux_i2c_handler(aux, isr); in dp_aux_isr()
434 complete(&aux->comp); in dp_aux_isr()
439 struct dp_aux_private *aux; in dp_aux_reconfig() local
441 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_reconfig()
443 dp_catalog_aux_update_cfg(aux->catalog); in dp_aux_reconfig()
444 dp_catalog_aux_reset(aux->catalog); in dp_aux_reconfig()
449 struct dp_aux_private *aux; in dp_aux_init() local
456 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_init()
458 mutex_lock(&aux->mutex); in dp_aux_init()
460 dp_catalog_aux_enable(aux->catalog, true); in dp_aux_init()
461 aux->retry_cnt = 0; in dp_aux_init()
462 aux->initted = true; in dp_aux_init()
464 mutex_unlock(&aux->mutex); in dp_aux_init()
469 struct dp_aux_private *aux; in dp_aux_deinit() local
471 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_deinit()
473 mutex_lock(&aux->mutex); in dp_aux_deinit()
475 aux->initted = false; in dp_aux_deinit()
476 dp_catalog_aux_enable(aux->catalog, false); in dp_aux_deinit()
478 mutex_unlock(&aux->mutex); in dp_aux_deinit()
483 struct dp_aux_private *aux; in dp_aux_register() local
491 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_register()
493 aux->dp_aux.name = "dpu_dp_aux"; in dp_aux_register()
494 aux->dp_aux.dev = aux->dev; in dp_aux_register()
495 aux->dp_aux.transfer = dp_aux_transfer; in dp_aux_register()
496 ret = drm_dp_aux_register(&aux->dp_aux); in dp_aux_register()
498 DRM_ERROR("%s: failed to register drm aux: %d\n", __func__, in dp_aux_register()
514 struct dp_aux_private *aux; in dp_aux_get() local
521 aux = devm_kzalloc(dev, sizeof(*aux), GFP_KERNEL); in dp_aux_get()
522 if (!aux) in dp_aux_get()
525 init_completion(&aux->comp); in dp_aux_get()
526 aux->cmd_busy = false; in dp_aux_get()
527 aux->is_edp = is_edp; in dp_aux_get()
528 mutex_init(&aux->mutex); in dp_aux_get()
530 aux->dev = dev; in dp_aux_get()
531 aux->catalog = catalog; in dp_aux_get()
532 aux->retry_cnt = 0; in dp_aux_get()
534 return &aux->dp_aux; in dp_aux_get()
539 struct dp_aux_private *aux; in dp_aux_put() local
544 aux = container_of(dp_aux, struct dp_aux_private, dp_aux); in dp_aux_put()
546 mutex_destroy(&aux->mutex); in dp_aux_put()
548 devm_kfree(aux->dev, aux); in dp_aux_put()