Provide pre/post transfer method callbacks for icbbb

clients.

These are helful when making certain drivers work on both Linux
and FreeBSD without changing the code flow too much.

Reviewed by: kib, wlosh
MFC after: 1 month
This commit is contained in:
kan 2012-03-01 20:58:20 +00:00
parent 24261e9a52
commit daffabc4a9
2 changed files with 55 additions and 2 deletions

View File

@ -76,6 +76,7 @@ static int iicbb_stop(device_t);
static int iicbb_write(device_t, const char *, int, int *, int);
static int iicbb_read(device_t, char *, int, int *, int, int);
static int iicbb_reset(device_t, u_char, u_char, u_char *);
static int iicbb_transfer(device_t dev, struct iic_msg *msgs, uint32_t nmsgs);
static device_method_t iicbb_methods[] = {
/* device interface */
@ -95,7 +96,7 @@ static device_method_t iicbb_methods[] = {
DEVMETHOD(iicbus_write, iicbb_write),
DEVMETHOD(iicbus_read, iicbb_read),
DEVMETHOD(iicbus_reset, iicbb_reset),
DEVMETHOD(iicbus_transfer, iicbus_transfer_gen),
DEVMETHOD(iicbus_transfer, iicbb_transfer),
{ 0, 0 }
};
@ -424,6 +425,21 @@ iicbb_read(device_t dev, char * buf, int len, int *read, int last, int delay)
return (0);
}
static int
iicbb_transfer(device_t dev, struct iic_msg *msgs, uint32_t nmsgs)
{
int error;
error = IICBB_PRE_XFER(device_get_parent(dev));
if (error)
return (error);
error = iicbus_transfer_gen(dev, msgs, nmsgs);
IICBB_POST_XFER(device_get_parent(dev));
return (error);
}
DRIVER_MODULE(iicbus, iicbb, iicbus_driver, iicbus_devclass, 0, 0);
MODULE_DEPEND(iicbb, iicbus, IICBUS_MINVER, IICBUS_PREFVER, IICBUS_MAXVER);

View File

@ -30,6 +30,29 @@
INTERFACE iicbb;
#
# Default implementation of optional methods
#
CODE {
static int
null_pre_xfer(device_t dev)
{
return 0;
}
static void
null_post_xfer(device_t dev)
{
}
static int
null_callback(device_t dev, int index, caddr_t data)
{
return 0;
}
};
#
# iicbus callback
#
@ -37,7 +60,21 @@ METHOD int callback {
device_t dev;
int index;
caddr_t data;
};
} DEFAULT null_callback;
#
# Prepare device for I2C transfer
#
METHOD int pre_xfer {
device_t dev;
} DEFAULT null_pre_xfer;
#
# Cleanup device after I2C transfer
#
METHOD void post_xfer {
device_t dev;
} DEFAULT null_post_xfer;
#
# Set I2C bus data line