Lines Matching +full:- +full:- +full:-
70 uint8_t prot = (s->smb_ctl >> 2) & 0x07; in smb_transaction()
71 uint8_t read = s->smb_addr & 0x01; in smb_transaction()
72 uint8_t cmd = s->smb_cmd; in smb_transaction()
73 uint8_t addr = s->smb_addr >> 1; in smb_transaction()
74 I2CBus *bus = s->smbus; in smb_transaction()
79 if ((s->smb_stat & STS_DEV_ERR) != 0) { in smb_transaction()
100 ret = smbus_write_byte(bus, addr, cmd, s->smb_data0); in smb_transaction()
110 (s->smb_data1 << 8) | s->smb_data0); in smb_transaction()
115 /* According to the Linux i2c-i801 driver: in smb_transaction()
126 ret = i2c_send(bus, s->smb_data1); in smb_transaction()
133 s->in_i2c_block_read = true; in smb_transaction()
134 s->smb_blkdata = i2c_recv(s->smbus); in smb_transaction()
135 s->op_done = false; in smb_transaction()
136 s->smb_stat |= STS_HOST_BUSY | STS_BYTE_DONE; in smb_transaction()
141 ret = smbus_read_block(bus, addr, cmd, s->smb_data, in smb_transaction()
142 sizeof(s->smb_data), !s->i2c_enable, in smb_transaction()
143 !s->i2c_enable); in smb_transaction()
147 s->smb_index = 0; in smb_transaction()
148 s->op_done = false; in smb_transaction()
149 if (s->smb_auxctl & AUX_BLK) { in smb_transaction()
150 s->smb_stat |= STS_INTR; in smb_transaction()
152 s->smb_blkdata = s->smb_data[0]; in smb_transaction()
153 s->smb_stat |= STS_HOST_BUSY | STS_BYTE_DONE; in smb_transaction()
155 s->smb_data0 = ret; in smb_transaction()
158 if (s->smb_auxctl & AUX_BLK) { in smb_transaction()
159 if (s->smb_index != s->smb_data0) { in smb_transaction()
160 s->smb_index = 0; in smb_transaction()
165 s->smb_index = 0; in smb_transaction()
166 ret = smbus_write_block(bus, addr, cmd, s->smb_data, in smb_transaction()
167 s->smb_data0, !s->i2c_enable); in smb_transaction()
171 s->op_done = true; in smb_transaction()
172 s->smb_stat |= STS_INTR; in smb_transaction()
173 s->smb_stat &= ~STS_HOST_BUSY; in smb_transaction()
175 s->op_done = false; in smb_transaction()
176 s->smb_stat |= STS_HOST_BUSY | STS_BYTE_DONE; in smb_transaction()
177 s->smb_data[0] = s->smb_blkdata; in smb_transaction()
178 s->smb_index = 0; in smb_transaction()
192 s->smb_data1 = ret >> 8; in smb_transaction()
197 s->smb_data0 = ret; in smb_transaction()
202 s->smb_stat |= STS_INTR; in smb_transaction()
207 s->smb_stat |= STS_DEV_ERR; in smb_transaction()
212 if (s->smb_ctl & CTL_INTREN) { in smb_transaction_start()
214 s->start_transaction_on_status_read = false; in smb_transaction_start()
223 s->smb_stat |= STS_HOST_BUSY; in smb_transaction_start()
224 s->start_transaction_on_status_read = true; in smb_transaction_start()
231 return ((s->smb_stat & ~STS_HOST_BUSY) != 0) && (s->smb_ctl & CTL_INTREN); in smb_irq_value()
237 if (s->op_done) { in smb_byte_by_byte()
240 if (s->in_i2c_block_read) { in smb_byte_by_byte()
243 return !(s->smb_auxctl & AUX_BLK); in smb_byte_by_byte()
255 clear_byte_done = s->smb_stat & val & STS_BYTE_DONE; in smb_ioport_writeb()
256 s->smb_stat &= ~(val & ~STS_HOST_BUSY); in smb_ioport_writeb()
258 uint8_t read = s->smb_addr & 0x01; in smb_ioport_writeb()
260 if (s->in_i2c_block_read) { in smb_ioport_writeb()
265 s->smb_index++; in smb_ioport_writeb()
266 if (s->smb_index >= PM_SMBUS_MAX_MSG_SIZE) { in smb_ioport_writeb()
267 s->smb_index = 0; in smb_ioport_writeb()
269 if (!read && s->smb_index == s->smb_data0) { in smb_ioport_writeb()
270 uint8_t prot = (s->smb_ctl >> 2) & 0x07; in smb_ioport_writeb()
271 uint8_t cmd = s->smb_cmd; in smb_ioport_writeb()
272 uint8_t smb_addr = s->smb_addr >> 1; in smb_ioport_writeb()
276 s->smb_stat |= STS_DEV_ERR; in smb_ioport_writeb()
280 ret = smbus_write_block(s->smbus, smb_addr, cmd, s->smb_data, in smb_ioport_writeb()
281 s->smb_data0, !s->i2c_enable); in smb_ioport_writeb()
283 s->smb_stat |= STS_DEV_ERR; in smb_ioport_writeb()
286 s->op_done = true; in smb_ioport_writeb()
287 s->smb_stat |= STS_INTR; in smb_ioport_writeb()
288 s->smb_stat &= ~STS_HOST_BUSY; in smb_ioport_writeb()
290 s->smb_data[s->smb_index] = s->smb_blkdata; in smb_ioport_writeb()
291 s->smb_stat |= STS_BYTE_DONE; in smb_ioport_writeb()
292 } else if (s->smb_ctl & CTL_LAST_BYTE) { in smb_ioport_writeb()
293 s->op_done = true; in smb_ioport_writeb()
294 if (s->in_i2c_block_read) { in smb_ioport_writeb()
295 s->in_i2c_block_read = false; in smb_ioport_writeb()
296 s->smb_blkdata = i2c_recv(s->smbus); in smb_ioport_writeb()
297 i2c_nack(s->smbus); in smb_ioport_writeb()
298 i2c_end_transfer(s->smbus); in smb_ioport_writeb()
300 s->smb_blkdata = s->smb_data[s->smb_index]; in smb_ioport_writeb()
302 s->smb_index = 0; in smb_ioport_writeb()
303 s->smb_stat |= STS_INTR; in smb_ioport_writeb()
304 s->smb_stat &= ~STS_HOST_BUSY; in smb_ioport_writeb()
306 if (s->in_i2c_block_read) { in smb_ioport_writeb()
307 s->smb_blkdata = i2c_recv(s->smbus); in smb_ioport_writeb()
309 s->smb_blkdata = s->smb_data[s->smb_index]; in smb_ioport_writeb()
311 s->smb_stat |= STS_BYTE_DONE; in smb_ioport_writeb()
316 s->smb_ctl = val & ~CTL_START; /* CTL_START always reads 0 */ in smb_ioport_writeb()
318 if (!s->op_done) { in smb_ioport_writeb()
319 s->smb_index = 0; in smb_ioport_writeb()
320 s->op_done = true; in smb_ioport_writeb()
321 if (s->in_i2c_block_read) { in smb_ioport_writeb()
322 s->in_i2c_block_read = false; in smb_ioport_writeb()
323 i2c_end_transfer(s->smbus); in smb_ioport_writeb()
328 if (s->smb_ctl & CTL_KILL) { in smb_ioport_writeb()
329 s->op_done = true; in smb_ioport_writeb()
330 s->smb_index = 0; in smb_ioport_writeb()
331 s->smb_stat |= STS_FAILED; in smb_ioport_writeb()
332 s->smb_stat &= ~STS_HOST_BUSY; in smb_ioport_writeb()
336 s->smb_cmd = val; in smb_ioport_writeb()
339 s->smb_addr = val; in smb_ioport_writeb()
342 s->smb_data0 = val; in smb_ioport_writeb()
345 s->smb_data1 = val; in smb_ioport_writeb()
348 if (s->smb_index >= PM_SMBUS_MAX_MSG_SIZE) { in smb_ioport_writeb()
349 s->smb_index = 0; in smb_ioport_writeb()
351 if (s->smb_auxctl & AUX_BLK) { in smb_ioport_writeb()
352 s->smb_data[s->smb_index++] = val; in smb_ioport_writeb()
354 s->smb_blkdata = val; in smb_ioport_writeb()
358 s->smb_auxctl = val & AUX_MASK; in smb_ioport_writeb()
365 if (s->set_irq) { in smb_ioport_writeb()
366 s->set_irq(s, smb_irq_value(s)); in smb_ioport_writeb()
377 val = s->smb_stat; in smb_ioport_readb()
378 if (s->start_transaction_on_status_read) { in smb_ioport_readb()
380 s->start_transaction_on_status_read = false; in smb_ioport_readb()
381 s->smb_stat &= ~STS_HOST_BUSY; in smb_ioport_readb()
386 val = s->smb_ctl & CTL_RETURN_MASK; in smb_ioport_readb()
389 val = s->smb_cmd; in smb_ioport_readb()
392 val = s->smb_addr; in smb_ioport_readb()
395 val = s->smb_data0; in smb_ioport_readb()
398 val = s->smb_data1; in smb_ioport_readb()
401 if (s->smb_auxctl & AUX_BLK && !s->in_i2c_block_read) { in smb_ioport_readb()
402 if (s->smb_index >= PM_SMBUS_MAX_MSG_SIZE) { in smb_ioport_readb()
403 s->smb_index = 0; in smb_ioport_readb()
405 val = s->smb_data[s->smb_index++]; in smb_ioport_readb()
406 if (!s->op_done && s->smb_index == s->smb_data0) { in smb_ioport_readb()
407 s->op_done = true; in smb_ioport_readb()
408 s->smb_index = 0; in smb_ioport_readb()
409 s->smb_stat &= ~STS_HOST_BUSY; in smb_ioport_readb()
412 val = s->smb_blkdata; in smb_ioport_readb()
416 val = s->smb_auxctl; in smb_ioport_readb()
424 if (s->set_irq) { in smb_ioport_readb()
425 s->set_irq(s, smb_irq_value(s)); in smb_ioport_readb()
433 s->op_done = true; in pm_smbus_reset()
434 s->smb_index = 0; in pm_smbus_reset()
435 s->smb_stat = 0; in pm_smbus_reset()
450 return !mc->smbus_no_migration_support; in pm_smbus_vmstate_needed()
478 smb->op_done = true; in pm_smbus_init()
479 smb->reset = pm_smbus_reset; in pm_smbus_init()
480 smb->smbus = i2c_init_bus(parent, "i2c"); in pm_smbus_init()
482 smb->smb_auxctl |= AUX_BLK; in pm_smbus_init()
484 memory_region_init_io(&smb->io, OBJECT(parent), &pm_smbus_ops, smb, in pm_smbus_init()
485 "pm-smbus", 64); in pm_smbus_init()