Lines Matching +full:slave +full:- +full:if
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
6 * Copyright (c) 2017-2018 Panasas
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
60 static int imcsmb_readb(device_t dev, u_char slave, char cmd, char *byte);
61 static int imcsmb_readw(device_t dev, u_char slave, char cmd, short *word);
62 static int imcsmb_writeb(device_t dev, u_char slave, char cmd, char byte);
63 static int imcsmb_writew(device_t dev, u_char slave, char cmd, short word);
66 static int imcsmb_transfer(device_t dev, u_char slave, char cmd, void *data,
72 * which any SMBus slave device drivers will connect to.
87 sc->dev = dev; in imcsmb_attach()
88 sc->imcsmb_pci = device_get_parent(dev); in imcsmb_attach()
89 sc->regs = device_get_ivars(dev); in imcsmb_attach()
92 sc->smbus = device_add_child(dev, "smbus", DEVICE_UNIT_ANY); in imcsmb_attach()
93 if (sc->smbus == NULL) { in imcsmb_attach()
153 if (*how != SMB_DONTWAIT) { in imcsmb_callback()
157 rc = imcsmb_pci_request_bus(sc->imcsmb_pci); in imcsmb_callback()
161 imcsmb_pci_release_bus(sc->imcsmb_pci); in imcsmb_callback()
180 * @param[in] slave
191 imcsmb_readb(device_t dev, u_char slave, char cmd, char *byte) in imcsmb_readb() argument
194 return (imcsmb_transfer(dev, slave, cmd, byte, FALSE, FALSE)); in imcsmb_readb()
204 * @param[in] slave
215 imcsmb_readw(device_t dev, u_char slave, char cmd, short *word) in imcsmb_readw() argument
218 return (imcsmb_transfer(dev, slave, cmd, word, TRUE, FALSE)); in imcsmb_readw()
228 * @param[in] slave
239 imcsmb_writeb(device_t dev, u_char slave, char cmd, char byte) in imcsmb_writeb() argument
242 return (imcsmb_transfer(dev, slave, cmd, &byte, FALSE, TRUE)); in imcsmb_writeb()
252 * @param[in] slave
263 imcsmb_writew(device_t dev, u_char slave, char cmd, short word) in imcsmb_writew() argument
266 return (imcsmb_transfer(dev, slave, cmd, &word, TRUE, TRUE)); in imcsmb_writew()
277 * @param[in] slave
295 imcsmb_transfer(device_t dev, u_char slave, char cmd, void *data, int word_op, in imcsmb_transfer() argument
319 orig_cntl_val = pci_read_config(sc->imcsmb_pci, in imcsmb_transfer()
320 sc->regs->smb_cntl, 4); in imcsmb_transfer()
328 * the four high bits of the slave address. in imcsmb_transfer()
331 cntl_val |= ((uint32_t) slave & 0xf0) << 24; in imcsmb_transfer()
354 if (word_op) { in imcsmb_transfer()
359 if (write_op) { in imcsmb_transfer()
363 /* [26:24] The three non-DTI, non-R/W bits of the slave address. */ in imcsmb_transfer()
364 cmd_val |= (uint32_t) ((slave & 0xe) << 23); in imcsmb_transfer()
372 if (write_op) { in imcsmb_transfer()
373 if (word_op) { in imcsmb_transfer()
382 * the temperature sensors are I2C. Thus, byte-swap the in imcsmb_transfer()
398 pci_write_config(sc->imcsmb_pci, sc->regs->smb_cntl, cntl_val, 4); in imcsmb_transfer()
401 * We just cleared the auto-poll bit, so we need to make sure the device in imcsmb_transfer()
405 for (i = 4; i != 0; i--) { in imcsmb_transfer()
406 stat_val = pci_read_config(sc->imcsmb_pci, sc->regs->smb_stat, in imcsmb_transfer()
408 if ((stat_val & IMCSMB_STATUS_BUSY_BIT) == 0) { in imcsmb_transfer()
414 if (i == 0) { in imcsmb_transfer()
415 device_printf(sc->dev, in imcsmb_transfer()
422 pci_write_config(sc->imcsmb_pci, sc->regs->smb_cmd, cmd_val, 4); in imcsmb_transfer()
427 for (i = 35000; i != 0; i -= 10) in imcsmb_transfer()
430 stat_val = pci_read_config(sc->imcsmb_pci, sc->regs->smb_stat, in imcsmb_transfer()
440 if (write_op) { in imcsmb_transfer()
441 if ((stat_val & IMCSMB_STATUS_WRITE_DATA_DONE) != 0) { in imcsmb_transfer()
445 if ((stat_val & IMCSMB_STATUS_READ_DATA_VALID) != 0) { in imcsmb_transfer()
450 if (i == 0) { in imcsmb_transfer()
456 /* It is generally the case that this bit indicates non-ACK, but it in imcsmb_transfer()
460 if ((stat_val & IMCSMB_STATUS_BUS_ERROR_BIT) != 0) { in imcsmb_transfer()
461 /* While it is not documented, empirically, SPD page-change in imcsmb_transfer()
465 if ((slave & 0xf0) != 0x60) { in imcsmb_transfer()
472 if (write_op == 0) { in imcsmb_transfer()
473 if (word_op) { in imcsmb_transfer()
475 * above, byte-swap. in imcsmb_transfer()
492 pci_write_config(sc->imcsmb_pci, sc->regs->smb_cntl, orig_cntl_val, 4); in imcsmb_transfer()