Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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.com
Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
Signed-off-by: Peter Wang <peter.wang@mediatek.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Peter Wang and committed by
Martin K. Petersen
de48898d 9dda74f3

+30
+1
drivers/scsi/ufs/Kconfig
··· 115 115 tristate "Mediatek specific hooks to UFS controller platform driver" 116 116 depends on SCSI_UFSHCD_PLATFORM && ARCH_MEDIATEK 117 117 select PHY_MTK_UFS 118 + select RESET_TI_SYSCON 118 119 help 119 120 This selects the Mediatek specific additions to UFSHCD platform driver. 120 121 UFS host on Mediatek needs some vendor specific configuration before
+29
drivers/scsi/ufs/ufs-mediatek.c
··· 1068 1068 { 1069 1069 int err; 1070 1070 struct device *dev = &pdev->dev; 1071 + struct device_node *reset_node; 1072 + struct platform_device *reset_pdev; 1073 + struct device_link *link; 1071 1074 1075 + reset_node = of_find_compatible_node(NULL, NULL, 1076 + "ti,syscon-reset"); 1077 + if (!reset_node) { 1078 + dev_notice(dev, "find ti,syscon-reset fail\n"); 1079 + goto skip_reset; 1080 + } 1081 + reset_pdev = of_find_device_by_node(reset_node); 1082 + if (!reset_pdev) { 1083 + dev_notice(dev, "find reset_pdev fail\n"); 1084 + goto skip_reset; 1085 + } 1086 + link = device_link_add(dev, &reset_pdev->dev, 1087 + DL_FLAG_AUTOPROBE_CONSUMER); 1088 + if (!link) { 1089 + dev_notice(dev, "add reset device_link fail\n"); 1090 + goto skip_reset; 1091 + } 1092 + /* supplier is not probed */ 1093 + if (link->status == DL_STATE_DORMANT) { 1094 + err = -EPROBE_DEFER; 1095 + goto out; 1096 + } 1097 + 1098 + skip_reset: 1072 1099 /* perform generic probe */ 1073 1100 err = ufshcd_pltfrm_init(pdev, &ufs_hba_mtk_vops); 1101 + 1102 + out: 1074 1103 if (err) 1075 1104 dev_info(dev, "probe failed %d\n", err); 1076 1105