diff options
Diffstat (limited to 'drivers/scsi/ufs/ufshcd-pltfrm.c')
-rw-r--r-- | drivers/scsi/ufs/ufshcd-pltfrm.c | 98 |
1 files changed, 26 insertions, 72 deletions
diff --git a/drivers/scsi/ufs/ufshcd-pltfrm.c b/drivers/scsi/ufs/ufshcd-pltfrm.c index 7db9564f507d..9714f2a8b329 100644 --- a/drivers/scsi/ufs/ufshcd-pltfrm.c +++ b/drivers/scsi/ufs/ufshcd-pltfrm.c | |||
@@ -38,20 +38,7 @@ | |||
38 | #include <linux/of.h> | 38 | #include <linux/of.h> |
39 | 39 | ||
40 | #include "ufshcd.h" | 40 | #include "ufshcd.h" |
41 | 41 | #include "ufshcd-pltfrm.h" | |
42 | static const struct of_device_id ufs_of_match[]; | ||
43 | static struct ufs_hba_variant_ops *get_variant_ops(struct device *dev) | ||
44 | { | ||
45 | if (dev->of_node) { | ||
46 | const struct of_device_id *match; | ||
47 | |||
48 | match = of_match_node(ufs_of_match, dev->of_node); | ||
49 | if (match) | ||
50 | return (struct ufs_hba_variant_ops *)match->data; | ||
51 | } | ||
52 | |||
53 | return NULL; | ||
54 | } | ||
55 | 42 | ||
56 | static int ufshcd_parse_clock_info(struct ufs_hba *hba) | 43 | static int ufshcd_parse_clock_info(struct ufs_hba *hba) |
57 | { | 44 | { |
@@ -245,10 +232,11 @@ out: | |||
245 | * Returns 0 if successful | 232 | * Returns 0 if successful |
246 | * Returns non-zero otherwise | 233 | * Returns non-zero otherwise |
247 | */ | 234 | */ |
248 | static int ufshcd_pltfrm_suspend(struct device *dev) | 235 | int ufshcd_pltfrm_suspend(struct device *dev) |
249 | { | 236 | { |
250 | return ufshcd_system_suspend(dev_get_drvdata(dev)); | 237 | return ufshcd_system_suspend(dev_get_drvdata(dev)); |
251 | } | 238 | } |
239 | EXPORT_SYMBOL_GPL(ufshcd_pltfrm_suspend); | ||
252 | 240 | ||
253 | /** | 241 | /** |
254 | * ufshcd_pltfrm_resume - resume power management function | 242 | * ufshcd_pltfrm_resume - resume power management function |
@@ -257,43 +245,47 @@ static int ufshcd_pltfrm_suspend(struct device *dev) | |||
257 | * Returns 0 if successful | 245 | * Returns 0 if successful |
258 | * Returns non-zero otherwise | 246 | * Returns non-zero otherwise |
259 | */ | 247 | */ |
260 | static int ufshcd_pltfrm_resume(struct device *dev) | 248 | int ufshcd_pltfrm_resume(struct device *dev) |
261 | { | 249 | { |
262 | return ufshcd_system_resume(dev_get_drvdata(dev)); | 250 | return ufshcd_system_resume(dev_get_drvdata(dev)); |
263 | } | 251 | } |
252 | EXPORT_SYMBOL_GPL(ufshcd_pltfrm_resume); | ||
264 | 253 | ||
265 | static int ufshcd_pltfrm_runtime_suspend(struct device *dev) | 254 | int ufshcd_pltfrm_runtime_suspend(struct device *dev) |
266 | { | 255 | { |
267 | return ufshcd_runtime_suspend(dev_get_drvdata(dev)); | 256 | return ufshcd_runtime_suspend(dev_get_drvdata(dev)); |
268 | } | 257 | } |
269 | static int ufshcd_pltfrm_runtime_resume(struct device *dev) | 258 | EXPORT_SYMBOL_GPL(ufshcd_pltfrm_runtime_suspend); |
259 | |||
260 | int ufshcd_pltfrm_runtime_resume(struct device *dev) | ||
270 | { | 261 | { |
271 | return ufshcd_runtime_resume(dev_get_drvdata(dev)); | 262 | return ufshcd_runtime_resume(dev_get_drvdata(dev)); |
272 | } | 263 | } |
273 | static int ufshcd_pltfrm_runtime_idle(struct device *dev) | 264 | EXPORT_SYMBOL_GPL(ufshcd_pltfrm_runtime_resume); |
265 | |||
266 | int ufshcd_pltfrm_runtime_idle(struct device *dev) | ||
274 | { | 267 | { |
275 | return ufshcd_runtime_idle(dev_get_drvdata(dev)); | 268 | return ufshcd_runtime_idle(dev_get_drvdata(dev)); |
276 | } | 269 | } |
277 | #else /* !CONFIG_PM */ | 270 | EXPORT_SYMBOL_GPL(ufshcd_pltfrm_runtime_idle); |
278 | #define ufshcd_pltfrm_suspend NULL | 271 | |
279 | #define ufshcd_pltfrm_resume NULL | ||
280 | #define ufshcd_pltfrm_runtime_suspend NULL | ||
281 | #define ufshcd_pltfrm_runtime_resume NULL | ||
282 | #define ufshcd_pltfrm_runtime_idle NULL | ||
283 | #endif /* CONFIG_PM */ | 272 | #endif /* CONFIG_PM */ |
284 | 273 | ||
285 | static void ufshcd_pltfrm_shutdown(struct platform_device *pdev) | 274 | void ufshcd_pltfrm_shutdown(struct platform_device *pdev) |
286 | { | 275 | { |
287 | ufshcd_shutdown((struct ufs_hba *)platform_get_drvdata(pdev)); | 276 | ufshcd_shutdown((struct ufs_hba *)platform_get_drvdata(pdev)); |
288 | } | 277 | } |
278 | EXPORT_SYMBOL_GPL(ufshcd_pltfrm_shutdown); | ||
289 | 279 | ||
290 | /** | 280 | /** |
291 | * ufshcd_pltfrm_probe - probe routine of the driver | 281 | * ufshcd_pltfrm_init - probe routine of the driver |
292 | * @pdev: pointer to Platform device handle | 282 | * @pdev: pointer to Platform device handle |
283 | * @vops: pointer to variant ops | ||
293 | * | 284 | * |
294 | * Returns 0 on success, non-zero value on failure | 285 | * Returns 0 on success, non-zero value on failure |
295 | */ | 286 | */ |
296 | static int ufshcd_pltfrm_probe(struct platform_device *pdev) | 287 | int ufshcd_pltfrm_init(struct platform_device *pdev, |
288 | struct ufs_hba_variant_ops *vops) | ||
297 | { | 289 | { |
298 | struct ufs_hba *hba; | 290 | struct ufs_hba *hba; |
299 | void __iomem *mmio_base; | 291 | void __iomem *mmio_base; |
@@ -321,19 +313,19 @@ static int ufshcd_pltfrm_probe(struct platform_device *pdev) | |||
321 | goto out; | 313 | goto out; |
322 | } | 314 | } |
323 | 315 | ||
324 | hba->vops = get_variant_ops(&pdev->dev); | 316 | hba->vops = vops; |
325 | 317 | ||
326 | err = ufshcd_parse_clock_info(hba); | 318 | err = ufshcd_parse_clock_info(hba); |
327 | if (err) { | 319 | if (err) { |
328 | dev_err(&pdev->dev, "%s: clock parse failed %d\n", | 320 | dev_err(&pdev->dev, "%s: clock parse failed %d\n", |
329 | __func__, err); | 321 | __func__, err); |
330 | goto out; | 322 | goto dealloc_host; |
331 | } | 323 | } |
332 | err = ufshcd_parse_regulator_info(hba); | 324 | err = ufshcd_parse_regulator_info(hba); |
333 | if (err) { | 325 | if (err) { |
334 | dev_err(&pdev->dev, "%s: regulator init failed %d\n", | 326 | dev_err(&pdev->dev, "%s: regulator init failed %d\n", |
335 | __func__, err); | 327 | __func__, err); |
336 | goto out; | 328 | goto dealloc_host; |
337 | } | 329 | } |
338 | 330 | ||
339 | pm_runtime_set_active(&pdev->dev); | 331 | pm_runtime_set_active(&pdev->dev); |
@@ -352,50 +344,12 @@ static int ufshcd_pltfrm_probe(struct platform_device *pdev) | |||
352 | out_disable_rpm: | 344 | out_disable_rpm: |
353 | pm_runtime_disable(&pdev->dev); | 345 | pm_runtime_disable(&pdev->dev); |
354 | pm_runtime_set_suspended(&pdev->dev); | 346 | pm_runtime_set_suspended(&pdev->dev); |
347 | dealloc_host: | ||
348 | ufshcd_dealloc_host(hba); | ||
355 | out: | 349 | out: |
356 | return err; | 350 | return err; |
357 | } | 351 | } |
358 | 352 | EXPORT_SYMBOL_GPL(ufshcd_pltfrm_init); | |
359 | /** | ||
360 | * ufshcd_pltfrm_remove - remove platform driver routine | ||
361 | * @pdev: pointer to platform device handle | ||
362 | * | ||
363 | * Returns 0 on success, non-zero value on failure | ||
364 | */ | ||
365 | static int ufshcd_pltfrm_remove(struct platform_device *pdev) | ||
366 | { | ||
367 | struct ufs_hba *hba = platform_get_drvdata(pdev); | ||
368 | |||
369 | pm_runtime_get_sync(&(pdev)->dev); | ||
370 | ufshcd_remove(hba); | ||
371 | return 0; | ||
372 | } | ||
373 | |||
374 | static const struct of_device_id ufs_of_match[] = { | ||
375 | { .compatible = "jedec,ufs-1.1"}, | ||
376 | {}, | ||
377 | }; | ||
378 | |||
379 | static const struct dev_pm_ops ufshcd_dev_pm_ops = { | ||
380 | .suspend = ufshcd_pltfrm_suspend, | ||
381 | .resume = ufshcd_pltfrm_resume, | ||
382 | .runtime_suspend = ufshcd_pltfrm_runtime_suspend, | ||
383 | .runtime_resume = ufshcd_pltfrm_runtime_resume, | ||
384 | .runtime_idle = ufshcd_pltfrm_runtime_idle, | ||
385 | }; | ||
386 | |||
387 | static struct platform_driver ufshcd_pltfrm_driver = { | ||
388 | .probe = ufshcd_pltfrm_probe, | ||
389 | .remove = ufshcd_pltfrm_remove, | ||
390 | .shutdown = ufshcd_pltfrm_shutdown, | ||
391 | .driver = { | ||
392 | .name = "ufshcd", | ||
393 | .pm = &ufshcd_dev_pm_ops, | ||
394 | .of_match_table = ufs_of_match, | ||
395 | }, | ||
396 | }; | ||
397 | |||
398 | module_platform_driver(ufshcd_pltfrm_driver); | ||
399 | 353 | ||
400 | MODULE_AUTHOR("Santosh Yaragnavi <santosh.sy@samsung.com>"); | 354 | MODULE_AUTHOR("Santosh Yaragnavi <santosh.sy@samsung.com>"); |
401 | MODULE_AUTHOR("Vinayak Holikatti <h.vinayak@samsung.com>"); | 355 | MODULE_AUTHOR("Vinayak Holikatti <h.vinayak@samsung.com>"); |