summaryrefslogtreecommitdiffstats
path: root/drivers/staging/unisys/visorbus/visorbus_main.c
diff options
context:
space:
mode:
authorDon Zickus2015-06-04 15:22:41 +0200
committerGreg Kroah-Hartman2015-06-08 22:36:43 +0200
commitd32517e392b90354f79f6c7a357f96c37b5fe4fd (patch)
treecce91d403b092d2d8f83d8b1a84abba17c4333be /drivers/staging/unisys/visorbus/visorbus_main.c
parentstaging: unisys: Do not use 0 as the default bus root device number (diff)
downloadkernel-qcow2-linux-d32517e392b90354f79f6c7a357f96c37b5fe4fd.tar.gz
kernel-qcow2-linux-d32517e392b90354f79f6c7a357f96c37b5fe4fd.tar.xz
kernel-qcow2-linux-d32517e392b90354f79f6c7a357f96c37b5fe4fd.zip
staging: unisys: Convert bus creation to use visor_device
This patch removes the legacy bus_info struct and instead creates and passes around a traditional struct device. This allows us to remove a lot of the various look up code and removes the doubt if the struct exists or not. Half of the churn is just the conversion of visorchipset_bus_info to visor_device. Various cleanups include re-arranging the failure paths to make more sense. Signed-off-by: Don Zickus <dzickus@redhat.com> Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/unisys/visorbus/visorbus_main.c')
-rw-r--r--drivers/staging/unisys/visorbus/visorbus_main.c131
1 files changed, 48 insertions, 83 deletions
diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index ec3022b5af9b..60bdf69264df 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -93,8 +93,8 @@ static struct workqueue_struct *periodic_dev_workqueue;
static long long bus_count; /** number of bus instances */
/** ever-increasing */
-static void chipset_bus_create(struct visorchipset_bus_info *bus_info);
-static void chipset_bus_destroy(struct visorchipset_bus_info *bus_info);
+static void chipset_bus_create(struct visor_device *bus_info);
+static void chipset_bus_destroy(struct visor_device *bus_info);
static void chipset_device_create(struct visorchipset_device_info *dev_info);
static void chipset_device_destroy(struct visorchipset_device_info *dev_info);
static void chipset_device_pause(struct visorchipset_device_info *dev_info);
@@ -950,8 +950,7 @@ EXPORT_SYMBOL_GPL(visorbus_disable_channel_interrupts);
*/
static int
create_visor_device(struct visor_device *bdev,
- struct visorchipset_device_info *dev_info,
- u64 partition_handle)
+ struct visorchipset_device_info *dev_info)
{
int rc = -1;
struct visor_device *dev = NULL;
@@ -1161,8 +1160,7 @@ static void
fix_vbus_dev_info(struct visor_device *visordev)
{
int i;
- struct visorchipset_bus_info bus_info;
- struct visor_device *dev = NULL;
+ struct visor_device *bdev;
struct visor_driver *visordrv;
int bus_no = visordev->chipset_bus_no;
int dev_no = visordev->chipset_dev_no;
@@ -1174,17 +1172,14 @@ fix_vbus_dev_info(struct visor_device *visordev)
return;
hdr_info = (struct spar_vbus_headerinfo *)visordev->vbus_hdr_info;
+ if (!hdr_info)
+ return;
- visordrv = to_visor_driver(visordev->device.driver);
- if (!visorchipset_get_bus_info(bus_no, &bus_info))
- return;
-
- dev = (struct visor_device *)(bus_info.bus_driver_context);
- if (!dev)
- return;
+ bdev = visorbus_get_device_by_id(bus_no, BUS_ROOT_DEVICE, NULL);
+ if (!bdev)
+ return;
- if (!hdr_info)
- return;
+ visordrv = to_visor_driver(visordev->device.driver);
/* Within the list of device types (by GUID) that the driver
* says it supports, find out which one of those types matches
@@ -1203,51 +1198,45 @@ fix_vbus_dev_info(struct visor_device *visordev)
bus_device_info_init(&dev_info, chan_type_name,
visordrv->name, visordrv->version,
visordrv->vertag);
- write_vbus_dev_info(dev->visorchannel, hdr_info, &dev_info, dev_no);
+ write_vbus_dev_info(bdev->visorchannel, hdr_info, &dev_info, dev_no);
/* Re-write bus+chipset info, because it is possible that this
* was previously written by our evil counterpart, virtpci.
*/
- write_vbus_chp_info(dev->visorchannel, hdr_info, &chipset_driverinfo);
- write_vbus_bus_info(dev->visorchannel, hdr_info, &clientbus_driverinfo);
+ write_vbus_chp_info(bdev->visorchannel, hdr_info, &chipset_driverinfo);
+ write_vbus_bus_info(bdev->visorchannel, hdr_info,
+ &clientbus_driverinfo);
}
/** Create a device instance for the visor bus itself.
*/
-static struct visor_device *
-create_bus_instance(struct visorchipset_bus_info *bus_info)
+static int
+create_bus_instance(struct visor_device *dev)
{
- struct visor_device *rc = NULL;
- struct visor_device *dev = NULL;
- int id = bus_info->bus_no;
+ int rc;
+ int id = dev->chipset_bus_no;
struct spar_vbus_headerinfo *hdr_info;
POSTCODE_LINUX_2(BUS_CREATE_ENTRY_PC, POSTCODE_SEVERITY_INFO);
- dev = kzalloc(sizeof(*dev), GFP_KERNEL);
- if (!dev) {
- POSTCODE_LINUX_2(MALLOC_FAILURE_PC, POSTCODE_SEVERITY_ERR);
- rc = NULL;
- goto away;
- }
hdr_info = kzalloc(sizeof(*hdr_info), GFP_KERNEL);
if (!hdr_info) {
- rc = NULL;
- goto away_mem;
+ rc = -1;
+ goto away;
}
dev_set_name(&dev->device, "visorbus%d", id);
dev->device.bus = &visorbus_type;
dev->device.groups = visorbus_groups;
dev->device.release = visorbus_release_busdevice;
+
if (device_register(&dev->device) < 0) {
POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, id,
POSTCODE_SEVERITY_ERR);
- rc = NULL;
- goto away_mem2;
+ rc = -1;
+ goto away_mem;
}
- dev->chipset_bus_no = id;
- dev->visorchannel = bus_info->visorchannel;
+
if (get_vbus_header_info(dev->visorchannel, hdr_info) >= 0) {
dev->vbus_hdr_info = (void *)hdr_info;
write_vbus_chp_info(dev->visorchannel, hdr_info,
@@ -1259,16 +1248,11 @@ create_bus_instance(struct visorchipset_bus_info *bus_info)
}
bus_count++;
list_add_tail(&dev->list_all, &list_all_bus_instances);
- if (id == 0)
- dev = dev; /* for testing ONLY */
dev_set_drvdata(&dev->device, dev);
- rc = dev;
- return rc;
+ return 0;
-away_mem2:
- kfree(hdr_info);
away_mem:
- kfree(dev);
+ kfree(hdr_info);
away:
return rc;
}
@@ -1331,57 +1315,38 @@ remove_all_visor_devices(void)
}
static void
-chipset_bus_create(struct visorchipset_bus_info *bus_info)
+chipset_bus_create(struct visor_device *dev)
{
- struct visor_device *dev;
- int rc = -1;
- u32 bus_no = bus_info->bus_no;
+ int rc;
+ u32 bus_no = dev->chipset_bus_no;
POSTCODE_LINUX_3(BUS_CREATE_ENTRY_PC, bus_no, POSTCODE_SEVERITY_INFO);
- dev = create_bus_instance(bus_info);
- if (!dev)
- goto away;
- if (!visorchipset_set_bus_context(bus_info, dev))
- goto away;
+ rc = create_bus_instance(dev);
POSTCODE_LINUX_3(BUS_CREATE_EXIT_PC, bus_no, POSTCODE_SEVERITY_INFO);
- rc = 0;
-away:
- if (rc < 0) {
+
+ if (rc < 0)
POSTCODE_LINUX_3(BUS_CREATE_FAILURE_PC, bus_no,
POSTCODE_SEVERITY_ERR);
- return;
- }
- POSTCODE_LINUX_3(CHIPSET_INIT_SUCCESS_PC, bus_no,
- POSTCODE_SEVERITY_INFO);
+ else
+ POSTCODE_LINUX_3(CHIPSET_INIT_SUCCESS_PC, bus_no,
+ POSTCODE_SEVERITY_INFO);
+
if (chipset_responders.bus_create)
- (*chipset_responders.bus_create) (bus_info, rc);
+ (*chipset_responders.bus_create) (dev, rc);
}
static void
-chipset_bus_destroy(struct visorchipset_bus_info *bus_info)
+chipset_bus_destroy(struct visor_device *dev)
{
- struct visor_device *dev;
- int rc = -1;
-
- dev = (struct visor_device *)(bus_info->bus_driver_context);
- if (!dev)
- goto away;
remove_bus_instance(dev);
- if (!visorchipset_set_bus_context(bus_info, NULL))
- goto away;
- rc = 0;
-away:
- if (rc < 0)
- return;
if (chipset_responders.bus_destroy)
- (*chipset_responders.bus_destroy)(bus_info, rc);
+ (*chipset_responders.bus_destroy)(dev, 0);
}
static void
chipset_device_create(struct visorchipset_device_info *dev_info)
{
- struct visorchipset_bus_info bus_info;
- struct visor_device *dev = NULL;
+ struct visor_device *bdev;
int rc = -1;
u32 bus_no = dev_info->bus_no;
u32 dev_no = dev_info->dev_no;
@@ -1389,24 +1354,24 @@ chipset_device_create(struct visorchipset_device_info *dev_info)
POSTCODE_LINUX_4(DEVICE_CREATE_ENTRY_PC, dev_no, bus_no,
POSTCODE_SEVERITY_INFO);
- if (!visorchipset_get_bus_info(bus_no, &bus_info))
+ bdev = visorbus_get_device_by_id(bus_no, BUS_ROOT_DEVICE, NULL);
+ if (!bdev)
goto away;
+
POSTCODE_LINUX_4(DEVICE_CREATE_EXIT_PC, dev_no, bus_no,
POSTCODE_SEVERITY_INFO);
- rc = 0;
+
+ rc = create_visor_device(bdev, dev_info);
away:
if (rc < 0) {
POSTCODE_LINUX_4(DEVICE_CREATE_FAILURE_PC, dev_no, bus_no,
POSTCODE_SEVERITY_ERR);
- return;
+ if (chipset_responders.device_create)
+ (*chipset_responders.device_create)(dev_info, rc);
}
- dev = (struct visor_device *)(bus_info.bus_driver_context);
- rc = create_visor_device(dev, dev_info, bus_info.partition_handle);
+
POSTCODE_LINUX_4(DEVICE_CREATE_SUCCESS_PC, dev_no, bus_no,
POSTCODE_SEVERITY_INFO);
- if (rc < 0)
- if (chipset_responders.device_create)
- (*chipset_responders.device_create)(dev_info, rc);
}
static void