浏览代码

USB: bcma: separate code initializing USB 2.0 core

This splits one big probing function into two smaller ones. The main one
is now responsible for the generic stuff: allocating memory & enabling
power using GPIO. The new one contains code that is specific to the USB
2.0 bcma core.
This will allow adding support for the USB 3.0 bcma core (handling XHCI)
in the future.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Rafał Miłecki 9 年之前
父节点
当前提交
adbff3a4f9
共有 1 个文件被更改,包括 39 次插入20 次删除
  1. 39 20
      drivers/usb/host/bcma-hcd.c

+ 39 - 20
drivers/usb/host/bcma-hcd.c

@@ -35,6 +35,7 @@ MODULE_DESCRIPTION("Common USB driver for BCMA Bus");
 MODULE_LICENSE("GPL");
 MODULE_LICENSE("GPL");
 
 
 struct bcma_hcd_device {
 struct bcma_hcd_device {
+	struct bcma_device *core;
 	struct platform_device *ehci_dev;
 	struct platform_device *ehci_dev;
 	struct platform_device *ohci_dev;
 	struct platform_device *ohci_dev;
 	struct gpio_desc *gpio_desc;
 	struct gpio_desc *gpio_desc;
@@ -288,31 +289,16 @@ err_alloc:
 	return ERR_PTR(ret);
 	return ERR_PTR(ret);
 }
 }
 
 
-static int bcma_hcd_probe(struct bcma_device *dev)
+static int bcma_hcd_usb20_init(struct bcma_hcd_device *usb_dev)
 {
 {
-	int err;
+	struct bcma_device *dev = usb_dev->core;
+	struct bcma_chipinfo *chipinfo = &dev->bus->chipinfo;
 	u32 ohci_addr;
 	u32 ohci_addr;
-	struct bcma_hcd_device *usb_dev;
-	struct bcma_chipinfo *chipinfo;
-
-	chipinfo = &dev->bus->chipinfo;
-
-	/* TODO: Probably need checks here; is the core connected? */
+	int err;
 
 
 	if (dma_set_mask_and_coherent(dev->dma_dev, DMA_BIT_MASK(32)))
 	if (dma_set_mask_and_coherent(dev->dma_dev, DMA_BIT_MASK(32)))
 		return -EOPNOTSUPP;
 		return -EOPNOTSUPP;
 
 
-	usb_dev = devm_kzalloc(&dev->dev, sizeof(struct bcma_hcd_device),
-			       GFP_KERNEL);
-	if (!usb_dev)
-		return -ENOMEM;
-
-	if (dev->dev.of_node)
-		usb_dev->gpio_desc = devm_get_gpiod_from_child(&dev->dev, "vcc",
-							       &dev->dev.of_node->fwnode);
-	if (!IS_ERR_OR_NULL(usb_dev->gpio_desc))
-		gpiod_direction_output(usb_dev->gpio_desc, 1);
-
 	switch (dev->id.id) {
 	switch (dev->id.id) {
 	case BCMA_CORE_NS_USB20:
 	case BCMA_CORE_NS_USB20:
 		bcma_hcd_init_chip_arm(dev);
 		bcma_hcd_init_chip_arm(dev);
@@ -345,7 +331,6 @@ static int bcma_hcd_probe(struct bcma_device *dev)
 		goto err_unregister_ohci_dev;
 		goto err_unregister_ohci_dev;
 	}
 	}
 
 
-	bcma_set_drvdata(dev, usb_dev);
 	return 0;
 	return 0;
 
 
 err_unregister_ohci_dev:
 err_unregister_ohci_dev:
@@ -353,6 +338,40 @@ err_unregister_ohci_dev:
 	return err;
 	return err;
 }
 }
 
 
+static int bcma_hcd_probe(struct bcma_device *core)
+{
+	int err;
+	struct bcma_hcd_device *usb_dev;
+
+	/* TODO: Probably need checks here; is the core connected? */
+
+	usb_dev = devm_kzalloc(&core->dev, sizeof(struct bcma_hcd_device),
+			       GFP_KERNEL);
+	if (!usb_dev)
+		return -ENOMEM;
+	usb_dev->core = core;
+
+	if (core->dev.of_node)
+		usb_dev->gpio_desc = devm_get_gpiod_from_child(&core->dev, "vcc",
+							       &core->dev.of_node->fwnode);
+	if (!IS_ERR_OR_NULL(usb_dev->gpio_desc))
+		gpiod_direction_output(usb_dev->gpio_desc, 1);
+
+	switch (core->id.id) {
+	case BCMA_CORE_USB20_HOST:
+	case BCMA_CORE_NS_USB20:
+		err = bcma_hcd_usb20_init(usb_dev);
+		if (err)
+			return err;
+		break;
+	default:
+		return -ENODEV;
+	}
+
+	bcma_set_drvdata(core, usb_dev);
+	return 0;
+}
+
 static void bcma_hcd_remove(struct bcma_device *dev)
 static void bcma_hcd_remove(struct bcma_device *dev)
 {
 {
 	struct bcma_hcd_device *usb_dev = bcma_get_drvdata(dev);
 	struct bcma_hcd_device *usb_dev = bcma_get_drvdata(dev);