Commit 1b207459 authored by Sylvain Rochet's avatar Sylvain Rochet Committed by Greg Kroah-Hartman

USB: host: ohci-at91: Move global variables to private struct

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: default avatarSylvain Rochet <sylvain.rochet@finsecur.com>
Acked-by: default avatarBoris Brezillon <boris.brezillon@free-electrons.com>
Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Acked-by: default avatarNicolas Ferre <nicolas.ferre@atmel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 7baddacb
...@@ -33,7 +33,16 @@ ...@@ -33,7 +33,16 @@
for ((index) = 0; (index) < AT91_MAX_USBH_PORTS; (index)++) for ((index) = 0; (index) < AT91_MAX_USBH_PORTS; (index)++)
/* interface, function and usb clocks; sometimes also an AHB clock */ /* 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 */ /* interface and function clocks; sometimes also an AHB clock */
#define DRIVER_DESC "OHCI Atmel driver" #define DRIVER_DESC "OHCI Atmel driver"
...@@ -41,45 +50,49 @@ static struct clk *iclk, *fclk, *uclk, *hclk; ...@@ -41,45 +50,49 @@ static struct clk *iclk, *fclk, *uclk, *hclk;
static const char hcd_name[] = "ohci-atmel"; static const char hcd_name[] = "ohci-atmel";
static struct hc_driver __read_mostly ohci_at91_hc_driver; 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); 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)) { if (IS_ENABLED(CONFIG_COMMON_CLK)) {
clk_set_rate(uclk, 48000000); clk_set_rate(ohci_at91->uclk, 48000000);
clk_prepare_enable(uclk); clk_prepare_enable(ohci_at91->uclk);
} }
clk_prepare_enable(hclk); clk_prepare_enable(ohci_at91->hclk);
clk_prepare_enable(iclk); clk_prepare_enable(ohci_at91->iclk);
clk_prepare_enable(fclk); clk_prepare_enable(ohci_at91->fclk);
clocked = 1; 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(ohci_at91->fclk);
clk_disable_unprepare(iclk); clk_disable_unprepare(ohci_at91->iclk);
clk_disable_unprepare(hclk); clk_disable_unprepare(ohci_at91->hclk);
if (IS_ENABLED(CONFIG_COMMON_CLK)) if (IS_ENABLED(CONFIG_COMMON_CLK))
clk_disable_unprepare(uclk); clk_disable_unprepare(ohci_at91->uclk);
clocked = 0; ohci_at91->clocked = false;
} }
static void at91_start_hc(struct platform_device *pdev) static void at91_start_hc(struct platform_device *pdev)
{ {
struct usb_hcd *hcd = platform_get_drvdata(pdev); struct usb_hcd *hcd = platform_get_drvdata(pdev);
struct ohci_regs __iomem *regs = hcd->regs; 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"); dev_dbg(&pdev->dev, "start\n");
/* /*
* Start the USB clocks. * Start the USB clocks.
*/ */
at91_start_clock(); at91_start_clock(ohci_at91);
/* /*
* The USB host controller must remain in reset. * The USB host controller must remain in reset.
...@@ -91,6 +104,7 @@ static void at91_stop_hc(struct platform_device *pdev) ...@@ -91,6 +104,7 @@ static void at91_stop_hc(struct platform_device *pdev)
{ {
struct usb_hcd *hcd = platform_get_drvdata(pdev); struct usb_hcd *hcd = platform_get_drvdata(pdev);
struct ohci_regs __iomem *regs = hcd->regs; 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"); dev_dbg(&pdev->dev, "stop\n");
...@@ -102,7 +116,7 @@ static void at91_stop_hc(struct platform_device *pdev) ...@@ -102,7 +116,7 @@ static void at91_stop_hc(struct platform_device *pdev)
/* /*
* Stop the USB clocks. * 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, ...@@ -129,6 +143,7 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver,
struct ohci_hcd *ohci; struct ohci_hcd *ohci;
int retval; int retval;
struct usb_hcd *hcd = NULL; struct usb_hcd *hcd = NULL;
struct ohci_at91_priv *ohci_at91;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct resource *res; struct resource *res;
int irq; int irq;
...@@ -142,6 +157,7 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver, ...@@ -142,6 +157,7 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver,
hcd = usb_create_hcd(driver, dev, "at91"); hcd = usb_create_hcd(driver, dev, "at91");
if (!hcd) if (!hcd)
return -ENOMEM; return -ENOMEM;
ohci_at91 = hcd_to_ohci_at91_priv(hcd);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
hcd->regs = devm_ioremap_resource(dev, res); hcd->regs = devm_ioremap_resource(dev, res);
...@@ -152,29 +168,29 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver, ...@@ -152,29 +168,29 @@ static int usb_hcd_at91_probe(const struct hc_driver *driver,
hcd->rsrc_start = res->start; hcd->rsrc_start = res->start;
hcd->rsrc_len = resource_size(res); hcd->rsrc_len = resource_size(res);
iclk = devm_clk_get(dev, "ohci_clk"); ohci_at91->iclk = devm_clk_get(dev, "ohci_clk");
if (IS_ERR(iclk)) { if (IS_ERR(ohci_at91->iclk)) {
dev_err(dev, "failed to get ohci_clk\n"); dev_err(dev, "failed to get ohci_clk\n");
retval = PTR_ERR(iclk); retval = PTR_ERR(ohci_at91->iclk);
goto err; goto err;
} }
fclk = devm_clk_get(dev, "uhpck"); ohci_at91->fclk = devm_clk_get(dev, "uhpck");
if (IS_ERR(fclk)) { if (IS_ERR(ohci_at91->fclk)) {
dev_err(dev, "failed to get uhpck\n"); dev_err(dev, "failed to get uhpck\n");
retval = PTR_ERR(fclk); retval = PTR_ERR(ohci_at91->fclk);
goto err; goto err;
} }
hclk = devm_clk_get(dev, "hclk"); ohci_at91->hclk = devm_clk_get(dev, "hclk");
if (IS_ERR(hclk)) { if (IS_ERR(ohci_at91->hclk)) {
dev_err(dev, "failed to get hclk\n"); dev_err(dev, "failed to get hclk\n");
retval = PTR_ERR(hclk); retval = PTR_ERR(ohci_at91->hclk);
goto err; goto err;
} }
if (IS_ENABLED(CONFIG_COMMON_CLK)) { if (IS_ENABLED(CONFIG_COMMON_CLK)) {
uclk = devm_clk_get(dev, "usb_clk"); ohci_at91->uclk = devm_clk_get(dev, "usb_clk");
if (IS_ERR(uclk)) { if (IS_ERR(ohci_at91->uclk)) {
dev_err(dev, "failed to get uclk\n"); dev_err(dev, "failed to get uclk\n");
retval = PTR_ERR(uclk); retval = PTR_ERR(ohci_at91->uclk);
goto err; goto err;
} }
} }
...@@ -599,6 +615,7 @@ ohci_hcd_at91_drv_suspend(struct device *dev) ...@@ -599,6 +615,7 @@ ohci_hcd_at91_drv_suspend(struct device *dev)
{ {
struct usb_hcd *hcd = dev_get_drvdata(dev); struct usb_hcd *hcd = dev_get_drvdata(dev);
struct ohci_hcd *ohci = hcd_to_ohci(hcd); 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); bool do_wakeup = device_may_wakeup(dev);
int ret; int ret;
...@@ -625,7 +642,7 @@ ohci_hcd_at91_drv_suspend(struct device *dev) ...@@ -625,7 +642,7 @@ ohci_hcd_at91_drv_suspend(struct device *dev)
/* flush the writes */ /* flush the writes */
(void) ohci_readl (ohci, &ohci->regs->control); (void) ohci_readl (ohci, &ohci->regs->control);
at91_stop_clock(); at91_stop_clock(ohci_at91);
} }
return ret; return ret;
...@@ -634,12 +651,13 @@ ohci_hcd_at91_drv_suspend(struct device *dev) ...@@ -634,12 +651,13 @@ ohci_hcd_at91_drv_suspend(struct device *dev)
static int ohci_hcd_at91_drv_resume(struct device *dev) static int ohci_hcd_at91_drv_resume(struct device *dev)
{ {
struct usb_hcd *hcd = dev_get_drvdata(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)) if (device_may_wakeup(dev))
disable_irq_wake(hcd->irq); disable_irq_wake(hcd->irq);
if (!clocked) if (!ohci_at91->clocked)
at91_start_clock(); at91_start_clock(ohci_at91);
ohci_resume(hcd, false); ohci_resume(hcd, false);
return 0; return 0;
...@@ -666,7 +684,7 @@ static int __init ohci_at91_init(void) ...@@ -666,7 +684,7 @@ static int __init ohci_at91_init(void)
return -ENODEV; return -ENODEV;
pr_info("%s: " DRIVER_DESC "\n", hcd_name); 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 * The Atmel HW has some unusual quirks, which require Atmel-specific
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment