From 501cc8bd09485624beaeecf476739400977489b4 Mon Sep 17 00:00:00 2001 From: Viresh Kumar Date: Thu, 12 May 2016 11:26:48 +0530 Subject: [PATCH] greybus: Fix probing of gpbridge devices The gpbridge core tries to match the driver's id-table against all CPorts available within the bundle for which the gpbridge bus was created. The gpbdev here is unique for a cport_desc and only a single cport_desc->protocol_id should be matched with the driver's id-table. Fix it. Tested on EVT 1.5 with a special manifest for GP module, where multiple CPorts are part of the same Bridged PHY bundle. Fixes: 75223f666687 ("gpbridge: implement gpbridge "bus" logic") Signed-off-by: Viresh Kumar Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/gpbridge.c | 29 ++++++----------------------- 1 file changed, 6 insertions(+), 23 deletions(-) diff --git a/drivers/staging/greybus/gpbridge.c b/drivers/staging/greybus/gpbridge.c index 64ab8ddf2212..adb317deb417 100644 --- a/drivers/staging/greybus/gpbridge.c +++ b/drivers/staging/greybus/gpbridge.c @@ -57,44 +57,27 @@ static int gpbdev_uevent(struct device *dev, struct kobj_uevent_env *env) } static const struct gpbridge_device_id * -gpbdev_match_cport(struct greybus_descriptor_cport *cport_desc, - const struct gpbridge_device_id *id) +gpbdev_match_id(struct gpbridge_device *gpbdev, struct gpbridge_driver *gpbdrv) { + const struct gpbridge_device_id *id = gpbdrv->id_table; + if (!id) return NULL; for (; id->protocol_id; id++) - if (id->protocol_id == cport_desc->protocol_id) + if (id->protocol_id == gpbdev->cport_desc->protocol_id) return id; return NULL; } -static const struct gpbridge_device_id *gpbdev_match_id(struct gb_bundle *bundle, - const struct gpbridge_device_id *id_table) -{ - const struct gpbridge_device_id *id; - int i; - - if (!id_table || !bundle || bundle->num_cports == 0) - return NULL; - - for (i = 0; i < bundle->num_cports; i++) { - id = gpbdev_match_cport(&bundle->cport_desc[i], id_table); - if (id) - return id; - } - - return NULL; -} - static int gpbdev_match(struct device *dev, struct device_driver *drv) { struct gpbridge_driver *gpbdrv = to_gpbridge_driver(drv); struct gpbridge_device *gpbdev = to_gpbridge_dev(dev); const struct gpbridge_device_id *id; - id = gpbdev_match_id(gpbdev->bundle, gpbdrv->id_table); + id = gpbdev_match_id(gpbdev, gpbdrv); if (id) return 1; @@ -107,7 +90,7 @@ static int gpbdev_probe(struct device *dev) struct gpbridge_device *gpbdev = to_gpbridge_dev(dev); const struct gpbridge_device_id *id; - id = gpbdev_match_id(gpbdev->bundle, gpbdrv->id_table); + id = gpbdev_match_id(gpbdev, gpbdrv); if (!id) return -ENODEV;