Lines Matching refs:s

68 static void smb_transaction(PMSMBus *s)  in smb_transaction()  argument
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()
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()
211 static void smb_transaction_start(PMSMBus *s) in smb_transaction_start() argument
213 if (s->smb_ctl & CTL_INTREN) { in smb_transaction_start()
214 smb_transaction(s); in smb_transaction_start()
215 s->start_transaction_on_status_read = false; in smb_transaction_start()
224 s->smb_stat |= STS_HOST_BUSY; in smb_transaction_start()
225 s->start_transaction_on_status_read = true; in smb_transaction_start()
230 smb_irq_value(PMSMBus *s) in smb_irq_value() argument
232 return ((s->smb_stat & ~STS_HOST_BUSY) != 0) && (s->smb_ctl & CTL_INTREN); in smb_irq_value()
236 smb_byte_by_byte(PMSMBus *s) in smb_byte_by_byte() argument
238 if (s->op_done) { in smb_byte_by_byte()
241 if (s->in_i2c_block_read) { in smb_byte_by_byte()
244 return !(s->smb_auxctl & AUX_BLK); in smb_byte_by_byte()
250 PMSMBus *s = opaque; in smb_ioport_writeb() local
256 clear_byte_done = s->smb_stat & val & STS_BYTE_DONE; in smb_ioport_writeb()
257 s->smb_stat &= ~(val & ~STS_HOST_BUSY); in smb_ioport_writeb()
258 if (clear_byte_done && smb_byte_by_byte(s)) { in smb_ioport_writeb()
259 uint8_t read = s->smb_addr & 0x01; in smb_ioport_writeb()
261 if (s->in_i2c_block_read) { in smb_ioport_writeb()
266 s->smb_index++; in smb_ioport_writeb()
267 if (s->smb_index >= PM_SMBUS_MAX_MSG_SIZE) { in smb_ioport_writeb()
268 s->smb_index = 0; in smb_ioport_writeb()
270 if (!read && s->smb_index == s->smb_data0) { in smb_ioport_writeb()
271 uint8_t prot = (s->smb_ctl >> 2) & 0x07; in smb_ioport_writeb()
272 uint8_t cmd = s->smb_cmd; in smb_ioport_writeb()
273 uint8_t smb_addr = s->smb_addr >> 1; in smb_ioport_writeb()
277 s->smb_stat |= STS_DEV_ERR; in smb_ioport_writeb()
281 ret = smbus_write_block(s->smbus, smb_addr, cmd, s->smb_data, in smb_ioport_writeb()
282 s->smb_data0, !s->i2c_enable); in smb_ioport_writeb()
284 s->smb_stat |= STS_DEV_ERR; in smb_ioport_writeb()
287 s->op_done = true; in smb_ioport_writeb()
288 s->smb_stat |= STS_INTR; in smb_ioport_writeb()
289 s->smb_stat &= ~STS_HOST_BUSY; in smb_ioport_writeb()
291 s->smb_data[s->smb_index] = s->smb_blkdata; in smb_ioport_writeb()
292 s->smb_stat |= STS_BYTE_DONE; in smb_ioport_writeb()
293 } else if (s->smb_ctl & CTL_LAST_BYTE) { in smb_ioport_writeb()
294 s->op_done = true; in smb_ioport_writeb()
295 if (s->in_i2c_block_read) { in smb_ioport_writeb()
296 s->in_i2c_block_read = false; in smb_ioport_writeb()
297 s->smb_blkdata = i2c_recv(s->smbus); in smb_ioport_writeb()
298 i2c_nack(s->smbus); in smb_ioport_writeb()
299 i2c_end_transfer(s->smbus); in smb_ioport_writeb()
301 s->smb_blkdata = s->smb_data[s->smb_index]; in smb_ioport_writeb()
303 s->smb_index = 0; in smb_ioport_writeb()
304 s->smb_stat |= STS_INTR; in smb_ioport_writeb()
305 s->smb_stat &= ~STS_HOST_BUSY; in smb_ioport_writeb()
307 if (s->in_i2c_block_read) { in smb_ioport_writeb()
308 s->smb_blkdata = i2c_recv(s->smbus); in smb_ioport_writeb()
310 s->smb_blkdata = s->smb_data[s->smb_index]; in smb_ioport_writeb()
312 s->smb_stat |= STS_BYTE_DONE; in smb_ioport_writeb()
317 s->smb_ctl = val & ~CTL_START; /* CTL_START always reads 0 */ in smb_ioport_writeb()
319 if (!s->op_done) { in smb_ioport_writeb()
320 s->smb_index = 0; in smb_ioport_writeb()
321 s->op_done = true; in smb_ioport_writeb()
322 if (s->in_i2c_block_read) { in smb_ioport_writeb()
323 s->in_i2c_block_read = false; in smb_ioport_writeb()
324 i2c_end_transfer(s->smbus); in smb_ioport_writeb()
327 smb_transaction_start(s); in smb_ioport_writeb()
329 if (s->smb_ctl & CTL_KILL) { in smb_ioport_writeb()
330 s->op_done = true; in smb_ioport_writeb()
331 s->smb_index = 0; in smb_ioport_writeb()
332 s->smb_stat |= STS_FAILED; in smb_ioport_writeb()
333 s->smb_stat &= ~STS_HOST_BUSY; in smb_ioport_writeb()
337 s->smb_cmd = val; in smb_ioport_writeb()
340 s->smb_addr = val; in smb_ioport_writeb()
343 s->smb_data0 = val; in smb_ioport_writeb()
346 s->smb_data1 = val; in smb_ioport_writeb()
349 if (s->smb_index >= PM_SMBUS_MAX_MSG_SIZE) { in smb_ioport_writeb()
350 s->smb_index = 0; in smb_ioport_writeb()
352 if (s->smb_auxctl & AUX_BLK) { in smb_ioport_writeb()
353 s->smb_data[s->smb_index++] = val; in smb_ioport_writeb()
355 s->smb_blkdata = val; in smb_ioport_writeb()
359 s->smb_auxctl = val & AUX_MASK; in smb_ioport_writeb()
366 if (s->set_irq) { in smb_ioport_writeb()
367 s->set_irq(s, smb_irq_value(s)); in smb_ioport_writeb()
373 PMSMBus *s = opaque; in smb_ioport_readb() local
378 val = s->smb_stat; in smb_ioport_readb()
379 if (s->start_transaction_on_status_read) { in smb_ioport_readb()
381 s->start_transaction_on_status_read = false; in smb_ioport_readb()
382 s->smb_stat &= ~STS_HOST_BUSY; in smb_ioport_readb()
383 smb_transaction(s); in smb_ioport_readb()
387 val = s->smb_ctl & CTL_RETURN_MASK; in smb_ioport_readb()
390 val = s->smb_cmd; in smb_ioport_readb()
393 val = s->smb_addr; in smb_ioport_readb()
396 val = s->smb_data0; in smb_ioport_readb()
399 val = s->smb_data1; in smb_ioport_readb()
402 if (s->smb_auxctl & AUX_BLK && !s->in_i2c_block_read) { in smb_ioport_readb()
403 if (s->smb_index >= PM_SMBUS_MAX_MSG_SIZE) { in smb_ioport_readb()
404 s->smb_index = 0; in smb_ioport_readb()
406 val = s->smb_data[s->smb_index++]; in smb_ioport_readb()
407 if (!s->op_done && s->smb_index == s->smb_data0) { in smb_ioport_readb()
408 s->op_done = true; in smb_ioport_readb()
409 s->smb_index = 0; in smb_ioport_readb()
410 s->smb_stat &= ~STS_HOST_BUSY; in smb_ioport_readb()
413 val = s->smb_blkdata; in smb_ioport_readb()
417 val = s->smb_auxctl; in smb_ioport_readb()
425 if (s->set_irq) { in smb_ioport_readb()
426 s->set_irq(s, smb_irq_value(s)); in smb_ioport_readb()
432 static void pm_smbus_reset(PMSMBus *s) in pm_smbus_reset() argument
434 s->op_done = true; in pm_smbus_reset()
435 s->smb_index = 0; in pm_smbus_reset()
436 s->smb_stat = 0; in pm_smbus_reset()