Skip to content

Commit

Permalink
USB: host: ohci-at91: Move global variables to private struct
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sylvain Rochet authored and Greg Kroah-Hartman committed Jan 25, 2015
1 parent 7baddac commit 1b20745
Showing 1 changed file with 51 additions and 33 deletions.
84 changes: 51 additions & 33 deletions drivers/usb/host/ohci-at91.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,53 +33,66 @@
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"

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.
Expand All @@ -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");

Expand All @@ -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);
}


Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -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;
}
}
Expand Down Expand Up @@ -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;

Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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
Expand Down

0 comments on commit 1b20745

Please sign in to comment.