Lines Matching +full:slave +full:- +full:dev

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
6 * Copyright (c) 2017-2018 Panasas
46 #include <dev/pci/pcivar.h>
47 #include <dev/pci/pcireg.h>
49 #include <dev/smbus/smbconf.h>
55 static int imcsmb_attach(device_t dev);
56 static int imcsmb_probe(device_t dev);
59 static int imcsmb_callback(device_t dev, int index, void *data);
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.
76 * @param[in,out] dev
80 imcsmb_attach(device_t dev) in imcsmb_attach() argument
86 sc = device_get_softc(dev); in imcsmb_attach()
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()
95 device_printf(dev, "Child smbus not added\n"); in imcsmb_attach()
101 bus_attach_children(dev); in imcsmb_attach()
114 * @param[in,out] dev
118 imcsmb_probe(device_t dev) in imcsmb_probe() argument
121 device_set_desc(dev, "iMC SMBus controller"); in imcsmb_probe()
131 * @param[in] dev
142 imcsmb_callback(device_t dev, int index, void *data) in imcsmb_callback() argument
148 sc = device_get_softc(dev); 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()
178 * @param[in] dev
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()
202 * @param[in] dev
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()
226 * @param[in] dev
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()
250 * @param[in] dev
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()
275 * @param[in] dev
277 * @param[in] slave
295 imcsmb_transfer(device_t dev, u_char slave, char cmd, void *data, int word_op, in imcsmb_transfer() argument
310 sc = device_get_softc(dev); in imcsmb_transfer()
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()
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()
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()
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()
452 device_printf(dev, "transfer timeout\n"); in imcsmb_transfer()
456 /* It is generally the case that this bit indicates non-ACK, but it in imcsmb_transfer()
461 /* While it is not documented, empirically, SPD page-change in imcsmb_transfer()
465 if ((slave & 0xf0) != 0x60) { 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()