diff --git a/android/GKI_VERSION b/android/GKI_VERSION
index 0add1e35cf7d..244ce6627aa0 100644
--- a/android/GKI_VERSION
+++ b/android/GKI_VERSION
@@ -1 +1 @@
-LTS_5.4.86_fe9e8630bfaf
+LTS_5.4.86_8eb841225953
diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml
index ff1a17ee7753..9b0d0c9f7193 100644
--- a/android/abi_gki_aarch64.xml
+++ b/android/abi_gki_aarch64.xml
@@ -760,6 +760,7 @@
+
@@ -1649,6 +1650,8 @@
+
+
@@ -1705,6 +1708,7 @@
+
@@ -2615,6 +2619,7 @@
+
@@ -2647,6 +2652,7 @@
+
@@ -2797,6 +2803,7 @@
+
@@ -3015,6 +3022,9 @@
+
+
+
@@ -3649,6 +3659,7 @@
+
@@ -3753,6 +3764,7 @@
+
@@ -3838,8 +3850,10 @@
+
+
@@ -3967,13 +3981,13 @@
-
+
@@ -4118,6 +4132,8 @@
+
+
@@ -4210,7 +4226,11 @@
+
+
+
+
@@ -4930,6 +4950,7 @@
+
@@ -17791,7 +17812,7 @@
-
+
@@ -20409,7 +20430,7 @@
-
+
@@ -28561,7 +28582,7 @@
-
+
@@ -30034,7 +30055,7 @@
-
+
@@ -30244,7 +30265,7 @@
-
+
@@ -30953,7 +30974,7 @@
-
+
@@ -31970,7 +31991,7 @@
-
+
@@ -32433,7 +32454,7 @@
-
+
@@ -32517,7 +32538,7 @@
-
+
@@ -67919,6 +67940,12 @@
+
+
+
+
+
+
@@ -67939,6 +67966,13 @@
+
+
+
+
+
+
+
@@ -105576,6 +105610,11 @@
+
+
+
+
+
@@ -128458,6 +128497,10 @@
+
+
+
+
@@ -128465,10 +128508,6 @@
-
-
-
-
@@ -128482,6 +128521,10 @@
+
+
+
+
@@ -140287,6 +140330,7 @@
+
@@ -140309,6 +140353,13 @@
+
+
+
+
+
+
+
@@ -140715,6 +140766,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -148310,7 +148373,7 @@
-
+
@@ -148331,6 +148394,12 @@
+
+
+
+
+
+
@@ -148345,6 +148414,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -148466,7 +148545,7 @@
-
+
@@ -148787,6 +148866,13 @@
+
+
+
+
+
+
+
@@ -163003,78 +163089,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -163206,25 +163220,47 @@
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -163278,6 +163314,70 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -163581,6 +163681,7 @@
+
@@ -164375,6 +164476,11 @@
+
+
+
+
+
@@ -167658,7 +167764,7 @@
-
+
@@ -167666,7 +167772,7 @@
-
+
@@ -167674,7 +167780,7 @@
-
+
@@ -174030,7 +174136,7 @@
-
+
@@ -175913,6 +176019,11 @@
+
+
+
+
+
@@ -178796,7 +178907,7 @@
-
+
@@ -178825,7 +178936,7 @@
-
+
@@ -179417,7 +179528,7 @@
-
+
@@ -180377,7 +180488,7 @@
-
+
@@ -185999,12 +186110,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -191058,6 +191185,6 @@
diff --git a/android/abi_gki_aarch64_e399f16519fa.xml b/android/abi_gki_aarch64_8eb841225953.xml
similarity index 99%
rename from android/abi_gki_aarch64_e399f16519fa.xml
rename to android/abi_gki_aarch64_8eb841225953.xml
index f6a0b4d8467f..49c4658c88e2 100644
--- a/android/abi_gki_aarch64_e399f16519fa.xml
+++ b/android/abi_gki_aarch64_8eb841225953.xml
@@ -1052,6 +1052,7 @@
+
@@ -1186,7 +1187,9 @@
+
+
@@ -2381,6 +2384,8 @@
+
+
@@ -7390,69 +7395,69 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -9103,56 +9108,56 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -10440,140 +10445,140 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -11760,9 +11765,9 @@
-
+
-
+
@@ -11785,116 +11790,116 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -13336,56 +13341,56 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -14600,66 +14605,66 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -15527,7 +15532,7 @@
-
+
@@ -16255,9 +16260,9 @@
-
+
-
+
@@ -16275,7 +16280,7 @@
-
+
@@ -16531,6 +16536,7 @@
+
@@ -17064,7 +17070,7 @@
-
+
@@ -17411,6 +17417,7 @@
+
@@ -25490,6 +25497,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -32759,7 +32777,7 @@
-
+
@@ -33880,7 +33898,7 @@
-
+
@@ -34681,7 +34699,7 @@
-
+
@@ -35048,10 +35066,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -35330,7 +35402,7 @@
-
+
@@ -35507,60 +35579,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -37244,7 +37262,7 @@
-
+
@@ -38344,7 +38362,7 @@
-
+
@@ -38734,7 +38752,7 @@
-
+
@@ -42881,33 +42899,33 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -47010,7 +47028,7 @@
-
+
@@ -47704,7 +47722,7 @@
-
+
@@ -47712,7 +47730,7 @@
-
+
@@ -47728,7 +47746,7 @@
-
+
@@ -47960,7 +47978,7 @@
-
+
@@ -47971,7 +47989,7 @@
-
+
@@ -47979,7 +47997,7 @@
-
+
@@ -49117,7 +49135,7 @@
-
+
@@ -49125,7 +49143,7 @@
-
+
@@ -49133,7 +49151,7 @@
-
+
@@ -49757,7 +49775,7 @@
-
+
@@ -51191,7 +51209,7 @@
-
+
@@ -51704,7 +51722,7 @@
-
+
@@ -51828,7 +51846,7 @@
-
+
@@ -51842,7 +51860,7 @@
-
+
@@ -51850,7 +51868,7 @@
-
+
@@ -52337,7 +52355,7 @@
-
+
@@ -52401,7 +52419,7 @@
-
+
@@ -52458,7 +52476,7 @@
-
+
@@ -52606,7 +52624,7 @@
-
+
@@ -52637,7 +52655,7 @@
-
+
@@ -52648,7 +52666,7 @@
-
+
@@ -52710,7 +52728,7 @@
-
+
@@ -52907,7 +52925,7 @@
-
+
@@ -52926,7 +52944,7 @@
-
+
@@ -52963,7 +52981,7 @@
-
+
@@ -53087,12 +53105,12 @@
-
+
-
+
@@ -53108,7 +53126,7 @@
-
+
@@ -53119,12 +53137,12 @@
-
+
-
+
@@ -53132,7 +53150,7 @@
-
+
@@ -53145,7 +53163,7 @@
-
+
@@ -53239,7 +53257,7 @@
-
+
@@ -53298,7 +53316,7 @@
-
+
@@ -55311,7 +55329,7 @@
-
+
@@ -55319,7 +55337,7 @@
-
+
@@ -55631,7 +55649,7 @@
-
+
@@ -55746,7 +55764,7 @@
-
+
@@ -55797,7 +55815,7 @@
-
+
@@ -56245,190 +56263,190 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -58977,7 +58995,7 @@
-
+
@@ -60112,7 +60130,7 @@
-
+
@@ -60120,7 +60138,7 @@
-
+
@@ -61790,7 +61808,7 @@
-
+
@@ -63276,9 +63294,9 @@
-
+
-
+
@@ -63518,7 +63536,7 @@
-
+
@@ -63526,7 +63544,7 @@
-
+
@@ -64252,7 +64270,7 @@
-
+
@@ -64260,7 +64278,7 @@
-
+
@@ -64268,7 +64286,7 @@
-
+
@@ -64276,7 +64294,7 @@
-
+
@@ -64284,7 +64302,7 @@
-
+
@@ -64295,15 +64313,15 @@
-
+
-
+
-
+
-
+
@@ -64314,7 +64332,7 @@
-
+
@@ -64322,7 +64340,7 @@
-
+
@@ -64654,24 +64672,24 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -64694,7 +64712,7 @@
-
+
@@ -67679,12 +67697,12 @@
-
+
-
+
@@ -67771,7 +67789,7 @@
-
+
@@ -86748,8 +86766,8 @@
-
-
+
+
@@ -88503,8 +88521,8 @@
-
-
+
+
@@ -93217,84 +93235,23 @@
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -94193,7 +94150,7 @@
-
+
@@ -95770,9 +95727,114 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -96162,7 +96224,7 @@
-
+
@@ -96394,7 +96456,7 @@
-
+
@@ -100073,164 +100135,164 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -102628,86 +102690,86 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -104832,15 +104894,15 @@
-
+
-
+
-
+
-
+
@@ -107000,62 +107062,62 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -107211,178 +107273,178 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -110202,7 +110264,7 @@
-
+
@@ -110555,6 +110617,8 @@
+
+
@@ -112168,9 +112232,231 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -113724,7 +114010,7 @@
-
+
@@ -113741,7 +114027,7 @@
-
+
@@ -113749,7 +114035,7 @@
-
+
@@ -113766,7 +114052,7 @@
-
+
@@ -113968,7 +114254,7 @@
-
+
@@ -113982,7 +114268,7 @@
-
+
@@ -114004,7 +114290,7 @@
-
+
@@ -114746,12 +115032,12 @@
-
+
-
+
@@ -114823,7 +115109,7 @@
-
+
@@ -115504,7 +115790,7 @@
-
+
@@ -115538,7 +115824,7 @@
-
+
@@ -115877,7 +116163,7 @@
-
+
@@ -116018,7 +116304,7 @@
-
+
@@ -116364,7 +116650,7 @@
-
+
@@ -116394,7 +116680,7 @@
-
+
@@ -117110,7 +117396,7 @@
-
+
@@ -117517,7 +117803,7 @@
-
+
@@ -118207,7 +118493,7 @@
-
+
@@ -118337,7 +118623,7 @@
-
+
@@ -118368,7 +118654,7 @@
-
+
@@ -118377,7 +118663,7 @@
-
+
@@ -118399,7 +118685,7 @@
-
+
@@ -118410,7 +118696,7 @@
-
+
@@ -118418,7 +118704,7 @@
-
+
@@ -118429,7 +118715,7 @@
-
+
@@ -118477,7 +118763,7 @@
-
+
@@ -118558,7 +118844,7 @@
-
+
@@ -118714,7 +119000,7 @@
-
+
@@ -118723,37 +119009,37 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -118923,7 +119209,7 @@
-
+
@@ -128696,15 +128982,15 @@
-
-
-
-
+
+
+
+
-
-
-
+
+
+
@@ -129996,14 +130282,246 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -130027,10 +130545,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
@@ -130041,6 +130607,12 @@
+
+
+
+
+
+
@@ -130088,13 +130660,13 @@
-
+
-
+
@@ -130103,12 +130675,12 @@
-
+
-
+
@@ -130524,7 +131096,7 @@
-
+
@@ -131649,7 +132221,7 @@
-
+
@@ -131657,7 +132229,7 @@
-
+
@@ -131679,9 +132251,9 @@
-
+
-
+
@@ -131699,7 +132271,7 @@
-
+
@@ -132142,62 +132714,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -132384,6 +132900,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -139094,7 +139666,7 @@
-
+
diff --git a/android/abi_gki_aarch64_galaxy b/android/abi_gki_aarch64_galaxy
index b65bf734e98c..485f7c3a66d6 100644
--- a/android/abi_gki_aarch64_galaxy
+++ b/android/abi_gki_aarch64_galaxy
@@ -1634,6 +1634,7 @@
of_find_node_opts_by_path
of_find_node_with_property
of_find_property
+ of_find_spi_device_by_node
of_fwnode_ops
of_genpd_add_provider_onecell
of_genpd_add_provider_simple
@@ -2170,6 +2171,7 @@
smpboot_unregister_percpu_thread
snd_card_free
snd_card_new
+ snd_card_ref
snd_card_register
snd_compr_stop_error
snd_ctl_add
@@ -2214,7 +2216,9 @@
snd_soc_card_get_kcontrol
snd_soc_component_async_complete
snd_soc_component_disable_pin
+ snd_soc_component_enable_pin
snd_soc_component_force_enable_pin
+ snd_soc_component_get_pin_status
snd_soc_component_init_regmap
snd_soc_component_read
snd_soc_component_read32
diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom
index 670cca06141c..c3a20145154e 100644
--- a/android/abi_gki_aarch64_qcom
+++ b/android/abi_gki_aarch64_qcom
@@ -939,6 +939,7 @@
fsl8250_handle_irq
fs_kobj
fsstack_copy_attr_all
+ ftrace_set_clr_event
full_name_hash
fwnode_connection_find_match
fwnode_get_parent
@@ -1082,6 +1083,8 @@
i2c_register_driver
i2c_smbus_read_byte
i2c_smbus_write_byte
+ i2c_smbus_read_byte_data
+ i2c_smbus_write_byte_data
__i2c_smbus_xfer
i2c_smbus_xfer
__i2c_transfer
@@ -2440,6 +2443,8 @@
timer_unstable_counter_workaround
timespec64_to_jiffies
_totalram_pages
+ trace_array_create
+ trace_array_destroy
__trace_bprintk
trace_define_field
trace_event_buffer_commit
diff --git a/android/abi_gki_aarch64_sonywalkman b/android/abi_gki_aarch64_sonywalkman
new file mode 100644
index 000000000000..fc0e382d5486
--- /dev/null
+++ b/android/abi_gki_aarch64_sonywalkman
@@ -0,0 +1,1846 @@
+[abi_symbol_list]
+# commonly used symbols
+ add_timer
+ alloc_chrdev_region
+ alloc_pages_exact
+ __alloc_pages_nodemask
+ __alloc_percpu
+ alloc_workqueue
+ __arch_copy_from_user
+ __arch_copy_to_user
+ arm64_const_caps_ready
+ __arm_smccc_smc
+ atomic_notifier_call_chain
+ atomic_notifier_chain_register
+ atomic_notifier_chain_unregister
+ bcmp
+ blocking_notifier_call_chain
+ bpf_trace_run1
+ bpf_trace_run2
+ bpf_trace_run3
+ cancel_delayed_work
+ cancel_delayed_work_sync
+ cancel_work_sync
+ cdev_add
+ cdev_del
+ cdev_init
+ __cfi_slowpath
+ __check_object_size
+ __class_create
+ class_destroy
+ clk_bulk_enable
+ clk_bulk_prepare
+ clk_bulk_unprepare
+ clk_disable
+ clk_enable
+ clk_gate_ops
+ clk_get
+ __clk_get_name
+ clk_get_parent
+ clk_get_rate
+ clk_is_match
+ clk_prepare
+ clk_put
+ clk_register
+ clk_register_fixed_rate
+ clk_register_gate
+ clk_register_mux
+ clk_round_rate
+ clk_set_parent
+ clk_set_rate
+ clk_unprepare
+ complete
+ complete_all
+ completion_done
+ component_add
+ component_del
+ __const_udelay
+ cpu_bit_bitmap
+ __cpuhp_remove_state
+ __cpuhp_setup_state
+ __cpuhp_state_add_instance
+ __cpuhp_state_remove_instance
+ cpu_hwcap_keys
+ cpu_hwcaps
+ cpumask_next
+ cpu_number
+ __cpu_online_mask
+ __cpu_possible_mask
+ crypto_alloc_shash
+ crypto_destroy_tfm
+ delayed_work_timer_fn
+ del_timer
+ del_timer_sync
+ destroy_workqueue
+ dev_driver_string
+ _dev_err
+ dev_fwnode
+ device_create
+ device_create_file
+ device_destroy
+ device_for_each_child
+ device_get_match_data
+ device_init_wakeup
+ device_link_add
+ device_link_del
+ device_property_present
+ device_property_read_u32_array
+ device_remove_file
+ __device_reset
+ device_set_wakeup_capable
+ device_set_wakeup_enable
+ device_unregister
+ device_wakeup_enable
+ _dev_info
+ devm_add_action
+ devm_clk_bulk_get
+ devm_clk_get
+ devm_clk_get_optional
+ devm_extcon_dev_allocate
+ devm_extcon_dev_register
+ devm_free_irq
+ devm_gpiod_get
+ devm_gpiod_get_optional
+ devm_gpio_request_one
+ devm_ioremap
+ devm_ioremap_resource
+ devm_kasprintf
+ devm_kfree
+ devm_kmalloc
+ __devm_of_phy_provider_register
+ devm_phy_create
+ devm_phy_get
+ devm_pinctrl_get
+ devm_platform_ioremap_resource
+ __devm_regmap_init_i2c
+ __devm_regmap_init_mmio_clk
+ devm_regulator_get
+ devm_regulator_get_optional
+ devm_request_threaded_irq
+ __devm_reset_control_get
+ devm_reset_controller_register
+ devm_snd_dmaengine_pcm_register
+ devm_snd_soc_register_card
+ devm_snd_soc_register_component
+ devm_usb_get_phy
+ devm_usb_get_phy_by_phandle
+ _dev_notice
+ dev_pm_domain_attach_by_name
+ dev_pm_domain_detach
+ dev_pm_set_wake_irq
+ _dev_warn
+ disable_irq
+ disable_irq_nosync
+ dma_alloc_attrs
+ dma_buf_attach
+ dma_buf_detach
+ dma_buf_get
+ dma_buf_map_attachment
+ dma_buf_put
+ dma_buf_unmap_attachment
+ dma_direct_map_page
+ dma_direct_map_sg
+ dma_direct_sync_sg_for_cpu
+ dma_direct_sync_sg_for_device
+ dma_direct_unmap_page
+ dma_direct_unmap_sg
+ dma_free_attrs
+ dma_get_slave_caps
+ dma_mmap_attrs
+ dma_release_channel
+ dma_request_chan
+ __dma_request_channel
+ dma_request_slave_channel
+ dma_set_coherent_mask
+ dma_set_mask
+ down
+ down_interruptible
+ down_write
+ drm_add_edid_modes
+ drm_atomic_helper_check
+ drm_atomic_helper_check_plane_state
+ drm_atomic_helper_cleanup_planes
+ drm_atomic_helper_commit
+ drm_atomic_helper_commit_hw_done
+ drm_atomic_helper_commit_modeset_disables
+ drm_atomic_helper_commit_modeset_enables
+ drm_atomic_helper_commit_planes
+ drm_atomic_helper_connector_destroy_state
+ drm_atomic_helper_connector_duplicate_state
+ drm_atomic_helper_connector_reset
+ __drm_atomic_helper_crtc_destroy_state
+ __drm_atomic_helper_crtc_duplicate_state
+ drm_atomic_helper_disable_plane
+ drm_atomic_helper_page_flip
+ drm_atomic_helper_plane_destroy_state
+ drm_atomic_helper_plane_duplicate_state
+ drm_atomic_helper_plane_reset
+ drm_atomic_helper_set_config
+ drm_atomic_helper_update_plane
+ drm_atomic_helper_wait_for_vblanks
+ drm_bridge_add
+ drm_bridge_attach
+ drm_bridge_remove
+ drm_compat_ioctl
+ drm_connector_attach_encoder
+ drm_connector_cleanup
+ drm_connector_init
+ drm_connector_update_edid_property
+ drm_crtc_arm_vblank_event
+ drm_crtc_cleanup
+ drm_crtc_handle_vblank
+ drm_crtc_init_with_planes
+ drm_crtc_send_vblank_event
+ drm_crtc_vblank_get
+ drm_crtc_vblank_off
+ drm_crtc_vblank_on
+ drm_detect_hdmi_monitor
+ drm_dev_alloc
+ drm_dev_printk
+ drm_dev_put
+ drm_dev_register
+ drm_dev_unregister
+ drm_display_info_set_bus_formats
+ drm_display_mode_from_videomode
+ drm_display_mode_to_videomode
+ drm_encoder_cleanup
+ drm_encoder_init
+ drm_err
+ drm_fb_cma_get_gem_obj
+ drm_gem_fb_create
+ drm_gem_prime_fd_to_handle
+ drm_gem_prime_handle_to_fd
+ drm_get_edid
+ drm_get_format_name
+ drm_hdmi_avi_infoframe_from_display_mode
+ drm_hdmi_vendor_infoframe_from_display_mode
+ drm_helper_hpd_irq_event
+ drm_helper_probe_single_connector_modes
+ drm_ioctl
+ drm_match_cea_mode
+ drm_mode_config_helper_resume
+ drm_mode_config_helper_suspend
+ drm_mode_create
+ drm_mode_probed_add
+ drm_mode_vrefresh
+ drm_of_find_possible_crtcs
+ drm_open
+ drm_panel_add
+ drm_panel_detach
+ drm_panel_init
+ drm_panel_remove
+ drm_plane_cleanup
+ drm_plane_create_zpos_immutable_property
+ drm_poll
+ drm_read
+ drm_release
+ drm_universal_plane_init
+ dump_stack
+ __dynamic_dev_dbg
+ __dynamic_pr_debug
+ enable_irq
+ event_triggers_call
+ extcon_get_edev_by_phandle
+ extcon_get_state
+ extcon_register_notifier
+ extcon_set_property_capability
+ extcon_set_property_sync
+ extcon_set_state
+ extcon_set_state_sync
+ extcon_unregister_notifier
+ fd_install
+ filp_close
+ filp_open
+ find_next_bit
+ finish_wait
+ flush_delayed_work
+ flush_work
+ flush_workqueue
+ fput
+ free_irq
+ __free_pages
+ free_pages
+ free_pages_exact
+ free_percpu
+ fwnode_property_present
+ fwnode_property_read_string
+ fwnode_property_read_u32_array
+ generic_handle_irq
+ get_cpu_device
+ __get_free_pages
+ get_unused_fd_flags
+ get_zeroed_page
+ gpiod_direction_input
+ gpiod_direction_output_raw
+ gpiod_get_raw_value
+ gpiod_get_raw_value_cansleep
+ gpiod_get_value
+ gpiod_set_raw_value
+ gpiod_set_raw_value_cansleep
+ gpiod_set_value
+ gpiod_set_value_cansleep
+ gpiod_to_irq
+ gpio_free
+ gpio_request
+ gpio_to_desc
+ handle_level_irq
+ hdmi_audio_infoframe_init
+ hdmi_vendor_infoframe_pack
+ i2c_add_adapter
+ i2c_del_adapter
+ i2c_del_driver
+ i2c_register_driver
+ i2c_transfer
+ i2c_transfer_buffer_flags
+ idr_alloc
+ idr_destroy
+ idr_find
+ idr_remove
+ init_timer_key
+ init_wait_entry
+ __init_waitqueue_head
+ input_allocate_device
+ input_event
+ input_free_device
+ input_mt_init_slots
+ input_mt_report_slot_state
+ input_register_device
+ input_set_abs_params
+ input_set_capability
+ input_unregister_device
+ iomem_resource
+ __ioremap
+ iounmap
+ irq_domain_remove
+ irq_find_mapping
+ irq_modify_status
+ irq_set_chained_handler_and_data
+ irq_set_irq_wake
+ jiffies
+ jiffies_to_msecs
+ kasprintf
+ kernel_read
+ kernel_write
+ kfree
+ kimage_vaddr
+ kimage_voffset
+ __kmalloc
+ kmalloc_caches
+ kmalloc_order_trace
+ kmem_cache_alloc_trace
+ kobject_create_and_add
+ kobject_put
+ kobject_uevent_env
+ kstrtoint
+ kstrtoll
+ kstrtouint
+ kstrtoull
+ kthread_create_on_node
+ kthread_should_stop
+ kthread_stop
+ ktime_get
+ ktime_get_mono_fast_ns
+ ktime_get_real_ts64
+ ktime_get_ts64
+ ktime_get_with_offset
+ __list_add_valid
+ __list_del_entry_valid
+ media_create_pad_link
+ media_entity_pads_init
+ media_entity_remote_pad
+ memcpy
+ memset
+ __memset_io
+ mipi_dsi_attach
+ mipi_dsi_detach
+ mipi_dsi_driver_register_full
+ mipi_dsi_driver_unregister
+ misc_deregister
+ misc_register
+ mod_delayed_work_on
+ mod_timer
+ module_layout
+ module_put
+ __msecs_to_jiffies
+ msleep
+ __mutex_init
+ mutex_is_locked
+ mutex_lock
+ mutex_lock_interruptible
+ mutex_trylock
+ mutex_unlock
+ noop_llseek
+ nr_cpu_ids
+ of_address_to_resource
+ of_alias_get_id
+ of_clk_add_provider
+ of_clk_get_by_name
+ of_clk_src_onecell_get
+ of_device_get_match_data
+ of_device_is_available
+ of_device_is_compatible
+ of_find_backlight_by_node
+ of_find_compatible_node
+ of_find_device_by_node
+ of_find_i2c_device_by_node
+ of_find_matching_node_and_match
+ of_find_node_by_name
+ of_find_property
+ of_fwnode_ops
+ of_get_child_by_name
+ of_get_named_gpio_flags
+ of_get_next_available_child
+ of_get_next_child
+ of_get_parent
+ of_get_property
+ of_graph_get_next_endpoint
+ of_graph_get_port_by_id
+ of_graph_get_remote_port_parent
+ of_iomap
+ of_irq_get
+ of_machine_is_compatible
+ of_match_device
+ of_match_node
+ of_node_name_eq
+ of_parse_phandle
+ of_parse_phandle_with_args
+ of_phy_simple_xlate
+ of_platform_depopulate
+ of_platform_populate
+ of_property_count_elems_of_size
+ of_property_read_string
+ of_property_read_string_helper
+ of_property_read_u32_index
+ of_property_read_variable_u32_array
+ of_reserved_mem_device_init_by_idx
+ of_reset_control_array_get
+ param_ops_bool
+ param_ops_charp
+ param_ops_int
+ param_ops_uint
+ param_ops_ullong
+ __per_cpu_offset
+ perf_trace_buf_alloc
+ perf_trace_run_bpf_submit
+ pfn_valid
+ phy_exit
+ phy_init
+ phy_power_off
+ phy_power_on
+ physvirt_offset
+ pinctrl_lookup_state
+ pinctrl_pm_select_default_state
+ pinctrl_pm_select_sleep_state
+ pinctrl_select_state
+ platform_device_add
+ platform_device_add_data
+ platform_device_add_properties
+ platform_device_add_resources
+ platform_device_alloc
+ platform_device_put
+ platform_device_register_full
+ platform_device_unregister
+ __platform_driver_register
+ platform_driver_unregister
+ platform_get_irq
+ platform_get_irq_byname
+ platform_get_resource
+ platform_get_resource_byname
+ pm_qos_add_request
+ pm_qos_remove_request
+ __pm_relax
+ pm_relax
+ pm_runtime_allow
+ __pm_runtime_disable
+ pm_runtime_enable
+ pm_runtime_forbid
+ pm_runtime_force_resume
+ pm_runtime_force_suspend
+ __pm_runtime_idle
+ __pm_runtime_resume
+ pm_runtime_set_autosuspend_delay
+ __pm_runtime_set_status
+ __pm_runtime_suspend
+ __pm_runtime_use_autosuspend
+ __pm_stay_awake
+ pm_stay_awake
+ pm_wakeup_dev_event
+ power_supply_changed
+ power_supply_get_drvdata
+ power_supply_register
+ power_supply_unregister
+ preempt_schedule
+ preempt_schedule_notrace
+ prepare_to_wait_event
+ print_hex_dump
+ printk
+ proc_create_data
+ proc_mkdir
+ put_device
+ __put_page
+ __put_task_struct
+ queue_delayed_work_on
+ queue_work_on
+ radix_tree_insert
+ ___ratelimit
+ _raw_spin_lock
+ _raw_spin_lock_irq
+ _raw_spin_lock_irqsave
+ _raw_spin_trylock
+ _raw_spin_unlock
+ _raw_spin_unlock_irq
+ _raw_spin_unlock_irqrestore
+ refcount_dec_and_test_checked
+ refcount_inc_checked
+ regcache_cache_only
+ regcache_mark_dirty
+ regcache_sync
+ __register_chrdev
+ register_pm_notifier
+ __register_rpmsg_driver
+ register_virtio_device
+ register_virtio_driver
+ regmap_attach_dev
+ regmap_raw_read
+ regmap_raw_write
+ regmap_read
+ regmap_update_bits_base
+ regmap_write
+ regulator_disable
+ regulator_enable
+ release_firmware
+ __release_region
+ remap_pfn_range
+ remove_proc_entry
+ request_firmware
+ request_firmware_nowait
+ __request_region
+ request_threaded_irq
+ reset_control_assert
+ reset_control_deassert
+ rpmsg_send
+ rtc_time64_to_tm
+ schedule
+ schedule_timeout
+ scnprintf
+ seq_printf
+ seq_puts
+ set_user_nice
+ sg_alloc_table
+ sg_free_table
+ sg_init_one
+ sg_init_table
+ sg_next
+ snd_ctl_boolean_mono_info
+ snd_dma_alloc_pages
+ snd_dmaengine_pcm_prepare_slave_config
+ snd_dma_free_pages
+ snd_pcm_format_physical_width
+ snd_pcm_format_width
+ snd_pcm_hw_constraint_integer
+ snd_pcm_hw_constraint_list
+ snd_pcm_lib_ioctl
+ snd_pcm_period_elapsed
+ snd_soc_add_component_controls
+ snd_soc_card_jack_new
+ snd_soc_component_read32
+ snd_soc_component_update_bits
+ snd_soc_component_write
+ snd_soc_dai_set_fmt
+ snd_soc_dai_set_sysclk
+ snd_soc_dai_set_tdm_slot
+ snd_soc_dapm_add_routes
+ snd_soc_dapm_get_volsw
+ snd_soc_dapm_ignore_suspend
+ snd_soc_dapm_new_controls
+ snd_soc_dapm_put_volsw
+ snd_soc_get_enum_double
+ snd_soc_get_volsw
+ snd_soc_info_enum_double
+ snd_soc_info_volsw
+ snd_soc_jack_add_gpios
+ snd_soc_jack_report
+ snd_soc_of_parse_audio_routing
+ snd_soc_of_parse_card_name
+ snd_soc_params_to_bclk
+ snd_soc_pm_ops
+ snd_soc_put_enum_double
+ snd_soc_put_volsw
+ snd_soc_rtdcom_lookup
+ snd_soc_set_runtime_hwparams
+ snprintf
+ sprintf
+ sscanf
+ __stack_chk_fail
+ __stack_chk_guard
+ strcasecmp
+ strcmp
+ strcpy
+ strlcpy
+ strlen
+ strncat
+ strncmp
+ strncpy
+ strsep
+ strstr
+ synchronize_irq
+ syscon_node_to_regmap
+ syscon_regmap_lookup_by_compatible
+ syscon_regmap_lookup_by_phandle
+ sysfs_create_file_ns
+ sysfs_create_group
+ sysfs_remove_file_ns
+ sysfs_remove_group
+ system_freezable_power_efficient_wq
+ system_wq
+ tasklet_init
+ tasklet_kill
+ __tasklet_schedule
+ trace_define_field
+ trace_event_buffer_commit
+ trace_event_buffer_reserve
+ trace_event_ignore_this_pid
+ trace_event_raw_init
+ trace_event_reg
+ trace_handle_return
+ trace_raw_output_prep
+ trace_seq_printf
+ try_module_get
+ __udelay
+ __unregister_chrdev
+ unregister_chrdev_region
+ unregister_virtio_driver
+ up
+ up_write
+ usb_add_hcd
+ usb_disabled
+ usb_hcd_is_primary_hcd
+ usb_put_hcd
+ usb_remove_hcd
+ usleep_range
+ v4l2_async_notifier_add_subdev
+ v4l2_async_notifier_init
+ v4l2_async_notifier_unregister
+ v4l2_ctrl_handler_free
+ v4l2_ctrl_handler_init_class
+ v4l2_ctrl_new_std
+ v4l2_device_register
+ v4l2_device_unregister
+ v4l2_device_unregister_subdev
+ v4l2_subdev_call_wrappers
+ v4l2_subdev_init
+ vabits_actual
+ vb2_buffer_done
+ vb2_dma_contig_memops
+ vb2_ops_wait_finish
+ vb2_ops_wait_prepare
+ vb2_plane_cookie
+ vb2_queue_init
+ vfree
+ video_devdata
+ video_device_release_empty
+ video_ioctl2
+ videomode_from_timing
+ __video_register_device
+ video_unregister_device
+ virtqueue_add_inbuf
+ virtqueue_add_outbuf
+ virtqueue_get_buf
+ virtqueue_get_vring_size
+ virtqueue_kick
+ virtqueue_kick_prepare
+ virtqueue_notify
+ vmalloc
+ vmalloc_to_page
+ vmemmap
+ vring_del_virtqueue
+ vring_interrupt
+ vring_new_virtqueue
+ vsnprintf
+ wait_for_completion
+ wait_for_completion_interruptible
+ wait_for_completion_interruptible_timeout
+ wait_for_completion_timeout
+ __wake_up
+ wake_up_process
+ wakeup_source_register
+ wakeup_source_unregister
+ __warn_printk
+
+# required by bma4xy.ko
+ ns_to_timespec
+
+# required by bq25898_icx_charger.ko
+ devm_regmap_field_alloc
+ devm_regulator_register
+ extcon_get_property
+ freezing_slow_path
+ __refrigerator
+ regmap_field_read
+ regmap_field_update_bits_base
+ system_freezing_cnt
+
+# required by busfreq-imx8mq.ko
+ jiffies_to_usecs
+ register_reboot_notifier
+
+# required by cbtu02043-icx-switch.ko
+ typec_switch_get_drvdata
+ typec_switch_register
+ typec_switch_unregister
+
+# required by cdns_mhdp_drmcore.ko
+ drm_atomic_get_crtc_state
+ drm_dbg
+ drm_default_rgb_quant_range
+ drm_dev_dbg
+ drm_do_get_edid
+ drm_dp_aux_register
+ drm_dp_aux_unregister
+ drm_dp_bw_code_to_link_rate
+ drm_dp_dpcd_read
+ drm_dp_link_rate_to_bw_code
+ drm_hdmi_avi_infoframe_colorspace
+ drm_hdmi_avi_infoframe_quant_range
+ drm_hdmi_infoframe_set_hdr_metadata
+ drm_mode_create_hdmi_colorspace_property
+ drm_mode_is_420_also
+ drm_mode_is_420_only
+ drm_object_attach_property
+ hdmi_audio_infoframe_pack
+ hdmi_avi_infoframe_check
+ hdmi_avi_infoframe_pack
+ hdmi_drm_infoframe_pack
+
+# required by clk-imx8mp.ko
+ clk_hw_register_divider
+ clk_hw_register_fixed_factor
+ clk_hw_register_gate
+ clk_hw_register_mux
+
+# required by cpufreq-dt.ko
+ arch_set_freq_scale
+ cpufreq_enable_boost_support
+ cpufreq_freq_attr_scaling_available_freqs
+ cpufreq_freq_attr_scaling_boost_freqs
+ cpufreq_generic_frequency_table_verify
+ cpufreq_generic_get
+ cpufreq_generic_suspend
+ cpufreq_register_driver
+ cpufreq_unregister_driver
+ dev_pm_opp_free_cpufreq_table
+ dev_pm_opp_get_max_transition_latency
+ dev_pm_opp_get_opp_count
+ dev_pm_opp_get_sharing_cpus
+ dev_pm_opp_get_suspend_opp_freq
+ dev_pm_opp_init_cpufreq_table
+ dev_pm_opp_of_cpumask_add_table
+ dev_pm_opp_of_cpumask_remove_table
+ dev_pm_opp_of_get_sharing_cpus
+ dev_pm_opp_of_register_em
+ dev_pm_opp_put_regulators
+ dev_pm_opp_set_rate
+ dev_pm_opp_set_regulators
+ dev_pm_opp_set_sharing_cpus
+ policy_has_boost_freq
+ regulator_get_optional
+ regulator_put
+
+# required by cqhci.ko
+ dmam_alloc_attrs
+ dmam_free_coherent
+ mmc_cqe_request_done
+
+# required by cyttsp5.ko
+ kobject_del
+ mod_timer_pending
+
+# required by cyttsp5_device_access.ko
+ device_remove_bin_file
+ krealloc
+ simple_read_from_buffer
+
+# required by device_cooling.ko
+ blocking_notifier_chain_register
+ blocking_notifier_chain_unregister
+ thermal_cooling_device_unregister
+ thermal_of_cooling_device_register
+
+# required by dw-hdmi-cec.ko
+ cec_allocate_adapter
+ cec_delete_adapter
+ cec_notifier_cec_adap_register
+ cec_notifier_cec_adap_unregister
+ cec_received_msg_ts
+ cec_register_adapter
+ cec_transmit_attempt_done_ts
+ cec_unregister_adapter
+ devm_remove_action
+
+# required by dw-hdmi.ko
+ cec_fill_conn_info_from_drm
+ cec_notifier_conn_register
+ cec_notifier_conn_unregister
+ cec_notifier_set_phys_addr
+ cec_notifier_set_phys_addr_from_edid
+ drm_connector_init_with_ddc
+ drm_detect_monitor_audio
+ drm_scdc_read
+ drm_scdc_set_high_tmds_clock_ratio
+ drm_scdc_set_scrambling
+ drm_scdc_write
+ i2c_put_adapter
+ of_get_i2c_adapter_by_node
+
+# required by dw_hdmi-imx.ko
+ devm_kmemdup
+ devm_phy_optional_get
+ drm_of_encoder_active_endpoint
+
+# required by dwc3.ko
+ bpf_trace_run4
+ clk_bulk_disable
+ device_property_read_string
+ device_property_read_u8_array
+ devm_clk_bulk_get_all
+ devm_reset_control_array_get
+ extcon_find_edev_by_node
+ extcon_get_extcon_dev
+ of_graph_get_remote_node
+ of_usb_get_phy_mode
+ of_usb_update_otg_caps
+ phy_pm_runtime_get_sync
+ phy_pm_runtime_put_sync
+ phy_set_mode_ext
+ platform_get_irq_byname_optional
+ system_freezable_wq
+ usb_add_gadget_udc
+ usb_decode_ctrl
+ usb_del_gadget_udc
+ usb_ep_set_maxpacket_limit
+ usb_gadget_giveback_request
+ usb_gadget_map_request_by_dev
+ usb_gadget_set_state
+ usb_gadget_udc_reset
+ usb_gadget_unmap_request_by_dev
+ usb_get_dr_mode
+ usb_get_maximum_speed
+ usb_phy_set_charger_current
+ usb_role_switch_register
+ usb_role_switch_unregister
+
+# required by fsl-imx-ldb.ko
+ devm_drm_panel_bridge_add
+ drm_of_find_panel_or_bridge
+
+# required by fsl_imx8_ddr_perf.ko
+ bitmap_print_to_pagebuf
+ cpumask_any_but
+ ida_alloc_range
+ ida_free
+ irq_set_affinity_hint
+ kernel_kobj
+ perf_pmu_migrate_context
+ perf_pmu_register
+ perf_pmu_unregister
+
+# required by fusb251.ko
+ kstrtobool
+
+# required by fusb307_icx.ko
+ device_get_named_child_node
+
+# required by galcore.ko
+ anon_inode_getfd
+ cache_line_size
+ dev_pm_opp_add
+ dev_pm_opp_remove
+ dma_buf_export
+ dma_buf_fd
+ dma_direct_sync_single_for_cpu
+ dma_direct_sync_single_for_device
+ dma_fence_array_ops
+ dma_fence_context_alloc
+ dma_fence_default_wait
+ dma_fence_init
+ dma_fence_release
+ dma_fence_signal
+ dma_fence_signal_locked
+ dma_fence_wait_timeout
+ down_read
+ down_trylock
+ driver_create_file
+ driver_remove_file
+ drm_gem_handle_create
+ drm_gem_object_lookup
+ drm_gem_object_put_unlocked
+ drm_gem_object_release
+ drm_gem_private_object_init
+ find_vma
+ find_vpid
+ get_user_pages
+ hrtimer_resolution
+ idr_preload
+ iommu_attach_device
+ iommu_domain_alloc
+ iommu_domain_free
+ iommu_map
+ iommu_set_fault_handler
+ iommu_unmap
+ kstrtoint_from_user
+ no_llseek
+ param_array_ops
+ param_ops_ulong
+ pid_task
+ platform_bus_type
+ __rcu_read_lock
+ __rcu_read_unlock
+ reset_control_reset
+ schedule_hrtimeout
+ sg_alloc_table_from_pages
+ si_meminfo
+ sync_file_create
+ sync_file_get_fence
+ __task_pid_nr_ns
+ _totalram_pages
+ up_read
+ vmap
+ vm_mmap
+ vm_munmap
+ vunmap
+
+# required by gpio-mxc.ko
+ devm_gpiochip_add_data
+ __devm_irq_alloc_descs
+ devm_irq_alloc_generic_chip
+ devm_irq_setup_generic_chip
+ gpiochip_generic_free
+ gpiochip_generic_request
+ gpiochip_get_data
+ gpiochip_lock_as_irq
+ gpiochip_unlock_as_irq
+ irq_domain_add_legacy
+ irq_domain_simple_ops
+ irq_gc_ack_set_bit
+ irq_gc_mask_clr_bit
+ irq_gc_mask_set_bit
+ __irq_set_handler
+ platform_irq_count
+ register_syscore_ops
+
+# required by hold_switch.ko
+ devm_request_any_context_irq
+ gpiod_get_value_cansleep
+ gpiod_set_debounce
+
+# required by i2c-imx.ko
+ clk_notifier_register
+ clk_notifier_unregister
+ i2c_add_numbered_adapter
+ i2c_generic_scl_recovery
+ i2c_recover_bus
+
+# required by icx_nvp_emmc.ko
+ blkdev_get_by_path
+ blkdev_put
+ vfs_fsync
+
+# required by imx-audiomix.ko
+ devm_of_platform_populate
+
+# required by imx-cpufreq-dt.ko
+ dev_pm_opp_put_supported_hw
+ dev_pm_opp_set_supported_hw
+ nvmem_cell_read_u32
+
+# required by imx-i2s-rpmsg.ko
+ unregister_rpmsg_driver
+
+# required by imx-lcdif-crtc.ko
+ drm_property_destroy
+
+# required by imx-lcdifv3-crtc.ko
+ drm_mode_equal
+ drm_mode_find_dmt
+
+# required by imx-mailbox.ko
+ devm_mbox_controller_register
+ mbox_chan_received_data
+ mbox_chan_txdone
+
+# required by imx-pcm-dma-common.ko
+ snd_dmaengine_pcm_close_release_chan
+ snd_dmaengine_pcm_get_chan
+ snd_dmaengine_pcm_open
+ snd_dmaengine_pcm_open_request_chan
+ snd_dmaengine_pcm_pointer
+ snd_dmaengine_pcm_set_config_from_dai_data
+ snd_dmaengine_pcm_trigger
+ snd_hwparams_to_dma_slave_config
+
+# required by imx-pcm-rpmsg.ko
+ snd_soc_lookup_component
+
+# required by imx-sdma.ko
+ dma_async_device_register
+ dma_async_device_unregister
+ dma_async_tx_descriptor_init
+ gen_pool_dma_alloc
+ gen_pool_free_owner
+ of_dma_controller_register
+ of_gen_pool_get
+ vchan_dma_desc_free_list
+ vchan_find_desc
+ vchan_init
+ vchan_tx_desc_free
+ vchan_tx_submit
+
+# required by imx.ko
+ device_find_child
+ do_SAK
+ handle_sysrq
+ mctrl_gpio_disable_ms
+ mctrl_gpio_enable_ms
+ mctrl_gpio_get
+ mctrl_gpio_init
+ mctrl_gpio_set
+ oops_in_progress
+ platform_get_irq_optional
+ rational_best_approximation
+ tty_flip_buffer_push
+ __tty_insert_flip_char
+ tty_insert_flip_string_fixed_flag
+ tty_termios_encode_baud_rate
+ uart_add_one_port
+ uart_console_device
+ uart_console_write
+ uart_get_baud_rate
+ uart_get_divisor
+ uart_get_rs485_mode
+ uart_handle_cts_change
+ uart_handle_dcd_change
+ uart_parse_options
+ uart_register_driver
+ uart_remove_one_port
+ uart_resume_port
+ uart_set_options
+ uart_suspend_port
+ uart_unregister_driver
+ uart_update_timeout
+ uart_write_wakeup
+
+# required by imx2_wdt.ko
+ _dev_crit
+ __platform_driver_probe
+ watchdog_init_timeout
+ watchdog_register_device
+ watchdog_set_restart_priority
+ watchdog_unregister_device
+
+# required by imx8-capture.ko
+ soc_device_match
+
+# required by imx8-isi-cap.ko
+ media_graph_walk_cleanup
+ media_graph_walk_init
+ media_graph_walk_next
+ media_graph_walk_start
+ v4l2_fh_open
+ v4l2_g_parm_cap
+ v4l2_s_parm_cap
+ vb2_fop_mmap
+ vb2_fop_poll
+ _vb2_fop_release
+ vb2_ioctl_create_bufs
+ vb2_ioctl_dqbuf
+ vb2_ioctl_expbuf
+ vb2_ioctl_prepare_buf
+ vb2_ioctl_qbuf
+ vb2_ioctl_querybuf
+ vb2_ioctl_reqbufs
+ vb2_ioctl_streamoff
+ vb2_ioctl_streamon
+
+# required by imx8-isi-m2m.ko
+ v4l2_fh_add
+ v4l2_fh_del
+ v4l2_fh_exit
+ v4l2_fh_init
+
+# required by imx8-media-dev.ko
+ media_device_cleanup
+ media_device_init
+ __media_device_register
+ media_device_unregister
+ v4l2_async_notifier_register
+ v4l2_device_register_subdev
+ v4l2_device_register_subdev_nodes
+
+# required by imx8-mipi-csi2-sam.ko
+ regulator_set_voltage
+
+# required by imx8m_pm_domains.ko
+ of_clk_get
+ of_genpd_add_provider_simple
+ of_genpd_add_subdomain
+ of_genpd_del_provider
+ pm_genpd_init
+ pm_genpd_remove
+
+# required by imx8mm_thermal.ko
+ devm_thermal_zone_of_sensor_register
+ of_thermal_get_trip_points
+ thermal_zone_bind_cooling_device
+
+# required by imx8mp-ldb.ko
+ devm_of_phy_get
+
+# required by imx_rpmsg.ko
+ mbox_free_channel
+ mbox_request_channel_byname
+ mbox_send_message
+ of_reserved_mem_device_release
+ vring_transport_features
+
+# required by imxdrm.ko
+ component_bind_all
+ component_master_add_with_match
+ component_master_del
+ component_match_add_release
+ component_unbind_all
+ drm_connector_unregister
+ drm_gem_cma_dumb_create
+ drm_gem_cma_free_object
+ drm_gem_cma_mmap
+ drm_gem_cma_prime_get_sg_table
+ drm_gem_cma_prime_import_sg_table
+ drm_gem_cma_prime_mmap
+ drm_gem_cma_prime_vmap
+ drm_gem_cma_prime_vunmap
+ drm_gem_cma_vm_ops
+ drm_kms_helper_poll_fini
+ drm_kms_helper_poll_init
+ drm_mode_config_cleanup
+ drm_mode_config_init
+ drm_mode_config_reset
+ drm_of_component_match_add
+ drm_vblank_init
+
+# required by incrementalfs.ko
+ bin2hex
+ __break_lease
+ clear_inode
+ __close_fd
+ crc32_le
+ crypto_shash_digest
+ d_add
+ d_drop
+ deactivate_locked_super
+ dentry_open
+ dget_parent
+ d_instantiate
+ d_make_root
+ dput
+ fget
+ flush_dcache_page
+ fs_kobj
+ fsstack_copy_attr_all
+ generic_file_llseek
+ generic_file_mmap
+ generic_file_read_iter
+ generic_file_splice_read
+ generic_read_dir
+ generic_shutdown_super
+ iget5_locked
+ ihold
+ inode_init_once
+ inode_init_owner
+ iput
+ iterate_dir
+ kern_path
+ lockref_get
+ lock_rename
+ lookup_one_len
+ LZ4_decompress_safe
+ match_int
+ match_token
+ notify_change
+ pagecache_get_page
+ path_get
+ path_put
+ __put_cred
+ register_filesystem
+ set_anon_super
+ sget
+ simple_getattr
+ simple_setattr
+ simple_statfs
+ strndup_user
+ sync_filesystem
+ truncate_inode_pages
+ unlock_new_inode
+ unlock_page
+ unlock_rename
+ unregister_filesystem
+ user_path_at_empty
+ vfs_create
+ vfs_fallocate
+ vfs_getattr
+ vfs_getxattr
+ vfs_link
+ vfs_listxattr
+ vfs_mkdir
+ vfs_rename
+ vfs_rmdir
+ vfs_setxattr
+ vfs_unlink
+
+# required by ion_cma_heap.ko
+ cma_alloc
+ cma_for_each_area
+ cma_get_name
+ cma_release
+ ion_buffer_prep_noncached
+ __ion_device_add_heap
+ ion_device_remove_heap
+
+# required by ion_imx.ko
+ device_initialize
+
+# required by irq-imx-irqsteer.ko
+ __irq_domain_add
+ irq_domain_xlate_onecell
+ irq_of_parse_and_map
+ irq_set_chip_and_handler_name
+ irq_set_chip_data
+
+# required by lc709204_icx.ko
+ crc8
+ crc8_populate_msb
+ memchr
+ of_prop_next_u32
+
+# required by lm3630a_bl_icx.ko
+ device_get_next_child_node
+ devm_backlight_device_register
+ devm_pwm_get
+ pwm_apply_state
+
+# required by lpa_ctrl.ko
+ sysfs_create_groups
+
+# required by mxc-clk.ko
+ __clk_determine_rate
+ clk_divider_ops
+ clk_fractional_divider_ops
+ __clk_get_hw
+ clk_hw_get_name
+ clk_hw_get_parent_by_index
+ clk_hw_is_enabled
+ clk_hw_register
+ clk_hw_register_composite
+ clk_mux_ops
+ clk_unregister
+ divider_get_val
+ divider_recalc_rate
+ of_clk_get_from_provider
+ of_find_node_opts_by_path
+
+# required by nvmem-imx-ocotp.ko
+ devm_nvmem_register
+
+# required by panel-simple.ko
+ drm_mode_duplicate
+ drm_mode_set_name
+ of_find_i2c_adapter_by_node
+ of_get_display_timing
+
+# required by panel-sitronix-st7703.ko
+ mipi_dsi_dcs_enter_sleep_mode
+ mipi_dsi_dcs_exit_sleep_mode
+ mipi_dsi_dcs_read
+ mipi_dsi_dcs_set_display_off
+ mipi_dsi_dcs_set_display_on
+ mipi_dsi_dcs_set_tear_on
+ mipi_dsi_generic_write
+ mipi_dsi_set_maximum_return_packet_size
+
+# required by pca9450-regulator.ko
+ of_regulator_match
+ rdev_get_drvdata
+ regulator_disable_regmap
+ regulator_enable_regmap
+ regulator_get_voltage_sel_regmap
+ regulator_is_enabled_regmap
+ regulator_list_voltage_linear
+ regulator_list_voltage_linear_range
+ regulator_map_voltage_iterate
+ regulator_register
+ regulator_set_voltage_sel_regmap
+ regulator_set_voltage_time_sel
+ regulator_unregister
+
+# required by pca9450.ko
+ mfd_add_devices
+ mfd_remove_devices
+ regmap_add_irq_chip
+ regmap_del_irq_chip
+ regmap_irq_get_domain
+
+# required by pci-imx6.ko
+ dw_pcie_ep_init
+ dw_pcie_ep_raise_legacy_irq
+ dw_pcie_ep_raise_msi_irq
+ dw_pcie_ep_raise_msix_irq
+ dw_pcie_ep_reset_bar
+ dw_pcie_host_init
+ dw_pcie_link_up
+ dw_pcie_msi_init
+ dw_pcie_read_dbi
+ dw_pcie_setup_rc
+ dw_pcie_wait_for_link
+ dw_pcie_write_dbi
+ pci_msi_enabled
+ phy_calibrate
+ regulator_is_enabled
+
+# required by phy-fsl-imx8mq-usb.ko
+ power_supply_get_by_phandle
+ power_supply_get_property
+ power_supply_put
+ power_supply_reg_notifier
+ power_supply_unreg_notifier
+
+# required by phy-generic-icx.ko
+ gpiod_direction_output
+ regulator_set_current_limit
+ usb_add_phy_dev
+ usb_remove_phy
+
+# required by pinctrl-imx.ko
+ devm_pinctrl_register_and_init
+ pinconf_generic_parse_dt_config
+ pinctrl_dev_get_drvdata
+ pinctrl_enable
+ pinctrl_force_default
+ pinctrl_force_sleep
+ pinctrl_generic_get_group
+ pinctrl_generic_get_group_count
+ pinctrl_generic_get_group_name
+ pinctrl_generic_get_group_pins
+ pin_get_name
+ pinmux_generic_get_function
+ pinmux_generic_get_function_count
+ pinmux_generic_get_function_groups
+ pinmux_generic_get_function_name
+
+# required by pwm-imx27.ko
+ of_pwm_xlate_with_flags
+ pwmchip_add
+ pwmchip_remove
+
+# required by qca9377_bt_rfkill.ko
+ rfkill_alloc
+ rfkill_destroy
+ rfkill_init_sw_state
+ rfkill_register
+ rfkill_unregister
+
+# required by rtc-snvs.ko
+ devm_rtc_allocate_device
+ __rtc_register_device
+ rtc_tm_to_time64
+ rtc_update_irq
+
+# required by sdhci-esdhc-imx.ko
+ __mmc_claim_host
+ mmc_gpiod_request_cd
+ mmc_gpiod_request_ro
+ mmc_gpio_get_cd
+ mmc_gpio_get_ro
+ mmc_gpio_set_cd_wake
+ mmc_of_parse
+ mmc_of_parse_voltage
+ mmc_release_host
+ mmc_retune_timer_stop
+ mmc_send_tuning
+ sdhci_add_host
+ sdhci_cqe_disable
+ sdhci_cqe_enable
+ sdhci_cqe_irq
+ sdhci_dumpregs
+ sdhci_execute_tuning
+ sdhci_pltfm_free
+ sdhci_pltfm_init
+ sdhci_remove_host
+ sdhci_reset
+ sdhci_resume_host
+ sdhci_runtime_resume_host
+ sdhci_runtime_suspend_host
+ sdhci_suspend_host
+
+# required by sec-dsim.ko
+ bsearch
+ drm_panel_attach
+ drm_panel_disable
+ drm_panel_enable
+ drm_panel_get_modes
+ drm_panel_prepare
+ drm_panel_unprepare
+ mipi_dsi_create_packet
+ mipi_dsi_host_register
+ mipi_dsi_host_unregister
+ of_drm_find_bridge
+ of_drm_find_panel
+
+# required by sec_mipi_dsim-imx.ko
+ reset_control_put
+
+# required by snd-soc-cxd3778gf.ko
+ irq_set_irq_type
+ param_get_int
+ snd_soc_register_component
+ snd_soc_unregister_component
+
+# required by snd-soc-fsl-dsp.ko
+ dev_pm_domain_attach_by_id
+ of_count_phandle_with_args
+ pm_system_wakeup
+ sysfs_streq
+ vfs_llseek
+
+# required by snd-soc-fsl-easrc.ko
+ gcd
+ snd_pcm_format_big_endian
+ snd_pcm_format_linear
+ snd_pcm_format_unsigned
+ snd_soc_component_read
+ snd_soc_dpcm_get_substream
+ snd_soc_info_xr_sx
+
+# required by snd-soc-fsl-micfil.ko
+ snd_soc_get_volsw_sx
+ snd_soc_info_volsw_sx
+ snd_soc_put_volsw_sx
+
+# required by snd-soc-fsl-sai.ko
+ snd_pcm_hw_constraint_step
+ __sw_hweight8
+
+# required by snd-soc-hdmi-codec.ko
+ snd_ctl_add
+ snd_ctl_new1
+ snd_pcm_add_chmap_ctls
+ snd_pcm_create_iec958_consumer_hw_params
+ snd_pcm_hw_constraint_eld
+
+# required by snd-soc-imx-wm8960.ko
+ of_parse_phandle_with_fixed_args
+ snd_soc_dai_set_pll
+ snd_soc_dapm_disable_pin
+ snd_soc_dapm_enable_pin
+
+# required by snd-soc-lif-md6000-rme.ko
+ driver_unregister
+ __spi_register_driver
+ spi_sync
+
+# required by snd-soc-rpmsg-wm8960.ko
+ __devm_regmap_init
+
+# required by snd-soc-simple-card-utils.ko
+ devm_get_clk_from_child
+ devm_kvasprintf
+ snd_soc_dapm_get_pin_switch
+ snd_soc_dapm_info_pin_switch
+ snd_soc_dapm_put_pin_switch
+ snd_soc_of_parse_audio_simple_widgets
+ snd_soc_of_parse_daifmt
+
+# required by snd-soc-simple-card.ko
+ snd_soc_of_get_dai_name
+ snd_soc_of_parse_node_prefix
+ snd_soc_of_parse_tdm_slot
+
+# required by snvs_pwrkey.ko
+ devm_input_allocate_device
+
+# required by soc-imx8m.ko
+ of_root
+ soc_device_register
+
+# required by spi-bitbang.ko
+ get_device
+ spi_finalize_current_transfer
+ spi_register_controller
+ spi_unregister_controller
+
+# required by spi-imx.ko
+ devm_gpio_request
+ sg_last
+ __spi_alloc_controller
+
+# required by tcpm_icx.ko
+ devm_power_supply_register
+ typec_altmode_attention
+ typec_altmode_notify
+ typec_altmode_update_active
+ typec_altmode_vdm
+ typec_find_port_data_role
+ typec_find_port_power_role
+ typec_find_power_role
+ typec_get_drvdata
+ typec_match_altmode
+ typec_partner_register_altmode
+ typec_partner_set_identity
+ typec_port_register_altmode
+ typec_register_partner
+ typec_register_port
+ typec_set_data_role
+ typec_set_mode
+ typec_set_orientation
+ typec_set_pwr_opmode
+ typec_set_pwr_role
+ typec_set_vconn_role
+ typec_unregister_altmode
+ typec_unregister_partner
+ typec_unregister_port
+ usb_role_switch_get
+ usb_role_switch_put
+ usb_role_switch_set_role
+
+# required by timer-imx-sysctr.ko
+ clockevents_config_and_register
+ timer_of_init
+
+# required by touchscreen.ko
+ class_find_device
+ device_register
+ devres_add
+ devres_alloc_node
+ devres_free
+ devres_release
+ dev_set_name
+ __init_rwsem
+
+# required by trusty-arm64-fiq.ko
+ smp_call_function
+ smp_call_function_single
+
+# required by trusty-ipc.ko
+ add_wait_queue
+ _copy_from_iter
+ _copy_to_iter
+ idr_for_each
+ remove_wait_queue
+ strncpy_from_user
+ virtqueue_detach_unused_buf
+ wait_woken
+ woken_wake_function
+
+# required by trusty-irq.ko
+ disable_percpu_irq
+ enable_percpu_irq
+ free_percpu_irq
+ irq_create_of_mapping
+ __request_percpu_irq
+
+# required by trusty-log.ko
+ panic_notifier_list
+
+# required by trusty-virtio.ko
+ unregister_virtio_device
+
+# required by ttynull.ko
+ put_tty_driver
+ register_console
+ __tty_alloc_driver
+ tty_port_close
+ tty_port_destroy
+ tty_port_hangup
+ tty_port_init
+ tty_port_link_device
+ tty_port_open
+ tty_register_driver
+ tty_set_operations
+ tty_std_termios
+ tty_unregister_driver
+ unregister_console
+
+# required by v4l2-fwnode.ko
+ fwnode_device_is_available
+ fwnode_get_next_parent
+ fwnode_get_parent
+ fwnode_graph_get_next_endpoint
+ fwnode_graph_get_port_parent
+ fwnode_graph_get_remote_endpoint
+ fwnode_graph_get_remote_port_parent
+ fwnode_graph_parse_endpoint
+ fwnode_handle_put
+ fwnode_property_get_reference_args
+ fwnode_property_read_u64_array
+ v4l2_async_notifier_add_fwnode_subdev
+ v4l2_async_notifier_cleanup
+ v4l2_async_register_subdev
+ v4l2_async_subdev_notifier_register
+
+# required by v4l2-mem2mem.ko
+ media_create_intf_link
+ media_device_register_entity
+ media_device_unregister_entity
+ media_devnode_create
+ media_devnode_remove
+ media_entity_remove_links
+ media_remove_intf_links
+ v4l2_event_pending
+ vb2_create_bufs
+ vb2_dqbuf
+ vb2_expbuf
+ vb2_mmap
+ vb2_prepare_buf
+ vb2_qbuf
+ vb2_querybuf
+ vb2_queue_release
+ vb2_reqbufs
+ vb2_request_object_is_buffer
+ vb2_streamoff
+ vb2_streamon
+
+# required by virtio_rpmsg_bus.ko
+ rpmsg_find_device
+ rpmsg_register_device
+ rpmsg_sendto
+ rpmsg_unregister_device
+ virtio_check_driver_offered_feature
+ virtqueue_disable_cb
+ virtqueue_enable_cb
+
+# required by wlan.ko
+ alloc_netdev_mqs
+ __alloc_skb
+ capable
+ __cfg80211_alloc_event_skb
+ __cfg80211_alloc_reply_skb
+ cfg80211_assoc_timeout
+ cfg80211_calculate_bitrate
+ cfg80211_chandef_create
+ cfg80211_ch_switch_notify
+ cfg80211_connect_done
+ cfg80211_del_sta_sinfo
+ cfg80211_disconnected
+ cfg80211_external_auth_request
+ cfg80211_ft_event
+ cfg80211_get_bss
+ cfg80211_gtk_rekey_notify
+ cfg80211_ibss_joined
+ cfg80211_inform_bss_frame_data
+ cfg80211_mgmt_tx_status
+ cfg80211_michael_mic_failure
+ cfg80211_new_sta
+ cfg80211_pmksa_candidate_notify
+ cfg80211_put_bss
+ cfg80211_ready_on_channel
+ cfg80211_remain_on_channel_expired
+ cfg80211_roamed
+ cfg80211_rx_mgmt
+ cfg80211_rx_unprot_mlme_mgmt
+ cfg80211_scan_done
+ cfg80211_sched_scan_results
+ __cfg80211_send_event_skb
+ cfg80211_tdls_oper_request
+ cfg80211_unlink_bss
+ cfg80211_vendor_cmd_reply
+ complete_and_exit
+ consume_skb
+ cpu_topology
+ crypto_ahash_digest
+ crypto_ahash_setkey
+ crypto_alloc_ahash
+ crypto_alloc_base
+ crypto_alloc_skcipher
+ crypto_shash_final
+ crypto_shash_setkey
+ crypto_shash_update
+ crypto_skcipher_decrypt
+ crypto_skcipher_encrypt
+ _ctype
+ dev_alloc_name
+ __dev_kfree_skb_any
+ ether_setup
+ eth_type_trans
+ free_netdev
+ freq_reg_info
+ get_random_bytes
+ hex2bin
+ hex_dump_to_buffer
+ hrtimer_cancel
+ hrtimer_init
+ hrtimer_start_range_ns
+ ieee80211_channel_to_freq_khz
+ ieee80211_freq_khz_to_channel
+ ieee80211_get_channel_khz
+ ieee80211_hdrlen
+ init_net
+ __ipv6_addr_type
+ iwe_stream_add_event
+ iwe_stream_add_point
+ iwe_stream_add_value
+ kfree_skb
+ kmemdup
+ kobject_uevent
+ kstrdup
+ kstrtos8
+ kstrtou16
+ kstrtou8
+ kzfree
+ __local_bh_enable_ip
+ mac_pton
+ memcmp
+ memmove
+ mmc_detect_change
+ mmc_set_data_timeout
+ mmc_wait_for_cmd
+ mmc_wait_for_req
+ msleep_interruptible
+ __netdev_alloc_skb
+ netif_carrier_off
+ netif_carrier_on
+ netif_rx
+ netif_rx_ni
+ netif_tx_stop_all_queues
+ netif_tx_wake_queue
+ netlink_broadcast
+ __netlink_kernel_create
+ netlink_kernel_release
+ netlink_unicast
+ nla_memcpy
+ __nla_parse
+ nla_put_64bit
+ nla_put
+ nla_strlcpy
+ __nlmsg_put
+ panic
+ param_get_string
+ param_set_copystring
+ PDE_DATA
+ pm_wakeup_ws_event
+ proc_dointvec
+ pskb_expand_head
+ _raw_read_lock_bh
+ _raw_read_unlock_bh
+ _raw_spin_lock_bh
+ _raw_spin_unlock_bh
+ register_inet6addr_notifier
+ register_inetaddr_notifier
+ register_netdev
+ register_netdevice
+ register_netdevice_notifier
+ register_sysctl_table
+ regulatory_hint
+ rtnl_lock
+ rtnl_unlock
+ sched_setscheduler
+ schedule_timeout_interruptible
+ sdio_claim_host
+ sdio_claim_irq
+ sdio_disable_func
+ sdio_enable_func
+ sdio_get_host_pm_caps
+ sdio_memcpy_fromio
+ sdio_memcpy_toio
+ sdio_readsb
+ sdio_register_driver
+ sdio_release_host
+ sdio_release_irq
+ sdio_set_block_size
+ sdio_set_host_pm_flags
+ sdio_unregister_driver
+ sdio_writesb
+ set_cpus_allowed_ptr
+ skb_clone
+ skb_copy
+ skb_copy_bits
+ skb_pull
+ skb_push
+ skb_put
+ skb_queue_purge
+ skb_trim
+ strchr
+ strchrnul
+ strncasecmp
+ strnchr
+ strnstr
+ __sw_hweight64
+ sys_tz
+ unregister_inet6addr_notifier
+ unregister_inetaddr_notifier
+ unregister_netdev
+ unregister_netdevice_notifier
+ unregister_netdevice_queue
+ unregister_sysctl_table
+ __usecs_to_jiffies
+ wiphy_apply_custom_regulatory
+ wiphy_free
+ wiphy_new_nm
+ wiphy_register
+ wiphy_unregister
+ wireless_send_event
+
+# required by xhci-hcd.ko
+ dma_pool_alloc
+ dma_pool_create
+ dma_pool_destroy
+ dma_pool_free
+ __num_online_cpus
+ pci_alloc_irq_vectors_affinity
+ pci_free_irq_vectors
+ pci_irq_vector
+ radix_tree_delete
+ radix_tree_lookup
+ radix_tree_maybe_preload
+ schedule_timeout_uninterruptible
+ sg_pcopy_from_buffer
+ sg_pcopy_to_buffer
+ __sw_hweight32
+ trace_print_symbols_seq
+ usb_amd_dev_put
+ usb_amd_pt_check_port
+ usb_amd_quirk_pll_disable
+ usb_amd_quirk_pll_enable
+ usb_asmedia_modifyflowcontrol
+ usb_disable_xhci_ports
+ usb_hcd_check_unlink_urb
+ usb_hcd_end_port_resume
+ usb_hcd_giveback_urb
+ usb_hc_died
+ usb_hcd_irq
+ usb_hcd_link_urb_to_ep
+ usb_hcd_map_urb_for_dma
+ usb_hcd_poll_rh_status
+ usb_hcd_resume_root_hub
+ usb_hcd_start_port_resume
+ usb_hcd_unlink_urb_from_ep
+ usb_hub_clear_tt_buffer
+ usb_root_hub_lost_power
+ usb_wakeup_notification
+
+# required by xhci-pci.ko
+ pci_d3cold_disable
+ pci_read_config_byte
+ __pci_register_driver
+ pci_set_mwi
+ pci_set_power_state
+ pci_unregister_driver
+ usb_amd_quirk_pll_check
+ usb_create_shared_hcd
+ usb_enable_intel_xhci_ports
+ usb_hcd_pci_pm_ops
+ usb_hcd_pci_probe
+ usb_hcd_pci_remove
+ usb_hcd_pci_shutdown
+
+# required by xhci-plat-hcd.ko
+ of_usb_host_tpl_support
+ pci_bus_type
+ __usb_create_hcd
+ usb_hcd_platform_shutdown
diff --git a/arch/arm64/configs/vendor/holi_GKI.config b/arch/arm64/configs/vendor/holi_GKI.config
index 4c2a7b55c0c3..8583022f8f88 100644
--- a/arch/arm64/configs/vendor/holi_GKI.config
+++ b/arch/arm64/configs/vendor/holi_GKI.config
@@ -240,3 +240,4 @@ CONFIG_SM_GPUCC_BLAIR=m
CONFIG_SM_DISPCC_BLAIR=m
CONFIG_SM_DEBUGCC_BLAIR=m
CONFIG_QCOM_CX_IPEAK=m
+CONFIG_LEDS_AW2016=m
diff --git a/arch/arm64/configs/vendor/holi_QGKI.config b/arch/arm64/configs/vendor/holi_QGKI.config
index 0215d654e38c..2c659afc8649 100644
--- a/arch/arm64/configs/vendor/holi_QGKI.config
+++ b/arch/arm64/configs/vendor/holi_QGKI.config
@@ -197,3 +197,4 @@ CONFIG_SYN_COOKIES=y
CONFIG_PANIC_TIMEOUT=5
CONFIG_CRYPTO_SHA1_ARM64_CE=y
CONFIG_QTI_CX_IPEAK_COOLING_DEVICE=y
+CONFIG_TLB_CONF_HANDLER=y
diff --git a/build.config.gki.aarch64 b/build.config.gki.aarch64
index 210264370e9b..32fbb3b18ae1 100644
--- a/build.config.gki.aarch64
+++ b/build.config.gki.aarch64
@@ -17,6 +17,7 @@ android/abi_gki_aarch64_oneplus
android/abi_gki_aarch64_oplus
android/abi_gki_aarch64_qcom
android/abi_gki_aarch64_sony
+android/abi_gki_aarch64_sonywalkman
android/abi_gki_aarch64_sunxi
android/abi_gki_aarch64_unisoc
android/abi_gki_aarch64_vivo
diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c
index 45a525d402d0..8c3103eb30a2 100644
--- a/drivers/char/adsprpc.c
+++ b/drivers/char/adsprpc.c
@@ -645,6 +645,8 @@ struct fastrpc_file {
struct completion work;
/* Flag to indicate ram dump collection status*/
bool is_ramdump_pend;
+ /* Flag to indicate dynamic process creation status*/
+ bool in_process_create;
};
static struct fastrpc_apps gfa;
@@ -3658,6 +3660,15 @@ static int fastrpc_init_create_dynamic_process(struct fastrpc_file *fl,
int siglen;
} inbuf;
+ spin_lock(&fl->hlock);
+ if (fl->in_process_create) {
+ err = -EALREADY;
+ ADSPRPC_ERR("Already in create dynamic process\n");
+ spin_unlock(&fl->hlock);
+ return err;
+ }
+ fl->in_process_create = true;
+ spin_unlock(&fl->hlock);
inbuf.pgid = fl->tgid;
inbuf.namelen = strlen(current->comm) + 1;
inbuf.filelen = init->filelen;
@@ -3824,6 +3835,9 @@ bail:
locked = 0;
}
}
+ spin_lock(&fl->hlock);
+ fl->in_process_create = false;
+ spin_unlock(&fl->hlock);
return err;
}
@@ -5187,6 +5201,7 @@ skip_dump_wait:
spin_lock(&fl->apps->hlock);
hlist_del_init(&fl->hn);
fl->is_ramdump_pend = false;
+ fl->in_process_create = false;
spin_unlock(&fl->apps->hlock);
kfree(fl->debug_buf);
kfree(fl->gidlist.gids);
@@ -5594,6 +5609,7 @@ static int fastrpc_device_open(struct inode *inode, struct file *filp)
fl->qos_request = 0;
fl->dsp_proc_init = 0;
fl->is_ramdump_pend = false;
+ fl->in_process_create = false;
init_completion(&fl->work);
fl->file_close = FASTRPC_PROCESS_DEFAULT_STATE;
filp->private_data = fl;
diff --git a/drivers/clk/qcom/clk-rcg2.c b/drivers/clk/qcom/clk-rcg2.c
index d1148af5eeb2..88a19aa5115f 100644
--- a/drivers/clk/qcom/clk-rcg2.c
+++ b/drivers/clk/qcom/clk-rcg2.c
@@ -359,7 +359,7 @@ static int _freq_tbl_determine_rate(struct clk_hw *hw, const struct freq_tbl *f,
rate = clk_hw_get_rate(p);
}
req->best_parent_hw = p;
- req->best_parent_rate = rate;
+ req->best_parent_rate = clk_hw_round_rate(p, rate);
req->rate = f->freq;
if (f->src_freq != FIXED_FREQ_SRC) {
diff --git a/drivers/clk/qcom/gcc-shima.c b/drivers/clk/qcom/gcc-shima.c
index a7ec684209ba..b2b71d5e2e02 100644
--- a/drivers/clk/qcom/gcc-shima.c
+++ b/drivers/clk/qcom/gcc-shima.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
*/
#include
@@ -1099,7 +1099,7 @@ static struct clk_rcg2 gcc_sdcc1_apps_clk_src = {
.name = "gcc_sdcc1_apps_clk_src",
.parent_data = gcc_parent_data_7,
.num_parents = 6,
- .ops = &clk_rcg2_ops,
+ .ops = &clk_rcg2_floor_ops,
},
.clkr.vdd_data = {
.vdd_class = &vdd_cx,
@@ -1128,7 +1128,7 @@ static struct clk_rcg2 gcc_sdcc1_ice_core_clk_src = {
.name = "gcc_sdcc1_ice_core_clk_src",
.parent_data = gcc_parent_data_1,
.num_parents = 5,
- .ops = &clk_rcg2_ops,
+ .ops = &clk_rcg2_floor_ops,
},
.clkr.vdd_data = {
.vdd_class = &vdd_cx,
@@ -1161,7 +1161,7 @@ static struct clk_rcg2 gcc_sdcc2_apps_clk_src = {
.name = "gcc_sdcc2_apps_clk_src",
.parent_data = gcc_parent_data_8,
.num_parents = 7,
- .ops = &clk_rcg2_ops,
+ .ops = &clk_rcg2_floor_ops,
},
.clkr.vdd_data = {
.vdd_class = &vdd_cx,
@@ -1192,7 +1192,7 @@ static struct clk_rcg2 gcc_sdcc4_apps_clk_src = {
.name = "gcc_sdcc4_apps_clk_src",
.parent_data = gcc_parent_data_1,
.num_parents = 5,
- .ops = &clk_rcg2_ops,
+ .ops = &clk_rcg2_floor_ops,
},
.clkr.vdd_data = {
.vdd_class = &vdd_cx,
diff --git a/drivers/gpu/msm/adreno_a6xx_snapshot.c b/drivers/gpu/msm/adreno_a6xx_snapshot.c
index d2e82c0c114f..2fc9142aad10 100644
--- a/drivers/gpu/msm/adreno_a6xx_snapshot.c
+++ b/drivers/gpu/msm/adreno_a6xx_snapshot.c
@@ -254,6 +254,11 @@ a6xx_vbif_snapshot_registers[] = {
ARRAY_SIZE(a6xx_vbif_ver_20xxxxxx_registers)/2},
};
+static const unsigned int a6xx_cx_misc_registers[] = {
+ /* CX_MISC */
+ 0, 0, 10, 14, 20, 24, 0x30, 0x49,
+};
+
/*
* Set of registers to dump for A6XX on snapshot.
* Registers in pairs - first value is the start offset, second
@@ -1701,6 +1706,48 @@ static size_t a6xx_snapshot_gmu_wrapper_registers(struct kgsl_device *device,
return (count * 8) + sizeof(*header);
}
+/* Snapshot cx misc registers */
+static size_t a6xx_snapshot_cx_misc_registers(
+ struct kgsl_device *device, u8 *buf, size_t remain, void *priv)
+{
+ struct kgsl_snapshot_regs *header = (struct kgsl_snapshot_regs *)buf;
+ struct kgsl_snapshot_registers *regs = priv;
+ unsigned int *data = (unsigned int *)(buf + sizeof(*header));
+ int count = 0, j, k;
+ struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
+
+ /* Figure out how many registers we are going to dump */
+ for (j = 0; j < regs->count; j++) {
+ int start = regs->regs[j * 2];
+ int end = regs->regs[j * 2 + 1];
+
+ count += (end - start + 1);
+ }
+
+ if (remain < (count * 8) + sizeof(*header)) {
+ SNAPSHOT_ERR_NOMEM(device, "CX MISC REGS");
+ return 0;
+ }
+
+ for (j = 0; j < regs->count; j++) {
+ unsigned int start = regs->regs[j * 2];
+ unsigned int end = regs->regs[j * 2 + 1];
+
+ for (k = start; k <= end; k++) {
+ unsigned int val;
+
+ adreno_cx_misc_regread(adreno_dev, k, &val);
+ *data++ = k;
+ *data++ = val;
+ }
+ }
+
+ header->count = count;
+
+ /* Return the size of the section */
+ return (count * 8) + sizeof(*header);
+}
+
/* Snapshot the preemption related buffers */
static size_t snapshot_preemption_record(struct kgsl_device *device,
@@ -1745,6 +1792,7 @@ void a6xx_snapshot(struct adreno_device *adreno_dev,
bool sptprac_on = true;
unsigned int i, roq_size;
u32 hi, lo;
+ struct kgsl_snapshot_registers r;
/*
* Dump debugbus data here to capture it for both
@@ -1757,8 +1805,6 @@ void a6xx_snapshot(struct adreno_device *adreno_dev,
/* RSCC registers are on cx */
if (adreno_is_a650_family(adreno_dev)) {
- struct kgsl_snapshot_registers r;
-
r.regs = a650_isense_registers;
r.count = ARRAY_SIZE(a650_isense_registers) / 2;
@@ -1767,8 +1813,6 @@ void a6xx_snapshot(struct adreno_device *adreno_dev,
}
if (adreno_is_a619_holi(adreno_dev)) {
- struct kgsl_snapshot_registers r;
-
r.regs = a6xx_gmu_wrapper_registers;
r.count = ARRAY_SIZE(a6xx_gmu_wrapper_registers) / 2;
@@ -1780,6 +1824,12 @@ void a6xx_snapshot(struct adreno_device *adreno_dev,
ARRAY_SIZE(a6xx_gmu_wrapper_registers) / 2);
}
+ r.regs = a6xx_cx_misc_registers;
+ r.count = ARRAY_SIZE(a6xx_cx_misc_registers) / 2;
+
+ kgsl_snapshot_add_section(device, KGSL_SNAPSHOT_SECTION_REGS,
+ snapshot, a6xx_snapshot_cx_misc_registers, &r);
+
if (gpudev->sptprac_is_on)
sptprac_on = gpudev->sptprac_is_on(adreno_dev);
diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c
index d718dc53d162..3f6e06306c5b 100644
--- a/drivers/gpu/msm/kgsl.c
+++ b/drivers/gpu/msm/kgsl.c
@@ -3,6 +3,7 @@
* Copyright (c) 2008-2021, The Linux Foundation. All rights reserved.
*/
+#include
#include
#include
#include
@@ -247,6 +248,13 @@ static void _deferred_put(struct work_struct *work)
kgsl_mem_entry_put(entry);
}
+/* Use a worker to put the refcount on mem entry */
+void kgsl_mem_entry_put_deferred(struct kgsl_mem_entry *entry)
+{
+ INIT_WORK(&entry->work, _deferred_put);
+ queue_work(kgsl_driver.mem_workqueue, &entry->work);
+}
+
static struct kgsl_mem_entry *kgsl_mem_entry_create(void)
{
struct kgsl_mem_entry *entry = kzalloc(sizeof(*entry), GFP_KERNEL);
@@ -760,8 +768,7 @@ void kgsl_context_detach(struct kgsl_context *context)
/* Remove the event group from the list */
kgsl_del_event_group(device, &context->events);
- kgsl_sync_timeline_put(context->ktimeline);
-
+ kgsl_sync_timeline_detach(context->ktimeline);
kgsl_context_put(context);
}
@@ -780,6 +787,8 @@ kgsl_context_destroy(struct kref *kref)
*/
BUG_ON(!kgsl_context_detached(context));
+ kgsl_sync_timeline_put(context->ktimeline);
+
write_lock(&device->context_lock);
if (context->id != KGSL_CONTEXT_INVALID) {
@@ -803,7 +812,6 @@ kgsl_context_destroy(struct kref *kref)
context->id = KGSL_CONTEXT_INVALID;
}
write_unlock(&device->context_lock);
- kgsl_sync_timeline_destroy(context);
kgsl_process_private_put(context->proc_priv);
device->ftbl->drawctxt_destroy(context);
@@ -2335,8 +2343,7 @@ static bool gpuobj_free_fence_func(void *priv)
entry->memdesc.gpuaddr, entry->memdesc.size,
entry->memdesc.flags);
- INIT_WORK(&entry->work, _deferred_put);
- queue_work(kgsl_driver.mem_workqueue, &entry->work);
+ kgsl_mem_entry_put_deferred(entry);
return true;
}
@@ -3008,6 +3015,29 @@ static int kgsl_setup_dma_buf(struct kgsl_device *device,
entry->priv_data = meta;
entry->memdesc.sgt = sg_table;
+ if (entry->memdesc.priv & KGSL_MEMDESC_SECURE) {
+ unsigned long dma_buf_flags;
+
+ ret = dma_buf_get_flags(dmabuf, &dma_buf_flags);
+ if (ret) {
+ dev_info(device->dev,
+ "Unable to get dma buf flags, err = %d. Skipped access check\n",
+ ret);
+ ret = 0;
+ goto skip_access_check;
+ }
+
+ /*
+ * Secure buffer is not accessible to CP_PIXEL, there is no point
+ * in importing this buffer.
+ */
+ if (!(dma_buf_flags & ION_FLAG_CP_PIXEL)) {
+ ret = -EPERM;
+ goto out;
+ }
+ }
+
+skip_access_check:
/* Calculate the size of the memdesc from the sglist */
for (s = entry->memdesc.sgt->sgl; s != NULL; s = sg_next(s)) {
int priv = (entry->memdesc.priv & KGSL_MEMDESC_SECURE) ? 1 : 0;
diff --git a/drivers/gpu/msm/kgsl.h b/drivers/gpu/msm/kgsl.h
index bb5ee365117d..85d67d0dc2bb 100644
--- a/drivers/gpu/msm/kgsl.h
+++ b/drivers/gpu/msm/kgsl.h
@@ -267,11 +267,6 @@ struct kgsl_mem_entry {
int pending_free;
char metadata[KGSL_GPUOBJ_ALLOC_METADATA_MAX + 1];
struct work_struct work;
- /**
- * @mapped: The number of bytes in this entry that are mapped to
- * userspace
- */
- u64 mapped;
/**
* @map_count: Count how many vmas this object is mapped in - used for
* debugfs accounting
@@ -566,6 +561,13 @@ kgsl_mem_entry_put(struct kgsl_mem_entry *entry)
kref_put(&entry->refcount, kgsl_mem_entry_destroy);
}
+/**
+ * kgsl_mem_entry_put_deferred() - use a worker to put the refcount
+ * on mem entry from a sysfs handler or debugfs handler.
+ * @entry - The memory entry
+ */
+void kgsl_mem_entry_put_deferred(struct kgsl_mem_entry *entry);
+
/*
* kgsl_addr_range_overlap() - Checks if 2 ranges overlap
* @gpuaddr1: Start of first address range
diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c
index 599c5b61e9f8..481bbf8f2a68 100644
--- a/drivers/gpu/msm/kgsl_sharedmem.c
+++ b/drivers/gpu/msm/kgsl_sharedmem.c
@@ -136,7 +136,18 @@ imported_mem_show(struct kgsl_process_private *priv,
}
}
- kgsl_mem_entry_put(entry);
+ /*
+ * If refcount on mem entry is the last refcount, we will
+ * call kgsl_mem_entry_destroy and detach it from process
+ * list. When there is no refcount on the process private,
+ * we will call kgsl_destroy_process_private to do cleanup.
+ * During cleanup, we will try to remove the same sysfs
+ * node which is in use by the current thread and this
+ * situation will end up in a deadloack.
+ * To avoid this situation, use a worker to put the refcount
+ * on mem entry.
+ */
+ kgsl_mem_entry_put_deferred(entry);
spin_lock(&priv->mem_lock);
}
spin_unlock(&priv->mem_lock);
@@ -227,12 +238,6 @@ static ssize_t memtype_sysfs_show(struct kobject *kobj,
u64 size = 0;
int id = 0;
- /*
- * sysfs_remove_file waits for reads to complete before the node is
- * deleted and process private is freed only once kobj is released.
- * This implies that priv will not be freed until this function
- * completes, and no further locking is needed.
- */
priv = container_of(kobj, struct kgsl_process_private, kobj_memtype);
memtype = container_of(attr, struct kgsl_memtype, attr);
@@ -253,7 +258,7 @@ static ssize_t memtype_sysfs_show(struct kobject *kobj,
if (type == memtype->type)
size += memdesc->size;
- kgsl_mem_entry_put(entry);
+ kgsl_mem_entry_put_deferred(entry);
spin_lock(&priv->mem_lock);
}
spin_unlock(&priv->mem_lock);
diff --git a/drivers/gpu/msm/kgsl_sync.c b/drivers/gpu/msm/kgsl_sync.c
index 00f0d5a62816..1103b512487d 100644
--- a/drivers/gpu/msm/kgsl_sync.c
+++ b/drivers/gpu/msm/kgsl_sync.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019, 2021, The Linux Foundation. All rights reserved.
*/
#include
@@ -249,27 +249,41 @@ static void kgsl_sync_timeline_value_str(struct dma_fence *fence,
{
struct kgsl_sync_fence *kfence = (struct kgsl_sync_fence *)fence;
struct kgsl_sync_timeline *ktimeline = kfence->parent;
+ struct kgsl_context *context = NULL;
+ unsigned long flags;
+ int ret = 0;
- unsigned int timestamp_retired = 0;
- unsigned int timestamp_queued = 0;
+ unsigned int timestamp_retired;
+ unsigned int timestamp_queued;
if (!kref_get_unless_zero(&ktimeline->kref))
return;
+ if (!ktimeline->device)
+ goto put_timeline;
- /*
- * ktimeline->device might be NULL here but kgsl_readtimestamp()
- * will handle that correctly
- */
- kgsl_readtimestamp(ktimeline->device, ktimeline->context,
- KGSL_TIMESTAMP_RETIRED, ×tamp_retired);
+ spin_lock_irqsave(&ktimeline->lock, flags);
+ ret = _kgsl_context_get(ktimeline->context);
+ context = ret ? ktimeline->context : NULL;
+ spin_unlock_irqrestore(&ktimeline->lock, flags);
- kgsl_readtimestamp(ktimeline->device, ktimeline->context,
- KGSL_TIMESTAMP_QUEUED, ×tamp_queued);
+ /* Get the last signaled timestamp if the context is not valid */
+ timestamp_queued = ktimeline->last_timestamp;
+ timestamp_retired = timestamp_queued;
+ if (context) {
+ kgsl_readtimestamp(ktimeline->device, context,
+ KGSL_TIMESTAMP_RETIRED, ×tamp_retired);
+
+ kgsl_readtimestamp(ktimeline->device, context,
+ KGSL_TIMESTAMP_QUEUED, ×tamp_queued);
+
+ kgsl_context_put(context);
+ }
snprintf(str, size, "%u queued:%u retired:%u",
ktimeline->last_timestamp,
timestamp_queued, timestamp_retired);
+put_timeline:
kgsl_sync_timeline_put(ktimeline);
}
@@ -298,7 +312,7 @@ int kgsl_sync_timeline_create(struct kgsl_context *context)
{
struct kgsl_sync_timeline *ktimeline;
- /* Put context when timeline is released */
+ /* Put context at detach time */
if (!_kgsl_context_get(context))
return -ENOENT;
@@ -320,6 +334,11 @@ int kgsl_sync_timeline_create(struct kgsl_context *context)
INIT_LIST_HEAD(&ktimeline->child_list_head);
spin_lock_init(&ktimeline->lock);
ktimeline->device = context->device;
+
+ /*
+ * The context pointer is valid till detach time, where we put the
+ * refcount on the context
+ */
ktimeline->context = context;
context->ktimeline = ktimeline;
@@ -352,27 +371,30 @@ static void kgsl_sync_timeline_signal(struct kgsl_sync_timeline *ktimeline,
kgsl_sync_timeline_put(ktimeline);
}
-void kgsl_sync_timeline_destroy(struct kgsl_context *context)
+void kgsl_sync_timeline_detach(struct kgsl_sync_timeline *ktimeline)
{
- kfree(context->ktimeline);
+ unsigned long flags;
+ struct kgsl_context *context = ktimeline->context;
+
+ /* Set context pointer to NULL and drop our refcount on the context */
+ spin_lock_irqsave(&ktimeline->lock, flags);
+ ktimeline->context = NULL;
+ spin_unlock_irqrestore(&ktimeline->lock, flags);
+ kgsl_context_put(context);
}
-static void kgsl_sync_timeline_release(struct kref *kref)
+static void kgsl_sync_timeline_destroy(struct kref *kref)
{
struct kgsl_sync_timeline *ktimeline =
container_of(kref, struct kgsl_sync_timeline, kref);
- /*
- * Only put the context refcount here. The context destroy function
- * will call kgsl_sync_timeline_destroy() to kfree it
- */
- kgsl_context_put(ktimeline->context);
+ kfree(ktimeline);
}
void kgsl_sync_timeline_put(struct kgsl_sync_timeline *ktimeline)
{
if (ktimeline)
- kref_put(&ktimeline->kref, kgsl_sync_timeline_release);
+ kref_put(&ktimeline->kref, kgsl_sync_timeline_destroy);
}
static const struct dma_fence_ops kgsl_sync_fence_ops = {
diff --git a/drivers/gpu/msm/kgsl_sync.h b/drivers/gpu/msm/kgsl_sync.h
index 989658d58eca..b8655ddc9ca2 100644
--- a/drivers/gpu/msm/kgsl_sync.h
+++ b/drivers/gpu/msm/kgsl_sync.h
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
- * Copyright (c) 2012-2014,2018-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2014,2018-2019, 2021, The Linux Foundation. All rights reserved.
*/
#ifndef __KGSL_SYNC_H
#define __KGSL_SYNC_H
@@ -9,7 +9,8 @@
/**
* struct kgsl_sync_timeline - A sync timeline associated with a kgsl context
- * @kref: Refcount to keep the struct alive until all its fences are released
+ * @kref: Refcount to keep the struct alive until all its fences are signaled,
+ and as long as the context exists
* @name: String to describe this timeline
* @fence_context: Used by the fence driver to identify fences belonging to
* this context
@@ -80,7 +81,7 @@ int kgsl_add_fence_event(struct kgsl_device *device,
int kgsl_sync_timeline_create(struct kgsl_context *context);
-void kgsl_sync_timeline_destroy(struct kgsl_context *context);
+void kgsl_sync_timeline_detach(struct kgsl_sync_timeline *ktimeline);
void kgsl_sync_timeline_put(struct kgsl_sync_timeline *ktimeline);
@@ -118,7 +119,7 @@ static inline int kgsl_sync_timeline_create(struct kgsl_context *context)
return 0;
}
-static inline void kgsl_sync_timeline_destroy(struct kgsl_context *context)
+static inline void kgsl_sync_timeline_detach(struct kgsl_sync_timeline *ktimeline)
{
}
diff --git a/drivers/hwtracing/coresight/coresight-tmc-etf.c b/drivers/hwtracing/coresight/coresight-tmc-etf.c
index f54dcd6cd8a2..0aec7d36ae6f 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-etf.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-etf.c
@@ -237,6 +237,9 @@ static int tmc_enable_etf_sink_perf(struct coresight_device *csdev, void *data)
struct perf_output_handle *handle = data;
struct cs_buffers *buf = etm_perf_sink_config(handle);
+ if (!buf)
+ return -EINVAL;
+
spin_lock_irqsave(&drvdata->spinlock, flags);
do {
ret = -EINVAL;
diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
index 458ad8980273..df6e21f27777 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
@@ -168,8 +168,15 @@ static void tmc_pages_free(struct tmc_pages *tmc_pages,
__free_page(tmc_pages->pages[i]);
}
- kfree(tmc_pages->pages);
- kfree(tmc_pages->daddrs);
+ if (is_vmalloc_addr(tmc_pages->pages))
+ vfree(tmc_pages->pages);
+ else
+ kfree(tmc_pages->pages);
+
+ if (is_vmalloc_addr(tmc_pages->daddrs))
+ vfree(tmc_pages->daddrs);
+ else
+ kfree(tmc_pages->daddrs);
tmc_pages->pages = NULL;
tmc_pages->daddrs = NULL;
tmc_pages->nr_pages = 0;
@@ -195,14 +202,24 @@ static int tmc_pages_alloc(struct tmc_pages *tmc_pages,
nr_pages = tmc_pages->nr_pages;
tmc_pages->daddrs = kcalloc(nr_pages, sizeof(*tmc_pages->daddrs),
GFP_KERNEL);
- if (!tmc_pages->daddrs)
- return -ENOMEM;
+ if (!tmc_pages->daddrs) {
+ tmc_pages->daddrs = vmalloc(sizeof(*tmc_pages->daddrs) * nr_pages);
+ if (!tmc_pages->daddrs)
+ return -ENOMEM;
+ }
+
tmc_pages->pages = kcalloc(nr_pages, sizeof(*tmc_pages->pages),
GFP_KERNEL);
if (!tmc_pages->pages) {
- kfree(tmc_pages->daddrs);
- tmc_pages->daddrs = NULL;
- return -ENOMEM;
+ tmc_pages->pages = vmalloc(sizeof(*tmc_pages->pages) * nr_pages);
+ if (!tmc_pages->pages) {
+ if (is_vmalloc_addr(tmc_pages->daddrs))
+ vfree(tmc_pages->daddrs);
+ else
+ kfree(tmc_pages->daddrs);
+ tmc_pages->daddrs = NULL;
+ return -ENOMEM;
+ }
}
for (i = 0; i < nr_pages; i++) {
diff --git a/drivers/input/misc/qcom-hv-haptics.c b/drivers/input/misc/qcom-hv-haptics.c
index 40ae40c13d91..6c328798f23d 100644
--- a/drivers/input/misc/qcom-hv-haptics.c
+++ b/drivers/input/misc/qcom-hv-haptics.c
@@ -43,6 +43,7 @@
#define FIFO_REAL_TIME_FILL_STATUS_MASK_V1 GENMASK(6, 0)
/* STATUS_DATA_MSB in V2 when MOD_STATUS_SEL is 5 and MOD_STATUS_XT.SEL is 1 */
#define FIFO_REAL_TIME_FILL_STATUS_MSB_MASK_V2 GENMASK(1, 0)
+#define FIFO_REAL_TIME_FILL_STATUS_MSB_MASK_V3 GENMASK(2, 0)
#define FIFO_EMPTY_FLAG_BIT_V2 BIT(6)
#define FIFO_FULL_FLAG_BIT_V2 BIT(5)
@@ -1684,7 +1685,7 @@ static int haptics_update_fifo_sample_v2(struct haptics_chip *chip,
static int haptics_get_fifo_fill_status(struct haptics_chip *chip, u32 *fill)
{
int rc;
- u8 val[2];
+ u8 val[2], fill_status_mask;
bool empty = false, full = false;
if (chip->ptn_revision == HAP_PTN_V1) {
@@ -1718,8 +1719,10 @@ static int haptics_get_fifo_fill_status(struct haptics_chip *chip, u32 *fill)
if (rc < 0)
return rc;
- *fill = ((val[0] & FIFO_REAL_TIME_FILL_STATUS_MSB_MASK_V2)
- << 8) | val[1];
+ fill_status_mask = (chip->cfg_revision == HAP_CFG_V2) ?
+ FIFO_REAL_TIME_FILL_STATUS_MSB_MASK_V2 :
+ FIFO_REAL_TIME_FILL_STATUS_MSB_MASK_V3;
+ *fill = ((val[0] & fill_status_mask) << 8) | val[1];
empty = !!(val[0] & FIFO_EMPTY_FLAG_BIT_V2);
full = !!(val[0] & FIFO_FULL_FLAG_BIT_V2);
}
diff --git a/drivers/media/radio/rtc6226/radio-rtc6226-common.c b/drivers/media/radio/rtc6226/radio-rtc6226-common.c
index ea08d264ac7f..897909545793 100644
--- a/drivers/media/radio/rtc6226/radio-rtc6226-common.c
+++ b/drivers/media/radio/rtc6226/radio-rtc6226-common.c
@@ -315,11 +315,13 @@ void rtc6226_scan(struct work_struct *work)
u8 factor;
int retval = 0;
int i, rssi;
+ unsigned long time;
FMDBG("%s enter\n", __func__);
radio = container_of(work, struct rtc6226_device, work_scan.work);
+ mutex_lock(&radio->lock);
retval = rtc6226_get_freq(radio, ¤t_freq_khz);
if (retval < 0) {
FMDERR("%s fail to get freq\n", __func__);
@@ -333,10 +335,14 @@ void rtc6226_scan(struct work_struct *work)
if (retval < 0)
goto seek_tune_fail;
/* wait for tune to complete. */
- if (!wait_for_completion_timeout(&radio->completion,
- msecs_to_jiffies(TUNE_TIMEOUT_MSEC))) {
+ mutex_unlock(&radio->lock);
+ time = wait_for_completion_timeout(&radio->completion,
+ msecs_to_jiffies(TUNE_TIMEOUT_MSEC));
+ mutex_lock(&radio->lock);
+ if (!time) {
FMDERR("In %s, didn't receive STC for tune\n", __func__);
rtc6226_q_event(radio, RTC6226_EVT_ERROR);
+ mutex_unlock(&radio->lock);
return;
}
@@ -351,6 +357,7 @@ void rtc6226_scan(struct work_struct *work)
} else if (radio->mode != FM_RECV) {
FMDERR("%s: FM is not in proper state\n", __func__);
rtc6226_q_event(radio, RTC6226_EVT_ERROR);
+ mutex_unlock(&radio->lock);
return;
}
@@ -360,8 +367,11 @@ void rtc6226_scan(struct work_struct *work)
goto seek_tune_fail;
}
/* wait for seek to complete */
- if (!wait_for_completion_timeout(&radio->completion,
- msecs_to_jiffies(SEEK_TIMEOUT_MSEC))) {
+ mutex_unlock(&radio->lock);
+ time = wait_for_completion_timeout(&radio->completion,
+ msecs_to_jiffies(SEEK_TIMEOUT_MSEC));
+ mutex_lock(&radio->lock);
+ if (!time) {
FMDERR("%s:timeout didn't receive STC for seek\n",
__func__);
rtc6226_get_all_registers(radio);
@@ -370,6 +380,7 @@ void rtc6226_scan(struct work_struct *work)
radio->registers[i]);
/* FM is not correct state or scan is cancelled */
rtc6226_q_event(radio, RTC6226_EVT_ERROR);
+ mutex_unlock(&radio->lock);
return;
} else
FMDERR("%s: received STC for seek\n", __func__);
@@ -406,6 +417,7 @@ void rtc6226_scan(struct work_struct *work)
} else if (radio->mode != FM_RECV) {
FMDERR("%s: FM is not in proper state\n", __func__);
rtc6226_q_event(radio, RTC6226_EVT_ERROR);
+ mutex_unlock(&radio->lock);
return;
}
FMDBG("%s update search list %d\n", __func__, next_freq_khz);
@@ -420,7 +432,6 @@ void rtc6226_scan(struct work_struct *work)
&& rssi >= radio->rssi_th) {
rtc6226_update_search_list(radio, next_freq_khz);
}
-
FMDBG("%s : STATUS=0x%4.4hx\n", __func__,
radio->registers[STATUS]);
if (radio->registers[STATUS] & STATUS_SF ||
@@ -452,10 +463,14 @@ void rtc6226_scan(struct work_struct *work)
FMDERR("%s seek fail %d\n", __func__, retval);
goto seek_tune_fail;
}
- if (!wait_for_completion_timeout(&radio->completion,
- msecs_to_jiffies(SEEK_TIMEOUT_MSEC))) {
+ mutex_unlock(&radio->lock);
+ time = wait_for_completion_timeout(&radio->completion,
+ msecs_to_jiffies(SEEK_TIMEOUT_MSEC));
+ mutex_lock(&radio->lock);
+ if (!time) {
FMDERR("timeout didn't receive STC for seek\n");
rtc6226_q_event(radio, RTC6226_EVT_ERROR);
+ mutex_unlock(&radio->lock);
return;
} else {
FMDERR("%s: received STC for seek\n", __func__);
@@ -510,8 +525,11 @@ seek_cancelled:
FMDERR("%s: Tune to orig freq failed with error %d\n",
__func__, retval);
else {
- if (!wait_for_completion_timeout(&radio->completion,
- msecs_to_jiffies(TUNE_TIMEOUT_MSEC)))
+ mutex_unlock(&radio->lock);
+ time = wait_for_completion_timeout(&radio->completion,
+ msecs_to_jiffies(TUNE_TIMEOUT_MSEC));
+ mutex_lock(&radio->lock);
+ if (!time)
FMDERR("%s: didn't receive STD for tune\n", __func__);
else
FMDERR("%s: received STD for tune\n", __func__);
@@ -522,6 +540,7 @@ seek_cancelled:
rtc6226_q_event(radio, RTC6226_EVT_TUNE_SUCC);
radio->seek_tune_status = NO_SEEK_TUNE_PENDING;
FMDERR("%s seek cancelled %d\n", __func__, retval);
+ mutex_unlock(&radio->lock);
return;
}
@@ -531,14 +550,12 @@ int rtc6226_cancel_seek(struct rtc6226_device *radio)
int retval = 0;
FMDBG("%s enter\n", __func__);
- mutex_lock(&radio->lock);
/* stop seeking */
radio->registers[SEEKCFG1] &= ~SEEKCFG1_CSR0_SEEK;
retval = rtc6226_set_register(radio, SEEKCFG1);
complete(&radio->completion);
- mutex_unlock(&radio->lock);
radio->is_search_cancelled = true;
if (radio->g_search_mode == SEEK)
rtc6226_q_event(radio, RTC6226_EVT_SEEK_COMPLETE);
@@ -553,10 +570,28 @@ void rtc6226_search(struct rtc6226_device *radio, bool on)
current_freq_khz = radio->tuned_freq_khz;
+ FMDBG("%s rtc6226_power_up1: DeviceID=0x%4.4hx ChipID=0x%4.4hx\n",
+ __func__,
+ radio->registers[DEVICEID], radio->registers[CHIPID]);
+ FMDBG("%s rtc6226_power_up2: Reg2=0x%4.4hx Reg3=0x%4.4hx\n", __func__,
+ radio->registers[MPXCFG], radio->registers[CHANNEL]);
+ FMDBG("%s rtc6226_power_up3: Reg4=0x%4.4hx Reg5=0x%4.4hx\n", __func__,
+ radio->registers[SYSCFG], radio->registers[SEEKCFG1]);
+ FMDBG("%s rtc6226_power_up4: Reg6=0x%4.4hx Reg7=0x%4.4hx\n", __func__,
+ radio->registers[POWERCFG], radio->registers[PADCFG]);
+ FMDBG("%s rtc6226_power_up5: Reg8=0x%4.4hx Reg9=0x%4.4hx\n", __func__,
+ radio->registers[8], radio->registers[9]);
+ FMDBG("%s rtc6226_power_up6: regA=0x%4.4hx RegB=0x%4.4hx\n", __func__,
+ radio->registers[10], radio->registers[11]);
+ FMDBG("%s rtc6226_power_up7: regC=0x%4.4hx RegD=0x%4.4hx\n", __func__,
+ radio->registers[12], radio->registers[13]);
+ FMDBG("%s rtc6226_power_up8: regE=0x%4.4hx RegF=0x%4.4hx\n", __func__,
+ radio->registers[14], radio->registers[15]);
+
if (on) {
FMDBG("%s: Queuing the work onto scan work q\n", __func__);
queue_delayed_work(radio->wqueue_scan, &radio->work_scan,
- msecs_to_jiffies(10));
+ msecs_to_jiffies(10));
} else {
rtc6226_cancel_seek(radio);
}
@@ -691,12 +726,10 @@ static void rtc6226_get_rds(struct rtc6226_device *radio)
{
int retval = 0;
- mutex_lock(&radio->lock);
retval = rtc6226_get_all_registers(radio);
if (retval < 0) {
FMDERR("%s read fail%d\n", __func__, retval);
- mutex_unlock(&radio->lock);
return;
}
radio->block[0] = radio->registers[BA_DATA];
@@ -708,7 +741,6 @@ static void rtc6226_get_rds(struct rtc6226_device *radio)
radio->bler[1] = (radio->registers[RSSI] & RSSI_RDS_BB_ERRS) >> 12;
radio->bler[2] = (radio->registers[RSSI] & RSSI_RDS_BC_ERRS) >> 10;
radio->bler[3] = (radio->registers[RSSI] & RSSI_RDS_BD_ERRS) >> 8;
- mutex_unlock(&radio->lock);
}
static void rtc6226_pi_check(struct rtc6226_device *radio, u16 current_pi)
@@ -1308,7 +1340,7 @@ void rtc6226_rds_handler(struct work_struct *worker)
}
FMDBG("%s enter\n", __func__);
-
+ mutex_lock(&radio->lock);
rtc6226_get_rds(radio);
if (radio->bler[0] < CORRECTED_THREE_TO_FIVE)
@@ -1319,6 +1351,7 @@ void rtc6226_rds_handler(struct work_struct *worker)
FMDBG("%s grp_type = %d\n", __func__, grp_type);
} else {
/* invalid data case */
+ mutex_unlock(&radio->lock);
return;
}
if (grp_type & 0x01)
@@ -1378,6 +1411,8 @@ void rtc6226_rds_handler(struct work_struct *worker)
rtc6226_rt_plus(radio);
else if (radio->ert_carrier && (grp_type == radio->ert_carrier))
rtc6226_buff_ert(radio);
+
+ mutex_unlock(&radio->lock);
}
/*
@@ -1400,7 +1435,6 @@ int rtc6226_rds_on(struct rtc6226_device *radio)
int rtc6226_reset_rds_data(struct rtc6226_device *radio)
{
- mutex_lock(&radio->lock);
radio->pi = 0;
/* reset PS bufferes */
memset(radio->ps_display, 0, sizeof(radio->ps_display));
@@ -1415,7 +1449,6 @@ int rtc6226_reset_rds_data(struct rtc6226_device *radio)
radio->wr_index = 0;
radio->rd_index = 0;
memset(radio->buffer, 0, radio->buf_size);
- mutex_unlock(&radio->lock);
return 0;
}
@@ -1441,12 +1474,10 @@ int rtc6226_power_down(struct rtc6226_device *radio)
FMDBG("%s enter\n", __func__);
- mutex_lock(&radio->lock);
/* stop radio */
retval = rtc6226_stop(radio);
//rtc6226_disable_irq(radio);
- mutex_unlock(&radio->lock);
FMDBG("%s exit %d\n", __func__, retval);
return retval;
@@ -1456,8 +1487,6 @@ int rtc6226_power_up(struct rtc6226_device *radio)
{
int retval = 0;
- mutex_lock(&radio->lock);
-
FMDBG("%s enter\n", __func__);
/* start radio */
@@ -1531,7 +1560,6 @@ int rtc6226_power_up(struct rtc6226_device *radio)
done:
FMDBG("%s exit %d\n", __func__, retval);
- mutex_unlock(&radio->lock);
return retval;
}
@@ -1822,6 +1850,7 @@ int rtc6226_vidioc_s_ctrl(struct file *file, void *priv,
FMDBG("%s enter, ctrl->id: %x, value:%d\n", __func__,
ctrl->id, ctrl->value);
+ mutex_lock(&radio->lock);
switch (ctrl->id) {
case V4L2_CID_PRIVATE_RTC6226_STATE:
if (ctrl->value == FM_RECV) {
@@ -2082,6 +2111,7 @@ int rtc6226_vidioc_s_ctrl(struct file *file, void *priv,
end:
FMDBG("%s exit id: %x , ret: %d\n", __func__, ctrl->id, retval);
+ mutex_unlock(&radio->lock);
return retval;
}
@@ -2112,7 +2142,7 @@ static int rtc6226_vidioc_g_tuner(struct file *file, void *priv,
int retval = 0;
FMDBG("%s enter\n", __func__);
-
+ mutex_lock(&radio->lock);
if (tuner->index != 0) {
retval = -EINVAL;
goto done;
@@ -2160,7 +2190,7 @@ static int rtc6226_vidioc_g_tuner(struct file *file, void *priv,
done:
FMDBG("%s exit %d\n", __func__, retval);
-
+ mutex_unlock(&radio->lock);
return retval;
}
@@ -2177,7 +2207,7 @@ static int rtc6226_vidioc_s_tuner(struct file *file, void *priv,
u16 top_freq;
FMDBG("%s entry\n", __func__);
-
+ mutex_lock(&radio->lock);
if (tuner->index != 0) {
FMDBG("%s index :%d\n", __func__, tuner->index);
goto done;
@@ -2222,6 +2252,7 @@ static int rtc6226_vidioc_s_tuner(struct file *file, void *priv,
radio->recv_conf.band_low_limit = bottom_freq;
done:
FMDBG("%s exit %d\n", __func__, retval);
+ mutex_unlock(&radio->lock);
return retval;
}
@@ -2237,7 +2268,7 @@ static int rtc6226_vidioc_g_frequency(struct file *file, void *priv,
unsigned int frq;
FMDBG("%s enter freq %d\n", __func__, freq->frequency);
-
+ mutex_lock(&radio->lock);
freq->type = V4L2_TUNER_RADIO;
retval = rtc6226_get_freq(radio, &frq);
freq->frequency = frq * TUNE_PARAM;
@@ -2246,7 +2277,7 @@ static int rtc6226_vidioc_g_frequency(struct file *file, void *priv,
if (retval < 0)
FMDERR(" %s get frequency failed with %d\n", __func__, retval);
-
+ mutex_unlock(&radio->lock);
return retval;
}
@@ -2270,13 +2301,14 @@ static int rtc6226_vidioc_s_frequency(struct file *file, void *priv,
return -EINVAL;
f = (freq->frequency)/TUNE_PARAM;
+ mutex_lock(&radio->lock);
radio->seek_tune_status = TUNE_PENDING;
retval = rtc6226_set_freq(radio, f);
if (retval < 0)
FMDERR("%s set frequency failed with %d\n", __func__, retval);
else
radio->tuned_freq_khz = f;
-
+ mutex_unlock(&radio->lock);
return retval;
}
@@ -2295,6 +2327,7 @@ static int rtc6226_vidioc_s_hw_freq_seek(struct file *file, void *priv,
if (file->f_flags & O_NONBLOCK)
return -EWOULDBLOCK;
+ mutex_lock(&radio->lock);
radio->is_search_cancelled = false;
/* Disable the rds before seek */
@@ -2328,6 +2361,7 @@ static int rtc6226_vidioc_s_hw_freq_seek(struct file *file, void *priv,
__func__, radio->g_search_mode);
}
FMDBG("%s exit %d\n", __func__, retval);
+ mutex_unlock(&radio->lock);
return retval;
}
diff --git a/drivers/media/radio/rtc6226/radio-rtc6226-i2c.c b/drivers/media/radio/rtc6226/radio-rtc6226-i2c.c
index b086296c28ce..c399753f7dcf 100644
--- a/drivers/media/radio/rtc6226/radio-rtc6226-i2c.c
+++ b/drivers/media/radio/rtc6226/radio-rtc6226-i2c.c
@@ -229,7 +229,7 @@ static void rtc6226_i2c_interrupt_handler(struct rtc6226_device *radio)
unsigned short current_chan;
FMDBG("%s enter\n", __func__);
-
+ mutex_lock(&radio->lock);
/* check Seek/Tune Complete */
retval = rtc6226_get_register(radio, STATUS);
if (retval < 0) {
@@ -267,11 +267,13 @@ static void rtc6226_i2c_interrupt_handler(struct rtc6226_device *radio)
FMDBG("posting RICHWAVE_EVT_TUNE_SUCC event\n");
rtc6226_q_event(radio, RTC6226_EVT_TUNE_SUCC);
radio->seek_tune_status = NO_SEEK_TUNE_PENDING;
- } else if (radio->seek_tune_status == TUNE_PENDING) {
+ } else if ((radio->seek_tune_status == TUNE_PENDING) ||
+ (radio->g_search_mode != SCAN)) {
FMDBG("posting RICHWAVE_EVT_TUNE_SUCC event\n");
rtc6226_q_event(radio, RTC6226_EVT_TUNE_SUCC);
radio->seek_tune_status = NO_SEEK_TUNE_PENDING;
- } else if (radio->seek_tune_status == SCAN_PENDING) {
+ } else if ((radio->seek_tune_status == SCAN_PENDING) ||
+ (radio->g_search_mode == SCAN)) {
/* when scan is pending and STC int is set, signal
* so that scan can proceed
*/
@@ -279,7 +281,8 @@ static void rtc6226_i2c_interrupt_handler(struct rtc6226_device *radio)
complete(&radio->completion);
}
FMDBG("%s Seek/Tune done\n", __func__);
- } else {
+ } else if ((radio->seek_tune_status != TUNE_PENDING) &&
+ (radio->seek_tune_status != SCAN_PENDING)) {
/* Check RDS data after tune/seek interrupt finished
* Update RDS registers
*/
@@ -302,6 +305,7 @@ static void rtc6226_i2c_interrupt_handler(struct rtc6226_device *radio)
}
}
end:
+ mutex_unlock(&radio->lock);
FMDBG("%s exit :%d\n", __func__, retval);
}
@@ -543,7 +547,7 @@ int rtc6226_fops_open(struct file *file)
struct rtc6226_device *radio = video_drvdata(file);
int retval;
- FMDBG("%s enter user num = %d\n", __func__, radio->users);
+ FMDBG("%s enter user num = %d\n", __func__, atomic_read(&radio->users));
if (atomic_inc_return(&radio->users) != 1) {
FMDERR("Device already in use. Try again later\n");
atomic_dec(&radio->users);
@@ -586,6 +590,7 @@ int rtc6226_fops_release(struct file *file)
int retval = 0;
FMDBG("%s : Exit\n", __func__);
+ mutex_lock(&radio->lock);
if (radio->mode != FM_OFF) {
rtc6226_power_down(radio);
radio->mode = FM_OFF;
@@ -595,6 +600,7 @@ int rtc6226_fops_release(struct file *file)
retval = rtc6226_fm_power_cfg(radio, TURNING_OFF);
if (retval < 0)
FMDERR("%s: failed to apply voltage\n", __func__);
+ mutex_unlock(&radio->lock);
return retval;
}
diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
index 6debdfb83630..8facf5e1ba57 100644
--- a/drivers/mmc/host/sdhci-msm.c
+++ b/drivers/mmc/host/sdhci-msm.c
@@ -939,7 +939,7 @@ static int msm_init_cm_dll(struct sdhci_host *host,
mclk_freq = ROUND(dll_clock * cycle_cnt, TCXO_FREQ);
- if (dll_clock < 192000000)
+ if (dll_clock < 100000000)
pr_err("%s: %s: Non standard clk freq =%u\n",
mmc_hostname(mmc), __func__, dll_clock);
@@ -2721,8 +2721,8 @@ static void sdhci_msm_registers_restore(struct sdhci_host *host)
host->ioaddr + msm_offset->core_pwrctl_mask);
if (cq_host)
- cqhci_writel(cq_host, msm_host->cqe_regs.cqe_vendor_cfg1,
- CQHCI_VENDOR_CFG1);
+ cqhci_writel(cq_host, msm_host->cqe_regs.cqe_vendor_cfg1 &
+ ~CMDQ_SEND_STATUS_TRIGGER, CQHCI_VENDOR_CFG1);
if (((ios.timing == MMC_TIMING_MMC_HS400) ||
(ios.timing == MMC_TIMING_MMC_HS200) ||
diff --git a/drivers/net/wireless/cnss2/main.c b/drivers/net/wireless/cnss2/main.c
index 9707beef230f..fd99b1dc2700 100644
--- a/drivers/net/wireless/cnss2/main.c
+++ b/drivers/net/wireless/cnss2/main.c
@@ -3207,13 +3207,9 @@ static int cnss_probe(struct platform_device *plat_dev)
if (ret)
goto deinit_event_work;
- ret = cnss_dms_init(plat_priv);
- if (ret)
- goto deinit_qmi;
-
ret = cnss_debugfs_create(plat_priv);
if (ret)
- goto deinit_dms;
+ goto deinit_qmi;
ret = cnss_misc_init(plat_priv);
if (ret)
@@ -3241,6 +3237,10 @@ retry:
}
}
+ ret = cnss_dms_init(plat_priv);
+ if (ret)
+ goto deinit_bus;
+
cnss_register_coex_service(plat_priv);
cnss_register_ims_service(plat_priv);
@@ -3252,6 +3252,9 @@ retry:
return 0;
+deinit_bus:
+ if (!test_bit(SKIP_DEVICE_BOOT, &plat_priv->ctrl_params.quirks))
+ cnss_bus_deinit(plat_priv);
power_off:
if (!test_bit(SKIP_DEVICE_BOOT, &plat_priv->ctrl_params.quirks))
cnss_power_off_device(plat_priv);
@@ -3259,8 +3262,6 @@ deinit_misc:
cnss_misc_deinit(plat_priv);
destroy_debugfs:
cnss_debugfs_destroy(plat_priv);
-deinit_dms:
- cnss_dms_deinit(plat_priv);
deinit_qmi:
cnss_qmi_deinit(plat_priv);
deinit_event_work:
@@ -3287,10 +3288,10 @@ static int cnss_remove(struct platform_device *plat_dev)
cnss_genl_exit();
cnss_unregister_ims_service(plat_priv);
cnss_unregister_coex_service(plat_priv);
+ cnss_dms_deinit(plat_priv);
cnss_bus_deinit(plat_priv);
cnss_misc_deinit(plat_priv);
cnss_debugfs_destroy(plat_priv);
- cnss_dms_deinit(plat_priv);
cnss_qmi_deinit(plat_priv);
cnss_event_work_deinit(plat_priv);
cnss_remove_sysfs(plat_priv);
diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c
index 08635be66660..43c2c420d255 100644
--- a/drivers/net/wireless/cnss2/pci.c
+++ b/drivers/net/wireless/cnss2/pci.c
@@ -1107,6 +1107,9 @@ int cnss_suspend_pci_link(struct cnss_pci_data *pci_priv)
cnss_pr_err("Failed to set D3Hot, err = %d\n", ret);
}
+ /* Always do PCIe L2 suspend during power off/PCIe link recovery */
+ pci_priv->drv_connected_last = 0;
+
ret = cnss_set_pci_link(pci_priv, PCI_LINK_DOWN);
if (ret)
goto out;
@@ -1184,8 +1187,6 @@ int cnss_pci_recover_link_down(struct cnss_pci_data *pci_priv)
*/
msleep(WAKE_EVENT_TIMEOUT);
- /* Always do PCIe L2 suspend/resume during link down recovery */
- pci_priv->drv_connected_last = 0;
ret = cnss_suspend_pci_link(pci_priv);
if (ret)
cnss_pr_err("Failed to suspend PCI link, err = %d\n", ret);
@@ -1737,20 +1738,20 @@ static int cnss_pci_set_mhi_state(struct cnss_pci_data *pci_priv,
break;
case CNSS_MHI_SUSPEND:
mutex_lock(&pci_priv->mhi_ctrl->pm_mutex);
+retry:
if (pci_priv->drv_connected_last) {
ret = mhi_pm_fast_suspend(pci_priv->mhi_ctrl, true);
} else {
ret = mhi_pm_suspend(pci_priv->mhi_ctrl);
- /* in some corner case, when cnss try to suspend,
- * there is still packets pending in mhi layer,
- * so retry suspend to save roll back effort.
- */
- while (ret == -EBUSY && retry < MHI_SUSPEND_RETRY_CNT) {
- usleep_range(5000, 6000);
- retry++;
- cnss_pr_err("mhi is busy, retry #%u", retry);
- ret = mhi_pm_suspend(pci_priv->mhi_ctrl);
- }
+ }
+ /* in some corner case, when cnss try to suspend,
+ * there is still packets pending in mhi layer,
+ * so retry suspend to save roll back effort.
+ */
+ if (ret == -EBUSY && retry++ < MHI_SUSPEND_RETRY_CNT) {
+ usleep_range(5000, 6000);
+ cnss_pr_err("mhi is busy, retry #%u", retry);
+ goto retry;
}
mutex_unlock(&pci_priv->mhi_ctrl->pm_mutex);
break;
@@ -3023,6 +3024,8 @@ static void cnss_pci_event_cb(struct msm_pcie_notify *notify)
struct pci_dev *pci_dev;
struct cnss_pci_data *pci_priv;
struct device *dev;
+ struct cnss_plat_data *plat_priv = NULL;
+ int ret = 0;
if (!notify)
return;
@@ -3037,6 +3040,23 @@ static void cnss_pci_event_cb(struct msm_pcie_notify *notify)
dev = &pci_priv->pci_dev->dev;
switch (notify->event) {
+ case MSM_PCIE_EVENT_LINK_RECOVER:
+ cnss_pr_dbg("PCI link recover callback\n");
+
+ plat_priv = pci_priv->plat_priv;
+ if (!plat_priv) {
+ cnss_pr_err("plat_priv is NULL\n");
+ return;
+ }
+
+ plat_priv->ctrl_params.quirks |= BIT(LINK_DOWN_SELF_RECOVERY);
+
+ ret = msm_pcie_pm_control(MSM_PCIE_HANDLE_LINKDOWN,
+ pci_dev->bus->number, pci_dev, NULL,
+ PM_OPTIONS_DEFAULT);
+ if (ret)
+ cnss_pci_handle_linkdown(pci_priv);
+ break;
case MSM_PCIE_EVENT_LINKDOWN:
cnss_pr_dbg("PCI link down event callback\n");
cnss_pci_handle_linkdown(pci_priv);
@@ -3080,8 +3100,9 @@ static int cnss_reg_pci_event(struct cnss_pci_data *pci_priv)
struct msm_pcie_register_event *pci_event;
pci_event = &pci_priv->msm_pci_event;
- pci_event->events = MSM_PCIE_EVENT_LINKDOWN |
- MSM_PCIE_EVENT_WAKEUP;
+ pci_event->events = MSM_PCIE_EVENT_LINK_RECOVER |
+ MSM_PCIE_EVENT_LINKDOWN |
+ MSM_PCIE_EVENT_WAKEUP;
if (cnss_pci_is_drv_supported(pci_priv))
pci_event->events = pci_event->events |
diff --git a/drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.c b/drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.c
index a5360a0c0098..39ec3f397df7 100644
--- a/drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.c
+++ b/drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.c
@@ -3414,6 +3414,86 @@ struct qmi_elem_info wlfw_host_cap_req_msg_v01_ei[] = {
wlfw_host_cap_req_msg_v01,
feature_list),
},
+ {
+ .data_type = QMI_OPT_FLAG,
+ .elem_len = 1,
+ .elem_size = sizeof(u8),
+ .array_type = NO_ARRAY,
+ .tlv_type = 0x28,
+ .offset = offsetof(struct
+ wlfw_host_cap_req_msg_v01,
+ num_wlan_clients_valid),
+ },
+ {
+ .data_type = QMI_UNSIGNED_2_BYTE,
+ .elem_len = 1,
+ .elem_size = sizeof(u16),
+ .array_type = NO_ARRAY,
+ .tlv_type = 0x28,
+ .offset = offsetof(struct
+ wlfw_host_cap_req_msg_v01,
+ num_wlan_clients),
+ },
+ {
+ .data_type = QMI_OPT_FLAG,
+ .elem_len = 1,
+ .elem_size = sizeof(u8),
+ .array_type = NO_ARRAY,
+ .tlv_type = 0x29,
+ .offset = offsetof(struct
+ wlfw_host_cap_req_msg_v01,
+ num_wlan_vaps_valid),
+ },
+ {
+ .data_type = QMI_UNSIGNED_1_BYTE,
+ .elem_len = 1,
+ .elem_size = sizeof(u8),
+ .array_type = NO_ARRAY,
+ .tlv_type = 0x29,
+ .offset = offsetof(struct
+ wlfw_host_cap_req_msg_v01,
+ num_wlan_vaps),
+ },
+ {
+ .data_type = QMI_OPT_FLAG,
+ .elem_len = 1,
+ .elem_size = sizeof(u8),
+ .array_type = NO_ARRAY,
+ .tlv_type = 0x2A,
+ .offset = offsetof(struct
+ wlfw_host_cap_req_msg_v01,
+ wake_msi_addr_valid),
+ },
+ {
+ .data_type = QMI_UNSIGNED_4_BYTE,
+ .elem_len = 1,
+ .elem_size = sizeof(u32),
+ .array_type = NO_ARRAY,
+ .tlv_type = 0x2A,
+ .offset = offsetof(struct
+ wlfw_host_cap_req_msg_v01,
+ wake_msi_addr),
+ },
+ {
+ .data_type = QMI_OPT_FLAG,
+ .elem_len = 1,
+ .elem_size = sizeof(u8),
+ .array_type = NO_ARRAY,
+ .tlv_type = 0x2B,
+ .offset = offsetof(struct
+ wlfw_host_cap_req_msg_v01,
+ wlan_enable_delay_valid),
+ },
+ {
+ .data_type = QMI_UNSIGNED_4_BYTE,
+ .elem_len = 1,
+ .elem_size = sizeof(u32),
+ .array_type = NO_ARRAY,
+ .tlv_type = 0x2B,
+ .offset = offsetof(struct
+ wlfw_host_cap_req_msg_v01,
+ wlan_enable_delay),
+ },
{
.data_type = QMI_EOTI,
.array_type = NO_ARRAY,
diff --git a/drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.h b/drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.h
index e54cbce85252..0cb3e604d7dd 100644
--- a/drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.h
+++ b/drivers/net/wireless/cnss_utils/wlan_firmware_service_v01.h
@@ -9,117 +9,117 @@
#define WLFW_SERVICE_ID_V01 0x45
#define WLFW_SERVICE_VERS_V01 0x01
-#define QMI_WLFW_IND_REGISTER_REQ_V01 0x0020
-#define QMI_WLFW_IND_REGISTER_RESP_V01 0x0020
-#define QMI_WLFW_FW_READY_IND_V01 0x0021
-#define QMI_WLFW_WLAN_MODE_REQ_V01 0x0022
-#define QMI_WLFW_WLAN_MODE_RESP_V01 0x0022
-#define QMI_WLFW_WLAN_CFG_REQ_V01 0x0023
-#define QMI_WLFW_WLAN_CFG_RESP_V01 0x0023
-#define QMI_WLFW_CAP_REQ_V01 0x0024
-#define QMI_WLFW_CAP_RESP_V01 0x0024
-#define QMI_WLFW_BDF_DOWNLOAD_REQ_V01 0x0025
-#define QMI_WLFW_BDF_DOWNLOAD_RESP_V01 0x0025
-#define QMI_WLFW_CAL_REPORT_REQ_V01 0x0026
-#define QMI_WLFW_CAL_REPORT_RESP_V01 0x0026
-#define QMI_WLFW_CAL_DOWNLOAD_REQ_V01 0x0027
-#define QMI_WLFW_CAL_DOWNLOAD_RESP_V01 0x0027
-#define QMI_WLFW_INITIATE_CAL_DOWNLOAD_IND_V01 0x0028
-#define QMI_WLFW_CAL_UPDATE_REQ_V01 0x0029
-#define QMI_WLFW_CAL_UPDATE_RESP_V01 0x0029
-#define QMI_WLFW_INITIATE_CAL_UPDATE_IND_V01 0x002A
-#define QMI_WLFW_MSA_READY_IND_V01 0x002B
-#define QMI_WLFW_PIN_CONNECT_RESULT_IND_V01 0x002C
-#define QMI_WLFW_MSA_INFO_REQ_V01 0x002D
-#define QMI_WLFW_MSA_INFO_RESP_V01 0x002D
-#define QMI_WLFW_MSA_READY_REQ_V01 0x002E
-#define QMI_WLFW_MSA_READY_RESP_V01 0x002E
-#define QMI_WLFW_INI_REQ_V01 0x002F
-#define QMI_WLFW_INI_RESP_V01 0x002F
-#define QMI_WLFW_ATHDIAG_READ_REQ_V01 0x0030
-#define QMI_WLFW_ATHDIAG_READ_RESP_V01 0x0030
-#define QMI_WLFW_ATHDIAG_WRITE_REQ_V01 0x0031
-#define QMI_WLFW_ATHDIAG_WRITE_RESP_V01 0x0031
-#define QMI_WLFW_VBATT_REQ_V01 0x0032
-#define QMI_WLFW_VBATT_RESP_V01 0x0032
-#define QMI_WLFW_MAC_ADDR_REQ_V01 0x0033
-#define QMI_WLFW_MAC_ADDR_RESP_V01 0x0033
-#define QMI_WLFW_HOST_CAP_REQ_V01 0x0034
-#define QMI_WLFW_HOST_CAP_RESP_V01 0x0034
-#define QMI_WLFW_REQUEST_MEM_IND_V01 0x0035
-#define QMI_WLFW_RESPOND_MEM_REQ_V01 0x0036
-#define QMI_WLFW_RESPOND_MEM_RESP_V01 0x0036
-#define QMI_WLFW_FW_MEM_READY_IND_V01 0x0037
-#define QMI_WLFW_FW_INIT_DONE_IND_V01 0x0038
-#define QMI_WLFW_REJUVENATE_IND_V01 0x0039
-#define QMI_WLFW_REJUVENATE_ACK_REQ_V01 0x003A
-#define QMI_WLFW_REJUVENATE_ACK_RESP_V01 0x003A
-#define QMI_WLFW_DYNAMIC_FEATURE_MASK_REQ_V01 0x003B
-#define QMI_WLFW_DYNAMIC_FEATURE_MASK_RESP_V01 0x003B
-#define QMI_WLFW_M3_INFO_REQ_V01 0x003C
-#define QMI_WLFW_M3_INFO_RESP_V01 0x003C
-#define QMI_WLFW_XO_CAL_IND_V01 0x003D
-#define QMI_WLFW_CAL_DONE_IND_V01 0x003E
-#define QMI_WLFW_QDSS_TRACE_REQ_MEM_IND_V01 0x003F
-#define QMI_WLFW_QDSS_TRACE_MEM_INFO_REQ_V01 0x0040
-#define QMI_WLFW_QDSS_TRACE_MEM_INFO_RESP_V01 0x0040
-#define QMI_WLFW_QDSS_TRACE_SAVE_IND_V01 0x0041
-#define QMI_WLFW_QDSS_TRACE_DATA_REQ_V01 0x0042
-#define QMI_WLFW_QDSS_TRACE_DATA_RESP_V01 0x0042
-#define QMI_WLFW_SHUTDOWN_REQ_V01 0x0043
-#define QMI_WLFW_SHUTDOWN_RESP_V01 0x0043
-#define QMI_WLFW_QDSS_TRACE_CONFIG_DOWNLOAD_REQ_V01 0x0044
-#define QMI_WLFW_QDSS_TRACE_CONFIG_DOWNLOAD_RESP_V01 0x0044
-#define QMI_WLFW_QDSS_TRACE_MODE_REQ_V01 0x0045
-#define QMI_WLFW_QDSS_TRACE_MODE_RESP_V01 0x0045
-#define QMI_WLFW_QDSS_TRACE_FREE_IND_V01 0x0046
-#define QMI_WLFW_ANTENNA_SWITCH_REQ_V01 0x0047
-#define QMI_WLFW_ANTENNA_SWITCH_RESP_V01 0x0047
-#define QMI_WLFW_ANTENNA_GRANT_REQ_V01 0x0048
-#define QMI_WLFW_ANTENNA_GRANT_RESP_V01 0x0048
-#define QMI_WLFW_WFC_CALL_STATUS_REQ_V01 0x0049
-#define QMI_WLFW_WFC_CALL_STATUS_RESP_V01 0x0049
-#define QMI_WLFW_GET_INFO_REQ_V01 0x004A
-#define QMI_WLFW_GET_INFO_RESP_V01 0x004A
-#define QMI_WLFW_RESPOND_GET_INFO_IND_V01 0x004B
-#define QMI_WLFW_DEVICE_INFO_REQ_V01 0x004C
-#define QMI_WLFW_DEVICE_INFO_RESP_V01 0x004C
-#define QMI_WLFW_M3_DUMP_UPLOAD_REQ_IND_V01 0x004D
-#define QMI_WLFW_M3_DUMP_UPLOAD_DONE_REQ_V01 0x004E
-#define QMI_WLFW_M3_DUMP_UPLOAD_DONE_RESP_V01 0x004E
-#define QMI_WLFW_SOC_WAKE_REQ_V01 0x004F
-#define QMI_WLFW_SOC_WAKE_RESP_V01 0x004F
-#define QMI_WLFW_POWER_SAVE_REQ_V01 0x0050
#define QMI_WLFW_POWER_SAVE_RESP_V01 0x0050
-#define QMI_WLFW_WFC_CALL_TWT_CONFIG_IND_V01 0x0051
-#define QMI_WLFW_QDSS_MEM_READY_IND_V01 0x0052
+#define QMI_WLFW_CAP_REQ_V01 0x0024
+#define QMI_WLFW_CAL_REPORT_REQ_V01 0x0026
+#define QMI_WLFW_M3_INFO_RESP_V01 0x003C
+#define QMI_WLFW_CAL_REPORT_RESP_V01 0x0026
+#define QMI_WLFW_MAC_ADDR_RESP_V01 0x0033
+#define QMI_WLFW_DYNAMIC_FEATURE_MASK_RESP_V01 0x003B
+#define QMI_WLFW_IND_REGISTER_REQ_V01 0x0020
+#define QMI_WLFW_DYNAMIC_FEATURE_MASK_REQ_V01 0x003B
+#define QMI_WLFW_QDSS_TRACE_MODE_RESP_V01 0x0045
+#define QMI_WLFW_FW_READY_IND_V01 0x0021
+#define QMI_WLFW_QDSS_TRACE_MEM_INFO_RESP_V01 0x0040
+#define QMI_WLFW_CAL_UPDATE_REQ_V01 0x0029
+#define QMI_WLFW_REQUEST_MEM_IND_V01 0x0035
+#define QMI_WLFW_QDSS_TRACE_DATA_RESP_V01 0x0042
+#define QMI_WLFW_RESPOND_MEM_RESP_V01 0x0036
+#define QMI_WLFW_VBATT_RESP_V01 0x0032
+#define QMI_WLFW_QDSS_TRACE_MODE_REQ_V01 0x0045
+#define QMI_WLFW_CAL_DOWNLOAD_REQ_V01 0x0027
+#define QMI_WLFW_IND_REGISTER_RESP_V01 0x0020
+#define QMI_WLFW_CAL_UPDATE_RESP_V01 0x0029
+#define QMI_WLFW_M3_INFO_REQ_V01 0x003C
#define QMI_WLFW_PCIE_GEN_SWITCH_REQ_V01 0x0053
+#define QMI_WLFW_ANTENNA_GRANT_RESP_V01 0x0048
+#define QMI_WLFW_INITIATE_CAL_UPDATE_IND_V01 0x002A
+#define QMI_WLFW_RESPOND_MEM_REQ_V01 0x0036
+#define QMI_WLFW_HOST_CAP_RESP_V01 0x0034
+#define QMI_WLFW_MSA_READY_IND_V01 0x002B
+#define QMI_WLFW_WLAN_MODE_REQ_V01 0x0022
+#define QMI_WLFW_WLAN_CFG_RESP_V01 0x0023
+#define QMI_WLFW_REJUVENATE_IND_V01 0x0039
+#define QMI_WLFW_ATHDIAG_WRITE_REQ_V01 0x0031
+#define QMI_WLFW_SOC_WAKE_REQ_V01 0x004F
+#define QMI_WLFW_PIN_CONNECT_RESULT_IND_V01 0x002C
+#define QMI_WLFW_M3_DUMP_UPLOAD_DONE_RESP_V01 0x004E
+#define QMI_WLFW_QDSS_TRACE_SAVE_IND_V01 0x0041
+#define QMI_WLFW_BDF_DOWNLOAD_RESP_V01 0x0025
+#define QMI_WLFW_REJUVENATE_ACK_RESP_V01 0x003A
+#define QMI_WLFW_MSA_INFO_RESP_V01 0x002D
+#define QMI_WLFW_SHUTDOWN_REQ_V01 0x0043
+#define QMI_WLFW_VBATT_REQ_V01 0x0032
+#define QMI_WLFW_MAC_ADDR_REQ_V01 0x0033
+#define QMI_WLFW_WLAN_CFG_REQ_V01 0x0023
+#define QMI_WLFW_ANTENNA_GRANT_REQ_V01 0x0048
+#define QMI_WLFW_BDF_DOWNLOAD_REQ_V01 0x0025
+#define QMI_WLFW_FW_MEM_READY_IND_V01 0x0037
+#define QMI_WLFW_RESPOND_GET_INFO_IND_V01 0x004B
+#define QMI_WLFW_QDSS_TRACE_DATA_REQ_V01 0x0042
+#define QMI_WLFW_CAL_DOWNLOAD_RESP_V01 0x0027
+#define QMI_WLFW_INI_RESP_V01 0x002F
+#define QMI_WLFW_QDSS_TRACE_MEM_INFO_REQ_V01 0x0040
+#define QMI_WLFW_ANTENNA_SWITCH_REQ_V01 0x0047
+#define QMI_WLFW_QDSS_TRACE_REQ_MEM_IND_V01 0x003F
+#define QMI_WLFW_INITIATE_CAL_DOWNLOAD_IND_V01 0x0028
+#define QMI_WLFW_ATHDIAG_WRITE_RESP_V01 0x0031
+#define QMI_WLFW_QDSS_TRACE_CONFIG_DOWNLOAD_RESP_V01 0x0044
+#define QMI_WLFW_SOC_WAKE_RESP_V01 0x004F
+#define QMI_WLFW_GET_INFO_RESP_V01 0x004A
#define QMI_WLFW_PCIE_GEN_SWITCH_RESP_V01 0x0053
+#define QMI_WLFW_INI_REQ_V01 0x002F
#define QMI_WLFW_M3_DUMP_UPLOAD_SEGMENTS_REQ_IND_V01 0x0054
+#define QMI_WLFW_MSA_READY_REQ_V01 0x002E
+#define QMI_WLFW_M3_DUMP_UPLOAD_DONE_REQ_V01 0x004E
+#define QMI_WLFW_CAP_RESP_V01 0x0024
+#define QMI_WLFW_REJUVENATE_ACK_REQ_V01 0x003A
+#define QMI_WLFW_ATHDIAG_READ_RESP_V01 0x0030
+#define QMI_WLFW_ANTENNA_SWITCH_RESP_V01 0x0047
+#define QMI_WLFW_DEVICE_INFO_REQ_V01 0x004C
+#define QMI_WLFW_MSA_INFO_REQ_V01 0x002D
+#define QMI_WLFW_HOST_CAP_REQ_V01 0x0034
+#define QMI_WLFW_QDSS_TRACE_CONFIG_DOWNLOAD_REQ_V01 0x0044
+#define QMI_WLFW_GET_INFO_REQ_V01 0x004A
+#define QMI_WLFW_CAL_DONE_IND_V01 0x003E
+#define QMI_WLFW_M3_DUMP_UPLOAD_REQ_IND_V01 0x004D
+#define QMI_WLFW_WFC_CALL_STATUS_RESP_V01 0x0049
+#define QMI_WLFW_FW_INIT_DONE_IND_V01 0x0038
+#define QMI_WLFW_POWER_SAVE_REQ_V01 0x0050
+#define QMI_WLFW_XO_CAL_IND_V01 0x003D
+#define QMI_WLFW_SHUTDOWN_RESP_V01 0x0043
+#define QMI_WLFW_ATHDIAG_READ_REQ_V01 0x0030
+#define QMI_WLFW_WFC_CALL_TWT_CONFIG_IND_V01 0x0051
+#define QMI_WLFW_WLAN_MODE_RESP_V01 0x0022
+#define QMI_WLFW_WFC_CALL_STATUS_REQ_V01 0x0049
+#define QMI_WLFW_DEVICE_INFO_RESP_V01 0x004C
+#define QMI_WLFW_MSA_READY_RESP_V01 0x002E
+#define QMI_WLFW_QDSS_TRACE_FREE_IND_V01 0x0046
+#define QMI_WLFW_QDSS_MEM_READY_IND_V01 0x0052
-#define QMI_WLFW_MAX_NUM_CE_V01 12
-#define QMI_WLFW_MAX_NUM_SVC_V01 24
-#define QMI_WLFW_MAX_DATA_SIZE_V01 6144
#define QMI_WLFW_MAX_NUM_CAL_V01 5
-#define QMI_WLFW_MAX_STR_LEN_V01 16
-#define QMI_WLFW_MAX_NUM_SHADOW_REG_V01 24
-#define QMI_WLFW_MAX_NUM_SHADOW_REG_V2_V01 36
-#define QMI_WLFW_MAX_NUM_MEMORY_REGIONS_V01 2
-#define QMI_WLFW_MAX_NUM_MEM_CFG_V01 2
-#define QMI_WLFW_MAX_NUM_MEM_SEG_V01 52
-#define QMI_WLFW_MAX_TIMESTAMP_LEN_V01 32
-#define QMI_WLFW_MAC_ADDR_SIZE_V01 6
-#define QMI_WLFW_MAX_BUILD_ID_LEN_V01 128
-#define QMI_WLFW_FUNCTION_NAME_LEN_V01 128
-#define QMI_WLFW_MAX_ATHDIAG_DATA_SIZE_V01 6144
-#define QMI_WLFW_MAX_NUM_GPIO_V01 32
-#define QMI_WLFW_MAX_WFC_CALL_STATUS_DATA_SIZE_V01 256
#define QMI_WLFW_MAX_PLATFORM_NAME_LEN_V01 64
#define QMI_WLFW_MAX_HOST_DDR_RANGE_SIZE_V01 3
-#define QMI_WLFW_MAX_M3_SEGMENTS_SIZE_V01 10
+#define QMI_WLFW_MAX_NUM_SHADOW_REG_V01 24
+#define QMI_WLFW_MAX_BUILD_ID_LEN_V01 128
#define QMI_WLFW_MAX_DEV_MEM_NUM_V01 4
-#define QMI_WLFW_MAX_NUM_MLO_CHIPS_V01 3
#define QMI_WLFW_MAX_NUM_MLO_LINKS_PER_CHIP_V01 2
+#define QMI_WLFW_MAX_NUM_SVC_V01 24
+#define QMI_WLFW_MAX_NUM_MEMORY_REGIONS_V01 2
+#define QMI_WLFW_MAC_ADDR_SIZE_V01 6
+#define QMI_WLFW_MAX_NUM_MEM_CFG_V01 2
+#define QMI_WLFW_MAX_NUM_MEM_SEG_V01 52
+#define QMI_WLFW_MAX_WFC_CALL_STATUS_DATA_SIZE_V01 256
+#define QMI_WLFW_MAX_DATA_SIZE_V01 6144
+#define QMI_WLFW_FUNCTION_NAME_LEN_V01 128
+#define QMI_WLFW_MAX_NUM_CE_V01 12
+#define QMI_WLFW_MAX_TIMESTAMP_LEN_V01 32
+#define QMI_WLFW_MAX_M3_SEGMENTS_SIZE_V01 10
+#define QMI_WLFW_MAX_STR_LEN_V01 16
+#define QMI_WLFW_MAX_NUM_SHADOW_REG_V2_V01 36
+#define QMI_WLFW_MAX_ATHDIAG_DATA_SIZE_V01 6144
+#define QMI_WLFW_MAX_NUM_GPIO_V01 32
+#define QMI_WLFW_MAX_NUM_MLO_CHIPS_V01 3
enum wlfw_driver_mode_enum_v01 {
WLFW_DRIVER_MODE_ENUM_MIN_VAL_V01 = INT_MIN,
@@ -165,6 +165,7 @@ enum wlfw_mem_type_enum_v01 {
QMI_WLFW_MEM_QDSS_V01 = 6,
QMI_WLFW_MEM_HANG_DATA_V01 = 7,
QMI_WLFW_MLO_GLOBAL_MEM_V01 = 8,
+ QMI_WLFW_PAGEABLE_MEM_V01 = 9,
WLFW_MEM_TYPE_ENUM_MAX_VAL_V01 = INT_MAX,
};
@@ -795,9 +796,17 @@ struct wlfw_host_cap_req_msg_v01 {
struct wlfw_host_mlo_chip_info_s_v01 mlo_chip_info[QMI_WLFW_MAX_NUM_MLO_CHIPS_V01];
u8 feature_list_valid;
u64 feature_list;
+ u8 num_wlan_clients_valid;
+ u16 num_wlan_clients;
+ u8 num_wlan_vaps_valid;
+ u8 num_wlan_vaps;
+ u8 wake_msi_addr_valid;
+ u32 wake_msi_addr;
+ u8 wlan_enable_delay_valid;
+ u32 wlan_enable_delay;
};
-#define WLFW_HOST_CAP_REQ_MSG_V01_MAX_MSG_LEN 373
+#define WLFW_HOST_CAP_REQ_MSG_V01_MAX_MSG_LEN 396
extern struct qmi_elem_info wlfw_host_cap_req_msg_v01_ei[];
struct wlfw_host_cap_resp_msg_v01 {
diff --git a/drivers/pci/controller/pci-msm.c b/drivers/pci/controller/pci-msm.c
index a9c3dd7c5ecb..3a6e2a7ec708 100644
--- a/drivers/pci/controller/pci-msm.c
+++ b/drivers/pci/controller/pci-msm.c
@@ -1395,7 +1395,7 @@ static void msm_pcie_write_reg(void __iomem *base, u32 offset, u32 value)
static void msm_pcie_write_reg_field(void __iomem *base, u32 offset,
const u32 mask, u32 val)
{
- u32 shift = find_first_bit((void *)&mask, 32);
+ u32 shift = __ffs(mask);
u32 tmp = readl_relaxed(base + offset);
tmp &= ~mask; /* clear written bits */
diff --git a/drivers/pinctrl/qcom/pinctrl-lahaina.c b/drivers/pinctrl/qcom/pinctrl-lahaina.c
index b2bf0d27ec6f..1d5b13a7e3cb 100644
--- a/drivers/pinctrl/qcom/pinctrl-lahaina.c
+++ b/drivers/pinctrl/qcom/pinctrl-lahaina.c
@@ -1286,7 +1286,7 @@ static const char * const qup5_groups[] = {
"gpio24", "gpio25", "gpio26", "gpio27",
};
static const char * const qup6_groups[] = {
- "gpio28", "gpio29", "gpio30", "gpio31",
+ "gpio28", "gpio29", "gpio30", "gpio31", "gpio6",
};
static const char * const qup7_groups[] = {
"gpio32", "gpio33", "gpio34", "gpio35",
@@ -1609,7 +1609,7 @@ static const struct msm_pingroup lahaina_groups[] = {
[3] = PINGROUP(3, qup13, qup_l5, NA, NA, NA, NA, NA, NA, NA, 0, -1),
[4] = PINGROUP(4, qup0, NA, NA, NA, NA, NA, NA, NA, NA, 0, -1),
[5] = PINGROUP(5, qup0, NA, NA, NA, NA, NA, NA, NA, NA, 0, -1),
- [6] = PINGROUP(6, qup0, qup_l4, NA, NA, NA, NA, NA, NA, NA, 0, -1),
+ [6] = PINGROUP(6, qup0, qup6, NA, NA, NA, NA, NA, NA, NA, 0, -1),
[7] = PINGROUP(7, qup0, qup_l5, NA, NA, NA, NA, NA, NA, NA, 0xCB000, 0),
[8] = PINGROUP(8, qup1, NA, NA, NA, NA, NA, NA, NA, NA, 0, -1),
[9] = PINGROUP(9, qup1, NA, NA, NA, NA, NA, NA, NA, NA, 0, -1),
diff --git a/drivers/soc/qcom/icnss2/main.c b/drivers/soc/qcom/icnss2/main.c
index 9e75f1244d08..36f35f59c11d 100644
--- a/drivers/soc/qcom/icnss2/main.c
+++ b/drivers/soc/qcom/icnss2/main.c
@@ -3352,9 +3352,12 @@ static void icnss_wpss_load(struct work_struct *wpss_load_work)
{
struct icnss_priv *priv = icnss_get_plat_priv();
+ icnss_pr_dbg("Start WPSS Boot\n");
+
priv->subsys = subsystem_get("wpss");
if (IS_ERR_OR_NULL(priv->subsys))
- icnss_pr_err("Failed to load wpss subsys");
+ icnss_pr_err("Failed to load wpss subsys, ret: %d",
+ PTR_ERR(priv->subsys));
}
static inline void icnss_wpss_unload(struct icnss_priv *priv)
@@ -3390,11 +3393,33 @@ static ssize_t wpss_boot_store(struct device *dev,
return count;
}
+static ssize_t wlan_en_delay_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct icnss_priv *priv = dev_get_drvdata(dev);
+ uint32_t wlan_en_delay = 0;
+
+ if (priv->device_id != WCN6750_DEVICE_ID)
+ return count;
+
+ if (sscanf(buf, "%du", &wlan_en_delay) != 1) {
+ icnss_pr_err("Failed to read wlan_en_delay");
+ return -EINVAL;
+ }
+
+ icnss_pr_dbg("WLAN_EN delay: %dms", wlan_en_delay);
+ priv->wlan_en_delay_ms = wlan_en_delay;
+
+ return count;
+}
+
static DEVICE_ATTR_WO(qdss_tr_start);
static DEVICE_ATTR_WO(qdss_tr_stop);
static DEVICE_ATTR_WO(qdss_conf_download);
static DEVICE_ATTR_WO(hw_trc_override);
static DEVICE_ATTR_WO(wpss_boot);
+static DEVICE_ATTR_WO(wlan_en_delay);
static struct attribute *icnss_attrs[] = {
&dev_attr_qdss_tr_start.attr,
@@ -3402,6 +3427,7 @@ static struct attribute *icnss_attrs[] = {
&dev_attr_qdss_conf_download.attr,
&dev_attr_hw_trc_override.attr,
&dev_attr_wpss_boot.attr,
+ &dev_attr_wlan_en_delay.attr,
NULL,
};
diff --git a/drivers/soc/qcom/icnss2/main.h b/drivers/soc/qcom/icnss2/main.h
index f23d45d09d12..0615d9a53896 100644
--- a/drivers/soc/qcom/icnss2/main.h
+++ b/drivers/soc/qcom/icnss2/main.h
@@ -454,6 +454,7 @@ struct icnss_priv {
u32 hw_trc_override;
struct icnss_dms_data dms;
u8 use_nv_mac;
+ u32 wlan_en_delay_ms;
};
struct icnss_reg_info {
diff --git a/drivers/soc/qcom/icnss2/qmi.c b/drivers/soc/qcom/icnss2/qmi.c
index d9b99c2c485a..b1b0de53ce51 100644
--- a/drivers/soc/qcom/icnss2/qmi.c
+++ b/drivers/soc/qcom/icnss2/qmi.c
@@ -656,7 +656,9 @@ int wlfw_cap_send_sync_msg(struct icnss_priv *priv)
goto out;
}
- ret = qmi_txn_wait(&txn, priv->ctrl_params.qmi_timeout);
+ ret = qmi_txn_wait(&txn,
+ priv->ctrl_params.qmi_timeout +
+ msecs_to_jiffies(priv->wlan_en_delay_ms));
if (ret < 0) {
icnss_qmi_fatal_err("Capability resp wait failed with ret %d\n",
ret);
@@ -1409,7 +1411,9 @@ int wlfw_wlan_mode_send_sync_msg(struct icnss_priv *priv,
goto out;
}
- ret = qmi_txn_wait(&txn, priv->ctrl_params.qmi_timeout);
+ ret = qmi_txn_wait(&txn,
+ priv->ctrl_params.qmi_timeout +
+ msecs_to_jiffies(priv->wlan_en_delay_ms));
if (ret < 0) {
icnss_qmi_fatal_err("Mode resp wait failed with ret %d\n", ret);
goto out;
@@ -3132,6 +3136,13 @@ int wlfw_host_cap_send_sync(struct icnss_priv *priv)
req->host_build_type_valid = 1;
req->host_build_type = icnss_get_host_build_type();
+ if (priv->wlan_en_delay_ms >= 100) {
+ icnss_pr_dbg("Setting WLAN_EN delay: %d ms\n",
+ priv->wlan_en_delay_ms);
+ req->wlan_enable_delay_valid = 1;
+ req->wlan_enable_delay = priv->wlan_en_delay_ms;
+ }
+
ret = qmi_txn_init(&priv->qmi, &txn,
wlfw_host_cap_resp_msg_v01_ei, resp);
if (ret < 0) {
diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c
index ef51b3973eec..55b2e0bad42e 100644
--- a/drivers/soc/qcom/peripheral-loader.c
+++ b/drivers/soc/qcom/peripheral-loader.c
@@ -1197,6 +1197,7 @@ int pil_boot(struct pil_desc *desc)
if (desc->shutdown_fail)
pil_err(desc, "Subsystem shutdown failed previously!\n");
+ desc->clear_fw_region = true;
/* Reinitialize for new image */
pil_release_mmap(desc);
@@ -1250,6 +1251,8 @@ int pil_boot(struct pil_desc *desc)
if (desc->ops->init_image)
ret = desc->ops->init_image(desc, fw->data, fw->size);
if (ret) {
+ /* S2 mapping not yet done */
+ desc->clear_fw_region = false;
pil_err(desc, "Initializing image failed(rc:%d)\n", ret);
goto err_boot;
}
@@ -1259,6 +1262,8 @@ int pil_boot(struct pil_desc *desc)
ret = desc->ops->mem_setup(desc, priv->region_start,
priv->region_end - priv->region_start);
if (ret) {
+ /* S2 mapping is failed */
+ desc->clear_fw_region = false;
pil_err(desc, "Memory setup error(rc:%d)\n", ret);
goto err_deinit_image;
}
diff --git a/drivers/soc/qcom/trace_secure_buffer.h b/drivers/soc/qcom/trace_secure_buffer.h
index 2fef8079fd56..655ffde55862 100644
--- a/drivers/soc/qcom/trace_secure_buffer.h
+++ b/drivers/soc/qcom/trace_secure_buffer.h
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
- * Copyright (c) 2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2019, 2021 The Linux Foundation. All rights reserved.
*/
#undef TRACE_SYSTEM
@@ -59,29 +59,29 @@ TRACE_EVENT(hyp_assign_batch_start,
TP_STRUCT__entry(
__field(int, info_nelems)
__field(u64, batch_size)
- __dynamic_array(phys_addr_t, addrs, info_nelems)
+ __dynamic_array(u64, addrs, info_nelems)
__dynamic_array(u64, sizes, info_nelems)
),
TP_fast_assign(
unsigned int i;
- phys_addr_t *addr_arr_ptr = __get_dynamic_array(addrs);
+ u64 *addr_arr_ptr = __get_dynamic_array(addrs);
u64 *sizes_arr_ptr = __get_dynamic_array(sizes);
__entry->info_nelems = info_nelems;
__entry->batch_size = 0;
for (i = 0; i < info_nelems; i++) {
- addr_arr_ptr[i] = info[i].mem_addr;
- sizes_arr_ptr[i] = info[i].mem_size;
- __entry->batch_size += info[i].mem_size;
+ addr_arr_ptr[i] = le64_to_cpu(info[i].mem_addr);
+ sizes_arr_ptr[i] = le64_to_cpu(info[i].mem_size);
+ __entry->batch_size += le64_to_cpu(info[i].mem_size);
}
),
TP_printk("num entries: %d batch size: %llu phys addrs: %s sizes: %s",
__entry->info_nelems, __entry->batch_size,
__print_array(__get_dynamic_array(addrs),
- __entry->info_nelems, sizeof(phys_addr_t)),
+ __entry->info_nelems, sizeof(u64)),
__print_array(__get_dynamic_array(sizes),
__entry->info_nelems, sizeof(u64))
)
diff --git a/drivers/thermal/tsens-dbg.c b/drivers/thermal/tsens-dbg.c
index 26922b43f16b..e4ed076566b9 100644
--- a/drivers/thermal/tsens-dbg.c
+++ b/drivers/thermal/tsens-dbg.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved.
*/
#include
@@ -371,28 +371,23 @@ static int tsens_dbg_log_bus_id_data(struct tsens_device *data,
offset += TSENS_DEBUG_OFFSET_ROW;
}
- loop = 0;
- while (loop < TSENS_DEBUG_LOOP_COUNT) {
- offset = TSENS_DEBUG_OFFSET_ROW *
- TSENS_DEBUG_STATUS_REG_START;
- TSENS_DUMP(tmdev, "Start of TSENS TM dump %d\n",
- loop);
- /* Limited dump of the registers for the temperature */
- for (i = 0; i < TSENS_DEBUG_LOOP_COUNT; i++) {
- r1 = readl_relaxed(controller_id_addr + offset);
- r2 = readl_relaxed(controller_id_addr +
- (offset + TSENS_DEBUG_OFFSET_WORD1));
- r3 = readl_relaxed(controller_id_addr +
- (offset + TSENS_DEBUG_OFFSET_WORD2));
- r4 = readl_relaxed(controller_id_addr +
- (offset + TSENS_DEBUG_OFFSET_WORD3));
+ offset = TSENS_DEBUG_OFFSET_ROW *
+ TSENS_DEBUG_STATUS_REG_START;
+ TSENS_DUMP(tmdev, "%s", "Start of TSENS TM dump\n");
+ /* Limited dump of the registers for the temperature */
+ for (i = 0; i < TSENS_DEBUG_LOOP_COUNT; i++) {
+ r1 = readl_relaxed(controller_id_addr + offset);
+ r2 = readl_relaxed(controller_id_addr +
+ (offset + TSENS_DEBUG_OFFSET_WORD1));
+ r3 = readl_relaxed(controller_id_addr +
+ (offset + TSENS_DEBUG_OFFSET_WORD2));
+ r4 = readl_relaxed(controller_id_addr +
+ (offset + TSENS_DEBUG_OFFSET_WORD3));
TSENS_DUMP(tmdev,
"ctrl:%d:0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
cntrl_id, offset, r1, r2, r3, r4);
- offset += TSENS_DEBUG_OFFSET_ROW;
- }
- loop++;
+ offset += TSENS_DEBUG_OFFSET_ROW;
}
return 0;
diff --git a/drivers/thermal/tsens2xxx.c b/drivers/thermal/tsens2xxx.c
index 10dbabfc5c64..fdca661048cf 100644
--- a/drivers/thermal/tsens2xxx.c
+++ b/drivers/thermal/tsens2xxx.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2021, The Linux Foundation. All rights reserved.
*/
#include
@@ -51,7 +51,7 @@
#define TSENS_TM_0C_THR_OFFSET 12
#define TSENS_TM_CODE_SIGN_BIT 0x800
#define TSENS_TM_SCALE_DECI_MILLIDEG 100
-#define TSENS_DEBUG_WDOG_TRIGGER_COUNT 5
+#define TSENS_DEBUG_WDOG_TRIGGER_COUNT 100
#define TSENS_TM_WATCHDOG_LOG(n) ((n) + 0x13c)
#define TSENS_TM_WATCHDOG_LOG_v23(n) ((n) + 0x170)
#define TSENS_EN BIT(0)
@@ -515,7 +515,7 @@ fail:
static irqreturn_t tsens_tm_critical_irq_thread(int irq, void *data)
{
struct tsens_device *tm = data;
- unsigned int i, status, wd_log, wd_mask;
+ unsigned int i, status, wd_log, wd_mask, wd_status;
unsigned long flags;
void __iomem *sensor_status_addr, *sensor_int_mask_addr;
void __iomem *sensor_critical_addr;
@@ -532,6 +532,8 @@ static irqreturn_t tsens_tm_critical_irq_thread(int irq, void *data)
wd_log_addr = TSENS_TM_WATCHDOG_LOG_v23(tm->tsens_tm_addr);
else
wd_log_addr = TSENS_TM_WATCHDOG_LOG(tm->tsens_tm_addr);
+ wd_status = readl_relaxed(wd_critical_addr);
+ TSENS_DBG(tm, "Critical irq status:%d\n", wd_status);
if (tm->ctrl_data->wd_bark) {
wd_mask = readl_relaxed(wd_critical_addr);
diff --git a/drivers/tty/serial/msm_geni_serial.c b/drivers/tty/serial/msm_geni_serial.c
index 0656d65c7b74..f81be32b396b 100644
--- a/drivers/tty/serial/msm_geni_serial.c
+++ b/drivers/tty/serial/msm_geni_serial.c
@@ -106,7 +106,7 @@
#define STALE_TIMEOUT (16)
#define STALE_COUNT (DEFAULT_BITS_PER_CHAR * STALE_TIMEOUT)
#define SEC_TO_USEC (1000000)
-#define SYSTEM_DELAY (500)
+#define STALE_DELAY (10000) //10msec
#define DEFAULT_BITS_PER_CHAR (10)
#define GENI_UART_NR_PORTS (6)
#define GENI_UART_CONS_PORTS (1)
@@ -1559,7 +1559,6 @@ static int stop_rx_sequencer(struct uart_port *uport)
struct msm_geni_serial_port *port = GET_DEV_PORT(uport);
unsigned long flags = 0;
bool is_rx_active;
- unsigned int stale_delay;
u32 dma_rx_status, s_irq_status;
int usage_count;
@@ -1576,15 +1575,12 @@ static int stop_rx_sequencer(struct uart_port *uport)
if (!uart_console(uport)) {
/*
- * Wait for the stale timeout to happen if there
- * is any data pending in the rx fifo.
- * Have a safety factor of 2 to include the interrupt
- * and system latencies, add 500usec delay for interrupt
- * latency or system delay.
+ * Wait for the stale timeout around 10msec to happen
+ * if there is any data pending in the rx fifo.
+ * This will help to handle incoming rx data in stop_rx_sequencer
+ * for interrupt latency or system delay cases.
*/
- stale_delay = (STALE_COUNT * SEC_TO_USEC) / port->cur_baud;
- stale_delay = (2 * stale_delay) + SYSTEM_DELAY;
- udelay(stale_delay);
+ udelay(STALE_DELAY);
dma_rx_status = geni_read_reg_nolog(uport->membase,
SE_DMA_RX_IRQ_STAT);
diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h
index 82ed4137f37a..b6fdfd97a8f3 100644
--- a/include/linux/sched/sysctl.h
+++ b/include/linux/sched/sysctl.h
@@ -63,6 +63,7 @@ extern unsigned int sysctl_walt_rtg_cfs_boost_prio;
extern unsigned int sysctl_walt_low_latency_task_threshold;
extern unsigned int sysctl_sched_sync_hint_enable;
extern unsigned int sysctl_walt_cpu_high_irqload;
+extern unsigned int sysctl_sched_asym_cap_sibling_freq_match_en;
extern int
walt_proc_group_thresholds_handler(struct ctl_table *table, int write,
diff --git a/include/uapi/linux/msm_ipa.h b/include/uapi/linux/msm_ipa.h
index d4dd11734ef0..7d2a309a4f80 100644
--- a/include/uapi/linux/msm_ipa.h
+++ b/include/uapi/linux/msm_ipa.h
@@ -2618,13 +2618,17 @@ struct ipa_ioc_gsb_info {
#define IPA_PCIE0_EP_ID 21
#define IPA_PCIE1_EP_ID 22
+#define IPA_ETH0_EP_ID 31
+#define IPA_ETH1_EP_ID 32
+
enum ipa_peripheral_ep_type {
IPA_DATA_EP_TYP_RESERVED = 0,
IPA_DATA_EP_TYP_HSIC = 1,
IPA_DATA_EP_TYP_HSUSB = 2,
IPA_DATA_EP_TYP_PCIE = 3,
IPA_DATA_EP_TYP_EMBEDDED = 4,
- IPA_DATA_EP_TYP_BAM_DMUX,
+ IPA_DATA_EP_TYP_BAM_DMUX = 5,
+ IPA_DATA_EP_TYP_ETH,
};
struct ipa_ep_pair_info {
@@ -3206,6 +3210,7 @@ enum ipacm_hw_index_counter_virtual_type {
* @pdn_cfg_type: type of the pdn config applied.
* @enable: enable/disable pdn config type.
* @u.collison_cfg.pdn_ip_addr: pdn_ip_address used in collision config.
+ * @u.collison_cfg.vlan_id; VLAN ID of the client.
* @u.passthrough_cfg.pdn_ip_addr: pdn_ip_address used in passthrough config.
* @u.passthrough_cfg.device_type: Device type of the client.
* @u.passthrough_cfg.vlan_id: VLAN ID of the client.
@@ -3221,6 +3226,7 @@ struct ipa_ioc_pdn_config {
union {
struct ipa_pdn_ip_collision_cfg {
__u32 pdn_ip_addr;
+ __u16 vlan_id;
} collison_cfg;
struct ipa_pdn_ip_passthrough_cfg {
diff --git a/kernel/sched/walt/walt.c b/kernel/sched/walt/walt.c
index ddf1c0d98356..79d62b40a134 100644
--- a/kernel/sched/walt/walt.c
+++ b/kernel/sched/walt/walt.c
@@ -119,6 +119,9 @@ unsigned int sysctl_sched_walt_rotate_big_tasks;
unsigned int walt_rotation_enabled;
__read_mostly unsigned int sysctl_sched_asym_cap_sibling_freq_match_pct = 100;
+__read_mostly unsigned int sysctl_sched_asym_cap_sibling_freq_match_en;
+static cpumask_t asym_freq_match_cpus = CPU_MASK_NONE;
+
__read_mostly unsigned int sched_ravg_hist_size = 5;
static __read_mostly unsigned int sched_io_is_busy = 1;
@@ -645,23 +648,31 @@ __cpu_util_freq_walt(int cpu, struct walt_cpu_load *walt_load)
unsigned long
cpu_util_freq_walt(int cpu, struct walt_cpu_load *walt_load)
{
- struct walt_cpu_load wl_other = {0};
- unsigned long util = 0, util_other = 0;
+ static unsigned long util_other;
+ static struct walt_cpu_load wl_other;
+ unsigned long util = 0;
unsigned long capacity = capacity_orig_of(cpu);
- int i, mpct = sysctl_sched_asym_cap_sibling_freq_match_pct;
+ int mpct = sysctl_sched_asym_cap_sibling_freq_match_pct;
+ int max_cap_cpu;
- if (!cpumask_test_cpu(cpu, &asym_cap_sibling_cpus))
+ if (!cpumask_test_cpu(cpu, &asym_cap_sibling_cpus) &&
+ !(sysctl_sched_asym_cap_sibling_freq_match_en &&
+ cpumask_test_cpu(cpu, &asym_freq_match_cpus)))
return __cpu_util_freq_walt(cpu, walt_load);
- for_each_cpu(i, &asym_cap_sibling_cpus) {
- if (i == cpu)
- util = __cpu_util_freq_walt(cpu, walt_load);
- else
- util_other = __cpu_util_freq_walt(i, &wl_other);
- }
+ /* FIXME: Prime always last cpu */
+ max_cap_cpu = cpumask_last(&asym_freq_match_cpus);
+ util = __cpu_util_freq_walt(cpu, walt_load);
- if (cpu == cpumask_last(&asym_cap_sibling_cpus))
+ if (cpu != max_cap_cpu) {
+ if (cpumask_first(&asym_freq_match_cpus) == cpu)
+ util_other =
+ __cpu_util_freq_walt(max_cap_cpu, &wl_other);
+ else
+ goto out;
+ } else {
mpct = 100;
+ }
util = ADJUSTED_ASYM_CAP_CPU_UTIL(util, util_other, mpct);
@@ -669,6 +680,18 @@ cpu_util_freq_walt(int cpu, struct walt_cpu_load *walt_load)
mpct);
walt_load->pl = ADJUSTED_ASYM_CAP_CPU_UTIL(walt_load->pl, wl_other.pl,
mpct);
+out:
+ if (cpu != max_cap_cpu) {
+ if (util > util_other) {
+ util_other = util;
+ wl_other.nl = walt_load->nl;
+ }
+ if (wl_other.pl < walt_load->pl)
+ wl_other.pl = walt_load->pl;
+ } else {
+ util_other = 0;
+ memset(&wl_other, 0, sizeof(wl_other));
+ }
return (util >= capacity) ? capacity : util;
}
@@ -2616,6 +2639,14 @@ void walt_update_cluster_topology(void)
&asym_cap_sibling_cpus, &cluster->cpus);
}
+ if (num_sched_clusters > 2) {
+ for_each_sched_cluster(cluster) {
+ if (!is_min_capacity_cluster(cluster))
+ cpumask_or(&asym_freq_match_cpus,
+ &asym_freq_match_cpus, &cluster->cpus);
+ }
+ }
+
if (cpumask_weight(&asym_cap_sibling_cpus) == 1)
cpumask_clear(&asym_cap_sibling_cpus);
@@ -3426,6 +3457,13 @@ void walt_irq_work(struct irq_work *irq_work)
int level = 0;
u64 cur_jiffies_ts;
unsigned long flags;
+ struct cpumask freq_match_cpus;
+
+ if (sysctl_sched_asym_cap_sibling_freq_match_en &&
+ !cpumask_empty(&asym_freq_match_cpus))
+ cpumask_copy(&freq_match_cpus, &asym_freq_match_cpus);
+ else
+ cpumask_copy(&freq_match_cpus, &asym_cap_sibling_cpus);
/* Am I the window rollover work or the migration work? */
if (irq_work == &walt_migration_irq_work)
@@ -3457,7 +3495,7 @@ void walt_irq_work(struct irq_work *irq_work)
rq->wrq.grp_time.prev_runnable_sum;
}
if (is_migration && rq->wrq.notif_pending &&
- cpumask_test_cpu(cpu, &asym_cap_sibling_cpus)) {
+ cpumask_test_cpu(cpu, &freq_match_cpus)) {
is_asym_migration = true;
rq->wrq.notif_pending = false;
}
@@ -3472,11 +3510,11 @@ void walt_irq_work(struct irq_work *irq_work)
}
if (total_grp_load) {
- if (cpumask_weight(&asym_cap_sibling_cpus)) {
+ if (cpumask_weight(&freq_match_cpus)) {
u64 big_grp_load =
total_grp_load - min_cluster_grp_load;
- for_each_cpu(cpu, &asym_cap_sibling_cpus)
+ for_each_cpu(cpu, &freq_match_cpus)
cpu_cluster(cpu)->aggr_grp_load = big_grp_load;
}
rtgb_active = is_rtgb_active();
@@ -3508,7 +3546,7 @@ void walt_irq_work(struct irq_work *irq_work)
}
if (is_asym_migration && cpumask_test_cpu(cpu,
- &asym_cap_sibling_cpus))
+ &freq_match_cpus))
flag |= SCHED_CPUFREQ_INTERCLUSTER_MIG;
if (i == num_cpus)
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index d85172a76f3f..5c6882767f43 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -461,6 +461,15 @@ static struct ctl_table kern_table[] = {
.extra1 = SYSCTL_ONE,
.extra2 = &one_hundred,
},
+ {
+ .procname = "sched_asym_cap_sibling_freq_match_enable",
+ .data = &sysctl_sched_asym_cap_sibling_freq_match_en,
+ .maxlen = sizeof(unsigned int),
+ .mode = 0644,
+ .proc_handler = proc_dointvec_minmax,
+ .extra1 = SYSCTL_ZERO,
+ .extra2 = SYSCTL_ONE,
+ },
{
.procname = "sched_coloc_downmigrate_ns",
.data = &sysctl_sched_coloc_downmigrate_ns,