mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-04 04:04:19 +00:00
Staging: ipack: Implement device matching on the bus level.
Devices are match based upon their vendor and device ids. Since the individual drivers provide a list of supported ids they do not need to implement the matching themselves. Signed-off-by: Jens Taprogge <jens.taprogge@taprogge.org> Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
fdfc8cf5d2
commit
4aa09d47d4
@ -777,27 +777,6 @@ static const struct tty_operations ipoctal_fops = {
|
|||||||
.hangup = ipoctal_hangup,
|
.hangup = ipoctal_hangup,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int ipoctal_match(struct ipack_device *dev)
|
|
||||||
{
|
|
||||||
int res;
|
|
||||||
unsigned char board_id;
|
|
||||||
|
|
||||||
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 0;
|
|
||||||
|
|
||||||
res = ipoctal_check_model(dev, &board_id);
|
|
||||||
dev->bus->ops->unmap_space(dev, IPACK_ID_SPACE);
|
|
||||||
if (!res)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ipoctal_probe(struct ipack_device *dev)
|
static int ipoctal_probe(struct ipack_device *dev)
|
||||||
{
|
{
|
||||||
int res;
|
int res;
|
||||||
@ -858,8 +837,7 @@ static DEFINE_IPACK_DEVICE_TABLE(ipoctal_ids) = {
|
|||||||
MODULE_DEVICE_TABLE(ipack, ipoctal_ids);
|
MODULE_DEVICE_TABLE(ipack, ipoctal_ids);
|
||||||
|
|
||||||
static const struct ipack_driver_ops ipoctal_drv_ops = {
|
static const struct ipack_driver_ops ipoctal_drv_ops = {
|
||||||
.match = ipoctal_match,
|
.probe = ipoctal_probe,
|
||||||
.probe = ipoctal_probe,
|
|
||||||
.remove = ipoctal_remove,
|
.remove = ipoctal_remove,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -26,20 +26,43 @@ static void ipack_device_release(struct device *dev)
|
|||||||
kfree(device);
|
kfree(device);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ipack_bus_match(struct device *device, struct device_driver *driver)
|
static inline const struct ipack_device_id *
|
||||||
|
ipack_match_one_device(const struct ipack_device_id *id,
|
||||||
|
const struct ipack_device *device)
|
||||||
{
|
{
|
||||||
int ret;
|
if ((id->format == IPACK_ANY_ID || id->format == device->id_format) &&
|
||||||
struct ipack_device *dev = to_ipack_dev(device);
|
(id->vendor == IPACK_ANY_ID || id->vendor == device->id_vendor) &&
|
||||||
struct ipack_driver *drv = to_ipack_driver(driver);
|
(id->device == IPACK_ANY_ID || id->device == device->id_device))
|
||||||
|
return id;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if ((!drv->ops) || (!drv->ops->match))
|
static const struct ipack_device_id *
|
||||||
return -EINVAL;
|
ipack_match_id(const struct ipack_device_id *ids, struct ipack_device *idev)
|
||||||
|
{
|
||||||
|
if (ids) {
|
||||||
|
while (ids->vendor || ids->device) {
|
||||||
|
if (ipack_match_one_device(ids, idev))
|
||||||
|
return ids;
|
||||||
|
ids++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ret = drv->ops->match(dev);
|
static int ipack_bus_match(struct device *dev, struct device_driver *drv)
|
||||||
if (ret)
|
{
|
||||||
dev->driver = drv;
|
struct ipack_device *idev = to_ipack_dev(dev);
|
||||||
|
struct ipack_driver *idrv = to_ipack_driver(drv);
|
||||||
|
const struct ipack_device_id *found_id;
|
||||||
|
|
||||||
return ret;
|
found_id = ipack_match_id(idrv->id_table, idev);
|
||||||
|
if (found_id) {
|
||||||
|
idev->driver = idrv;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ipack_bus_probe(struct device *device)
|
static int ipack_bus_probe(struct device *device)
|
||||||
|
@ -84,13 +84,11 @@ struct ipack_device {
|
|||||||
/**
|
/**
|
||||||
* struct ipack_driver_ops -- callbacks to mezzanine driver for installing/removing one device
|
* struct ipack_driver_ops -- callbacks to mezzanine driver for installing/removing one device
|
||||||
*
|
*
|
||||||
* @match: Match function
|
|
||||||
* @probe: Probe function
|
* @probe: Probe function
|
||||||
* @remove: tell the driver that the carrier board wants to remove one device
|
* @remove: tell the driver that the carrier board wants to remove one device
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct ipack_driver_ops {
|
struct ipack_driver_ops {
|
||||||
int (*match) (struct ipack_device *dev);
|
|
||||||
int (*probe) (struct ipack_device *dev);
|
int (*probe) (struct ipack_device *dev);
|
||||||
void (*remove) (struct ipack_device *dev);
|
void (*remove) (struct ipack_device *dev);
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user