btpower.c 76 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. /*
  7. * Bluetooth Power Switch Module
  8. * controls power to external Bluetooth device
  9. * with interface to power management device
  10. */
  11. #include <linux/init.h>
  12. #include <linux/module.h>
  13. #include <linux/kernel.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/rfkill.h>
  16. #include <linux/skbuff.h>
  17. #include <linux/gpio.h>
  18. #include <linux/of_gpio.h>
  19. #include <linux/of.h>
  20. #include <linux/delay.h>
  21. #include <linux/slab.h>
  22. #include <linux/regulator/consumer.h>
  23. #include <linux/clk.h>
  24. #include <linux/uaccess.h>
  25. #include <linux/of_device.h>
  26. #include <soc/qcom/cmd-db.h>
  27. #include <linux/kdev_t.h>
  28. #include <linux/refcount.h>
  29. #include <linux/idr.h>
  30. #include <linux/cdev.h>
  31. #include <linux/device.h>
  32. #include <linux/pinctrl/qcom-pinctrl.h>
  33. #include "btpower.h"
  34. #if (defined CONFIG_BT_SLIM)
  35. #include "btfm_slim.h"
  36. #endif
  37. #include <linux/fs.h>
  38. #ifdef CONFIG_BT_HW_SECURE_DISABLE
  39. #include "linux/smcinvoke_object.h"
  40. #include "linux/IClientEnv.h"
  41. #define PERISEC_HW_STATE_UID 0x108
  42. #define PERISEC_HW_OP_GET_STATE 1
  43. #define PERISEC_HW_BLUETOOTH_UID 0x502
  44. #define PERISEC_FEATURE_NOT_SUPPORTED 12
  45. #define PERISEC_PERIPHERAL_NOT_FOUND 10
  46. #endif
  47. #define PWR_SRC_NOT_AVAILABLE -2
  48. #define DEFAULT_INVALID_VALUE -1
  49. #define PWR_SRC_INIT_STATE_IDX 0
  50. #define BTPOWER_MBOX_MSG_MAX_LEN 64
  51. #define BTPOWER_MBOX_TIMEOUT_MS 1000
  52. #define XO_CLK_RETRY_COUNT_MAX 5
  53. #define MAX_PROP_SIZE 32
  54. #define BTPOWER_CONFIG_MAX_TIMEOUT 600
  55. #define SIGIO_OOBS_SINGAL 0x00010000
  56. #define SIGIO_INTERACTION_SIGNAL 0x00020000
  57. #define SIGIO_SOC_ACCESS_SIGNAL 0x00040000
  58. #define SIGIO_GPIO_HIGH 0x00000001
  59. #define SIGIO_GPIO_LOW 0x00000000
  60. #define SIGIO_SSR_ON_UWB 0x00000001
  61. #define SIGIO_UWB_SSR_COMPLETED 0x00000002
  62. #define CRASH_REASON_NOT_FOUND ((char *)"Crash reason not found")
  63. #define PERI_SS (0x00)
  64. #define BT_SS (0x01)
  65. #define UWB_SS (0x02)
  66. #define TME_SS (0x03)
  67. /**
  68. * enum btpower_vreg_param: Voltage regulator TCS param
  69. * @BTPOWER_VREG_VOLTAGE: Provides voltage level to be configured in TCS
  70. * @BTPOWER_VREG_MODE: Regulator mode
  71. * @BTPOWER_VREG_TCS_ENABLE: Set Voltage regulator enable config in TCS
  72. */
  73. enum btpower_vreg_param {
  74. BTPOWER_VREG_VOLTAGE,
  75. BTPOWER_VREG_MODE,
  76. BTPOWER_VREG_ENABLE,
  77. };
  78. /**
  79. * enum btpower_tcs_seq: TCS sequence ID for trigger
  80. * BTPOWER_TCS_UP_SEQ: TCS Sequence based on up trigger / Wake TCS
  81. * BTPOWER_TCS_DOWN_SEQ: TCS Sequence based on down trigger / Sleep TCS
  82. * BTPOWER_TCS_ALL_SEQ: Update for both up and down triggers
  83. */
  84. enum btpower_tcs_seq {
  85. BTPOWER_TCS_UP_SEQ,
  86. BTPOWER_TCS_DOWN_SEQ,
  87. BTPOWER_TCS_ALL_SEQ,
  88. };
  89. enum power_src_pos {
  90. BT_RESET_GPIO = PWR_SRC_INIT_STATE_IDX,
  91. BT_SW_CTRL_GPIO,
  92. BT_VDD_AON_LDO,
  93. BT_VDD_DIG_LDO,
  94. BT_VDD_RFA1_LDO,
  95. BT_VDD_RFA2_LDO,
  96. BT_VDD_ASD_LDO,
  97. BT_VDD_XTAL_LDO,
  98. BT_VDD_PA_LDO,
  99. BT_VDD_CORE_LDO,
  100. BT_VDD_IO_LDO,
  101. BT_VDD_LDO,
  102. BT_VDD_RFA_0p8,
  103. BT_VDD_RFACMN,
  104. BT_VDD_ANT_LDO,
  105. // these indexes GPIOs/regs value are fetched during crash.
  106. BT_RESET_GPIO_CURRENT,
  107. BT_SW_CTRL_GPIO_CURRENT,
  108. BT_VDD_AON_LDO_CURRENT,
  109. BT_VDD_DIG_LDO_CURRENT,
  110. BT_VDD_RFA1_LDO_CURRENT,
  111. BT_VDD_RFA2_LDO_CURRENT,
  112. BT_VDD_ASD_LDO_CURRENT,
  113. BT_VDD_XTAL_LDO_CURRENT,
  114. BT_VDD_PA_LDO_CURRENT,
  115. BT_VDD_CORE_LDO_CURRENT,
  116. BT_VDD_IO_LDO_CURRENT,
  117. BT_VDD_LDO_CURRENT,
  118. BT_VDD_RFA_0p8_CURRENT,
  119. BT_VDD_RFACMN_CURRENT,
  120. BT_VDD_IPA_2p2,
  121. BT_VDD_IPA_2p2_CURRENT,
  122. BT_VDD_ANT_LDO_CURRENT,
  123. /* The below bucks are voted for HW WAR on some platform which supports
  124. * WNC39xx.
  125. */
  126. BT_VDD_SMPS,
  127. BT_VDD_SMPS_CURRENT,
  128. /* New entries need to be added before PWR_SRC_SIZE.
  129. * Its hold the max size of power sources states.
  130. */
  131. BT_POWER_SRC_SIZE,
  132. };
  133. // Regulator structure for QCA6174/QCA9377/QCA9379 BT SoC series
  134. static struct vreg_data bt_vregs_info_qca61x4_937x[] = {
  135. {NULL, "qcom,bt-vdd-aon", 928000, 928000, 0, false, false,
  136. {BT_VDD_AON_LDO, BT_VDD_AON_LDO_CURRENT}},
  137. {NULL, "qcom,bt-vdd-io", 1710000, 3460000, 0, false, false,
  138. {BT_VDD_IO_LDO, BT_VDD_IO_LDO_CURRENT}},
  139. {NULL, "qcom,bt-vdd-core", 3135000, 3465000, 0, false, false,
  140. {BT_VDD_CORE_LDO, BT_VDD_CORE_LDO_CURRENT}},
  141. };
  142. // Regulator structure for QCA6390,QCA6490 and WCN6750 BT SoC series
  143. static struct vreg_data bt_vregs_info_qca6xx0[] = {
  144. {NULL, "qcom,bt-vdd-io", 1800000, 1800000, 0, false, true,
  145. {BT_VDD_IO_LDO, BT_VDD_IO_LDO_CURRENT}},
  146. {NULL, "qcom,bt-vdd-aon", 966000, 966000, 0, false, true,
  147. {BT_VDD_AON_LDO, BT_VDD_AON_LDO_CURRENT}},
  148. {NULL, "qcom,bt-vdd-rfacmn", 950000, 950000, 0, false, true,
  149. {BT_VDD_RFACMN, BT_VDD_RFACMN_CURRENT}},
  150. /* BT_CX_MX */
  151. {NULL, "qcom,bt-vdd-dig", 966000, 966000, 0, false, true,
  152. {BT_VDD_DIG_LDO, BT_VDD_DIG_LDO_CURRENT}},
  153. {NULL, "qcom,bt-vdd-rfa-0p8", 950000, 952000, 0, false, true,
  154. {BT_VDD_RFA_0p8, BT_VDD_RFA_0p8_CURRENT}},
  155. {NULL, "qcom,bt-vdd-rfa1", 1900000, 1900000, 0, false, true,
  156. {BT_VDD_RFA1_LDO, BT_VDD_RFA1_LDO_CURRENT}},
  157. {NULL, "qcom,bt-vdd-rfa2", 1900000, 1900000, 0, false, true,
  158. {BT_VDD_RFA2_LDO, BT_VDD_RFA2_LDO_CURRENT}},
  159. {NULL, "qcom,bt-vdd-asd", 2800000, 2800000, 0, false, true,
  160. {BT_VDD_ASD_LDO, BT_VDD_ASD_LDO_CURRENT}},
  161. {NULL, "qcom,bt-vdd-ipa-2p2", 2200000, 2210000, 0, false, true,
  162. {BT_VDD_IPA_2p2, BT_VDD_IPA_2p2_CURRENT}},
  163. };
  164. // Regulator structure for kiwi BT SoC series
  165. static struct vreg_data bt_vregs_info_kiwi[] = {
  166. {NULL, "qcom,bt-vdd18-aon", 1800000, 1800000, 0, false, true,
  167. {BT_VDD_LDO, BT_VDD_LDO_CURRENT}},
  168. {NULL, "qcom,bt-vdd12-io", 1200000, 1200000, 0, false, true,
  169. {BT_VDD_IO_LDO, BT_VDD_IO_LDO_CURRENT}},
  170. {NULL, "qcom,bt-ant-ldo", 1776000, 1776000, 0, false, true,
  171. {BT_VDD_ANT_LDO, BT_VDD_ANT_LDO_CURRENT}},
  172. {NULL, "qcom,bt-vdd-dig", 950000, 950000, 0, false, true,
  173. {BT_VDD_DIG_LDO, BT_VDD_DIG_LDO_CURRENT}},
  174. {NULL, "qcom,bt-vdd-aon", 950000, 950000, 0, false, true,
  175. {BT_VDD_AON_LDO, BT_VDD_AON_LDO_CURRENT}},
  176. {NULL, "qcom,bt-vdd-rfaOp8", 950000, 952000, 0, false, true,
  177. {BT_VDD_RFA_0p8, BT_VDD_RFA_0p8_CURRENT}},
  178. /* BT_CX_MX */
  179. {NULL, "qcom,bt-vdd-rfa2", 1900000, 1900000, 0, false, true,
  180. {BT_VDD_RFA2_LDO, BT_VDD_RFA2_LDO_CURRENT}},
  181. {NULL, "qcom,bt-vdd-rfa1", 1350000, 1350000, 0, false, true,
  182. {BT_VDD_RFA1_LDO, BT_VDD_RFA1_LDO_CURRENT}},
  183. };
  184. // Regulator structure for kiwi BT SoC series
  185. static struct vreg_data bt_vregs_info_peach[] = {
  186. {NULL, "qcom,bt-vdd18-aon", 1800000, 1800000, 0, false, true,
  187. {BT_VDD_LDO, BT_VDD_LDO_CURRENT}},
  188. {NULL, "qcom,bt-vdd12-io", 1200000, 1200000, 0, false, true,
  189. {BT_VDD_IO_LDO, BT_VDD_IO_LDO_CURRENT}},
  190. {NULL, "qcom,bt-ant-ldo", 1776000, 1776000, 0, false, true,
  191. {BT_VDD_ANT_LDO, BT_VDD_ANT_LDO_CURRENT}},
  192. {NULL, "qcom,bt-vdd-dig", 950000, 950000, 0, false, true,
  193. {BT_VDD_DIG_LDO, BT_VDD_DIG_LDO_CURRENT}},
  194. {NULL, "qcom,bt-vdd-aon", 950000, 950000, 0, false, true,
  195. {BT_VDD_AON_LDO, BT_VDD_AON_LDO_CURRENT}},
  196. {NULL, "qcom,bt-vdd-rfaOp8", 950000, 952000, 0, false, true,
  197. {BT_VDD_RFA_0p8, BT_VDD_RFA_0p8_CURRENT}},
  198. /* BT_CX_MX */
  199. {NULL, "qcom,bt-vdd-rfa2", 1900000, 1900000, 0, false, true,
  200. {BT_VDD_RFA2_LDO, BT_VDD_RFA2_LDO_CURRENT}},
  201. {NULL, "qcom,bt-vdd-rfa1", 1350000, 1350000, 0, false, true,
  202. {BT_VDD_RFA1_LDO, BT_VDD_RFA1_LDO_CURRENT}},
  203. };
  204. // Regulator structure for WCN399x BT SoC series
  205. static struct pwr_data bt_vreg_info_wcn399x = {
  206. .compatible = "qcom,wcn3990",
  207. .bt_vregs = (struct vreg_data []) {
  208. {NULL, "qcom,bt-vdd-smps", 984000, 984000, 0, false, false,
  209. {BT_VDD_SMPS, BT_VDD_SMPS_CURRENT}},
  210. {NULL, "qcom,bt-vdd-io", 1700000, 1900000, 0, false, false,
  211. {BT_VDD_IO_LDO, BT_VDD_IO_LDO_CURRENT}},
  212. {NULL, "qcom,bt-vdd-core", 1304000, 1304000, 0, false, false,
  213. {BT_VDD_CORE_LDO, BT_VDD_CORE_LDO_CURRENT}},
  214. {NULL, "qcom,bt-vdd-pa", 3000000, 3312000, 0, false, false,
  215. {BT_VDD_PA_LDO, BT_VDD_PA_LDO_CURRENT}},
  216. {NULL, "qcom,bt-vdd-xtal", 1700000, 1900000, 0, false, false,
  217. {BT_VDD_XTAL_LDO, BT_VDD_XTAL_LDO_CURRENT}},
  218. },
  219. .bt_num_vregs = 5,
  220. };
  221. static struct pwr_data bt_vreg_info_qca6174 = {
  222. .compatible = "qcom,qca6174",
  223. .bt_vregs = bt_vregs_info_qca61x4_937x,
  224. .bt_num_vregs = ARRAY_SIZE(bt_vregs_info_qca61x4_937x),
  225. };
  226. static struct pwr_data bt_vreg_info_qca6390 = {
  227. .compatible = "qcom,qca6390",
  228. .bt_vregs = bt_vregs_info_qca6xx0,
  229. .bt_num_vregs = ARRAY_SIZE(bt_vregs_info_qca6xx0),
  230. };
  231. static struct pwr_data bt_vreg_info_qca6490 = {
  232. .compatible = "qcom,qca6490",
  233. .bt_vregs = bt_vregs_info_qca6xx0,
  234. .bt_num_vregs = ARRAY_SIZE(bt_vregs_info_qca6xx0),
  235. };
  236. static struct pwr_data bt_vreg_info_kiwi = {
  237. .compatible = "qcom,kiwi",
  238. .bt_vregs = bt_vregs_info_kiwi,
  239. .bt_num_vregs = ARRAY_SIZE(bt_vregs_info_kiwi),
  240. };
  241. static struct pwr_data bt_vreg_info_kiwi_no_share_ant_power = {
  242. .compatible = "qcom,kiwi-no-share-ant-power",
  243. .bt_vregs = bt_vregs_info_kiwi,
  244. .bt_num_vregs = ARRAY_SIZE(bt_vregs_info_kiwi),
  245. };
  246. static struct pwr_data bt_vreg_info_converged = {
  247. .compatible = "qcom,bt-qca-converged",
  248. .bt_vregs = bt_vregs_info_kiwi,
  249. .bt_num_vregs = ARRAY_SIZE(bt_vregs_info_kiwi),
  250. };
  251. static struct pwr_data bt_vreg_info_wcn6750 = {
  252. .compatible = "qcom,wcn6750-bt",
  253. .bt_vregs = bt_vregs_info_qca6xx0,
  254. .bt_num_vregs = ARRAY_SIZE(bt_vregs_info_qca6xx0),
  255. };
  256. static struct pwr_data bt_vreg_info_peach = {
  257. .compatible = "qcom,peach-bt",
  258. .platform_vregs = bt_vregs_info_peach,
  259. .platform_num_vregs = ARRAY_SIZE(bt_vregs_info_peach),
  260. //.uwb_vregs = uwb_vregs_info,
  261. //.bt_vregs = platform_vregs_info,
  262. //.uwb_num_vregs = ARRAY_SIZE(uwb_vregs_info),
  263. //.bt_num_vregs = ARRAY_SIZE(platform_vregs_info),
  264. };
  265. static const struct of_device_id bt_power_match_table[] = {
  266. { .compatible = "qcom,qca6174", .data = &bt_vreg_info_qca6174},
  267. { .compatible = "qcom,wcn3990", .data = &bt_vreg_info_wcn399x},
  268. { .compatible = "qcom,qca6390", .data = &bt_vreg_info_qca6390},
  269. { .compatible = "qcom,qca6490", .data = &bt_vreg_info_qca6490},
  270. { .compatible = "qcom,kiwi", .data = &bt_vreg_info_kiwi},
  271. { .compatible = "qcom,kiwi-no-share-ant-power",
  272. .data = &bt_vreg_info_kiwi_no_share_ant_power},
  273. { .compatible = "qcom,wcn6750-bt", .data = &bt_vreg_info_wcn6750},
  274. { .compatible = "qcom,bt-qca-converged", .data = &bt_vreg_info_converged},
  275. { .compatible = "qcom,peach-bt", .data = &bt_vreg_info_peach},
  276. {},
  277. };
  278. static int btpower_enable_ipa_vreg(struct platform_pwr_data *pdata);
  279. static struct platform_pwr_data *pwr_data;
  280. static bool previous;
  281. static struct class *bt_class;
  282. static int bt_major;
  283. static int soc_id;
  284. static bool probe_finished;
  285. struct mutex pwr_release;
  286. static void bt_power_vote(struct work_struct *work);
  287. static struct {
  288. int platform_state[BT_POWER_SRC_SIZE];
  289. int bt_state[BT_POWER_SRC_SIZE];
  290. int uwb_state[BT_POWER_SRC_SIZE];
  291. } power_src;
  292. struct Crash_struct {
  293. // char SubSystem[10];
  294. char PrimaryReason[50];
  295. char SecondaryReason[100];
  296. } CrashInfo;
  297. #ifdef CONFIG_BT_HW_SECURE_DISABLE
  298. int perisec_cnss_bt_hw_disable_check(struct platform_pwr_data *plat_priv)
  299. {
  300. struct Object client_env;
  301. struct Object app_object;
  302. int bt_uid = PERISEC_HW_BLUETOOTH_UID;
  303. union ObjectArg obj_arg[2] = {{{0, 0}}};
  304. int ret;
  305. u8 state = 0;
  306. /* Once this flag is set, secure peripheral feature
  307. * will not be supported till next reboot
  308. */
  309. if (plat_priv->sec_peri_feature_disable)
  310. return 0;
  311. /* get rootObj */
  312. ret = get_client_env_object(&client_env);
  313. if (ret) {
  314. pr_err("Failed to get client_env_object, ret: %d\n", ret);
  315. goto end;
  316. }
  317. ret = IClientEnv_open(client_env, PERISEC_HW_STATE_UID, &app_object);
  318. if (ret) {
  319. pr_err("Failed to get app_object, ret: %d\n", ret);
  320. if (ret == PERISEC_FEATURE_NOT_SUPPORTED) {
  321. ret = 0; /* Do not Assert */
  322. plat_priv->sec_peri_feature_disable = true;
  323. pr_err("Secure HW feature not supported\n");
  324. }
  325. goto exit_release_clientenv;
  326. }
  327. obj_arg[0].b = (struct ObjectBuf) {&bt_uid, sizeof(u32)};
  328. obj_arg[1].b = (struct ObjectBuf) {&state, sizeof(u8)};
  329. ret = Object_invoke(app_object, PERISEC_HW_OP_GET_STATE, obj_arg,
  330. ObjectCounts_pack(1, 1, 0, 0));
  331. pr_err("SMC invoke ret: %d state: %d\n", ret, state);
  332. if (ret) {
  333. if (ret == PERISEC_PERIPHERAL_NOT_FOUND) {
  334. ret = 0; /* Do not Assert */
  335. plat_priv->sec_peri_feature_disable = true;
  336. pr_err("Secure HW mode is not updated. Peripheral not found\n");
  337. }
  338. } else {
  339. if (state == 1)
  340. plat_priv->bt_sec_hw_disable = 1;
  341. else
  342. plat_priv->bt_sec_hw_disable = 0;
  343. }
  344. Object_release(app_object);
  345. exit_release_clientenv:
  346. Object_release(client_env);
  347. end:
  348. if (ret) {
  349. pr_err("SecMode:Unable to get sec mode BT Hardware status\n");
  350. }
  351. return ret;
  352. }
  353. #else
  354. int perisec_cnss_bt_hw_disable_check(struct platform_pwr_data *plat_priv)
  355. {
  356. return 0;
  357. }
  358. #endif
  359. #ifdef CONFIG_MSM_BT_OOBS
  360. static void btpower_uart_transport_locked(struct platform_pwr_data *drvdata,
  361. bool locked)
  362. {
  363. pr_err("%s: %s\n", __func__, (locked ? "busy" : "idle"));
  364. }
  365. static irqreturn_t btpower_host_wake_isr(int irq, void *data)
  366. {
  367. struct platform_pwr_data *drvdata = data;
  368. struct kernel_siginfo siginfo;
  369. int rc = 0;
  370. int host_waking = SIGIO_OOBS_SINGAL;
  371. if (gpio_get_value(drvdata->bt_gpio_host_wake))
  372. host_waking |= SIGIO_GPIO_HIGH;
  373. else
  374. host_waking |= SIGIO_GPIO_LOW;
  375. pr_err("%s: bt-hostwake-gpio(%d) IRQ(%d) value(%d)\n", __func__,
  376. drvdata->bt_gpio_host_wake, drvdata->irq, host_waking);
  377. if (drvdata->reftask_bt == NULL) {
  378. pr_err("%s: ignore BT-HOSTWAKE IRQ\n", __func__);
  379. return IRQ_HANDLED;
  380. }
  381. // Sending signal to HAL layer
  382. memset(&siginfo, 0, sizeof(siginfo));
  383. siginfo.si_signo = SIGIO;
  384. siginfo.si_code = SI_QUEUE;
  385. siginfo.si_int = host_waking;
  386. rc = send_sig_info(siginfo.si_signo, &siginfo, drvdata->reftask_bt);
  387. if (rc < 0) {
  388. pr_err("%s: failed (%d) to send SIG to HAL(%d)\n", __func__,
  389. rc, drvdata->reftask_bt->pid);
  390. }
  391. return IRQ_HANDLED;
  392. }
  393. #endif
  394. static int vreg_configure(struct vreg_data *vreg, bool retention)
  395. {
  396. int rc = 0;
  397. if ((vreg->min_vol != 0) && (vreg->max_vol != 0)) {
  398. rc = regulator_set_voltage(vreg->reg,
  399. (retention ? 0: vreg->min_vol),
  400. vreg->max_vol);
  401. if (rc < 0) {
  402. pr_err("%s: regulator_set_voltage(%s) failed rc=%d\n",
  403. __func__, vreg->name, rc);
  404. return rc;
  405. }
  406. }
  407. if (vreg->load_curr >= 0) {
  408. rc = regulator_set_load(vreg->reg,
  409. (retention ? 0 : vreg->load_curr));
  410. if (rc < 0) {
  411. pr_err("%s: regulator_set_load(%s) failed rc=%d\n",
  412. __func__, vreg->name, rc);
  413. return rc;
  414. }
  415. }
  416. return rc;
  417. }
  418. static int vreg_enable(struct vreg_data *vreg)
  419. {
  420. int rc = 0;
  421. pr_debug("%s: vreg_en for : %s\n", __func__, vreg->name);
  422. if (!vreg->is_enabled) {
  423. if (vreg_configure(vreg, false) < 0)
  424. return rc;
  425. rc = regulator_enable(vreg->reg);
  426. if (rc < 0) {
  427. pr_err("%s: regulator_enable(%s) failed. rc=%d\n",
  428. __func__, vreg->name, rc);
  429. return rc;
  430. }
  431. vreg->is_enabled = true;
  432. }
  433. return rc;
  434. }
  435. static int vreg_disable_retention(struct vreg_data *vreg)
  436. {
  437. int rc = 0;
  438. if (!vreg)
  439. return rc;
  440. pr_debug("%s: disable_retention for : %s\n", __func__, vreg->name);
  441. if ((vreg->is_enabled) && (vreg->is_retention_supp))
  442. rc = vreg_configure(vreg, false);
  443. return rc;
  444. }
  445. static int vreg_enable_retention(struct vreg_data *vreg)
  446. {
  447. int rc = 0;
  448. if (!vreg)
  449. return rc;
  450. pr_debug("%s: enable_retention for : %s\n", __func__, vreg->name);
  451. if ((vreg->is_enabled) && (vreg->is_retention_supp))
  452. if ((vreg->min_vol != 0) && (vreg->max_vol != 0))
  453. rc = vreg_configure(vreg, true);
  454. return rc;
  455. }
  456. static int vreg_disable(struct vreg_data *vreg)
  457. {
  458. int rc = 0;
  459. if (!vreg)
  460. return rc;
  461. pr_debug("%s for : %s\n", __func__, vreg->name);
  462. if (vreg->is_enabled) {
  463. rc = regulator_disable(vreg->reg);
  464. if (rc < 0) {
  465. pr_err("%s, regulator_disable(%s) failed. rc=%d\n",
  466. __func__, vreg->name, rc);
  467. goto out;
  468. }
  469. vreg->is_enabled = false;
  470. if ((vreg->min_vol != 0) && (vreg->max_vol != 0)) {
  471. /* Set the min voltage to 0 */
  472. rc = regulator_set_voltage(vreg->reg, 0,
  473. vreg->max_vol);
  474. if (rc < 0) {
  475. pr_err("%s: regulator_set_voltage(%s) failed rc=%d\n",
  476. __func__, vreg->name, rc);
  477. goto out;
  478. }
  479. }
  480. if (vreg->load_curr >= 0) {
  481. rc = regulator_set_load(vreg->reg, 0);
  482. if (rc < 0) {
  483. pr_err("%s: regulator_set_load(%s) failed rc=%d\n",
  484. __func__, vreg->name, rc);
  485. }
  486. }
  487. }
  488. out:
  489. return rc;
  490. }
  491. static int bt_clk_enable(struct bt_power_clk_data *clk)
  492. {
  493. int rc = 0;
  494. pr_err("%s: %s\n", __func__, clk->name);
  495. /* Get the clock handle for vreg */
  496. if (!clk->clk || clk->is_enabled) {
  497. pr_err("%s: error - node: %p, clk->is_enabled:%d\n",
  498. __func__, clk->clk, clk->is_enabled);
  499. return -EINVAL;
  500. }
  501. rc = clk_prepare_enable(clk->clk);
  502. if (rc) {
  503. pr_err("%s: failed to enable %s, rc(%d)\n",
  504. __func__, clk->name, rc);
  505. return rc;
  506. }
  507. clk->is_enabled = true;
  508. return rc;
  509. }
  510. static int bt_clk_disable(struct bt_power_clk_data *clk)
  511. {
  512. int rc = 0;
  513. pr_err("%s: %s\n", __func__, clk->name);
  514. /* Get the clock handle for vreg */
  515. if (!clk->clk || !clk->is_enabled) {
  516. pr_err("%s: error - node: %p, clk->is_enabled:%d\n",
  517. __func__, clk->clk, clk->is_enabled);
  518. return -EINVAL;
  519. }
  520. clk_disable_unprepare(clk->clk);
  521. clk->is_enabled = false;
  522. return rc;
  523. }
  524. static void btpower_set_xo_clk_gpio_state(bool enable)
  525. {
  526. int xo_clk_gpio = pwr_data->xo_gpio_clk;
  527. int retry = 0;
  528. int rc = 0;
  529. if (xo_clk_gpio < 0)
  530. return;
  531. retry_gpio_req:
  532. rc = gpio_request(xo_clk_gpio, "bt_xo_clk_gpio");
  533. if (rc) {
  534. if (retry++ < XO_CLK_RETRY_COUNT_MAX) {
  535. /* wait for ~(10 - 20) ms */
  536. usleep_range(10000, 20000);
  537. goto retry_gpio_req;
  538. }
  539. }
  540. if (rc) {
  541. pr_err("%s: unable to request XO clk gpio %d (%d)\n",
  542. __func__, xo_clk_gpio, rc);
  543. return;
  544. }
  545. if (enable) {
  546. gpio_direction_output(xo_clk_gpio, 1);
  547. /*XO CLK must be asserted for some time before BT_EN */
  548. usleep_range(100, 200);
  549. } else {
  550. /* Assert XO CLK ~(2-5)ms before off for valid latch in HW */
  551. usleep_range(4000, 6000);
  552. gpio_direction_output(xo_clk_gpio, 0);
  553. }
  554. pr_err("%s:gpio(%d) success\n", __func__, xo_clk_gpio);
  555. gpio_free(xo_clk_gpio);
  556. }
  557. #ifdef CONFIG_MSM_BT_OOBS
  558. void bt_configure_wakeup_gpios(int on)
  559. {
  560. int bt_gpio_dev_wake = pwr_data->bt_gpio_dev_wake;
  561. int bt_host_wake_gpio = pwr_data->bt_gpio_host_wake;
  562. int rc;
  563. if (on) {
  564. if (gpio_is_valid(bt_gpio_dev_wake)) {
  565. gpio_set_value(bt_gpio_dev_wake, 1);
  566. pr_err("%s: BT-ON asserting BT_WAKE(%d)\n", __func__,
  567. bt_gpio_dev_wake);
  568. }
  569. if (gpio_is_valid(bt_host_wake_gpio)) {
  570. pwr_data->irq = gpio_to_irq(bt_host_wake_gpio);
  571. pr_err("%s: BT-ON bt-host_wake-gpio(%d) IRQ(%d)\n",
  572. __func__, bt_host_wake_gpio, pwr_data->irq);
  573. rc = request_irq(pwr_data->irq,
  574. btpower_host_wake_isr,
  575. IRQF_TRIGGER_FALLING |
  576. IRQF_TRIGGER_RISING,
  577. "btpower_hostwake_isr", pwr_data);
  578. if (rc)
  579. pr_err("%s: unable to request IRQ %d (%d)\n",
  580. __func__, bt_host_wake_gpio, rc);
  581. }
  582. } else {
  583. if (gpio_is_valid(bt_host_wake_gpio)) {
  584. pr_err("%s: BT-OFF bt-hostwake-gpio(%d) IRQ(%d) value(%d)\n",
  585. __func__, bt_host_wake_gpio, pwr_data->irq,
  586. gpio_get_value(bt_host_wake_gpio));
  587. free_irq(pwr_data->irq, pwr_data);
  588. }
  589. if (gpio_is_valid(bt_gpio_dev_wake))
  590. gpio_set_value(bt_gpio_dev_wake, 0);
  591. }
  592. }
  593. #endif
  594. static int bt_configure_gpios(int on)
  595. {
  596. int rc = 0;
  597. int bt_reset_gpio = pwr_data->bt_gpio_sys_rst;
  598. int wl_reset_gpio = pwr_data->wl_gpio_sys_rst;
  599. int bt_sw_ctrl_gpio = pwr_data->bt_gpio_sw_ctrl;
  600. int bt_debug_gpio = pwr_data->bt_gpio_debug;
  601. int assert_dbg_gpio = 0;
  602. if (on) {
  603. rc = gpio_request(bt_reset_gpio, "bt_sys_rst_n");
  604. if (rc) {
  605. pr_err("%s: unable to request gpio %d (%d)\n",
  606. __func__, bt_reset_gpio, rc);
  607. return rc;
  608. }
  609. pr_err("BTON:Turn Bt OFF asserting BT_EN to low\n");
  610. pr_err("bt-reset-gpio(%d) value(%d)\n", bt_reset_gpio,
  611. gpio_get_value(bt_reset_gpio));
  612. rc = gpio_direction_output(bt_reset_gpio, 0);
  613. if (rc) {
  614. pr_err("%s: Unable to set direction\n", __func__);
  615. return rc;
  616. }
  617. power_src.platform_state[BT_RESET_GPIO] =
  618. gpio_get_value(bt_reset_gpio);
  619. msleep(50);
  620. pr_err("BTON:Turn Bt OFF post asserting BT_EN to low\n");
  621. pr_err("bt-reset-gpio(%d) value(%d)\n", bt_reset_gpio,
  622. gpio_get_value(bt_reset_gpio));
  623. if (bt_sw_ctrl_gpio >= 0) {
  624. power_src.platform_state[BT_SW_CTRL_GPIO] =
  625. gpio_get_value(bt_sw_ctrl_gpio);
  626. rc = msm_gpio_mpm_wake_set(pwr_data->sw_cntrl_gpio, 1);
  627. if (rc < 0) {
  628. pr_err("Failed to set msm_gpio_mpm_wake_set for sw_cntrl gpio, ret: %d\n",
  629. rc);
  630. return rc;
  631. } else {
  632. pr_err("Set msm_gpio_mpm_wake_set for sw_cntrl gpio successful\n");
  633. }
  634. pr_err("BTON:Turn Bt OFF bt-sw-ctrl-gpio(%d) value(%d)\n",
  635. bt_sw_ctrl_gpio,
  636. power_src.platform_state[BT_SW_CTRL_GPIO]);
  637. }
  638. if (wl_reset_gpio >= 0)
  639. pr_err("BTON:Turn Bt ON wl-reset-gpio(%d) value(%d)\n",
  640. wl_reset_gpio, gpio_get_value(wl_reset_gpio));
  641. if ((wl_reset_gpio < 0) ||
  642. ((wl_reset_gpio >= 0) && gpio_get_value(wl_reset_gpio))) {
  643. btpower_set_xo_clk_gpio_state(true);
  644. pr_err("BTON: WLAN ON Asserting BT_EN to high\n");
  645. rc = gpio_direction_output(bt_reset_gpio, 1);
  646. if (rc) {
  647. pr_err("%s: Unable to set direction\n", __func__);
  648. return rc;
  649. }
  650. power_src.platform_state[BT_RESET_GPIO] =
  651. gpio_get_value(bt_reset_gpio);
  652. btpower_set_xo_clk_gpio_state(false);
  653. }
  654. if ((wl_reset_gpio >= 0) && (gpio_get_value(wl_reset_gpio) == 0)) {
  655. if (gpio_get_value(bt_reset_gpio)) {
  656. pr_err("BTON: WLAN OFF and BT ON are too close\n");
  657. pr_err("reset BT_EN, enable it after delay\n");
  658. rc = gpio_direction_output(bt_reset_gpio, 0);
  659. if (rc) {
  660. pr_err("%s: Unable to set direction\n",
  661. __func__);
  662. return rc;
  663. }
  664. power_src.platform_state[BT_RESET_GPIO] =
  665. gpio_get_value(bt_reset_gpio);
  666. }
  667. pr_err("BTON: WLAN OFF waiting for 100ms delay\n");
  668. pr_err("for AON output to fully discharge\n");
  669. msleep(100);
  670. pr_err("BTON: WLAN OFF Asserting BT_EN to high\n");
  671. btpower_set_xo_clk_gpio_state(true);
  672. rc = gpio_direction_output(bt_reset_gpio, 1);
  673. if (rc) {
  674. pr_err("%s: Unable to set direction\n", __func__);
  675. return rc;
  676. }
  677. power_src.platform_state[BT_RESET_GPIO] =
  678. gpio_get_value(bt_reset_gpio);
  679. btpower_set_xo_clk_gpio_state(false);
  680. }
  681. /* Below block of code executes if WL_EN is pulled high when
  682. * BT_EN is about to pull high. so above two if conditions are
  683. * not executed.
  684. */
  685. if (!gpio_get_value(bt_reset_gpio)) {
  686. btpower_set_xo_clk_gpio_state(true);
  687. pr_err("BTON: WLAN ON and BT ON are too close\n");
  688. pr_err("Asserting BT_EN to high\n");
  689. rc = gpio_direction_output(bt_reset_gpio, 1);
  690. if (rc) {
  691. pr_err("%s: Unable to set direction\n", __func__);
  692. return rc;
  693. }
  694. power_src.platform_state[BT_RESET_GPIO] =
  695. gpio_get_value(bt_reset_gpio);
  696. btpower_set_xo_clk_gpio_state(false);
  697. }
  698. msleep(50);
  699. #ifdef CONFIG_MSM_BT_OOBS
  700. bt_configure_wakeup_gpios(on);
  701. #endif
  702. /* Check if SW_CTRL is asserted */
  703. if (bt_sw_ctrl_gpio >= 0) {
  704. rc = gpio_direction_input(bt_sw_ctrl_gpio);
  705. if (rc) {
  706. pr_err("%s:SWCTRL Dir Set Problem:%d\n",
  707. __func__, rc);
  708. } else if (!gpio_get_value(bt_sw_ctrl_gpio)) {
  709. /* SW_CTRL not asserted, assert debug GPIO */
  710. if (bt_debug_gpio >= 0)
  711. assert_dbg_gpio = 1;
  712. }
  713. }
  714. if (assert_dbg_gpio) {
  715. rc = gpio_request(bt_debug_gpio, "bt_debug_n");
  716. if (rc) {
  717. pr_err("unable to request Debug Gpio\n");
  718. } else {
  719. rc = gpio_direction_output(bt_debug_gpio, 1);
  720. if (rc)
  721. pr_err("%s:Prob Set Debug-Gpio\n",
  722. __func__);
  723. }
  724. }
  725. pr_err("BTON:Turn Bt On bt-reset-gpio(%d) value(%d)\n",
  726. bt_reset_gpio, gpio_get_value(bt_reset_gpio));
  727. if (bt_sw_ctrl_gpio >= 0) {
  728. power_src.platform_state[BT_SW_CTRL_GPIO] =
  729. gpio_get_value(bt_sw_ctrl_gpio);
  730. pr_err("BTON: Turn BT ON bt-sw-ctrl-gpio(%d) value(%d)\n",
  731. bt_sw_ctrl_gpio,
  732. power_src.platform_state[BT_SW_CTRL_GPIO]);
  733. }
  734. } else {
  735. #ifdef CONFIG_MSM_BT_OOBS
  736. bt_configure_wakeup_gpios(on);
  737. #endif
  738. gpio_set_value(bt_reset_gpio, 0);
  739. msleep(100);
  740. pr_err("BT-OFF:bt-reset-gpio(%d) value(%d)\n",
  741. bt_reset_gpio, gpio_get_value(bt_reset_gpio));
  742. if (bt_sw_ctrl_gpio >= 0) {
  743. pr_err("BT-OFF:bt-sw-ctrl-gpio(%d) value(%d)\n",
  744. bt_sw_ctrl_gpio,
  745. gpio_get_value(bt_sw_ctrl_gpio));
  746. }
  747. }
  748. pr_err("%s: bt_gpio= %d on: %d\n", __func__, bt_reset_gpio, on);
  749. return rc;
  750. }
  751. static int bt_regulators_pwr(int pwr_state)
  752. {
  753. int i, log_indx, bt_num_vregs, rc = 0;
  754. struct vreg_data *bt_vregs = NULL;
  755. rc = perisec_cnss_bt_hw_disable_check(pwr_data);
  756. bt_num_vregs = pwr_data->bt_num_vregs;
  757. if (!bt_num_vregs) {
  758. pr_warn("%s: not avilable to %s\n",
  759. __func__, ConvertRegisterModeToString(pwr_state));
  760. return 0;
  761. }
  762. pr_info("%s: %s\n", __func__, ConvertRegisterModeToString(pwr_state));
  763. if (pwr_state == POWER_ENABLE) {
  764. /* Power On */
  765. if (pwr_data->bt_sec_hw_disable) {
  766. pr_err("%s:secure hw mode on,BT ON not allowed",
  767. __func__);
  768. return -EINVAL;
  769. }
  770. for (i = 0; i < bt_num_vregs; i++) {
  771. bt_vregs = &pwr_data->bt_vregs[i];
  772. log_indx = bt_vregs->indx.init;
  773. if (bt_vregs->reg) {
  774. power_src.bt_state[log_indx] = DEFAULT_INVALID_VALUE;
  775. rc = vreg_enable(bt_vregs);
  776. if (rc < 0) {
  777. pr_err("%s: bt_power regulators config failed\n",
  778. __func__);
  779. goto regulator_fail;
  780. }
  781. if (bt_vregs->is_enabled)
  782. power_src.bt_state[log_indx] =
  783. regulator_get_voltage(bt_vregs->reg);
  784. }
  785. }
  786. /* Parse dt_info and check if a target requires clock voting.
  787. * Enable BT clock when BT is on and disable it when BT is off
  788. */
  789. if (pwr_data->bt_chip_clk) {
  790. rc = bt_clk_enable(pwr_data->bt_chip_clk);
  791. if (rc < 0) {
  792. pr_err("%s: bt_power gpio config failed\n",
  793. __func__);
  794. goto clk_fail;
  795. }
  796. }
  797. if (pwr_data->bt_gpio_sys_rst > 0) {
  798. power_src.bt_state[BT_RESET_GPIO] = DEFAULT_INVALID_VALUE;
  799. power_src.bt_state[BT_SW_CTRL_GPIO] = DEFAULT_INVALID_VALUE;
  800. rc = bt_configure_gpios(POWER_ENABLE);
  801. if (rc < 0) {
  802. pr_err("%s: bt_power gpio config failed\n",
  803. __func__);
  804. goto gpio_fail;
  805. }
  806. }
  807. } else if (pwr_state == POWER_DISABLE) {
  808. /* Power Off */
  809. if (pwr_data->bt_gpio_sys_rst > 0) {
  810. if (pwr_data->bt_sec_hw_disable) {
  811. pr_err("%s: secure hw mode on, not allowed to access gpio",
  812. __func__);
  813. }else {
  814. bt_configure_gpios(POWER_DISABLE);
  815. }
  816. }
  817. gpio_fail:
  818. if (pwr_data->bt_gpio_sys_rst > 0)
  819. gpio_free(pwr_data->bt_gpio_sys_rst);
  820. if (pwr_data->bt_gpio_debug > 0)
  821. gpio_free(pwr_data->bt_gpio_debug);
  822. if (pwr_data->bt_chip_clk)
  823. bt_clk_disable(pwr_data->bt_chip_clk);
  824. clk_fail:
  825. regulator_fail:
  826. for (i = 0; i < bt_num_vregs; i++) {
  827. bt_vregs = &pwr_data->bt_vregs[i];
  828. rc = vreg_disable(bt_vregs);
  829. }
  830. } else if (pwr_state == POWER_RETENTION) {
  831. /* Retention mode */
  832. for (i = 0; i < bt_num_vregs; i++) {
  833. bt_vregs = &pwr_data->bt_vregs[i];
  834. rc = vreg_enable_retention(bt_vregs);
  835. }
  836. } else {
  837. pr_err("%s: Invalid power mode: %d\n", __func__, pwr_state);
  838. rc = -1;
  839. }
  840. return rc;
  841. }
  842. static int uwb_regulators_pwr(int pwr_state)
  843. {
  844. int i, log_indx, uwb_num_vregs, rc = 0;
  845. struct vreg_data *uwb_vregs = NULL;
  846. rc = perisec_cnss_bt_hw_disable_check(pwr_data);
  847. uwb_num_vregs = pwr_data->uwb_num_vregs;
  848. if (!uwb_num_vregs) {
  849. pr_warn("%s: not avilable to %s\n",
  850. __func__, ConvertRegisterModeToString(pwr_state));
  851. return 0;
  852. }
  853. pr_info("%s: %s\n", __func__, ConvertRegisterModeToString(pwr_state));
  854. switch (pwr_state) {
  855. case POWER_ENABLE:
  856. for (i = 0; i < uwb_num_vregs; i++) {
  857. uwb_vregs = &pwr_data->uwb_vregs[i];
  858. log_indx = uwb_vregs->indx.init;
  859. if (uwb_vregs->reg) {
  860. power_src.uwb_state[log_indx] = DEFAULT_INVALID_VALUE;
  861. rc = vreg_enable(uwb_vregs);
  862. if (rc < 0) {
  863. pr_err("%s: UWB regulators config failed\n",
  864. __func__);
  865. goto UWB_regulator_fail;
  866. }
  867. if (uwb_vregs->is_enabled)
  868. power_src.uwb_state[log_indx] =
  869. regulator_get_voltage(uwb_vregs->reg);
  870. }
  871. }
  872. rc = bt_configure_gpios(POWER_ENABLE);
  873. if (rc < 0) {
  874. pr_err("%s: bt_power gpio config failed\n",
  875. __func__);
  876. goto UWB_gpio_fail;
  877. }
  878. break;
  879. case POWER_DISABLE:
  880. rc = bt_configure_gpios(POWER_DISABLE);
  881. if (rc < 0) {
  882. pr_err("%s: bt_power gpio config failed\n",
  883. __func__);
  884. goto UWB_gpio_fail;
  885. }
  886. UWB_gpio_fail:
  887. UWB_regulator_fail:
  888. for (i = 0; i < uwb_num_vregs; i++) {
  889. uwb_vregs = &pwr_data->uwb_vregs[i];
  890. rc = vreg_disable(uwb_vregs);
  891. }
  892. break;
  893. case POWER_RETENTION:
  894. for (i = 0; i < uwb_num_vregs; i++) {
  895. uwb_vregs = &pwr_data->uwb_vregs[i];
  896. rc = vreg_enable_retention(uwb_vregs);
  897. }
  898. break;
  899. }
  900. return rc;
  901. }
  902. static int platform_regulators_pwr(int pwr_state)
  903. {
  904. int i, log_indx, platform_num_vregs, rc = 0;
  905. struct vreg_data *platform_vregs = NULL;
  906. rc = perisec_cnss_bt_hw_disable_check(pwr_data);
  907. platform_num_vregs = pwr_data->platform_num_vregs;
  908. if (!platform_num_vregs) {
  909. pr_warn("%s: not avilable to %s\n",
  910. __func__, ConvertRegisterModeToString(pwr_state));
  911. return 0;
  912. }
  913. pr_info("%s: %s\n", __func__, ConvertRegisterModeToString(pwr_state));
  914. switch (pwr_state) {
  915. case POWER_ENABLE:
  916. for (i = 0; i < platform_num_vregs; i++) {
  917. platform_vregs = &pwr_data->platform_vregs[i];
  918. log_indx = platform_vregs->indx.init;
  919. if (platform_vregs->reg) {
  920. power_src.platform_state[log_indx] = DEFAULT_INVALID_VALUE;
  921. rc = vreg_enable(platform_vregs);
  922. if (rc < 0) {
  923. pr_err("%s: Platform regulators config failed\n",
  924. __func__);
  925. goto Platform_regulator_fail;
  926. }
  927. if (platform_vregs->is_enabled) {
  928. power_src.platform_state[log_indx] = regulator_get_voltage(platform_vregs->reg);
  929. }
  930. }
  931. }
  932. rc = bt_configure_gpios(POWER_ENABLE);
  933. if (rc < 0) {
  934. pr_err("%s: bt_power gpio config failed\n",
  935. __func__);
  936. goto Platform_gpio_fail;
  937. }
  938. break;
  939. case POWER_DISABLE:
  940. rc = bt_configure_gpios(POWER_DISABLE);
  941. if (rc < 0) {
  942. pr_err("%s: bt_power gpio config failed\n",
  943. __func__);
  944. }
  945. Platform_gpio_fail:
  946. if (pwr_data->bt_gpio_sys_rst > 0)
  947. gpio_free(pwr_data->bt_gpio_sys_rst);
  948. if (pwr_data->bt_gpio_debug > 0)
  949. gpio_free(pwr_data->bt_gpio_debug);
  950. Platform_regulator_fail:
  951. for (i = 0; i < platform_num_vregs; i++) {
  952. platform_vregs = &pwr_data->platform_vregs[i];
  953. rc = vreg_disable(platform_vregs);
  954. }
  955. break;
  956. case POWER_RETENTION:
  957. for (i=0; i < platform_num_vregs; i++) {
  958. platform_vregs = &pwr_data->platform_vregs[i];
  959. rc = vreg_enable_retention(platform_vregs);
  960. }
  961. break;
  962. case POWER_DISABLE_RETENTION:
  963. for (i = 0; i < platform_num_vregs; i++) {
  964. platform_vregs = &pwr_data->platform_vregs[i];
  965. rc = vreg_disable_retention(platform_vregs);
  966. }
  967. break;
  968. }
  969. return rc;
  970. }
  971. static int power_regulators(int core_type, int mode) {
  972. int ret = 0;
  973. if ((mode != POWER_DISABLE) && (mode != POWER_ENABLE) &&
  974. (mode != POWER_RETENTION)) {
  975. pr_err("%s: Received wrong Mode to do regulator operation\n",
  976. __func__);
  977. return -1;
  978. }
  979. switch (core_type) {
  980. case BT_CORE:
  981. ret = bt_regulators_pwr(mode);
  982. if (ret)
  983. pr_err("%s: Failed to configure BT regulators to mode(%d)\n",
  984. __func__, mode);
  985. break;
  986. case UWB_CORE:
  987. ret = uwb_regulators_pwr(mode);
  988. if (ret)
  989. pr_err("%s: Failed to configure UWB regulators to mode(%d)\n",
  990. __func__, mode);
  991. break;
  992. case PLATFORM_CORE:
  993. ret = platform_regulators_pwr(mode);
  994. if (ret)
  995. pr_err("%s: Failed to configure platform regulators to mode(%d)\n",
  996. __func__, mode);
  997. break;
  998. default:
  999. pr_err("%s: Received wrong Core Type to do regulator operation\n",
  1000. __func__);
  1001. return -1;
  1002. }
  1003. return ret;
  1004. }
  1005. static int btpower_toggle_radio(void *data, bool blocked)
  1006. {
  1007. int ret = 0;
  1008. int (*power_control)(int Core, int enable);
  1009. power_control =
  1010. ((struct platform_pwr_data *)data)->power_setup;
  1011. if (previous != blocked)
  1012. ret = (*power_control)(BT_CORE, !blocked);
  1013. if (!ret)
  1014. previous = blocked;
  1015. return ret;
  1016. }
  1017. static const struct rfkill_ops btpower_rfkill_ops = {
  1018. .set_block = btpower_toggle_radio,
  1019. };
  1020. static ssize_t extldo_show(struct device *dev, struct device_attribute *attr,
  1021. char *buf)
  1022. {
  1023. return scnprintf(buf, 6, "false\n");
  1024. }
  1025. static DEVICE_ATTR_RO(extldo);
  1026. static int btpower_rfkill_probe(struct platform_device *pdev)
  1027. {
  1028. struct rfkill *rfkill;
  1029. int ret;
  1030. rfkill = rfkill_alloc("bt_power", &pdev->dev, RFKILL_TYPE_BLUETOOTH,
  1031. &btpower_rfkill_ops,
  1032. pdev->dev.platform_data);
  1033. if (!rfkill) {
  1034. dev_err(&pdev->dev, "rfkill allocate failed\n");
  1035. return -ENOMEM;
  1036. }
  1037. /* add file into rfkill0 to handle LDO27 */
  1038. ret = device_create_file(&pdev->dev, &dev_attr_extldo);
  1039. if (ret < 0)
  1040. pr_err("%s: device create file error\n", __func__);
  1041. /* force Bluetooth off during init to allow for user control */
  1042. rfkill_init_sw_state(rfkill, 1);
  1043. previous = true;
  1044. ret = rfkill_register(rfkill);
  1045. if (ret) {
  1046. dev_err(&pdev->dev, "rfkill register failed=%d\n", ret);
  1047. rfkill_destroy(rfkill);
  1048. return ret;
  1049. }
  1050. platform_set_drvdata(pdev, rfkill);
  1051. return 0;
  1052. }
  1053. static void btpower_rfkill_remove(struct platform_device *pdev)
  1054. {
  1055. struct rfkill *rfkill;
  1056. pr_info("%s\n", __func__);
  1057. rfkill = platform_get_drvdata(pdev);
  1058. if (rfkill)
  1059. rfkill_unregister(rfkill);
  1060. rfkill_destroy(rfkill);
  1061. platform_set_drvdata(pdev, NULL);
  1062. }
  1063. static int dt_parse_vreg_info(struct device *dev, struct device_node *child,
  1064. struct vreg_data *vreg_data)
  1065. {
  1066. int len, ret = 0;
  1067. const __be32 *prop;
  1068. char prop_name[MAX_PROP_SIZE];
  1069. struct vreg_data *vreg = vreg_data;
  1070. struct device_node *np = child;
  1071. const char *vreg_name = vreg_data->name;
  1072. if (!child)
  1073. np = dev->of_node;
  1074. snprintf(prop_name, sizeof(prop_name), "%s-supply", vreg_name);
  1075. if (of_parse_phandle(np, prop_name, 0)) {
  1076. vreg->reg = regulator_get(dev, vreg_name);
  1077. if (IS_ERR(vreg->reg)) {
  1078. ret = PTR_ERR(vreg->reg);
  1079. vreg->reg = NULL;
  1080. pr_warn("%s: failed to get: %s error:%d\n", __func__,
  1081. vreg_name, ret);
  1082. return ret;
  1083. }
  1084. snprintf(prop_name, sizeof(prop_name), "%s-config", vreg->name);
  1085. prop = of_get_property(np, prop_name, &len);
  1086. if (!prop || len != (4 * sizeof(__be32))) {
  1087. pr_err("%s: Property %s %s, use default\n",
  1088. __func__, prop_name,
  1089. prop ? "invalid format" : "doesn't exist");
  1090. } else {
  1091. vreg->min_vol = be32_to_cpup(&prop[0]);
  1092. vreg->max_vol = be32_to_cpup(&prop[1]);
  1093. vreg->load_curr = be32_to_cpup(&prop[2]);
  1094. vreg->is_retention_supp = be32_to_cpup(&prop[3]);
  1095. }
  1096. pr_err("%s: Got regulator: %s, min_vol: %u, max_vol: %u, load_curr: %u, is_retention_supp: %u\n",
  1097. __func__, vreg->name, vreg->min_vol, vreg->max_vol,
  1098. vreg->load_curr, vreg->is_retention_supp);
  1099. } else {
  1100. pr_err("%s: %s is not provided in device tree\n", __func__,
  1101. vreg_name);
  1102. }
  1103. return ret;
  1104. }
  1105. static int bt_dt_parse_clk_info(struct device *dev,
  1106. struct bt_power_clk_data **clk_data)
  1107. {
  1108. int ret = -EINVAL;
  1109. struct bt_power_clk_data *clk = NULL;
  1110. struct device_node *np = dev->of_node;
  1111. pr_info("%s\n", __func__);
  1112. *clk_data = NULL;
  1113. if (of_parse_phandle(np, "clocks", 0)) {
  1114. clk = devm_kzalloc(dev, sizeof(*clk), GFP_KERNEL);
  1115. if (!clk) {
  1116. ret = -ENOMEM;
  1117. goto err;
  1118. }
  1119. /* Allocated 20 bytes size buffer for clock name string */
  1120. clk->name = devm_kzalloc(dev, 20, GFP_KERNEL);
  1121. /* Parse clock name from node */
  1122. ret = of_property_read_string_index(np, "clock-names", 0,
  1123. &(clk->name));
  1124. if (ret < 0) {
  1125. pr_err("%s: reading \"clock-names\" failed\n",
  1126. __func__);
  1127. return ret;
  1128. }
  1129. clk->clk = devm_clk_get(dev, clk->name);
  1130. if (IS_ERR(clk->clk)) {
  1131. ret = PTR_ERR(clk->clk);
  1132. pr_err("%s: failed to get %s, ret (%d)\n",
  1133. __func__, clk->name, ret);
  1134. clk->clk = NULL;
  1135. return ret;
  1136. }
  1137. *clk_data = clk;
  1138. } else {
  1139. pr_err("%s: clocks is not provided in device tree\n", __func__);
  1140. }
  1141. err:
  1142. return ret;
  1143. }
  1144. static void bt_power_vreg_put(void)
  1145. {
  1146. int i = 0;
  1147. struct vreg_data *bt_vregs = NULL;
  1148. int bt_num_vregs = pwr_data->bt_num_vregs;
  1149. for (; i < bt_num_vregs; i++) {
  1150. bt_vregs = &pwr_data->bt_vregs[i];
  1151. if (bt_vregs->reg)
  1152. regulator_put(bt_vregs->reg);
  1153. }
  1154. }
  1155. static int get_gpio_dt_pinfo(struct platform_device *pdev) {
  1156. int ret;
  1157. struct device_node *child;
  1158. child = pdev->dev.of_node;
  1159. pwr_data->bt_gpio_sys_rst =
  1160. of_get_named_gpio(child,
  1161. "qcom,bt-reset-gpio", 0);
  1162. if (pwr_data->bt_gpio_sys_rst < 0)
  1163. pr_err("bt-reset-gpio not provided in devicetree\n");
  1164. pwr_data->wl_gpio_sys_rst =
  1165. of_get_named_gpio(child,
  1166. "qcom,wl-reset-gpio", 0);
  1167. if (pwr_data->wl_gpio_sys_rst < 0)
  1168. pr_err("%s: wl-reset-gpio not provided in device tree\n",
  1169. __func__);
  1170. ret = of_property_read_u32(child, "mpm_wake_set_gpios",
  1171. &pwr_data->sw_cntrl_gpio);
  1172. if (ret)
  1173. pr_warn("sw_cntrl-gpio not provided in devicetree\n");
  1174. pwr_data->bt_gpio_sw_ctrl =
  1175. of_get_named_gpio(child,
  1176. "qcom,bt-sw-ctrl-gpio", 0);
  1177. if (pwr_data->bt_gpio_sw_ctrl < 0)
  1178. pr_err("bt-sw-ctrl-gpio not provided in devicetree\n");
  1179. pwr_data->bt_gpio_debug =
  1180. of_get_named_gpio(child,
  1181. "qcom,bt-debug-gpio", 0);
  1182. if (pwr_data->bt_gpio_debug < 0)
  1183. pr_warn("bt-debug-gpio not provided in devicetree\n");
  1184. pwr_data->xo_gpio_clk =
  1185. of_get_named_gpio(child,
  1186. "qcom,xo-clk-gpio", 0);
  1187. if (pwr_data->xo_gpio_clk < 0)
  1188. pr_warn("xo-clk-gpio not provided in devicetree\n");
  1189. #ifdef CONFIG_MSM_BT_OOBS
  1190. pwr_data->bt_gpio_dev_wake =
  1191. of_get_named_gpio(child,
  1192. "qcom,btwake_gpio", 0);
  1193. if (pwr_data->bt_gpio_dev_wake < 0)
  1194. pr_warn("%s: btwake-gpio not provided in device tree\n",
  1195. __func__);
  1196. pwr_data->bt_gpio_host_wake =
  1197. of_get_named_gpio(child,
  1198. "qcom,bthostwake_gpio", 0);
  1199. if (pwr_data->bt_gpio_host_wake < 0)
  1200. pr_warn("%s: bthostwake_gpio not provided in device tree\n",
  1201. __func__);
  1202. #endif
  1203. return true;
  1204. }
  1205. static int get_power_dt_pinfo(struct platform_device *pdev)
  1206. {
  1207. int rc, i;
  1208. const struct pwr_data *data;
  1209. data = of_device_get_match_data(&pdev->dev);
  1210. if (!data) {
  1211. pr_err("%s: failed to get dev node\n", __func__);
  1212. return -EINVAL;
  1213. }
  1214. memcpy(&pwr_data->compatible, &data->compatible, MAX_PROP_SIZE);
  1215. pwr_data->bt_vregs = data->bt_vregs;
  1216. pwr_data->bt_num_vregs = data->bt_num_vregs;
  1217. if (pwr_data->is_ganges_dt) {
  1218. pwr_data->uwb_vregs = data->uwb_vregs;
  1219. pwr_data->platform_vregs = data->platform_vregs;
  1220. pwr_data->uwb_num_vregs = data->uwb_num_vregs;
  1221. pwr_data->platform_num_vregs = data->platform_num_vregs;
  1222. pr_err("%s: bt_num_vregs =%d uwb_num_vregs =%d platform_num_vregs=%d\n",
  1223. __func__, pwr_data->bt_num_vregs, pwr_data->uwb_num_vregs,
  1224. pwr_data->platform_num_vregs);
  1225. } else {
  1226. pr_err("%s: bt_num_vregs =%d\n", __func__, pwr_data->bt_num_vregs);
  1227. }
  1228. for (i = 0; i < pwr_data->bt_num_vregs; i++) {
  1229. rc = dt_parse_vreg_info(&(pdev->dev), pwr_data->bt_of_node,
  1230. &pwr_data->bt_vregs[i]);
  1231. /* No point to go further if failed to get regulator handler */
  1232. if (rc)
  1233. return rc;
  1234. }
  1235. if(pwr_data->is_ganges_dt) {
  1236. for (i = 0; i < pwr_data->platform_num_vregs; i++) {
  1237. rc = dt_parse_vreg_info(&(pdev->dev), NULL,
  1238. &pwr_data->platform_vregs[i]);
  1239. /* No point to go further if failed to get regulator handler */
  1240. if (rc)
  1241. return rc;
  1242. }
  1243. for (i = 0; i < pwr_data->uwb_num_vregs; i++) {
  1244. rc = dt_parse_vreg_info(&(pdev->dev), pwr_data->uwb_of_node,
  1245. &pwr_data->uwb_vregs[i]);
  1246. /* No point to go further if failed to get regulator handler */
  1247. if (rc)
  1248. return rc;
  1249. }
  1250. }
  1251. return rc;
  1252. }
  1253. static int bt_power_populate_dt_pinfo(struct platform_device *pdev)
  1254. {
  1255. struct device_node *of_node;
  1256. int rc;
  1257. pr_info("%s\n", __func__);
  1258. if (!pwr_data)
  1259. return -ENOMEM;
  1260. if (pwr_data->is_ganges_dt) {
  1261. for_each_available_child_of_node(pdev->dev.of_node, of_node) {
  1262. if (!strcmp(of_node->name, "bt_ganges")) {
  1263. pwr_data->bt_of_node = of_node;
  1264. pr_err("%s: %s device node found\n", __func__,
  1265. pwr_data->bt_of_node->name);
  1266. } else if (!strcmp(of_node->name, "uwb_ganges")) {
  1267. pwr_data->uwb_of_node = of_node;
  1268. pr_err("%s: %s device node found\n", __func__,
  1269. pwr_data->uwb_of_node->name);
  1270. }
  1271. }
  1272. }
  1273. rc = get_power_dt_pinfo(pdev);
  1274. if (rc < 0)
  1275. pr_err("%s: failed to get the pin info from the DTSI\n",
  1276. __func__);
  1277. rc = get_gpio_dt_pinfo(pdev);
  1278. if (rc < 0)
  1279. pr_err("%s: failed to get the gpio info from the DTSI\n",
  1280. __func__);
  1281. bt_dt_parse_clk_info(&pdev->dev,
  1282. &pwr_data->bt_chip_clk);
  1283. pwr_data->power_setup = power_regulators;
  1284. return 0;
  1285. }
  1286. static inline bool bt_is_ganges_dt(struct platform_device *plat_dev)
  1287. {
  1288. return of_property_read_bool(plat_dev->dev.of_node, "qcom,peach-bt");
  1289. }
  1290. static void bt_power_pdc_init_params(struct platform_pwr_data *pdata) {
  1291. int ret;
  1292. struct device *dev = &pdata->pdev->dev;
  1293. pdata->pdc_init_table_len = of_property_count_strings(dev->of_node,
  1294. "qcom,pdc_init_table");
  1295. if (pdata->pdc_init_table_len > 0) {
  1296. pdata->pdc_init_table = kcalloc(pdata->pdc_init_table_len,
  1297. sizeof(char *), GFP_KERNEL);
  1298. ret = of_property_read_string_array(dev->of_node, "qcom,pdc_init_table",
  1299. pdata->pdc_init_table, pdata->pdc_init_table_len);
  1300. if (ret < 0)
  1301. pr_err("Failed to get PDC Init Table\n");
  1302. else
  1303. pr_err("PDC Init table configured\n");
  1304. } else {
  1305. pr_err("PDC Init Table not configured\n");
  1306. }
  1307. }
  1308. static void bt_signal_handler(struct work_struct *w_arg)
  1309. {
  1310. struct kernel_siginfo siginfo;
  1311. int rc = 0;
  1312. // Sending signal to HAL layer
  1313. memset(&siginfo, 0, sizeof(siginfo));
  1314. siginfo.si_signo = SIGIO;
  1315. siginfo.si_code = SI_QUEUE;
  1316. siginfo.si_int = pwr_data->wrkq_signal_state;
  1317. rc = send_sig_info(siginfo.si_signo, &siginfo, pwr_data->reftask_bt);
  1318. if (rc < 0) {
  1319. pr_err("%s: failed (%d) to send SIG to HAL(%d)\n", __func__,
  1320. rc, pwr_data->reftask_bt->pid);
  1321. return;
  1322. }
  1323. pr_err("%s Succesfull\n", __func__);
  1324. }
  1325. static void uwb_signal_handler(struct work_struct *w_arg)
  1326. {
  1327. struct kernel_siginfo siginfo;
  1328. int rc = 0;
  1329. // Sending signal to HAL layer
  1330. memset(&siginfo, 0, sizeof(siginfo));
  1331. siginfo.si_signo = SIGIO;
  1332. siginfo.si_code = SI_QUEUE;
  1333. siginfo.si_int = pwr_data->wrkq_signal_state;
  1334. rc = send_sig_info(siginfo.si_signo, &siginfo, pwr_data->reftask_uwb);
  1335. if (rc < 0) {
  1336. pr_err("%s: failed (%d) to send SIG to HAL(%d)\n", __func__,
  1337. rc, pwr_data->reftask_uwb->pid);
  1338. return;
  1339. }
  1340. pr_err("%s Succesfull\n", __func__);
  1341. }
  1342. static int bt_power_probe(struct platform_device *pdev)
  1343. {
  1344. int ret = 0;
  1345. int itr;
  1346. /* Fill whole array with -2 i.e NOT_AVAILABLE state by default
  1347. * for any GPIO or Reg handle.
  1348. */
  1349. for (itr = PWR_SRC_INIT_STATE_IDX; itr < BT_POWER_SRC_SIZE; ++itr) {
  1350. power_src.bt_state[itr] = PWR_SRC_NOT_AVAILABLE;
  1351. power_src.platform_state[itr] = PWR_SRC_NOT_AVAILABLE;
  1352. power_src.uwb_state[itr] = PWR_SRC_NOT_AVAILABLE;
  1353. }
  1354. pwr_data = kzalloc(sizeof(*pwr_data), GFP_KERNEL);
  1355. if (!pwr_data)
  1356. return -ENOMEM;
  1357. pwr_data->pdev = pdev;
  1358. pwr_data->is_ganges_dt = of_property_read_bool(pdev->dev.of_node,
  1359. "qcom,peach-bt");
  1360. pr_info("%s: is_ganges_dt = %d\n", __func__, pwr_data->is_ganges_dt);
  1361. pwr_data->workq = alloc_workqueue("workq", WQ_HIGHPRI, WQ_DFL_ACTIVE);
  1362. if (!pwr_data->workq) {
  1363. pr_err("%s: Failed to creat the Work Queue (workq)\n",
  1364. __func__);
  1365. return -ENOMEM;
  1366. }
  1367. INIT_WORK(&pwr_data->uwb_wq, uwb_signal_handler);
  1368. INIT_WORK(&pwr_data->bt_wq, bt_signal_handler);
  1369. INIT_WORK(&pwr_data->wq_pwr_voting, bt_power_vote);
  1370. for (itr = 0; itr < BTPWR_MAX_REQ; itr++)
  1371. init_waitqueue_head(&pwr_data->rsp_wait_q[itr]);
  1372. skb_queue_head_init(&pwr_data->rxq);
  1373. mutex_init(&pwr_data->pwr_mtx);
  1374. mutex_init(&pwr_data->btpower_state.state_machine_lock);
  1375. pwr_data->btpower_state.power_state = IDLE;
  1376. pwr_data->btpower_state.retention_mode = RETENTION_IDLE;
  1377. pwr_data->btpower_state.grant_state = NO_GRANT_FOR_ANY_SS;
  1378. pwr_data->btpower_state.grant_pending = NO_OTHER_CLIENT_WAITING_FOR_GRANT;
  1379. perisec_cnss_bt_hw_disable_check(pwr_data);
  1380. if (pdev->dev.of_node) {
  1381. ret = bt_power_populate_dt_pinfo(pdev);
  1382. if (ret < 0) {
  1383. pr_err("%s, Failed to populate device tree info\n",
  1384. __func__);
  1385. goto free_pdata;
  1386. }
  1387. if (pwr_data->bt_sec_hw_disable) {
  1388. pr_info("%s: bt is in secure mode\n", __func__);
  1389. } else {
  1390. pr_info(" %s:send platform data of btpower\n", __func__);
  1391. pdev->dev.platform_data = pwr_data;
  1392. }
  1393. } else if (pdev->dev.platform_data) {
  1394. /* Optional data set to default if not provided */
  1395. if (!((struct platform_pwr_data *)
  1396. (pdev->dev.platform_data))->power_setup)
  1397. ((struct platform_pwr_data *)
  1398. (pdev->dev.platform_data))->power_setup =
  1399. power_regulators;
  1400. memcpy(pwr_data, pdev->dev.platform_data,
  1401. sizeof(struct platform_pwr_data));
  1402. } else {
  1403. pr_err("%s: Failed to get platform data\n", __func__);
  1404. goto free_pdata;
  1405. }
  1406. if (btpower_rfkill_probe(pdev) < 0)
  1407. goto free_pdata;
  1408. bt_power_pdc_init_params(pwr_data);
  1409. btpower_aop_mbox_init(pwr_data);
  1410. probe_finished = true;
  1411. return 0;
  1412. free_pdata:
  1413. mutex_lock(&pwr_release);
  1414. kfree(pwr_data);
  1415. mutex_unlock(&pwr_release);
  1416. return ret;
  1417. }
  1418. static int bt_power_remove(struct platform_device *pdev)
  1419. {
  1420. mutex_lock(&pwr_release);
  1421. dev_dbg(&pdev->dev, "%s\n", __func__);
  1422. probe_finished = false;
  1423. btpower_rfkill_remove(pdev);
  1424. bt_power_vreg_put();
  1425. kfree(pwr_data);
  1426. mutex_unlock(&pwr_release);
  1427. return 0;
  1428. }
  1429. int btpower_register_slimdev(struct device *dev)
  1430. {
  1431. pr_info("%s\n", __func__);
  1432. if (!pwr_data || (dev == NULL)) {
  1433. pr_err("%s: Failed to allocate memory\n", __func__);
  1434. return -EINVAL;
  1435. }
  1436. pwr_data->slim_dev = dev;
  1437. return 0;
  1438. }
  1439. EXPORT_SYMBOL(btpower_register_slimdev);
  1440. int btpower_get_chipset_version(void)
  1441. {
  1442. pr_info("%s\n", __func__);
  1443. return soc_id;
  1444. }
  1445. EXPORT_SYMBOL(btpower_get_chipset_version);
  1446. static void set_pwr_srcs_status (struct vreg_data *handle, int core_type) {
  1447. int power_src_state;
  1448. if (!handle) {
  1449. pr_err("%s: invalid handler received \n", __func__);
  1450. return;
  1451. }
  1452. if (handle->is_enabled)
  1453. power_src_state = (int)regulator_get_voltage(handle->reg);
  1454. else
  1455. power_src_state = DEFAULT_INVALID_VALUE;
  1456. switch (core_type) {
  1457. case BT_CORE:
  1458. power_src.bt_state[handle->indx.crash] = power_src_state;
  1459. if (power_src_state != DEFAULT_INVALID_VALUE) {
  1460. pr_err("%s(%p) value(%d)\n", handle->name, handle,
  1461. power_src.bt_state[handle->indx.crash]);
  1462. } else {
  1463. pr_err("%s:%s is_enabled: %d\n", __func__, handle->name,
  1464. handle->is_enabled);
  1465. }
  1466. break;
  1467. case UWB_CORE:
  1468. power_src.uwb_state[handle->indx.crash] = power_src_state;
  1469. if (power_src_state != DEFAULT_INVALID_VALUE) {
  1470. pr_err("%s(%p) value(%d)\n", handle->name, handle,
  1471. power_src.uwb_state[handle->indx.crash]);
  1472. } else {
  1473. pr_err("%s:%s is_enabled: %d\n", __func__, handle->name,
  1474. handle->is_enabled);
  1475. }
  1476. break;
  1477. case PLATFORM_CORE:
  1478. power_src.platform_state[handle->indx.crash] = power_src_state;
  1479. if (power_src_state != DEFAULT_INVALID_VALUE) {
  1480. pr_err("%s(%p) value(%d)\n", handle->name, handle,
  1481. power_src.platform_state[handle->indx.crash]);
  1482. } else {
  1483. pr_err("%s:%s is_enabled: %d\n", __func__, handle->name,
  1484. handle->is_enabled);
  1485. }
  1486. break;
  1487. default:
  1488. pr_err("%s: invalid core type received = %d\n", __func__, core_type);
  1489. break;
  1490. }
  1491. }
  1492. static inline void update_pwr_state(int state)
  1493. {
  1494. mutex_lock(&pwr_data->btpower_state.state_machine_lock);
  1495. pwr_data->btpower_state.power_state = state;
  1496. mutex_unlock(&pwr_data->btpower_state.state_machine_lock);
  1497. }
  1498. static inline int get_pwr_state(void)
  1499. {
  1500. int state;
  1501. mutex_lock(&pwr_data->btpower_state.state_machine_lock);
  1502. state = (int)pwr_data->btpower_state.power_state;
  1503. mutex_unlock(&pwr_data->btpower_state.state_machine_lock);
  1504. return state;
  1505. }
  1506. static inline void btpower_set_retenion_mode_state(int state)
  1507. {
  1508. mutex_lock(&pwr_data->btpower_state.state_machine_lock);
  1509. pwr_data->btpower_state.retention_mode = state;
  1510. mutex_unlock(&pwr_data->btpower_state.state_machine_lock);
  1511. }
  1512. static inline int btpower_get_retenion_mode_state(void)
  1513. {
  1514. int state;
  1515. mutex_lock(&pwr_data->btpower_state.state_machine_lock);
  1516. state = (int)pwr_data->btpower_state.retention_mode;
  1517. mutex_unlock(&pwr_data->btpower_state.state_machine_lock);
  1518. return state;
  1519. }
  1520. static inline void btpower_set_grant_pending_state(enum grant_states state)
  1521. {
  1522. mutex_lock(&pwr_data->btpower_state.state_machine_lock);
  1523. pwr_data->btpower_state.grant_pending = state;
  1524. mutex_unlock(&pwr_data->btpower_state.state_machine_lock);
  1525. }
  1526. static inline enum grant_states btpower_get_grant_pending_state(void)
  1527. {
  1528. enum grant_states state;
  1529. mutex_lock(&pwr_data->btpower_state.state_machine_lock);
  1530. state = pwr_data->btpower_state.grant_pending;
  1531. mutex_unlock(&pwr_data->btpower_state.state_machine_lock);
  1532. return state;
  1533. }
  1534. static inline void btpower_set_grant_state(enum grant_states state)
  1535. {
  1536. mutex_lock(&pwr_data->btpower_state.state_machine_lock);
  1537. pwr_data->btpower_state.grant_state = state;
  1538. mutex_unlock(&pwr_data->btpower_state.state_machine_lock);
  1539. }
  1540. static inline enum grant_states btpower_get_grant_state(void)
  1541. {
  1542. enum grant_states state;
  1543. mutex_lock(&pwr_data->btpower_state.state_machine_lock);
  1544. state = pwr_data->btpower_state.grant_state;
  1545. mutex_unlock(&pwr_data->btpower_state.state_machine_lock);
  1546. return state;
  1547. }
  1548. static int get_sub_state(void)
  1549. {
  1550. return (int)pwr_data->sub_state;
  1551. }
  1552. static void update_sub_state(int state)
  1553. {
  1554. pwr_data->sub_state = state;
  1555. }
  1556. int power_enable (enum SubSystem SubSystemType)
  1557. {
  1558. int ret;
  1559. switch (get_pwr_state()) {
  1560. case IDLE:
  1561. ret = power_regulators(PLATFORM_CORE, POWER_ENABLE);
  1562. if (SubSystemType == BLUETOOTH) {
  1563. ret = power_regulators(BT_CORE, POWER_ENABLE);
  1564. update_pwr_state(BT_ON);
  1565. } else {
  1566. ret = power_regulators(UWB_CORE, POWER_ENABLE);
  1567. update_pwr_state(UWB_ON);
  1568. }
  1569. break;
  1570. case BT_ON:
  1571. if (SubSystemType == BLUETOOTH) {
  1572. pr_err("%s: BT Regulators already Voted-On\n",
  1573. __func__);
  1574. return 0;
  1575. }
  1576. ret = power_regulators(UWB_CORE, POWER_ENABLE);
  1577. update_pwr_state(ALL_CLIENTS_ON);
  1578. break;
  1579. case UWB_ON:
  1580. if (SubSystemType == UWB) {
  1581. pr_err("%s: UWB Regulators already Voted-On\n",
  1582. __func__);
  1583. return 0;
  1584. }
  1585. ret = power_regulators(BT_CORE, POWER_ENABLE);
  1586. update_pwr_state(ALL_CLIENTS_ON);
  1587. break;
  1588. case ALL_CLIENTS_ON:
  1589. pr_err("%s: Both BT and UWB Regulators already Voted-On\n",
  1590. __func__);
  1591. return 0;
  1592. }
  1593. return ret;
  1594. }
  1595. void send_signal_to_subsystem (int SubSystemType, int state) {
  1596. pwr_data->wrkq_signal_state = state;
  1597. if (SubSystemType == BLUETOOTH)
  1598. queue_work(pwr_data->workq, &pwr_data->bt_wq);
  1599. else
  1600. queue_work(pwr_data->workq, &pwr_data->uwb_wq);
  1601. }
  1602. int power_disable(enum SubSystem SubSystemType)
  1603. {
  1604. int ret = 0;
  1605. int ret_mode_state = btpower_get_retenion_mode_state();
  1606. enum grant_states grant_state = btpower_get_grant_state();
  1607. enum grant_states grant_pending = btpower_get_grant_pending_state();
  1608. switch (get_pwr_state()) {
  1609. case IDLE:
  1610. pr_err("%s: both BT and UWB regulators already voted-Off\n", __func__);
  1611. return 0;
  1612. case ALL_CLIENTS_ON:
  1613. if (SubSystemType == BLUETOOTH) {
  1614. ret = power_regulators(BT_CORE, POWER_DISABLE);
  1615. update_pwr_state(UWB_ON);
  1616. if (ret_mode_state == BOTH_CLIENTS_IN_RETENTION)
  1617. btpower_set_retenion_mode_state(UWB_IN_RETENTION);
  1618. else if (ret_mode_state == BT_IN_RETENTION)
  1619. btpower_set_retenion_mode_state(RETENTION_IDLE);
  1620. if (get_sub_state() == SSR_ON_BT) {
  1621. update_sub_state(SUB_STATE_IDLE);
  1622. send_signal_to_subsystem(UWB, BT_SSR_COMPLETED);
  1623. }
  1624. if (grant_state == BT_HAS_GRANT) {
  1625. if (grant_pending == UWB_WAITING_FOR_GRANT) {
  1626. send_signal_to_subsystem(UWB,
  1627. SIGIO_SOC_ACCESS_SIGNAL|(ACCESS_GRANTED + 1));
  1628. btpower_set_grant_state(UWB_HAS_GRANT);
  1629. } else {
  1630. btpower_set_grant_state(NO_GRANT_FOR_ANY_SS);
  1631. }
  1632. }
  1633. if (grant_pending == BT_WAITING_FOR_GRANT)
  1634. btpower_set_grant_pending_state(NO_OTHER_CLIENT_WAITING_FOR_GRANT);
  1635. } else {
  1636. ret = power_regulators(UWB_CORE, POWER_DISABLE);
  1637. update_pwr_state(BT_ON);
  1638. if (ret_mode_state == BOTH_CLIENTS_IN_RETENTION)
  1639. btpower_set_retenion_mode_state(BT_IN_RETENTION);
  1640. else if (ret_mode_state == UWB_IN_RETENTION)
  1641. btpower_set_retenion_mode_state(RETENTION_IDLE);
  1642. if (get_sub_state() == SSR_ON_UWB) {
  1643. send_signal_to_subsystem(BLUETOOTH,
  1644. (SIGIO_INTERACTION_SIGNAL|SIGIO_UWB_SSR_COMPLETED));
  1645. }
  1646. if (grant_state == UWB_HAS_GRANT) {
  1647. if (grant_pending == BT_WAITING_FOR_GRANT) {
  1648. send_signal_to_subsystem(BLUETOOTH,
  1649. SIGIO_SOC_ACCESS_SIGNAL|(ACCESS_GRANTED + 1));
  1650. btpower_set_grant_state(BT_HAS_GRANT);
  1651. } else {
  1652. btpower_set_grant_state(NO_GRANT_FOR_ANY_SS);
  1653. }
  1654. }
  1655. if (grant_pending == UWB_WAITING_FOR_GRANT)
  1656. btpower_set_grant_pending_state(NO_OTHER_CLIENT_WAITING_FOR_GRANT);
  1657. }
  1658. break;
  1659. case UWB_ON:
  1660. if (SubSystemType == BLUETOOTH) {
  1661. pr_err("%s: BT Regulator already Voted-Off\n", __func__);
  1662. return 0;
  1663. }
  1664. ret = power_regulators(UWB_CORE, POWER_DISABLE);
  1665. ret = power_regulators(PLATFORM_CORE, POWER_DISABLE);
  1666. update_pwr_state(IDLE);
  1667. update_sub_state(SUB_STATE_IDLE);
  1668. btpower_set_retenion_mode_state(RETENTION_IDLE);
  1669. btpower_set_grant_state(NO_GRANT_FOR_ANY_SS);
  1670. btpower_set_grant_pending_state(NO_OTHER_CLIENT_WAITING_FOR_GRANT);
  1671. break;
  1672. case BT_ON:
  1673. if (SubSystemType == UWB) {
  1674. pr_err("%s: UWB Regulator already Voted-Off\n", __func__);
  1675. return 0;
  1676. }
  1677. ret = power_regulators(BT_CORE, POWER_DISABLE);
  1678. ret = power_regulators(PLATFORM_CORE, POWER_DISABLE);
  1679. update_pwr_state(IDLE);
  1680. update_sub_state(SUB_STATE_IDLE);
  1681. btpower_set_retenion_mode_state(RETENTION_IDLE);
  1682. btpower_set_grant_state(NO_GRANT_FOR_ANY_SS);
  1683. btpower_set_grant_pending_state(NO_OTHER_CLIENT_WAITING_FOR_GRANT);
  1684. break;
  1685. }
  1686. return ret;
  1687. }
  1688. static int client_state_notified(int SubSystemType) {
  1689. if (get_sub_state() != SUB_STATE_IDLE) {
  1690. pr_err("%s: SSR is already running on other Sub-system\n", __func__);
  1691. return -1;
  1692. }
  1693. if (SubSystemType == BLUETOOTH) {
  1694. update_sub_state(SSR_ON_BT);
  1695. if (get_pwr_state() == ALL_CLIENTS_ON) {
  1696. if (!pwr_data->reftask_uwb) {
  1697. pr_err("%s: UWB PID is not register to send signal\n",
  1698. __func__);
  1699. return -1;
  1700. }
  1701. send_signal_to_subsystem(UWB, SSR_ON_BT);
  1702. }
  1703. } else {
  1704. update_sub_state(SSR_ON_UWB);
  1705. if (get_pwr_state() == ALL_CLIENTS_ON) {
  1706. if (!pwr_data->reftask_bt) {
  1707. pr_err("%s: BT PID is not register to send signal\n",
  1708. __func__);
  1709. return -1;
  1710. }
  1711. send_signal_to_subsystem(BLUETOOTH,
  1712. (SIGIO_INTERACTION_SIGNAL|SIGIO_SSR_ON_UWB));
  1713. }
  1714. }
  1715. return 0;
  1716. }
  1717. void btpower_register_client(int client, int cmd)
  1718. {
  1719. if (cmd == REG_BT_PID) {
  1720. pwr_data->reftask_bt = get_current();
  1721. pr_info("%s: Registering BT Service(PID-%d) with Power driver\n",
  1722. __func__, pwr_data->reftask_bt->tgid);
  1723. return;
  1724. } else if (cmd == REG_UWB_PID) {
  1725. pwr_data->reftask_uwb = get_current();
  1726. pr_info("%s: Registering UWB Service(PID-%d) with Power driver\n",
  1727. __func__, pwr_data->reftask_uwb->tgid);
  1728. return;
  1729. }
  1730. if (client == BLUETOOTH)
  1731. client_state_notified(BLUETOOTH);
  1732. else
  1733. client_state_notified(UWB);
  1734. }
  1735. void log_power_src_val(void)
  1736. {
  1737. int itr = 0;
  1738. power_src.platform_state[BT_SW_CTRL_GPIO_CURRENT] =
  1739. gpio_get_value(pwr_data->bt_gpio_sw_ctrl);
  1740. power_src.platform_state[BT_RESET_GPIO_CURRENT] =
  1741. gpio_get_value(pwr_data->bt_gpio_sys_rst);
  1742. for (itr = 0; itr < pwr_data->bt_num_vregs; itr++)
  1743. set_pwr_srcs_status(&pwr_data->bt_vregs[itr], BT_CORE);
  1744. for (itr = 0; itr < pwr_data->platform_num_vregs; itr++)
  1745. set_pwr_srcs_status(&pwr_data->platform_vregs[itr], PLATFORM_CORE);
  1746. for (itr = 0; itr < pwr_data->uwb_num_vregs; itr++)
  1747. set_pwr_srcs_status(&pwr_data->uwb_vregs[itr], UWB_CORE);
  1748. }
  1749. int btpower_retenion(enum plt_pwr_state client)
  1750. {
  1751. int ret;
  1752. int current_pwr_state = get_pwr_state();
  1753. int retention_mode_state = btpower_get_retenion_mode_state();
  1754. if (current_pwr_state == IDLE) {
  1755. pr_err("%s: invalid retention_mode request\n", __func__);
  1756. return -1;
  1757. }
  1758. ret = power_regulators((client == POWER_ON_BT_RETENION ? BT_CORE : UWB_CORE),
  1759. POWER_RETENTION);
  1760. if (ret < 0)
  1761. return ret;
  1762. if ((current_pwr_state == BT_ON || current_pwr_state == UWB_ON) &&
  1763. retention_mode_state == IDLE) {
  1764. ret = power_regulators(PLATFORM_CORE, POWER_RETENTION);
  1765. if (ret < 0)
  1766. return ret;
  1767. btpower_set_retenion_mode_state(client == POWER_ON_BT_RETENION ?
  1768. BT_IN_RETENTION: UWB_IN_RETENTION);
  1769. } else if (current_pwr_state == ALL_CLIENTS_ON &&
  1770. retention_mode_state == IDLE) {
  1771. btpower_set_retenion_mode_state(client == POWER_ON_BT_RETENION ?
  1772. BT_IN_RETENTION: UWB_IN_RETENTION);
  1773. } else if (current_pwr_state == ALL_CLIENTS_ON &&
  1774. (retention_mode_state == BT_IN_RETENTION ||
  1775. retention_mode_state == UWB_IN_RETENTION)) {
  1776. ret = power_regulators(PLATFORM_CORE, POWER_RETENTION);
  1777. if (ret < 0)
  1778. return ret;
  1779. btpower_set_retenion_mode_state(BOTH_CLIENTS_IN_RETENTION);
  1780. } else if (retention_mode_state == UWB_OUT_OF_RETENTION ||
  1781. retention_mode_state == BT_OUT_OF_RETENTION) {
  1782. ret = power_regulators(PLATFORM_CORE, POWER_RETENTION);
  1783. if (ret < 0)
  1784. return ret;
  1785. btpower_set_retenion_mode_state(BOTH_CLIENTS_IN_RETENTION);
  1786. }
  1787. return ret;
  1788. }
  1789. int btpower_off(enum plt_pwr_state client)
  1790. {
  1791. return power_disable((client == POWER_OFF_BT) ? BLUETOOTH : UWB);
  1792. }
  1793. int btpower_on(enum plt_pwr_state client)
  1794. {
  1795. int ret = 0;
  1796. int current_ssr_state = get_sub_state();
  1797. int retention_mode_state = btpower_get_retenion_mode_state();
  1798. if (retention_mode_state == UWB_IN_RETENTION ||
  1799. retention_mode_state == BT_IN_RETENTION) {
  1800. ret = platform_regulators_pwr(POWER_DISABLE_RETENTION);
  1801. if (ret < 0)
  1802. return ret;
  1803. if (retention_mode_state == BT_IN_RETENTION)
  1804. btpower_set_retenion_mode_state(BT_OUT_OF_RETENTION);
  1805. else
  1806. btpower_set_retenion_mode_state(UWB_OUT_OF_RETENTION);
  1807. }
  1808. /* No Point in going further if SSR is on any subsystem */
  1809. if (current_ssr_state != SUB_STATE_IDLE) {
  1810. pr_err("%s: %s not allowing to power on\n", __func__,
  1811. ConvertSsrStatusToString(current_ssr_state));
  1812. return -1;
  1813. }
  1814. ret = power_enable(client == POWER_ON_BT ? BLUETOOTH : UWB);
  1815. /* Return current state machine to clients */
  1816. if (!ret)
  1817. ret = (int)get_pwr_state();
  1818. return ret;
  1819. }
  1820. int STREAM_TO_UINT32(struct sk_buff *skb)
  1821. {
  1822. return (skb->data[0] | (skb->data[1] << 8) |
  1823. (skb->data[2] << 16) | (skb->data[3] << 24));
  1824. }
  1825. int btpower_access_ctrl(enum plt_pwr_state request)
  1826. {
  1827. enum grant_states grant_state = btpower_get_grant_state();
  1828. enum grant_states grant_pending = btpower_get_grant_pending_state();
  1829. int current_ssr_state = get_sub_state();
  1830. if (current_ssr_state != SUB_STATE_IDLE &&
  1831. (request == BT_ACCESS_REQ || request == UWB_ACCESS_REQ)) {
  1832. pr_err("%s: not allowing this request as %s\n", __func__,
  1833. ConvertSsrStatusToString(current_ssr_state));
  1834. return (int)ACCESS_DISALLOWED;
  1835. }
  1836. if ((grant_state == NO_GRANT_FOR_ANY_SS &&
  1837. grant_pending != NO_OTHER_CLIENT_WAITING_FOR_GRANT)) {
  1838. pr_err("%s: access ctrl gone for toss, resetting it back\n", __func__);
  1839. grant_pending = NO_OTHER_CLIENT_WAITING_FOR_GRANT;
  1840. btpower_set_grant_pending_state(NO_OTHER_CLIENT_WAITING_FOR_GRANT);
  1841. }
  1842. if (request == BT_ACCESS_REQ && grant_state == NO_GRANT_FOR_ANY_SS) {
  1843. btpower_set_grant_state(BT_HAS_GRANT);
  1844. return ACCESS_GRANTED;
  1845. } else if (request == UWB_ACCESS_REQ && grant_state == NO_GRANT_FOR_ANY_SS) {
  1846. btpower_set_grant_state(UWB_HAS_GRANT);
  1847. return ACCESS_GRANTED;
  1848. } else if (request == BT_ACCESS_REQ && grant_state == UWB_HAS_GRANT) {
  1849. btpower_set_grant_pending_state(BT_WAITING_FOR_GRANT);
  1850. return ACCESS_DENIED;
  1851. } else if (request == UWB_ACCESS_REQ && grant_state == BT_HAS_GRANT) {
  1852. btpower_set_grant_pending_state(UWB_WAITING_FOR_GRANT);
  1853. return ACCESS_DENIED;
  1854. } else if (request == BT_RELEASE_ACCESS && grant_state == BT_HAS_GRANT) {
  1855. if (grant_pending == UWB_WAITING_FOR_GRANT) {
  1856. if (!pwr_data->reftask_uwb) {
  1857. pr_err("%s: UWB service got killed\n", __func__);
  1858. } else {
  1859. send_signal_to_subsystem(UWB,
  1860. SIGIO_SOC_ACCESS_SIGNAL|(ACCESS_GRANTED + 1));
  1861. btpower_set_grant_state(UWB_HAS_GRANT);
  1862. }
  1863. btpower_set_grant_pending_state(NO_OTHER_CLIENT_WAITING_FOR_GRANT);
  1864. return ACCESS_RELEASED;
  1865. } else {
  1866. btpower_set_grant_state(NO_GRANT_FOR_ANY_SS);
  1867. btpower_set_grant_pending_state(NO_OTHER_CLIENT_WAITING_FOR_GRANT);
  1868. return ACCESS_RELEASED;
  1869. }
  1870. } else if (request == UWB_RELEASE_ACCESS && grant_state == UWB_HAS_GRANT) {
  1871. if (grant_pending == BT_WAITING_FOR_GRANT) {
  1872. if (!pwr_data->reftask_uwb) {
  1873. pr_err("%s: BT service got killed\n", __func__);
  1874. } else {
  1875. send_signal_to_subsystem(BLUETOOTH,
  1876. SIGIO_SOC_ACCESS_SIGNAL|(ACCESS_GRANTED+1));
  1877. btpower_set_grant_state(BT_HAS_GRANT);
  1878. }
  1879. } else {
  1880. btpower_set_grant_state(NO_GRANT_FOR_ANY_SS);
  1881. }
  1882. btpower_set_grant_pending_state(NO_OTHER_CLIENT_WAITING_FOR_GRANT);
  1883. return ACCESS_RELEASED;
  1884. } else {
  1885. pr_err("%s: unhandled event\n", __func__);
  1886. }
  1887. return ACCESS_DISALLOWED;
  1888. }
  1889. static void bt_power_vote(struct work_struct *work)
  1890. {
  1891. struct sk_buff *skb;
  1892. int request;
  1893. int ret;
  1894. while (1) {
  1895. mutex_lock(&pwr_data->pwr_mtx);
  1896. skb = skb_dequeue(&pwr_data->rxq);
  1897. if (!skb) {
  1898. mutex_unlock(&pwr_data->pwr_mtx);
  1899. break;
  1900. }
  1901. request = STREAM_TO_UINT32(skb);
  1902. skb_pull(skb, sizeof(uint32_t));
  1903. mutex_unlock(&pwr_data->pwr_mtx);
  1904. pr_info("%s: Start %s %s, %s state access %s pending %s\n",
  1905. __func__,
  1906. ConvertPowerStatusToString(get_pwr_state()),
  1907. ConvertSsrStatusToString(get_sub_state()),
  1908. ConvertRetentionModeToString(btpower_get_retenion_mode_state()),
  1909. ConvertGrantToString(btpower_get_grant_state()),
  1910. ConvertGrantToString(btpower_get_grant_pending_state()));
  1911. if (request == POWER_ON_BT || request == POWER_ON_UWB)
  1912. ret = btpower_on((enum plt_pwr_state)request);
  1913. else if (request == POWER_OFF_UWB || request == POWER_OFF_BT)
  1914. ret = btpower_off((enum plt_pwr_state)request);
  1915. else if (request == POWER_ON_BT_RETENION || request == POWER_ON_UWB_RETENION)
  1916. ret = btpower_retenion(request);
  1917. else if (request >= BT_ACCESS_REQ && request <= UWB_RELEASE_ACCESS) {
  1918. ret = btpower_access_ctrl(request);
  1919. pr_info("%s: grant status %s\n", __func__, ConvertGrantRetToString((int)ret));
  1920. }
  1921. pr_info("%s: Completed %s %s, %s state access %s pending %s\n",
  1922. __func__,
  1923. ConvertPowerStatusToString(get_pwr_state()),
  1924. ConvertSsrStatusToString(get_sub_state()),
  1925. ConvertRetentionModeToString(btpower_get_retenion_mode_state()),
  1926. ConvertGrantToString(btpower_get_grant_state()),
  1927. ConvertGrantToString(btpower_get_grant_pending_state()));
  1928. pwr_data->wait_status[request] = ret;
  1929. wake_up_interruptible(&pwr_data->rsp_wait_q[request]);
  1930. }
  1931. }
  1932. int schedule_client_voting(enum plt_pwr_state request)
  1933. {
  1934. struct sk_buff *skb;
  1935. wait_queue_head_t *rsp_wait_q;
  1936. int *status;
  1937. int ret = 0;
  1938. uint32_t req = (uint32_t)request;
  1939. mutex_lock(&pwr_data->pwr_mtx);
  1940. skb = alloc_skb(sizeof(uint32_t), GFP_KERNEL);
  1941. if (!skb) {
  1942. mutex_unlock(&pwr_data->pwr_mtx);
  1943. return -1;
  1944. }
  1945. rsp_wait_q = &pwr_data->rsp_wait_q[(u8)request];
  1946. status = &pwr_data->wait_status[(u8)request];
  1947. *status = PWR_WAITING_RSP;
  1948. skb_put_data(skb, &req, sizeof(uint32_t));
  1949. skb_queue_tail(&pwr_data->rxq, skb);
  1950. queue_work(system_highpri_wq, &pwr_data->wq_pwr_voting);
  1951. mutex_unlock(&pwr_data->pwr_mtx);
  1952. ret = wait_event_interruptible_timeout(*rsp_wait_q, (*status) != PWR_WAITING_RSP,
  1953. msecs_to_jiffies(BTPOWER_CONFIG_MAX_TIMEOUT));
  1954. pr_err("%s: %d\n", __func__, *status);
  1955. if (ret == 0) {
  1956. pr_err("%s: failed to vote %d due to timeout\n", __func__, request);
  1957. ret = -ETIMEDOUT;
  1958. } else {
  1959. ret = *status;
  1960. }
  1961. return ret;
  1962. }
  1963. char* GetUwbSecondaryCrashReason(enum UwbSecondaryReasonCode reason)
  1964. {
  1965. for(int i =0; i < (int)(sizeof(uwbSecReasonMap)/sizeof(UwbSecondaryReasonMap)); i++)
  1966. if (uwbSecReasonMap[i].reason == reason)
  1967. return uwbSecReasonMap[i].reasonstr;
  1968. return CRASH_REASON_NOT_FOUND;
  1969. }
  1970. char* GetUwbPrimaryCrashReason(enum UwbPrimaryReasonCode reason)
  1971. {
  1972. for(int i =0; i < (int)(sizeof(uwbPriReasonMap)/sizeof(UwbPrimaryReasonMap)); i++)
  1973. if (uwbPriReasonMap[i].reason == reason)
  1974. return uwbPriReasonMap[i].reasonstr;
  1975. return CRASH_REASON_NOT_FOUND;
  1976. }
  1977. const char *GetSourceSubsystemString(uint32_t source_subsystem)
  1978. {
  1979. switch (source_subsystem) {
  1980. case PERI_SS:
  1981. return "Peri SS";
  1982. case BT_SS:
  1983. return "BT SS";
  1984. case UWB_SS:
  1985. return "UWB SS";
  1986. default:
  1987. return "Unknown Subsystem";
  1988. }
  1989. }
  1990. int btpower_handle_client_request(unsigned int cmd, int arg)
  1991. {
  1992. int ret = -1;
  1993. pr_info("%s: Start of %s cmd request to %s.\n",
  1994. __func__,
  1995. (cmd == BT_CMD_PWR_CTRL ? "BT_CMD_PWR_CTRL" : "UWB_CMD_PWR_CTRL"),
  1996. ConvertClientReqToString(arg));
  1997. if (cmd == BT_CMD_PWR_CTRL) {
  1998. switch ((int)arg) {
  1999. case POWER_DISABLE:
  2000. ret = schedule_client_voting(POWER_OFF_BT);
  2001. break;
  2002. case POWER_ENABLE:
  2003. ret = schedule_client_voting(POWER_ON_BT);
  2004. break;
  2005. case POWER_RETENTION:
  2006. ret = schedule_client_voting(POWER_ON_BT_RETENION);
  2007. break;
  2008. }
  2009. } else if (cmd == UWB_CMD_PWR_CTRL) {
  2010. switch ((int)arg) {
  2011. case POWER_DISABLE:
  2012. ret = schedule_client_voting(POWER_OFF_UWB);
  2013. break;
  2014. case POWER_ENABLE:
  2015. ret = schedule_client_voting(POWER_ON_UWB);
  2016. break;
  2017. case POWER_RETENTION:
  2018. ret = schedule_client_voting(POWER_ON_UWB_RETENION);
  2019. break;
  2020. }
  2021. }
  2022. return ret;
  2023. }
  2024. int btpower_process_access_req(unsigned int cmd, int req)
  2025. {
  2026. int ret = -1;
  2027. pr_info("%s: by %s: request type %s\n", __func__,
  2028. cmd == BT_CMD_ACCESS_CTRL ? "BT_CMD_ACCESS_CTRL" : "UWB_CMD_ACCESS_CTRL",
  2029. req == 1 ? "Request" : "Release");
  2030. if (cmd == BT_CMD_ACCESS_CTRL && req == 1)
  2031. ret = schedule_client_voting(BT_ACCESS_REQ);
  2032. else if (cmd == BT_CMD_ACCESS_CTRL && req == 2)
  2033. ret = schedule_client_voting(BT_RELEASE_ACCESS);
  2034. else if (cmd == UWB_CMD_ACCESS_CTRL && req == 1)
  2035. ret = schedule_client_voting(UWB_ACCESS_REQ);
  2036. else if (cmd == UWB_CMD_ACCESS_CTRL && req == 2)
  2037. ret = schedule_client_voting(UWB_RELEASE_ACCESS);
  2038. else
  2039. pr_err("%s: unhandled command %04x req %02x", __func__, cmd, req);
  2040. return ret;
  2041. }
  2042. static long bt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  2043. {
  2044. int ret = 0;
  2045. int chipset_version = 0;
  2046. int itr;
  2047. unsigned long panic_reason = 0;
  2048. unsigned short primary_reason = 0, sec_reason = 0, source_subsystem = 0;
  2049. #ifdef CONFIG_MSM_BT_OOBS
  2050. enum btpower_obs_param clk_cntrl;
  2051. #endif
  2052. if (!pwr_data || !probe_finished) {
  2053. pr_err("%s: BTPower Probing Pending.Try Again\n", __func__);
  2054. return -EAGAIN;
  2055. }
  2056. switch (cmd) {
  2057. #ifdef CONFIG_MSM_BT_OOBS
  2058. case BT_CMD_OBS_VOTE_CLOCK:
  2059. if (!gpio_is_valid(pwr_data->bt_gpio_dev_wake)) {
  2060. pr_err("%s: BT_CMD_OBS_VOTE_CLOCK bt_dev_wake_n(%d) not configured\n",
  2061. __func__, pwr_data->bt_gpio_dev_wake);
  2062. return -EIO;
  2063. }
  2064. clk_cntrl = (enum btpower_obs_param)arg;
  2065. switch (clk_cntrl) {
  2066. case BTPOWER_OBS_CLK_OFF:
  2067. btpower_uart_transport_locked(pwr_data, false);
  2068. ret = 0;
  2069. break;
  2070. case BTPOWER_OBS_CLK_ON:
  2071. btpower_uart_transport_locked(pwr_data, true);
  2072. ret = 0;
  2073. break;
  2074. case BTPOWER_OBS_DEV_OFF:
  2075. gpio_set_value(pwr_data->bt_gpio_dev_wake, 0);
  2076. ret = 0;
  2077. break;
  2078. case BTPOWER_OBS_DEV_ON:
  2079. gpio_set_value(pwr_data->bt_gpio_dev_wake, 1);
  2080. ret = 0;
  2081. break;
  2082. default:
  2083. pr_err("%s: BT_CMD_OBS_VOTE_CLOCK clk_cntrl(%d)\n",
  2084. __func__, clk_cntrl);
  2085. return -EINVAL;
  2086. }
  2087. pr_err("%s: BT_CMD_OBS_VOTE_CLOCK clk_cntrl(%d) %s\n",
  2088. __func__, clk_cntrl,
  2089. gpio_get_value(pwr_data->bt_gpio_dev_wake) ?
  2090. "Assert" : "Deassert");
  2091. break;
  2092. #endif
  2093. case BT_CMD_SLIM_TEST:
  2094. #if (defined CONFIG_BT_SLIM)
  2095. if (!pwr_data->slim_dev) {
  2096. pr_err("%s: slim_dev is null\n", __func__);
  2097. return -EINVAL;
  2098. }
  2099. ret = btfm_slim_hw_init(
  2100. pwr_data->slim_dev->platform_data
  2101. );
  2102. #endif
  2103. break;
  2104. case BT_CMD_PWR_CTRL:
  2105. case UWB_CMD_PWR_CTRL: {
  2106. ret = btpower_handle_client_request(cmd, (int)arg);
  2107. break;
  2108. }
  2109. case BT_CMD_REGISTRATION:
  2110. btpower_register_client(BLUETOOTH, (int)arg);
  2111. break;
  2112. case UWB_CMD_REGISTRATION:
  2113. btpower_register_client(UWB, (int)arg);
  2114. break;
  2115. case BT_CMD_ACCESS_CTRL:
  2116. case UWB_CMD_ACCESS_CTRL: {
  2117. ret = btpower_process_access_req(cmd, (int)arg);
  2118. break;
  2119. }
  2120. case BT_CMD_CHIPSET_VERS:
  2121. chipset_version = (int)arg;
  2122. pr_warn("%s: unified Current SOC Version : %x\n", __func__,
  2123. chipset_version);
  2124. if (chipset_version) {
  2125. soc_id = chipset_version;
  2126. } else {
  2127. pr_err("%s: got invalid soc version\n", __func__);
  2128. soc_id = 0;
  2129. }
  2130. break;
  2131. case BT_CMD_GET_CHIPSET_ID:
  2132. pr_err("%s: BT_CMD_GET_CHIPSET_ID = %s\n", __func__,
  2133. pwr_data->compatible);
  2134. if (copy_to_user((void __user *)arg, pwr_data->compatible,
  2135. MAX_PROP_SIZE)) {
  2136. pr_err("%s: copy to user failed\n", __func__);
  2137. ret = -EFAULT;
  2138. }
  2139. break;
  2140. case BT_CMD_CHECK_SW_CTRL:
  2141. /* Check if SW_CTRL is asserted */
  2142. pr_err("BT_CMD_CHECK_SW_CTRL\n");
  2143. if (pwr_data->bt_gpio_sw_ctrl > 0) {
  2144. power_src.bt_state[BT_SW_CTRL_GPIO] =
  2145. DEFAULT_INVALID_VALUE;
  2146. ret = gpio_direction_input(
  2147. pwr_data->bt_gpio_sw_ctrl);
  2148. if (ret) {
  2149. pr_err("%s:gpio_direction_input api\n",
  2150. __func__);
  2151. pr_err("%s:failed for SW_CTRL:%d\n",
  2152. __func__, ret);
  2153. } else {
  2154. power_src.bt_state[BT_SW_CTRL_GPIO] =
  2155. gpio_get_value(
  2156. pwr_data->bt_gpio_sw_ctrl);
  2157. pr_err("bt-sw-ctrl-gpio(%d) value(%d)\n",
  2158. pwr_data->bt_gpio_sw_ctrl,
  2159. power_src.bt_state[BT_SW_CTRL_GPIO]);
  2160. }
  2161. } else {
  2162. pr_err("bt_gpio_sw_ctrl not configured\n");
  2163. return -EINVAL;
  2164. }
  2165. break;
  2166. case BT_CMD_GETVAL_POWER_SRCS:
  2167. pr_err("BT_CMD_GETVAL_POWER_SRCS\n");
  2168. power_src.platform_state[BT_SW_CTRL_GPIO_CURRENT] =
  2169. gpio_get_value(pwr_data->bt_gpio_sw_ctrl);
  2170. power_src.platform_state[BT_RESET_GPIO_CURRENT] =
  2171. gpio_get_value(pwr_data->bt_gpio_sys_rst);
  2172. for (itr = 0; itr < pwr_data->bt_num_vregs; itr++)
  2173. set_pwr_srcs_status(&pwr_data->bt_vregs[itr], BT_CORE);
  2174. for (itr = 0; itr < pwr_data->platform_num_vregs; itr++)
  2175. set_pwr_srcs_status(&pwr_data->platform_vregs[itr], PLATFORM_CORE);
  2176. for (itr = 0; itr < pwr_data->uwb_num_vregs; itr++)
  2177. set_pwr_srcs_status(&pwr_data->uwb_vregs[itr], UWB_CORE);
  2178. if (copy_to_user((void __user *)arg, &power_src, sizeof(power_src))) {
  2179. pr_err("%s: copy to user failed\n", __func__);
  2180. ret = -EFAULT;
  2181. }
  2182. break;
  2183. case BT_CMD_SET_IPA_TCS_INFO:
  2184. pr_err("%s: BT_CMD_SET_IPA_TCS_INFO\n", __func__);
  2185. btpower_enable_ipa_vreg(pwr_data);
  2186. break;
  2187. case BT_CMD_KERNEL_PANIC:
  2188. pr_err("%s: BT_CMD_KERNEL_PANIC\n", __func__);
  2189. if (copy_from_user(&CrashInfo, (char *)arg, sizeof(CrashInfo))) {
  2190. pr_err("%s: copy to user failed\n", __func__);
  2191. ret = -EFAULT;
  2192. }
  2193. pr_err("%s: BT kernel panic Primary reason = %s, Secondary reason = %s\n",
  2194. __func__, CrashInfo.PrimaryReason, CrashInfo.SecondaryReason);
  2195. panic("%s: BT kernel panic Primary reason = %s, Secondary reason = %s\n",
  2196. __func__, CrashInfo.PrimaryReason, CrashInfo.SecondaryReason);
  2197. break;
  2198. case UWB_CMD_KERNEL_PANIC:
  2199. pr_err("%s: UWB_CMD_KERNEL_PANIC\n", __func__);
  2200. panic_reason = arg;
  2201. primary_reason = panic_reason & 0xFFFF;
  2202. sec_reason = (panic_reason & 0xFFFF0000) >> 16;
  2203. source_subsystem = (panic_reason & 0xFFFF00000000) >> 32;
  2204. pr_err("%s: UWB kernel panic PrimaryReason = (0x%02x)[%s] | SecondaryReason = (0x%02x)[%s] | SourceSubsystem = (0x%02x)[%s]\n",
  2205. __func__, primary_reason, GetUwbPrimaryCrashReason(primary_reason),
  2206. sec_reason, GetUwbSecondaryCrashReason(sec_reason),
  2207. source_subsystem, GetSourceSubsystemString(source_subsystem));
  2208. panic("%s: UWB kernel panic PrimaryReason = (0x%02x)[%s] | SecondaryReason = (0x%02x)[%s] | SourceSubsystem = (0x%02x)[%s]\n",
  2209. __func__, primary_reason, GetUwbPrimaryCrashReason(primary_reason),
  2210. sec_reason, GetUwbSecondaryCrashReason(sec_reason),
  2211. source_subsystem, GetSourceSubsystemString(source_subsystem));
  2212. break;
  2213. default:
  2214. return -ENOIOCTLCMD;
  2215. }
  2216. return ret;
  2217. }
  2218. static int bt_power_release(struct inode *inode, struct file *file)
  2219. {
  2220. mutex_lock(&pwr_release);
  2221. if (!pwr_data || !probe_finished) {
  2222. pr_err("%s: BTPower Probing Pending.Try Again\n", __func__);
  2223. return -EAGAIN;
  2224. }
  2225. pwr_data->reftask = get_current();
  2226. if (pwr_data->reftask_bt != NULL) {
  2227. if (pwr_data->reftask->tgid == pwr_data->reftask_bt->tgid)
  2228. {
  2229. pr_err("%s called by BT service(PID-%d)\n",
  2230. __func__, pwr_data->reftask->tgid);
  2231. /*
  2232. if(get_pwr_state() == BT_ON)
  2233. {
  2234. bt_regulators_pwr(POWER_DISABLE);
  2235. platform_regulators_pwr(POWER_DISABLE);
  2236. update_pwr_state(IDLE);
  2237. }
  2238. else if (get_pwr_state() == ALL_CLIENTS_ON)
  2239. {
  2240. bt_regulators_pwr(POWER_DISABLE);
  2241. update_pwr_state(UWB_ON);
  2242. }
  2243. */
  2244. }
  2245. } else if (pwr_data->reftask_uwb != NULL) {
  2246. if (pwr_data->reftask->tgid == pwr_data->reftask_uwb->tgid)
  2247. {
  2248. pr_err("%s called by uwb service(PID-%d)\n",
  2249. __func__, pwr_data->reftask->tgid);
  2250. /*
  2251. if(get_pwr_state() == UWB_ON)
  2252. {
  2253. uwb_regulators_pwr(POWER_DISABLE);
  2254. platform_regulators_pwr(POWER_DISABLE);
  2255. update_pwr_state(IDLE);
  2256. }
  2257. else if (get_pwr_state() == ALL_CLIENTS_ON)
  2258. {
  2259. uwb_regulators_pwr(POWER_DISABLE);
  2260. update_pwr_state(BT_ON);
  2261. }
  2262. */
  2263. }
  2264. }
  2265. mutex_unlock(&pwr_release);
  2266. return 0;
  2267. }
  2268. static struct platform_driver bt_power_driver = {
  2269. .probe = bt_power_probe,
  2270. .remove = bt_power_remove,
  2271. .driver = {
  2272. .name = "bt_power",
  2273. .of_match_table = bt_power_match_table,
  2274. },
  2275. };
  2276. static const struct file_operations bt_dev_fops = {
  2277. .unlocked_ioctl = bt_ioctl,
  2278. .compat_ioctl = bt_ioctl,
  2279. .release = bt_power_release,
  2280. };
  2281. static int __init btpower_init(void)
  2282. {
  2283. int ret = 0;
  2284. probe_finished = false;
  2285. ret = platform_driver_register(&bt_power_driver);
  2286. if (ret) {
  2287. pr_err("%s: platform_driver_register error: %d\n",
  2288. __func__, ret);
  2289. goto driver_err;
  2290. }
  2291. bt_major = register_chrdev(0, "bt", &bt_dev_fops);
  2292. if (bt_major < 0) {
  2293. pr_err("%s: failed to allocate char dev\n", __func__);
  2294. ret = -1;
  2295. goto chrdev_err;
  2296. }
  2297. bt_class = class_create(THIS_MODULE, "bt-dev");
  2298. if (IS_ERR(bt_class)) {
  2299. pr_err("%s: coudn't create class\n", __func__);
  2300. ret = -1;
  2301. goto class_err;
  2302. }
  2303. if (device_create(bt_class, NULL, MKDEV(bt_major, 0),
  2304. NULL, "btpower") == NULL) {
  2305. pr_err("%s: failed to allocate char dev\n", __func__);
  2306. goto device_err;
  2307. }
  2308. mutex_init(&pwr_release);
  2309. return 0;
  2310. device_err:
  2311. class_destroy(bt_class);
  2312. class_err:
  2313. unregister_chrdev(bt_major, "bt");
  2314. chrdev_err:
  2315. platform_driver_unregister(&bt_power_driver);
  2316. driver_err:
  2317. return ret;
  2318. }
  2319. /**
  2320. * bt_aop_send_msg: Sends json message to AOP using QMP
  2321. * @plat_priv: Pointer to cnss platform data
  2322. * @msg: String in json format
  2323. *
  2324. * AOP accepts JSON message to configure WLAN/BT resources. Format as follows:
  2325. * To send VReg config: {class: wlan_pdc, ss: <pdc_name>,
  2326. * res: <VReg_name>.<param>, <seq_param>: <value>}
  2327. * To send PDC Config: {class: wlan_pdc, ss: <pdc_name>, res: pdc,
  2328. * enable: <Value>}
  2329. * QMP returns timeout error if format not correct or AOP operation fails.
  2330. *
  2331. * Return: 0 for success
  2332. */
  2333. int bt_aop_send_msg(struct platform_pwr_data *plat_priv, char *mbox_msg)
  2334. {
  2335. struct qmp_pkt pkt;
  2336. int ret = 0;
  2337. pkt.size = BTPOWER_MBOX_MSG_MAX_LEN;
  2338. pkt.data = mbox_msg;
  2339. pr_err("%s: %s\n", __func__, mbox_msg);
  2340. ret = mbox_send_message(plat_priv->mbox_chan, &pkt);
  2341. if (ret < 0)
  2342. pr_err("Failed to send AOP mbox msg: %s\n", mbox_msg);
  2343. else
  2344. ret =0;
  2345. return ret;
  2346. }
  2347. int bt_aop_pdc_reconfig(struct platform_pwr_data *pdata)
  2348. {
  2349. unsigned int i;
  2350. int ret;
  2351. if (pdata->pdc_init_table_len <= 0 || !pdata->pdc_init_table)
  2352. return 0;
  2353. pr_err("Setting PDC defaults\n");
  2354. for (i = 0; i < pdata->pdc_init_table_len; i++) {
  2355. ret =bt_aop_send_msg(pdata,(char *)pdata->pdc_init_table[i]);
  2356. if (ret < 0)
  2357. break;
  2358. }
  2359. return ret;
  2360. }
  2361. int btpower_aop_mbox_init(struct platform_pwr_data *pdata)
  2362. {
  2363. struct mbox_client *mbox = &pdata->mbox_client_data;
  2364. struct mbox_chan *chan;
  2365. int ret = 0;
  2366. mbox->dev = &pdata->pdev->dev;
  2367. mbox->tx_block = true;
  2368. mbox->tx_tout = BTPOWER_MBOX_TIMEOUT_MS;
  2369. mbox->knows_txdone = false;
  2370. pdata->mbox_chan = NULL;
  2371. chan = mbox_request_channel(mbox, 0);
  2372. if (IS_ERR(chan)) {
  2373. pr_err("%s: failed to get mbox channel\n", __func__);
  2374. return PTR_ERR(chan);
  2375. }
  2376. pdata->mbox_chan = chan;
  2377. ret = of_property_read_string(pdata->pdev->dev.of_node,
  2378. "qcom,vreg_ipa",
  2379. &pdata->vreg_ipa);
  2380. if (ret)
  2381. pr_err("%s: vreg for iPA not configured\n", __func__);
  2382. else
  2383. pr_err("%s: Mbox channel initialized\n", __func__);
  2384. ret = bt_aop_pdc_reconfig(pdata);
  2385. if (ret)
  2386. pr_err("Failed to reconfig BT WLAN PDC, err = %d\n", ret);
  2387. return 0;
  2388. }
  2389. static int btpower_aop_set_vreg_param(struct platform_pwr_data *pdata,
  2390. const char *vreg_name,
  2391. enum btpower_vreg_param param,
  2392. enum btpower_tcs_seq seq, int val)
  2393. {
  2394. struct qmp_pkt pkt;
  2395. char mbox_msg[BTPOWER_MBOX_MSG_MAX_LEN];
  2396. static const char * const vreg_param_str[] = {"v", "m", "e"};
  2397. static const char *const tcs_seq_str[] = {"upval", "dwnval", "enable"};
  2398. int ret = 0;
  2399. if (param > BTPOWER_VREG_ENABLE || seq > BTPOWER_TCS_ALL_SEQ || !vreg_name)
  2400. return -EINVAL;
  2401. snprintf(mbox_msg, BTPOWER_MBOX_MSG_MAX_LEN,
  2402. "{class: wlan_pdc, res: %s.%s, %s: %d}", vreg_name,
  2403. vreg_param_str[param], tcs_seq_str[seq], val);
  2404. pr_err("%s: sending AOP Mbox msg: %s\n", __func__, mbox_msg);
  2405. pkt.size = BTPOWER_MBOX_MSG_MAX_LEN;
  2406. pkt.data = mbox_msg;
  2407. ret = mbox_send_message(pdata->mbox_chan, &pkt);
  2408. if (ret < 0)
  2409. pr_err("%s:Failed to send AOP mbox msg(%s), err(%d)\n",
  2410. __func__, mbox_msg, ret);
  2411. return ret;
  2412. }
  2413. static int btpower_enable_ipa_vreg(struct platform_pwr_data *pdata)
  2414. {
  2415. int ret = 0;
  2416. static bool config_done;
  2417. if (config_done) {
  2418. pr_err("%s: IPA Vreg already configured\n", __func__);
  2419. return 0;
  2420. }
  2421. if (!pdata->vreg_ipa || !pdata->mbox_chan) {
  2422. pr_err("%s: mbox/iPA vreg not configured\n", __func__);
  2423. } else {
  2424. ret = btpower_aop_set_vreg_param(pdata,
  2425. pdata->vreg_ipa,
  2426. BTPOWER_VREG_ENABLE,
  2427. BTPOWER_TCS_UP_SEQ, 1);
  2428. if (ret >= 0) {
  2429. pr_err("%s:Enabled iPA\n", __func__);
  2430. config_done = true;
  2431. }
  2432. }
  2433. return ret;
  2434. }
  2435. static void __exit btpower_exit(void)
  2436. {
  2437. platform_driver_unregister(&bt_power_driver);
  2438. }
  2439. MODULE_LICENSE("GPL v2");
  2440. MODULE_DESCRIPTION("MSM Bluetooth power control driver");
  2441. module_init(btpower_init);
  2442. module_exit(btpower_exit);