diff options
author | Sylvain Rochet <sylvain.rochet@finsecur.com> | 2015-01-20 08:39:01 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-01-25 08:06:42 -0500 |
commit | 7baddacbe1bc7186268aea0697400197c836f682 (patch) | |
tree | 10c67c9841f599a41499e7a3282827e49864b21a /drivers/usb/host/ehci-atmel.c | |
parent | 94ac0e5d29f0f5ba04961b64f879d05d1507cbe5 (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.c | 79 |
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 | ||
29 | static const char hcd_name[] = "ehci-atmel"; | 29 | static const char hcd_name[] = "ehci-atmel"; |
30 | static struct hc_driver __read_mostly ehci_atmel_hc_driver; | ||
31 | 30 | ||
32 | /* interface and function clocks */ | 31 | /* interface and function clocks */ |
33 | static struct clk *iclk, *fclk, *uclk; | 32 | #define hcd_to_atmel_ehci_priv(h) \ |
34 | static int clocked; | 33 | ((struct atmel_ehci_priv *)hcd_to_ehci(h)->priv) |
34 | |||
35 | struct atmel_ehci_priv { | ||
36 | struct clk *iclk; | ||
37 | struct clk *fclk; | ||
38 | struct clk *uclk; | ||
39 | bool clocked; | ||
40 | }; | ||
41 | |||
42 | static struct hc_driver __read_mostly ehci_atmel_hc_driver; | ||
43 | |||
44 | static 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 | ||
38 | static void atmel_start_clock(void) | 50 | static 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 | ||
51 | static void atmel_stop_clock(void) | 63 | static 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 | ||
62 | static void atmel_start_ehci(struct platform_device *pdev) | 74 | static 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 | ||
68 | static void atmel_stop_ehci(struct platform_device *pdev) | 83 | static 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) | |||
182 | static int ehci_atmel_drv_suspend(struct device *dev) | 201 | static 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 | ||
195 | static int ehci_atmel_drv_resume(struct device *dev) | 215 | static 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 | } |
236 | module_init(ehci_atmel_init); | 257 | module_init(ehci_atmel_init); |