diff options
author | Samuel Iglesias Gonsalvez | 2012-05-18 11:10:05 +0200 |
---|---|---|
committer | Greg Kroah-Hartman | 2012-05-19 02:36:01 +0200 |
commit | ec440335b1e360ab82ef4ce169b682ab4b9dcd2a (patch) | |
tree | 71988f8e57c65f75784e5b6ae60fb3b64629cd69 /drivers/staging/ipack/devices | |
parent | staging: comedi: cleanup all the comedi_driver 'detach' functions (diff) | |
download | kernel-qcow2-linux-ec440335b1e360ab82ef4ce169b682ab4b9dcd2a.tar.gz kernel-qcow2-linux-ec440335b1e360ab82ef4ce169b682ab4b9dcd2a.tar.xz kernel-qcow2-linux-ec440335b1e360ab82ef4ce169b682ab4b9dcd2a.zip |
Staging: ipack: improve the register of a bus and a device in the bus.
It adds and removes some fields in the struct ipack_device and
ipack_bus_device to make it cleaner.
The API has change to group all the operations on these structures inside
of the ipack driver.
Signed-off-by: Samuel Iglesias Gonsalvez <siglesias@igalia.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/ipack/devices')
-rw-r--r-- | drivers/staging/ipack/devices/ipoctal.c | 55 |
1 files changed, 32 insertions, 23 deletions
diff --git a/drivers/staging/ipack/devices/ipoctal.c b/drivers/staging/ipack/devices/ipoctal.c index c88f391ca62c..29f6fa841d23 100644 --- a/drivers/staging/ipack/devices/ipoctal.c +++ b/drivers/staging/ipack/devices/ipoctal.c @@ -73,7 +73,8 @@ static inline void ipoctal_write_io_reg(struct ipoctal *ipoctal, unsigned long offset; offset = ((void __iomem *) dest) - ipoctal->dev->io_space.address; - ipoctal->dev->ops->write8(ipoctal->dev, IPACK_IO_SPACE, offset, value); + ipoctal->dev->bus->ops->write8(ipoctal->dev, IPACK_IO_SPACE, offset, + value); } static inline void ipoctal_write_cr_cmd(struct ipoctal *ipoctal, @@ -90,7 +91,8 @@ static inline unsigned char ipoctal_read_io_reg(struct ipoctal *ipoctal, unsigned char value; offset = ((void __iomem *) src) - ipoctal->dev->io_space.address; - ipoctal->dev->ops->read8(ipoctal->dev, IPACK_IO_SPACE, offset, &value); + ipoctal->dev->bus->ops->read8(ipoctal->dev, IPACK_IO_SPACE, offset, + &value); return value; } @@ -341,12 +343,12 @@ static int ipoctal_check_model(struct ipack_device *dev, unsigned char *id) unsigned char manufacturerID; unsigned char board_id; - dev->ops->read8(dev, IPACK_ID_SPACE, + dev->bus->ops->read8(dev, IPACK_ID_SPACE, IPACK_IDPROM_OFFSET_MANUFACTURER_ID, &manufacturerID); if (manufacturerID != IP_OCTAL_MANUFACTURER_ID) return -ENODEV; - dev->ops->read8(dev, IPACK_ID_SPACE, + dev->bus->ops->read8(dev, IPACK_ID_SPACE, IPACK_IDPROM_OFFSET_MODEL, (unsigned char *)&board_id); switch (board_id) { @@ -376,7 +378,8 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr, char name[20]; unsigned char board_id; - res = ipoctal->dev->ops->map_space(ipoctal->dev, 0, IPACK_ID_SPACE); + res = ipoctal->dev->bus->ops->map_space(ipoctal->dev, 0, + IPACK_ID_SPACE); if (res) { pr_err("Unable to map slot [%d:%d] ID space!\n", bus_nr, slot); return res; @@ -384,18 +387,20 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr, res = ipoctal_check_model(ipoctal->dev, &board_id); if (res) { - ipoctal->dev->ops->unmap_space(ipoctal->dev, IPACK_ID_SPACE); + ipoctal->dev->bus->ops->unmap_space(ipoctal->dev, + IPACK_ID_SPACE); goto out_unregister_id_space; } ipoctal->board_id = board_id; - res = ipoctal->dev->ops->map_space(ipoctal->dev, 0, IPACK_IO_SPACE); + res = ipoctal->dev->bus->ops->map_space(ipoctal->dev, 0, + IPACK_IO_SPACE); if (res) { pr_err("Unable to map slot [%d:%d] IO space!\n", bus_nr, slot); goto out_unregister_id_space; } - res = ipoctal->dev->ops->map_space(ipoctal->dev, + res = ipoctal->dev->bus->ops->map_space(ipoctal->dev, 0x8000, IPACK_MEM_SPACE); if (res) { pr_err("Unable to map slot [%d:%d] MEM space!\n", bus_nr, slot); @@ -434,9 +439,9 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr, * Depending of the carrier these addresses are accesible or not. * More info in the datasheet. */ - ipoctal->dev->ops->request_irq(ipoctal->dev, vector, + ipoctal->dev->bus->ops->request_irq(ipoctal->dev, vector, ipoctal_irq_handler, ipoctal); - ipoctal->dev->ops->write8(ipoctal->dev, IPACK_ID_SPACE, 0, vector); + ipoctal->dev->bus->ops->write8(ipoctal->dev, IPACK_ID_SPACE, 0, vector); /* Register the TTY device */ @@ -502,11 +507,11 @@ static int ipoctal_inst_slot(struct ipoctal *ipoctal, unsigned int bus_nr, return 0; out_unregister_slot_unmap: - ipoctal->dev->ops->unmap_space(ipoctal->dev, IPACK_ID_SPACE); + ipoctal->dev->bus->ops->unmap_space(ipoctal->dev, IPACK_ID_SPACE); out_unregister_io_space: - ipoctal->dev->ops->unmap_space(ipoctal->dev, IPACK_IO_SPACE); + ipoctal->dev->bus->ops->unmap_space(ipoctal->dev, IPACK_IO_SPACE); out_unregister_id_space: - ipoctal->dev->ops->unmap_space(ipoctal->dev, IPACK_MEM_SPACE); + ipoctal->dev->bus->ops->unmap_space(ipoctal->dev, IPACK_MEM_SPACE); return res; } @@ -799,13 +804,20 @@ static int ipoctal_match(struct ipack_device *dev) int res; unsigned char board_id; - res = dev->ops->map_space(dev, 0, IPACK_ID_SPACE); + if ((!dev->bus->ops) || (!dev->bus->ops->map_space) || + (!dev->bus->ops->unmap_space)) + return 0; + + res = dev->bus->ops->map_space(dev, 0, IPACK_ID_SPACE); if (res) - return res; + return 0; res = ipoctal_check_model(dev, &board_id); - dev->ops->unmap_space(dev, IPACK_ID_SPACE); - return res; + dev->bus->ops->unmap_space(dev, IPACK_ID_SPACE); + if (!res) + return 1; + + return 0; } static int ipoctal_probe(struct ipack_device *dev) @@ -843,8 +855,8 @@ static void __ipoctal_remove(struct ipoctal *ipoctal) put_tty_driver(ipoctal->tty_drv); /* Tell the carrier board to free all the resources for this device */ - if (ipoctal->dev->ops->remove_device != NULL) - ipoctal->dev->ops->remove_device(ipoctal->dev); + if (ipoctal->dev->bus->ops->remove_device != NULL) + ipoctal->dev->bus->ops->remove_device(ipoctal->dev); list_del(&ipoctal->list); kfree(ipoctal); @@ -868,11 +880,8 @@ static struct ipack_driver_ops ipoctal_drv_ops = { static int __init ipoctal_init(void) { - driver.owner = THIS_MODULE; driver.ops = &ipoctal_drv_ops; - driver.driver.name = KBUILD_MODNAME; - ipack_driver_register(&driver); - return 0; + return ipack_driver_register(&driver, THIS_MODULE, KBUILD_MODNAME); } static void __exit ipoctal_exit(void) |