Lines Matching +full:i2c +full:- +full:hdmi
1 // SPDX-License-Identifier: GPL-2.0-only
7 #include "hdmi.h"
11 struct hdmi *hdmi; member
19 struct hdmi *hdmi = hdmi_i2c->hdmi; in init_ddc() local
21 hdmi_write(hdmi, REG_HDMI_DDC_CTRL, in init_ddc()
23 hdmi_write(hdmi, REG_HDMI_DDC_CTRL, in init_ddc()
26 hdmi_write(hdmi, REG_HDMI_DDC_SPEED, in init_ddc()
30 hdmi_write(hdmi, REG_HDMI_DDC_SETUP, in init_ddc()
34 hdmi_write(hdmi, REG_HDMI_DDC_REF, in init_ddc()
41 struct hdmi *hdmi = hdmi_i2c->hdmi; in ddc_clear_irq() local
42 struct drm_device *dev = hdmi->dev; in ddc_clear_irq()
47 --retry; in ddc_clear_irq()
49 hdmi_write(hdmi, REG_HDMI_DDC_INT_CTRL, in ddc_clear_irq()
53 ddc_int_ctrl = hdmi_read(hdmi, REG_HDMI_DDC_INT_CTRL); in ddc_clear_irq()
58 DRM_DEV_ERROR(dev->dev, "timeout waiting for DDC\n"); in ddc_clear_irq()
59 return -ETIMEDOUT; in ddc_clear_irq()
62 hdmi_i2c->sw_done = false; in ddc_clear_irq()
71 struct hdmi *hdmi = hdmi_i2c->hdmi; in sw_done() local
73 if (!hdmi_i2c->sw_done) { in sw_done()
76 ddc_int_ctrl = hdmi_read(hdmi, REG_HDMI_DDC_INT_CTRL); in sw_done()
80 hdmi_i2c->sw_done = true; in sw_done()
81 hdmi_write(hdmi, REG_HDMI_DDC_INT_CTRL, in sw_done()
86 return hdmi_i2c->sw_done; in sw_done()
89 static int msm_hdmi_i2c_xfer(struct i2c_adapter *i2c, in msm_hdmi_i2c_xfer() argument
92 struct hdmi_i2c_adapter *hdmi_i2c = to_hdmi_i2c_adapter(i2c); in msm_hdmi_i2c_xfer()
93 struct hdmi *hdmi = hdmi_i2c->hdmi; in msm_hdmi_i2c_xfer() local
94 struct drm_device *dev = hdmi->dev; in msm_hdmi_i2c_xfer()
105 WARN_ON(!(hdmi_read(hdmi, REG_HDMI_CTRL) & HDMI_CTRL_ENABLE)); in msm_hdmi_i2c_xfer()
118 uint32_t raw_addr = p->addr << 1; in msm_hdmi_i2c_xfer()
120 if (p->flags & I2C_M_RD) in msm_hdmi_i2c_xfer()
131 hdmi_write(hdmi, REG_HDMI_DDC_DATA, ddc_data); in msm_hdmi_i2c_xfer()
136 if (p->flags & I2C_M_RD) { in msm_hdmi_i2c_xfer()
137 index += p->len; in msm_hdmi_i2c_xfer()
139 for (j = 0; j < p->len; j++) { in msm_hdmi_i2c_xfer()
140 ddc_data = HDMI_DDC_DATA_DATA(p->buf[j]) | in msm_hdmi_i2c_xfer()
142 hdmi_write(hdmi, REG_HDMI_DDC_DATA, ddc_data); in msm_hdmi_i2c_xfer()
147 i2c_trans = HDMI_I2C_TRANSACTION_REG_CNT(p->len) | in msm_hdmi_i2c_xfer()
149 (p->flags & I2C_M_RD) ? DDC_READ : DDC_WRITE) | in msm_hdmi_i2c_xfer()
152 if (i == (num - 1)) in msm_hdmi_i2c_xfer()
155 hdmi_write(hdmi, REG_HDMI_I2C_TRANSACTION(i), i2c_trans); in msm_hdmi_i2c_xfer()
159 hdmi_write(hdmi, REG_HDMI_DDC_CTRL, in msm_hdmi_i2c_xfer()
160 HDMI_DDC_CTRL_TRANSACTION_CNT(num - 1) | in msm_hdmi_i2c_xfer()
163 ret = wait_event_timeout(hdmi_i2c->ddc_event, sw_done(hdmi_i2c), HZ/4); in msm_hdmi_i2c_xfer()
166 ret = -ETIMEDOUT; in msm_hdmi_i2c_xfer()
167 dev_warn(dev->dev, "DDC timeout: %d\n", ret); in msm_hdmi_i2c_xfer()
169 hdmi_read(hdmi, REG_HDMI_DDC_SW_STATUS), in msm_hdmi_i2c_xfer()
170 hdmi_read(hdmi, REG_HDMI_DDC_HW_STATUS), in msm_hdmi_i2c_xfer()
171 hdmi_read(hdmi, REG_HDMI_DDC_INT_CTRL)); in msm_hdmi_i2c_xfer()
175 ddc_status = hdmi_read(hdmi, REG_HDMI_DDC_SW_STATUS); in msm_hdmi_i2c_xfer()
181 if (!(p->flags & I2C_M_RD)) in msm_hdmi_i2c_xfer()
194 hdmi_write(hdmi, REG_HDMI_DDC_DATA, ddc_data); in msm_hdmi_i2c_xfer()
197 hdmi_read(hdmi, REG_HDMI_DDC_DATA); in msm_hdmi_i2c_xfer()
199 for (j = 0; j < p->len; j++) { in msm_hdmi_i2c_xfer()
200 ddc_data = hdmi_read(hdmi, REG_HDMI_DDC_DATA); in msm_hdmi_i2c_xfer()
201 p->buf[j] = FIELD(ddc_data, HDMI_DDC_DATA_DATA); in msm_hdmi_i2c_xfer()
218 void msm_hdmi_i2c_irq(struct i2c_adapter *i2c) in msm_hdmi_i2c_irq() argument
220 struct hdmi_i2c_adapter *hdmi_i2c = to_hdmi_i2c_adapter(i2c); in msm_hdmi_i2c_irq()
223 wake_up_all(&hdmi_i2c->ddc_event); in msm_hdmi_i2c_irq()
226 void msm_hdmi_i2c_destroy(struct i2c_adapter *i2c) in msm_hdmi_i2c_destroy() argument
228 struct hdmi_i2c_adapter *hdmi_i2c = to_hdmi_i2c_adapter(i2c); in msm_hdmi_i2c_destroy()
229 i2c_del_adapter(i2c); in msm_hdmi_i2c_destroy()
233 struct i2c_adapter *msm_hdmi_i2c_init(struct hdmi *hdmi) in msm_hdmi_i2c_init() argument
236 struct i2c_adapter *i2c = NULL; in msm_hdmi_i2c_init() local
241 ret = -ENOMEM; in msm_hdmi_i2c_init()
245 i2c = &hdmi_i2c->base; in msm_hdmi_i2c_init()
247 hdmi_i2c->hdmi = hdmi; in msm_hdmi_i2c_init()
248 init_waitqueue_head(&hdmi_i2c->ddc_event); in msm_hdmi_i2c_init()
251 i2c->owner = THIS_MODULE; in msm_hdmi_i2c_init()
252 snprintf(i2c->name, sizeof(i2c->name), "msm hdmi i2c"); in msm_hdmi_i2c_init()
253 i2c->dev.parent = &hdmi->pdev->dev; in msm_hdmi_i2c_init()
254 i2c->algo = &msm_hdmi_i2c_algorithm; in msm_hdmi_i2c_init()
256 ret = i2c_add_adapter(i2c); in msm_hdmi_i2c_init()
260 return i2c; in msm_hdmi_i2c_init()
263 if (i2c) in msm_hdmi_i2c_init()
264 msm_hdmi_i2c_destroy(i2c); in msm_hdmi_i2c_init()