Commit de48898d authored by Peter Wang's avatar Peter Wang Committed by Martin K. Petersen

scsi: ufs-mediatek: Create reset control device_link

Mediatek UFS reset function relies on Reset Control provided by
reset-ti-syscon. To make Mediatek Reset Control work properly, select
reset-ti-syscon to ensure it is being built.

In addition, establish device_link to wait until reset-ti-syscon
initialization is complete during UFS probing.

Link: https://lore.kernel.org/r/1622601720-22466-1-git-send-email-peter.wang@mediatek.comReviewed-by: default avatarStanley Chu <stanley.chu@mediatek.com>
Signed-off-by: default avatarPeter Wang <peter.wang@mediatek.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 9dda74f3
...@@ -115,6 +115,7 @@ config SCSI_UFS_MEDIATEK ...@@ -115,6 +115,7 @@ config SCSI_UFS_MEDIATEK
tristate "Mediatek specific hooks to UFS controller platform driver" tristate "Mediatek specific hooks to UFS controller platform driver"
depends on SCSI_UFSHCD_PLATFORM && ARCH_MEDIATEK depends on SCSI_UFSHCD_PLATFORM && ARCH_MEDIATEK
select PHY_MTK_UFS select PHY_MTK_UFS
select RESET_TI_SYSCON
help help
This selects the Mediatek specific additions to UFSHCD platform driver. This selects the Mediatek specific additions to UFSHCD platform driver.
UFS host on Mediatek needs some vendor specific configuration before UFS host on Mediatek needs some vendor specific configuration before
......
...@@ -1068,9 +1068,38 @@ static int ufs_mtk_probe(struct platform_device *pdev) ...@@ -1068,9 +1068,38 @@ static int ufs_mtk_probe(struct platform_device *pdev)
{ {
int err; int err;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct device_node *reset_node;
struct platform_device *reset_pdev;
struct device_link *link;
reset_node = of_find_compatible_node(NULL, NULL,
"ti,syscon-reset");
if (!reset_node) {
dev_notice(dev, "find ti,syscon-reset fail\n");
goto skip_reset;
}
reset_pdev = of_find_device_by_node(reset_node);
if (!reset_pdev) {
dev_notice(dev, "find reset_pdev fail\n");
goto skip_reset;
}
link = device_link_add(dev, &reset_pdev->dev,
DL_FLAG_AUTOPROBE_CONSUMER);
if (!link) {
dev_notice(dev, "add reset device_link fail\n");
goto skip_reset;
}
/* supplier is not probed */
if (link->status == DL_STATE_DORMANT) {
err = -EPROBE_DEFER;
goto out;
}
skip_reset:
/* perform generic probe */ /* perform generic probe */
err = ufshcd_pltfrm_init(pdev, &ufs_hba_mtk_vops); err = ufshcd_pltfrm_init(pdev, &ufs_hba_mtk_vops);
out:
if (err) if (err)
dev_info(dev, "probe failed %d\n", err); dev_info(dev, "probe failed %d\n", err);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment