52#include <sys/kernel.h>
54#include <sys/module.h>
62#include <dev/smbus/smb.h>
63#include <dev/smbus/smbconf.h>
70#define SMB_WAITING_ADDR 0x0
71#define SMB_WAITING_LOW 0x1
72#define SMB_WAITING_HIGH 0x2
141 if (device_find_child(parent,
"iicsmb", -1) == NULL)
142 BUS_ADD_CHILD(parent, 0,
"iicsmb", -1);
148 device_set_desc(
dev,
"SMBus over I2C bridge");
149 return (BUS_PROBE_NOWILDCARD);
157 mtx_init(&sc->
lock,
"iicsmb", NULL, MTX_DEF);
159 sc->
smbus = device_add_child(
dev,
"smbus", -1);
162 bus_generic_attach(
dev);
172 bus_generic_detach(
dev);
173 device_delete_children(
dev);
174 mtx_destroy(&sc->
lock);
199 sc->
low, sc->
high, SMB_ENOERR);
206 printf(
"%s: too much data from 0x%x\n", __func__,
239 printf(
"%s unknown error 0x%x!\n", __func__,
246 panic(
"%s: unknown event (%d)!", __func__,
event);
248 mtx_unlock(&sc->
lock);
256 device_t parent = device_get_parent(
dev);
261 case SMB_REQUEST_BUS:
267 case SMB_RELEASE_BUS:
286 return (SMB_EBUSERR);
290 return (SMB_ETIMEOUT);
294 return (SMB_EBUSERR);
296 return (SMB_EBUSERR);
298 return (SMB_EBUSERR);
300 return (SMB_ENOTSUPP);
302 return (SMB_EBUSERR);
304 return (SMB_EBUSERR);
306 return (SMB_EBUSERR);
310#define TRANSFER_MSGS(dev, msgs) iicbus_transfer(dev, msgs, nitems(msgs))
359 uint8_t
bytes[] = { cmd,
byte };
372 uint8_t
bytes[] = { cmd, word & 0xff, word >> 8 };
407 *word = ((uint16_t)
buf[1] << 8) |
buf[0];
414 uint8_t in[3] = { cmd, sdata & 0xff, sdata >> 8 };
424 *rdata = ((uint16_t)out[1] << 8) | out[0];
431 uint8_t
bytes[2] = { cmd, count };
438 if (count > SMB_MAXBLOCKSIZE || count == 0)
454 device_t parent = device_get_parent(
dev);
466 if (*count > SMB_MAXBLOCKSIZE || *count == 0)
467 block_msg[0].
len = 1;
469 block_msg[0].
len = *count;
471 if (*count > SMB_MAXBLOCKSIZE || *count == 0)
int iicbus_request_bus(device_t bus, device_t dev, int how)
void iicbus_intr(device_t bus, int event, char *buf)
int iicbus_release_bus(device_t bus, device_t dev)
MODULE_DEPEND(iicsmb, iicbus, IICBUS_MINVER, IICBUS_PREFVER, IICBUS_MAXVER)
static int iicsmb_quick(device_t dev, u_char slave, int how)
static device_method_t iicsmb_methods[]
static driver_t iicsmb_driver
static int iicsmb_attach(device_t)
static void iicsmb_identify(driver_t *driver, device_t parent)
static int iic2smb_error(int error)
static int iicsmb_probe(device_t)
static int iicsmb_bread(device_t dev, u_char slave, char cmd, u_char *count, char *buf)
static int iicsmb_detach(device_t)
static int iicsmb_readw(device_t dev, u_char slave, char cmd, short *word)
static int iicsmb_sendb(device_t dev, u_char slave, char byte)
static int iicsmb_bwrite(device_t dev, u_char slave, char cmd, u_char count, char *buf)
static int iicsmb_callback(device_t dev, int index, void *data)
#define TRANSFER_MSGS(dev, msgs)
static devclass_t iicsmb_devclass
static int iicsmb_pcall(device_t dev, u_char slave, char cmd, short sdata, short *rdata)
DRIVER_MODULE(iicsmb, iicbus, iicsmb_driver, iicsmb_devclass, 0, 0)
MODULE_VERSION(iicsmb, 1)
static int iicsmb_intr(device_t dev, int event, char *buf)
static int iicsmb_readb(device_t dev, u_char slave, char cmd, char *byte)
static int iicsmb_recvb(device_t dev, u_char slave, char *byte)
static int iicsmb_writeb(device_t dev, u_char slave, char cmd, char byte)
static int iicsmb_writew(device_t dev, u_char slave, char cmd, short word)