Hi, Guillaume: On Mon, 2023-05-29 at 16:31 +0200, Guillaume Ranquet wrote: > > External email : Please do not click links or open attachments until > you have verified the sender or the content. > Adds hdmi and hdmi-ddc support for v2 IP. > > Signed-off-by: Guillaume Ranquet <granquet@xxxxxxxxxxxx> > --- [snip] > + > +static bool fg_ddc_data_read(struct mtk_hdmi_ddc *ddc, > + unsigned char b_dev, > + unsigned char b_data_addr, > + unsigned char b_data_count, > + unsigned char *pr_data) > +{ > +int ret; > + > +mutex_lock(&ddc->mtx); Why do you need this mutex? fg_ddc_data_read() and fg_ddc_data_write() are called by mtk_hdmi_ddc_xfer() which is the callback function of master_xfer. In original hdmi driver, it's not necessary to use a mutex to protect master_xfer, so I think this is not necessary. Regards, CK > + > +hdmi_ddc_request(ddc); > +ret = vddc_read(ddc, DDC2_CLOK, b_dev, b_data_addr, SIF_8_BIT_HDMI, > + pr_data, b_data_count); > +mutex_unlock(&ddc->mtx); > + > +return ret == b_data_count; > +} > + > +static void fg_ddc_data_write(struct mtk_hdmi_ddc *ddc, > + unsigned char b_dev, > + unsigned char b_data_addr, > + unsigned char b_data_count, > + unsigned char *pr_data) > +{ > +unsigned int i; > + > +mutex_lock(&ddc->mtx); > + > +hdmi_ddc_request(ddc); > +for (i = 0; i < b_data_count; i++) > +mtk_ddc_wr_one(ddc, b_dev, b_data_addr + i, *(pr_data + i)); > + > +mutex_unlock(&ddc->mtx); > +} > + > +static int mtk_hdmi_ddc_xfer(struct i2c_adapter *adapter, struct > i2c_msg *msgs, > + int num) > +{ > +struct mtk_hdmi_ddc *ddc = adapter->algo_data; > +struct device *dev = adapter->dev.parent; > +bool ret; > +int i; > +unsigned char offset; > + > +if (!ddc) > +return -EINVAL; > + > +for (i = 0; i < num; i++) { > +struct i2c_msg *msg = &msgs[i]; > + > +if (msg->flags & I2C_M_RD) { > +/* The underlying DDC hardware always issue a write request > + * that assigns the read offset as part of the read operation. > + * Therefore we need to use the offset value assigned > + * in the previous write request from the drm_edid.c > + */ > +ret = fg_ddc_data_read(ddc, msg->addr, > + offset, /* determined by previous write requests */ > + (msg->len), &msg->buf[0]); > +if (!ret) { > +dev_err(dev, "ddc read failed : %d\n", ret); > +return ret; > +} > +} else { > +fg_ddc_data_write(ddc, msg->addr, msg->buf[0], > +(msg->len - 1), &msg->buf[1]); > + > +/* we store the offset value requested by drm_edid framework > + * to use in subsequent read requests. > + */ > +if (DDC_ADDR == msg->addr && 1 == msg->len) > +offset = msg->buf[0]; > +} > +} > + > +return i; > +} > +