summaryrefslogtreecommitdiff
path: root/qcom/direwolf-vm-ufs.dtsi
blob: 254b1b6c8dfe1b4aa2a2f3c20c6be758f7fcf118 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
&regulator {
	L8G0: pm8540_g0_l8: regulator-pm8540_g0-l8 {
		regulator-name = "ldog8";
		regulator-min-microvolt = <825000>;
		regulator-max-microvolt = <925000>;
	};

	L3G0: pm8540_g0_l3: regulator-pm8540_g0-l3 {
		regulator-name = "ldog3";
		regulator-min-microvolt = <1130000>;
		regulator-max-microvolt = <1260000>;
	};

	gcc_ufs_card_gdsc: gcc_ufs_card_gdsc {
		regulator-name = "gcc_ufs_card_gdsc";
	};

	L10C0: pm8540_c0_l10: regulator-pm8540_c0-l10 {
		regulator-name = "ldoc10";
		regulator-min-microvolt = <2400000>;
		regulator-max-microvolt = <2960000>;
		qcom,init-mode = <RPMH_REGULATOR_MODE_HPM>;
	};

	L3C0: pm8540_c0_l3: regulator-pm8540_c0-l3 {
		regulator-name = "ldoc3";
		regulator-min-microvolt = <1080000>;
		regulator-max-microvolt = <1304000>;
		qcom,init-mode = <RPMH_REGULATOR_MODE_HPM>;
	};
};

&soc {
	ufs2phy_mem: ufsphy_mem@1da7000 {
		compatible = "qcom,ufs-phy-qmp-v4-direwolf";

		reg = <0x1da7000 0xe10>;
		reg-names = "phy_mem";
		#phy-cells = <0>;

		lanes-per-direction = <2>;

		vdda-phy-supply = <&L8G0>;
		vdda-pll-supply = <&L3G0>;
		vdda-phy-max-microamp = <85700>;
		vdda-pll-max-microamp = <18300>;

		clock-names = "ref_clk_src",
			"ref_clk",
			"ref_aux_clk",
			"ref_clk_parent";
		clocks = <&dummycc RPMH_CXO_CLK>,
			<&gcc GCC_UFS_1_CARD_CLKREF_CLK>,
			<&gcc GCC_UFS_CARD_PHY_AUX_CLK>,
			<&gcc GCC_UFS_REF_CLKREF_CLK>;
		resets = <&ufshc2_mem 0>;
		status = "disabled";
	};

	ufshc2_mem: ufshc@1da4000 {
		compatible = "qcom,ufshc";
		reg = <0x1da4000 0x3000>;
		reg-names = "ufs_mem";
		interrupts = <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>;
		phys = <&ufs2phy_mem>;
		phy-names = "ufsphy";
		#reset-cells = <1>;

		lanes-per-direction = <2>;
		dev-ref-clk-freq = <0>; /* 19.2 MHz */

		vdd-hba-supply = <&gcc_ufs_card_gdsc>;
		vdd-hba-fixed-regulator;

		vcc-supply = <&L10C0>;
		vcc-voltage-level = <2504000 2504000>;
		vcc-max-microamp = <800000>;

		vccq-supply = <&L3C0>;
		vccq-max-microamp = <750000>;

		qcom,vddp-ref-clk-supply = <&L3C0>;
		qcom,vddp-ref-clk-max-microamp = <100>;
		clock-names =
			"core_clk",
			"bus_aggr_clk",
			"iface_clk",
			"core_clk_unipro",
			"core_clk_ice",
			"ref_clk",
			"tx_lane0_sync_clk",
			"rx_lane0_sync_clk",
			"rx_lane1_sync_clk";
		clocks =
			<&gcc GCC_UFS_CARD_AXI_CLK>,
			<&gcc GCC_AGGRE_UFS_CARD_AXI_CLK>,
			<&gcc GCC_UFS_CARD_AHB_CLK>,
			<&gcc GCC_UFS_CARD_UNIPRO_CORE_CLK>,
			<&gcc GCC_UFS_CARD_ICE_CORE_CLK>,
			<&dummycc RPMH_CXO_CLK>,
			<&gcc GCC_UFS_CARD_TX_SYMBOL_0_CLK>,
			<&gcc GCC_UFS_CARD_RX_SYMBOL_0_CLK>,
			<&gcc GCC_UFS_CARD_RX_SYMBOL_1_CLK>;
		freq-table-hz =
			<75000000 300000000>,
			<0 0>,
			<0 0>,
			<75000000 300000000>,
			<75000000 300000000>,
			<0 0>,
			<0 0>,
			<0 0>,
			<0 0>;

		qcom,ufs-bus-bw,name = "ufshc_mem";
		qcom,ufs-bus-bw,num-cases = <26>;
		qcom,ufs-bus-bw,num-paths = <2>;
		qcom,ufs-bus-bw,vectors-KBps =
		/*
		 * During HS G3 UFS runs at nominal voltage corner, vote
		 * higher bandwidth to push other buses in the data path
		 * to run at nominal to achieve max throughput.
		 * 4GBps pushes BIMC to run at nominal.
		 * 200MBps pushes CNOC to run at nominal.
		 * Vote for half of this bandwidth for HS G3 1-lane.
		 * For max bandwidth, vote high enough to push the buses
		 * to run in turbo voltage corner.
		 */
		<0 0>, <0 0>,          /* No vote */
		<922 0>, <1000 0>,     /* PWM G1 */
		<1844 0>, <1000 0>,    /* PWM G2 */
		<3688 0>, <1000 0>,    /* PWM G3 */
		<7376 0>, <1000 0>,    /* PWM G4 */
		<1844 0>, <1000 0>,    /* PWM G1 L2 */
		<3688 0>, <1000 0>,    /* PWM G2 L2 */
		<7376 0>, <1000 0>,    /* PWM G3 L2 */
		<14752 0>, <1000 0>,   /* PWM G4 L2 */
		<127796 0>, <1000 0>,  /* HS G1 RA */
		<255591 0>, <1000 0>,  /* HS G2 RA */
		<1492582 0>, <102400 0>,  /* HS G3 RA */
		<2915200 0>, <204800 0>,  /* HS G4 RA */
		<255591 0>, <1000 0>,  /* HS G1 RA L2 */
		<511181 0>, <1000 0>,  /* HS G2 RA L2 */
		<1492582 0>, <204800 0>, /* HS G3 RA L2 */
		<2915200 0>, <409600 0>, /* HS G4 RA L2 */
		<149422 0>, <1000 0>,  /* HS G1 RB */
		<298189 0>, <1000 0>,  /* HS G2 RB */
		<1492582 0>, <102400 0>,  /* HS G3 RB */
		<2915200 0>, <204800 0>,  /* HS G4 RB */
		<298189 0>, <1000 0>,  /* HS G1 RB L2 */
		<596378 0>, <1000 0>,  /* HS G2 RB L2 */
		/* As UFS working in HS G3 RB L2 mode, aggregated
		 * bandwidth (AB) should take care of providing
		 * optimum throughput requested. However, as tested,
		 * in order to scale up CNOC clock, instantaneous
		 * bindwidth (IB) needs to be given a proper value too.
		 */
		<1492582 0>, <204800 409600>, /* HS G3 RB L2 KBPs */
		<2915200 0>, <409600 409600>, /* HS G4 RB L2 */
		<7643136 0>, <307200 0>; /* Max. bandwidth */

		qcom,bus-vector-names = "MIN",
		"PWM_G1_L1", "PWM_G2_L1", "PWM_G3_L1", "PWM_G4_L1",
		"PWM_G1_L2", "PWM_G2_L2", "PWM_G3_L2", "PWM_G4_L2",
		"HS_RA_G1_L1", "HS_RA_G2_L1", "HS_RA_G3_L1", "HS_RA_G4_L1",
		"HS_RA_G1_L2", "HS_RA_G2_L2", "HS_RA_G3_L2", "HS_RA_G4_L2",
		"HS_RB_G1_L1", "HS_RB_G2_L1", "HS_RB_G3_L1", "HS_RB_G4_L1",
		"HS_RB_G1_L2", "HS_RB_G2_L2", "HS_RB_G3_L2", "HS_RB_G4_L2",
		"MAX";

		reset-gpios = <&tlmm 229 GPIO_ACTIVE_LOW>;

		resets = <&gcc GCC_UFS_CARD_BCR>;
		reset-names = "rst";

		iommus = <&apps_smmu 0x4a0 0x0>;
		qcom,iommu-dma = "fastmap";
		dma-coherent;

		status = "disabled";
	};
};