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. -- With best wishes Dmitry