USB: host: ohci-at91: Move global variables to private struct
authorSylvain Rochet <sylvain.rochet@finsecur.com>
Tue, 20 Jan 2015 13:39:02 +0000 (14:39 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 25 Jan 2015 13:06:42 +0000 (21:06 +0800)
This patch move AT91 OHCI global variables (clocks ptr and clocked
boolean) to private struct ohci_at91_priv, stored in ohci->priv.

Signed-off-by: Sylvain Rochet <sylvain.rochet@finsecur.com>
Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/ohci-at91.c

index 8fad2ca3b7ee2bfa61e6c1bc7dd47c978f3834f5..eb7457fda58b83fd68844ddae9d8472565b67138 100644 (file)
                for ((index) = 0; (index) < AT91_MAX_USBH_PORTS; (index)++)
 
 /* interface, function and usb clocks; sometimes also an AHB clock */
-static struct clk *iclk, *fclk, *uclk, *hclk;
+#define hcd_to_ohci_at91_priv(h) \
+       ((struct ohci_at91_priv *)hcd_to_ohci(h)->priv)
+
+struct ohci_at91_priv {
+       struct clk *iclk;
+       struct clk *fclk;
+       struct clk *uclk;
+       struct clk *hclk;
+       bool clocked;
+};
 /* interface and function clocks; sometimes also an AHB clock */
 
 #define DRIVER_DESC "OHCI Atmel driver"
@@ -41,45 +50,49 @@ static struct clk *iclk, *fclk, *uclk, *hclk;
 static const char hcd_name[] = "ohci-atmel";
 
 static struct hc_driver __read_mostly ohci_at91_hc_driver;
-static int clocked;
+
+static const struct ohci_driver_overrides ohci_at91_drv_overrides __initconst = {
+       .extra_priv_size = sizeof(struct ohci_at91_priv),
+};
 
 extern int usb_disabled(void);
 
 /*-------------------------------------------------------------------------*/
 
-static void at91_start_clock(void)
+static void at91_start_clock(struct ohci_at91_priv *ohci_at91)
 {
        if (IS_ENABLED(CONFIG_COMMON_CLK)) {
-               clk_set_rate(uclk, 48000000);
-               clk_prepare_enable(uclk);
+               clk_set_rate(ohci_at91->uclk, 48000000);
+               clk_prepare_enable(ohci_at91->uclk);
        }
-       clk_prepare_enable(hclk);
-       clk_prepare_enable(iclk);
-       clk_prepare_enable(fclk);
-       clocked = 1;
+       clk_prepare_enable(ohci_at91->hclk);
+       clk_prepare_enable(ohci_at91->iclk);
+       clk_prepare_enable(ohci_at91->fclk);
+       ohci_at91->clocked = true;
 }
 
-static void at91_stop_clock(void)
+static void at91_stop_clock(struct ohci_at91_priv *ohci_at91)
 {
-       clk_disable_unprepare(fclk);
-       clk_disable_unprepare(iclk);
-       clk_disable_unprepare(hclk);
+       clk_disable_unprepare(ohci_at91->fclk);
+       clk_disable_unprepare(ohci_at91->iclk);
+       clk_disable_unprepare(ohci_at91->hclk);
        if (IS_ENABLED(CONFIG_COMMON_CLK))
-               clk_disable_unprepare(uclk);
-       clocked = 0;
+               clk_disable_unprepare(ohci_at91->uclk);
+       ohci_at91->clocked = false;
 }
 
 static void at91_start_hc(struct platform_device *pdev)
 {
        struct usb_hcd *hcd = platform_get_drvdata(pdev);
        struct ohci_regs __iomem *regs = hcd->regs;
+       struct ohci_at91_priv *ohci_at91 = hcd_to_ohci_at91_priv(hcd);
 
        dev_dbg(&pdev->dev, "start\n");
 
        /*
         * Start the USB clocks.
         */
-       at91_start_clock();
+       at91_start_clock(ohci_at91);
 
        /*
         * The USB host controller must remain in reset.
@@ -91,6 +104,7 @@ static void at91_stop_hc(struct platform_device *pdev)
 {
        struct usb_hcd *hcd = platform_get_drvdata(pdev);
        struct ohci_regs __iomem *regs = hcd->regs;
+       struct ohci_at91_priv *ohci_at91 = hcd_to_ohci_at91_priv(hcd);
 
        dev_dbg(&pdev->dev, "stop\n");
 
@@ -102,7 +116,7 @@ static void at91_stop_hc(struct platform_device *pdev)
        /*
         * Stop the USB clocks.
         */
-       at91_stop_clock();
+       at91_stop_clock(ohci_at91);
 }
 
 
@@ -129,6 +143,7 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver,
        struct ohci_hcd *ohci;
        int retval;
        struct usb_hcd *hcd = NULL;
+       struct ohci_at91_priv *ohci_at91;
        struct device *dev = &pdev->dev;
        struct resource *res;
        int irq;
@@ -142,6 +157,7 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver,
        hcd = usb_create_hcd(driver, dev, "at91");
        if (!hcd)
                return -ENOMEM;
+       ohci_at91 = hcd_to_ohci_at91_priv(hcd);
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        hcd->regs = devm_ioremap_resource(dev, res);
@@ -152,29 +168,29 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver,
        hcd->rsrc_start = res->start;
        hcd->rsrc_len = resource_size(res);
 
-       iclk = devm_clk_get(dev, "ohci_clk");
-       if (IS_ERR(iclk)) {
+       ohci_at91->iclk = devm_clk_get(dev, "ohci_clk");
+       if (IS_ERR(ohci_at91->iclk)) {
                dev_err(dev, "failed to get ohci_clk\n");
-               retval = PTR_ERR(iclk);
+               retval = PTR_ERR(ohci_at91->iclk);
                goto err;
        }
-       fclk = devm_clk_get(dev, "uhpck");
-       if (IS_ERR(fclk)) {
+       ohci_at91->fclk = devm_clk_get(dev, "uhpck");
+       if (IS_ERR(ohci_at91->fclk)) {
                dev_err(dev, "failed to get uhpck\n");
-               retval = PTR_ERR(fclk);
+               retval = PTR_ERR(ohci_at91->fclk);
                goto err;
        }
-       hclk = devm_clk_get(dev, "hclk");
-       if (IS_ERR(hclk)) {
+       ohci_at91->hclk = devm_clk_get(dev, "hclk");
+       if (IS_ERR(ohci_at91->hclk)) {
                dev_err(dev, "failed to get hclk\n");
-               retval = PTR_ERR(hclk);
+               retval = PTR_ERR(ohci_at91->hclk);
                goto err;
        }
        if (IS_ENABLED(CONFIG_COMMON_CLK)) {
-               uclk = devm_clk_get(dev, "usb_clk");
-               if (IS_ERR(uclk)) {
+               ohci_at91->uclk = devm_clk_get(dev, "usb_clk");
+               if (IS_ERR(ohci_at91->uclk)) {
                        dev_err(dev, "failed to get uclk\n");
-                       retval = PTR_ERR(uclk);
+                       retval = PTR_ERR(ohci_at91->uclk);
                        goto err;
                }
        }
@@ -599,6 +615,7 @@ ohci_hcd_at91_drv_suspend(struct device *dev)
 {
        struct usb_hcd  *hcd = dev_get_drvdata(dev);
        struct ohci_hcd *ohci = hcd_to_ohci(hcd);
+       struct ohci_at91_priv *ohci_at91 = hcd_to_ohci_at91_priv(hcd);
        bool            do_wakeup = device_may_wakeup(dev);
        int             ret;
 
@@ -625,7 +642,7 @@ ohci_hcd_at91_drv_suspend(struct device *dev)
 
                /* flush the writes */
                (void) ohci_readl (ohci, &ohci->regs->control);
-               at91_stop_clock();
+               at91_stop_clock(ohci_at91);
        }
 
        return ret;
@@ -634,12 +651,13 @@ ohci_hcd_at91_drv_suspend(struct device *dev)
 static int ohci_hcd_at91_drv_resume(struct device *dev)
 {
        struct usb_hcd  *hcd = dev_get_drvdata(dev);
+       struct ohci_at91_priv *ohci_at91 = hcd_to_ohci_at91_priv(hcd);
 
        if (device_may_wakeup(dev))
                disable_irq_wake(hcd->irq);
 
-       if (!clocked)
-               at91_start_clock();
+       if (!ohci_at91->clocked)
+               at91_start_clock(ohci_at91);
 
        ohci_resume(hcd, false);
        return 0;
@@ -666,7 +684,7 @@ static int __init ohci_at91_init(void)
                return -ENODEV;
 
        pr_info("%s: " DRIVER_DESC "\n", hcd_name);
-       ohci_init_driver(&ohci_at91_hc_driver, NULL);
+       ohci_init_driver(&ohci_at91_hc_driver, &ohci_at91_drv_overrides);
 
        /*
         * The Atmel HW has some unusual quirks, which require Atmel-specific