cs43130.c 73 KB

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