Hi Dmitry, Thanks for your comments, > > On Tue, Sep 24, 2024 at 12:16:27PM GMT, Maxime Ripard wrote: > > On Tue, Sep 24, 2024 at 03:36:49PM GMT, Sandor Yu wrote: > > > +static int cdns_mhdp8501_read_hpd(struct cdns_mhdp8501_device > > > +*mhdp) { > > > + u8 status; > > > + int ret; > > > + > > > + mutex_lock(&mhdp_mailbox_mutex); > > > + > > > + ret = cdns_mhdp_mailbox_send(&mhdp->base, > MB_MODULE_ID_GENERAL, > > > + GENERAL_GET_HPD_STATE, 0, > NULL); > > > + if (ret) > > > + goto err_get_hpd; > > > + > > > + ret = cdns_mhdp_mailbox_recv_header(&mhdp->base, > MB_MODULE_ID_GENERAL, > > > + GENERAL_GET_HPD_STATE, > > > + sizeof(status)); > > > + if (ret) > > > + goto err_get_hpd; > > > + > > > + ret = cdns_mhdp_mailbox_recv_data(&mhdp->base, &status, > sizeof(status)); > > > + if (ret) > > > + goto err_get_hpd; > > > + > > > + mutex_unlock(&mhdp_mailbox_mutex); > > > > That's better I guess, but it's still not a good API design. If you > > can't have concurrent accesses, then cdns_mhdp_mailbox_send et al. > > should take the mutex themselves. > > I think that a proper API might be: > > int cdns_mhdp_mailbox_send_recv(struct cdns_mhdp_device *mhdp, > u8 module_id, u8 opcode, > u16 size, const u8 *message, > u16 buf_size, u8 *buf); > > Internally it should take the lock, exchange the data, then return. > Thank you for your great suggestion. It seems like this should be able to solve the current problem. I need to check each existing FW access functions one by one to see if they can all work under this API function. B.R Sandor > -- > With best wishes > Dmitry