|
|
@@ -38,20 +38,7 @@
|
|
|
#include <linux/of.h>
|
|
|
|
|
|
#include "ufshcd.h"
|
|
|
-
|
|
|
-static const struct of_device_id ufs_of_match[];
|
|
|
-static struct ufs_hba_variant_ops *get_variant_ops(struct device *dev)
|
|
|
-{
|
|
|
- if (dev->of_node) {
|
|
|
- const struct of_device_id *match;
|
|
|
-
|
|
|
- match = of_match_node(ufs_of_match, dev->of_node);
|
|
|
- if (match)
|
|
|
- return (struct ufs_hba_variant_ops *)match->data;
|
|
|
- }
|
|
|
-
|
|
|
- return NULL;
|
|
|
-}
|
|
|
+#include "ufshcd-pltfrm.h"
|
|
|
|
|
|
static int ufshcd_parse_clock_info(struct ufs_hba *hba)
|
|
|
{
|
|
|
@@ -245,10 +232,11 @@ static int ufshcd_parse_regulator_info(struct ufs_hba *hba)
|
|
|
* Returns 0 if successful
|
|
|
* Returns non-zero otherwise
|
|
|
*/
|
|
|
-static int ufshcd_pltfrm_suspend(struct device *dev)
|
|
|
+int ufshcd_pltfrm_suspend(struct device *dev)
|
|
|
{
|
|
|
return ufshcd_system_suspend(dev_get_drvdata(dev));
|
|
|
}
|
|
|
+EXPORT_SYMBOL_GPL(ufshcd_pltfrm_suspend);
|
|
|
|
|
|
/**
|
|
|
* ufshcd_pltfrm_resume - resume power management function
|
|
|
@@ -257,43 +245,47 @@ static int ufshcd_pltfrm_suspend(struct device *dev)
|
|
|
* Returns 0 if successful
|
|
|
* Returns non-zero otherwise
|
|
|
*/
|
|
|
-static int ufshcd_pltfrm_resume(struct device *dev)
|
|
|
+int ufshcd_pltfrm_resume(struct device *dev)
|
|
|
{
|
|
|
return ufshcd_system_resume(dev_get_drvdata(dev));
|
|
|
}
|
|
|
+EXPORT_SYMBOL_GPL(ufshcd_pltfrm_resume);
|
|
|
|
|
|
-static int ufshcd_pltfrm_runtime_suspend(struct device *dev)
|
|
|
+int ufshcd_pltfrm_runtime_suspend(struct device *dev)
|
|
|
{
|
|
|
return ufshcd_runtime_suspend(dev_get_drvdata(dev));
|
|
|
}
|
|
|
-static int ufshcd_pltfrm_runtime_resume(struct device *dev)
|
|
|
+EXPORT_SYMBOL_GPL(ufshcd_pltfrm_runtime_suspend);
|
|
|
+
|
|
|
+int ufshcd_pltfrm_runtime_resume(struct device *dev)
|
|
|
{
|
|
|
return ufshcd_runtime_resume(dev_get_drvdata(dev));
|
|
|
}
|
|
|
-static int ufshcd_pltfrm_runtime_idle(struct device *dev)
|
|
|
+EXPORT_SYMBOL_GPL(ufshcd_pltfrm_runtime_resume);
|
|
|
+
|
|
|
+int ufshcd_pltfrm_runtime_idle(struct device *dev)
|
|
|
{
|
|
|
return ufshcd_runtime_idle(dev_get_drvdata(dev));
|
|
|
}
|
|
|
-#else /* !CONFIG_PM */
|
|
|
-#define ufshcd_pltfrm_suspend NULL
|
|
|
-#define ufshcd_pltfrm_resume NULL
|
|
|
-#define ufshcd_pltfrm_runtime_suspend NULL
|
|
|
-#define ufshcd_pltfrm_runtime_resume NULL
|
|
|
-#define ufshcd_pltfrm_runtime_idle NULL
|
|
|
+EXPORT_SYMBOL_GPL(ufshcd_pltfrm_runtime_idle);
|
|
|
+
|
|
|
#endif /* CONFIG_PM */
|
|
|
|
|
|
-static void ufshcd_pltfrm_shutdown(struct platform_device *pdev)
|
|
|
+void ufshcd_pltfrm_shutdown(struct platform_device *pdev)
|
|
|
{
|
|
|
ufshcd_shutdown((struct ufs_hba *)platform_get_drvdata(pdev));
|
|
|
}
|
|
|
+EXPORT_SYMBOL_GPL(ufshcd_pltfrm_shutdown);
|
|
|
|
|
|
/**
|
|
|
- * ufshcd_pltfrm_probe - probe routine of the driver
|
|
|
+ * ufshcd_pltfrm_init - probe routine of the driver
|
|
|
* @pdev: pointer to Platform device handle
|
|
|
+ * @vops: pointer to variant ops
|
|
|
*
|
|
|
* Returns 0 on success, non-zero value on failure
|
|
|
*/
|
|
|
-static int ufshcd_pltfrm_probe(struct platform_device *pdev)
|
|
|
+int ufshcd_pltfrm_init(struct platform_device *pdev,
|
|
|
+ struct ufs_hba_variant_ops *vops)
|
|
|
{
|
|
|
struct ufs_hba *hba;
|
|
|
void __iomem *mmio_base;
|
|
|
@@ -321,19 +313,19 @@ static int ufshcd_pltfrm_probe(struct platform_device *pdev)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- hba->vops = get_variant_ops(&pdev->dev);
|
|
|
+ hba->vops = vops;
|
|
|
|
|
|
err = ufshcd_parse_clock_info(hba);
|
|
|
if (err) {
|
|
|
dev_err(&pdev->dev, "%s: clock parse failed %d\n",
|
|
|
__func__, err);
|
|
|
- goto out;
|
|
|
+ goto dealloc_host;
|
|
|
}
|
|
|
err = ufshcd_parse_regulator_info(hba);
|
|
|
if (err) {
|
|
|
dev_err(&pdev->dev, "%s: regulator init failed %d\n",
|
|
|
__func__, err);
|
|
|
- goto out;
|
|
|
+ goto dealloc_host;
|
|
|
}
|
|
|
|
|
|
pm_runtime_set_active(&pdev->dev);
|
|
|
@@ -352,50 +344,12 @@ static int ufshcd_pltfrm_probe(struct platform_device *pdev)
|
|
|
out_disable_rpm:
|
|
|
pm_runtime_disable(&pdev->dev);
|
|
|
pm_runtime_set_suspended(&pdev->dev);
|
|
|
+dealloc_host:
|
|
|
+ ufshcd_dealloc_host(hba);
|
|
|
out:
|
|
|
return err;
|
|
|
}
|
|
|
-
|
|
|
-/**
|
|
|
- * ufshcd_pltfrm_remove - remove platform driver routine
|
|
|
- * @pdev: pointer to platform device handle
|
|
|
- *
|
|
|
- * Returns 0 on success, non-zero value on failure
|
|
|
- */
|
|
|
-static int ufshcd_pltfrm_remove(struct platform_device *pdev)
|
|
|
-{
|
|
|
- struct ufs_hba *hba = platform_get_drvdata(pdev);
|
|
|
-
|
|
|
- pm_runtime_get_sync(&(pdev)->dev);
|
|
|
- ufshcd_remove(hba);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static const struct of_device_id ufs_of_match[] = {
|
|
|
- { .compatible = "jedec,ufs-1.1"},
|
|
|
- {},
|
|
|
-};
|
|
|
-
|
|
|
-static const struct dev_pm_ops ufshcd_dev_pm_ops = {
|
|
|
- .suspend = ufshcd_pltfrm_suspend,
|
|
|
- .resume = ufshcd_pltfrm_resume,
|
|
|
- .runtime_suspend = ufshcd_pltfrm_runtime_suspend,
|
|
|
- .runtime_resume = ufshcd_pltfrm_runtime_resume,
|
|
|
- .runtime_idle = ufshcd_pltfrm_runtime_idle,
|
|
|
-};
|
|
|
-
|
|
|
-static struct platform_driver ufshcd_pltfrm_driver = {
|
|
|
- .probe = ufshcd_pltfrm_probe,
|
|
|
- .remove = ufshcd_pltfrm_remove,
|
|
|
- .shutdown = ufshcd_pltfrm_shutdown,
|
|
|
- .driver = {
|
|
|
- .name = "ufshcd",
|
|
|
- .pm = &ufshcd_dev_pm_ops,
|
|
|
- .of_match_table = ufs_of_match,
|
|
|
- },
|
|
|
-};
|
|
|
-
|
|
|
-module_platform_driver(ufshcd_pltfrm_driver);
|
|
|
+EXPORT_SYMBOL_GPL(ufshcd_pltfrm_init);
|
|
|
|
|
|
MODULE_AUTHOR("Santosh Yaragnavi <santosh.sy@samsung.com>");
|
|
|
MODULE_AUTHOR("Vinayak Holikatti <h.vinayak@samsung.com>");
|