cs43130.c 72 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * cs43130.c -- CS43130 ALSA Soc Audio driver
  4. *
  5. * Copyright 2017 Cirrus Logic, Inc.
  6. *
  7. * Authors: Li Xu <[email protected]>
  8. */
  9. #include <linux/module.h>
  10. #include <linux/moduleparam.h>
  11. #include <linux/kernel.h>
  12. #include <linux/init.h>
  13. #include <linux/delay.h>
  14. #include <linux/gpio.h>
  15. #include <linux/gpio/consumer.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/pm.h>
  18. #include <linux/i2c.h>
  19. #include <linux/of_device.h>
  20. #include <linux/regmap.h>
  21. #include <linux/slab.h>
  22. #include <sound/core.h>
  23. #include <sound/pcm.h>
  24. #include <sound/pcm_params.h>
  25. #include <sound/soc.h>
  26. #include <sound/soc-dapm.h>
  27. #include <sound/initval.h>
  28. #include <sound/tlv.h>
  29. #include <linux/of_gpio.h>
  30. #include <linux/regulator/consumer.h>
  31. #include <linux/pm_runtime.h>
  32. #include <linux/of_irq.h>
  33. #include <linux/completion.h>
  34. #include <linux/mutex.h>
  35. #include <linux/workqueue.h>
  36. #include <sound/jack.h>
  37. #include "cs43130.h"
  38. #include "cirrus_legacy.h"
  39. static const struct reg_default cs43130_reg_defaults[] = {
  40. {CS43130_SYS_CLK_CTL_1, 0x06},
  41. {CS43130_SP_SRATE, 0x01},
  42. {CS43130_SP_BITSIZE, 0x05},
  43. {CS43130_PAD_INT_CFG, 0x03},
  44. {CS43130_PWDN_CTL, 0xFE},
  45. {CS43130_CRYSTAL_SET, 0x04},
  46. {CS43130_PLL_SET_1, 0x00},
  47. {CS43130_PLL_SET_2, 0x00},
  48. {CS43130_PLL_SET_3, 0x00},
  49. {CS43130_PLL_SET_4, 0x00},
  50. {CS43130_PLL_SET_5, 0x40},
  51. {CS43130_PLL_SET_6, 0x10},
  52. {CS43130_PLL_SET_7, 0x80},
  53. {CS43130_PLL_SET_8, 0x03},
  54. {CS43130_PLL_SET_9, 0x02},
  55. {CS43130_PLL_SET_10, 0x02},
  56. {CS43130_CLKOUT_CTL, 0x00},
  57. {CS43130_ASP_NUM_1, 0x01},
  58. {CS43130_ASP_NUM_2, 0x00},
  59. {CS43130_ASP_DEN_1, 0x08},
  60. {CS43130_ASP_DEN_2, 0x00},
  61. {CS43130_ASP_LRCK_HI_TIME_1, 0x1F},
  62. {CS43130_ASP_LRCK_HI_TIME_2, 0x00},
  63. {CS43130_ASP_LRCK_PERIOD_1, 0x3F},
  64. {CS43130_ASP_LRCK_PERIOD_2, 0x00},
  65. {CS43130_ASP_CLOCK_CONF, 0x0C},
  66. {CS43130_ASP_FRAME_CONF, 0x0A},
  67. {CS43130_XSP_NUM_1, 0x01},
  68. {CS43130_XSP_NUM_2, 0x00},
  69. {CS43130_XSP_DEN_1, 0x02},
  70. {CS43130_XSP_DEN_2, 0x00},
  71. {CS43130_XSP_LRCK_HI_TIME_1, 0x1F},
  72. {CS43130_XSP_LRCK_HI_TIME_2, 0x00},
  73. {CS43130_XSP_LRCK_PERIOD_1, 0x3F},
  74. {CS43130_XSP_LRCK_PERIOD_2, 0x00},
  75. {CS43130_XSP_CLOCK_CONF, 0x0C},
  76. {CS43130_XSP_FRAME_CONF, 0x0A},
  77. {CS43130_ASP_CH_1_LOC, 0x00},
  78. {CS43130_ASP_CH_2_LOC, 0x00},
  79. {CS43130_ASP_CH_1_SZ_EN, 0x06},
  80. {CS43130_ASP_CH_2_SZ_EN, 0x0E},
  81. {CS43130_XSP_CH_1_LOC, 0x00},
  82. {CS43130_XSP_CH_2_LOC, 0x00},
  83. {CS43130_XSP_CH_1_SZ_EN, 0x06},
  84. {CS43130_XSP_CH_2_SZ_EN, 0x0E},
  85. {CS43130_DSD_VOL_B, 0x78},
  86. {CS43130_DSD_VOL_A, 0x78},
  87. {CS43130_DSD_PATH_CTL_1, 0xA8},
  88. {CS43130_DSD_INT_CFG, 0x00},
  89. {CS43130_DSD_PATH_CTL_2, 0x02},
  90. {CS43130_DSD_PCM_MIX_CTL, 0x00},
  91. {CS43130_DSD_PATH_CTL_3, 0x40},
  92. {CS43130_HP_OUT_CTL_1, 0x30},
  93. {CS43130_PCM_FILT_OPT, 0x02},
  94. {CS43130_PCM_VOL_B, 0x78},
  95. {CS43130_PCM_VOL_A, 0x78},
  96. {CS43130_PCM_PATH_CTL_1, 0xA8},
  97. {CS43130_PCM_PATH_CTL_2, 0x00},
  98. {CS43130_CLASS_H_CTL, 0x1E},
  99. {CS43130_HP_DETECT, 0x04},
  100. {CS43130_HP_LOAD_1, 0x00},
  101. {CS43130_HP_MEAS_LOAD_1, 0x00},
  102. {CS43130_HP_MEAS_LOAD_2, 0x00},
  103. {CS43130_INT_MASK_1, 0xFF},
  104. {CS43130_INT_MASK_2, 0xFF},
  105. {CS43130_INT_MASK_3, 0xFF},
  106. {CS43130_INT_MASK_4, 0xFF},
  107. {CS43130_INT_MASK_5, 0xFF},
  108. };
  109. static bool cs43130_volatile_register(struct device *dev, unsigned int reg)
  110. {
  111. switch (reg) {
  112. case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5:
  113. case CS43130_HP_DC_STAT_1 ... CS43130_HP_DC_STAT_2:
  114. case CS43130_HP_AC_STAT_1 ... CS43130_HP_AC_STAT_2:
  115. return true;
  116. default:
  117. return false;
  118. }
  119. }
  120. static bool cs43130_readable_register(struct device *dev, unsigned int reg)
  121. {
  122. switch (reg) {
  123. case CS43130_DEVID_AB ... CS43130_SYS_CLK_CTL_1:
  124. case CS43130_SP_SRATE ... CS43130_PAD_INT_CFG:
  125. case CS43130_PWDN_CTL:
  126. case CS43130_CRYSTAL_SET:
  127. case CS43130_PLL_SET_1 ... CS43130_PLL_SET_5:
  128. case CS43130_PLL_SET_6:
  129. case CS43130_PLL_SET_7:
  130. case CS43130_PLL_SET_8:
  131. case CS43130_PLL_SET_9:
  132. case CS43130_PLL_SET_10:
  133. case CS43130_CLKOUT_CTL:
  134. case CS43130_ASP_NUM_1 ... CS43130_ASP_FRAME_CONF:
  135. case CS43130_XSP_NUM_1 ... CS43130_XSP_FRAME_CONF:
  136. case CS43130_ASP_CH_1_LOC:
  137. case CS43130_ASP_CH_2_LOC:
  138. case CS43130_ASP_CH_1_SZ_EN:
  139. case CS43130_ASP_CH_2_SZ_EN:
  140. case CS43130_XSP_CH_1_LOC:
  141. case CS43130_XSP_CH_2_LOC:
  142. case CS43130_XSP_CH_1_SZ_EN:
  143. case CS43130_XSP_CH_2_SZ_EN:
  144. case CS43130_DSD_VOL_B ... CS43130_DSD_PATH_CTL_3:
  145. case CS43130_HP_OUT_CTL_1:
  146. case CS43130_PCM_FILT_OPT ... CS43130_PCM_PATH_CTL_2:
  147. case CS43130_CLASS_H_CTL:
  148. case CS43130_HP_DETECT:
  149. case CS43130_HP_STATUS:
  150. case CS43130_HP_LOAD_1:
  151. case CS43130_HP_MEAS_LOAD_1:
  152. case CS43130_HP_MEAS_LOAD_2:
  153. case CS43130_HP_DC_STAT_1:
  154. case CS43130_HP_DC_STAT_2:
  155. case CS43130_HP_AC_STAT_1:
  156. case CS43130_HP_AC_STAT_2:
  157. case CS43130_HP_LOAD_STAT:
  158. case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5:
  159. case CS43130_INT_MASK_1 ... CS43130_INT_MASK_5:
  160. return true;
  161. default:
  162. return false;
  163. }
  164. }
  165. static bool cs43130_precious_register(struct device *dev, unsigned int reg)
  166. {
  167. switch (reg) {
  168. case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5:
  169. return true;
  170. default:
  171. return false;
  172. }
  173. }
  174. struct cs43130_pll_params {
  175. unsigned int pll_in;
  176. u8 sclk_prediv;
  177. u8 pll_div_int;
  178. u32 pll_div_frac;
  179. u8 pll_mode;
  180. u8 pll_divout;
  181. unsigned int pll_out;
  182. u8 pll_cal_ratio;
  183. };
  184. static const struct cs43130_pll_params pll_ratio_table[] = {
  185. {9600000, 0x02, 0x49, 0x800000, 0x00, 0x08, 22579200, 151},
  186. {9600000, 0x02, 0x50, 0x000000, 0x00, 0x08, 24576000, 164},
  187. {11289600, 0x02, 0X40, 0, 0x01, 0x08, 22579200, 128},
  188. {11289600, 0x02, 0x44, 0x06F700, 0x0, 0x08, 24576000, 139},
  189. {12000000, 0x02, 0x49, 0x800000, 0x00, 0x0A, 22579200, 120},
  190. {12000000, 0x02, 0x40, 0x000000, 0x00, 0x08, 24576000, 131},
  191. {12288000, 0x02, 0x49, 0x800000, 0x01, 0x0A, 22579200, 118},
  192. {12288000, 0x02, 0x40, 0x000000, 0x01, 0x08, 24576000, 128},
  193. {13000000, 0x02, 0x45, 0x797680, 0x01, 0x0A, 22579200, 111},
  194. {13000000, 0x02, 0x3C, 0x7EA940, 0x01, 0x08, 24576000, 121},
  195. {19200000, 0x03, 0x49, 0x800000, 0x00, 0x08, 22579200, 151},
  196. {19200000, 0x03, 0x50, 0x000000, 0x00, 0x08, 24576000, 164},
  197. {22579200, 0, 0, 0, 0, 0, 22579200, 0},
  198. {22579200, 0x03, 0x44, 0x06F700, 0x00, 0x08, 24576000, 139},
  199. {24000000, 0x03, 0x49, 0x800000, 0x00, 0x0A, 22579200, 120},
  200. {24000000, 0x03, 0x40, 0x000000, 0x00, 0x08, 24576000, 131},
  201. {24576000, 0x03, 0x49, 0x800000, 0x01, 0x0A, 22579200, 118},
  202. {24576000, 0, 0, 0, 0, 0, 24576000, 0},
  203. {26000000, 0x03, 0x45, 0x797680, 0x01, 0x0A, 22579200, 111},
  204. {26000000, 0x03, 0x3C, 0x7EA940, 0x01, 0x08, 24576000, 121},
  205. };
  206. static const struct cs43130_pll_params *cs43130_get_pll_table(
  207. unsigned int freq_in, unsigned int freq_out)
  208. {
  209. int i;
  210. for (i = 0; i < ARRAY_SIZE(pll_ratio_table); i++) {
  211. if (pll_ratio_table[i].pll_in == freq_in &&
  212. pll_ratio_table[i].pll_out == freq_out)
  213. return &pll_ratio_table[i];
  214. }
  215. return NULL;
  216. }
  217. static int cs43130_pll_config(struct snd_soc_component *component)
  218. {
  219. struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
  220. const struct cs43130_pll_params *pll_entry;
  221. dev_dbg(component->dev, "cs43130->mclk = %u, cs43130->mclk_int = %u\n",
  222. cs43130->mclk, cs43130->mclk_int);
  223. pll_entry = cs43130_get_pll_table(cs43130->mclk, cs43130->mclk_int);
  224. if (!pll_entry)
  225. return -EINVAL;
  226. if (pll_entry->pll_cal_ratio == 0) {
  227. regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_1,
  228. CS43130_PLL_START_MASK, 0);
  229. cs43130->pll_bypass = true;
  230. return 0;
  231. }
  232. cs43130->pll_bypass = false;
  233. regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_2,
  234. CS43130_PLL_DIV_DATA_MASK,
  235. pll_entry->pll_div_frac >>
  236. CS43130_PLL_DIV_FRAC_0_DATA_SHIFT);
  237. regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_3,
  238. CS43130_PLL_DIV_DATA_MASK,
  239. pll_entry->pll_div_frac >>
  240. CS43130_PLL_DIV_FRAC_1_DATA_SHIFT);
  241. regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_4,
  242. CS43130_PLL_DIV_DATA_MASK,
  243. pll_entry->pll_div_frac >>
  244. CS43130_PLL_DIV_FRAC_2_DATA_SHIFT);
  245. regmap_write(cs43130->regmap, CS43130_PLL_SET_5,
  246. pll_entry->pll_div_int);
  247. regmap_write(cs43130->regmap, CS43130_PLL_SET_6, pll_entry->pll_divout);
  248. regmap_write(cs43130->regmap, CS43130_PLL_SET_7,
  249. pll_entry->pll_cal_ratio);
  250. regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_8,
  251. CS43130_PLL_MODE_MASK,
  252. pll_entry->pll_mode << CS43130_PLL_MODE_SHIFT);
  253. regmap_write(cs43130->regmap, CS43130_PLL_SET_9,
  254. pll_entry->sclk_prediv);
  255. regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_1,
  256. CS43130_PLL_START_MASK, 1);
  257. return 0;
  258. }
  259. static int cs43130_set_pll(struct snd_soc_component *component, int pll_id, int source,
  260. unsigned int freq_in, unsigned int freq_out)
  261. {
  262. int ret = 0;
  263. struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
  264. switch (freq_in) {
  265. case 9600000:
  266. case 11289600:
  267. case 12000000:
  268. case 12288000:
  269. case 13000000:
  270. case 19200000:
  271. case 22579200:
  272. case 24000000:
  273. case 24576000:
  274. case 26000000:
  275. cs43130->mclk = freq_in;
  276. break;
  277. default:
  278. dev_err(component->dev,
  279. "unsupported pll input reference clock:%d\n", freq_in);
  280. return -EINVAL;
  281. }
  282. switch (freq_out) {
  283. case 22579200:
  284. cs43130->mclk_int = freq_out;
  285. break;
  286. case 24576000:
  287. cs43130->mclk_int = freq_out;
  288. break;
  289. default:
  290. dev_err(component->dev,
  291. "unsupported pll output ref clock: %u\n", freq_out);
  292. return -EINVAL;
  293. }
  294. ret = cs43130_pll_config(component);
  295. dev_dbg(component->dev, "cs43130->pll_bypass = %d", cs43130->pll_bypass);
  296. return ret;
  297. }
  298. static int cs43130_change_clksrc(struct snd_soc_component *component,
  299. enum cs43130_mclk_src_sel src)
  300. {
  301. int ret;
  302. struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
  303. int mclk_int_decoded;
  304. if (src == cs43130->mclk_int_src) {
  305. /* clk source has not changed */
  306. return 0;
  307. }
  308. switch (cs43130->mclk_int) {
  309. case CS43130_MCLK_22M:
  310. mclk_int_decoded = CS43130_MCLK_22P5;
  311. break;
  312. case CS43130_MCLK_24M:
  313. mclk_int_decoded = CS43130_MCLK_24P5;
  314. break;
  315. default:
  316. dev_err(component->dev, "Invalid MCLK INT freq: %u\n", cs43130->mclk_int);
  317. return -EINVAL;
  318. }
  319. switch (src) {
  320. case CS43130_MCLK_SRC_EXT:
  321. cs43130->pll_bypass = true;
  322. cs43130->mclk_int_src = CS43130_MCLK_SRC_EXT;
  323. if (cs43130->xtal_ibias == CS43130_XTAL_UNUSED) {
  324. regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
  325. CS43130_PDN_XTAL_MASK,
  326. 1 << CS43130_PDN_XTAL_SHIFT);
  327. } else {
  328. reinit_completion(&cs43130->xtal_rdy);
  329. regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
  330. CS43130_XTAL_RDY_INT_MASK, 0);
  331. regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
  332. CS43130_PDN_XTAL_MASK, 0);
  333. ret = wait_for_completion_timeout(&cs43130->xtal_rdy,
  334. msecs_to_jiffies(100));
  335. regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
  336. CS43130_XTAL_RDY_INT_MASK,
  337. 1 << CS43130_XTAL_RDY_INT_SHIFT);
  338. if (ret == 0) {
  339. dev_err(component->dev, "Timeout waiting for XTAL_READY interrupt\n");
  340. return -ETIMEDOUT;
  341. }
  342. }
  343. regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
  344. CS43130_MCLK_SRC_SEL_MASK,
  345. src << CS43130_MCLK_SRC_SEL_SHIFT);
  346. regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
  347. CS43130_MCLK_INT_MASK,
  348. mclk_int_decoded << CS43130_MCLK_INT_SHIFT);
  349. usleep_range(150, 200);
  350. regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
  351. CS43130_PDN_PLL_MASK,
  352. 1 << CS43130_PDN_PLL_SHIFT);
  353. break;
  354. case CS43130_MCLK_SRC_PLL:
  355. cs43130->pll_bypass = false;
  356. cs43130->mclk_int_src = CS43130_MCLK_SRC_PLL;
  357. if (cs43130->xtal_ibias == CS43130_XTAL_UNUSED) {
  358. regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
  359. CS43130_PDN_XTAL_MASK,
  360. 1 << CS43130_PDN_XTAL_SHIFT);
  361. } else {
  362. reinit_completion(&cs43130->xtal_rdy);
  363. regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
  364. CS43130_XTAL_RDY_INT_MASK, 0);
  365. regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
  366. CS43130_PDN_XTAL_MASK, 0);
  367. ret = wait_for_completion_timeout(&cs43130->xtal_rdy,
  368. msecs_to_jiffies(100));
  369. regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
  370. CS43130_XTAL_RDY_INT_MASK,
  371. 1 << CS43130_XTAL_RDY_INT_SHIFT);
  372. if (ret == 0) {
  373. dev_err(component->dev, "Timeout waiting for XTAL_READY interrupt\n");
  374. return -ETIMEDOUT;
  375. }
  376. }
  377. reinit_completion(&cs43130->pll_rdy);
  378. regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
  379. CS43130_PLL_RDY_INT_MASK, 0);
  380. regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
  381. CS43130_PDN_PLL_MASK, 0);
  382. ret = wait_for_completion_timeout(&cs43130->pll_rdy,
  383. msecs_to_jiffies(100));
  384. regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
  385. CS43130_PLL_RDY_INT_MASK,
  386. 1 << CS43130_PLL_RDY_INT_SHIFT);
  387. if (ret == 0) {
  388. dev_err(component->dev, "Timeout waiting for PLL_READY interrupt\n");
  389. return -ETIMEDOUT;
  390. }
  391. regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
  392. CS43130_MCLK_SRC_SEL_MASK,
  393. src << CS43130_MCLK_SRC_SEL_SHIFT);
  394. regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
  395. CS43130_MCLK_INT_MASK,
  396. mclk_int_decoded << CS43130_MCLK_INT_SHIFT);
  397. usleep_range(150, 200);
  398. break;
  399. case CS43130_MCLK_SRC_RCO:
  400. cs43130->mclk_int_src = CS43130_MCLK_SRC_RCO;
  401. regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
  402. CS43130_MCLK_SRC_SEL_MASK,
  403. src << CS43130_MCLK_SRC_SEL_SHIFT);
  404. regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
  405. CS43130_MCLK_INT_MASK,
  406. CS43130_MCLK_22P5 << CS43130_MCLK_INT_SHIFT);
  407. usleep_range(150, 200);
  408. regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
  409. CS43130_PDN_XTAL_MASK,
  410. 1 << CS43130_PDN_XTAL_SHIFT);
  411. regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
  412. CS43130_PDN_PLL_MASK,
  413. 1 << CS43130_PDN_PLL_SHIFT);
  414. break;
  415. default:
  416. dev_err(component->dev, "Invalid MCLK source value\n");
  417. return -EINVAL;
  418. }
  419. return 0;
  420. }
  421. static const struct cs43130_bitwidth_map cs43130_bitwidth_table[] = {
  422. {8, CS43130_SP_BIT_SIZE_8, CS43130_CH_BIT_SIZE_8},
  423. {16, CS43130_SP_BIT_SIZE_16, CS43130_CH_BIT_SIZE_16},
  424. {24, CS43130_SP_BIT_SIZE_24, CS43130_CH_BIT_SIZE_24},
  425. {32, CS43130_SP_BIT_SIZE_32, CS43130_CH_BIT_SIZE_32},
  426. };
  427. static const struct cs43130_bitwidth_map *cs43130_get_bitwidth_table(
  428. unsigned int bitwidth)
  429. {
  430. int i;
  431. for (i = 0; i < ARRAY_SIZE(cs43130_bitwidth_table); i++) {
  432. if (cs43130_bitwidth_table[i].bitwidth == bitwidth)
  433. return &cs43130_bitwidth_table[i];
  434. }
  435. return NULL;
  436. }
  437. static int cs43130_set_bitwidth(int dai_id, unsigned int bitwidth_dai,
  438. struct regmap *regmap)
  439. {
  440. const struct cs43130_bitwidth_map *bw_map;
  441. bw_map = cs43130_get_bitwidth_table(bitwidth_dai);
  442. if (!bw_map)
  443. return -EINVAL;
  444. switch (dai_id) {
  445. case CS43130_ASP_PCM_DAI:
  446. case CS43130_ASP_DOP_DAI:
  447. regmap_update_bits(regmap, CS43130_ASP_CH_1_SZ_EN,
  448. CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
  449. regmap_update_bits(regmap, CS43130_ASP_CH_2_SZ_EN,
  450. CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
  451. regmap_update_bits(regmap, CS43130_SP_BITSIZE,
  452. CS43130_ASP_BITSIZE_MASK, bw_map->sp_bit);
  453. break;
  454. case CS43130_XSP_DOP_DAI:
  455. regmap_update_bits(regmap, CS43130_XSP_CH_1_SZ_EN,
  456. CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
  457. regmap_update_bits(regmap, CS43130_XSP_CH_2_SZ_EN,
  458. CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
  459. regmap_update_bits(regmap, CS43130_SP_BITSIZE,
  460. CS43130_XSP_BITSIZE_MASK, bw_map->sp_bit <<
  461. CS43130_XSP_BITSIZE_SHIFT);
  462. break;
  463. default:
  464. return -EINVAL;
  465. }
  466. return 0;
  467. }
  468. static const struct cs43130_rate_map cs43130_rate_table[] = {
  469. {32000, CS43130_ASP_SPRATE_32K},
  470. {44100, CS43130_ASP_SPRATE_44_1K},
  471. {48000, CS43130_ASP_SPRATE_48K},
  472. {88200, CS43130_ASP_SPRATE_88_2K},
  473. {96000, CS43130_ASP_SPRATE_96K},
  474. {176400, CS43130_ASP_SPRATE_176_4K},
  475. {192000, CS43130_ASP_SPRATE_192K},
  476. {352800, CS43130_ASP_SPRATE_352_8K},
  477. {384000, CS43130_ASP_SPRATE_384K},
  478. };
  479. static const struct cs43130_rate_map *cs43130_get_rate_table(int fs)
  480. {
  481. int i;
  482. for (i = 0; i < ARRAY_SIZE(cs43130_rate_table); i++) {
  483. if (cs43130_rate_table[i].fs == fs)
  484. return &cs43130_rate_table[i];
  485. }
  486. return NULL;
  487. }
  488. static const struct cs43130_clk_gen *cs43130_get_clk_gen(int mclk_int, int fs,
  489. const struct cs43130_clk_gen *clk_gen_table, int len_clk_gen_table)
  490. {
  491. int i;
  492. for (i = 0; i < len_clk_gen_table; i++) {
  493. if (clk_gen_table[i].mclk_int == mclk_int &&
  494. clk_gen_table[i].fs == fs)
  495. return &clk_gen_table[i];
  496. }
  497. return NULL;
  498. }
  499. static int cs43130_set_sp_fmt(int dai_id, unsigned int bitwidth_sclk,
  500. struct snd_pcm_hw_params *params,
  501. struct cs43130_private *cs43130)
  502. {
  503. u16 frm_size;
  504. u16 hi_size;
  505. u8 frm_delay;
  506. u8 frm_phase;
  507. u8 frm_data;
  508. u8 sclk_edge;
  509. u8 lrck_edge;
  510. u8 clk_data;
  511. u8 loc_ch1;
  512. u8 loc_ch2;
  513. u8 dai_mode_val;
  514. const struct cs43130_clk_gen *clk_gen;
  515. switch (cs43130->dais[dai_id].dai_format) {
  516. case SND_SOC_DAIFMT_I2S:
  517. hi_size = bitwidth_sclk;
  518. frm_delay = 2;
  519. frm_phase = 0;
  520. break;
  521. case SND_SOC_DAIFMT_LEFT_J:
  522. hi_size = bitwidth_sclk;
  523. frm_delay = 2;
  524. frm_phase = 1;
  525. break;
  526. case SND_SOC_DAIFMT_DSP_A:
  527. hi_size = 1;
  528. frm_delay = 2;
  529. frm_phase = 1;
  530. break;
  531. case SND_SOC_DAIFMT_DSP_B:
  532. hi_size = 1;
  533. frm_delay = 0;
  534. frm_phase = 1;
  535. break;
  536. default:
  537. return -EINVAL;
  538. }
  539. switch (cs43130->dais[dai_id].dai_mode) {
  540. case SND_SOC_DAIFMT_CBS_CFS:
  541. dai_mode_val = 0;
  542. break;
  543. case SND_SOC_DAIFMT_CBM_CFM:
  544. dai_mode_val = 1;
  545. break;
  546. default:
  547. return -EINVAL;
  548. }
  549. frm_size = bitwidth_sclk * params_channels(params);
  550. sclk_edge = 1;
  551. lrck_edge = 0;
  552. loc_ch1 = 0;
  553. loc_ch2 = bitwidth_sclk * (params_channels(params) - 1);
  554. frm_data = frm_delay & CS43130_SP_FSD_MASK;
  555. frm_data |= (frm_phase << CS43130_SP_STP_SHIFT) & CS43130_SP_STP_MASK;
  556. clk_data = lrck_edge & CS43130_SP_LCPOL_IN_MASK;
  557. clk_data |= (lrck_edge << CS43130_SP_LCPOL_OUT_SHIFT) &
  558. CS43130_SP_LCPOL_OUT_MASK;
  559. clk_data |= (sclk_edge << CS43130_SP_SCPOL_IN_SHIFT) &
  560. CS43130_SP_SCPOL_IN_MASK;
  561. clk_data |= (sclk_edge << CS43130_SP_SCPOL_OUT_SHIFT) &
  562. CS43130_SP_SCPOL_OUT_MASK;
  563. clk_data |= (dai_mode_val << CS43130_SP_MODE_SHIFT) &
  564. CS43130_SP_MODE_MASK;
  565. switch (dai_id) {
  566. case CS43130_ASP_PCM_DAI:
  567. case CS43130_ASP_DOP_DAI:
  568. regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_PERIOD_1,
  569. CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
  570. CS43130_SP_LCPR_LSB_DATA_SHIFT);
  571. regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_PERIOD_2,
  572. CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
  573. CS43130_SP_LCPR_MSB_DATA_SHIFT);
  574. regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_HI_TIME_1,
  575. CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
  576. CS43130_SP_LCHI_LSB_DATA_SHIFT);
  577. regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_HI_TIME_2,
  578. CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
  579. CS43130_SP_LCHI_MSB_DATA_SHIFT);
  580. regmap_write(cs43130->regmap, CS43130_ASP_FRAME_CONF, frm_data);
  581. regmap_write(cs43130->regmap, CS43130_ASP_CH_1_LOC, loc_ch1);
  582. regmap_write(cs43130->regmap, CS43130_ASP_CH_2_LOC, loc_ch2);
  583. regmap_update_bits(cs43130->regmap, CS43130_ASP_CH_1_SZ_EN,
  584. CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
  585. regmap_update_bits(cs43130->regmap, CS43130_ASP_CH_2_SZ_EN,
  586. CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
  587. regmap_write(cs43130->regmap, CS43130_ASP_CLOCK_CONF, clk_data);
  588. break;
  589. case CS43130_XSP_DOP_DAI:
  590. regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_PERIOD_1,
  591. CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
  592. CS43130_SP_LCPR_LSB_DATA_SHIFT);
  593. regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_PERIOD_2,
  594. CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
  595. CS43130_SP_LCPR_MSB_DATA_SHIFT);
  596. regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_HI_TIME_1,
  597. CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
  598. CS43130_SP_LCHI_LSB_DATA_SHIFT);
  599. regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_HI_TIME_2,
  600. CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
  601. CS43130_SP_LCHI_MSB_DATA_SHIFT);
  602. regmap_write(cs43130->regmap, CS43130_XSP_FRAME_CONF, frm_data);
  603. regmap_write(cs43130->regmap, CS43130_XSP_CH_1_LOC, loc_ch1);
  604. regmap_write(cs43130->regmap, CS43130_XSP_CH_2_LOC, loc_ch2);
  605. regmap_update_bits(cs43130->regmap, CS43130_XSP_CH_1_SZ_EN,
  606. CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
  607. regmap_update_bits(cs43130->regmap, CS43130_XSP_CH_2_SZ_EN,
  608. CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
  609. regmap_write(cs43130->regmap, CS43130_XSP_CLOCK_CONF, clk_data);
  610. break;
  611. default:
  612. return -EINVAL;
  613. }
  614. switch (frm_size) {
  615. case 16:
  616. clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
  617. params_rate(params),
  618. cs43130_16_clk_gen,
  619. ARRAY_SIZE(cs43130_16_clk_gen));
  620. break;
  621. case 32:
  622. clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
  623. params_rate(params),
  624. cs43130_32_clk_gen,
  625. ARRAY_SIZE(cs43130_32_clk_gen));
  626. break;
  627. case 48:
  628. clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
  629. params_rate(params),
  630. cs43130_48_clk_gen,
  631. ARRAY_SIZE(cs43130_48_clk_gen));
  632. break;
  633. case 64:
  634. clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
  635. params_rate(params),
  636. cs43130_64_clk_gen,
  637. ARRAY_SIZE(cs43130_64_clk_gen));
  638. break;
  639. default:
  640. return -EINVAL;
  641. }
  642. if (!clk_gen)
  643. return -EINVAL;
  644. switch (dai_id) {
  645. case CS43130_ASP_PCM_DAI:
  646. case CS43130_ASP_DOP_DAI:
  647. regmap_write(cs43130->regmap, CS43130_ASP_DEN_1,
  648. (clk_gen->v.denominator & CS43130_SP_M_LSB_DATA_MASK) >>
  649. CS43130_SP_M_LSB_DATA_SHIFT);
  650. regmap_write(cs43130->regmap, CS43130_ASP_DEN_2,
  651. (clk_gen->v.denominator & CS43130_SP_M_MSB_DATA_MASK) >>
  652. CS43130_SP_M_MSB_DATA_SHIFT);
  653. regmap_write(cs43130->regmap, CS43130_ASP_NUM_1,
  654. (clk_gen->v.numerator & CS43130_SP_N_LSB_DATA_MASK) >>
  655. CS43130_SP_N_LSB_DATA_SHIFT);
  656. regmap_write(cs43130->regmap, CS43130_ASP_NUM_2,
  657. (clk_gen->v.numerator & CS43130_SP_N_MSB_DATA_MASK) >>
  658. CS43130_SP_N_MSB_DATA_SHIFT);
  659. break;
  660. case CS43130_XSP_DOP_DAI:
  661. regmap_write(cs43130->regmap, CS43130_XSP_DEN_1,
  662. (clk_gen->v.denominator & CS43130_SP_M_LSB_DATA_MASK) >>
  663. CS43130_SP_M_LSB_DATA_SHIFT);
  664. regmap_write(cs43130->regmap, CS43130_XSP_DEN_2,
  665. (clk_gen->v.denominator & CS43130_SP_M_MSB_DATA_MASK) >>
  666. CS43130_SP_M_MSB_DATA_SHIFT);
  667. regmap_write(cs43130->regmap, CS43130_XSP_NUM_1,
  668. (clk_gen->v.numerator & CS43130_SP_N_LSB_DATA_MASK) >>
  669. CS43130_SP_N_LSB_DATA_SHIFT);
  670. regmap_write(cs43130->regmap, CS43130_XSP_NUM_2,
  671. (clk_gen->v.numerator & CS43130_SP_N_MSB_DATA_MASK) >>
  672. CS43130_SP_N_MSB_DATA_SHIFT);
  673. break;
  674. default:
  675. return -EINVAL;
  676. }
  677. return 0;
  678. }
  679. static int cs43130_pcm_dsd_mix(bool en, struct regmap *regmap)
  680. {
  681. if (en) {
  682. regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
  683. CS43130_MIX_PCM_PREP_MASK,
  684. 1 << CS43130_MIX_PCM_PREP_SHIFT);
  685. usleep_range(6000, 6050);
  686. regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
  687. CS43130_MIX_PCM_DSD_MASK,
  688. 1 << CS43130_MIX_PCM_DSD_SHIFT);
  689. } else {
  690. regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
  691. CS43130_MIX_PCM_DSD_MASK,
  692. 0 << CS43130_MIX_PCM_DSD_SHIFT);
  693. usleep_range(1600, 1650);
  694. regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
  695. CS43130_MIX_PCM_PREP_MASK,
  696. 0 << CS43130_MIX_PCM_PREP_SHIFT);
  697. }
  698. return 0;
  699. }
  700. static int cs43130_dsd_hw_params(struct snd_pcm_substream *substream,
  701. struct snd_pcm_hw_params *params,
  702. struct snd_soc_dai *dai)
  703. {
  704. struct snd_soc_component *component = dai->component;
  705. struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
  706. unsigned int required_clk;
  707. u8 dsd_speed;
  708. mutex_lock(&cs43130->clk_mutex);
  709. if (!cs43130->clk_req) {
  710. /* no DAI is currently using clk */
  711. if (!(CS43130_MCLK_22M % params_rate(params)))
  712. required_clk = CS43130_MCLK_22M;
  713. else
  714. required_clk = CS43130_MCLK_24M;
  715. cs43130_set_pll(component, 0, 0, cs43130->mclk, required_clk);
  716. if (cs43130->pll_bypass)
  717. cs43130_change_clksrc(component, CS43130_MCLK_SRC_EXT);
  718. else
  719. cs43130_change_clksrc(component, CS43130_MCLK_SRC_PLL);
  720. }
  721. cs43130->clk_req++;
  722. if (cs43130->clk_req == 2)
  723. cs43130_pcm_dsd_mix(true, cs43130->regmap);
  724. mutex_unlock(&cs43130->clk_mutex);
  725. switch (params_rate(params)) {
  726. case 176400:
  727. dsd_speed = 0;
  728. break;
  729. case 352800:
  730. dsd_speed = 1;
  731. break;
  732. default:
  733. dev_err(component->dev, "Rate(%u) not supported\n",
  734. params_rate(params));
  735. return -EINVAL;
  736. }
  737. if (cs43130->dais[dai->id].dai_mode == SND_SOC_DAIFMT_CBM_CFM)
  738. regmap_update_bits(cs43130->regmap, CS43130_DSD_INT_CFG,
  739. CS43130_DSD_MASTER, CS43130_DSD_MASTER);
  740. else
  741. regmap_update_bits(cs43130->regmap, CS43130_DSD_INT_CFG,
  742. CS43130_DSD_MASTER, 0);
  743. regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
  744. CS43130_DSD_SPEED_MASK,
  745. dsd_speed << CS43130_DSD_SPEED_SHIFT);
  746. regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
  747. CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_DSD <<
  748. CS43130_DSD_SRC_SHIFT);
  749. return 0;
  750. }
  751. static int cs43130_hw_params(struct snd_pcm_substream *substream,
  752. struct snd_pcm_hw_params *params,
  753. struct snd_soc_dai *dai)
  754. {
  755. struct snd_soc_component *component = dai->component;
  756. struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
  757. const struct cs43130_rate_map *rate_map;
  758. unsigned int sclk = cs43130->dais[dai->id].sclk;
  759. unsigned int bitwidth_sclk;
  760. unsigned int bitwidth_dai = (unsigned int)(params_width(params));
  761. unsigned int required_clk;
  762. u8 dsd_speed;
  763. mutex_lock(&cs43130->clk_mutex);
  764. if (!cs43130->clk_req) {
  765. /* no DAI is currently using clk */
  766. if (!(CS43130_MCLK_22M % params_rate(params)))
  767. required_clk = CS43130_MCLK_22M;
  768. else
  769. required_clk = CS43130_MCLK_24M;
  770. cs43130_set_pll(component, 0, 0, cs43130->mclk, required_clk);
  771. if (cs43130->pll_bypass)
  772. cs43130_change_clksrc(component, CS43130_MCLK_SRC_EXT);
  773. else
  774. cs43130_change_clksrc(component, CS43130_MCLK_SRC_PLL);
  775. }
  776. cs43130->clk_req++;
  777. if (cs43130->clk_req == 2)
  778. cs43130_pcm_dsd_mix(true, cs43130->regmap);
  779. mutex_unlock(&cs43130->clk_mutex);
  780. switch (dai->id) {
  781. case CS43130_ASP_DOP_DAI:
  782. case CS43130_XSP_DOP_DAI:
  783. /* DoP bitwidth is always 24-bit */
  784. bitwidth_dai = 24;
  785. sclk = params_rate(params) * bitwidth_dai *
  786. params_channels(params);
  787. switch (params_rate(params)) {
  788. case 176400:
  789. dsd_speed = 0;
  790. break;
  791. case 352800:
  792. dsd_speed = 1;
  793. break;
  794. default:
  795. dev_err(component->dev, "Rate(%u) not supported\n",
  796. params_rate(params));
  797. return -EINVAL;
  798. }
  799. regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
  800. CS43130_DSD_SPEED_MASK,
  801. dsd_speed << CS43130_DSD_SPEED_SHIFT);
  802. break;
  803. case CS43130_ASP_PCM_DAI:
  804. rate_map = cs43130_get_rate_table(params_rate(params));
  805. if (!rate_map)
  806. return -EINVAL;
  807. regmap_write(cs43130->regmap, CS43130_SP_SRATE, rate_map->val);
  808. break;
  809. default:
  810. dev_err(component->dev, "Invalid DAI (%d)\n", dai->id);
  811. return -EINVAL;
  812. }
  813. switch (dai->id) {
  814. case CS43130_ASP_DOP_DAI:
  815. regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
  816. CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_ASP <<
  817. CS43130_DSD_SRC_SHIFT);
  818. break;
  819. case CS43130_XSP_DOP_DAI:
  820. regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
  821. CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_XSP <<
  822. CS43130_DSD_SRC_SHIFT);
  823. break;
  824. }
  825. if (!sclk && cs43130->dais[dai->id].dai_mode == SND_SOC_DAIFMT_CBM_CFM)
  826. /* Calculate SCLK in master mode if unassigned */
  827. sclk = params_rate(params) * bitwidth_dai *
  828. params_channels(params);
  829. if (!sclk) {
  830. /* at this point, SCLK must be set */
  831. dev_err(component->dev, "SCLK freq is not set\n");
  832. return -EINVAL;
  833. }
  834. bitwidth_sclk = (sclk / params_rate(params)) / params_channels(params);
  835. if (bitwidth_sclk < bitwidth_dai) {
  836. dev_err(component->dev, "Format not supported: SCLK freq is too low\n");
  837. return -EINVAL;
  838. }
  839. dev_dbg(component->dev,
  840. "sclk = %u, fs = %d, bitwidth_dai = %u\n",
  841. sclk, params_rate(params), bitwidth_dai);
  842. dev_dbg(component->dev,
  843. "bitwidth_sclk = %u, num_ch = %u\n",
  844. bitwidth_sclk, params_channels(params));
  845. cs43130_set_bitwidth(dai->id, bitwidth_dai, cs43130->regmap);
  846. cs43130_set_sp_fmt(dai->id, bitwidth_sclk, params, cs43130);
  847. return 0;
  848. }
  849. static int cs43130_hw_free(struct snd_pcm_substream *substream,
  850. struct snd_soc_dai *dai)
  851. {
  852. struct snd_soc_component *component = dai->component;
  853. struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
  854. mutex_lock(&cs43130->clk_mutex);
  855. cs43130->clk_req--;
  856. if (!cs43130->clk_req) {
  857. /* no DAI is currently using clk */
  858. cs43130_change_clksrc(component, CS43130_MCLK_SRC_RCO);
  859. cs43130_pcm_dsd_mix(false, cs43130->regmap);
  860. }
  861. mutex_unlock(&cs43130->clk_mutex);
  862. return 0;
  863. }
  864. static const DECLARE_TLV_DB_SCALE(pcm_vol_tlv, -12750, 50, 1);
  865. static const char * const pcm_ch_text[] = {
  866. "Left-Right Ch",
  867. "Left-Left Ch",
  868. "Right-Left Ch",
  869. "Right-Right Ch",
  870. };
  871. static const struct reg_sequence pcm_ch_en_seq[] = {
  872. {CS43130_DXD1, 0x99},
  873. {0x180005, 0x8C},
  874. {0x180007, 0xAB},
  875. {0x180015, 0x31},
  876. {0x180017, 0xB2},
  877. {0x180025, 0x30},
  878. {0x180027, 0x84},
  879. {0x180035, 0x9C},
  880. {0x180037, 0xAE},
  881. {0x18000D, 0x24},
  882. {0x18000F, 0xA3},
  883. {0x18001D, 0x05},
  884. {0x18001F, 0xD4},
  885. {0x18002D, 0x0B},
  886. {0x18002F, 0xC7},
  887. {0x18003D, 0x71},
  888. {0x18003F, 0xE7},
  889. {CS43130_DXD1, 0},
  890. };
  891. static const struct reg_sequence pcm_ch_dis_seq[] = {
  892. {CS43130_DXD1, 0x99},
  893. {0x180005, 0x24},
  894. {0x180007, 0xA3},
  895. {0x180015, 0x05},
  896. {0x180017, 0xD4},
  897. {0x180025, 0x0B},
  898. {0x180027, 0xC7},
  899. {0x180035, 0x71},
  900. {0x180037, 0xE7},
  901. {0x18000D, 0x8C},
  902. {0x18000F, 0xAB},
  903. {0x18001D, 0x31},
  904. {0x18001F, 0xB2},
  905. {0x18002D, 0x30},
  906. {0x18002F, 0x84},
  907. {0x18003D, 0x9C},
  908. {0x18003F, 0xAE},
  909. {CS43130_DXD1, 0},
  910. };
  911. static int cs43130_pcm_ch_get(struct snd_kcontrol *kcontrol,
  912. struct snd_ctl_elem_value *ucontrol)
  913. {
  914. return snd_soc_get_enum_double(kcontrol, ucontrol);
  915. }
  916. static int cs43130_pcm_ch_put(struct snd_kcontrol *kcontrol,
  917. struct snd_ctl_elem_value *ucontrol)
  918. {
  919. struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
  920. unsigned int *item = ucontrol->value.enumerated.item;
  921. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  922. struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
  923. unsigned int val;
  924. if (item[0] >= e->items)
  925. return -EINVAL;
  926. val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l;
  927. switch (cs43130->dev_id) {
  928. case CS43131_CHIP_ID:
  929. case CS43198_CHIP_ID:
  930. if (val >= 2)
  931. regmap_multi_reg_write(cs43130->regmap, pcm_ch_en_seq,
  932. ARRAY_SIZE(pcm_ch_en_seq));
  933. else
  934. regmap_multi_reg_write(cs43130->regmap, pcm_ch_dis_seq,
  935. ARRAY_SIZE(pcm_ch_dis_seq));
  936. break;
  937. }
  938. return snd_soc_put_enum_double(kcontrol, ucontrol);
  939. }
  940. static SOC_ENUM_SINGLE_DECL(pcm_ch_enum, CS43130_PCM_PATH_CTL_2, 0,
  941. pcm_ch_text);
  942. static const char * const pcm_spd_texts[] = {
  943. "Fast",
  944. "Slow",
  945. };
  946. static SOC_ENUM_SINGLE_DECL(pcm_spd_enum, CS43130_PCM_FILT_OPT, 7,
  947. pcm_spd_texts);
  948. static const char * const dsd_texts[] = {
  949. "Off",
  950. "BCKA Mode",
  951. "BCKD Mode",
  952. };
  953. static const unsigned int dsd_values[] = {
  954. CS43130_DSD_SRC_DSD,
  955. CS43130_DSD_SRC_ASP,
  956. CS43130_DSD_SRC_XSP,
  957. };
  958. static SOC_VALUE_ENUM_SINGLE_DECL(dsd_enum, CS43130_DSD_INT_CFG, 0, 0x03,
  959. dsd_texts, dsd_values);
  960. static const struct snd_kcontrol_new cs43130_snd_controls[] = {
  961. SOC_DOUBLE_R_TLV("Master Playback Volume",
  962. CS43130_PCM_VOL_A, CS43130_PCM_VOL_B, 0, 0xFF, 1,
  963. pcm_vol_tlv),
  964. SOC_DOUBLE_R_TLV("Master DSD Playback Volume",
  965. CS43130_DSD_VOL_A, CS43130_DSD_VOL_B, 0, 0xFF, 1,
  966. pcm_vol_tlv),
  967. SOC_ENUM_EXT("PCM Ch Select", pcm_ch_enum, cs43130_pcm_ch_get,
  968. cs43130_pcm_ch_put),
  969. SOC_ENUM("PCM Filter Speed", pcm_spd_enum),
  970. SOC_SINGLE("PCM Phase Compensation", CS43130_PCM_FILT_OPT, 6, 1, 0),
  971. SOC_SINGLE("PCM Nonoversample Emulate", CS43130_PCM_FILT_OPT, 5, 1, 0),
  972. SOC_SINGLE("PCM High-pass Filter", CS43130_PCM_FILT_OPT, 1, 1, 0),
  973. SOC_SINGLE("PCM De-emphasis Filter", CS43130_PCM_FILT_OPT, 0, 1, 0),
  974. SOC_ENUM("DSD Phase Modulation", dsd_enum),
  975. };
  976. static const struct reg_sequence pcm_seq[] = {
  977. {CS43130_DXD1, 0x99},
  978. {CS43130_DXD7, 0x01},
  979. {CS43130_DXD8, 0},
  980. {CS43130_DXD9, 0x01},
  981. {CS43130_DXD3, 0x12},
  982. {CS43130_DXD4, 0},
  983. {CS43130_DXD10, 0x28},
  984. {CS43130_DXD11, 0x28},
  985. {CS43130_DXD1, 0},
  986. };
  987. static const struct reg_sequence dsd_seq[] = {
  988. {CS43130_DXD1, 0x99},
  989. {CS43130_DXD7, 0x01},
  990. {CS43130_DXD8, 0},
  991. {CS43130_DXD9, 0x01},
  992. {CS43130_DXD3, 0x12},
  993. {CS43130_DXD4, 0},
  994. {CS43130_DXD10, 0x1E},
  995. {CS43130_DXD11, 0x20},
  996. {CS43130_DXD1, 0},
  997. };
  998. static const struct reg_sequence pop_free_seq[] = {
  999. {CS43130_DXD1, 0x99},
  1000. {CS43130_DXD12, 0x0A},
  1001. {CS43130_DXD1, 0},
  1002. };
  1003. static const struct reg_sequence pop_free_seq2[] = {
  1004. {CS43130_DXD1, 0x99},
  1005. {CS43130_DXD13, 0x20},
  1006. {CS43130_DXD1, 0},
  1007. };
  1008. static const struct reg_sequence mute_seq[] = {
  1009. {CS43130_DXD1, 0x99},
  1010. {CS43130_DXD3, 0x12},
  1011. {CS43130_DXD5, 0x02},
  1012. {CS43130_DXD4, 0x12},
  1013. {CS43130_DXD1, 0},
  1014. };
  1015. static const struct reg_sequence unmute_seq[] = {
  1016. {CS43130_DXD1, 0x99},
  1017. {CS43130_DXD3, 0x10},
  1018. {CS43130_DXD5, 0},
  1019. {CS43130_DXD4, 0x16},
  1020. {CS43130_DXD1, 0},
  1021. };
  1022. static int cs43130_dsd_event(struct snd_soc_dapm_widget *w,
  1023. struct snd_kcontrol *kcontrol, int event)
  1024. {
  1025. struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
  1026. struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
  1027. switch (event) {
  1028. case SND_SOC_DAPM_PRE_PMU:
  1029. switch (cs43130->dev_id) {
  1030. case CS43130_CHIP_ID:
  1031. case CS4399_CHIP_ID:
  1032. regmap_multi_reg_write(cs43130->regmap, dsd_seq,
  1033. ARRAY_SIZE(dsd_seq));
  1034. break;
  1035. }
  1036. break;
  1037. case SND_SOC_DAPM_POST_PMU:
  1038. regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_1,
  1039. CS43130_MUTE_MASK, 0);
  1040. switch (cs43130->dev_id) {
  1041. case CS43130_CHIP_ID:
  1042. case CS4399_CHIP_ID:
  1043. regmap_multi_reg_write(cs43130->regmap, unmute_seq,
  1044. ARRAY_SIZE(unmute_seq));
  1045. break;
  1046. }
  1047. break;
  1048. case SND_SOC_DAPM_PRE_PMD:
  1049. switch (cs43130->dev_id) {
  1050. case CS43130_CHIP_ID:
  1051. case CS4399_CHIP_ID:
  1052. regmap_multi_reg_write(cs43130->regmap, mute_seq,
  1053. ARRAY_SIZE(mute_seq));
  1054. regmap_update_bits(cs43130->regmap,
  1055. CS43130_DSD_PATH_CTL_1,
  1056. CS43130_MUTE_MASK, CS43130_MUTE_EN);
  1057. /*
  1058. * DSD Power Down Sequence
  1059. * According to Design, 130ms is preferred.
  1060. */
  1061. msleep(130);
  1062. break;
  1063. case CS43131_CHIP_ID:
  1064. case CS43198_CHIP_ID:
  1065. regmap_update_bits(cs43130->regmap,
  1066. CS43130_DSD_PATH_CTL_1,
  1067. CS43130_MUTE_MASK, CS43130_MUTE_EN);
  1068. break;
  1069. }
  1070. break;
  1071. default:
  1072. dev_err(component->dev, "Invalid event = 0x%x\n", event);
  1073. return -EINVAL;
  1074. }
  1075. return 0;
  1076. }
  1077. static int cs43130_pcm_event(struct snd_soc_dapm_widget *w,
  1078. struct snd_kcontrol *kcontrol, int event)
  1079. {
  1080. struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
  1081. struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
  1082. switch (event) {
  1083. case SND_SOC_DAPM_PRE_PMU:
  1084. switch (cs43130->dev_id) {
  1085. case CS43130_CHIP_ID:
  1086. case CS4399_CHIP_ID:
  1087. regmap_multi_reg_write(cs43130->regmap, pcm_seq,
  1088. ARRAY_SIZE(pcm_seq));
  1089. break;
  1090. }
  1091. break;
  1092. case SND_SOC_DAPM_POST_PMU:
  1093. regmap_update_bits(cs43130->regmap, CS43130_PCM_PATH_CTL_1,
  1094. CS43130_MUTE_MASK, 0);
  1095. switch (cs43130->dev_id) {
  1096. case CS43130_CHIP_ID:
  1097. case CS4399_CHIP_ID:
  1098. regmap_multi_reg_write(cs43130->regmap, unmute_seq,
  1099. ARRAY_SIZE(unmute_seq));
  1100. break;
  1101. }
  1102. break;
  1103. case SND_SOC_DAPM_PRE_PMD:
  1104. switch (cs43130->dev_id) {
  1105. case CS43130_CHIP_ID:
  1106. case CS4399_CHIP_ID:
  1107. regmap_multi_reg_write(cs43130->regmap, mute_seq,
  1108. ARRAY_SIZE(mute_seq));
  1109. regmap_update_bits(cs43130->regmap,
  1110. CS43130_PCM_PATH_CTL_1,
  1111. CS43130_MUTE_MASK, CS43130_MUTE_EN);
  1112. /*
  1113. * PCM Power Down Sequence
  1114. * According to Design, 130ms is preferred.
  1115. */
  1116. msleep(130);
  1117. break;
  1118. case CS43131_CHIP_ID:
  1119. case CS43198_CHIP_ID:
  1120. regmap_update_bits(cs43130->regmap,
  1121. CS43130_PCM_PATH_CTL_1,
  1122. CS43130_MUTE_MASK, CS43130_MUTE_EN);
  1123. break;
  1124. }
  1125. break;
  1126. default:
  1127. dev_err(component->dev, "Invalid event = 0x%x\n", event);
  1128. return -EINVAL;
  1129. }
  1130. return 0;
  1131. }
  1132. static const struct reg_sequence dac_postpmu_seq[] = {
  1133. {CS43130_DXD9, 0x0C},
  1134. {CS43130_DXD3, 0x10},
  1135. {CS43130_DXD4, 0x20},
  1136. };
  1137. static const struct reg_sequence dac_postpmd_seq[] = {
  1138. {CS43130_DXD1, 0x99},
  1139. {CS43130_DXD6, 0x01},
  1140. {CS43130_DXD1, 0},
  1141. };
  1142. static int cs43130_dac_event(struct snd_soc_dapm_widget *w,
  1143. struct snd_kcontrol *kcontrol, int event)
  1144. {
  1145. struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
  1146. struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
  1147. switch (event) {
  1148. case SND_SOC_DAPM_PRE_PMU:
  1149. switch (cs43130->dev_id) {
  1150. case CS43130_CHIP_ID:
  1151. case CS4399_CHIP_ID:
  1152. regmap_multi_reg_write(cs43130->regmap, pop_free_seq,
  1153. ARRAY_SIZE(pop_free_seq));
  1154. break;
  1155. case CS43131_CHIP_ID:
  1156. case CS43198_CHIP_ID:
  1157. regmap_multi_reg_write(cs43130->regmap, pop_free_seq2,
  1158. ARRAY_SIZE(pop_free_seq2));
  1159. break;
  1160. }
  1161. break;
  1162. case SND_SOC_DAPM_POST_PMU:
  1163. usleep_range(10000, 10050);
  1164. regmap_write(cs43130->regmap, CS43130_DXD1, 0x99);
  1165. switch (cs43130->dev_id) {
  1166. case CS43130_CHIP_ID:
  1167. case CS4399_CHIP_ID:
  1168. regmap_multi_reg_write(cs43130->regmap, dac_postpmu_seq,
  1169. ARRAY_SIZE(dac_postpmu_seq));
  1170. /*
  1171. * Per datasheet, Sec. PCM Power-Up Sequence.
  1172. * According to Design, CS43130_DXD12 must be 0 to meet
  1173. * THDN and Dynamic Range spec.
  1174. */
  1175. msleep(1000);
  1176. regmap_write(cs43130->regmap, CS43130_DXD12, 0);
  1177. break;
  1178. case CS43131_CHIP_ID:
  1179. case CS43198_CHIP_ID:
  1180. usleep_range(12000, 12010);
  1181. regmap_write(cs43130->regmap, CS43130_DXD13, 0);
  1182. break;
  1183. }
  1184. regmap_write(cs43130->regmap, CS43130_DXD1, 0);
  1185. break;
  1186. case SND_SOC_DAPM_POST_PMD:
  1187. switch (cs43130->dev_id) {
  1188. case CS43130_CHIP_ID:
  1189. case CS4399_CHIP_ID:
  1190. regmap_multi_reg_write(cs43130->regmap, dac_postpmd_seq,
  1191. ARRAY_SIZE(dac_postpmd_seq));
  1192. break;
  1193. }
  1194. break;
  1195. default:
  1196. dev_err(component->dev, "Invalid DAC event = 0x%x\n", event);
  1197. return -EINVAL;
  1198. }
  1199. return 0;
  1200. }
  1201. static const struct reg_sequence hpin_prepmd_seq[] = {
  1202. {CS43130_DXD1, 0x99},
  1203. {CS43130_DXD15, 0x64},
  1204. {CS43130_DXD14, 0},
  1205. {CS43130_DXD2, 0},
  1206. {CS43130_DXD1, 0},
  1207. };
  1208. static const struct reg_sequence hpin_postpmu_seq[] = {
  1209. {CS43130_DXD1, 0x99},
  1210. {CS43130_DXD2, 1},
  1211. {CS43130_DXD14, 0xDC},
  1212. {CS43130_DXD15, 0xE4},
  1213. {CS43130_DXD1, 0},
  1214. };
  1215. static int cs43130_hpin_event(struct snd_soc_dapm_widget *w,
  1216. struct snd_kcontrol *kcontrol, int event)
  1217. {
  1218. struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
  1219. struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
  1220. switch (event) {
  1221. case SND_SOC_DAPM_POST_PMD:
  1222. regmap_multi_reg_write(cs43130->regmap, hpin_prepmd_seq,
  1223. ARRAY_SIZE(hpin_prepmd_seq));
  1224. break;
  1225. case SND_SOC_DAPM_PRE_PMU:
  1226. regmap_multi_reg_write(cs43130->regmap, hpin_postpmu_seq,
  1227. ARRAY_SIZE(hpin_postpmu_seq));
  1228. break;
  1229. default:
  1230. dev_err(component->dev, "Invalid HPIN event = 0x%x\n", event);
  1231. return -EINVAL;
  1232. }
  1233. return 0;
  1234. }
  1235. static const struct snd_soc_dapm_widget digital_hp_widgets[] = {
  1236. SND_SOC_DAPM_OUTPUT("HPOUTA"),
  1237. SND_SOC_DAPM_OUTPUT("HPOUTB"),
  1238. SND_SOC_DAPM_AIF_IN_E("ASPIN PCM", NULL, 0, CS43130_PWDN_CTL,
  1239. CS43130_PDN_ASP_SHIFT, 1, cs43130_pcm_event,
  1240. (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  1241. SND_SOC_DAPM_PRE_PMD)),
  1242. SND_SOC_DAPM_AIF_IN_E("ASPIN DoP", NULL, 0, CS43130_PWDN_CTL,
  1243. CS43130_PDN_ASP_SHIFT, 1, cs43130_dsd_event,
  1244. (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  1245. SND_SOC_DAPM_PRE_PMD)),
  1246. SND_SOC_DAPM_AIF_IN_E("XSPIN DoP", NULL, 0, CS43130_PWDN_CTL,
  1247. CS43130_PDN_XSP_SHIFT, 1, cs43130_dsd_event,
  1248. (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  1249. SND_SOC_DAPM_PRE_PMD)),
  1250. SND_SOC_DAPM_AIF_IN_E("XSPIN DSD", NULL, 0, CS43130_PWDN_CTL,
  1251. CS43130_PDN_DSDIF_SHIFT, 1, cs43130_dsd_event,
  1252. (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  1253. SND_SOC_DAPM_PRE_PMD)),
  1254. SND_SOC_DAPM_DAC("DSD", NULL, CS43130_DSD_PATH_CTL_2,
  1255. CS43130_DSD_EN_SHIFT, 0),
  1256. SND_SOC_DAPM_DAC_E("HiFi DAC", NULL, CS43130_PWDN_CTL,
  1257. CS43130_PDN_HP_SHIFT, 1, cs43130_dac_event,
  1258. (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
  1259. SND_SOC_DAPM_POST_PMD)),
  1260. };
  1261. static const struct snd_soc_dapm_widget analog_hp_widgets[] = {
  1262. SND_SOC_DAPM_DAC_E("Analog Playback", NULL, CS43130_HP_OUT_CTL_1,
  1263. CS43130_HP_IN_EN_SHIFT, 0, cs43130_hpin_event,
  1264. (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD)),
  1265. };
  1266. static struct snd_soc_dapm_widget all_hp_widgets[
  1267. ARRAY_SIZE(digital_hp_widgets) +
  1268. ARRAY_SIZE(analog_hp_widgets)];
  1269. static const struct snd_soc_dapm_route digital_hp_routes[] = {
  1270. {"ASPIN PCM", NULL, "ASP PCM Playback"},
  1271. {"ASPIN DoP", NULL, "ASP DoP Playback"},
  1272. {"XSPIN DoP", NULL, "XSP DoP Playback"},
  1273. {"XSPIN DSD", NULL, "XSP DSD Playback"},
  1274. {"DSD", NULL, "ASPIN DoP"},
  1275. {"DSD", NULL, "XSPIN DoP"},
  1276. {"DSD", NULL, "XSPIN DSD"},
  1277. {"HiFi DAC", NULL, "ASPIN PCM"},
  1278. {"HiFi DAC", NULL, "DSD"},
  1279. {"HPOUTA", NULL, "HiFi DAC"},
  1280. {"HPOUTB", NULL, "HiFi DAC"},
  1281. };
  1282. static const struct snd_soc_dapm_route analog_hp_routes[] = {
  1283. {"HPOUTA", NULL, "Analog Playback"},
  1284. {"HPOUTB", NULL, "Analog Playback"},
  1285. };
  1286. static struct snd_soc_dapm_route all_hp_routes[
  1287. ARRAY_SIZE(digital_hp_routes) +
  1288. ARRAY_SIZE(analog_hp_routes)];
  1289. static const unsigned int cs43130_asp_src_rates[] = {
  1290. 32000, 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
  1291. };
  1292. static const struct snd_pcm_hw_constraint_list cs43130_asp_constraints = {
  1293. .count = ARRAY_SIZE(cs43130_asp_src_rates),
  1294. .list = cs43130_asp_src_rates,
  1295. };
  1296. static int cs43130_pcm_startup(struct snd_pcm_substream *substream,
  1297. struct snd_soc_dai *dai)
  1298. {
  1299. return snd_pcm_hw_constraint_list(substream->runtime, 0,
  1300. SNDRV_PCM_HW_PARAM_RATE,
  1301. &cs43130_asp_constraints);
  1302. }
  1303. static const unsigned int cs43130_dop_src_rates[] = {
  1304. 176400, 352800,
  1305. };
  1306. static const struct snd_pcm_hw_constraint_list cs43130_dop_constraints = {
  1307. .count = ARRAY_SIZE(cs43130_dop_src_rates),
  1308. .list = cs43130_dop_src_rates,
  1309. };
  1310. static int cs43130_dop_startup(struct snd_pcm_substream *substream,
  1311. struct snd_soc_dai *dai)
  1312. {
  1313. return snd_pcm_hw_constraint_list(substream->runtime, 0,
  1314. SNDRV_PCM_HW_PARAM_RATE,
  1315. &cs43130_dop_constraints);
  1316. }
  1317. static int cs43130_pcm_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
  1318. {
  1319. struct snd_soc_component *component = codec_dai->component;
  1320. struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
  1321. switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
  1322. case SND_SOC_DAIFMT_CBS_CFS:
  1323. cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBS_CFS;
  1324. break;
  1325. case SND_SOC_DAIFMT_CBM_CFM:
  1326. cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBM_CFM;
  1327. break;
  1328. default:
  1329. dev_err(component->dev, "unsupported mode\n");
  1330. return -EINVAL;
  1331. }
  1332. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  1333. case SND_SOC_DAIFMT_I2S:
  1334. cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_I2S;
  1335. break;
  1336. case SND_SOC_DAIFMT_LEFT_J:
  1337. cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_LEFT_J;
  1338. break;
  1339. case SND_SOC_DAIFMT_DSP_A:
  1340. cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_DSP_A;
  1341. break;
  1342. case SND_SOC_DAIFMT_DSP_B:
  1343. cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_DSP_B;
  1344. break;
  1345. default:
  1346. dev_err(component->dev,
  1347. "unsupported audio format\n");
  1348. return -EINVAL;
  1349. }
  1350. dev_dbg(component->dev, "dai_id = %d, dai_mode = %u, dai_format = %u\n",
  1351. codec_dai->id,
  1352. cs43130->dais[codec_dai->id].dai_mode,
  1353. cs43130->dais[codec_dai->id].dai_format);
  1354. return 0;
  1355. }
  1356. static int cs43130_dsd_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
  1357. {
  1358. struct snd_soc_component *component = codec_dai->component;
  1359. struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
  1360. switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
  1361. case SND_SOC_DAIFMT_CBS_CFS:
  1362. cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBS_CFS;
  1363. break;
  1364. case SND_SOC_DAIFMT_CBM_CFM:
  1365. cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBM_CFM;
  1366. break;
  1367. default:
  1368. dev_err(component->dev, "Unsupported DAI format.\n");
  1369. return -EINVAL;
  1370. }
  1371. dev_dbg(component->dev, "dai_mode = 0x%x\n",
  1372. cs43130->dais[codec_dai->id].dai_mode);
  1373. return 0;
  1374. }
  1375. static int cs43130_set_sysclk(struct snd_soc_dai *codec_dai,
  1376. int clk_id, unsigned int freq, int dir)
  1377. {
  1378. struct snd_soc_component *component = codec_dai->component;
  1379. struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
  1380. cs43130->dais[codec_dai->id].sclk = freq;
  1381. dev_dbg(component->dev, "dai_id = %d, sclk = %u\n", codec_dai->id,
  1382. cs43130->dais[codec_dai->id].sclk);
  1383. return 0;
  1384. }
  1385. static const struct snd_soc_dai_ops cs43130_pcm_ops = {
  1386. .startup = cs43130_pcm_startup,
  1387. .hw_params = cs43130_hw_params,
  1388. .hw_free = cs43130_hw_free,
  1389. .set_sysclk = cs43130_set_sysclk,
  1390. .set_fmt = cs43130_pcm_set_fmt,
  1391. };
  1392. static const struct snd_soc_dai_ops cs43130_dop_ops = {
  1393. .startup = cs43130_dop_startup,
  1394. .hw_params = cs43130_hw_params,
  1395. .hw_free = cs43130_hw_free,
  1396. .set_sysclk = cs43130_set_sysclk,
  1397. .set_fmt = cs43130_pcm_set_fmt,
  1398. };
  1399. static const struct snd_soc_dai_ops cs43130_dsd_ops = {
  1400. .startup = cs43130_dop_startup,
  1401. .hw_params = cs43130_dsd_hw_params,
  1402. .hw_free = cs43130_hw_free,
  1403. .set_fmt = cs43130_dsd_set_fmt,
  1404. };
  1405. static struct snd_soc_dai_driver cs43130_dai[] = {
  1406. {
  1407. .name = "cs43130-asp-pcm",
  1408. .id = CS43130_ASP_PCM_DAI,
  1409. .playback = {
  1410. .stream_name = "ASP PCM Playback",
  1411. .channels_min = 1,
  1412. .channels_max = 2,
  1413. .rates = SNDRV_PCM_RATE_KNOT,
  1414. .formats = CS43130_PCM_FORMATS,
  1415. },
  1416. .ops = &cs43130_pcm_ops,
  1417. .symmetric_rate = 1,
  1418. },
  1419. {
  1420. .name = "cs43130-asp-dop",
  1421. .id = CS43130_ASP_DOP_DAI,
  1422. .playback = {
  1423. .stream_name = "ASP DoP Playback",
  1424. .channels_min = 1,
  1425. .channels_max = 2,
  1426. .rates = SNDRV_PCM_RATE_KNOT,
  1427. .formats = CS43130_DOP_FORMATS,
  1428. },
  1429. .ops = &cs43130_dop_ops,
  1430. .symmetric_rate = 1,
  1431. },
  1432. {
  1433. .name = "cs43130-xsp-dop",
  1434. .id = CS43130_XSP_DOP_DAI,
  1435. .playback = {
  1436. .stream_name = "XSP DoP Playback",
  1437. .channels_min = 1,
  1438. .channels_max = 2,
  1439. .rates = SNDRV_PCM_RATE_KNOT,
  1440. .formats = CS43130_DOP_FORMATS,
  1441. },
  1442. .ops = &cs43130_dop_ops,
  1443. .symmetric_rate = 1,
  1444. },
  1445. {
  1446. .name = "cs43130-xsp-dsd",
  1447. .id = CS43130_XSP_DSD_DAI,
  1448. .playback = {
  1449. .stream_name = "XSP DSD Playback",
  1450. .channels_min = 1,
  1451. .channels_max = 2,
  1452. .rates = SNDRV_PCM_RATE_KNOT,
  1453. .formats = CS43130_DOP_FORMATS,
  1454. },
  1455. .ops = &cs43130_dsd_ops,
  1456. },
  1457. };
  1458. static int cs43130_component_set_sysclk(struct snd_soc_component *component,
  1459. int clk_id, int source, unsigned int freq,
  1460. int dir)
  1461. {
  1462. struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
  1463. dev_dbg(component->dev, "clk_id = %d, source = %d, freq = %d, dir = %d\n",
  1464. clk_id, source, freq, dir);
  1465. switch (freq) {
  1466. case CS43130_MCLK_22M:
  1467. case CS43130_MCLK_24M:
  1468. cs43130->mclk = freq;
  1469. break;
  1470. default:
  1471. dev_err(component->dev, "Invalid MCLK INT freq: %u\n", freq);
  1472. return -EINVAL;
  1473. }
  1474. if (source == CS43130_MCLK_SRC_EXT) {
  1475. cs43130->pll_bypass = true;
  1476. } else {
  1477. dev_err(component->dev, "Invalid MCLK source\n");
  1478. return -EINVAL;
  1479. }
  1480. return 0;
  1481. }
  1482. static inline u16 cs43130_get_ac_reg_val(u16 ac_freq)
  1483. {
  1484. /* AC freq is counted in 5.94Hz step. */
  1485. return ac_freq / 6;
  1486. }
  1487. static int cs43130_show_dc(struct device *dev, char *buf, u8 ch)
  1488. {
  1489. struct i2c_client *client = to_i2c_client(dev);
  1490. struct cs43130_private *cs43130 = i2c_get_clientdata(client);
  1491. if (!cs43130->hpload_done)
  1492. return sysfs_emit(buf, "NO_HPLOAD\n");
  1493. else
  1494. return sysfs_emit(buf, "%u\n", cs43130->hpload_dc[ch]);
  1495. }
  1496. static ssize_t hpload_dc_l_show(struct device *dev,
  1497. struct device_attribute *attr, char *buf)
  1498. {
  1499. return cs43130_show_dc(dev, buf, HP_LEFT);
  1500. }
  1501. static ssize_t hpload_dc_r_show(struct device *dev,
  1502. struct device_attribute *attr, char *buf)
  1503. {
  1504. return cs43130_show_dc(dev, buf, HP_RIGHT);
  1505. }
  1506. static u16 const cs43130_ac_freq[CS43130_AC_FREQ] = {
  1507. 24,
  1508. 43,
  1509. 93,
  1510. 200,
  1511. 431,
  1512. 928,
  1513. 2000,
  1514. 4309,
  1515. 9283,
  1516. 20000,
  1517. };
  1518. static int cs43130_show_ac(struct device *dev, char *buf, u8 ch)
  1519. {
  1520. int i, j = 0, tmp;
  1521. struct i2c_client *client = to_i2c_client(dev);
  1522. struct cs43130_private *cs43130 = i2c_get_clientdata(client);
  1523. if (cs43130->hpload_done && cs43130->ac_meas) {
  1524. for (i = 0; i < ARRAY_SIZE(cs43130_ac_freq); i++) {
  1525. tmp = sysfs_emit_at(buf, j, "%u\n",
  1526. cs43130->hpload_ac[i][ch]);
  1527. if (!tmp)
  1528. break;
  1529. j += tmp;
  1530. }
  1531. return j;
  1532. } else {
  1533. return sysfs_emit(buf, "NO_HPLOAD\n");
  1534. }
  1535. }
  1536. static ssize_t hpload_ac_l_show(struct device *dev,
  1537. struct device_attribute *attr, char *buf)
  1538. {
  1539. return cs43130_show_ac(dev, buf, HP_LEFT);
  1540. }
  1541. static ssize_t hpload_ac_r_show(struct device *dev,
  1542. struct device_attribute *attr, char *buf)
  1543. {
  1544. return cs43130_show_ac(dev, buf, HP_RIGHT);
  1545. }
  1546. static DEVICE_ATTR_RO(hpload_dc_l);
  1547. static DEVICE_ATTR_RO(hpload_dc_r);
  1548. static DEVICE_ATTR_RO(hpload_ac_l);
  1549. static DEVICE_ATTR_RO(hpload_ac_r);
  1550. static struct attribute *hpload_attrs[] = {
  1551. &dev_attr_hpload_dc_l.attr,
  1552. &dev_attr_hpload_dc_r.attr,
  1553. &dev_attr_hpload_ac_l.attr,
  1554. &dev_attr_hpload_ac_r.attr,
  1555. };
  1556. ATTRIBUTE_GROUPS(hpload);
  1557. static struct reg_sequence hp_en_cal_seq[] = {
  1558. {CS43130_INT_MASK_4, CS43130_INT_MASK_ALL},
  1559. {CS43130_HP_MEAS_LOAD_1, 0},
  1560. {CS43130_HP_MEAS_LOAD_2, 0},
  1561. {CS43130_INT_MASK_4, 0},
  1562. {CS43130_DXD1, 0x99},
  1563. {CS43130_DXD16, 0xBB},
  1564. {CS43130_DXD12, 0x01},
  1565. {CS43130_DXD19, 0xCB},
  1566. {CS43130_DXD17, 0x95},
  1567. {CS43130_DXD18, 0x0B},
  1568. {CS43130_DXD1, 0},
  1569. {CS43130_HP_LOAD_1, 0x80},
  1570. };
  1571. static struct reg_sequence hp_en_cal_seq2[] = {
  1572. {CS43130_INT_MASK_4, CS43130_INT_MASK_ALL},
  1573. {CS43130_HP_MEAS_LOAD_1, 0},
  1574. {CS43130_HP_MEAS_LOAD_2, 0},
  1575. {CS43130_INT_MASK_4, 0},
  1576. {CS43130_HP_LOAD_1, 0x80},
  1577. };
  1578. static struct reg_sequence hp_dis_cal_seq[] = {
  1579. {CS43130_HP_LOAD_1, 0x80},
  1580. {CS43130_DXD1, 0x99},
  1581. {CS43130_DXD12, 0},
  1582. {CS43130_DXD1, 0},
  1583. {CS43130_HP_LOAD_1, 0},
  1584. };
  1585. static struct reg_sequence hp_dis_cal_seq2[] = {
  1586. {CS43130_HP_LOAD_1, 0x80},
  1587. {CS43130_HP_LOAD_1, 0},
  1588. };
  1589. static struct reg_sequence hp_dc_ch_l_seq[] = {
  1590. {CS43130_DXD1, 0x99},
  1591. {CS43130_DXD19, 0x0A},
  1592. {CS43130_DXD17, 0x93},
  1593. {CS43130_DXD18, 0x0A},
  1594. {CS43130_DXD1, 0},
  1595. {CS43130_HP_LOAD_1, 0x80},
  1596. {CS43130_HP_LOAD_1, 0x81},
  1597. };
  1598. static struct reg_sequence hp_dc_ch_l_seq2[] = {
  1599. {CS43130_HP_LOAD_1, 0x80},
  1600. {CS43130_HP_LOAD_1, 0x81},
  1601. };
  1602. static struct reg_sequence hp_dc_ch_r_seq[] = {
  1603. {CS43130_DXD1, 0x99},
  1604. {CS43130_DXD19, 0x8A},
  1605. {CS43130_DXD17, 0x15},
  1606. {CS43130_DXD18, 0x06},
  1607. {CS43130_DXD1, 0},
  1608. {CS43130_HP_LOAD_1, 0x90},
  1609. {CS43130_HP_LOAD_1, 0x91},
  1610. };
  1611. static struct reg_sequence hp_dc_ch_r_seq2[] = {
  1612. {CS43130_HP_LOAD_1, 0x90},
  1613. {CS43130_HP_LOAD_1, 0x91},
  1614. };
  1615. static struct reg_sequence hp_ac_ch_l_seq[] = {
  1616. {CS43130_DXD1, 0x99},
  1617. {CS43130_DXD19, 0x0A},
  1618. {CS43130_DXD17, 0x93},
  1619. {CS43130_DXD18, 0x0A},
  1620. {CS43130_DXD1, 0},
  1621. {CS43130_HP_LOAD_1, 0x80},
  1622. {CS43130_HP_LOAD_1, 0x82},
  1623. };
  1624. static struct reg_sequence hp_ac_ch_l_seq2[] = {
  1625. {CS43130_HP_LOAD_1, 0x80},
  1626. {CS43130_HP_LOAD_1, 0x82},
  1627. };
  1628. static struct reg_sequence hp_ac_ch_r_seq[] = {
  1629. {CS43130_DXD1, 0x99},
  1630. {CS43130_DXD19, 0x8A},
  1631. {CS43130_DXD17, 0x15},
  1632. {CS43130_DXD18, 0x06},
  1633. {CS43130_DXD1, 0},
  1634. {CS43130_HP_LOAD_1, 0x90},
  1635. {CS43130_HP_LOAD_1, 0x92},
  1636. };
  1637. static struct reg_sequence hp_ac_ch_r_seq2[] = {
  1638. {CS43130_HP_LOAD_1, 0x90},
  1639. {CS43130_HP_LOAD_1, 0x92},
  1640. };
  1641. static struct reg_sequence hp_cln_seq[] = {
  1642. {CS43130_INT_MASK_4, CS43130_INT_MASK_ALL},
  1643. {CS43130_HP_MEAS_LOAD_1, 0},
  1644. {CS43130_HP_MEAS_LOAD_2, 0},
  1645. };
  1646. struct reg_sequences {
  1647. struct reg_sequence *seq;
  1648. int size;
  1649. unsigned int msk;
  1650. };
  1651. static struct reg_sequences hpload_seq1[] = {
  1652. {
  1653. .seq = hp_en_cal_seq,
  1654. .size = ARRAY_SIZE(hp_en_cal_seq),
  1655. .msk = CS43130_HPLOAD_ON_INT,
  1656. },
  1657. {
  1658. .seq = hp_dc_ch_l_seq,
  1659. .size = ARRAY_SIZE(hp_dc_ch_l_seq),
  1660. .msk = CS43130_HPLOAD_DC_INT,
  1661. },
  1662. {
  1663. .seq = hp_ac_ch_l_seq,
  1664. .size = ARRAY_SIZE(hp_ac_ch_l_seq),
  1665. .msk = CS43130_HPLOAD_AC_INT,
  1666. },
  1667. {
  1668. .seq = hp_dis_cal_seq,
  1669. .size = ARRAY_SIZE(hp_dis_cal_seq),
  1670. .msk = CS43130_HPLOAD_OFF_INT,
  1671. },
  1672. {
  1673. .seq = hp_en_cal_seq,
  1674. .size = ARRAY_SIZE(hp_en_cal_seq),
  1675. .msk = CS43130_HPLOAD_ON_INT,
  1676. },
  1677. {
  1678. .seq = hp_dc_ch_r_seq,
  1679. .size = ARRAY_SIZE(hp_dc_ch_r_seq),
  1680. .msk = CS43130_HPLOAD_DC_INT,
  1681. },
  1682. {
  1683. .seq = hp_ac_ch_r_seq,
  1684. .size = ARRAY_SIZE(hp_ac_ch_r_seq),
  1685. .msk = CS43130_HPLOAD_AC_INT,
  1686. },
  1687. };
  1688. static struct reg_sequences hpload_seq2[] = {
  1689. {
  1690. .seq = hp_en_cal_seq2,
  1691. .size = ARRAY_SIZE(hp_en_cal_seq2),
  1692. .msk = CS43130_HPLOAD_ON_INT,
  1693. },
  1694. {
  1695. .seq = hp_dc_ch_l_seq2,
  1696. .size = ARRAY_SIZE(hp_dc_ch_l_seq2),
  1697. .msk = CS43130_HPLOAD_DC_INT,
  1698. },
  1699. {
  1700. .seq = hp_ac_ch_l_seq2,
  1701. .size = ARRAY_SIZE(hp_ac_ch_l_seq2),
  1702. .msk = CS43130_HPLOAD_AC_INT,
  1703. },
  1704. {
  1705. .seq = hp_dis_cal_seq2,
  1706. .size = ARRAY_SIZE(hp_dis_cal_seq2),
  1707. .msk = CS43130_HPLOAD_OFF_INT,
  1708. },
  1709. {
  1710. .seq = hp_en_cal_seq2,
  1711. .size = ARRAY_SIZE(hp_en_cal_seq2),
  1712. .msk = CS43130_HPLOAD_ON_INT,
  1713. },
  1714. {
  1715. .seq = hp_dc_ch_r_seq2,
  1716. .size = ARRAY_SIZE(hp_dc_ch_r_seq2),
  1717. .msk = CS43130_HPLOAD_DC_INT,
  1718. },
  1719. {
  1720. .seq = hp_ac_ch_r_seq2,
  1721. .size = ARRAY_SIZE(hp_ac_ch_r_seq2),
  1722. .msk = CS43130_HPLOAD_AC_INT,
  1723. },
  1724. };
  1725. static int cs43130_update_hpload(unsigned int msk, int ac_idx,
  1726. struct cs43130_private *cs43130)
  1727. {
  1728. bool left_ch = true;
  1729. unsigned int reg;
  1730. u32 addr;
  1731. u16 impedance;
  1732. struct snd_soc_component *component = cs43130->component;
  1733. switch (msk) {
  1734. case CS43130_HPLOAD_DC_INT:
  1735. case CS43130_HPLOAD_AC_INT:
  1736. break;
  1737. default:
  1738. return 0;
  1739. }
  1740. regmap_read(cs43130->regmap, CS43130_HP_LOAD_1, &reg);
  1741. if (reg & CS43130_HPLOAD_CHN_SEL)
  1742. left_ch = false;
  1743. if (msk == CS43130_HPLOAD_DC_INT)
  1744. addr = CS43130_HP_DC_STAT_1;
  1745. else
  1746. addr = CS43130_HP_AC_STAT_1;
  1747. regmap_read(cs43130->regmap, addr, &reg);
  1748. impedance = reg >> 3;
  1749. regmap_read(cs43130->regmap, addr + 1, &reg);
  1750. impedance |= reg << 5;
  1751. if (msk == CS43130_HPLOAD_DC_INT) {
  1752. if (left_ch)
  1753. cs43130->hpload_dc[HP_LEFT] = impedance;
  1754. else
  1755. cs43130->hpload_dc[HP_RIGHT] = impedance;
  1756. dev_dbg(component->dev, "HP DC impedance (Ch %u): %u\n", !left_ch,
  1757. impedance);
  1758. } else {
  1759. if (left_ch)
  1760. cs43130->hpload_ac[ac_idx][HP_LEFT] = impedance;
  1761. else
  1762. cs43130->hpload_ac[ac_idx][HP_RIGHT] = impedance;
  1763. dev_dbg(component->dev, "HP AC (%u Hz) impedance (Ch %u): %u\n",
  1764. cs43130->ac_freq[ac_idx], !left_ch, impedance);
  1765. }
  1766. return 0;
  1767. }
  1768. static int cs43130_hpload_proc(struct cs43130_private *cs43130,
  1769. struct reg_sequence *seq, int seq_size,
  1770. unsigned int rslt_msk, int ac_idx)
  1771. {
  1772. int ret;
  1773. unsigned int msk;
  1774. u16 ac_reg_val;
  1775. struct snd_soc_component *component = cs43130->component;
  1776. reinit_completion(&cs43130->hpload_evt);
  1777. if (rslt_msk == CS43130_HPLOAD_AC_INT) {
  1778. ac_reg_val = cs43130_get_ac_reg_val(cs43130->ac_freq[ac_idx]);
  1779. regmap_update_bits(cs43130->regmap, CS43130_HP_LOAD_1,
  1780. CS43130_HPLOAD_AC_START, 0);
  1781. regmap_update_bits(cs43130->regmap, CS43130_HP_MEAS_LOAD_1,
  1782. CS43130_HP_MEAS_LOAD_MASK,
  1783. ac_reg_val >> CS43130_HP_MEAS_LOAD_1_SHIFT);
  1784. regmap_update_bits(cs43130->regmap, CS43130_HP_MEAS_LOAD_2,
  1785. CS43130_HP_MEAS_LOAD_MASK,
  1786. ac_reg_val >> CS43130_HP_MEAS_LOAD_2_SHIFT);
  1787. }
  1788. regmap_multi_reg_write(cs43130->regmap, seq,
  1789. seq_size);
  1790. ret = wait_for_completion_timeout(&cs43130->hpload_evt,
  1791. msecs_to_jiffies(1000));
  1792. regmap_read(cs43130->regmap, CS43130_INT_MASK_4, &msk);
  1793. if (!ret) {
  1794. dev_err(component->dev, "Timeout waiting for HPLOAD interrupt\n");
  1795. return -1;
  1796. }
  1797. dev_dbg(component->dev, "HP load stat: %x, INT_MASK_4: %x\n",
  1798. cs43130->hpload_stat, msk);
  1799. if ((cs43130->hpload_stat & (CS43130_HPLOAD_NO_DC_INT |
  1800. CS43130_HPLOAD_UNPLUG_INT |
  1801. CS43130_HPLOAD_OOR_INT)) ||
  1802. !(cs43130->hpload_stat & rslt_msk)) {
  1803. dev_dbg(component->dev, "HP load measure failed\n");
  1804. return -1;
  1805. }
  1806. return 0;
  1807. }
  1808. static const struct reg_sequence hv_seq[][2] = {
  1809. {
  1810. {CS43130_CLASS_H_CTL, 0x1C},
  1811. {CS43130_HP_OUT_CTL_1, 0x10},
  1812. },
  1813. {
  1814. {CS43130_CLASS_H_CTL, 0x1E},
  1815. {CS43130_HP_OUT_CTL_1, 0x20},
  1816. },
  1817. {
  1818. {CS43130_CLASS_H_CTL, 0x1E},
  1819. {CS43130_HP_OUT_CTL_1, 0x30},
  1820. },
  1821. };
  1822. static int cs43130_set_hv(struct regmap *regmap, u16 hpload_dc,
  1823. const u16 *dc_threshold)
  1824. {
  1825. int i;
  1826. for (i = 0; i < CS43130_DC_THRESHOLD; i++) {
  1827. if (hpload_dc <= dc_threshold[i])
  1828. break;
  1829. }
  1830. regmap_multi_reg_write(regmap, hv_seq[i], ARRAY_SIZE(hv_seq[i]));
  1831. return 0;
  1832. }
  1833. static void cs43130_imp_meas(struct work_struct *wk)
  1834. {
  1835. unsigned int reg, seq_size;
  1836. int i, ret, ac_idx;
  1837. struct cs43130_private *cs43130;
  1838. struct snd_soc_component *component;
  1839. struct reg_sequences *hpload_seq;
  1840. cs43130 = container_of(wk, struct cs43130_private, work);
  1841. component = cs43130->component;
  1842. if (!cs43130->mclk)
  1843. return;
  1844. cs43130->hpload_done = false;
  1845. mutex_lock(&cs43130->clk_mutex);
  1846. if (!cs43130->clk_req) {
  1847. /* clk not in use */
  1848. cs43130_set_pll(component, 0, 0, cs43130->mclk, CS43130_MCLK_22M);
  1849. if (cs43130->pll_bypass)
  1850. cs43130_change_clksrc(component, CS43130_MCLK_SRC_EXT);
  1851. else
  1852. cs43130_change_clksrc(component, CS43130_MCLK_SRC_PLL);
  1853. }
  1854. cs43130->clk_req++;
  1855. mutex_unlock(&cs43130->clk_mutex);
  1856. regmap_read(cs43130->regmap, CS43130_INT_STATUS_4, &reg);
  1857. switch (cs43130->dev_id) {
  1858. case CS43130_CHIP_ID:
  1859. hpload_seq = hpload_seq1;
  1860. seq_size = ARRAY_SIZE(hpload_seq1);
  1861. break;
  1862. case CS43131_CHIP_ID:
  1863. hpload_seq = hpload_seq2;
  1864. seq_size = ARRAY_SIZE(hpload_seq2);
  1865. break;
  1866. default:
  1867. WARN(1, "Invalid dev_id for meas: %d", cs43130->dev_id);
  1868. return;
  1869. }
  1870. i = 0;
  1871. ac_idx = 0;
  1872. while (i < seq_size) {
  1873. ret = cs43130_hpload_proc(cs43130, hpload_seq[i].seq,
  1874. hpload_seq[i].size,
  1875. hpload_seq[i].msk, ac_idx);
  1876. if (ret < 0)
  1877. goto exit;
  1878. cs43130_update_hpload(hpload_seq[i].msk, ac_idx, cs43130);
  1879. if (cs43130->ac_meas &&
  1880. hpload_seq[i].msk == CS43130_HPLOAD_AC_INT &&
  1881. ac_idx < CS43130_AC_FREQ - 1) {
  1882. ac_idx++;
  1883. } else {
  1884. ac_idx = 0;
  1885. i++;
  1886. }
  1887. }
  1888. cs43130->hpload_done = true;
  1889. if (cs43130->hpload_dc[HP_LEFT] >= CS43130_LINEOUT_LOAD)
  1890. snd_soc_jack_report(&cs43130->jack, CS43130_JACK_LINEOUT,
  1891. CS43130_JACK_MASK);
  1892. else
  1893. snd_soc_jack_report(&cs43130->jack, CS43130_JACK_HEADPHONE,
  1894. CS43130_JACK_MASK);
  1895. dev_dbg(component->dev, "Set HP output control. DC threshold\n");
  1896. for (i = 0; i < CS43130_DC_THRESHOLD; i++)
  1897. dev_dbg(component->dev, "DC threshold[%d]: %u.\n", i,
  1898. cs43130->dc_threshold[i]);
  1899. cs43130_set_hv(cs43130->regmap, cs43130->hpload_dc[HP_LEFT],
  1900. cs43130->dc_threshold);
  1901. exit:
  1902. switch (cs43130->dev_id) {
  1903. case CS43130_CHIP_ID:
  1904. cs43130_hpload_proc(cs43130, hp_dis_cal_seq,
  1905. ARRAY_SIZE(hp_dis_cal_seq),
  1906. CS43130_HPLOAD_OFF_INT, ac_idx);
  1907. break;
  1908. case CS43131_CHIP_ID:
  1909. cs43130_hpload_proc(cs43130, hp_dis_cal_seq2,
  1910. ARRAY_SIZE(hp_dis_cal_seq2),
  1911. CS43130_HPLOAD_OFF_INT, ac_idx);
  1912. break;
  1913. }
  1914. regmap_multi_reg_write(cs43130->regmap, hp_cln_seq,
  1915. ARRAY_SIZE(hp_cln_seq));
  1916. mutex_lock(&cs43130->clk_mutex);
  1917. cs43130->clk_req--;
  1918. /* clk not in use */
  1919. if (!cs43130->clk_req)
  1920. cs43130_change_clksrc(component, CS43130_MCLK_SRC_RCO);
  1921. mutex_unlock(&cs43130->clk_mutex);
  1922. }
  1923. static irqreturn_t cs43130_irq_thread(int irq, void *data)
  1924. {
  1925. struct cs43130_private *cs43130 = (struct cs43130_private *)data;
  1926. struct snd_soc_component *component = cs43130->component;
  1927. unsigned int stickies[CS43130_NUM_INT];
  1928. unsigned int irq_occurrence = 0;
  1929. unsigned int masks[CS43130_NUM_INT];
  1930. int i, j;
  1931. for (i = 0; i < ARRAY_SIZE(stickies); i++) {
  1932. regmap_read(cs43130->regmap, CS43130_INT_STATUS_1 + i,
  1933. &stickies[i]);
  1934. regmap_read(cs43130->regmap, CS43130_INT_MASK_1 + i,
  1935. &masks[i]);
  1936. }
  1937. for (i = 0; i < ARRAY_SIZE(stickies); i++) {
  1938. stickies[i] = stickies[i] & (~masks[i]);
  1939. for (j = 0; j < 8; j++)
  1940. irq_occurrence += (stickies[i] >> j) & 1;
  1941. }
  1942. dev_dbg(component->dev, "number of interrupts occurred (%u)\n",
  1943. irq_occurrence);
  1944. if (!irq_occurrence)
  1945. return IRQ_NONE;
  1946. if (stickies[0] & CS43130_XTAL_RDY_INT) {
  1947. complete(&cs43130->xtal_rdy);
  1948. return IRQ_HANDLED;
  1949. }
  1950. if (stickies[0] & CS43130_PLL_RDY_INT) {
  1951. complete(&cs43130->pll_rdy);
  1952. return IRQ_HANDLED;
  1953. }
  1954. if (stickies[3] & CS43130_HPLOAD_NO_DC_INT) {
  1955. cs43130->hpload_stat = stickies[3];
  1956. dev_err(component->dev,
  1957. "DC load has not completed before AC load (%x)\n",
  1958. cs43130->hpload_stat);
  1959. complete(&cs43130->hpload_evt);
  1960. return IRQ_HANDLED;
  1961. }
  1962. if (stickies[3] & CS43130_HPLOAD_UNPLUG_INT) {
  1963. cs43130->hpload_stat = stickies[3];
  1964. dev_err(component->dev, "HP unplugged during measurement (%x)\n",
  1965. cs43130->hpload_stat);
  1966. complete(&cs43130->hpload_evt);
  1967. return IRQ_HANDLED;
  1968. }
  1969. if (stickies[3] & CS43130_HPLOAD_OOR_INT) {
  1970. cs43130->hpload_stat = stickies[3];
  1971. dev_err(component->dev, "HP load out of range (%x)\n",
  1972. cs43130->hpload_stat);
  1973. complete(&cs43130->hpload_evt);
  1974. return IRQ_HANDLED;
  1975. }
  1976. if (stickies[3] & CS43130_HPLOAD_AC_INT) {
  1977. cs43130->hpload_stat = stickies[3];
  1978. dev_dbg(component->dev, "HP AC load measurement done (%x)\n",
  1979. cs43130->hpload_stat);
  1980. complete(&cs43130->hpload_evt);
  1981. return IRQ_HANDLED;
  1982. }
  1983. if (stickies[3] & CS43130_HPLOAD_DC_INT) {
  1984. cs43130->hpload_stat = stickies[3];
  1985. dev_dbg(component->dev, "HP DC load measurement done (%x)\n",
  1986. cs43130->hpload_stat);
  1987. complete(&cs43130->hpload_evt);
  1988. return IRQ_HANDLED;
  1989. }
  1990. if (stickies[3] & CS43130_HPLOAD_ON_INT) {
  1991. cs43130->hpload_stat = stickies[3];
  1992. dev_dbg(component->dev, "HP load state machine on done (%x)\n",
  1993. cs43130->hpload_stat);
  1994. complete(&cs43130->hpload_evt);
  1995. return IRQ_HANDLED;
  1996. }
  1997. if (stickies[3] & CS43130_HPLOAD_OFF_INT) {
  1998. cs43130->hpload_stat = stickies[3];
  1999. dev_dbg(component->dev, "HP load state machine off done (%x)\n",
  2000. cs43130->hpload_stat);
  2001. complete(&cs43130->hpload_evt);
  2002. return IRQ_HANDLED;
  2003. }
  2004. if (stickies[0] & CS43130_XTAL_ERR_INT) {
  2005. dev_err(component->dev, "Crystal err: clock is not running\n");
  2006. return IRQ_HANDLED;
  2007. }
  2008. if (stickies[0] & CS43130_HP_UNPLUG_INT) {
  2009. dev_dbg(component->dev, "HP unplugged\n");
  2010. cs43130->hpload_done = false;
  2011. snd_soc_jack_report(&cs43130->jack, 0, CS43130_JACK_MASK);
  2012. return IRQ_HANDLED;
  2013. }
  2014. if (stickies[0] & CS43130_HP_PLUG_INT) {
  2015. if (cs43130->dc_meas && !cs43130->hpload_done &&
  2016. !work_busy(&cs43130->work)) {
  2017. dev_dbg(component->dev, "HP load queue work\n");
  2018. queue_work(cs43130->wq, &cs43130->work);
  2019. }
  2020. snd_soc_jack_report(&cs43130->jack, SND_JACK_MECHANICAL,
  2021. CS43130_JACK_MASK);
  2022. return IRQ_HANDLED;
  2023. }
  2024. return IRQ_NONE;
  2025. }
  2026. static int cs43130_probe(struct snd_soc_component *component)
  2027. {
  2028. int ret;
  2029. struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
  2030. struct snd_soc_card *card = component->card;
  2031. unsigned int reg;
  2032. cs43130->component = component;
  2033. if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED) {
  2034. regmap_update_bits(cs43130->regmap, CS43130_CRYSTAL_SET,
  2035. CS43130_XTAL_IBIAS_MASK,
  2036. cs43130->xtal_ibias);
  2037. regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
  2038. CS43130_XTAL_ERR_INT, 0);
  2039. }
  2040. ret = snd_soc_card_jack_new(card, "Headphone", CS43130_JACK_MASK,
  2041. &cs43130->jack);
  2042. if (ret < 0) {
  2043. dev_err(component->dev, "Cannot create jack\n");
  2044. return ret;
  2045. }
  2046. cs43130->hpload_done = false;
  2047. if (cs43130->dc_meas) {
  2048. ret = sysfs_create_groups(&component->dev->kobj, hpload_groups);
  2049. if (ret)
  2050. return ret;
  2051. cs43130->wq = create_singlethread_workqueue("cs43130_hp");
  2052. if (!cs43130->wq) {
  2053. sysfs_remove_groups(&component->dev->kobj, hpload_groups);
  2054. return -ENOMEM;
  2055. }
  2056. INIT_WORK(&cs43130->work, cs43130_imp_meas);
  2057. }
  2058. regmap_read(cs43130->regmap, CS43130_INT_STATUS_1, &reg);
  2059. regmap_read(cs43130->regmap, CS43130_HP_STATUS, &reg);
  2060. regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
  2061. CS43130_HP_PLUG_INT | CS43130_HP_UNPLUG_INT, 0);
  2062. regmap_update_bits(cs43130->regmap, CS43130_HP_DETECT,
  2063. CS43130_HP_DETECT_CTRL_MASK, 0);
  2064. regmap_update_bits(cs43130->regmap, CS43130_HP_DETECT,
  2065. CS43130_HP_DETECT_CTRL_MASK,
  2066. CS43130_HP_DETECT_CTRL_MASK);
  2067. return 0;
  2068. }
  2069. static struct snd_soc_component_driver soc_component_dev_cs43130 = {
  2070. .probe = cs43130_probe,
  2071. .controls = cs43130_snd_controls,
  2072. .num_controls = ARRAY_SIZE(cs43130_snd_controls),
  2073. .set_sysclk = cs43130_component_set_sysclk,
  2074. .set_pll = cs43130_set_pll,
  2075. .idle_bias_on = 1,
  2076. .use_pmdown_time = 1,
  2077. .endianness = 1,
  2078. };
  2079. static const struct regmap_config cs43130_regmap = {
  2080. .reg_bits = 24,
  2081. .pad_bits = 8,
  2082. .val_bits = 8,
  2083. .max_register = CS43130_LASTREG,
  2084. .reg_defaults = cs43130_reg_defaults,
  2085. .num_reg_defaults = ARRAY_SIZE(cs43130_reg_defaults),
  2086. .readable_reg = cs43130_readable_register,
  2087. .precious_reg = cs43130_precious_register,
  2088. .volatile_reg = cs43130_volatile_register,
  2089. .cache_type = REGCACHE_RBTREE,
  2090. /* needed for regcache_sync */
  2091. .use_single_read = true,
  2092. .use_single_write = true,
  2093. };
  2094. static u16 const cs43130_dc_threshold[CS43130_DC_THRESHOLD] = {
  2095. 50,
  2096. 120,
  2097. };
  2098. static int cs43130_handle_device_data(struct i2c_client *i2c_client,
  2099. struct cs43130_private *cs43130)
  2100. {
  2101. struct device_node *np = i2c_client->dev.of_node;
  2102. unsigned int val;
  2103. int i;
  2104. if (of_property_read_u32(np, "cirrus,xtal-ibias", &val) < 0) {
  2105. /* Crystal is unused. System clock is used for external MCLK */
  2106. cs43130->xtal_ibias = CS43130_XTAL_UNUSED;
  2107. return 0;
  2108. }
  2109. switch (val) {
  2110. case 1:
  2111. cs43130->xtal_ibias = CS43130_XTAL_IBIAS_7_5UA;
  2112. break;
  2113. case 2:
  2114. cs43130->xtal_ibias = CS43130_XTAL_IBIAS_12_5UA;
  2115. break;
  2116. case 3:
  2117. cs43130->xtal_ibias = CS43130_XTAL_IBIAS_15UA;
  2118. break;
  2119. default:
  2120. dev_err(&i2c_client->dev,
  2121. "Invalid cirrus,xtal-ibias value: %d\n", val);
  2122. return -EINVAL;
  2123. }
  2124. cs43130->dc_meas = of_property_read_bool(np, "cirrus,dc-measure");
  2125. cs43130->ac_meas = of_property_read_bool(np, "cirrus,ac-measure");
  2126. if (of_property_read_u16_array(np, "cirrus,ac-freq", cs43130->ac_freq,
  2127. CS43130_AC_FREQ) < 0) {
  2128. for (i = 0; i < CS43130_AC_FREQ; i++)
  2129. cs43130->ac_freq[i] = cs43130_ac_freq[i];
  2130. }
  2131. if (of_property_read_u16_array(np, "cirrus,dc-threshold",
  2132. cs43130->dc_threshold,
  2133. CS43130_DC_THRESHOLD) < 0) {
  2134. for (i = 0; i < CS43130_DC_THRESHOLD; i++)
  2135. cs43130->dc_threshold[i] = cs43130_dc_threshold[i];
  2136. }
  2137. return 0;
  2138. }
  2139. static int cs43130_i2c_probe(struct i2c_client *client)
  2140. {
  2141. struct cs43130_private *cs43130;
  2142. int ret;
  2143. unsigned int reg;
  2144. int i, devid;
  2145. cs43130 = devm_kzalloc(&client->dev, sizeof(*cs43130), GFP_KERNEL);
  2146. if (!cs43130)
  2147. return -ENOMEM;
  2148. i2c_set_clientdata(client, cs43130);
  2149. cs43130->regmap = devm_regmap_init_i2c(client, &cs43130_regmap);
  2150. if (IS_ERR(cs43130->regmap)) {
  2151. ret = PTR_ERR(cs43130->regmap);
  2152. return ret;
  2153. }
  2154. if (client->dev.of_node) {
  2155. ret = cs43130_handle_device_data(client, cs43130);
  2156. if (ret != 0)
  2157. return ret;
  2158. }
  2159. for (i = 0; i < ARRAY_SIZE(cs43130->supplies); i++)
  2160. cs43130->supplies[i].supply = cs43130_supply_names[i];
  2161. ret = devm_regulator_bulk_get(&client->dev,
  2162. ARRAY_SIZE(cs43130->supplies),
  2163. cs43130->supplies);
  2164. if (ret != 0) {
  2165. dev_err(&client->dev, "Failed to request supplies: %d\n", ret);
  2166. return ret;
  2167. }
  2168. ret = regulator_bulk_enable(ARRAY_SIZE(cs43130->supplies),
  2169. cs43130->supplies);
  2170. if (ret != 0) {
  2171. dev_err(&client->dev, "Failed to enable supplies: %d\n", ret);
  2172. return ret;
  2173. }
  2174. cs43130->reset_gpio = devm_gpiod_get_optional(&client->dev,
  2175. "reset", GPIOD_OUT_LOW);
  2176. if (IS_ERR(cs43130->reset_gpio)) {
  2177. ret = PTR_ERR(cs43130->reset_gpio);
  2178. goto err_supplies;
  2179. }
  2180. gpiod_set_value_cansleep(cs43130->reset_gpio, 1);
  2181. usleep_range(2000, 2050);
  2182. devid = cirrus_read_device_id(cs43130->regmap, CS43130_DEVID_AB);
  2183. if (devid < 0) {
  2184. ret = devid;
  2185. dev_err(&client->dev, "Failed to read device ID: %d\n", ret);
  2186. goto err;
  2187. }
  2188. switch (devid) {
  2189. case CS43130_CHIP_ID:
  2190. case CS4399_CHIP_ID:
  2191. case CS43131_CHIP_ID:
  2192. case CS43198_CHIP_ID:
  2193. break;
  2194. default:
  2195. dev_err(&client->dev,
  2196. "CS43130 Device ID %X. Expected ID %X, %X, %X or %X\n",
  2197. devid, CS43130_CHIP_ID, CS4399_CHIP_ID,
  2198. CS43131_CHIP_ID, CS43198_CHIP_ID);
  2199. ret = -ENODEV;
  2200. goto err;
  2201. }
  2202. cs43130->dev_id = devid;
  2203. ret = regmap_read(cs43130->regmap, CS43130_REV_ID, &reg);
  2204. if (ret < 0) {
  2205. dev_err(&client->dev, "Get Revision ID failed\n");
  2206. goto err;
  2207. }
  2208. dev_info(&client->dev,
  2209. "Cirrus Logic CS43130 (%x), Revision: %02X\n", devid,
  2210. reg & 0xFF);
  2211. mutex_init(&cs43130->clk_mutex);
  2212. init_completion(&cs43130->xtal_rdy);
  2213. init_completion(&cs43130->pll_rdy);
  2214. init_completion(&cs43130->hpload_evt);
  2215. ret = devm_request_threaded_irq(&client->dev, client->irq,
  2216. NULL, cs43130_irq_thread,
  2217. IRQF_ONESHOT | IRQF_TRIGGER_LOW,
  2218. "cs43130", cs43130);
  2219. if (ret != 0) {
  2220. dev_err(&client->dev, "Failed to request IRQ: %d\n", ret);
  2221. goto err;
  2222. }
  2223. cs43130->mclk_int_src = CS43130_MCLK_SRC_RCO;
  2224. pm_runtime_set_autosuspend_delay(&client->dev, 100);
  2225. pm_runtime_use_autosuspend(&client->dev);
  2226. pm_runtime_set_active(&client->dev);
  2227. pm_runtime_enable(&client->dev);
  2228. switch (cs43130->dev_id) {
  2229. case CS43130_CHIP_ID:
  2230. case CS43131_CHIP_ID:
  2231. memcpy(all_hp_widgets, digital_hp_widgets,
  2232. sizeof(digital_hp_widgets));
  2233. memcpy(all_hp_widgets + ARRAY_SIZE(digital_hp_widgets),
  2234. analog_hp_widgets, sizeof(analog_hp_widgets));
  2235. memcpy(all_hp_routes, digital_hp_routes,
  2236. sizeof(digital_hp_routes));
  2237. memcpy(all_hp_routes + ARRAY_SIZE(digital_hp_routes),
  2238. analog_hp_routes, sizeof(analog_hp_routes));
  2239. soc_component_dev_cs43130.dapm_widgets =
  2240. all_hp_widgets;
  2241. soc_component_dev_cs43130.num_dapm_widgets =
  2242. ARRAY_SIZE(all_hp_widgets);
  2243. soc_component_dev_cs43130.dapm_routes =
  2244. all_hp_routes;
  2245. soc_component_dev_cs43130.num_dapm_routes =
  2246. ARRAY_SIZE(all_hp_routes);
  2247. break;
  2248. case CS43198_CHIP_ID:
  2249. case CS4399_CHIP_ID:
  2250. soc_component_dev_cs43130.dapm_widgets =
  2251. digital_hp_widgets;
  2252. soc_component_dev_cs43130.num_dapm_widgets =
  2253. ARRAY_SIZE(digital_hp_widgets);
  2254. soc_component_dev_cs43130.dapm_routes =
  2255. digital_hp_routes;
  2256. soc_component_dev_cs43130.num_dapm_routes =
  2257. ARRAY_SIZE(digital_hp_routes);
  2258. break;
  2259. }
  2260. ret = devm_snd_soc_register_component(&client->dev,
  2261. &soc_component_dev_cs43130,
  2262. cs43130_dai, ARRAY_SIZE(cs43130_dai));
  2263. if (ret < 0) {
  2264. dev_err(&client->dev,
  2265. "snd_soc_register_component failed with ret = %d\n", ret);
  2266. goto err;
  2267. }
  2268. regmap_update_bits(cs43130->regmap, CS43130_PAD_INT_CFG,
  2269. CS43130_ASP_3ST_MASK, 0);
  2270. regmap_update_bits(cs43130->regmap, CS43130_PAD_INT_CFG,
  2271. CS43130_XSP_3ST_MASK, 0);
  2272. return 0;
  2273. err:
  2274. gpiod_set_value_cansleep(cs43130->reset_gpio, 0);
  2275. err_supplies:
  2276. regulator_bulk_disable(ARRAY_SIZE(cs43130->supplies),
  2277. cs43130->supplies);
  2278. return ret;
  2279. }
  2280. static void cs43130_i2c_remove(struct i2c_client *client)
  2281. {
  2282. struct cs43130_private *cs43130 = i2c_get_clientdata(client);
  2283. if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED)
  2284. regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
  2285. CS43130_XTAL_ERR_INT,
  2286. 1 << CS43130_XTAL_ERR_INT_SHIFT);
  2287. regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
  2288. CS43130_HP_PLUG_INT | CS43130_HP_UNPLUG_INT,
  2289. CS43130_HP_PLUG_INT | CS43130_HP_UNPLUG_INT);
  2290. if (cs43130->dc_meas) {
  2291. cancel_work_sync(&cs43130->work);
  2292. flush_workqueue(cs43130->wq);
  2293. device_remove_file(&client->dev, &dev_attr_hpload_dc_l);
  2294. device_remove_file(&client->dev, &dev_attr_hpload_dc_r);
  2295. device_remove_file(&client->dev, &dev_attr_hpload_ac_l);
  2296. device_remove_file(&client->dev, &dev_attr_hpload_ac_r);
  2297. }
  2298. gpiod_set_value_cansleep(cs43130->reset_gpio, 0);
  2299. pm_runtime_disable(&client->dev);
  2300. regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies);
  2301. }
  2302. static int __maybe_unused cs43130_runtime_suspend(struct device *dev)
  2303. {
  2304. struct cs43130_private *cs43130 = dev_get_drvdata(dev);
  2305. if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED)
  2306. regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
  2307. CS43130_XTAL_ERR_INT,
  2308. 1 << CS43130_XTAL_ERR_INT_SHIFT);
  2309. regcache_cache_only(cs43130->regmap, true);
  2310. regcache_mark_dirty(cs43130->regmap);
  2311. gpiod_set_value_cansleep(cs43130->reset_gpio, 0);
  2312. regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies);
  2313. return 0;
  2314. }
  2315. static int __maybe_unused cs43130_runtime_resume(struct device *dev)
  2316. {
  2317. struct cs43130_private *cs43130 = dev_get_drvdata(dev);
  2318. int ret;
  2319. ret = regulator_bulk_enable(CS43130_NUM_SUPPLIES, cs43130->supplies);
  2320. if (ret != 0) {
  2321. dev_err(dev, "Failed to enable supplies: %d\n", ret);
  2322. return ret;
  2323. }
  2324. regcache_cache_only(cs43130->regmap, false);
  2325. gpiod_set_value_cansleep(cs43130->reset_gpio, 1);
  2326. usleep_range(2000, 2050);
  2327. ret = regcache_sync(cs43130->regmap);
  2328. if (ret != 0) {
  2329. dev_err(dev, "Failed to restore register cache\n");
  2330. goto err;
  2331. }
  2332. if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED)
  2333. regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
  2334. CS43130_XTAL_ERR_INT, 0);
  2335. return 0;
  2336. err:
  2337. regcache_cache_only(cs43130->regmap, true);
  2338. regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies);
  2339. return ret;
  2340. }
  2341. static const struct dev_pm_ops cs43130_runtime_pm = {
  2342. SET_RUNTIME_PM_OPS(cs43130_runtime_suspend, cs43130_runtime_resume,
  2343. NULL)
  2344. };
  2345. static const struct of_device_id cs43130_of_match[] = {
  2346. {.compatible = "cirrus,cs43130",},
  2347. {.compatible = "cirrus,cs4399",},
  2348. {.compatible = "cirrus,cs43131",},
  2349. {.compatible = "cirrus,cs43198",},
  2350. {},
  2351. };
  2352. MODULE_DEVICE_TABLE(of, cs43130_of_match);
  2353. static const struct i2c_device_id cs43130_i2c_id[] = {
  2354. {"cs43130", 0},
  2355. {"cs4399", 0},
  2356. {"cs43131", 0},
  2357. {"cs43198", 0},
  2358. {}
  2359. };
  2360. MODULE_DEVICE_TABLE(i2c, cs43130_i2c_id);
  2361. static struct i2c_driver cs43130_i2c_driver = {
  2362. .driver = {
  2363. .name = "cs43130",
  2364. .of_match_table = cs43130_of_match,
  2365. .pm = &cs43130_runtime_pm,
  2366. },
  2367. .id_table = cs43130_i2c_id,
  2368. .probe_new = cs43130_i2c_probe,
  2369. .remove = cs43130_i2c_remove,
  2370. };
  2371. module_i2c_driver(cs43130_i2c_driver);
  2372. MODULE_AUTHOR("Li Xu <[email protected]>");
  2373. MODULE_DESCRIPTION("Cirrus Logic CS43130 ALSA SoC Codec Driver");
  2374. MODULE_LICENSE("GPL");