Lines Matching refs:i2c_common
19 static void amd_mp2_c2p_mutex_lock(struct amd_i2c_common *i2c_common)
21 struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
25 privdata->c2p_lock_busid = i2c_common->bus_id;
28 static void amd_mp2_c2p_mutex_unlock(struct amd_i2c_common *i2c_common)
30 struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
32 if (unlikely(privdata->c2p_lock_busid != i2c_common->bus_id)) {
35 i2c_common->bus_id, privdata->c2p_lock_busid);
42 static int amd_mp2_cmd(struct amd_i2c_common *i2c_common,
45 struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
48 i2c_common->reqcmd = i2c_cmd_base.s.i2c_cmd;
57 int amd_mp2_bus_enable_set(struct amd_i2c_common *i2c_common, bool enable)
59 struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
63 i2c_common->bus_id);
67 i2c_cmd_base.s.bus_id = i2c_common->bus_id;
68 i2c_cmd_base.s.i2c_speed = i2c_common->i2c_speed;
70 amd_mp2_c2p_mutex_lock(i2c_common);
72 return amd_mp2_cmd(i2c_common, i2c_cmd_base);
76 static void amd_mp2_cmd_rw_fill(struct amd_i2c_common *i2c_common,
81 i2c_cmd_base->s.bus_id = i2c_common->bus_id;
82 i2c_cmd_base->s.i2c_speed = i2c_common->i2c_speed;
83 i2c_cmd_base->s.slave_addr = i2c_common->msg->addr;
84 i2c_cmd_base->s.length = i2c_common->msg->len;
87 int amd_mp2_rw(struct amd_i2c_common *i2c_common, enum i2c_cmd reqcmd)
89 struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
92 amd_mp2_cmd_rw_fill(i2c_common, &i2c_cmd_base, reqcmd);
93 amd_mp2_c2p_mutex_lock(i2c_common);
95 if (i2c_common->msg->len <= 32) {
99 i2c_common->msg->buf,
100 i2c_common->msg->len);
103 writeq((u64)i2c_common->dma_addr,
107 return amd_mp2_cmd(i2c_common, i2c_cmd_base);
111 static void amd_mp2_pci_check_rw_event(struct amd_i2c_common *i2c_common)
113 struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
114 int len = i2c_common->eventval.r.length;
115 u32 slave_addr = i2c_common->eventval.r.slave_addr;
118 if (unlikely(len != i2c_common->msg->len)) {
121 len, i2c_common->msg->len);
125 if (unlikely(slave_addr != i2c_common->msg->addr)) {
128 slave_addr, i2c_common->msg->addr);
133 i2c_common->cmd_success = true;
136 static void __amd_mp2_process_event(struct amd_i2c_common *i2c_common)
138 struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
139 enum status_type sts = i2c_common->eventval.r.status;
140 enum response_type res = i2c_common->eventval.r.response;
141 int len = i2c_common->eventval.r.length;
149 switch (i2c_common->reqcmd) {
152 amd_mp2_pci_check_rw_event(i2c_common);
154 memcpy_fromio(i2c_common->msg->buf,
164 amd_mp2_pci_check_rw_event(i2c_common);
171 i2c_common->cmd_success = true;
179 i2c_common->cmd_success = true;
190 void amd_mp2_process_event(struct amd_i2c_common *i2c_common)
192 struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
194 if (unlikely(i2c_common->reqcmd == i2c_none)) {
197 i2c_common->bus_id);
201 __amd_mp2_process_event(i2c_common);
203 i2c_common->reqcmd = i2c_none;
204 amd_mp2_c2p_mutex_unlock(i2c_common);
211 struct amd_i2c_common *i2c_common;
218 i2c_common = privdata->busses[bus_id];
219 if (!i2c_common)
228 i2c_common->eventval.ul = val;
229 i2c_common->cmd_completion(i2c_common);
248 void amd_mp2_rw_timeout(struct amd_i2c_common *i2c_common)
250 i2c_common->reqcmd = i2c_none;
251 amd_mp2_c2p_mutex_unlock(i2c_common);
255 int amd_mp2_register_cb(struct amd_i2c_common *i2c_common)
257 struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
259 if (i2c_common->bus_id > 1)
262 if (privdata->busses[i2c_common->bus_id]) {
264 "Bus %d already taken!\n", i2c_common->bus_id);
268 privdata->busses[i2c_common->bus_id] = i2c_common;
274 int amd_mp2_unregister_cb(struct amd_i2c_common *i2c_common)
276 struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
278 privdata->busses[i2c_common->bus_id] = NULL;
388 struct amd_i2c_common *i2c_common;
393 i2c_common = privdata->busses[bus_id];
394 if (i2c_common)
395 i2c_common->suspend(i2c_common);
413 struct amd_i2c_common *i2c_common;
426 i2c_common = privdata->busses[bus_id];
427 if (i2c_common) {
428 ret = i2c_common->resume(i2c_common);