aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/ufs/ufshcd-pltfrm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/ufs/ufshcd-pltfrm.c')
-rw-r--r--drivers/scsi/ufs/ufshcd-pltfrm.c98
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"
42static const struct of_device_id ufs_of_match[];
43static 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
56static int ufshcd_parse_clock_info(struct ufs_hba *hba) 43static 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 */
248static int ufshcd_pltfrm_suspend(struct device *dev) 235int 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}
239EXPORT_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 */
260static int ufshcd_pltfrm_resume(struct device *dev) 248int 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}
252EXPORT_SYMBOL_GPL(ufshcd_pltfrm_resume);
264 253
265static int ufshcd_pltfrm_runtime_suspend(struct device *dev) 254int 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}
269static int ufshcd_pltfrm_runtime_resume(struct device *dev) 258EXPORT_SYMBOL_GPL(ufshcd_pltfrm_runtime_suspend);
259
260int 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}
273static int ufshcd_pltfrm_runtime_idle(struct device *dev) 264EXPORT_SYMBOL_GPL(ufshcd_pltfrm_runtime_resume);
265
266int 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 */ 270EXPORT_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
285static void ufshcd_pltfrm_shutdown(struct platform_device *pdev) 274void 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}
278EXPORT_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 */
296static int ufshcd_pltfrm_probe(struct platform_device *pdev) 287int 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)
352out_disable_rpm: 344out_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);
347dealloc_host:
348 ufshcd_dealloc_host(hba);
355out: 349out:
356 return err; 350 return err;
357} 351}
358 352EXPORT_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 */
365static 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
374static const struct of_device_id ufs_of_match[] = {
375 { .compatible = "jedec,ufs-1.1"},
376 {},
377};
378
379static 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
387static 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
398module_platform_driver(ufshcd_pltfrm_driver);
399 353
400MODULE_AUTHOR("Santosh Yaragnavi <santosh.sy@samsung.com>"); 354MODULE_AUTHOR("Santosh Yaragnavi <santosh.sy@samsung.com>");
401MODULE_AUTHOR("Vinayak Holikatti <h.vinayak@samsung.com>"); 355MODULE_AUTHOR("Vinayak Holikatti <h.vinayak@samsung.com>");