[RESEND PATCH 04/15] usb: dwc2: gadget: Change the gadget probe function into gadget_init

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Dinh Nguyen <dinguyen@xxxxxxxxxx>

gadget_init() will get called from the platform probe function.

Signed-off-by: Dinh Nguyen <dinguyen@xxxxxxxxxx>
---
 drivers/usb/dwc2/gadget.c |  144 +++++++++++++++++----------------------------
 1 file changed, 55 insertions(+), 89 deletions(-)

diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 171ed28..e74656c 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -3372,25 +3372,24 @@ static void s3c_hsotg_delete_debug(struct dwc2_hsotg *dwc2)
 }
 
 /**
- * s3c_hsotg_probe - probe function for hsotg driver
- * @pdev: The platform information for the driver
+ * dwc2_gadget_init - init function for gadget
+ * @dwc2: The data structure for the DWC2 driver.
+ * @irq: The IRQ number for the controller.
  */
 
-static int s3c_hsotg_probe(struct platform_device *pdev)
+static int dwc2_gadget_init(struct dwc2_hsotg *dwc2, int irq)
 {
-	struct s3c_hsotg_plat *plat = dev_get_platdata(&pdev->dev);
+	struct s3c_hsotg_plat *plat = dwc2->dev->platform_data;
 	struct phy *phy;
 	struct usb_phy *uphy;
-	struct device *dev = &pdev->dev;
+	struct device *dev = dwc2->dev;
 	struct s3c_hsotg_ep *eps;
-	struct s3c_hsotg *hsotg;
-	struct resource *res;
 	int epnum;
 	int ret;
 	int i;
 
-	hsotg = devm_kzalloc(&pdev->dev, sizeof(struct s3c_hsotg), GFP_KERNEL);
-	if (!hsotg) {
+	dwc2->s3c_hsotg = devm_kzalloc(dev, sizeof(struct s3c_hsotg), GFP_KERNEL);
+	if (!dwc2->s3c_hsotg) {
 		dev_err(dev, "cannot get memory\n");
 		return -ENOMEM;
 	}
@@ -3399,117 +3398,84 @@ static int s3c_hsotg_probe(struct platform_device *pdev)
 	 * Attempt to find a generic PHY, then look for an old style
 	 * USB PHY, finally fall back to pdata
 	 */
-	phy = devm_phy_get(&pdev->dev, "usb2-phy");
+	phy = devm_phy_get(dev, "usb2-phy");
 	if (IS_ERR(phy)) {
 		uphy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
 		if (IS_ERR(uphy)) {
 			/* Fallback for pdata */
-			plat = dev_get_platdata(&pdev->dev);
+			plat = dev_get_platdata(dev);
 			if (!plat) {
-				dev_err(&pdev->dev,
+				dev_err(dev,
 				"no platform data or transceiver defined\n");
 				return -EPROBE_DEFER;
 			}
-			hsotg->plat = plat;
+			dwc2->s3c_hsotg->plat = plat;
 		} else
-			hsotg->uphy = uphy;
+			dwc2->s3c_hsotg->uphy = uphy;
 	} else
-		hsotg->phy = phy;
+		dwc2->s3c_hsotg->phy = phy;
 
-	hsotg->dev = dev;
-
-	hsotg->clk = devm_clk_get(&pdev->dev, "otg");
-	if (IS_ERR(hsotg->clk)) {
+	dwc2->s3c_hsotg->clk = devm_clk_get(dev, "otg");
+	if (IS_ERR(dwc2->s3c_hsotg->clk)) {
 		dev_err(dev, "cannot get otg clock\n");
-		return PTR_ERR(hsotg->clk);
-	}
-
-	platform_set_drvdata(pdev, hsotg);
-
-	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-
-	hsotg->regs = devm_ioremap_resource(&pdev->dev, res);
-	if (IS_ERR(hsotg->regs)) {
-		ret = PTR_ERR(hsotg->regs);
-		goto err_clk;
-	}
-
-	ret = platform_get_irq(pdev, 0);
-	if (ret < 0) {
-		dev_err(dev, "cannot find IRQ\n");
-		goto err_clk;
-	}
-
-	spin_lock_init(&hsotg->lock);
-
-	hsotg->irq = ret;
-
-	ret = devm_request_irq(&pdev->dev, hsotg->irq, s3c_hsotg_irq, 0,
-				dev_name(dev), hsotg);
-	if (ret < 0) {
-		dev_err(dev, "cannot claim IRQ\n");
-		goto err_clk;
+		return PTR_ERR(dwc2->s3c_hsotg->clk);
 	}
 
-	dev_info(dev, "regs %p, irq %d\n", hsotg->regs, hsotg->irq);
-
-	hsotg->gadget.max_speed = USB_SPEED_HIGH;
-	hsotg->gadget.ops = &s3c_hsotg_gadget_ops;
-	hsotg->gadget.name = dev_name(dev);
+	dwc2->gadget.max_speed = USB_SPEED_HIGH;
+	dwc2->gadget.ops = &s3c_hsotg_gadget_ops;
+	dwc2->gadget.name = dev_name(dev);
 
-	/* reset the system */
-
-	clk_prepare_enable(hsotg->clk);
+	clk_prepare_enable(dwc2->s3c_hsotg->clk);
 
 	/* regulators */
 
-	for (i = 0; i < ARRAY_SIZE(hsotg->supplies); i++)
-		hsotg->supplies[i].supply = s3c_hsotg_supply_names[i];
+	for (i = 0; i < ARRAY_SIZE(dwc2->s3c_hsotg->supplies); i++)
+		dwc2->s3c_hsotg->supplies[i].supply = s3c_hsotg_supply_names[i];
 
-	ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(hsotg->supplies),
-				 hsotg->supplies);
+	ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(dwc2->s3c_hsotg->supplies),
+				 dwc2->s3c_hsotg->supplies);
 	if (ret) {
 		dev_err(dev, "failed to request supplies: %d\n", ret);
 		goto err_clk;
 	}
 
-	ret = regulator_bulk_enable(ARRAY_SIZE(hsotg->supplies),
-				    hsotg->supplies);
+	ret = regulator_bulk_enable(ARRAY_SIZE(dwc2->s3c_hsotg->supplies),
+				    dwc2->s3c_hsotg->supplies);
 
 	if (ret) {
-		dev_err(hsotg->dev, "failed to enable supplies: %d\n", ret);
+		dev_err(dev, "failed to enable supplies: %d\n", ret);
 		goto err_supplies;
 	}
 
 	/* Set default UTMI width */
-	hsotg->phyif = GUSBCFG_PHYIF16;
+	dwc2->s3c_hsotg->phyif = GUSBCFG_PHYIF16;
 
 	/*
 	 * If using the generic PHY framework, check if the PHY bus
 	 * width is 8-bit and set the phyif appropriately.
 	 */
-	if (hsotg->phy && (phy_get_bus_width(phy) == 8))
-		hsotg->phyif = GUSBCFG_PHYIF8;
+	if (dwc2->s3c_hsotg->phy && (phy_get_bus_width(phy) == 8))
+		dwc2->s3c_hsotg->phyif = GUSBCFG_PHYIF8;
 
-	if (hsotg->phy)
-		phy_init(hsotg->phy);
+	if (dwc2->s3c_hsotg->phy)
+		phy_init(dwc2->s3c_hsotg->phy);
 
 	/* usb phy enable */
-	s3c_hsotg_phy_enable(hsotg);
+	s3c_hsotg_phy_enable(dwc2);
 
-	s3c_hsotg_corereset(hsotg);
-	s3c_hsotg_init(hsotg);
-	s3c_hsotg_hw_cfg(hsotg);
+	s3c_hsotg_corereset(dwc2);
+	s3c_hsotg_init(dwc2);
+	s3c_hsotg_hw_cfg(dwc2);
 
 	/* hsotg->num_of_eps holds number of EPs other than ep0 */
 
-	if (hsotg->num_of_eps == 0) {
+	if (dwc2->s3c_hsotg->num_of_eps == 0) {
 		dev_err(dev, "wrong number of EPs (zero)\n");
 		ret = -EINVAL;
 		goto err_supplies;
 	}
 
-	eps = kcalloc(hsotg->num_of_eps + 1, sizeof(struct s3c_hsotg_ep),
+	eps = kcalloc(dwc2->s3c_hsotg->num_of_eps + 1, sizeof(struct s3c_hsotg_ep),
 		      GFP_KERNEL);
 	if (!eps) {
 		dev_err(dev, "cannot get memory\n");
@@ -3517,54 +3483,54 @@ static int s3c_hsotg_probe(struct platform_device *pdev)
 		goto err_supplies;
 	}
 
-	hsotg->eps = eps;
+	dwc2->eps = eps;
 
 	/* setup endpoint information */
 
-	INIT_LIST_HEAD(&hsotg->gadget.ep_list);
-	hsotg->gadget.ep0 = &hsotg->eps[0].ep;
+	INIT_LIST_HEAD(&dwc2->gadget.ep_list);
+	dwc2->gadget.ep0 = &dwc2->eps[0].ep;
 
 	/* allocate EP0 request */
 
-	hsotg->ctrl_req = s3c_hsotg_ep_alloc_request(&hsotg->eps[0].ep,
+	dwc2->s3c_hsotg->ctrl_req = s3c_hsotg_ep_alloc_request(&dwc2->eps[0].ep,
 						     GFP_KERNEL);
-	if (!hsotg->ctrl_req) {
+	if (!dwc2->s3c_hsotg->ctrl_req) {
 		dev_err(dev, "failed to allocate ctrl req\n");
 		ret = -ENOMEM;
 		goto err_ep_mem;
 	}
 
 	/* initialise the endpoints now the core has been initialised */
-	for (epnum = 0; epnum < hsotg->num_of_eps; epnum++)
-		s3c_hsotg_initep(hsotg, &hsotg->eps[epnum], epnum);
+	for (epnum = 0; epnum < dwc2->s3c_hsotg->num_of_eps; epnum++)
+		s3c_hsotg_initep(dwc2, &dwc2->eps[epnum], epnum);
 
 	/* disable power and clock */
 
-	ret = regulator_bulk_disable(ARRAY_SIZE(hsotg->supplies),
-				    hsotg->supplies);
+	ret = regulator_bulk_disable(ARRAY_SIZE(dwc2->s3c_hsotg->supplies),
+				    dwc2->s3c_hsotg->supplies);
 	if (ret) {
-		dev_err(hsotg->dev, "failed to disable supplies: %d\n", ret);
+		dev_err(dev, "failed to disable supplies: %d\n", ret);
 		goto err_ep_mem;
 	}
 
-	s3c_hsotg_phy_disable(hsotg);
+	s3c_hsotg_phy_disable(dwc2);
 
-	ret = usb_add_gadget_udc(&pdev->dev, &hsotg->gadget);
+	ret = usb_add_gadget_udc(dev, &dwc2->gadget);
 	if (ret)
 		goto err_ep_mem;
 
-	s3c_hsotg_create_debug(hsotg);
+	s3c_hsotg_create_debug(dwc2);
 
-	s3c_hsotg_dump(hsotg);
+	s3c_hsotg_dump(dwc2);
 
 	return 0;
 
 err_ep_mem:
 	kfree(eps);
 err_supplies:
-	s3c_hsotg_phy_disable(hsotg);
+	s3c_hsotg_phy_disable(dwc2);
 err_clk:
-	clk_disable_unprepare(hsotg->clk);
+	clk_disable_unprepare(dwc2->s3c_hsotg->clk);
 
 	return ret;
 }
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux