diff options
Diffstat (limited to 'sound/soc/tegra/tegra_das.c')
-rw-r--r-- | sound/soc/tegra/tegra_das.c | 66 |
1 files changed, 31 insertions, 35 deletions
diff --git a/sound/soc/tegra/tegra_das.c b/sound/soc/tegra/tegra_das.c index 3b55a44146af..3b3c1ba4d235 100644 --- a/sound/soc/tegra/tegra_das.c +++ b/sound/soc/tegra/tegra_das.c | |||
@@ -172,11 +172,11 @@ static int __devinit tegra_das_probe(struct platform_device *pdev) | |||
172 | if (das) | 172 | if (das) |
173 | return -ENODEV; | 173 | return -ENODEV; |
174 | 174 | ||
175 | das = kzalloc(sizeof(struct tegra_das), GFP_KERNEL); | 175 | das = devm_kzalloc(&pdev->dev, sizeof(struct tegra_das), GFP_KERNEL); |
176 | if (!das) { | 176 | if (!das) { |
177 | dev_err(&pdev->dev, "Can't allocate tegra_das\n"); | 177 | dev_err(&pdev->dev, "Can't allocate tegra_das\n"); |
178 | ret = -ENOMEM; | 178 | ret = -ENOMEM; |
179 | goto exit; | 179 | goto err; |
180 | } | 180 | } |
181 | das->dev = &pdev->dev; | 181 | das->dev = &pdev->dev; |
182 | 182 | ||
@@ -184,22 +184,35 @@ static int __devinit tegra_das_probe(struct platform_device *pdev) | |||
184 | if (!res) { | 184 | if (!res) { |
185 | dev_err(&pdev->dev, "No memory resource\n"); | 185 | dev_err(&pdev->dev, "No memory resource\n"); |
186 | ret = -ENODEV; | 186 | ret = -ENODEV; |
187 | goto err_free; | 187 | goto err; |
188 | } | 188 | } |
189 | 189 | ||
190 | region = request_mem_region(res->start, resource_size(res), | 190 | region = devm_request_mem_region(&pdev->dev, res->start, |
191 | pdev->name); | 191 | resource_size(res), pdev->name); |
192 | if (!region) { | 192 | if (!region) { |
193 | dev_err(&pdev->dev, "Memory region already claimed\n"); | 193 | dev_err(&pdev->dev, "Memory region already claimed\n"); |
194 | ret = -EBUSY; | 194 | ret = -EBUSY; |
195 | goto err_free; | 195 | goto err; |
196 | } | 196 | } |
197 | 197 | ||
198 | das->regs = ioremap(res->start, resource_size(res)); | 198 | das->regs = devm_ioremap(&pdev->dev, res->start, resource_size(res)); |
199 | if (!das->regs) { | 199 | if (!das->regs) { |
200 | dev_err(&pdev->dev, "ioremap failed\n"); | 200 | dev_err(&pdev->dev, "ioremap failed\n"); |
201 | ret = -ENOMEM; | 201 | ret = -ENOMEM; |
202 | goto err_release; | 202 | goto err; |
203 | } | ||
204 | |||
205 | ret = tegra_das_connect_dap_to_dac(TEGRA_DAS_DAP_ID_1, | ||
206 | TEGRA_DAS_DAP_SEL_DAC1); | ||
207 | if (ret) { | ||
208 | dev_err(&pdev->dev, "Can't set up DAS DAP connection\n"); | ||
209 | goto err; | ||
210 | } | ||
211 | ret = tegra_das_connect_dac_to_dap(TEGRA_DAS_DAC_ID_1, | ||
212 | TEGRA_DAS_DAC_SEL_DAP1); | ||
213 | if (ret) { | ||
214 | dev_err(&pdev->dev, "Can't set up DAS DAC connection\n"); | ||
215 | goto err; | ||
203 | } | 216 | } |
204 | 217 | ||
205 | tegra_das_debug_add(das); | 218 | tegra_das_debug_add(das); |
@@ -208,58 +221,41 @@ static int __devinit tegra_das_probe(struct platform_device *pdev) | |||
208 | 221 | ||
209 | return 0; | 222 | return 0; |
210 | 223 | ||
211 | err_release: | 224 | err: |
212 | release_mem_region(res->start, resource_size(res)); | ||
213 | err_free: | ||
214 | kfree(das); | ||
215 | das = NULL; | 225 | das = NULL; |
216 | exit: | ||
217 | return ret; | 226 | return ret; |
218 | } | 227 | } |
219 | 228 | ||
220 | static int __devexit tegra_das_remove(struct platform_device *pdev) | 229 | static int __devexit tegra_das_remove(struct platform_device *pdev) |
221 | { | 230 | { |
222 | struct resource *res; | ||
223 | |||
224 | if (!das) | 231 | if (!das) |
225 | return -ENODEV; | 232 | return -ENODEV; |
226 | 233 | ||
227 | platform_set_drvdata(pdev, NULL); | ||
228 | |||
229 | tegra_das_debug_remove(das); | 234 | tegra_das_debug_remove(das); |
230 | 235 | ||
231 | iounmap(das->regs); | ||
232 | |||
233 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
234 | release_mem_region(res->start, resource_size(res)); | ||
235 | |||
236 | kfree(das); | ||
237 | das = NULL; | 236 | das = NULL; |
238 | 237 | ||
239 | return 0; | 238 | return 0; |
240 | } | 239 | } |
241 | 240 | ||
241 | static const struct of_device_id tegra_das_of_match[] __devinitconst = { | ||
242 | { .compatible = "nvidia,tegra20-das", }, | ||
243 | {}, | ||
244 | }; | ||
245 | |||
242 | static struct platform_driver tegra_das_driver = { | 246 | static struct platform_driver tegra_das_driver = { |
243 | .probe = tegra_das_probe, | 247 | .probe = tegra_das_probe, |
244 | .remove = __devexit_p(tegra_das_remove), | 248 | .remove = __devexit_p(tegra_das_remove), |
245 | .driver = { | 249 | .driver = { |
246 | .name = DRV_NAME, | 250 | .name = DRV_NAME, |
251 | .owner = THIS_MODULE, | ||
252 | .of_match_table = tegra_das_of_match, | ||
247 | }, | 253 | }, |
248 | }; | 254 | }; |
249 | 255 | module_platform_driver(tegra_das_driver); | |
250 | static int __init tegra_das_modinit(void) | ||
251 | { | ||
252 | return platform_driver_register(&tegra_das_driver); | ||
253 | } | ||
254 | module_init(tegra_das_modinit); | ||
255 | |||
256 | static void __exit tegra_das_modexit(void) | ||
257 | { | ||
258 | platform_driver_unregister(&tegra_das_driver); | ||
259 | } | ||
260 | module_exit(tegra_das_modexit); | ||
261 | 256 | ||
262 | MODULE_AUTHOR("Stephen Warren <swarren@nvidia.com>"); | 257 | MODULE_AUTHOR("Stephen Warren <swarren@nvidia.com>"); |
263 | MODULE_DESCRIPTION("Tegra DAS driver"); | 258 | MODULE_DESCRIPTION("Tegra DAS driver"); |
264 | MODULE_LICENSE("GPL"); | 259 | MODULE_LICENSE("GPL"); |
265 | MODULE_ALIAS("platform:" DRV_NAME); | 260 | MODULE_ALIAS("platform:" DRV_NAME); |
261 | MODULE_DEVICE_TABLE(of, tegra_das_of_match); | ||