aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host/ehci-atmel.c
diff options
context:
space:
mode:
authorSylvain Rochet <sylvain.rochet@finsecur.com>2015-01-20 08:39:01 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2015-01-25 08:06:42 -0500
commit7baddacbe1bc7186268aea0697400197c836f682 (patch)
tree10c67c9841f599a41499e7a3282827e49864b21a /drivers/usb/host/ehci-atmel.c
parent94ac0e5d29f0f5ba04961b64f879d05d1507cbe5 (diff)
USB: host: ehci-atmel: Move global variables to private struct
This patch move Atmel EHCI global variables (clocks ptr and clocked boolean) to private struct atmel_ehci_priv, stored in ehci->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>
Diffstat (limited to 'drivers/usb/host/ehci-atmel.c')
-rw-r--r--drivers/usb/host/ehci-atmel.c79
1 files changed, 50 insertions, 29 deletions
diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c
index 5a15e3dd006b..663f7908b15c 100644
--- a/drivers/usb/host/ehci-atmel.c
+++ b/drivers/usb/host/ehci-atmel.c
@@ -27,48 +27,66 @@
27#define DRIVER_DESC "EHCI Atmel driver" 27#define DRIVER_DESC "EHCI Atmel driver"
28 28
29static const char hcd_name[] = "ehci-atmel"; 29static const char hcd_name[] = "ehci-atmel";
30static struct hc_driver __read_mostly ehci_atmel_hc_driver;
31 30
32/* interface and function clocks */ 31/* interface and function clocks */
33static struct clk *iclk, *fclk, *uclk; 32#define hcd_to_atmel_ehci_priv(h) \
34static int clocked; 33 ((struct atmel_ehci_priv *)hcd_to_ehci(h)->priv)
34
35struct atmel_ehci_priv {
36 struct clk *iclk;
37 struct clk *fclk;
38 struct clk *uclk;
39 bool clocked;
40};
41
42static struct hc_driver __read_mostly ehci_atmel_hc_driver;
43
44static const struct ehci_driver_overrides ehci_atmel_drv_overrides __initconst = {
45 .extra_priv_size = sizeof(struct atmel_ehci_priv),
46};
35 47
36/*-------------------------------------------------------------------------*/ 48/*-------------------------------------------------------------------------*/
37 49
38static void atmel_start_clock(void) 50static void atmel_start_clock(struct atmel_ehci_priv *atmel_ehci)
39{ 51{
40 if (clocked) 52 if (atmel_ehci->clocked)
41 return; 53 return;
42 if (IS_ENABLED(CONFIG_COMMON_CLK)) { 54 if (IS_ENABLED(CONFIG_COMMON_CLK)) {
43 clk_set_rate(uclk, 48000000); 55 clk_set_rate(atmel_ehci->uclk, 48000000);
44 clk_prepare_enable(uclk); 56 clk_prepare_enable(atmel_ehci->uclk);
45 } 57 }
46 clk_prepare_enable(iclk); 58 clk_prepare_enable(atmel_ehci->iclk);
47 clk_prepare_enable(fclk); 59 clk_prepare_enable(atmel_ehci->fclk);
48 clocked = 1; 60 atmel_ehci->clocked = true;
49} 61}
50 62
51static void atmel_stop_clock(void) 63static void atmel_stop_clock(struct atmel_ehci_priv *atmel_ehci)
52{ 64{
53 if (!clocked) 65 if (!atmel_ehci->clocked)
54 return; 66 return;
55 clk_disable_unprepare(fclk); 67 clk_disable_unprepare(atmel_ehci->fclk);
56 clk_disable_unprepare(iclk); 68 clk_disable_unprepare(atmel_ehci->iclk);
57 if (IS_ENABLED(CONFIG_COMMON_CLK)) 69 if (IS_ENABLED(CONFIG_COMMON_CLK))
58 clk_disable_unprepare(uclk); 70 clk_disable_unprepare(atmel_ehci->uclk);
59 clocked = 0; 71 atmel_ehci->clocked = false;
60} 72}
61 73
62static void atmel_start_ehci(struct platform_device *pdev) 74static void atmel_start_ehci(struct platform_device *pdev)
63{ 75{
76 struct usb_hcd *hcd = platform_get_drvdata(pdev);
77 struct atmel_ehci_priv *atmel_ehci = hcd_to_atmel_ehci_priv(hcd);
78
64 dev_dbg(&pdev->dev, "start\n"); 79 dev_dbg(&pdev->dev, "start\n");
65 atmel_start_clock(); 80 atmel_start_clock(atmel_ehci);
66} 81}
67 82
68static void atmel_stop_ehci(struct platform_device *pdev) 83static void atmel_stop_ehci(struct platform_device *pdev)
69{ 84{
85 struct usb_hcd *hcd = platform_get_drvdata(pdev);
86 struct atmel_ehci_priv *atmel_ehci = hcd_to_atmel_ehci_priv(hcd);
87
70 dev_dbg(&pdev->dev, "stop\n"); 88 dev_dbg(&pdev->dev, "stop\n");
71 atmel_stop_clock(); 89 atmel_stop_clock(atmel_ehci);
72} 90}
73 91
74/*-------------------------------------------------------------------------*/ 92/*-------------------------------------------------------------------------*/
@@ -79,6 +97,7 @@ static int ehci_atmel_drv_probe(struct platform_device *pdev)
79 const struct hc_driver *driver = &ehci_atmel_hc_driver; 97 const struct hc_driver *driver = &ehci_atmel_hc_driver;
80 struct resource *res; 98 struct resource *res;
81 struct ehci_hcd *ehci; 99 struct ehci_hcd *ehci;
100 struct atmel_ehci_priv *atmel_ehci;
82 int irq; 101 int irq;
83 int retval; 102 int retval;
84 103
@@ -109,6 +128,7 @@ static int ehci_atmel_drv_probe(struct platform_device *pdev)
109 retval = -ENOMEM; 128 retval = -ENOMEM;
110 goto fail_create_hcd; 129 goto fail_create_hcd;
111 } 130 }
131 atmel_ehci = hcd_to_atmel_ehci_priv(hcd);
112 132
113 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 133 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
114 hcd->regs = devm_ioremap_resource(&pdev->dev, res); 134 hcd->regs = devm_ioremap_resource(&pdev->dev, res);
@@ -120,23 +140,23 @@ static int ehci_atmel_drv_probe(struct platform_device *pdev)
120 hcd->rsrc_start = res->start; 140 hcd->rsrc_start = res->start;
121 hcd->rsrc_len = resource_size(res); 141 hcd->rsrc_len = resource_size(res);
122 142
123 iclk = devm_clk_get(&pdev->dev, "ehci_clk"); 143 atmel_ehci->iclk = devm_clk_get(&pdev->dev, "ehci_clk");
124 if (IS_ERR(iclk)) { 144 if (IS_ERR(atmel_ehci->iclk)) {
125 dev_err(&pdev->dev, "Error getting interface clock\n"); 145 dev_err(&pdev->dev, "Error getting interface clock\n");
126 retval = -ENOENT; 146 retval = -ENOENT;
127 goto fail_request_resource; 147 goto fail_request_resource;
128 } 148 }
129 fclk = devm_clk_get(&pdev->dev, "uhpck"); 149 atmel_ehci->fclk = devm_clk_get(&pdev->dev, "uhpck");
130 if (IS_ERR(fclk)) { 150 if (IS_ERR(atmel_ehci->fclk)) {
131 dev_err(&pdev->dev, "Error getting function clock\n"); 151 dev_err(&pdev->dev, "Error getting function clock\n");
132 retval = -ENOENT; 152 retval = -ENOENT;
133 goto fail_request_resource; 153 goto fail_request_resource;
134 } 154 }
135 if (IS_ENABLED(CONFIG_COMMON_CLK)) { 155 if (IS_ENABLED(CONFIG_COMMON_CLK)) {
136 uclk = devm_clk_get(&pdev->dev, "usb_clk"); 156 atmel_ehci->uclk = devm_clk_get(&pdev->dev, "usb_clk");
137 if (IS_ERR(uclk)) { 157 if (IS_ERR(atmel_ehci->uclk)) {
138 dev_err(&pdev->dev, "failed to get uclk\n"); 158 dev_err(&pdev->dev, "failed to get uclk\n");
139 retval = PTR_ERR(uclk); 159 retval = PTR_ERR(atmel_ehci->uclk);
140 goto fail_request_resource; 160 goto fail_request_resource;
141 } 161 }
142 } 162 }
@@ -173,7 +193,6 @@ static int ehci_atmel_drv_remove(struct platform_device *pdev)
173 usb_put_hcd(hcd); 193 usb_put_hcd(hcd);
174 194
175 atmel_stop_ehci(pdev); 195 atmel_stop_ehci(pdev);
176 fclk = iclk = NULL;
177 196
178 return 0; 197 return 0;
179} 198}
@@ -182,21 +201,23 @@ static int ehci_atmel_drv_remove(struct platform_device *pdev)
182static int ehci_atmel_drv_suspend(struct device *dev) 201static int ehci_atmel_drv_suspend(struct device *dev)
183{ 202{
184 struct usb_hcd *hcd = dev_get_drvdata(dev); 203 struct usb_hcd *hcd = dev_get_drvdata(dev);
204 struct atmel_ehci_priv *atmel_ehci = hcd_to_atmel_ehci_priv(hcd);
185 int ret; 205 int ret;
186 206
187 ret = ehci_suspend(hcd, false); 207 ret = ehci_suspend(hcd, false);
188 if (ret) 208 if (ret)
189 return ret; 209 return ret;
190 210
191 atmel_stop_clock(); 211 atmel_stop_clock(atmel_ehci);
192 return 0; 212 return 0;
193} 213}
194 214
195static int ehci_atmel_drv_resume(struct device *dev) 215static int ehci_atmel_drv_resume(struct device *dev)
196{ 216{
197 struct usb_hcd *hcd = dev_get_drvdata(dev); 217 struct usb_hcd *hcd = dev_get_drvdata(dev);
218 struct atmel_ehci_priv *atmel_ehci = hcd_to_atmel_ehci_priv(hcd);
198 219
199 atmel_start_clock(); 220 atmel_start_clock(atmel_ehci);
200 return ehci_resume(hcd, false); 221 return ehci_resume(hcd, false);
201} 222}
202#endif 223#endif
@@ -230,7 +251,7 @@ static int __init ehci_atmel_init(void)
230 return -ENODEV; 251 return -ENODEV;
231 252
232 pr_info("%s: " DRIVER_DESC "\n", hcd_name); 253 pr_info("%s: " DRIVER_DESC "\n", hcd_name);
233 ehci_init_driver(&ehci_atmel_hc_driver, NULL); 254 ehci_init_driver(&ehci_atmel_hc_driver, &ehci_atmel_drv_overrides);
234 return platform_driver_register(&ehci_atmel_driver); 255 return platform_driver_register(&ehci_atmel_driver);
235} 256}
236module_init(ehci_atmel_init); 257module_init(ehci_atmel_init);