diff options
author | Viresh Kumar <viresh.kumar@st.com> | 2012-03-26 23:10:35 -0400 |
---|---|---|
committer | Chris Ball <cjb@laptop.org> | 2012-05-01 10:30:44 -0400 |
commit | 6ebaf8f2b0f9e67ac2e00ba7af04a58b39312b3c (patch) | |
tree | db399b2036495852b498ff6e4151b945d1d7e34f /drivers/mmc | |
parent | 3524b5d1edbcaf0aae9196ac942d8307624ff3f0 (diff) |
mmc: sdhci-spear: Use devm_* derivatives
This patch replaces normal calls to resource allocation routines
with devm_*() derivative of those routines. This removes the need
to free those resources inside the driver.
Signed-off-by: Viresh Kumar <viresh.kumar@st.com>
Signed-off-by: Chris Ball <cjb@laptop.org>
Diffstat (limited to 'drivers/mmc')
-rw-r--r-- | drivers/mmc/host/sdhci-spear.c | 80 |
1 files changed, 27 insertions, 53 deletions
diff --git a/drivers/mmc/host/sdhci-spear.c b/drivers/mmc/host/sdhci-spear.c index 15191c1d999a..1fe32dfa7cd4 100644 --- a/drivers/mmc/host/sdhci-spear.c +++ b/drivers/mmc/host/sdhci-spear.c | |||
@@ -82,18 +82,18 @@ static int __devinit sdhci_probe(struct platform_device *pdev) | |||
82 | goto err; | 82 | goto err; |
83 | } | 83 | } |
84 | 84 | ||
85 | if (!request_mem_region(iomem->start, resource_size(iomem), | 85 | if (!devm_request_mem_region(&pdev->dev, iomem->start, |
86 | "spear-sdhci")) { | 86 | resource_size(iomem), "spear-sdhci")) { |
87 | ret = -EBUSY; | 87 | ret = -EBUSY; |
88 | dev_dbg(&pdev->dev, "cannot request region\n"); | 88 | dev_dbg(&pdev->dev, "cannot request region\n"); |
89 | goto err; | 89 | goto err; |
90 | } | 90 | } |
91 | 91 | ||
92 | sdhci = kzalloc(sizeof(*sdhci), GFP_KERNEL); | 92 | sdhci = devm_kzalloc(&pdev->dev, sizeof(*sdhci), GFP_KERNEL); |
93 | if (!sdhci) { | 93 | if (!sdhci) { |
94 | ret = -ENOMEM; | 94 | ret = -ENOMEM; |
95 | dev_dbg(&pdev->dev, "cannot allocate memory for sdhci\n"); | 95 | dev_dbg(&pdev->dev, "cannot allocate memory for sdhci\n"); |
96 | goto err_kzalloc; | 96 | goto err; |
97 | } | 97 | } |
98 | 98 | ||
99 | /* clk enable */ | 99 | /* clk enable */ |
@@ -101,13 +101,13 @@ static int __devinit sdhci_probe(struct platform_device *pdev) | |||
101 | if (IS_ERR(sdhci->clk)) { | 101 | if (IS_ERR(sdhci->clk)) { |
102 | ret = PTR_ERR(sdhci->clk); | 102 | ret = PTR_ERR(sdhci->clk); |
103 | dev_dbg(&pdev->dev, "Error getting clock\n"); | 103 | dev_dbg(&pdev->dev, "Error getting clock\n"); |
104 | goto err_clk_get; | 104 | goto err; |
105 | } | 105 | } |
106 | 106 | ||
107 | ret = clk_enable(sdhci->clk); | 107 | ret = clk_enable(sdhci->clk); |
108 | if (ret) { | 108 | if (ret) { |
109 | dev_dbg(&pdev->dev, "Error enabling clock\n"); | 109 | dev_dbg(&pdev->dev, "Error enabling clock\n"); |
110 | goto err_clk_enb; | 110 | goto put_clk; |
111 | } | 111 | } |
112 | 112 | ||
113 | /* overwrite platform_data */ | 113 | /* overwrite platform_data */ |
@@ -122,7 +122,7 @@ static int __devinit sdhci_probe(struct platform_device *pdev) | |||
122 | if (IS_ERR(host)) { | 122 | if (IS_ERR(host)) { |
123 | ret = PTR_ERR(host); | 123 | ret = PTR_ERR(host); |
124 | dev_dbg(&pdev->dev, "error allocating host\n"); | 124 | dev_dbg(&pdev->dev, "error allocating host\n"); |
125 | goto err_alloc_host; | 125 | goto disable_clk; |
126 | } | 126 | } |
127 | 127 | ||
128 | host->hw_name = "sdhci"; | 128 | host->hw_name = "sdhci"; |
@@ -130,17 +130,18 @@ static int __devinit sdhci_probe(struct platform_device *pdev) | |||
130 | host->irq = platform_get_irq(pdev, 0); | 130 | host->irq = platform_get_irq(pdev, 0); |
131 | host->quirks = SDHCI_QUIRK_BROKEN_ADMA; | 131 | host->quirks = SDHCI_QUIRK_BROKEN_ADMA; |
132 | 132 | ||
133 | host->ioaddr = ioremap(iomem->start, resource_size(iomem)); | 133 | host->ioaddr = devm_ioremap(&pdev->dev, iomem->start, |
134 | resource_size(iomem)); | ||
134 | if (!host->ioaddr) { | 135 | if (!host->ioaddr) { |
135 | ret = -ENOMEM; | 136 | ret = -ENOMEM; |
136 | dev_dbg(&pdev->dev, "failed to remap registers\n"); | 137 | dev_dbg(&pdev->dev, "failed to remap registers\n"); |
137 | goto err_ioremap; | 138 | goto free_host; |
138 | } | 139 | } |
139 | 140 | ||
140 | ret = sdhci_add_host(host); | 141 | ret = sdhci_add_host(host); |
141 | if (ret) { | 142 | if (ret) { |
142 | dev_dbg(&pdev->dev, "error adding host\n"); | 143 | dev_dbg(&pdev->dev, "error adding host\n"); |
143 | goto err_add_host; | 144 | goto free_host; |
144 | } | 145 | } |
145 | 146 | ||
146 | platform_set_drvdata(pdev, host); | 147 | platform_set_drvdata(pdev, host); |
@@ -159,11 +160,12 @@ static int __devinit sdhci_probe(struct platform_device *pdev) | |||
159 | if (sdhci->data->card_power_gpio >= 0) { | 160 | if (sdhci->data->card_power_gpio >= 0) { |
160 | int val = 0; | 161 | int val = 0; |
161 | 162 | ||
162 | ret = gpio_request(sdhci->data->card_power_gpio, "sdhci"); | 163 | ret = devm_gpio_request(&pdev->dev, |
164 | sdhci->data->card_power_gpio, "sdhci"); | ||
163 | if (ret < 0) { | 165 | if (ret < 0) { |
164 | dev_dbg(&pdev->dev, "gpio request fail: %d\n", | 166 | dev_dbg(&pdev->dev, "gpio request fail: %d\n", |
165 | sdhci->data->card_power_gpio); | 167 | sdhci->data->card_power_gpio); |
166 | goto err_pgpio_request; | 168 | goto set_drvdata; |
167 | } | 169 | } |
168 | 170 | ||
169 | if (sdhci->data->power_always_enb) | 171 | if (sdhci->data->power_always_enb) |
@@ -175,60 +177,48 @@ static int __devinit sdhci_probe(struct platform_device *pdev) | |||
175 | if (ret) { | 177 | if (ret) { |
176 | dev_dbg(&pdev->dev, "gpio set direction fail: %d\n", | 178 | dev_dbg(&pdev->dev, "gpio set direction fail: %d\n", |
177 | sdhci->data->card_power_gpio); | 179 | sdhci->data->card_power_gpio); |
178 | goto err_pgpio_direction; | 180 | goto set_drvdata; |
179 | } | 181 | } |
180 | } | 182 | } |
181 | 183 | ||
182 | if (sdhci->data->card_int_gpio >= 0) { | 184 | if (sdhci->data->card_int_gpio >= 0) { |
183 | ret = gpio_request(sdhci->data->card_int_gpio, "sdhci"); | 185 | ret = devm_gpio_request(&pdev->dev, sdhci->data->card_int_gpio, |
186 | "sdhci"); | ||
184 | if (ret < 0) { | 187 | if (ret < 0) { |
185 | dev_dbg(&pdev->dev, "gpio request fail: %d\n", | 188 | dev_dbg(&pdev->dev, "gpio request fail: %d\n", |
186 | sdhci->data->card_int_gpio); | 189 | sdhci->data->card_int_gpio); |
187 | goto err_igpio_request; | 190 | goto set_drvdata; |
188 | } | 191 | } |
189 | 192 | ||
190 | ret = gpio_direction_input(sdhci->data->card_int_gpio); | 193 | ret = gpio_direction_input(sdhci->data->card_int_gpio); |
191 | if (ret) { | 194 | if (ret) { |
192 | dev_dbg(&pdev->dev, "gpio set direction fail: %d\n", | 195 | dev_dbg(&pdev->dev, "gpio set direction fail: %d\n", |
193 | sdhci->data->card_int_gpio); | 196 | sdhci->data->card_int_gpio); |
194 | goto err_igpio_direction; | 197 | goto set_drvdata; |
195 | } | 198 | } |
196 | ret = request_irq(gpio_to_irq(sdhci->data->card_int_gpio), | 199 | ret = devm_request_irq(&pdev->dev, |
200 | gpio_to_irq(sdhci->data->card_int_gpio), | ||
197 | sdhci_gpio_irq, IRQF_TRIGGER_LOW, | 201 | sdhci_gpio_irq, IRQF_TRIGGER_LOW, |
198 | mmc_hostname(host->mmc), pdev); | 202 | mmc_hostname(host->mmc), pdev); |
199 | if (ret) { | 203 | if (ret) { |
200 | dev_dbg(&pdev->dev, "gpio request irq fail: %d\n", | 204 | dev_dbg(&pdev->dev, "gpio request irq fail: %d\n", |
201 | sdhci->data->card_int_gpio); | 205 | sdhci->data->card_int_gpio); |
202 | goto err_igpio_request_irq; | 206 | goto set_drvdata; |
203 | } | 207 | } |
204 | 208 | ||
205 | } | 209 | } |
206 | 210 | ||
207 | return 0; | 211 | return 0; |
208 | 212 | ||
209 | err_igpio_request_irq: | 213 | set_drvdata: |
210 | err_igpio_direction: | ||
211 | if (sdhci->data->card_int_gpio >= 0) | ||
212 | gpio_free(sdhci->data->card_int_gpio); | ||
213 | err_igpio_request: | ||
214 | err_pgpio_direction: | ||
215 | if (sdhci->data->card_power_gpio >= 0) | ||
216 | gpio_free(sdhci->data->card_power_gpio); | ||
217 | err_pgpio_request: | ||
218 | platform_set_drvdata(pdev, NULL); | 214 | platform_set_drvdata(pdev, NULL); |
219 | sdhci_remove_host(host, 1); | 215 | sdhci_remove_host(host, 1); |
220 | err_add_host: | 216 | free_host: |
221 | iounmap(host->ioaddr); | ||
222 | err_ioremap: | ||
223 | sdhci_free_host(host); | 217 | sdhci_free_host(host); |
224 | err_alloc_host: | 218 | disable_clk: |
225 | clk_disable(sdhci->clk); | 219 | clk_disable(sdhci->clk); |
226 | err_clk_enb: | 220 | put_clk: |
227 | clk_put(sdhci->clk); | 221 | clk_put(sdhci->clk); |
228 | err_clk_get: | ||
229 | kfree(sdhci); | ||
230 | err_kzalloc: | ||
231 | release_mem_region(iomem->start, resource_size(iomem)); | ||
232 | err: | 222 | err: |
233 | dev_err(&pdev->dev, "spear-sdhci probe failed: %d\n", ret); | 223 | dev_err(&pdev->dev, "spear-sdhci probe failed: %d\n", ret); |
234 | return ret; | 224 | return ret; |
@@ -237,35 +227,19 @@ err: | |||
237 | static int __devexit sdhci_remove(struct platform_device *pdev) | 227 | static int __devexit sdhci_remove(struct platform_device *pdev) |
238 | { | 228 | { |
239 | struct sdhci_host *host = platform_get_drvdata(pdev); | 229 | struct sdhci_host *host = platform_get_drvdata(pdev); |
240 | struct resource *iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
241 | struct spear_sdhci *sdhci = dev_get_platdata(&pdev->dev); | 230 | struct spear_sdhci *sdhci = dev_get_platdata(&pdev->dev); |
242 | int dead; | 231 | int dead = 0; |
243 | u32 scratch; | 232 | u32 scratch; |
244 | 233 | ||
245 | if (sdhci->data) { | ||
246 | if (sdhci->data->card_int_gpio >= 0) { | ||
247 | free_irq(gpio_to_irq(sdhci->data->card_int_gpio), pdev); | ||
248 | gpio_free(sdhci->data->card_int_gpio); | ||
249 | } | ||
250 | |||
251 | if (sdhci->data->card_power_gpio >= 0) | ||
252 | gpio_free(sdhci->data->card_power_gpio); | ||
253 | } | ||
254 | |||
255 | platform_set_drvdata(pdev, NULL); | 234 | platform_set_drvdata(pdev, NULL); |
256 | dead = 0; | ||
257 | scratch = readl(host->ioaddr + SDHCI_INT_STATUS); | 235 | scratch = readl(host->ioaddr + SDHCI_INT_STATUS); |
258 | if (scratch == (u32)-1) | 236 | if (scratch == (u32)-1) |
259 | dead = 1; | 237 | dead = 1; |
260 | 238 | ||
261 | sdhci_remove_host(host, dead); | 239 | sdhci_remove_host(host, dead); |
262 | iounmap(host->ioaddr); | ||
263 | sdhci_free_host(host); | 240 | sdhci_free_host(host); |
264 | clk_disable(sdhci->clk); | 241 | clk_disable(sdhci->clk); |
265 | clk_put(sdhci->clk); | 242 | clk_put(sdhci->clk); |
266 | kfree(sdhci); | ||
267 | if (iomem) | ||
268 | release_mem_region(iomem->start, resource_size(iomem)); | ||
269 | 243 | ||
270 | return 0; | 244 | return 0; |
271 | } | 245 | } |