btpower.c 76 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779
  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. if (pwr_data->sw_cntrl_gpio > 0) {
  627. rc = msm_gpio_mpm_wake_set(pwr_data->sw_cntrl_gpio, 1);
  628. if (rc < 0) {
  629. pr_err("Failed to set msm_gpio_mpm_wake_set for sw_cntrl gpio, ret: %d\n",
  630. rc);
  631. return rc;
  632. }
  633. pr_err("Set msm_gpio_mpm_wake_set for sw_cntrl gpio successful\n");
  634. }
  635. pr_err("BTON:Turn Bt OFF bt-sw-ctrl-gpio(%d) value(%d)\n",
  636. bt_sw_ctrl_gpio,
  637. power_src.platform_state[BT_SW_CTRL_GPIO]);
  638. }
  639. if (wl_reset_gpio >= 0)
  640. pr_err("BTON:Turn Bt ON wl-reset-gpio(%d) value(%d)\n",
  641. wl_reset_gpio, gpio_get_value(wl_reset_gpio));
  642. if ((wl_reset_gpio < 0) ||
  643. ((wl_reset_gpio >= 0) && gpio_get_value(wl_reset_gpio))) {
  644. btpower_set_xo_clk_gpio_state(true);
  645. pr_err("BTON: WLAN ON Asserting BT_EN to high\n");
  646. rc = gpio_direction_output(bt_reset_gpio, 1);
  647. if (rc) {
  648. pr_err("%s: Unable to set direction\n", __func__);
  649. return rc;
  650. }
  651. power_src.platform_state[BT_RESET_GPIO] =
  652. gpio_get_value(bt_reset_gpio);
  653. btpower_set_xo_clk_gpio_state(false);
  654. }
  655. if ((wl_reset_gpio >= 0) && (gpio_get_value(wl_reset_gpio) == 0)) {
  656. if (gpio_get_value(bt_reset_gpio)) {
  657. pr_err("BTON: WLAN OFF and BT ON are too close\n");
  658. pr_err("reset BT_EN, enable it after delay\n");
  659. rc = gpio_direction_output(bt_reset_gpio, 0);
  660. if (rc) {
  661. pr_err("%s: Unable to set direction\n",
  662. __func__);
  663. return rc;
  664. }
  665. power_src.platform_state[BT_RESET_GPIO] =
  666. gpio_get_value(bt_reset_gpio);
  667. }
  668. pr_err("BTON: WLAN OFF waiting for 100ms delay\n");
  669. pr_err("for AON output to fully discharge\n");
  670. msleep(100);
  671. pr_err("BTON: WLAN OFF Asserting BT_EN to high\n");
  672. btpower_set_xo_clk_gpio_state(true);
  673. rc = gpio_direction_output(bt_reset_gpio, 1);
  674. if (rc) {
  675. pr_err("%s: Unable to set direction\n", __func__);
  676. return rc;
  677. }
  678. power_src.platform_state[BT_RESET_GPIO] =
  679. gpio_get_value(bt_reset_gpio);
  680. btpower_set_xo_clk_gpio_state(false);
  681. }
  682. /* Below block of code executes if WL_EN is pulled high when
  683. * BT_EN is about to pull high. so above two if conditions are
  684. * not executed.
  685. */
  686. if (!gpio_get_value(bt_reset_gpio)) {
  687. btpower_set_xo_clk_gpio_state(true);
  688. pr_err("BTON: WLAN ON and BT ON are too close\n");
  689. pr_err("Asserting BT_EN to high\n");
  690. rc = gpio_direction_output(bt_reset_gpio, 1);
  691. if (rc) {
  692. pr_err("%s: Unable to set direction\n", __func__);
  693. return rc;
  694. }
  695. power_src.platform_state[BT_RESET_GPIO] =
  696. gpio_get_value(bt_reset_gpio);
  697. btpower_set_xo_clk_gpio_state(false);
  698. }
  699. msleep(50);
  700. #ifdef CONFIG_MSM_BT_OOBS
  701. bt_configure_wakeup_gpios(on);
  702. #endif
  703. /* Check if SW_CTRL is asserted */
  704. if (bt_sw_ctrl_gpio >= 0) {
  705. rc = gpio_direction_input(bt_sw_ctrl_gpio);
  706. if (rc) {
  707. pr_err("%s:SWCTRL Dir Set Problem:%d\n",
  708. __func__, rc);
  709. } else if (!gpio_get_value(bt_sw_ctrl_gpio)) {
  710. /* SW_CTRL not asserted, assert debug GPIO */
  711. if (bt_debug_gpio >= 0)
  712. assert_dbg_gpio = 1;
  713. }
  714. }
  715. if (assert_dbg_gpio) {
  716. rc = gpio_request(bt_debug_gpio, "bt_debug_n");
  717. if (rc) {
  718. pr_err("unable to request Debug Gpio\n");
  719. } else {
  720. rc = gpio_direction_output(bt_debug_gpio, 1);
  721. if (rc)
  722. pr_err("%s:Prob Set Debug-Gpio\n",
  723. __func__);
  724. }
  725. }
  726. pr_err("BTON:Turn Bt On bt-reset-gpio(%d) value(%d)\n",
  727. bt_reset_gpio, gpio_get_value(bt_reset_gpio));
  728. if (bt_sw_ctrl_gpio >= 0) {
  729. power_src.platform_state[BT_SW_CTRL_GPIO] =
  730. gpio_get_value(bt_sw_ctrl_gpio);
  731. pr_err("BTON: Turn BT ON bt-sw-ctrl-gpio(%d) value(%d)\n",
  732. bt_sw_ctrl_gpio,
  733. power_src.platform_state[BT_SW_CTRL_GPIO]);
  734. }
  735. } else {
  736. #ifdef CONFIG_MSM_BT_OOBS
  737. bt_configure_wakeup_gpios(on);
  738. #endif
  739. gpio_set_value(bt_reset_gpio, 0);
  740. msleep(100);
  741. pr_err("BT-OFF:bt-reset-gpio(%d) value(%d)\n",
  742. bt_reset_gpio, gpio_get_value(bt_reset_gpio));
  743. if (bt_sw_ctrl_gpio >= 0) {
  744. pr_err("BT-OFF:bt-sw-ctrl-gpio(%d) value(%d)\n",
  745. bt_sw_ctrl_gpio,
  746. gpio_get_value(bt_sw_ctrl_gpio));
  747. }
  748. }
  749. pr_err("%s: bt_gpio= %d on: %d\n", __func__, bt_reset_gpio, on);
  750. return rc;
  751. }
  752. static int bt_regulators_pwr(int pwr_state)
  753. {
  754. int i, log_indx, bt_num_vregs, rc = 0;
  755. struct vreg_data *bt_vregs = NULL;
  756. rc = perisec_cnss_bt_hw_disable_check(pwr_data);
  757. bt_num_vregs = pwr_data->bt_num_vregs;
  758. if (!bt_num_vregs) {
  759. pr_warn("%s: not avilable to %s\n",
  760. __func__, ConvertRegisterModeToString(pwr_state));
  761. return 0;
  762. }
  763. pr_info("%s: %s\n", __func__, ConvertRegisterModeToString(pwr_state));
  764. if (pwr_state == POWER_ENABLE) {
  765. /* Power On */
  766. if (pwr_data->bt_sec_hw_disable) {
  767. pr_err("%s:secure hw mode on,BT ON not allowed",
  768. __func__);
  769. return -EINVAL;
  770. }
  771. for (i = 0; i < bt_num_vregs; i++) {
  772. bt_vregs = &pwr_data->bt_vregs[i];
  773. log_indx = bt_vregs->indx.init;
  774. if (bt_vregs->reg) {
  775. power_src.bt_state[log_indx] = DEFAULT_INVALID_VALUE;
  776. rc = vreg_enable(bt_vregs);
  777. if (rc < 0) {
  778. pr_err("%s: bt_power regulators config failed\n",
  779. __func__);
  780. goto regulator_fail;
  781. }
  782. if (bt_vregs->is_enabled)
  783. power_src.bt_state[log_indx] =
  784. regulator_get_voltage(bt_vregs->reg);
  785. }
  786. }
  787. /* Parse dt_info and check if a target requires clock voting.
  788. * Enable BT clock when BT is on and disable it when BT is off
  789. */
  790. if (pwr_data->bt_chip_clk) {
  791. rc = bt_clk_enable(pwr_data->bt_chip_clk);
  792. if (rc < 0) {
  793. pr_err("%s: bt_power gpio config failed\n",
  794. __func__);
  795. goto clk_fail;
  796. }
  797. }
  798. if (pwr_data->bt_gpio_sys_rst > 0) {
  799. power_src.bt_state[BT_RESET_GPIO] = DEFAULT_INVALID_VALUE;
  800. power_src.bt_state[BT_SW_CTRL_GPIO] = DEFAULT_INVALID_VALUE;
  801. rc = bt_configure_gpios(POWER_ENABLE);
  802. if (rc < 0) {
  803. pr_err("%s: bt_power gpio config failed\n",
  804. __func__);
  805. goto gpio_fail;
  806. }
  807. }
  808. } else if (pwr_state == POWER_DISABLE) {
  809. /* Power Off */
  810. if (pwr_data->bt_gpio_sys_rst > 0) {
  811. if (pwr_data->bt_sec_hw_disable) {
  812. pr_err("%s: secure hw mode on, not allowed to access gpio",
  813. __func__);
  814. }else {
  815. bt_configure_gpios(POWER_DISABLE);
  816. }
  817. }
  818. gpio_fail:
  819. if (pwr_data->bt_gpio_sys_rst > 0)
  820. gpio_free(pwr_data->bt_gpio_sys_rst);
  821. if (pwr_data->bt_gpio_debug > 0)
  822. gpio_free(pwr_data->bt_gpio_debug);
  823. if (pwr_data->bt_chip_clk)
  824. bt_clk_disable(pwr_data->bt_chip_clk);
  825. clk_fail:
  826. regulator_fail:
  827. for (i = 0; i < bt_num_vregs; i++) {
  828. bt_vregs = &pwr_data->bt_vregs[i];
  829. rc = vreg_disable(bt_vregs);
  830. }
  831. } else if (pwr_state == POWER_RETENTION) {
  832. /* Retention mode */
  833. for (i = 0; i < bt_num_vregs; i++) {
  834. bt_vregs = &pwr_data->bt_vregs[i];
  835. rc = vreg_enable_retention(bt_vregs);
  836. }
  837. } else {
  838. pr_err("%s: Invalid power mode: %d\n", __func__, pwr_state);
  839. rc = -1;
  840. }
  841. return rc;
  842. }
  843. static int uwb_regulators_pwr(int pwr_state)
  844. {
  845. int i, log_indx, uwb_num_vregs, rc = 0;
  846. struct vreg_data *uwb_vregs = NULL;
  847. rc = perisec_cnss_bt_hw_disable_check(pwr_data);
  848. uwb_num_vregs = pwr_data->uwb_num_vregs;
  849. if (!uwb_num_vregs) {
  850. pr_warn("%s: not avilable to %s\n",
  851. __func__, ConvertRegisterModeToString(pwr_state));
  852. return 0;
  853. }
  854. pr_info("%s: %s\n", __func__, ConvertRegisterModeToString(pwr_state));
  855. switch (pwr_state) {
  856. case POWER_ENABLE:
  857. for (i = 0; i < uwb_num_vregs; i++) {
  858. uwb_vregs = &pwr_data->uwb_vregs[i];
  859. log_indx = uwb_vregs->indx.init;
  860. if (uwb_vregs->reg) {
  861. power_src.uwb_state[log_indx] = DEFAULT_INVALID_VALUE;
  862. rc = vreg_enable(uwb_vregs);
  863. if (rc < 0) {
  864. pr_err("%s: UWB regulators config failed\n",
  865. __func__);
  866. goto UWB_regulator_fail;
  867. }
  868. if (uwb_vregs->is_enabled)
  869. power_src.uwb_state[log_indx] =
  870. regulator_get_voltage(uwb_vregs->reg);
  871. }
  872. }
  873. rc = bt_configure_gpios(POWER_ENABLE);
  874. if (rc < 0) {
  875. pr_err("%s: bt_power gpio config failed\n",
  876. __func__);
  877. goto UWB_gpio_fail;
  878. }
  879. break;
  880. case POWER_DISABLE:
  881. rc = bt_configure_gpios(POWER_DISABLE);
  882. if (rc < 0) {
  883. pr_err("%s: bt_power gpio config failed\n",
  884. __func__);
  885. goto UWB_gpio_fail;
  886. }
  887. UWB_gpio_fail:
  888. UWB_regulator_fail:
  889. for (i = 0; i < uwb_num_vregs; i++) {
  890. uwb_vregs = &pwr_data->uwb_vregs[i];
  891. rc = vreg_disable(uwb_vregs);
  892. }
  893. break;
  894. case POWER_RETENTION:
  895. for (i = 0; i < uwb_num_vregs; i++) {
  896. uwb_vregs = &pwr_data->uwb_vregs[i];
  897. rc = vreg_enable_retention(uwb_vregs);
  898. }
  899. break;
  900. }
  901. return rc;
  902. }
  903. static int platform_regulators_pwr(int pwr_state)
  904. {
  905. int i, log_indx, platform_num_vregs, rc = 0;
  906. struct vreg_data *platform_vregs = NULL;
  907. rc = perisec_cnss_bt_hw_disable_check(pwr_data);
  908. platform_num_vregs = pwr_data->platform_num_vregs;
  909. if (!platform_num_vregs) {
  910. pr_warn("%s: not avilable to %s\n",
  911. __func__, ConvertRegisterModeToString(pwr_state));
  912. return 0;
  913. }
  914. pr_info("%s: %s\n", __func__, ConvertRegisterModeToString(pwr_state));
  915. switch (pwr_state) {
  916. case POWER_ENABLE:
  917. for (i = 0; i < platform_num_vregs; i++) {
  918. platform_vregs = &pwr_data->platform_vregs[i];
  919. log_indx = platform_vregs->indx.init;
  920. if (platform_vregs->reg) {
  921. power_src.platform_state[log_indx] = DEFAULT_INVALID_VALUE;
  922. rc = vreg_enable(platform_vregs);
  923. if (rc < 0) {
  924. pr_err("%s: Platform regulators config failed\n",
  925. __func__);
  926. goto Platform_regulator_fail;
  927. }
  928. if (platform_vregs->is_enabled) {
  929. power_src.platform_state[log_indx] = regulator_get_voltage(platform_vregs->reg);
  930. }
  931. }
  932. }
  933. rc = bt_configure_gpios(POWER_ENABLE);
  934. if (rc < 0) {
  935. pr_err("%s: bt_power gpio config failed\n",
  936. __func__);
  937. goto Platform_gpio_fail;
  938. }
  939. break;
  940. case POWER_DISABLE:
  941. rc = bt_configure_gpios(POWER_DISABLE);
  942. if (rc < 0) {
  943. pr_err("%s: bt_power gpio config failed\n",
  944. __func__);
  945. }
  946. Platform_gpio_fail:
  947. if (pwr_data->bt_gpio_sys_rst > 0)
  948. gpio_free(pwr_data->bt_gpio_sys_rst);
  949. if (pwr_data->bt_gpio_debug > 0)
  950. gpio_free(pwr_data->bt_gpio_debug);
  951. Platform_regulator_fail:
  952. for (i = 0; i < platform_num_vregs; i++) {
  953. platform_vregs = &pwr_data->platform_vregs[i];
  954. rc = vreg_disable(platform_vregs);
  955. }
  956. break;
  957. case POWER_RETENTION:
  958. for (i=0; i < platform_num_vregs; i++) {
  959. platform_vregs = &pwr_data->platform_vregs[i];
  960. rc = vreg_enable_retention(platform_vregs);
  961. }
  962. break;
  963. case POWER_DISABLE_RETENTION:
  964. for (i = 0; i < platform_num_vregs; i++) {
  965. platform_vregs = &pwr_data->platform_vregs[i];
  966. rc = vreg_disable_retention(platform_vregs);
  967. }
  968. break;
  969. }
  970. return rc;
  971. }
  972. static int power_regulators(int core_type, int mode) {
  973. int ret = 0;
  974. if ((mode != POWER_DISABLE) && (mode != POWER_ENABLE) &&
  975. (mode != POWER_RETENTION)) {
  976. pr_err("%s: Received wrong Mode to do regulator operation\n",
  977. __func__);
  978. return -1;
  979. }
  980. switch (core_type) {
  981. case BT_CORE:
  982. ret = bt_regulators_pwr(mode);
  983. if (ret)
  984. pr_err("%s: Failed to configure BT regulators to mode(%d)\n",
  985. __func__, mode);
  986. break;
  987. case UWB_CORE:
  988. ret = uwb_regulators_pwr(mode);
  989. if (ret)
  990. pr_err("%s: Failed to configure UWB regulators to mode(%d)\n",
  991. __func__, mode);
  992. break;
  993. case PLATFORM_CORE:
  994. ret = platform_regulators_pwr(mode);
  995. if (ret)
  996. pr_err("%s: Failed to configure platform regulators to mode(%d)\n",
  997. __func__, mode);
  998. break;
  999. default:
  1000. pr_err("%s: Received wrong Core Type to do regulator operation\n",
  1001. __func__);
  1002. return -1;
  1003. }
  1004. return ret;
  1005. }
  1006. static int btpower_toggle_radio(void *data, bool blocked)
  1007. {
  1008. int ret = 0;
  1009. int (*power_control)(int Core, int enable);
  1010. power_control =
  1011. ((struct platform_pwr_data *)data)->power_setup;
  1012. if (previous != blocked)
  1013. ret = (*power_control)(BT_CORE, !blocked);
  1014. if (!ret)
  1015. previous = blocked;
  1016. return ret;
  1017. }
  1018. static const struct rfkill_ops btpower_rfkill_ops = {
  1019. .set_block = btpower_toggle_radio,
  1020. };
  1021. static ssize_t extldo_show(struct device *dev, struct device_attribute *attr,
  1022. char *buf)
  1023. {
  1024. return scnprintf(buf, 6, "false\n");
  1025. }
  1026. static DEVICE_ATTR_RO(extldo);
  1027. static int btpower_rfkill_probe(struct platform_device *pdev)
  1028. {
  1029. struct rfkill *rfkill;
  1030. int ret;
  1031. rfkill = rfkill_alloc("bt_power", &pdev->dev, RFKILL_TYPE_BLUETOOTH,
  1032. &btpower_rfkill_ops,
  1033. pdev->dev.platform_data);
  1034. if (!rfkill) {
  1035. dev_err(&pdev->dev, "rfkill allocate failed\n");
  1036. return -ENOMEM;
  1037. }
  1038. /* add file into rfkill0 to handle LDO27 */
  1039. ret = device_create_file(&pdev->dev, &dev_attr_extldo);
  1040. if (ret < 0)
  1041. pr_err("%s: device create file error\n", __func__);
  1042. /* force Bluetooth off during init to allow for user control */
  1043. rfkill_init_sw_state(rfkill, 1);
  1044. previous = true;
  1045. ret = rfkill_register(rfkill);
  1046. if (ret) {
  1047. dev_err(&pdev->dev, "rfkill register failed=%d\n", ret);
  1048. rfkill_destroy(rfkill);
  1049. return ret;
  1050. }
  1051. platform_set_drvdata(pdev, rfkill);
  1052. return 0;
  1053. }
  1054. static void btpower_rfkill_remove(struct platform_device *pdev)
  1055. {
  1056. struct rfkill *rfkill;
  1057. pr_info("%s\n", __func__);
  1058. rfkill = platform_get_drvdata(pdev);
  1059. if (rfkill)
  1060. rfkill_unregister(rfkill);
  1061. rfkill_destroy(rfkill);
  1062. platform_set_drvdata(pdev, NULL);
  1063. }
  1064. static int dt_parse_vreg_info(struct device *dev, struct device_node *child,
  1065. struct vreg_data *vreg_data)
  1066. {
  1067. int len, ret = 0;
  1068. const __be32 *prop;
  1069. char prop_name[MAX_PROP_SIZE];
  1070. struct vreg_data *vreg = vreg_data;
  1071. struct device_node *np = child;
  1072. const char *vreg_name = vreg_data->name;
  1073. if (!child)
  1074. np = dev->of_node;
  1075. snprintf(prop_name, sizeof(prop_name), "%s-supply", vreg_name);
  1076. if (of_parse_phandle(np, prop_name, 0)) {
  1077. vreg->reg = regulator_get(dev, vreg_name);
  1078. if (IS_ERR(vreg->reg)) {
  1079. ret = PTR_ERR(vreg->reg);
  1080. vreg->reg = NULL;
  1081. pr_warn("%s: failed to get: %s error:%d\n", __func__,
  1082. vreg_name, ret);
  1083. return ret;
  1084. }
  1085. snprintf(prop_name, sizeof(prop_name), "%s-config", vreg->name);
  1086. prop = of_get_property(np, prop_name, &len);
  1087. if (!prop || len != (4 * sizeof(__be32))) {
  1088. pr_err("%s: Property %s %s, use default\n",
  1089. __func__, prop_name,
  1090. prop ? "invalid format" : "doesn't exist");
  1091. } else {
  1092. vreg->min_vol = be32_to_cpup(&prop[0]);
  1093. vreg->max_vol = be32_to_cpup(&prop[1]);
  1094. vreg->load_curr = be32_to_cpup(&prop[2]);
  1095. vreg->is_retention_supp = be32_to_cpup(&prop[3]);
  1096. }
  1097. pr_err("%s: Got regulator: %s, min_vol: %u, max_vol: %u, load_curr: %u, is_retention_supp: %u\n",
  1098. __func__, vreg->name, vreg->min_vol, vreg->max_vol,
  1099. vreg->load_curr, vreg->is_retention_supp);
  1100. } else {
  1101. pr_err("%s: %s is not provided in device tree\n", __func__,
  1102. vreg_name);
  1103. }
  1104. return ret;
  1105. }
  1106. static int bt_dt_parse_clk_info(struct device *dev,
  1107. struct bt_power_clk_data **clk_data)
  1108. {
  1109. int ret = -EINVAL;
  1110. struct bt_power_clk_data *clk = NULL;
  1111. struct device_node *np = dev->of_node;
  1112. pr_info("%s\n", __func__);
  1113. *clk_data = NULL;
  1114. if (of_parse_phandle(np, "clocks", 0)) {
  1115. clk = devm_kzalloc(dev, sizeof(*clk), GFP_KERNEL);
  1116. if (!clk) {
  1117. ret = -ENOMEM;
  1118. goto err;
  1119. }
  1120. /* Allocated 20 bytes size buffer for clock name string */
  1121. clk->name = devm_kzalloc(dev, 20, GFP_KERNEL);
  1122. /* Parse clock name from node */
  1123. ret = of_property_read_string_index(np, "clock-names", 0,
  1124. &(clk->name));
  1125. if (ret < 0) {
  1126. pr_err("%s: reading \"clock-names\" failed\n",
  1127. __func__);
  1128. return ret;
  1129. }
  1130. clk->clk = devm_clk_get(dev, clk->name);
  1131. if (IS_ERR(clk->clk)) {
  1132. ret = PTR_ERR(clk->clk);
  1133. pr_err("%s: failed to get %s, ret (%d)\n",
  1134. __func__, clk->name, ret);
  1135. clk->clk = NULL;
  1136. return ret;
  1137. }
  1138. *clk_data = clk;
  1139. } else {
  1140. pr_err("%s: clocks is not provided in device tree\n", __func__);
  1141. }
  1142. err:
  1143. return ret;
  1144. }
  1145. static void bt_power_vreg_put(void)
  1146. {
  1147. int i = 0;
  1148. struct vreg_data *bt_vregs = NULL;
  1149. int bt_num_vregs = pwr_data->bt_num_vregs;
  1150. for (; i < bt_num_vregs; i++) {
  1151. bt_vregs = &pwr_data->bt_vregs[i];
  1152. if (bt_vregs->reg)
  1153. regulator_put(bt_vregs->reg);
  1154. }
  1155. }
  1156. static int get_gpio_dt_pinfo(struct platform_device *pdev) {
  1157. int ret;
  1158. struct device_node *child;
  1159. child = pdev->dev.of_node;
  1160. pwr_data->bt_gpio_sys_rst =
  1161. of_get_named_gpio(child,
  1162. "qcom,bt-reset-gpio", 0);
  1163. if (pwr_data->bt_gpio_sys_rst < 0)
  1164. pr_err("bt-reset-gpio not provided in devicetree\n");
  1165. pwr_data->wl_gpio_sys_rst =
  1166. of_get_named_gpio(child,
  1167. "qcom,wl-reset-gpio", 0);
  1168. if (pwr_data->wl_gpio_sys_rst < 0)
  1169. pr_err("%s: wl-reset-gpio not provided in device tree\n",
  1170. __func__);
  1171. ret = of_property_read_u32(child, "mpm_wake_set_gpios",
  1172. &pwr_data->sw_cntrl_gpio);
  1173. if (ret)
  1174. pr_warn("sw_cntrl-gpio not provided in devicetree\n");
  1175. pwr_data->bt_gpio_sw_ctrl =
  1176. of_get_named_gpio(child,
  1177. "qcom,bt-sw-ctrl-gpio", 0);
  1178. if (pwr_data->bt_gpio_sw_ctrl < 0)
  1179. pr_err("bt-sw-ctrl-gpio not provided in devicetree\n");
  1180. pwr_data->bt_gpio_debug =
  1181. of_get_named_gpio(child,
  1182. "qcom,bt-debug-gpio", 0);
  1183. if (pwr_data->bt_gpio_debug < 0)
  1184. pr_warn("bt-debug-gpio not provided in devicetree\n");
  1185. pwr_data->xo_gpio_clk =
  1186. of_get_named_gpio(child,
  1187. "qcom,xo-clk-gpio", 0);
  1188. if (pwr_data->xo_gpio_clk < 0)
  1189. pr_warn("xo-clk-gpio not provided in devicetree\n");
  1190. #ifdef CONFIG_MSM_BT_OOBS
  1191. pwr_data->bt_gpio_dev_wake =
  1192. of_get_named_gpio(child,
  1193. "qcom,btwake_gpio", 0);
  1194. if (pwr_data->bt_gpio_dev_wake < 0)
  1195. pr_warn("%s: btwake-gpio not provided in device tree\n",
  1196. __func__);
  1197. pwr_data->bt_gpio_host_wake =
  1198. of_get_named_gpio(child,
  1199. "qcom,bthostwake_gpio", 0);
  1200. if (pwr_data->bt_gpio_host_wake < 0)
  1201. pr_warn("%s: bthostwake_gpio not provided in device tree\n",
  1202. __func__);
  1203. #endif
  1204. return true;
  1205. }
  1206. static int get_power_dt_pinfo(struct platform_device *pdev)
  1207. {
  1208. int rc, i;
  1209. const struct pwr_data *data;
  1210. data = of_device_get_match_data(&pdev->dev);
  1211. if (!data) {
  1212. pr_err("%s: failed to get dev node\n", __func__);
  1213. return -EINVAL;
  1214. }
  1215. memcpy(&pwr_data->compatible, &data->compatible, MAX_PROP_SIZE);
  1216. pwr_data->bt_vregs = data->bt_vregs;
  1217. pwr_data->bt_num_vregs = data->bt_num_vregs;
  1218. if (pwr_data->is_ganges_dt) {
  1219. pwr_data->uwb_vregs = data->uwb_vregs;
  1220. pwr_data->platform_vregs = data->platform_vregs;
  1221. pwr_data->uwb_num_vregs = data->uwb_num_vregs;
  1222. pwr_data->platform_num_vregs = data->platform_num_vregs;
  1223. pr_err("%s: bt_num_vregs =%d uwb_num_vregs =%d platform_num_vregs=%d\n",
  1224. __func__, pwr_data->bt_num_vregs, pwr_data->uwb_num_vregs,
  1225. pwr_data->platform_num_vregs);
  1226. } else {
  1227. pr_err("%s: bt_num_vregs =%d\n", __func__, pwr_data->bt_num_vregs);
  1228. }
  1229. for (i = 0; i < pwr_data->bt_num_vregs; i++) {
  1230. rc = dt_parse_vreg_info(&(pdev->dev), pwr_data->bt_of_node,
  1231. &pwr_data->bt_vregs[i]);
  1232. /* No point to go further if failed to get regulator handler */
  1233. if (rc)
  1234. return rc;
  1235. }
  1236. if(pwr_data->is_ganges_dt) {
  1237. for (i = 0; i < pwr_data->platform_num_vregs; i++) {
  1238. rc = dt_parse_vreg_info(&(pdev->dev), NULL,
  1239. &pwr_data->platform_vregs[i]);
  1240. /* No point to go further if failed to get regulator handler */
  1241. if (rc)
  1242. return rc;
  1243. }
  1244. for (i = 0; i < pwr_data->uwb_num_vregs; i++) {
  1245. rc = dt_parse_vreg_info(&(pdev->dev), pwr_data->uwb_of_node,
  1246. &pwr_data->uwb_vregs[i]);
  1247. /* No point to go further if failed to get regulator handler */
  1248. if (rc)
  1249. return rc;
  1250. }
  1251. }
  1252. return rc;
  1253. }
  1254. static int bt_power_populate_dt_pinfo(struct platform_device *pdev)
  1255. {
  1256. struct device_node *of_node;
  1257. int rc;
  1258. pr_info("%s\n", __func__);
  1259. if (!pwr_data)
  1260. return -ENOMEM;
  1261. if (pwr_data->is_ganges_dt) {
  1262. for_each_available_child_of_node(pdev->dev.of_node, of_node) {
  1263. if (!strcmp(of_node->name, "bt_ganges")) {
  1264. pwr_data->bt_of_node = of_node;
  1265. pr_err("%s: %s device node found\n", __func__,
  1266. pwr_data->bt_of_node->name);
  1267. } else if (!strcmp(of_node->name, "uwb_ganges")) {
  1268. pwr_data->uwb_of_node = of_node;
  1269. pr_err("%s: %s device node found\n", __func__,
  1270. pwr_data->uwb_of_node->name);
  1271. }
  1272. }
  1273. }
  1274. rc = get_power_dt_pinfo(pdev);
  1275. if (rc < 0)
  1276. pr_err("%s: failed to get the pin info from the DTSI\n",
  1277. __func__);
  1278. rc = get_gpio_dt_pinfo(pdev);
  1279. if (rc < 0)
  1280. pr_err("%s: failed to get the gpio info from the DTSI\n",
  1281. __func__);
  1282. bt_dt_parse_clk_info(&pdev->dev,
  1283. &pwr_data->bt_chip_clk);
  1284. pwr_data->power_setup = power_regulators;
  1285. return 0;
  1286. }
  1287. static inline bool bt_is_ganges_dt(struct platform_device *plat_dev)
  1288. {
  1289. return of_property_read_bool(plat_dev->dev.of_node, "qcom,peach-bt");
  1290. }
  1291. static void bt_power_pdc_init_params(struct platform_pwr_data *pdata) {
  1292. int ret;
  1293. struct device *dev = &pdata->pdev->dev;
  1294. pdata->pdc_init_table_len = of_property_count_strings(dev->of_node,
  1295. "qcom,pdc_init_table");
  1296. if (pdata->pdc_init_table_len > 0) {
  1297. pdata->pdc_init_table = kcalloc(pdata->pdc_init_table_len,
  1298. sizeof(char *), GFP_KERNEL);
  1299. ret = of_property_read_string_array(dev->of_node, "qcom,pdc_init_table",
  1300. pdata->pdc_init_table, pdata->pdc_init_table_len);
  1301. if (ret < 0)
  1302. pr_err("Failed to get PDC Init Table\n");
  1303. else
  1304. pr_err("PDC Init table configured\n");
  1305. } else {
  1306. pr_err("PDC Init Table not configured\n");
  1307. }
  1308. }
  1309. static void bt_signal_handler(struct work_struct *w_arg)
  1310. {
  1311. struct kernel_siginfo siginfo;
  1312. int rc = 0;
  1313. // Sending signal to HAL layer
  1314. memset(&siginfo, 0, sizeof(siginfo));
  1315. siginfo.si_signo = SIGIO;
  1316. siginfo.si_code = SI_QUEUE;
  1317. siginfo.si_int = pwr_data->wrkq_signal_state;
  1318. rc = send_sig_info(siginfo.si_signo, &siginfo, pwr_data->reftask_bt);
  1319. if (rc < 0) {
  1320. pr_err("%s: failed (%d) to send SIG to HAL(%d)\n", __func__,
  1321. rc, pwr_data->reftask_bt->pid);
  1322. return;
  1323. }
  1324. pr_err("%s Succesfull\n", __func__);
  1325. }
  1326. static void uwb_signal_handler(struct work_struct *w_arg)
  1327. {
  1328. struct kernel_siginfo siginfo;
  1329. int rc = 0;
  1330. // Sending signal to HAL layer
  1331. memset(&siginfo, 0, sizeof(siginfo));
  1332. siginfo.si_signo = SIGIO;
  1333. siginfo.si_code = SI_QUEUE;
  1334. siginfo.si_int = pwr_data->wrkq_signal_state;
  1335. rc = send_sig_info(siginfo.si_signo, &siginfo, pwr_data->reftask_uwb);
  1336. if (rc < 0) {
  1337. pr_err("%s: failed (%d) to send SIG to HAL(%d)\n", __func__,
  1338. rc, pwr_data->reftask_uwb->pid);
  1339. return;
  1340. }
  1341. pr_err("%s Succesfull\n", __func__);
  1342. }
  1343. static int bt_power_probe(struct platform_device *pdev)
  1344. {
  1345. int ret = 0;
  1346. int itr;
  1347. /* Fill whole array with -2 i.e NOT_AVAILABLE state by default
  1348. * for any GPIO or Reg handle.
  1349. */
  1350. for (itr = PWR_SRC_INIT_STATE_IDX; itr < BT_POWER_SRC_SIZE; ++itr) {
  1351. power_src.bt_state[itr] = PWR_SRC_NOT_AVAILABLE;
  1352. power_src.platform_state[itr] = PWR_SRC_NOT_AVAILABLE;
  1353. power_src.uwb_state[itr] = PWR_SRC_NOT_AVAILABLE;
  1354. }
  1355. pwr_data = kzalloc(sizeof(*pwr_data), GFP_KERNEL);
  1356. if (!pwr_data)
  1357. return -ENOMEM;
  1358. pwr_data->pdev = pdev;
  1359. pwr_data->is_ganges_dt = of_property_read_bool(pdev->dev.of_node,
  1360. "qcom,peach-bt");
  1361. pr_info("%s: is_ganges_dt = %d\n", __func__, pwr_data->is_ganges_dt);
  1362. pwr_data->workq = alloc_workqueue("workq", WQ_HIGHPRI, WQ_DFL_ACTIVE);
  1363. if (!pwr_data->workq) {
  1364. pr_err("%s: Failed to creat the Work Queue (workq)\n",
  1365. __func__);
  1366. return -ENOMEM;
  1367. }
  1368. INIT_WORK(&pwr_data->uwb_wq, uwb_signal_handler);
  1369. INIT_WORK(&pwr_data->bt_wq, bt_signal_handler);
  1370. INIT_WORK(&pwr_data->wq_pwr_voting, bt_power_vote);
  1371. for (itr = 0; itr < BTPWR_MAX_REQ; itr++)
  1372. init_waitqueue_head(&pwr_data->rsp_wait_q[itr]);
  1373. skb_queue_head_init(&pwr_data->rxq);
  1374. mutex_init(&pwr_data->pwr_mtx);
  1375. mutex_init(&pwr_data->btpower_state.state_machine_lock);
  1376. pwr_data->btpower_state.power_state = IDLE;
  1377. pwr_data->btpower_state.retention_mode = RETENTION_IDLE;
  1378. pwr_data->btpower_state.grant_state = NO_GRANT_FOR_ANY_SS;
  1379. pwr_data->btpower_state.grant_pending = NO_OTHER_CLIENT_WAITING_FOR_GRANT;
  1380. perisec_cnss_bt_hw_disable_check(pwr_data);
  1381. if (pdev->dev.of_node) {
  1382. ret = bt_power_populate_dt_pinfo(pdev);
  1383. if (ret < 0) {
  1384. pr_err("%s, Failed to populate device tree info\n",
  1385. __func__);
  1386. goto free_pdata;
  1387. }
  1388. if (pwr_data->bt_sec_hw_disable) {
  1389. pr_info("%s: bt is in secure mode\n", __func__);
  1390. } else {
  1391. pr_info(" %s:send platform data of btpower\n", __func__);
  1392. pdev->dev.platform_data = pwr_data;
  1393. }
  1394. } else if (pdev->dev.platform_data) {
  1395. /* Optional data set to default if not provided */
  1396. if (!((struct platform_pwr_data *)
  1397. (pdev->dev.platform_data))->power_setup)
  1398. ((struct platform_pwr_data *)
  1399. (pdev->dev.platform_data))->power_setup =
  1400. power_regulators;
  1401. memcpy(pwr_data, pdev->dev.platform_data,
  1402. sizeof(struct platform_pwr_data));
  1403. } else {
  1404. pr_err("%s: Failed to get platform data\n", __func__);
  1405. goto free_pdata;
  1406. }
  1407. if (btpower_rfkill_probe(pdev) < 0)
  1408. goto free_pdata;
  1409. bt_power_pdc_init_params(pwr_data);
  1410. btpower_aop_mbox_init(pwr_data);
  1411. probe_finished = true;
  1412. return 0;
  1413. free_pdata:
  1414. mutex_lock(&pwr_release);
  1415. kfree(pwr_data);
  1416. mutex_unlock(&pwr_release);
  1417. return ret;
  1418. }
  1419. static int bt_power_remove(struct platform_device *pdev)
  1420. {
  1421. mutex_lock(&pwr_release);
  1422. dev_dbg(&pdev->dev, "%s\n", __func__);
  1423. probe_finished = false;
  1424. btpower_rfkill_remove(pdev);
  1425. bt_power_vreg_put();
  1426. kfree(pwr_data);
  1427. mutex_unlock(&pwr_release);
  1428. return 0;
  1429. }
  1430. int btpower_register_slimdev(struct device *dev)
  1431. {
  1432. pr_info("%s\n", __func__);
  1433. if (!pwr_data || (dev == NULL)) {
  1434. pr_err("%s: Failed to allocate memory\n", __func__);
  1435. return -EINVAL;
  1436. }
  1437. pwr_data->slim_dev = dev;
  1438. return 0;
  1439. }
  1440. EXPORT_SYMBOL(btpower_register_slimdev);
  1441. int btpower_get_chipset_version(void)
  1442. {
  1443. pr_info("%s\n", __func__);
  1444. return soc_id;
  1445. }
  1446. EXPORT_SYMBOL(btpower_get_chipset_version);
  1447. static void set_pwr_srcs_status (struct vreg_data *handle, int core_type) {
  1448. int power_src_state;
  1449. if (!handle) {
  1450. pr_err("%s: invalid handler received \n", __func__);
  1451. return;
  1452. }
  1453. if (handle->is_enabled)
  1454. power_src_state = (int)regulator_get_voltage(handle->reg);
  1455. else
  1456. power_src_state = DEFAULT_INVALID_VALUE;
  1457. switch (core_type) {
  1458. case BT_CORE:
  1459. power_src.bt_state[handle->indx.crash] = power_src_state;
  1460. if (power_src_state != DEFAULT_INVALID_VALUE) {
  1461. pr_err("%s(%p) value(%d)\n", handle->name, handle,
  1462. power_src.bt_state[handle->indx.crash]);
  1463. } else {
  1464. pr_err("%s:%s is_enabled: %d\n", __func__, handle->name,
  1465. handle->is_enabled);
  1466. }
  1467. break;
  1468. case UWB_CORE:
  1469. power_src.uwb_state[handle->indx.crash] = power_src_state;
  1470. if (power_src_state != DEFAULT_INVALID_VALUE) {
  1471. pr_err("%s(%p) value(%d)\n", handle->name, handle,
  1472. power_src.uwb_state[handle->indx.crash]);
  1473. } else {
  1474. pr_err("%s:%s is_enabled: %d\n", __func__, handle->name,
  1475. handle->is_enabled);
  1476. }
  1477. break;
  1478. case PLATFORM_CORE:
  1479. power_src.platform_state[handle->indx.crash] = power_src_state;
  1480. if (power_src_state != DEFAULT_INVALID_VALUE) {
  1481. pr_err("%s(%p) value(%d)\n", handle->name, handle,
  1482. power_src.platform_state[handle->indx.crash]);
  1483. } else {
  1484. pr_err("%s:%s is_enabled: %d\n", __func__, handle->name,
  1485. handle->is_enabled);
  1486. }
  1487. break;
  1488. default:
  1489. pr_err("%s: invalid core type received = %d\n", __func__, core_type);
  1490. break;
  1491. }
  1492. }
  1493. static inline void update_pwr_state(int state)
  1494. {
  1495. mutex_lock(&pwr_data->btpower_state.state_machine_lock);
  1496. pwr_data->btpower_state.power_state = state;
  1497. mutex_unlock(&pwr_data->btpower_state.state_machine_lock);
  1498. }
  1499. static inline int get_pwr_state(void)
  1500. {
  1501. int state;
  1502. mutex_lock(&pwr_data->btpower_state.state_machine_lock);
  1503. state = (int)pwr_data->btpower_state.power_state;
  1504. mutex_unlock(&pwr_data->btpower_state.state_machine_lock);
  1505. return state;
  1506. }
  1507. static inline void btpower_set_retenion_mode_state(int state)
  1508. {
  1509. mutex_lock(&pwr_data->btpower_state.state_machine_lock);
  1510. pwr_data->btpower_state.retention_mode = state;
  1511. mutex_unlock(&pwr_data->btpower_state.state_machine_lock);
  1512. }
  1513. static inline int btpower_get_retenion_mode_state(void)
  1514. {
  1515. int state;
  1516. mutex_lock(&pwr_data->btpower_state.state_machine_lock);
  1517. state = (int)pwr_data->btpower_state.retention_mode;
  1518. mutex_unlock(&pwr_data->btpower_state.state_machine_lock);
  1519. return state;
  1520. }
  1521. static inline void btpower_set_grant_pending_state(enum grant_states state)
  1522. {
  1523. mutex_lock(&pwr_data->btpower_state.state_machine_lock);
  1524. pwr_data->btpower_state.grant_pending = state;
  1525. mutex_unlock(&pwr_data->btpower_state.state_machine_lock);
  1526. }
  1527. static inline enum grant_states btpower_get_grant_pending_state(void)
  1528. {
  1529. enum grant_states state;
  1530. mutex_lock(&pwr_data->btpower_state.state_machine_lock);
  1531. state = pwr_data->btpower_state.grant_pending;
  1532. mutex_unlock(&pwr_data->btpower_state.state_machine_lock);
  1533. return state;
  1534. }
  1535. static inline void btpower_set_grant_state(enum grant_states state)
  1536. {
  1537. mutex_lock(&pwr_data->btpower_state.state_machine_lock);
  1538. pwr_data->btpower_state.grant_state = state;
  1539. mutex_unlock(&pwr_data->btpower_state.state_machine_lock);
  1540. }
  1541. static inline enum grant_states btpower_get_grant_state(void)
  1542. {
  1543. enum grant_states state;
  1544. mutex_lock(&pwr_data->btpower_state.state_machine_lock);
  1545. state = pwr_data->btpower_state.grant_state;
  1546. mutex_unlock(&pwr_data->btpower_state.state_machine_lock);
  1547. return state;
  1548. }
  1549. static int get_sub_state(void)
  1550. {
  1551. return (int)pwr_data->sub_state;
  1552. }
  1553. static void update_sub_state(int state)
  1554. {
  1555. pwr_data->sub_state = state;
  1556. }
  1557. int power_enable (enum SubSystem SubSystemType)
  1558. {
  1559. int ret;
  1560. switch (get_pwr_state()) {
  1561. case IDLE:
  1562. ret = power_regulators(PLATFORM_CORE, POWER_ENABLE);
  1563. if (SubSystemType == BLUETOOTH) {
  1564. ret = power_regulators(BT_CORE, POWER_ENABLE);
  1565. update_pwr_state(BT_ON);
  1566. } else {
  1567. ret = power_regulators(UWB_CORE, POWER_ENABLE);
  1568. update_pwr_state(UWB_ON);
  1569. }
  1570. break;
  1571. case BT_ON:
  1572. if (SubSystemType == BLUETOOTH) {
  1573. pr_err("%s: BT Regulators already Voted-On\n",
  1574. __func__);
  1575. return 0;
  1576. }
  1577. ret = power_regulators(UWB_CORE, POWER_ENABLE);
  1578. update_pwr_state(ALL_CLIENTS_ON);
  1579. break;
  1580. case UWB_ON:
  1581. if (SubSystemType == UWB) {
  1582. pr_err("%s: UWB Regulators already Voted-On\n",
  1583. __func__);
  1584. return 0;
  1585. }
  1586. ret = power_regulators(BT_CORE, POWER_ENABLE);
  1587. update_pwr_state(ALL_CLIENTS_ON);
  1588. break;
  1589. case ALL_CLIENTS_ON:
  1590. pr_err("%s: Both BT and UWB Regulators already Voted-On\n",
  1591. __func__);
  1592. return 0;
  1593. }
  1594. return ret;
  1595. }
  1596. void send_signal_to_subsystem (int SubSystemType, int state) {
  1597. pwr_data->wrkq_signal_state = state;
  1598. if (SubSystemType == BLUETOOTH)
  1599. queue_work(pwr_data->workq, &pwr_data->bt_wq);
  1600. else
  1601. queue_work(pwr_data->workq, &pwr_data->uwb_wq);
  1602. }
  1603. int power_disable(enum SubSystem SubSystemType)
  1604. {
  1605. int ret = 0;
  1606. int ret_mode_state = btpower_get_retenion_mode_state();
  1607. enum grant_states grant_state = btpower_get_grant_state();
  1608. enum grant_states grant_pending = btpower_get_grant_pending_state();
  1609. switch (get_pwr_state()) {
  1610. case IDLE:
  1611. pr_err("%s: both BT and UWB regulators already voted-Off\n", __func__);
  1612. return 0;
  1613. case ALL_CLIENTS_ON:
  1614. if (SubSystemType == BLUETOOTH) {
  1615. ret = power_regulators(BT_CORE, POWER_DISABLE);
  1616. update_pwr_state(UWB_ON);
  1617. if (ret_mode_state == BOTH_CLIENTS_IN_RETENTION)
  1618. btpower_set_retenion_mode_state(UWB_IN_RETENTION);
  1619. else if (ret_mode_state == BT_IN_RETENTION)
  1620. btpower_set_retenion_mode_state(RETENTION_IDLE);
  1621. if (get_sub_state() == SSR_ON_BT) {
  1622. update_sub_state(SUB_STATE_IDLE);
  1623. send_signal_to_subsystem(UWB, BT_SSR_COMPLETED);
  1624. }
  1625. if (grant_state == BT_HAS_GRANT) {
  1626. if (grant_pending == UWB_WAITING_FOR_GRANT) {
  1627. send_signal_to_subsystem(UWB,
  1628. SIGIO_SOC_ACCESS_SIGNAL|(ACCESS_GRANTED + 1));
  1629. btpower_set_grant_state(UWB_HAS_GRANT);
  1630. } else {
  1631. btpower_set_grant_state(NO_GRANT_FOR_ANY_SS);
  1632. }
  1633. }
  1634. if (grant_pending == BT_WAITING_FOR_GRANT)
  1635. btpower_set_grant_pending_state(NO_OTHER_CLIENT_WAITING_FOR_GRANT);
  1636. } else {
  1637. ret = power_regulators(UWB_CORE, POWER_DISABLE);
  1638. update_pwr_state(BT_ON);
  1639. if (ret_mode_state == BOTH_CLIENTS_IN_RETENTION)
  1640. btpower_set_retenion_mode_state(BT_IN_RETENTION);
  1641. else if (ret_mode_state == UWB_IN_RETENTION)
  1642. btpower_set_retenion_mode_state(RETENTION_IDLE);
  1643. if (get_sub_state() == SSR_ON_UWB) {
  1644. send_signal_to_subsystem(BLUETOOTH,
  1645. (SIGIO_INTERACTION_SIGNAL|SIGIO_UWB_SSR_COMPLETED));
  1646. }
  1647. if (grant_state == UWB_HAS_GRANT) {
  1648. if (grant_pending == BT_WAITING_FOR_GRANT) {
  1649. send_signal_to_subsystem(BLUETOOTH,
  1650. SIGIO_SOC_ACCESS_SIGNAL|(ACCESS_GRANTED + 1));
  1651. btpower_set_grant_state(BT_HAS_GRANT);
  1652. } else {
  1653. btpower_set_grant_state(NO_GRANT_FOR_ANY_SS);
  1654. }
  1655. }
  1656. if (grant_pending == UWB_WAITING_FOR_GRANT)
  1657. btpower_set_grant_pending_state(NO_OTHER_CLIENT_WAITING_FOR_GRANT);
  1658. }
  1659. break;
  1660. case UWB_ON:
  1661. if (SubSystemType == BLUETOOTH) {
  1662. pr_err("%s: BT Regulator already Voted-Off\n", __func__);
  1663. return 0;
  1664. }
  1665. ret = power_regulators(UWB_CORE, POWER_DISABLE);
  1666. ret = power_regulators(PLATFORM_CORE, POWER_DISABLE);
  1667. update_pwr_state(IDLE);
  1668. update_sub_state(SUB_STATE_IDLE);
  1669. btpower_set_retenion_mode_state(RETENTION_IDLE);
  1670. btpower_set_grant_state(NO_GRANT_FOR_ANY_SS);
  1671. btpower_set_grant_pending_state(NO_OTHER_CLIENT_WAITING_FOR_GRANT);
  1672. break;
  1673. case BT_ON:
  1674. if (SubSystemType == UWB) {
  1675. pr_err("%s: UWB Regulator already Voted-Off\n", __func__);
  1676. return 0;
  1677. }
  1678. ret = power_regulators(BT_CORE, POWER_DISABLE);
  1679. ret = power_regulators(PLATFORM_CORE, POWER_DISABLE);
  1680. update_pwr_state(IDLE);
  1681. update_sub_state(SUB_STATE_IDLE);
  1682. btpower_set_retenion_mode_state(RETENTION_IDLE);
  1683. btpower_set_grant_state(NO_GRANT_FOR_ANY_SS);
  1684. btpower_set_grant_pending_state(NO_OTHER_CLIENT_WAITING_FOR_GRANT);
  1685. break;
  1686. }
  1687. return ret;
  1688. }
  1689. static int client_state_notified(int SubSystemType) {
  1690. if (get_sub_state() != SUB_STATE_IDLE) {
  1691. pr_err("%s: SSR is already running on other Sub-system\n", __func__);
  1692. return -1;
  1693. }
  1694. if (SubSystemType == BLUETOOTH) {
  1695. update_sub_state(SSR_ON_BT);
  1696. if (get_pwr_state() == ALL_CLIENTS_ON) {
  1697. if (!pwr_data->reftask_uwb) {
  1698. pr_err("%s: UWB PID is not register to send signal\n",
  1699. __func__);
  1700. return -1;
  1701. }
  1702. send_signal_to_subsystem(UWB, SSR_ON_BT);
  1703. }
  1704. } else {
  1705. update_sub_state(SSR_ON_UWB);
  1706. if (get_pwr_state() == ALL_CLIENTS_ON) {
  1707. if (!pwr_data->reftask_bt) {
  1708. pr_err("%s: BT PID is not register to send signal\n",
  1709. __func__);
  1710. return -1;
  1711. }
  1712. send_signal_to_subsystem(BLUETOOTH,
  1713. (SIGIO_INTERACTION_SIGNAL|SIGIO_SSR_ON_UWB));
  1714. }
  1715. }
  1716. return 0;
  1717. }
  1718. void btpower_register_client(int client, int cmd)
  1719. {
  1720. if (cmd == REG_BT_PID) {
  1721. pwr_data->reftask_bt = get_current();
  1722. pr_info("%s: Registering BT Service(PID-%d) with Power driver\n",
  1723. __func__, pwr_data->reftask_bt->tgid);
  1724. return;
  1725. } else if (cmd == REG_UWB_PID) {
  1726. pwr_data->reftask_uwb = get_current();
  1727. pr_info("%s: Registering UWB Service(PID-%d) with Power driver\n",
  1728. __func__, pwr_data->reftask_uwb->tgid);
  1729. return;
  1730. }
  1731. if (client == BLUETOOTH)
  1732. client_state_notified(BLUETOOTH);
  1733. else
  1734. client_state_notified(UWB);
  1735. }
  1736. void log_power_src_val(void)
  1737. {
  1738. int itr = 0;
  1739. power_src.platform_state[BT_SW_CTRL_GPIO_CURRENT] =
  1740. gpio_get_value(pwr_data->bt_gpio_sw_ctrl);
  1741. power_src.platform_state[BT_RESET_GPIO_CURRENT] =
  1742. gpio_get_value(pwr_data->bt_gpio_sys_rst);
  1743. for (itr = 0; itr < pwr_data->bt_num_vregs; itr++)
  1744. set_pwr_srcs_status(&pwr_data->bt_vregs[itr], BT_CORE);
  1745. for (itr = 0; itr < pwr_data->platform_num_vregs; itr++)
  1746. set_pwr_srcs_status(&pwr_data->platform_vregs[itr], PLATFORM_CORE);
  1747. for (itr = 0; itr < pwr_data->uwb_num_vregs; itr++)
  1748. set_pwr_srcs_status(&pwr_data->uwb_vregs[itr], UWB_CORE);
  1749. }
  1750. int btpower_retenion(enum plt_pwr_state client)
  1751. {
  1752. int ret;
  1753. int current_pwr_state = get_pwr_state();
  1754. int retention_mode_state = btpower_get_retenion_mode_state();
  1755. if (current_pwr_state == IDLE) {
  1756. pr_err("%s: invalid retention_mode request\n", __func__);
  1757. return -1;
  1758. }
  1759. ret = power_regulators((client == POWER_ON_BT_RETENION ? BT_CORE : UWB_CORE),
  1760. POWER_RETENTION);
  1761. if (ret < 0)
  1762. return ret;
  1763. if ((current_pwr_state == BT_ON || current_pwr_state == UWB_ON) &&
  1764. retention_mode_state == IDLE) {
  1765. ret = power_regulators(PLATFORM_CORE, POWER_RETENTION);
  1766. if (ret < 0)
  1767. return ret;
  1768. btpower_set_retenion_mode_state(client == POWER_ON_BT_RETENION ?
  1769. BT_IN_RETENTION: UWB_IN_RETENTION);
  1770. } else if (current_pwr_state == ALL_CLIENTS_ON &&
  1771. retention_mode_state == IDLE) {
  1772. btpower_set_retenion_mode_state(client == POWER_ON_BT_RETENION ?
  1773. BT_IN_RETENTION: UWB_IN_RETENTION);
  1774. } else if (current_pwr_state == ALL_CLIENTS_ON &&
  1775. (retention_mode_state == BT_IN_RETENTION ||
  1776. retention_mode_state == UWB_IN_RETENTION)) {
  1777. ret = power_regulators(PLATFORM_CORE, POWER_RETENTION);
  1778. if (ret < 0)
  1779. return ret;
  1780. btpower_set_retenion_mode_state(BOTH_CLIENTS_IN_RETENTION);
  1781. } else if (retention_mode_state == UWB_OUT_OF_RETENTION ||
  1782. retention_mode_state == BT_OUT_OF_RETENTION) {
  1783. ret = power_regulators(PLATFORM_CORE, POWER_RETENTION);
  1784. if (ret < 0)
  1785. return ret;
  1786. btpower_set_retenion_mode_state(BOTH_CLIENTS_IN_RETENTION);
  1787. }
  1788. return ret;
  1789. }
  1790. int btpower_off(enum plt_pwr_state client)
  1791. {
  1792. return power_disable((client == POWER_OFF_BT) ? BLUETOOTH : UWB);
  1793. }
  1794. int btpower_on(enum plt_pwr_state client)
  1795. {
  1796. int ret = 0;
  1797. int current_ssr_state = get_sub_state();
  1798. int retention_mode_state = btpower_get_retenion_mode_state();
  1799. if (retention_mode_state == UWB_IN_RETENTION ||
  1800. retention_mode_state == BT_IN_RETENTION) {
  1801. ret = platform_regulators_pwr(POWER_DISABLE_RETENTION);
  1802. if (ret < 0)
  1803. return ret;
  1804. if (retention_mode_state == BT_IN_RETENTION)
  1805. btpower_set_retenion_mode_state(BT_OUT_OF_RETENTION);
  1806. else
  1807. btpower_set_retenion_mode_state(UWB_OUT_OF_RETENTION);
  1808. }
  1809. /* No Point in going further if SSR is on any subsystem */
  1810. if (current_ssr_state != SUB_STATE_IDLE) {
  1811. pr_err("%s: %s not allowing to power on\n", __func__,
  1812. ConvertSsrStatusToString(current_ssr_state));
  1813. return -1;
  1814. }
  1815. ret = power_enable(client == POWER_ON_BT ? BLUETOOTH : UWB);
  1816. /* Return current state machine to clients */
  1817. if (!ret)
  1818. ret = (int)get_pwr_state();
  1819. return ret;
  1820. }
  1821. int STREAM_TO_UINT32(struct sk_buff *skb)
  1822. {
  1823. return (skb->data[0] | (skb->data[1] << 8) |
  1824. (skb->data[2] << 16) | (skb->data[3] << 24));
  1825. }
  1826. int btpower_access_ctrl(enum plt_pwr_state request)
  1827. {
  1828. enum grant_states grant_state = btpower_get_grant_state();
  1829. enum grant_states grant_pending = btpower_get_grant_pending_state();
  1830. int current_ssr_state = get_sub_state();
  1831. if (current_ssr_state != SUB_STATE_IDLE &&
  1832. (request == BT_ACCESS_REQ || request == UWB_ACCESS_REQ)) {
  1833. pr_err("%s: not allowing this request as %s\n", __func__,
  1834. ConvertSsrStatusToString(current_ssr_state));
  1835. return (int)ACCESS_DISALLOWED;
  1836. }
  1837. if ((grant_state == NO_GRANT_FOR_ANY_SS &&
  1838. grant_pending != NO_OTHER_CLIENT_WAITING_FOR_GRANT)) {
  1839. pr_err("%s: access ctrl gone for toss, resetting it back\n", __func__);
  1840. grant_pending = NO_OTHER_CLIENT_WAITING_FOR_GRANT;
  1841. btpower_set_grant_pending_state(NO_OTHER_CLIENT_WAITING_FOR_GRANT);
  1842. }
  1843. if (request == BT_ACCESS_REQ && grant_state == NO_GRANT_FOR_ANY_SS) {
  1844. btpower_set_grant_state(BT_HAS_GRANT);
  1845. return ACCESS_GRANTED;
  1846. } else if (request == UWB_ACCESS_REQ && grant_state == NO_GRANT_FOR_ANY_SS) {
  1847. btpower_set_grant_state(UWB_HAS_GRANT);
  1848. return ACCESS_GRANTED;
  1849. } else if (request == BT_ACCESS_REQ && grant_state == UWB_HAS_GRANT) {
  1850. btpower_set_grant_pending_state(BT_WAITING_FOR_GRANT);
  1851. return ACCESS_DENIED;
  1852. } else if (request == UWB_ACCESS_REQ && grant_state == BT_HAS_GRANT) {
  1853. btpower_set_grant_pending_state(UWB_WAITING_FOR_GRANT);
  1854. return ACCESS_DENIED;
  1855. } else if (request == BT_RELEASE_ACCESS && grant_state == BT_HAS_GRANT) {
  1856. if (grant_pending == UWB_WAITING_FOR_GRANT) {
  1857. if (!pwr_data->reftask_uwb) {
  1858. pr_err("%s: UWB service got killed\n", __func__);
  1859. } else {
  1860. send_signal_to_subsystem(UWB,
  1861. SIGIO_SOC_ACCESS_SIGNAL|(ACCESS_GRANTED + 1));
  1862. btpower_set_grant_state(UWB_HAS_GRANT);
  1863. }
  1864. btpower_set_grant_pending_state(NO_OTHER_CLIENT_WAITING_FOR_GRANT);
  1865. return ACCESS_RELEASED;
  1866. } else {
  1867. btpower_set_grant_state(NO_GRANT_FOR_ANY_SS);
  1868. btpower_set_grant_pending_state(NO_OTHER_CLIENT_WAITING_FOR_GRANT);
  1869. return ACCESS_RELEASED;
  1870. }
  1871. } else if (request == UWB_RELEASE_ACCESS && grant_state == UWB_HAS_GRANT) {
  1872. if (grant_pending == BT_WAITING_FOR_GRANT) {
  1873. if (!pwr_data->reftask_uwb) {
  1874. pr_err("%s: BT service got killed\n", __func__);
  1875. } else {
  1876. send_signal_to_subsystem(BLUETOOTH,
  1877. SIGIO_SOC_ACCESS_SIGNAL|(ACCESS_GRANTED+1));
  1878. btpower_set_grant_state(BT_HAS_GRANT);
  1879. }
  1880. } else {
  1881. btpower_set_grant_state(NO_GRANT_FOR_ANY_SS);
  1882. }
  1883. btpower_set_grant_pending_state(NO_OTHER_CLIENT_WAITING_FOR_GRANT);
  1884. return ACCESS_RELEASED;
  1885. } else {
  1886. pr_err("%s: unhandled event\n", __func__);
  1887. }
  1888. return ACCESS_DISALLOWED;
  1889. }
  1890. static void bt_power_vote(struct work_struct *work)
  1891. {
  1892. struct sk_buff *skb;
  1893. int request;
  1894. int ret;
  1895. while (1) {
  1896. mutex_lock(&pwr_data->pwr_mtx);
  1897. skb = skb_dequeue(&pwr_data->rxq);
  1898. if (!skb) {
  1899. mutex_unlock(&pwr_data->pwr_mtx);
  1900. break;
  1901. }
  1902. request = STREAM_TO_UINT32(skb);
  1903. skb_pull(skb, sizeof(uint32_t));
  1904. mutex_unlock(&pwr_data->pwr_mtx);
  1905. pr_info("%s: Start %s %s, %s state access %s pending %s\n",
  1906. __func__,
  1907. ConvertPowerStatusToString(get_pwr_state()),
  1908. ConvertSsrStatusToString(get_sub_state()),
  1909. ConvertRetentionModeToString(btpower_get_retenion_mode_state()),
  1910. ConvertGrantToString(btpower_get_grant_state()),
  1911. ConvertGrantToString(btpower_get_grant_pending_state()));
  1912. if (request == POWER_ON_BT || request == POWER_ON_UWB)
  1913. ret = btpower_on((enum plt_pwr_state)request);
  1914. else if (request == POWER_OFF_UWB || request == POWER_OFF_BT)
  1915. ret = btpower_off((enum plt_pwr_state)request);
  1916. else if (request == POWER_ON_BT_RETENION || request == POWER_ON_UWB_RETENION)
  1917. ret = btpower_retenion(request);
  1918. else if (request >= BT_ACCESS_REQ && request <= UWB_RELEASE_ACCESS) {
  1919. ret = btpower_access_ctrl(request);
  1920. pr_info("%s: grant status %s\n", __func__, ConvertGrantRetToString((int)ret));
  1921. }
  1922. pr_info("%s: Completed %s %s, %s state access %s pending %s\n",
  1923. __func__,
  1924. ConvertPowerStatusToString(get_pwr_state()),
  1925. ConvertSsrStatusToString(get_sub_state()),
  1926. ConvertRetentionModeToString(btpower_get_retenion_mode_state()),
  1927. ConvertGrantToString(btpower_get_grant_state()),
  1928. ConvertGrantToString(btpower_get_grant_pending_state()));
  1929. pwr_data->wait_status[request] = ret;
  1930. wake_up_interruptible(&pwr_data->rsp_wait_q[request]);
  1931. }
  1932. }
  1933. int schedule_client_voting(enum plt_pwr_state request)
  1934. {
  1935. struct sk_buff *skb;
  1936. wait_queue_head_t *rsp_wait_q;
  1937. int *status;
  1938. int ret = 0;
  1939. uint32_t req = (uint32_t)request;
  1940. mutex_lock(&pwr_data->pwr_mtx);
  1941. skb = alloc_skb(sizeof(uint32_t), GFP_KERNEL);
  1942. if (!skb) {
  1943. mutex_unlock(&pwr_data->pwr_mtx);
  1944. return -1;
  1945. }
  1946. rsp_wait_q = &pwr_data->rsp_wait_q[(u8)request];
  1947. status = &pwr_data->wait_status[(u8)request];
  1948. *status = PWR_WAITING_RSP;
  1949. skb_put_data(skb, &req, sizeof(uint32_t));
  1950. skb_queue_tail(&pwr_data->rxq, skb);
  1951. queue_work(system_highpri_wq, &pwr_data->wq_pwr_voting);
  1952. mutex_unlock(&pwr_data->pwr_mtx);
  1953. ret = wait_event_interruptible_timeout(*rsp_wait_q, (*status) != PWR_WAITING_RSP,
  1954. msecs_to_jiffies(BTPOWER_CONFIG_MAX_TIMEOUT));
  1955. pr_err("%s: %d\n", __func__, *status);
  1956. if (ret == 0) {
  1957. pr_err("%s: failed to vote %d due to timeout\n", __func__, request);
  1958. ret = -ETIMEDOUT;
  1959. } else {
  1960. ret = *status;
  1961. }
  1962. return ret;
  1963. }
  1964. char* GetUwbSecondaryCrashReason(enum UwbSecondaryReasonCode reason)
  1965. {
  1966. for(int i =0; i < (int)(sizeof(uwbSecReasonMap)/sizeof(UwbSecondaryReasonMap)); i++)
  1967. if (uwbSecReasonMap[i].reason == reason)
  1968. return uwbSecReasonMap[i].reasonstr;
  1969. return CRASH_REASON_NOT_FOUND;
  1970. }
  1971. char* GetUwbPrimaryCrashReason(enum UwbPrimaryReasonCode reason)
  1972. {
  1973. for(int i =0; i < (int)(sizeof(uwbPriReasonMap)/sizeof(UwbPrimaryReasonMap)); i++)
  1974. if (uwbPriReasonMap[i].reason == reason)
  1975. return uwbPriReasonMap[i].reasonstr;
  1976. return CRASH_REASON_NOT_FOUND;
  1977. }
  1978. const char *GetSourceSubsystemString(uint32_t source_subsystem)
  1979. {
  1980. switch (source_subsystem) {
  1981. case PERI_SS:
  1982. return "Peri SS";
  1983. case BT_SS:
  1984. return "BT SS";
  1985. case UWB_SS:
  1986. return "UWB SS";
  1987. default:
  1988. return "Unknown Subsystem";
  1989. }
  1990. }
  1991. int btpower_handle_client_request(unsigned int cmd, int arg)
  1992. {
  1993. int ret = -1;
  1994. pr_info("%s: Start of %s cmd request to %s.\n",
  1995. __func__,
  1996. (cmd == BT_CMD_PWR_CTRL ? "BT_CMD_PWR_CTRL" : "UWB_CMD_PWR_CTRL"),
  1997. ConvertClientReqToString(arg));
  1998. if (cmd == BT_CMD_PWR_CTRL) {
  1999. switch ((int)arg) {
  2000. case POWER_DISABLE:
  2001. ret = schedule_client_voting(POWER_OFF_BT);
  2002. break;
  2003. case POWER_ENABLE:
  2004. ret = schedule_client_voting(POWER_ON_BT);
  2005. break;
  2006. case POWER_RETENTION:
  2007. ret = schedule_client_voting(POWER_ON_BT_RETENION);
  2008. break;
  2009. }
  2010. } else if (cmd == UWB_CMD_PWR_CTRL) {
  2011. switch ((int)arg) {
  2012. case POWER_DISABLE:
  2013. ret = schedule_client_voting(POWER_OFF_UWB);
  2014. break;
  2015. case POWER_ENABLE:
  2016. ret = schedule_client_voting(POWER_ON_UWB);
  2017. break;
  2018. case POWER_RETENTION:
  2019. ret = schedule_client_voting(POWER_ON_UWB_RETENION);
  2020. break;
  2021. }
  2022. }
  2023. return ret;
  2024. }
  2025. int btpower_process_access_req(unsigned int cmd, int req)
  2026. {
  2027. int ret = -1;
  2028. pr_info("%s: by %s: request type %s\n", __func__,
  2029. cmd == BT_CMD_ACCESS_CTRL ? "BT_CMD_ACCESS_CTRL" : "UWB_CMD_ACCESS_CTRL",
  2030. req == 1 ? "Request" : "Release");
  2031. if (cmd == BT_CMD_ACCESS_CTRL && req == 1)
  2032. ret = schedule_client_voting(BT_ACCESS_REQ);
  2033. else if (cmd == BT_CMD_ACCESS_CTRL && req == 2)
  2034. ret = schedule_client_voting(BT_RELEASE_ACCESS);
  2035. else if (cmd == UWB_CMD_ACCESS_CTRL && req == 1)
  2036. ret = schedule_client_voting(UWB_ACCESS_REQ);
  2037. else if (cmd == UWB_CMD_ACCESS_CTRL && req == 2)
  2038. ret = schedule_client_voting(UWB_RELEASE_ACCESS);
  2039. else
  2040. pr_err("%s: unhandled command %04x req %02x", __func__, cmd, req);
  2041. return ret;
  2042. }
  2043. static long bt_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  2044. {
  2045. int ret = 0;
  2046. int chipset_version = 0;
  2047. int itr;
  2048. unsigned long panic_reason = 0;
  2049. unsigned short primary_reason = 0, sec_reason = 0, source_subsystem = 0;
  2050. #ifdef CONFIG_MSM_BT_OOBS
  2051. enum btpower_obs_param clk_cntrl;
  2052. #endif
  2053. if (!pwr_data || !probe_finished) {
  2054. pr_err("%s: BTPower Probing Pending.Try Again\n", __func__);
  2055. return -EAGAIN;
  2056. }
  2057. switch (cmd) {
  2058. #ifdef CONFIG_MSM_BT_OOBS
  2059. case BT_CMD_OBS_VOTE_CLOCK:
  2060. if (!gpio_is_valid(pwr_data->bt_gpio_dev_wake)) {
  2061. pr_err("%s: BT_CMD_OBS_VOTE_CLOCK bt_dev_wake_n(%d) not configured\n",
  2062. __func__, pwr_data->bt_gpio_dev_wake);
  2063. return -EIO;
  2064. }
  2065. clk_cntrl = (enum btpower_obs_param)arg;
  2066. switch (clk_cntrl) {
  2067. case BTPOWER_OBS_CLK_OFF:
  2068. btpower_uart_transport_locked(pwr_data, false);
  2069. ret = 0;
  2070. break;
  2071. case BTPOWER_OBS_CLK_ON:
  2072. btpower_uart_transport_locked(pwr_data, true);
  2073. ret = 0;
  2074. break;
  2075. case BTPOWER_OBS_DEV_OFF:
  2076. gpio_set_value(pwr_data->bt_gpio_dev_wake, 0);
  2077. ret = 0;
  2078. break;
  2079. case BTPOWER_OBS_DEV_ON:
  2080. gpio_set_value(pwr_data->bt_gpio_dev_wake, 1);
  2081. ret = 0;
  2082. break;
  2083. default:
  2084. pr_err("%s: BT_CMD_OBS_VOTE_CLOCK clk_cntrl(%d)\n",
  2085. __func__, clk_cntrl);
  2086. return -EINVAL;
  2087. }
  2088. pr_err("%s: BT_CMD_OBS_VOTE_CLOCK clk_cntrl(%d) %s\n",
  2089. __func__, clk_cntrl,
  2090. gpio_get_value(pwr_data->bt_gpio_dev_wake) ?
  2091. "Assert" : "Deassert");
  2092. break;
  2093. #endif
  2094. case BT_CMD_SLIM_TEST:
  2095. #if (defined CONFIG_BT_SLIM)
  2096. if (!pwr_data->slim_dev) {
  2097. pr_err("%s: slim_dev is null\n", __func__);
  2098. return -EINVAL;
  2099. }
  2100. ret = btfm_slim_hw_init(
  2101. pwr_data->slim_dev->platform_data
  2102. );
  2103. #endif
  2104. break;
  2105. case BT_CMD_PWR_CTRL:
  2106. case UWB_CMD_PWR_CTRL: {
  2107. ret = btpower_handle_client_request(cmd, (int)arg);
  2108. break;
  2109. }
  2110. case BT_CMD_REGISTRATION:
  2111. btpower_register_client(BLUETOOTH, (int)arg);
  2112. break;
  2113. case UWB_CMD_REGISTRATION:
  2114. btpower_register_client(UWB, (int)arg);
  2115. break;
  2116. case BT_CMD_ACCESS_CTRL:
  2117. case UWB_CMD_ACCESS_CTRL: {
  2118. ret = btpower_process_access_req(cmd, (int)arg);
  2119. break;
  2120. }
  2121. case BT_CMD_CHIPSET_VERS:
  2122. chipset_version = (int)arg;
  2123. pr_warn("%s: unified Current SOC Version : %x\n", __func__,
  2124. chipset_version);
  2125. if (chipset_version) {
  2126. soc_id = chipset_version;
  2127. } else {
  2128. pr_err("%s: got invalid soc version\n", __func__);
  2129. soc_id = 0;
  2130. }
  2131. break;
  2132. case BT_CMD_GET_CHIPSET_ID:
  2133. pr_err("%s: BT_CMD_GET_CHIPSET_ID = %s\n", __func__,
  2134. pwr_data->compatible);
  2135. if (copy_to_user((void __user *)arg, pwr_data->compatible,
  2136. MAX_PROP_SIZE)) {
  2137. pr_err("%s: copy to user failed\n", __func__);
  2138. ret = -EFAULT;
  2139. }
  2140. break;
  2141. case BT_CMD_CHECK_SW_CTRL:
  2142. /* Check if SW_CTRL is asserted */
  2143. pr_err("BT_CMD_CHECK_SW_CTRL\n");
  2144. if (pwr_data->bt_gpio_sw_ctrl > 0) {
  2145. power_src.bt_state[BT_SW_CTRL_GPIO] =
  2146. DEFAULT_INVALID_VALUE;
  2147. ret = gpio_direction_input(
  2148. pwr_data->bt_gpio_sw_ctrl);
  2149. if (ret) {
  2150. pr_err("%s:gpio_direction_input api\n",
  2151. __func__);
  2152. pr_err("%s:failed for SW_CTRL:%d\n",
  2153. __func__, ret);
  2154. } else {
  2155. power_src.bt_state[BT_SW_CTRL_GPIO] =
  2156. gpio_get_value(
  2157. pwr_data->bt_gpio_sw_ctrl);
  2158. pr_err("bt-sw-ctrl-gpio(%d) value(%d)\n",
  2159. pwr_data->bt_gpio_sw_ctrl,
  2160. power_src.bt_state[BT_SW_CTRL_GPIO]);
  2161. }
  2162. } else {
  2163. pr_err("bt_gpio_sw_ctrl not configured\n");
  2164. return -EINVAL;
  2165. }
  2166. break;
  2167. case BT_CMD_GETVAL_POWER_SRCS:
  2168. pr_err("BT_CMD_GETVAL_POWER_SRCS\n");
  2169. power_src.platform_state[BT_SW_CTRL_GPIO_CURRENT] =
  2170. gpio_get_value(pwr_data->bt_gpio_sw_ctrl);
  2171. power_src.platform_state[BT_RESET_GPIO_CURRENT] =
  2172. gpio_get_value(pwr_data->bt_gpio_sys_rst);
  2173. for (itr = 0; itr < pwr_data->bt_num_vregs; itr++)
  2174. set_pwr_srcs_status(&pwr_data->bt_vregs[itr], BT_CORE);
  2175. for (itr = 0; itr < pwr_data->platform_num_vregs; itr++)
  2176. set_pwr_srcs_status(&pwr_data->platform_vregs[itr], PLATFORM_CORE);
  2177. for (itr = 0; itr < pwr_data->uwb_num_vregs; itr++)
  2178. set_pwr_srcs_status(&pwr_data->uwb_vregs[itr], UWB_CORE);
  2179. if (copy_to_user((void __user *)arg, &power_src, sizeof(power_src))) {
  2180. pr_err("%s: copy to user failed\n", __func__);
  2181. ret = -EFAULT;
  2182. }
  2183. break;
  2184. case BT_CMD_SET_IPA_TCS_INFO:
  2185. pr_err("%s: BT_CMD_SET_IPA_TCS_INFO\n", __func__);
  2186. btpower_enable_ipa_vreg(pwr_data);
  2187. break;
  2188. case BT_CMD_KERNEL_PANIC:
  2189. pr_err("%s: BT_CMD_KERNEL_PANIC\n", __func__);
  2190. if (copy_from_user(&CrashInfo, (char *)arg, sizeof(CrashInfo))) {
  2191. pr_err("%s: copy to user failed\n", __func__);
  2192. ret = -EFAULT;
  2193. }
  2194. pr_err("%s: BT kernel panic Primary reason = %s, Secondary reason = %s\n",
  2195. __func__, CrashInfo.PrimaryReason, CrashInfo.SecondaryReason);
  2196. panic("%s: BT kernel panic Primary reason = %s, Secondary reason = %s\n",
  2197. __func__, CrashInfo.PrimaryReason, CrashInfo.SecondaryReason);
  2198. break;
  2199. case UWB_CMD_KERNEL_PANIC:
  2200. pr_err("%s: UWB_CMD_KERNEL_PANIC\n", __func__);
  2201. panic_reason = arg;
  2202. primary_reason = panic_reason & 0xFFFF;
  2203. sec_reason = (panic_reason & 0xFFFF0000) >> 16;
  2204. source_subsystem = (panic_reason & 0xFFFF00000000) >> 32;
  2205. pr_err("%s: UWB kernel panic PrimaryReason = (0x%02x)[%s] | SecondaryReason = (0x%02x)[%s] | SourceSubsystem = (0x%02x)[%s]\n",
  2206. __func__, primary_reason, GetUwbPrimaryCrashReason(primary_reason),
  2207. sec_reason, GetUwbSecondaryCrashReason(sec_reason),
  2208. source_subsystem, GetSourceSubsystemString(source_subsystem));
  2209. panic("%s: UWB kernel panic PrimaryReason = (0x%02x)[%s] | SecondaryReason = (0x%02x)[%s] | SourceSubsystem = (0x%02x)[%s]\n",
  2210. __func__, primary_reason, GetUwbPrimaryCrashReason(primary_reason),
  2211. sec_reason, GetUwbSecondaryCrashReason(sec_reason),
  2212. source_subsystem, GetSourceSubsystemString(source_subsystem));
  2213. break;
  2214. default:
  2215. return -ENOIOCTLCMD;
  2216. }
  2217. return ret;
  2218. }
  2219. static int bt_power_release(struct inode *inode, struct file *file)
  2220. {
  2221. mutex_lock(&pwr_release);
  2222. if (!pwr_data || !probe_finished) {
  2223. pr_err("%s: BTPower Probing Pending.Try Again\n", __func__);
  2224. return -EAGAIN;
  2225. }
  2226. pwr_data->reftask = get_current();
  2227. if (pwr_data->reftask_bt != NULL) {
  2228. if (pwr_data->reftask->tgid == pwr_data->reftask_bt->tgid)
  2229. {
  2230. pr_err("%s called by BT service(PID-%d)\n",
  2231. __func__, pwr_data->reftask->tgid);
  2232. /*
  2233. if(get_pwr_state() == BT_ON)
  2234. {
  2235. bt_regulators_pwr(POWER_DISABLE);
  2236. platform_regulators_pwr(POWER_DISABLE);
  2237. update_pwr_state(IDLE);
  2238. }
  2239. else if (get_pwr_state() == ALL_CLIENTS_ON)
  2240. {
  2241. bt_regulators_pwr(POWER_DISABLE);
  2242. update_pwr_state(UWB_ON);
  2243. }
  2244. */
  2245. }
  2246. } else if (pwr_data->reftask_uwb != NULL) {
  2247. if (pwr_data->reftask->tgid == pwr_data->reftask_uwb->tgid)
  2248. {
  2249. pr_err("%s called by uwb service(PID-%d)\n",
  2250. __func__, pwr_data->reftask->tgid);
  2251. /*
  2252. if(get_pwr_state() == UWB_ON)
  2253. {
  2254. uwb_regulators_pwr(POWER_DISABLE);
  2255. platform_regulators_pwr(POWER_DISABLE);
  2256. update_pwr_state(IDLE);
  2257. }
  2258. else if (get_pwr_state() == ALL_CLIENTS_ON)
  2259. {
  2260. uwb_regulators_pwr(POWER_DISABLE);
  2261. update_pwr_state(BT_ON);
  2262. }
  2263. */
  2264. }
  2265. }
  2266. mutex_unlock(&pwr_release);
  2267. return 0;
  2268. }
  2269. static struct platform_driver bt_power_driver = {
  2270. .probe = bt_power_probe,
  2271. .remove = bt_power_remove,
  2272. .driver = {
  2273. .name = "bt_power",
  2274. .of_match_table = bt_power_match_table,
  2275. },
  2276. };
  2277. static const struct file_operations bt_dev_fops = {
  2278. .unlocked_ioctl = bt_ioctl,
  2279. .compat_ioctl = bt_ioctl,
  2280. .release = bt_power_release,
  2281. };
  2282. static int __init btpower_init(void)
  2283. {
  2284. int ret = 0;
  2285. probe_finished = false;
  2286. ret = platform_driver_register(&bt_power_driver);
  2287. if (ret) {
  2288. pr_err("%s: platform_driver_register error: %d\n",
  2289. __func__, ret);
  2290. goto driver_err;
  2291. }
  2292. bt_major = register_chrdev(0, "bt", &bt_dev_fops);
  2293. if (bt_major < 0) {
  2294. pr_err("%s: failed to allocate char dev\n", __func__);
  2295. ret = -1;
  2296. goto chrdev_err;
  2297. }
  2298. bt_class = class_create(THIS_MODULE, "bt-dev");
  2299. if (IS_ERR(bt_class)) {
  2300. pr_err("%s: coudn't create class\n", __func__);
  2301. ret = -1;
  2302. goto class_err;
  2303. }
  2304. if (device_create(bt_class, NULL, MKDEV(bt_major, 0),
  2305. NULL, "btpower") == NULL) {
  2306. pr_err("%s: failed to allocate char dev\n", __func__);
  2307. goto device_err;
  2308. }
  2309. mutex_init(&pwr_release);
  2310. return 0;
  2311. device_err:
  2312. class_destroy(bt_class);
  2313. class_err:
  2314. unregister_chrdev(bt_major, "bt");
  2315. chrdev_err:
  2316. platform_driver_unregister(&bt_power_driver);
  2317. driver_err:
  2318. return ret;
  2319. }
  2320. /**
  2321. * bt_aop_send_msg: Sends json message to AOP using QMP
  2322. * @plat_priv: Pointer to cnss platform data
  2323. * @msg: String in json format
  2324. *
  2325. * AOP accepts JSON message to configure WLAN/BT resources. Format as follows:
  2326. * To send VReg config: {class: wlan_pdc, ss: <pdc_name>,
  2327. * res: <VReg_name>.<param>, <seq_param>: <value>}
  2328. * To send PDC Config: {class: wlan_pdc, ss: <pdc_name>, res: pdc,
  2329. * enable: <Value>}
  2330. * QMP returns timeout error if format not correct or AOP operation fails.
  2331. *
  2332. * Return: 0 for success
  2333. */
  2334. int bt_aop_send_msg(struct platform_pwr_data *plat_priv, char *mbox_msg)
  2335. {
  2336. struct qmp_pkt pkt;
  2337. int ret = 0;
  2338. pkt.size = BTPOWER_MBOX_MSG_MAX_LEN;
  2339. pkt.data = mbox_msg;
  2340. pr_err("%s: %s\n", __func__, mbox_msg);
  2341. ret = mbox_send_message(plat_priv->mbox_chan, &pkt);
  2342. if (ret < 0)
  2343. pr_err("Failed to send AOP mbox msg: %s\n", mbox_msg);
  2344. else
  2345. ret =0;
  2346. return ret;
  2347. }
  2348. int bt_aop_pdc_reconfig(struct platform_pwr_data *pdata)
  2349. {
  2350. unsigned int i;
  2351. int ret;
  2352. if (pdata->pdc_init_table_len <= 0 || !pdata->pdc_init_table)
  2353. return 0;
  2354. pr_err("Setting PDC defaults\n");
  2355. for (i = 0; i < pdata->pdc_init_table_len; i++) {
  2356. ret =bt_aop_send_msg(pdata,(char *)pdata->pdc_init_table[i]);
  2357. if (ret < 0)
  2358. break;
  2359. }
  2360. return ret;
  2361. }
  2362. int btpower_aop_mbox_init(struct platform_pwr_data *pdata)
  2363. {
  2364. struct mbox_client *mbox = &pdata->mbox_client_data;
  2365. struct mbox_chan *chan;
  2366. int ret = 0;
  2367. mbox->dev = &pdata->pdev->dev;
  2368. mbox->tx_block = true;
  2369. mbox->tx_tout = BTPOWER_MBOX_TIMEOUT_MS;
  2370. mbox->knows_txdone = false;
  2371. pdata->mbox_chan = NULL;
  2372. chan = mbox_request_channel(mbox, 0);
  2373. if (IS_ERR(chan)) {
  2374. pr_err("%s: failed to get mbox channel\n", __func__);
  2375. return PTR_ERR(chan);
  2376. }
  2377. pdata->mbox_chan = chan;
  2378. ret = of_property_read_string(pdata->pdev->dev.of_node,
  2379. "qcom,vreg_ipa",
  2380. &pdata->vreg_ipa);
  2381. if (ret)
  2382. pr_err("%s: vreg for iPA not configured\n", __func__);
  2383. else
  2384. pr_err("%s: Mbox channel initialized\n", __func__);
  2385. ret = bt_aop_pdc_reconfig(pdata);
  2386. if (ret)
  2387. pr_err("Failed to reconfig BT WLAN PDC, err = %d\n", ret);
  2388. return 0;
  2389. }
  2390. static int btpower_aop_set_vreg_param(struct platform_pwr_data *pdata,
  2391. const char *vreg_name,
  2392. enum btpower_vreg_param param,
  2393. enum btpower_tcs_seq seq, int val)
  2394. {
  2395. struct qmp_pkt pkt;
  2396. char mbox_msg[BTPOWER_MBOX_MSG_MAX_LEN];
  2397. static const char * const vreg_param_str[] = {"v", "m", "e"};
  2398. static const char *const tcs_seq_str[] = {"upval", "dwnval", "enable"};
  2399. int ret = 0;
  2400. if (param > BTPOWER_VREG_ENABLE || seq > BTPOWER_TCS_ALL_SEQ || !vreg_name)
  2401. return -EINVAL;
  2402. snprintf(mbox_msg, BTPOWER_MBOX_MSG_MAX_LEN,
  2403. "{class: wlan_pdc, res: %s.%s, %s: %d}", vreg_name,
  2404. vreg_param_str[param], tcs_seq_str[seq], val);
  2405. pr_err("%s: sending AOP Mbox msg: %s\n", __func__, mbox_msg);
  2406. pkt.size = BTPOWER_MBOX_MSG_MAX_LEN;
  2407. pkt.data = mbox_msg;
  2408. ret = mbox_send_message(pdata->mbox_chan, &pkt);
  2409. if (ret < 0)
  2410. pr_err("%s:Failed to send AOP mbox msg(%s), err(%d)\n",
  2411. __func__, mbox_msg, ret);
  2412. return ret;
  2413. }
  2414. static int btpower_enable_ipa_vreg(struct platform_pwr_data *pdata)
  2415. {
  2416. int ret = 0;
  2417. static bool config_done;
  2418. if (config_done) {
  2419. pr_err("%s: IPA Vreg already configured\n", __func__);
  2420. return 0;
  2421. }
  2422. if (!pdata->vreg_ipa || !pdata->mbox_chan) {
  2423. pr_err("%s: mbox/iPA vreg not configured\n", __func__);
  2424. } else {
  2425. ret = btpower_aop_set_vreg_param(pdata,
  2426. pdata->vreg_ipa,
  2427. BTPOWER_VREG_ENABLE,
  2428. BTPOWER_TCS_UP_SEQ, 1);
  2429. if (ret >= 0) {
  2430. pr_err("%s:Enabled iPA\n", __func__);
  2431. config_done = true;
  2432. }
  2433. }
  2434. return ret;
  2435. }
  2436. static void __exit btpower_exit(void)
  2437. {
  2438. platform_driver_unregister(&bt_power_driver);
  2439. }
  2440. MODULE_LICENSE("GPL v2");
  2441. MODULE_DESCRIPTION("MSM Bluetooth power control driver");
  2442. module_init(btpower_init);
  2443. module_exit(btpower_exit);