ptp_clockmatrix.c 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * PTP hardware clock driver for the IDT ClockMatrix(TM) family of timing and
  4. * synchronization devices.
  5. *
  6. * Copyright (C) 2019 Integrated Device Technology, Inc., a Renesas Company.
  7. */
  8. #include <linux/firmware.h>
  9. #include <linux/platform_device.h>
  10. #include <linux/module.h>
  11. #include <linux/ptp_clock_kernel.h>
  12. #include <linux/delay.h>
  13. #include <linux/jiffies.h>
  14. #include <linux/kernel.h>
  15. #include <linux/timekeeping.h>
  16. #include <linux/string.h>
  17. #include <linux/of.h>
  18. #include <linux/mfd/rsmu.h>
  19. #include <linux/mfd/idt8a340_reg.h>
  20. #include <asm/unaligned.h>
  21. #include "ptp_private.h"
  22. #include "ptp_clockmatrix.h"
  23. MODULE_DESCRIPTION("Driver for IDT ClockMatrix(TM) family");
  24. MODULE_AUTHOR("Richard Cochran <[email protected]>");
  25. MODULE_AUTHOR("IDT support-1588 <[email protected]>");
  26. MODULE_VERSION("1.0");
  27. MODULE_LICENSE("GPL");
  28. /*
  29. * The name of the firmware file to be loaded
  30. * over-rides any automatic selection
  31. */
  32. static char *firmware;
  33. module_param(firmware, charp, 0);
  34. #define SETTIME_CORRECTION (0)
  35. #define EXTTS_PERIOD_MS (95)
  36. static int _idtcm_adjfine(struct idtcm_channel *channel, long scaled_ppm);
  37. static inline int idtcm_read(struct idtcm *idtcm,
  38. u16 module,
  39. u16 regaddr,
  40. u8 *buf,
  41. u16 count)
  42. {
  43. return regmap_bulk_read(idtcm->regmap, module + regaddr, buf, count);
  44. }
  45. static inline int idtcm_write(struct idtcm *idtcm,
  46. u16 module,
  47. u16 regaddr,
  48. u8 *buf,
  49. u16 count)
  50. {
  51. return regmap_bulk_write(idtcm->regmap, module + regaddr, buf, count);
  52. }
  53. static int contains_full_configuration(struct idtcm *idtcm,
  54. const struct firmware *fw)
  55. {
  56. struct idtcm_fwrc *rec = (struct idtcm_fwrc *)fw->data;
  57. u16 scratch = IDTCM_FW_REG(idtcm->fw_ver, V520, SCRATCH);
  58. s32 full_count;
  59. s32 count = 0;
  60. u16 regaddr;
  61. u8 loaddr;
  62. s32 len;
  63. /* 4 bytes skipped every 0x80 */
  64. full_count = (scratch - GPIO_USER_CONTROL) -
  65. ((scratch >> 7) - (GPIO_USER_CONTROL >> 7)) * 4;
  66. /* If the firmware contains 'full configuration' SM_RESET can be used
  67. * to ensure proper configuration.
  68. *
  69. * Full configuration is defined as the number of programmable
  70. * bytes within the configuration range minus page offset addr range.
  71. */
  72. for (len = fw->size; len > 0; len -= sizeof(*rec)) {
  73. regaddr = rec->hiaddr << 8;
  74. regaddr |= rec->loaddr;
  75. loaddr = rec->loaddr;
  76. rec++;
  77. /* Top (status registers) and bottom are read-only */
  78. if (regaddr < GPIO_USER_CONTROL || regaddr >= scratch)
  79. continue;
  80. /* Page size 128, last 4 bytes of page skipped */
  81. if ((loaddr > 0x7b && loaddr <= 0x7f) || loaddr > 0xfb)
  82. continue;
  83. count++;
  84. }
  85. return (count >= full_count);
  86. }
  87. static int char_array_to_timespec(u8 *buf,
  88. u8 count,
  89. struct timespec64 *ts)
  90. {
  91. u8 i;
  92. u64 nsec;
  93. time64_t sec;
  94. if (count < TOD_BYTE_COUNT)
  95. return 1;
  96. /* Sub-nanoseconds are in buf[0]. */
  97. nsec = buf[4];
  98. for (i = 0; i < 3; i++) {
  99. nsec <<= 8;
  100. nsec |= buf[3 - i];
  101. }
  102. sec = buf[10];
  103. for (i = 0; i < 5; i++) {
  104. sec <<= 8;
  105. sec |= buf[9 - i];
  106. }
  107. ts->tv_sec = sec;
  108. ts->tv_nsec = nsec;
  109. return 0;
  110. }
  111. static int timespec_to_char_array(struct timespec64 const *ts,
  112. u8 *buf,
  113. u8 count)
  114. {
  115. u8 i;
  116. s32 nsec;
  117. time64_t sec;
  118. if (count < TOD_BYTE_COUNT)
  119. return 1;
  120. nsec = ts->tv_nsec;
  121. sec = ts->tv_sec;
  122. /* Sub-nanoseconds are in buf[0]. */
  123. buf[0] = 0;
  124. for (i = 1; i < 5; i++) {
  125. buf[i] = nsec & 0xff;
  126. nsec >>= 8;
  127. }
  128. for (i = 5; i < TOD_BYTE_COUNT; i++) {
  129. buf[i] = sec & 0xff;
  130. sec >>= 8;
  131. }
  132. return 0;
  133. }
  134. static int idtcm_strverscmp(const char *version1, const char *version2)
  135. {
  136. u8 ver1[3], ver2[3];
  137. int i;
  138. if (sscanf(version1, "%hhu.%hhu.%hhu",
  139. &ver1[0], &ver1[1], &ver1[2]) != 3)
  140. return -1;
  141. if (sscanf(version2, "%hhu.%hhu.%hhu",
  142. &ver2[0], &ver2[1], &ver2[2]) != 3)
  143. return -1;
  144. for (i = 0; i < 3; i++) {
  145. if (ver1[i] > ver2[i])
  146. return 1;
  147. if (ver1[i] < ver2[i])
  148. return -1;
  149. }
  150. return 0;
  151. }
  152. static enum fw_version idtcm_fw_version(const char *version)
  153. {
  154. enum fw_version ver = V_DEFAULT;
  155. if (idtcm_strverscmp(version, "4.8.7") >= 0)
  156. ver = V487;
  157. if (idtcm_strverscmp(version, "5.2.0") >= 0)
  158. ver = V520;
  159. return ver;
  160. }
  161. static int clear_boot_status(struct idtcm *idtcm)
  162. {
  163. u8 buf[4] = {0};
  164. return idtcm_write(idtcm, GENERAL_STATUS, BOOT_STATUS, buf, sizeof(buf));
  165. }
  166. static int read_boot_status(struct idtcm *idtcm, u32 *status)
  167. {
  168. int err;
  169. u8 buf[4] = {0};
  170. err = idtcm_read(idtcm, GENERAL_STATUS, BOOT_STATUS, buf, sizeof(buf));
  171. *status = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
  172. return err;
  173. }
  174. static int wait_for_boot_status_ready(struct idtcm *idtcm)
  175. {
  176. u32 status = 0;
  177. u8 i = 30; /* 30 * 100ms = 3s */
  178. int err;
  179. do {
  180. err = read_boot_status(idtcm, &status);
  181. if (err)
  182. return err;
  183. if (status == 0xA0)
  184. return 0;
  185. msleep(100);
  186. i--;
  187. } while (i);
  188. dev_warn(idtcm->dev, "%s timed out", __func__);
  189. return -EBUSY;
  190. }
  191. static int arm_tod_read_trig_sel_refclk(struct idtcm_channel *channel, u8 ref)
  192. {
  193. struct idtcm *idtcm = channel->idtcm;
  194. u16 tod_read_cmd = IDTCM_FW_REG(idtcm->fw_ver, V520, TOD_READ_SECONDARY_CMD);
  195. u8 val = 0;
  196. int err;
  197. val &= ~(WR_REF_INDEX_MASK << WR_REF_INDEX_SHIFT);
  198. val |= (ref << WR_REF_INDEX_SHIFT);
  199. err = idtcm_write(idtcm, channel->tod_read_secondary,
  200. TOD_READ_SECONDARY_SEL_CFG_0, &val, sizeof(val));
  201. if (err)
  202. return err;
  203. val = 0 | (SCSR_TOD_READ_TRIG_SEL_REFCLK << TOD_READ_TRIGGER_SHIFT);
  204. err = idtcm_write(idtcm, channel->tod_read_secondary, tod_read_cmd,
  205. &val, sizeof(val));
  206. if (err)
  207. dev_err(idtcm->dev, "%s: err = %d", __func__, err);
  208. return err;
  209. }
  210. static bool is_single_shot(u8 mask)
  211. {
  212. /* Treat single bit ToD masks as continuous trigger */
  213. return !(mask <= 8 && is_power_of_2(mask));
  214. }
  215. static int idtcm_extts_enable(struct idtcm_channel *channel,
  216. struct ptp_clock_request *rq, int on)
  217. {
  218. u8 index = rq->extts.index;
  219. struct idtcm *idtcm;
  220. u8 mask = 1 << index;
  221. int err = 0;
  222. u8 old_mask;
  223. int ref;
  224. idtcm = channel->idtcm;
  225. old_mask = idtcm->extts_mask;
  226. /* Reject requests with unsupported flags */
  227. if (rq->extts.flags & ~(PTP_ENABLE_FEATURE |
  228. PTP_RISING_EDGE |
  229. PTP_FALLING_EDGE |
  230. PTP_STRICT_FLAGS))
  231. return -EOPNOTSUPP;
  232. /* Reject requests to enable time stamping on falling edge */
  233. if ((rq->extts.flags & PTP_ENABLE_FEATURE) &&
  234. (rq->extts.flags & PTP_FALLING_EDGE))
  235. return -EOPNOTSUPP;
  236. if (index >= MAX_TOD)
  237. return -EINVAL;
  238. if (on) {
  239. /* Support triggering more than one TOD_0/1/2/3 by same pin */
  240. /* Use the pin configured for the channel */
  241. ref = ptp_find_pin(channel->ptp_clock, PTP_PF_EXTTS, channel->tod);
  242. if (ref < 0) {
  243. dev_err(idtcm->dev, "%s: No valid pin found for TOD%d!\n",
  244. __func__, channel->tod);
  245. return -EBUSY;
  246. }
  247. err = arm_tod_read_trig_sel_refclk(&idtcm->channel[index], ref);
  248. if (err == 0) {
  249. idtcm->extts_mask |= mask;
  250. idtcm->event_channel[index] = channel;
  251. idtcm->channel[index].refn = ref;
  252. idtcm->extts_single_shot = is_single_shot(idtcm->extts_mask);
  253. if (old_mask)
  254. return 0;
  255. schedule_delayed_work(&idtcm->extts_work,
  256. msecs_to_jiffies(EXTTS_PERIOD_MS));
  257. }
  258. } else {
  259. idtcm->extts_mask &= ~mask;
  260. idtcm->extts_single_shot = is_single_shot(idtcm->extts_mask);
  261. if (idtcm->extts_mask == 0)
  262. cancel_delayed_work(&idtcm->extts_work);
  263. }
  264. return err;
  265. }
  266. static int read_sys_apll_status(struct idtcm *idtcm, u8 *status)
  267. {
  268. return idtcm_read(idtcm, STATUS, DPLL_SYS_APLL_STATUS, status,
  269. sizeof(u8));
  270. }
  271. static int read_sys_dpll_status(struct idtcm *idtcm, u8 *status)
  272. {
  273. return idtcm_read(idtcm, STATUS, DPLL_SYS_STATUS, status, sizeof(u8));
  274. }
  275. static int wait_for_sys_apll_dpll_lock(struct idtcm *idtcm)
  276. {
  277. unsigned long timeout = jiffies + msecs_to_jiffies(LOCK_TIMEOUT_MS);
  278. u8 apll = 0;
  279. u8 dpll = 0;
  280. int err;
  281. do {
  282. err = read_sys_apll_status(idtcm, &apll);
  283. if (err)
  284. return err;
  285. err = read_sys_dpll_status(idtcm, &dpll);
  286. if (err)
  287. return err;
  288. apll &= SYS_APLL_LOSS_LOCK_LIVE_MASK;
  289. dpll &= DPLL_SYS_STATE_MASK;
  290. if (apll == SYS_APLL_LOSS_LOCK_LIVE_LOCKED &&
  291. dpll == DPLL_STATE_LOCKED) {
  292. return 0;
  293. } else if (dpll == DPLL_STATE_FREERUN ||
  294. dpll == DPLL_STATE_HOLDOVER ||
  295. dpll == DPLL_STATE_OPEN_LOOP) {
  296. dev_warn(idtcm->dev,
  297. "No wait state: DPLL_SYS_STATE %d", dpll);
  298. return -EPERM;
  299. }
  300. msleep(LOCK_POLL_INTERVAL_MS);
  301. } while (time_is_after_jiffies(timeout));
  302. dev_warn(idtcm->dev,
  303. "%d ms lock timeout: SYS APLL Loss Lock %d SYS DPLL state %d",
  304. LOCK_TIMEOUT_MS, apll, dpll);
  305. return -ETIME;
  306. }
  307. static void wait_for_chip_ready(struct idtcm *idtcm)
  308. {
  309. if (wait_for_boot_status_ready(idtcm))
  310. dev_warn(idtcm->dev, "BOOT_STATUS != 0xA0");
  311. if (wait_for_sys_apll_dpll_lock(idtcm))
  312. dev_warn(idtcm->dev,
  313. "Continuing while SYS APLL/DPLL is not locked");
  314. }
  315. static int _idtcm_gettime_triggered(struct idtcm_channel *channel,
  316. struct timespec64 *ts)
  317. {
  318. struct idtcm *idtcm = channel->idtcm;
  319. u16 tod_read_cmd = IDTCM_FW_REG(idtcm->fw_ver, V520, TOD_READ_SECONDARY_CMD);
  320. u8 buf[TOD_BYTE_COUNT];
  321. u8 trigger;
  322. int err;
  323. err = idtcm_read(idtcm, channel->tod_read_secondary,
  324. tod_read_cmd, &trigger, sizeof(trigger));
  325. if (err)
  326. return err;
  327. if (trigger & TOD_READ_TRIGGER_MASK)
  328. return -EBUSY;
  329. err = idtcm_read(idtcm, channel->tod_read_secondary,
  330. TOD_READ_SECONDARY_BASE, buf, sizeof(buf));
  331. if (err)
  332. return err;
  333. return char_array_to_timespec(buf, sizeof(buf), ts);
  334. }
  335. static int _idtcm_gettime(struct idtcm_channel *channel,
  336. struct timespec64 *ts, u8 timeout)
  337. {
  338. struct idtcm *idtcm = channel->idtcm;
  339. u16 tod_read_cmd = IDTCM_FW_REG(idtcm->fw_ver, V520, TOD_READ_PRIMARY_CMD);
  340. u8 buf[TOD_BYTE_COUNT];
  341. u8 trigger;
  342. int err;
  343. /* wait trigger to be 0 */
  344. do {
  345. if (timeout-- == 0)
  346. return -EIO;
  347. if (idtcm->calculate_overhead_flag)
  348. idtcm->start_time = ktime_get_raw();
  349. err = idtcm_read(idtcm, channel->tod_read_primary,
  350. tod_read_cmd, &trigger,
  351. sizeof(trigger));
  352. if (err)
  353. return err;
  354. } while (trigger & TOD_READ_TRIGGER_MASK);
  355. err = idtcm_read(idtcm, channel->tod_read_primary,
  356. TOD_READ_PRIMARY_BASE, buf, sizeof(buf));
  357. if (err)
  358. return err;
  359. err = char_array_to_timespec(buf, sizeof(buf), ts);
  360. return err;
  361. }
  362. static int idtcm_extts_check_channel(struct idtcm *idtcm, u8 todn)
  363. {
  364. struct idtcm_channel *ptp_channel, *extts_channel;
  365. struct ptp_clock_event event;
  366. struct timespec64 ts;
  367. u32 dco_delay = 0;
  368. int err;
  369. extts_channel = &idtcm->channel[todn];
  370. ptp_channel = idtcm->event_channel[todn];
  371. if (extts_channel == ptp_channel)
  372. dco_delay = ptp_channel->dco_delay;
  373. err = _idtcm_gettime_triggered(extts_channel, &ts);
  374. if (err)
  375. return err;
  376. /* Triggered - save timestamp */
  377. event.type = PTP_CLOCK_EXTTS;
  378. event.index = todn;
  379. event.timestamp = timespec64_to_ns(&ts) - dco_delay;
  380. ptp_clock_event(ptp_channel->ptp_clock, &event);
  381. return err;
  382. }
  383. static int _idtcm_gettime_immediate(struct idtcm_channel *channel,
  384. struct timespec64 *ts)
  385. {
  386. struct idtcm *idtcm = channel->idtcm;
  387. u16 tod_read_cmd = IDTCM_FW_REG(idtcm->fw_ver, V520, TOD_READ_PRIMARY_CMD);
  388. u8 val = (SCSR_TOD_READ_TRIG_SEL_IMMEDIATE << TOD_READ_TRIGGER_SHIFT);
  389. int err;
  390. err = idtcm_write(idtcm, channel->tod_read_primary,
  391. tod_read_cmd, &val, sizeof(val));
  392. if (err)
  393. return err;
  394. return _idtcm_gettime(channel, ts, 10);
  395. }
  396. static int _sync_pll_output(struct idtcm *idtcm,
  397. u8 pll,
  398. u8 sync_src,
  399. u8 qn,
  400. u8 qn_plus_1)
  401. {
  402. int err;
  403. u8 val;
  404. u16 sync_ctrl0;
  405. u16 sync_ctrl1;
  406. u8 temp;
  407. if (qn == 0 && qn_plus_1 == 0)
  408. return 0;
  409. switch (pll) {
  410. case 0:
  411. sync_ctrl0 = HW_Q0_Q1_CH_SYNC_CTRL_0;
  412. sync_ctrl1 = HW_Q0_Q1_CH_SYNC_CTRL_1;
  413. break;
  414. case 1:
  415. sync_ctrl0 = HW_Q2_Q3_CH_SYNC_CTRL_0;
  416. sync_ctrl1 = HW_Q2_Q3_CH_SYNC_CTRL_1;
  417. break;
  418. case 2:
  419. sync_ctrl0 = HW_Q4_Q5_CH_SYNC_CTRL_0;
  420. sync_ctrl1 = HW_Q4_Q5_CH_SYNC_CTRL_1;
  421. break;
  422. case 3:
  423. sync_ctrl0 = HW_Q6_Q7_CH_SYNC_CTRL_0;
  424. sync_ctrl1 = HW_Q6_Q7_CH_SYNC_CTRL_1;
  425. break;
  426. case 4:
  427. sync_ctrl0 = HW_Q8_CH_SYNC_CTRL_0;
  428. sync_ctrl1 = HW_Q8_CH_SYNC_CTRL_1;
  429. break;
  430. case 5:
  431. sync_ctrl0 = HW_Q9_CH_SYNC_CTRL_0;
  432. sync_ctrl1 = HW_Q9_CH_SYNC_CTRL_1;
  433. break;
  434. case 6:
  435. sync_ctrl0 = HW_Q10_CH_SYNC_CTRL_0;
  436. sync_ctrl1 = HW_Q10_CH_SYNC_CTRL_1;
  437. break;
  438. case 7:
  439. sync_ctrl0 = HW_Q11_CH_SYNC_CTRL_0;
  440. sync_ctrl1 = HW_Q11_CH_SYNC_CTRL_1;
  441. break;
  442. default:
  443. return -EINVAL;
  444. }
  445. val = SYNCTRL1_MASTER_SYNC_RST;
  446. /* Place master sync in reset */
  447. err = idtcm_write(idtcm, 0, sync_ctrl1, &val, sizeof(val));
  448. if (err)
  449. return err;
  450. err = idtcm_write(idtcm, 0, sync_ctrl0, &sync_src, sizeof(sync_src));
  451. if (err)
  452. return err;
  453. /* Set sync trigger mask */
  454. val |= SYNCTRL1_FBDIV_FRAME_SYNC_TRIG | SYNCTRL1_FBDIV_SYNC_TRIG;
  455. if (qn)
  456. val |= SYNCTRL1_Q0_DIV_SYNC_TRIG;
  457. if (qn_plus_1)
  458. val |= SYNCTRL1_Q1_DIV_SYNC_TRIG;
  459. err = idtcm_write(idtcm, 0, sync_ctrl1, &val, sizeof(val));
  460. if (err)
  461. return err;
  462. /* PLL5 can have OUT8 as second additional output. */
  463. if (pll == 5 && qn_plus_1 != 0) {
  464. err = idtcm_read(idtcm, 0, HW_Q8_CTRL_SPARE,
  465. &temp, sizeof(temp));
  466. if (err)
  467. return err;
  468. temp &= ~(Q9_TO_Q8_SYNC_TRIG);
  469. err = idtcm_write(idtcm, 0, HW_Q8_CTRL_SPARE,
  470. &temp, sizeof(temp));
  471. if (err)
  472. return err;
  473. temp |= Q9_TO_Q8_SYNC_TRIG;
  474. err = idtcm_write(idtcm, 0, HW_Q8_CTRL_SPARE,
  475. &temp, sizeof(temp));
  476. if (err)
  477. return err;
  478. }
  479. /* PLL6 can have OUT11 as second additional output. */
  480. if (pll == 6 && qn_plus_1 != 0) {
  481. err = idtcm_read(idtcm, 0, HW_Q11_CTRL_SPARE,
  482. &temp, sizeof(temp));
  483. if (err)
  484. return err;
  485. temp &= ~(Q10_TO_Q11_SYNC_TRIG);
  486. err = idtcm_write(idtcm, 0, HW_Q11_CTRL_SPARE,
  487. &temp, sizeof(temp));
  488. if (err)
  489. return err;
  490. temp |= Q10_TO_Q11_SYNC_TRIG;
  491. err = idtcm_write(idtcm, 0, HW_Q11_CTRL_SPARE,
  492. &temp, sizeof(temp));
  493. if (err)
  494. return err;
  495. }
  496. /* Place master sync out of reset */
  497. val &= ~(SYNCTRL1_MASTER_SYNC_RST);
  498. err = idtcm_write(idtcm, 0, sync_ctrl1, &val, sizeof(val));
  499. return err;
  500. }
  501. static int idtcm_sync_pps_output(struct idtcm_channel *channel)
  502. {
  503. struct idtcm *idtcm = channel->idtcm;
  504. u8 pll;
  505. u8 qn;
  506. u8 qn_plus_1;
  507. int err = 0;
  508. u8 out8_mux = 0;
  509. u8 out11_mux = 0;
  510. u8 temp;
  511. u16 output_mask = channel->output_mask;
  512. err = idtcm_read(idtcm, 0, HW_Q8_CTRL_SPARE,
  513. &temp, sizeof(temp));
  514. if (err)
  515. return err;
  516. if ((temp & Q9_TO_Q8_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK) ==
  517. Q9_TO_Q8_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK)
  518. out8_mux = 1;
  519. err = idtcm_read(idtcm, 0, HW_Q11_CTRL_SPARE,
  520. &temp, sizeof(temp));
  521. if (err)
  522. return err;
  523. if ((temp & Q10_TO_Q11_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK) ==
  524. Q10_TO_Q11_FANOUT_AND_CLOCK_SYNC_ENABLE_MASK)
  525. out11_mux = 1;
  526. for (pll = 0; pll < 8; pll++) {
  527. qn = 0;
  528. qn_plus_1 = 0;
  529. if (pll < 4) {
  530. /* First 4 pll has 2 outputs */
  531. qn = output_mask & 0x1;
  532. output_mask = output_mask >> 1;
  533. qn_plus_1 = output_mask & 0x1;
  534. output_mask = output_mask >> 1;
  535. } else if (pll == 4) {
  536. if (out8_mux == 0) {
  537. qn = output_mask & 0x1;
  538. output_mask = output_mask >> 1;
  539. }
  540. } else if (pll == 5) {
  541. if (out8_mux) {
  542. qn_plus_1 = output_mask & 0x1;
  543. output_mask = output_mask >> 1;
  544. }
  545. qn = output_mask & 0x1;
  546. output_mask = output_mask >> 1;
  547. } else if (pll == 6) {
  548. qn = output_mask & 0x1;
  549. output_mask = output_mask >> 1;
  550. if (out11_mux) {
  551. qn_plus_1 = output_mask & 0x1;
  552. output_mask = output_mask >> 1;
  553. }
  554. } else if (pll == 7) {
  555. if (out11_mux == 0) {
  556. qn = output_mask & 0x1;
  557. output_mask = output_mask >> 1;
  558. }
  559. }
  560. if (qn != 0 || qn_plus_1 != 0)
  561. err = _sync_pll_output(idtcm, pll, channel->sync_src,
  562. qn, qn_plus_1);
  563. if (err)
  564. return err;
  565. }
  566. return err;
  567. }
  568. static int _idtcm_set_dpll_hw_tod(struct idtcm_channel *channel,
  569. struct timespec64 const *ts,
  570. enum hw_tod_write_trig_sel wr_trig)
  571. {
  572. struct idtcm *idtcm = channel->idtcm;
  573. u8 buf[TOD_BYTE_COUNT];
  574. u8 cmd;
  575. int err;
  576. struct timespec64 local_ts = *ts;
  577. s64 total_overhead_ns;
  578. /* Configure HW TOD write trigger. */
  579. err = idtcm_read(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_CTRL_1,
  580. &cmd, sizeof(cmd));
  581. if (err)
  582. return err;
  583. cmd &= ~(0x0f);
  584. cmd |= wr_trig | 0x08;
  585. err = idtcm_write(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_CTRL_1,
  586. &cmd, sizeof(cmd));
  587. if (err)
  588. return err;
  589. if (wr_trig != HW_TOD_WR_TRIG_SEL_MSB) {
  590. err = timespec_to_char_array(&local_ts, buf, sizeof(buf));
  591. if (err)
  592. return err;
  593. err = idtcm_write(idtcm, channel->hw_dpll_n,
  594. HW_DPLL_TOD_OVR__0, buf, sizeof(buf));
  595. if (err)
  596. return err;
  597. }
  598. /* ARM HW TOD write trigger. */
  599. cmd &= ~(0x08);
  600. err = idtcm_write(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_CTRL_1,
  601. &cmd, sizeof(cmd));
  602. if (wr_trig == HW_TOD_WR_TRIG_SEL_MSB) {
  603. if (idtcm->calculate_overhead_flag) {
  604. /* Assumption: I2C @ 400KHz */
  605. ktime_t diff = ktime_sub(ktime_get_raw(),
  606. idtcm->start_time);
  607. total_overhead_ns = ktime_to_ns(diff)
  608. + idtcm->tod_write_overhead_ns
  609. + SETTIME_CORRECTION;
  610. timespec64_add_ns(&local_ts, total_overhead_ns);
  611. idtcm->calculate_overhead_flag = 0;
  612. }
  613. err = timespec_to_char_array(&local_ts, buf, sizeof(buf));
  614. if (err)
  615. return err;
  616. err = idtcm_write(idtcm, channel->hw_dpll_n,
  617. HW_DPLL_TOD_OVR__0, buf, sizeof(buf));
  618. }
  619. return err;
  620. }
  621. static int _idtcm_set_dpll_scsr_tod(struct idtcm_channel *channel,
  622. struct timespec64 const *ts,
  623. enum scsr_tod_write_trig_sel wr_trig,
  624. enum scsr_tod_write_type_sel wr_type)
  625. {
  626. struct idtcm *idtcm = channel->idtcm;
  627. unsigned char buf[TOD_BYTE_COUNT], cmd;
  628. struct timespec64 local_ts = *ts;
  629. int err, count = 0;
  630. timespec64_add_ns(&local_ts, SETTIME_CORRECTION);
  631. err = timespec_to_char_array(&local_ts, buf, sizeof(buf));
  632. if (err)
  633. return err;
  634. err = idtcm_write(idtcm, channel->tod_write, TOD_WRITE,
  635. buf, sizeof(buf));
  636. if (err)
  637. return err;
  638. /* Trigger the write operation. */
  639. err = idtcm_read(idtcm, channel->tod_write, TOD_WRITE_CMD,
  640. &cmd, sizeof(cmd));
  641. if (err)
  642. return err;
  643. cmd &= ~(TOD_WRITE_SELECTION_MASK << TOD_WRITE_SELECTION_SHIFT);
  644. cmd &= ~(TOD_WRITE_TYPE_MASK << TOD_WRITE_TYPE_SHIFT);
  645. cmd |= (wr_trig << TOD_WRITE_SELECTION_SHIFT);
  646. cmd |= (wr_type << TOD_WRITE_TYPE_SHIFT);
  647. err = idtcm_write(idtcm, channel->tod_write, TOD_WRITE_CMD,
  648. &cmd, sizeof(cmd));
  649. if (err)
  650. return err;
  651. /* Wait for the operation to complete. */
  652. while (1) {
  653. /* pps trigger takes up to 1 sec to complete */
  654. if (wr_trig == SCSR_TOD_WR_TRIG_SEL_TODPPS)
  655. msleep(50);
  656. err = idtcm_read(idtcm, channel->tod_write, TOD_WRITE_CMD,
  657. &cmd, sizeof(cmd));
  658. if (err)
  659. return err;
  660. if ((cmd & TOD_WRITE_SELECTION_MASK) == 0)
  661. break;
  662. if (++count > 20) {
  663. dev_err(idtcm->dev,
  664. "Timed out waiting for the write counter");
  665. return -EIO;
  666. }
  667. }
  668. return 0;
  669. }
  670. static int get_output_base_addr(enum fw_version ver, u8 outn)
  671. {
  672. int base;
  673. switch (outn) {
  674. case 0:
  675. base = IDTCM_FW_REG(ver, V520, OUTPUT_0);
  676. break;
  677. case 1:
  678. base = IDTCM_FW_REG(ver, V520, OUTPUT_1);
  679. break;
  680. case 2:
  681. base = IDTCM_FW_REG(ver, V520, OUTPUT_2);
  682. break;
  683. case 3:
  684. base = IDTCM_FW_REG(ver, V520, OUTPUT_3);
  685. break;
  686. case 4:
  687. base = IDTCM_FW_REG(ver, V520, OUTPUT_4);
  688. break;
  689. case 5:
  690. base = IDTCM_FW_REG(ver, V520, OUTPUT_5);
  691. break;
  692. case 6:
  693. base = IDTCM_FW_REG(ver, V520, OUTPUT_6);
  694. break;
  695. case 7:
  696. base = IDTCM_FW_REG(ver, V520, OUTPUT_7);
  697. break;
  698. case 8:
  699. base = IDTCM_FW_REG(ver, V520, OUTPUT_8);
  700. break;
  701. case 9:
  702. base = IDTCM_FW_REG(ver, V520, OUTPUT_9);
  703. break;
  704. case 10:
  705. base = IDTCM_FW_REG(ver, V520, OUTPUT_10);
  706. break;
  707. case 11:
  708. base = IDTCM_FW_REG(ver, V520, OUTPUT_11);
  709. break;
  710. default:
  711. base = -EINVAL;
  712. }
  713. return base;
  714. }
  715. static int _idtcm_settime_deprecated(struct idtcm_channel *channel,
  716. struct timespec64 const *ts)
  717. {
  718. struct idtcm *idtcm = channel->idtcm;
  719. int err;
  720. err = _idtcm_set_dpll_hw_tod(channel, ts, HW_TOD_WR_TRIG_SEL_MSB);
  721. if (err) {
  722. dev_err(idtcm->dev,
  723. "%s: Set HW ToD failed", __func__);
  724. return err;
  725. }
  726. return idtcm_sync_pps_output(channel);
  727. }
  728. static int _idtcm_settime(struct idtcm_channel *channel,
  729. struct timespec64 const *ts,
  730. enum scsr_tod_write_type_sel wr_type)
  731. {
  732. return _idtcm_set_dpll_scsr_tod(channel, ts,
  733. SCSR_TOD_WR_TRIG_SEL_IMMEDIATE,
  734. wr_type);
  735. }
  736. static int idtcm_set_phase_pull_in_offset(struct idtcm_channel *channel,
  737. s32 offset_ns)
  738. {
  739. int err;
  740. int i;
  741. struct idtcm *idtcm = channel->idtcm;
  742. u8 buf[4];
  743. for (i = 0; i < 4; i++) {
  744. buf[i] = 0xff & (offset_ns);
  745. offset_ns >>= 8;
  746. }
  747. err = idtcm_write(idtcm, channel->dpll_phase_pull_in, PULL_IN_OFFSET,
  748. buf, sizeof(buf));
  749. return err;
  750. }
  751. static int idtcm_set_phase_pull_in_slope_limit(struct idtcm_channel *channel,
  752. u32 max_ffo_ppb)
  753. {
  754. int err;
  755. u8 i;
  756. struct idtcm *idtcm = channel->idtcm;
  757. u8 buf[3];
  758. if (max_ffo_ppb & 0xff000000)
  759. max_ffo_ppb = 0;
  760. for (i = 0; i < 3; i++) {
  761. buf[i] = 0xff & (max_ffo_ppb);
  762. max_ffo_ppb >>= 8;
  763. }
  764. err = idtcm_write(idtcm, channel->dpll_phase_pull_in,
  765. PULL_IN_SLOPE_LIMIT, buf, sizeof(buf));
  766. return err;
  767. }
  768. static int idtcm_start_phase_pull_in(struct idtcm_channel *channel)
  769. {
  770. int err;
  771. struct idtcm *idtcm = channel->idtcm;
  772. u8 buf;
  773. err = idtcm_read(idtcm, channel->dpll_phase_pull_in, PULL_IN_CTRL,
  774. &buf, sizeof(buf));
  775. if (err)
  776. return err;
  777. if (buf == 0) {
  778. buf = 0x01;
  779. err = idtcm_write(idtcm, channel->dpll_phase_pull_in,
  780. PULL_IN_CTRL, &buf, sizeof(buf));
  781. } else {
  782. err = -EBUSY;
  783. }
  784. return err;
  785. }
  786. static int do_phase_pull_in_fw(struct idtcm_channel *channel,
  787. s32 offset_ns,
  788. u32 max_ffo_ppb)
  789. {
  790. int err;
  791. err = idtcm_set_phase_pull_in_offset(channel, -offset_ns);
  792. if (err)
  793. return err;
  794. err = idtcm_set_phase_pull_in_slope_limit(channel, max_ffo_ppb);
  795. if (err)
  796. return err;
  797. err = idtcm_start_phase_pull_in(channel);
  798. return err;
  799. }
  800. static int set_tod_write_overhead(struct idtcm_channel *channel)
  801. {
  802. struct idtcm *idtcm = channel->idtcm;
  803. s64 current_ns = 0;
  804. s64 lowest_ns = 0;
  805. int err;
  806. u8 i;
  807. ktime_t start;
  808. ktime_t stop;
  809. ktime_t diff;
  810. char buf[TOD_BYTE_COUNT] = {0};
  811. /* Set page offset */
  812. idtcm_write(idtcm, channel->hw_dpll_n, HW_DPLL_TOD_OVR__0,
  813. buf, sizeof(buf));
  814. for (i = 0; i < TOD_WRITE_OVERHEAD_COUNT_MAX; i++) {
  815. start = ktime_get_raw();
  816. err = idtcm_write(idtcm, channel->hw_dpll_n,
  817. HW_DPLL_TOD_OVR__0, buf, sizeof(buf));
  818. if (err)
  819. return err;
  820. stop = ktime_get_raw();
  821. diff = ktime_sub(stop, start);
  822. current_ns = ktime_to_ns(diff);
  823. if (i == 0) {
  824. lowest_ns = current_ns;
  825. } else {
  826. if (current_ns < lowest_ns)
  827. lowest_ns = current_ns;
  828. }
  829. }
  830. idtcm->tod_write_overhead_ns = lowest_ns;
  831. return err;
  832. }
  833. static int _idtcm_adjtime_deprecated(struct idtcm_channel *channel, s64 delta)
  834. {
  835. int err;
  836. struct idtcm *idtcm = channel->idtcm;
  837. struct timespec64 ts;
  838. s64 now;
  839. if (abs(delta) < PHASE_PULL_IN_THRESHOLD_NS_DEPRECATED) {
  840. err = channel->do_phase_pull_in(channel, delta, 0);
  841. } else {
  842. idtcm->calculate_overhead_flag = 1;
  843. err = set_tod_write_overhead(channel);
  844. if (err)
  845. return err;
  846. err = _idtcm_gettime_immediate(channel, &ts);
  847. if (err)
  848. return err;
  849. now = timespec64_to_ns(&ts);
  850. now += delta;
  851. ts = ns_to_timespec64(now);
  852. err = _idtcm_settime_deprecated(channel, &ts);
  853. }
  854. return err;
  855. }
  856. static int idtcm_state_machine_reset(struct idtcm *idtcm)
  857. {
  858. u8 byte = SM_RESET_CMD;
  859. u32 status = 0;
  860. int err;
  861. u8 i;
  862. clear_boot_status(idtcm);
  863. err = idtcm_write(idtcm, RESET_CTRL,
  864. IDTCM_FW_REG(idtcm->fw_ver, V520, SM_RESET),
  865. &byte, sizeof(byte));
  866. if (!err) {
  867. for (i = 0; i < 30; i++) {
  868. msleep_interruptible(100);
  869. read_boot_status(idtcm, &status);
  870. if (status == 0xA0) {
  871. dev_dbg(idtcm->dev,
  872. "SM_RESET completed in %d ms", i * 100);
  873. break;
  874. }
  875. }
  876. if (!status)
  877. dev_err(idtcm->dev,
  878. "Timed out waiting for CM_RESET to complete");
  879. }
  880. return err;
  881. }
  882. static int idtcm_read_hw_rev_id(struct idtcm *idtcm, u8 *hw_rev_id)
  883. {
  884. return idtcm_read(idtcm, HW_REVISION, REV_ID, hw_rev_id, sizeof(u8));
  885. }
  886. static int idtcm_read_product_id(struct idtcm *idtcm, u16 *product_id)
  887. {
  888. int err;
  889. u8 buf[2] = {0};
  890. err = idtcm_read(idtcm, GENERAL_STATUS, PRODUCT_ID, buf, sizeof(buf));
  891. *product_id = (buf[1] << 8) | buf[0];
  892. return err;
  893. }
  894. static int idtcm_read_major_release(struct idtcm *idtcm, u8 *major)
  895. {
  896. int err;
  897. u8 buf = 0;
  898. err = idtcm_read(idtcm, GENERAL_STATUS, MAJ_REL, &buf, sizeof(buf));
  899. *major = buf >> 1;
  900. return err;
  901. }
  902. static int idtcm_read_minor_release(struct idtcm *idtcm, u8 *minor)
  903. {
  904. return idtcm_read(idtcm, GENERAL_STATUS, MIN_REL, minor, sizeof(u8));
  905. }
  906. static int idtcm_read_hotfix_release(struct idtcm *idtcm, u8 *hotfix)
  907. {
  908. return idtcm_read(idtcm,
  909. GENERAL_STATUS,
  910. HOTFIX_REL,
  911. hotfix,
  912. sizeof(u8));
  913. }
  914. static int idtcm_read_otp_scsr_config_select(struct idtcm *idtcm,
  915. u8 *config_select)
  916. {
  917. return idtcm_read(idtcm, GENERAL_STATUS, OTP_SCSR_CONFIG_SELECT,
  918. config_select, sizeof(u8));
  919. }
  920. static int set_pll_output_mask(struct idtcm *idtcm, u16 addr, u8 val)
  921. {
  922. int err = 0;
  923. switch (addr) {
  924. case TOD0_OUT_ALIGN_MASK_ADDR:
  925. SET_U16_LSB(idtcm->channel[0].output_mask, val);
  926. break;
  927. case TOD0_OUT_ALIGN_MASK_ADDR + 1:
  928. SET_U16_MSB(idtcm->channel[0].output_mask, val);
  929. break;
  930. case TOD1_OUT_ALIGN_MASK_ADDR:
  931. SET_U16_LSB(idtcm->channel[1].output_mask, val);
  932. break;
  933. case TOD1_OUT_ALIGN_MASK_ADDR + 1:
  934. SET_U16_MSB(idtcm->channel[1].output_mask, val);
  935. break;
  936. case TOD2_OUT_ALIGN_MASK_ADDR:
  937. SET_U16_LSB(idtcm->channel[2].output_mask, val);
  938. break;
  939. case TOD2_OUT_ALIGN_MASK_ADDR + 1:
  940. SET_U16_MSB(idtcm->channel[2].output_mask, val);
  941. break;
  942. case TOD3_OUT_ALIGN_MASK_ADDR:
  943. SET_U16_LSB(idtcm->channel[3].output_mask, val);
  944. break;
  945. case TOD3_OUT_ALIGN_MASK_ADDR + 1:
  946. SET_U16_MSB(idtcm->channel[3].output_mask, val);
  947. break;
  948. default:
  949. err = -EFAULT; /* Bad address */;
  950. break;
  951. }
  952. return err;
  953. }
  954. static int set_tod_ptp_pll(struct idtcm *idtcm, u8 index, u8 pll)
  955. {
  956. if (index >= MAX_TOD) {
  957. dev_err(idtcm->dev, "ToD%d not supported", index);
  958. return -EINVAL;
  959. }
  960. if (pll >= MAX_PLL) {
  961. dev_err(idtcm->dev, "Pll%d not supported", pll);
  962. return -EINVAL;
  963. }
  964. idtcm->channel[index].pll = pll;
  965. return 0;
  966. }
  967. static int check_and_set_masks(struct idtcm *idtcm,
  968. u16 regaddr,
  969. u8 val)
  970. {
  971. int err = 0;
  972. switch (regaddr) {
  973. case TOD_MASK_ADDR:
  974. if ((val & 0xf0) || !(val & 0x0f)) {
  975. dev_err(idtcm->dev, "Invalid TOD mask 0x%02x", val);
  976. err = -EINVAL;
  977. } else {
  978. idtcm->tod_mask = val;
  979. }
  980. break;
  981. case TOD0_PTP_PLL_ADDR:
  982. err = set_tod_ptp_pll(idtcm, 0, val);
  983. break;
  984. case TOD1_PTP_PLL_ADDR:
  985. err = set_tod_ptp_pll(idtcm, 1, val);
  986. break;
  987. case TOD2_PTP_PLL_ADDR:
  988. err = set_tod_ptp_pll(idtcm, 2, val);
  989. break;
  990. case TOD3_PTP_PLL_ADDR:
  991. err = set_tod_ptp_pll(idtcm, 3, val);
  992. break;
  993. default:
  994. err = set_pll_output_mask(idtcm, regaddr, val);
  995. break;
  996. }
  997. return err;
  998. }
  999. static void display_pll_and_masks(struct idtcm *idtcm)
  1000. {
  1001. u8 i;
  1002. u8 mask;
  1003. dev_dbg(idtcm->dev, "tod_mask = 0x%02x", idtcm->tod_mask);
  1004. for (i = 0; i < MAX_TOD; i++) {
  1005. mask = 1 << i;
  1006. if (mask & idtcm->tod_mask)
  1007. dev_dbg(idtcm->dev,
  1008. "TOD%d pll = %d output_mask = 0x%04x",
  1009. i, idtcm->channel[i].pll,
  1010. idtcm->channel[i].output_mask);
  1011. }
  1012. }
  1013. static int idtcm_load_firmware(struct idtcm *idtcm,
  1014. struct device *dev)
  1015. {
  1016. u16 scratch = IDTCM_FW_REG(idtcm->fw_ver, V520, SCRATCH);
  1017. char fname[128] = FW_FILENAME;
  1018. const struct firmware *fw;
  1019. struct idtcm_fwrc *rec;
  1020. u32 regaddr;
  1021. int err;
  1022. s32 len;
  1023. u8 val;
  1024. u8 loaddr;
  1025. if (firmware) /* module parameter */
  1026. snprintf(fname, sizeof(fname), "%s", firmware);
  1027. dev_info(idtcm->dev, "requesting firmware '%s'", fname);
  1028. err = request_firmware(&fw, fname, dev);
  1029. if (err) {
  1030. dev_err(idtcm->dev,
  1031. "Failed at line %d in %s!", __LINE__, __func__);
  1032. return err;
  1033. }
  1034. dev_dbg(idtcm->dev, "firmware size %zu bytes", fw->size);
  1035. rec = (struct idtcm_fwrc *) fw->data;
  1036. if (contains_full_configuration(idtcm, fw))
  1037. idtcm_state_machine_reset(idtcm);
  1038. for (len = fw->size; len > 0; len -= sizeof(*rec)) {
  1039. if (rec->reserved) {
  1040. dev_err(idtcm->dev,
  1041. "bad firmware, reserved field non-zero");
  1042. err = -EINVAL;
  1043. } else {
  1044. regaddr = rec->hiaddr << 8;
  1045. regaddr |= rec->loaddr;
  1046. val = rec->value;
  1047. loaddr = rec->loaddr;
  1048. rec++;
  1049. err = check_and_set_masks(idtcm, regaddr, val);
  1050. }
  1051. if (err != -EINVAL) {
  1052. err = 0;
  1053. /* Top (status registers) and bottom are read-only */
  1054. if (regaddr < GPIO_USER_CONTROL || regaddr >= scratch)
  1055. continue;
  1056. /* Page size 128, last 4 bytes of page skipped */
  1057. if ((loaddr > 0x7b && loaddr <= 0x7f) || loaddr > 0xfb)
  1058. continue;
  1059. err = idtcm_write(idtcm, regaddr, 0, &val, sizeof(val));
  1060. }
  1061. if (err)
  1062. goto out;
  1063. }
  1064. display_pll_and_masks(idtcm);
  1065. out:
  1066. release_firmware(fw);
  1067. return err;
  1068. }
  1069. static int idtcm_output_enable(struct idtcm_channel *channel,
  1070. bool enable, unsigned int outn)
  1071. {
  1072. struct idtcm *idtcm = channel->idtcm;
  1073. int base;
  1074. int err;
  1075. u8 val;
  1076. base = get_output_base_addr(idtcm->fw_ver, outn);
  1077. if (!(base > 0)) {
  1078. dev_err(idtcm->dev,
  1079. "%s - Unsupported out%d", __func__, outn);
  1080. return base;
  1081. }
  1082. err = idtcm_read(idtcm, (u16)base, OUT_CTRL_1, &val, sizeof(val));
  1083. if (err)
  1084. return err;
  1085. if (enable)
  1086. val |= SQUELCH_DISABLE;
  1087. else
  1088. val &= ~SQUELCH_DISABLE;
  1089. return idtcm_write(idtcm, (u16)base, OUT_CTRL_1, &val, sizeof(val));
  1090. }
  1091. static int idtcm_perout_enable(struct idtcm_channel *channel,
  1092. struct ptp_perout_request *perout,
  1093. bool enable)
  1094. {
  1095. struct idtcm *idtcm = channel->idtcm;
  1096. struct timespec64 ts = {0, 0};
  1097. int err;
  1098. err = idtcm_output_enable(channel, enable, perout->index);
  1099. if (err) {
  1100. dev_err(idtcm->dev, "Unable to set output enable");
  1101. return err;
  1102. }
  1103. /* Align output to internal 1 PPS */
  1104. return _idtcm_settime(channel, &ts, SCSR_TOD_WR_TYPE_SEL_DELTA_PLUS);
  1105. }
  1106. static int idtcm_get_pll_mode(struct idtcm_channel *channel,
  1107. enum pll_mode *mode)
  1108. {
  1109. struct idtcm *idtcm = channel->idtcm;
  1110. int err;
  1111. u8 dpll_mode;
  1112. err = idtcm_read(idtcm, channel->dpll_n,
  1113. IDTCM_FW_REG(idtcm->fw_ver, V520, DPLL_MODE),
  1114. &dpll_mode, sizeof(dpll_mode));
  1115. if (err)
  1116. return err;
  1117. *mode = (dpll_mode >> PLL_MODE_SHIFT) & PLL_MODE_MASK;
  1118. return 0;
  1119. }
  1120. static int idtcm_set_pll_mode(struct idtcm_channel *channel,
  1121. enum pll_mode mode)
  1122. {
  1123. struct idtcm *idtcm = channel->idtcm;
  1124. int err;
  1125. u8 dpll_mode;
  1126. err = idtcm_read(idtcm, channel->dpll_n,
  1127. IDTCM_FW_REG(idtcm->fw_ver, V520, DPLL_MODE),
  1128. &dpll_mode, sizeof(dpll_mode));
  1129. if (err)
  1130. return err;
  1131. dpll_mode &= ~(PLL_MODE_MASK << PLL_MODE_SHIFT);
  1132. dpll_mode |= (mode << PLL_MODE_SHIFT);
  1133. err = idtcm_write(idtcm, channel->dpll_n,
  1134. IDTCM_FW_REG(idtcm->fw_ver, V520, DPLL_MODE),
  1135. &dpll_mode, sizeof(dpll_mode));
  1136. return err;
  1137. }
  1138. static int idtcm_get_manual_reference(struct idtcm_channel *channel,
  1139. enum manual_reference *ref)
  1140. {
  1141. struct idtcm *idtcm = channel->idtcm;
  1142. u8 dpll_manu_ref_cfg;
  1143. int err;
  1144. err = idtcm_read(idtcm, channel->dpll_ctrl_n,
  1145. DPLL_CTRL_DPLL_MANU_REF_CFG,
  1146. &dpll_manu_ref_cfg, sizeof(dpll_manu_ref_cfg));
  1147. if (err)
  1148. return err;
  1149. dpll_manu_ref_cfg &= (MANUAL_REFERENCE_MASK << MANUAL_REFERENCE_SHIFT);
  1150. *ref = dpll_manu_ref_cfg >> MANUAL_REFERENCE_SHIFT;
  1151. return 0;
  1152. }
  1153. static int idtcm_set_manual_reference(struct idtcm_channel *channel,
  1154. enum manual_reference ref)
  1155. {
  1156. struct idtcm *idtcm = channel->idtcm;
  1157. u8 dpll_manu_ref_cfg;
  1158. int err;
  1159. err = idtcm_read(idtcm, channel->dpll_ctrl_n,
  1160. DPLL_CTRL_DPLL_MANU_REF_CFG,
  1161. &dpll_manu_ref_cfg, sizeof(dpll_manu_ref_cfg));
  1162. if (err)
  1163. return err;
  1164. dpll_manu_ref_cfg &= ~(MANUAL_REFERENCE_MASK << MANUAL_REFERENCE_SHIFT);
  1165. dpll_manu_ref_cfg |= (ref << MANUAL_REFERENCE_SHIFT);
  1166. err = idtcm_write(idtcm, channel->dpll_ctrl_n,
  1167. DPLL_CTRL_DPLL_MANU_REF_CFG,
  1168. &dpll_manu_ref_cfg, sizeof(dpll_manu_ref_cfg));
  1169. return err;
  1170. }
  1171. static int configure_dpll_mode_write_frequency(struct idtcm_channel *channel)
  1172. {
  1173. struct idtcm *idtcm = channel->idtcm;
  1174. int err;
  1175. err = idtcm_set_pll_mode(channel, PLL_MODE_WRITE_FREQUENCY);
  1176. if (err)
  1177. dev_err(idtcm->dev, "Failed to set pll mode to write frequency");
  1178. else
  1179. channel->mode = PTP_PLL_MODE_WRITE_FREQUENCY;
  1180. return err;
  1181. }
  1182. static int configure_dpll_mode_write_phase(struct idtcm_channel *channel)
  1183. {
  1184. struct idtcm *idtcm = channel->idtcm;
  1185. int err;
  1186. err = idtcm_set_pll_mode(channel, PLL_MODE_WRITE_PHASE);
  1187. if (err)
  1188. dev_err(idtcm->dev, "Failed to set pll mode to write phase");
  1189. else
  1190. channel->mode = PTP_PLL_MODE_WRITE_PHASE;
  1191. return err;
  1192. }
  1193. static int configure_manual_reference_write_frequency(struct idtcm_channel *channel)
  1194. {
  1195. struct idtcm *idtcm = channel->idtcm;
  1196. int err;
  1197. err = idtcm_set_manual_reference(channel, MANU_REF_WRITE_FREQUENCY);
  1198. if (err)
  1199. dev_err(idtcm->dev, "Failed to set manual reference to write frequency");
  1200. else
  1201. channel->mode = PTP_PLL_MODE_WRITE_FREQUENCY;
  1202. return err;
  1203. }
  1204. static int configure_manual_reference_write_phase(struct idtcm_channel *channel)
  1205. {
  1206. struct idtcm *idtcm = channel->idtcm;
  1207. int err;
  1208. err = idtcm_set_manual_reference(channel, MANU_REF_WRITE_PHASE);
  1209. if (err)
  1210. dev_err(idtcm->dev, "Failed to set manual reference to write phase");
  1211. else
  1212. channel->mode = PTP_PLL_MODE_WRITE_PHASE;
  1213. return err;
  1214. }
  1215. static int idtcm_stop_phase_pull_in(struct idtcm_channel *channel)
  1216. {
  1217. int err;
  1218. err = _idtcm_adjfine(channel, channel->current_freq_scaled_ppm);
  1219. if (err)
  1220. return err;
  1221. channel->phase_pull_in = false;
  1222. return 0;
  1223. }
  1224. static long idtcm_work_handler(struct ptp_clock_info *ptp)
  1225. {
  1226. struct idtcm_channel *channel = container_of(ptp, struct idtcm_channel, caps);
  1227. struct idtcm *idtcm = channel->idtcm;
  1228. mutex_lock(idtcm->lock);
  1229. (void)idtcm_stop_phase_pull_in(channel);
  1230. mutex_unlock(idtcm->lock);
  1231. /* Return a negative value here to not reschedule */
  1232. return -1;
  1233. }
  1234. static s32 phase_pull_in_scaled_ppm(s32 current_ppm, s32 phase_pull_in_ppb)
  1235. {
  1236. /* ppb = scaled_ppm * 125 / 2^13 */
  1237. /* scaled_ppm = ppb * 2^13 / 125 */
  1238. s64 max_scaled_ppm = div_s64((s64)PHASE_PULL_IN_MAX_PPB << 13, 125);
  1239. s64 scaled_ppm = div_s64((s64)phase_pull_in_ppb << 13, 125);
  1240. current_ppm += scaled_ppm;
  1241. if (current_ppm > max_scaled_ppm)
  1242. current_ppm = max_scaled_ppm;
  1243. else if (current_ppm < -max_scaled_ppm)
  1244. current_ppm = -max_scaled_ppm;
  1245. return current_ppm;
  1246. }
  1247. static int do_phase_pull_in_sw(struct idtcm_channel *channel,
  1248. s32 delta_ns,
  1249. u32 max_ffo_ppb)
  1250. {
  1251. s32 current_ppm = channel->current_freq_scaled_ppm;
  1252. u32 duration_ms = MSEC_PER_SEC;
  1253. s32 delta_ppm;
  1254. s32 ppb;
  1255. int err;
  1256. /* If the ToD correction is less than PHASE_PULL_IN_MIN_THRESHOLD_NS,
  1257. * skip. The error introduced by the ToD adjustment procedure would
  1258. * be bigger than the required ToD correction
  1259. */
  1260. if (abs(delta_ns) < PHASE_PULL_IN_MIN_THRESHOLD_NS)
  1261. return 0;
  1262. if (max_ffo_ppb == 0)
  1263. max_ffo_ppb = PHASE_PULL_IN_MAX_PPB;
  1264. /* For most cases, keep phase pull-in duration 1 second */
  1265. ppb = delta_ns;
  1266. while (abs(ppb) > max_ffo_ppb) {
  1267. duration_ms *= 2;
  1268. ppb /= 2;
  1269. }
  1270. delta_ppm = phase_pull_in_scaled_ppm(current_ppm, ppb);
  1271. err = _idtcm_adjfine(channel, delta_ppm);
  1272. if (err)
  1273. return err;
  1274. /* schedule the worker to cancel phase pull-in */
  1275. ptp_schedule_worker(channel->ptp_clock,
  1276. msecs_to_jiffies(duration_ms) - 1);
  1277. channel->phase_pull_in = true;
  1278. return 0;
  1279. }
  1280. static int initialize_operating_mode_with_manual_reference(struct idtcm_channel *channel,
  1281. enum manual_reference ref)
  1282. {
  1283. struct idtcm *idtcm = channel->idtcm;
  1284. channel->mode = PTP_PLL_MODE_UNSUPPORTED;
  1285. channel->configure_write_frequency = configure_manual_reference_write_frequency;
  1286. channel->configure_write_phase = configure_manual_reference_write_phase;
  1287. channel->do_phase_pull_in = do_phase_pull_in_sw;
  1288. switch (ref) {
  1289. case MANU_REF_WRITE_PHASE:
  1290. channel->mode = PTP_PLL_MODE_WRITE_PHASE;
  1291. break;
  1292. case MANU_REF_WRITE_FREQUENCY:
  1293. channel->mode = PTP_PLL_MODE_WRITE_FREQUENCY;
  1294. break;
  1295. default:
  1296. dev_warn(idtcm->dev,
  1297. "Unsupported MANUAL_REFERENCE: 0x%02x", ref);
  1298. }
  1299. return 0;
  1300. }
  1301. static int initialize_operating_mode_with_pll_mode(struct idtcm_channel *channel,
  1302. enum pll_mode mode)
  1303. {
  1304. struct idtcm *idtcm = channel->idtcm;
  1305. int err = 0;
  1306. channel->mode = PTP_PLL_MODE_UNSUPPORTED;
  1307. channel->configure_write_frequency = configure_dpll_mode_write_frequency;
  1308. channel->configure_write_phase = configure_dpll_mode_write_phase;
  1309. channel->do_phase_pull_in = do_phase_pull_in_fw;
  1310. switch (mode) {
  1311. case PLL_MODE_WRITE_PHASE:
  1312. channel->mode = PTP_PLL_MODE_WRITE_PHASE;
  1313. break;
  1314. case PLL_MODE_WRITE_FREQUENCY:
  1315. channel->mode = PTP_PLL_MODE_WRITE_FREQUENCY;
  1316. break;
  1317. default:
  1318. dev_err(idtcm->dev,
  1319. "Unsupported PLL_MODE: 0x%02x", mode);
  1320. err = -EINVAL;
  1321. }
  1322. return err;
  1323. }
  1324. static int initialize_dco_operating_mode(struct idtcm_channel *channel)
  1325. {
  1326. enum manual_reference ref = MANU_REF_XO_DPLL;
  1327. enum pll_mode mode = PLL_MODE_DISABLED;
  1328. struct idtcm *idtcm = channel->idtcm;
  1329. int err;
  1330. channel->mode = PTP_PLL_MODE_UNSUPPORTED;
  1331. err = idtcm_get_pll_mode(channel, &mode);
  1332. if (err) {
  1333. dev_err(idtcm->dev, "Unable to read pll mode!");
  1334. return err;
  1335. }
  1336. if (mode == PLL_MODE_PLL) {
  1337. err = idtcm_get_manual_reference(channel, &ref);
  1338. if (err) {
  1339. dev_err(idtcm->dev, "Unable to read manual reference!");
  1340. return err;
  1341. }
  1342. err = initialize_operating_mode_with_manual_reference(channel, ref);
  1343. } else {
  1344. err = initialize_operating_mode_with_pll_mode(channel, mode);
  1345. }
  1346. if (channel->mode == PTP_PLL_MODE_WRITE_PHASE)
  1347. channel->configure_write_frequency(channel);
  1348. return err;
  1349. }
  1350. /* PTP Hardware Clock interface */
  1351. /*
  1352. * Maximum absolute value for write phase offset in picoseconds
  1353. *
  1354. * @channel: channel
  1355. * @delta_ns: delta in nanoseconds
  1356. *
  1357. * Destination signed register is 32-bit register in resolution of 50ps
  1358. *
  1359. * 0x7fffffff * 50 = 2147483647 * 50 = 107374182350
  1360. */
  1361. static int _idtcm_adjphase(struct idtcm_channel *channel, s32 delta_ns)
  1362. {
  1363. struct idtcm *idtcm = channel->idtcm;
  1364. int err;
  1365. u8 i;
  1366. u8 buf[4] = {0};
  1367. s32 phase_50ps;
  1368. s64 offset_ps;
  1369. if (channel->mode != PTP_PLL_MODE_WRITE_PHASE) {
  1370. err = channel->configure_write_phase(channel);
  1371. if (err)
  1372. return err;
  1373. }
  1374. offset_ps = (s64)delta_ns * 1000;
  1375. /*
  1376. * Check for 32-bit signed max * 50:
  1377. *
  1378. * 0x7fffffff * 50 = 2147483647 * 50 = 107374182350
  1379. */
  1380. if (offset_ps > MAX_ABS_WRITE_PHASE_PICOSECONDS)
  1381. offset_ps = MAX_ABS_WRITE_PHASE_PICOSECONDS;
  1382. else if (offset_ps < -MAX_ABS_WRITE_PHASE_PICOSECONDS)
  1383. offset_ps = -MAX_ABS_WRITE_PHASE_PICOSECONDS;
  1384. phase_50ps = div_s64(offset_ps, 50);
  1385. for (i = 0; i < 4; i++) {
  1386. buf[i] = phase_50ps & 0xff;
  1387. phase_50ps >>= 8;
  1388. }
  1389. err = idtcm_write(idtcm, channel->dpll_phase, DPLL_WR_PHASE,
  1390. buf, sizeof(buf));
  1391. return err;
  1392. }
  1393. static int _idtcm_adjfine(struct idtcm_channel *channel, long scaled_ppm)
  1394. {
  1395. struct idtcm *idtcm = channel->idtcm;
  1396. u8 i;
  1397. int err;
  1398. u8 buf[6] = {0};
  1399. s64 fcw;
  1400. if (channel->mode != PTP_PLL_MODE_WRITE_FREQUENCY) {
  1401. err = channel->configure_write_frequency(channel);
  1402. if (err)
  1403. return err;
  1404. }
  1405. /*
  1406. * Frequency Control Word unit is: 1.11 * 10^-10 ppm
  1407. *
  1408. * adjfreq:
  1409. * ppb * 10^9
  1410. * FCW = ----------
  1411. * 111
  1412. *
  1413. * adjfine:
  1414. * ppm_16 * 5^12
  1415. * FCW = -------------
  1416. * 111 * 2^4
  1417. */
  1418. /* 2 ^ -53 = 1.1102230246251565404236316680908e-16 */
  1419. fcw = scaled_ppm * 244140625ULL;
  1420. fcw = div_s64(fcw, 1776);
  1421. for (i = 0; i < 6; i++) {
  1422. buf[i] = fcw & 0xff;
  1423. fcw >>= 8;
  1424. }
  1425. err = idtcm_write(idtcm, channel->dpll_freq, DPLL_WR_FREQ,
  1426. buf, sizeof(buf));
  1427. return err;
  1428. }
  1429. static int idtcm_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts)
  1430. {
  1431. struct idtcm_channel *channel = container_of(ptp, struct idtcm_channel, caps);
  1432. struct idtcm *idtcm = channel->idtcm;
  1433. int err;
  1434. mutex_lock(idtcm->lock);
  1435. err = _idtcm_gettime_immediate(channel, ts);
  1436. mutex_unlock(idtcm->lock);
  1437. if (err)
  1438. dev_err(idtcm->dev, "Failed at line %d in %s!",
  1439. __LINE__, __func__);
  1440. return err;
  1441. }
  1442. static int idtcm_settime_deprecated(struct ptp_clock_info *ptp,
  1443. const struct timespec64 *ts)
  1444. {
  1445. struct idtcm_channel *channel = container_of(ptp, struct idtcm_channel, caps);
  1446. struct idtcm *idtcm = channel->idtcm;
  1447. int err;
  1448. mutex_lock(idtcm->lock);
  1449. err = _idtcm_settime_deprecated(channel, ts);
  1450. mutex_unlock(idtcm->lock);
  1451. if (err)
  1452. dev_err(idtcm->dev,
  1453. "Failed at line %d in %s!", __LINE__, __func__);
  1454. return err;
  1455. }
  1456. static int idtcm_settime(struct ptp_clock_info *ptp,
  1457. const struct timespec64 *ts)
  1458. {
  1459. struct idtcm_channel *channel = container_of(ptp, struct idtcm_channel, caps);
  1460. struct idtcm *idtcm = channel->idtcm;
  1461. int err;
  1462. mutex_lock(idtcm->lock);
  1463. err = _idtcm_settime(channel, ts, SCSR_TOD_WR_TYPE_SEL_ABSOLUTE);
  1464. mutex_unlock(idtcm->lock);
  1465. if (err)
  1466. dev_err(idtcm->dev,
  1467. "Failed at line %d in %s!", __LINE__, __func__);
  1468. return err;
  1469. }
  1470. static int idtcm_adjtime_deprecated(struct ptp_clock_info *ptp, s64 delta)
  1471. {
  1472. struct idtcm_channel *channel = container_of(ptp, struct idtcm_channel, caps);
  1473. struct idtcm *idtcm = channel->idtcm;
  1474. int err;
  1475. mutex_lock(idtcm->lock);
  1476. err = _idtcm_adjtime_deprecated(channel, delta);
  1477. mutex_unlock(idtcm->lock);
  1478. if (err)
  1479. dev_err(idtcm->dev,
  1480. "Failed at line %d in %s!", __LINE__, __func__);
  1481. return err;
  1482. }
  1483. static int idtcm_adjtime(struct ptp_clock_info *ptp, s64 delta)
  1484. {
  1485. struct idtcm_channel *channel = container_of(ptp, struct idtcm_channel, caps);
  1486. struct idtcm *idtcm = channel->idtcm;
  1487. struct timespec64 ts;
  1488. enum scsr_tod_write_type_sel type;
  1489. int err;
  1490. if (channel->phase_pull_in == true)
  1491. return -EBUSY;
  1492. mutex_lock(idtcm->lock);
  1493. if (abs(delta) < PHASE_PULL_IN_THRESHOLD_NS) {
  1494. err = channel->do_phase_pull_in(channel, delta, 0);
  1495. } else {
  1496. if (delta >= 0) {
  1497. ts = ns_to_timespec64(delta);
  1498. type = SCSR_TOD_WR_TYPE_SEL_DELTA_PLUS;
  1499. } else {
  1500. ts = ns_to_timespec64(-delta);
  1501. type = SCSR_TOD_WR_TYPE_SEL_DELTA_MINUS;
  1502. }
  1503. err = _idtcm_settime(channel, &ts, type);
  1504. }
  1505. mutex_unlock(idtcm->lock);
  1506. if (err)
  1507. dev_err(idtcm->dev,
  1508. "Failed at line %d in %s!", __LINE__, __func__);
  1509. return err;
  1510. }
  1511. static int idtcm_adjphase(struct ptp_clock_info *ptp, s32 delta)
  1512. {
  1513. struct idtcm_channel *channel = container_of(ptp, struct idtcm_channel, caps);
  1514. struct idtcm *idtcm = channel->idtcm;
  1515. int err;
  1516. mutex_lock(idtcm->lock);
  1517. err = _idtcm_adjphase(channel, delta);
  1518. mutex_unlock(idtcm->lock);
  1519. if (err)
  1520. dev_err(idtcm->dev,
  1521. "Failed at line %d in %s!", __LINE__, __func__);
  1522. return err;
  1523. }
  1524. static int idtcm_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
  1525. {
  1526. struct idtcm_channel *channel = container_of(ptp, struct idtcm_channel, caps);
  1527. struct idtcm *idtcm = channel->idtcm;
  1528. int err;
  1529. if (channel->phase_pull_in == true)
  1530. return 0;
  1531. if (scaled_ppm == channel->current_freq_scaled_ppm)
  1532. return 0;
  1533. mutex_lock(idtcm->lock);
  1534. err = _idtcm_adjfine(channel, scaled_ppm);
  1535. mutex_unlock(idtcm->lock);
  1536. if (err)
  1537. dev_err(idtcm->dev,
  1538. "Failed at line %d in %s!", __LINE__, __func__);
  1539. else
  1540. channel->current_freq_scaled_ppm = scaled_ppm;
  1541. return err;
  1542. }
  1543. static int idtcm_enable(struct ptp_clock_info *ptp,
  1544. struct ptp_clock_request *rq, int on)
  1545. {
  1546. struct idtcm_channel *channel = container_of(ptp, struct idtcm_channel, caps);
  1547. struct idtcm *idtcm = channel->idtcm;
  1548. int err = -EOPNOTSUPP;
  1549. mutex_lock(idtcm->lock);
  1550. switch (rq->type) {
  1551. case PTP_CLK_REQ_PEROUT:
  1552. if (!on)
  1553. err = idtcm_perout_enable(channel, &rq->perout, false);
  1554. /* Only accept a 1-PPS aligned to the second. */
  1555. else if (rq->perout.start.nsec || rq->perout.period.sec != 1 ||
  1556. rq->perout.period.nsec)
  1557. err = -ERANGE;
  1558. else
  1559. err = idtcm_perout_enable(channel, &rq->perout, true);
  1560. break;
  1561. case PTP_CLK_REQ_EXTTS:
  1562. err = idtcm_extts_enable(channel, rq, on);
  1563. break;
  1564. default:
  1565. break;
  1566. }
  1567. mutex_unlock(idtcm->lock);
  1568. if (err)
  1569. dev_err(channel->idtcm->dev,
  1570. "Failed in %s with err %d!", __func__, err);
  1571. return err;
  1572. }
  1573. static int idtcm_enable_tod(struct idtcm_channel *channel)
  1574. {
  1575. struct idtcm *idtcm = channel->idtcm;
  1576. struct timespec64 ts = {0, 0};
  1577. u16 tod_cfg = IDTCM_FW_REG(idtcm->fw_ver, V520, TOD_CFG);
  1578. u8 cfg;
  1579. int err;
  1580. /*
  1581. * Start the TOD clock ticking.
  1582. */
  1583. err = idtcm_read(idtcm, channel->tod_n, tod_cfg, &cfg, sizeof(cfg));
  1584. if (err)
  1585. return err;
  1586. cfg |= TOD_ENABLE;
  1587. err = idtcm_write(idtcm, channel->tod_n, tod_cfg, &cfg, sizeof(cfg));
  1588. if (err)
  1589. return err;
  1590. if (idtcm->fw_ver < V487)
  1591. return _idtcm_settime_deprecated(channel, &ts);
  1592. else
  1593. return _idtcm_settime(channel, &ts,
  1594. SCSR_TOD_WR_TYPE_SEL_ABSOLUTE);
  1595. }
  1596. static void idtcm_set_version_info(struct idtcm *idtcm)
  1597. {
  1598. u8 major;
  1599. u8 minor;
  1600. u8 hotfix;
  1601. u16 product_id;
  1602. u8 hw_rev_id;
  1603. u8 config_select;
  1604. idtcm_read_major_release(idtcm, &major);
  1605. idtcm_read_minor_release(idtcm, &minor);
  1606. idtcm_read_hotfix_release(idtcm, &hotfix);
  1607. idtcm_read_product_id(idtcm, &product_id);
  1608. idtcm_read_hw_rev_id(idtcm, &hw_rev_id);
  1609. idtcm_read_otp_scsr_config_select(idtcm, &config_select);
  1610. snprintf(idtcm->version, sizeof(idtcm->version), "%u.%u.%u",
  1611. major, minor, hotfix);
  1612. idtcm->fw_ver = idtcm_fw_version(idtcm->version);
  1613. dev_info(idtcm->dev,
  1614. "%d.%d.%d, Id: 0x%04x HW Rev: %d OTP Config Select: %d",
  1615. major, minor, hotfix,
  1616. product_id, hw_rev_id, config_select);
  1617. }
  1618. static int idtcm_verify_pin(struct ptp_clock_info *ptp, unsigned int pin,
  1619. enum ptp_pin_function func, unsigned int chan)
  1620. {
  1621. switch (func) {
  1622. case PTP_PF_NONE:
  1623. case PTP_PF_EXTTS:
  1624. break;
  1625. case PTP_PF_PEROUT:
  1626. case PTP_PF_PHYSYNC:
  1627. return -1;
  1628. }
  1629. return 0;
  1630. }
  1631. static struct ptp_pin_desc pin_config[MAX_TOD][MAX_REF_CLK];
  1632. static const struct ptp_clock_info idtcm_caps = {
  1633. .owner = THIS_MODULE,
  1634. .max_adj = 244000,
  1635. .n_per_out = 12,
  1636. .n_ext_ts = MAX_TOD,
  1637. .n_pins = MAX_REF_CLK,
  1638. .adjphase = &idtcm_adjphase,
  1639. .adjfine = &idtcm_adjfine,
  1640. .adjtime = &idtcm_adjtime,
  1641. .gettime64 = &idtcm_gettime,
  1642. .settime64 = &idtcm_settime,
  1643. .enable = &idtcm_enable,
  1644. .verify = &idtcm_verify_pin,
  1645. .do_aux_work = &idtcm_work_handler,
  1646. };
  1647. static const struct ptp_clock_info idtcm_caps_deprecated = {
  1648. .owner = THIS_MODULE,
  1649. .max_adj = 244000,
  1650. .n_per_out = 12,
  1651. .n_ext_ts = MAX_TOD,
  1652. .n_pins = MAX_REF_CLK,
  1653. .adjphase = &idtcm_adjphase,
  1654. .adjfine = &idtcm_adjfine,
  1655. .adjtime = &idtcm_adjtime_deprecated,
  1656. .gettime64 = &idtcm_gettime,
  1657. .settime64 = &idtcm_settime_deprecated,
  1658. .enable = &idtcm_enable,
  1659. .verify = &idtcm_verify_pin,
  1660. .do_aux_work = &idtcm_work_handler,
  1661. };
  1662. static int configure_channel_pll(struct idtcm_channel *channel)
  1663. {
  1664. struct idtcm *idtcm = channel->idtcm;
  1665. int err = 0;
  1666. switch (channel->pll) {
  1667. case 0:
  1668. channel->dpll_freq = DPLL_FREQ_0;
  1669. channel->dpll_n = DPLL_0;
  1670. channel->hw_dpll_n = HW_DPLL_0;
  1671. channel->dpll_phase = DPLL_PHASE_0;
  1672. channel->dpll_ctrl_n = DPLL_CTRL_0;
  1673. channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_0;
  1674. break;
  1675. case 1:
  1676. channel->dpll_freq = DPLL_FREQ_1;
  1677. channel->dpll_n = DPLL_1;
  1678. channel->hw_dpll_n = HW_DPLL_1;
  1679. channel->dpll_phase = DPLL_PHASE_1;
  1680. channel->dpll_ctrl_n = DPLL_CTRL_1;
  1681. channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_1;
  1682. break;
  1683. case 2:
  1684. channel->dpll_freq = DPLL_FREQ_2;
  1685. channel->dpll_n = IDTCM_FW_REG(idtcm->fw_ver, V520, DPLL_2);
  1686. channel->hw_dpll_n = HW_DPLL_2;
  1687. channel->dpll_phase = DPLL_PHASE_2;
  1688. channel->dpll_ctrl_n = DPLL_CTRL_2;
  1689. channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_2;
  1690. break;
  1691. case 3:
  1692. channel->dpll_freq = DPLL_FREQ_3;
  1693. channel->dpll_n = DPLL_3;
  1694. channel->hw_dpll_n = HW_DPLL_3;
  1695. channel->dpll_phase = DPLL_PHASE_3;
  1696. channel->dpll_ctrl_n = DPLL_CTRL_3;
  1697. channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_3;
  1698. break;
  1699. case 4:
  1700. channel->dpll_freq = DPLL_FREQ_4;
  1701. channel->dpll_n = IDTCM_FW_REG(idtcm->fw_ver, V520, DPLL_4);
  1702. channel->hw_dpll_n = HW_DPLL_4;
  1703. channel->dpll_phase = DPLL_PHASE_4;
  1704. channel->dpll_ctrl_n = DPLL_CTRL_4;
  1705. channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_4;
  1706. break;
  1707. case 5:
  1708. channel->dpll_freq = DPLL_FREQ_5;
  1709. channel->dpll_n = DPLL_5;
  1710. channel->hw_dpll_n = HW_DPLL_5;
  1711. channel->dpll_phase = DPLL_PHASE_5;
  1712. channel->dpll_ctrl_n = DPLL_CTRL_5;
  1713. channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_5;
  1714. break;
  1715. case 6:
  1716. channel->dpll_freq = DPLL_FREQ_6;
  1717. channel->dpll_n = IDTCM_FW_REG(idtcm->fw_ver, V520, DPLL_6);
  1718. channel->hw_dpll_n = HW_DPLL_6;
  1719. channel->dpll_phase = DPLL_PHASE_6;
  1720. channel->dpll_ctrl_n = DPLL_CTRL_6;
  1721. channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_6;
  1722. break;
  1723. case 7:
  1724. channel->dpll_freq = DPLL_FREQ_7;
  1725. channel->dpll_n = DPLL_7;
  1726. channel->hw_dpll_n = HW_DPLL_7;
  1727. channel->dpll_phase = DPLL_PHASE_7;
  1728. channel->dpll_ctrl_n = DPLL_CTRL_7;
  1729. channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_7;
  1730. break;
  1731. default:
  1732. err = -EINVAL;
  1733. }
  1734. return err;
  1735. }
  1736. /*
  1737. * Compensate for the PTP DCO input-to-output delay.
  1738. * This delay is 18 FOD cycles.
  1739. */
  1740. static u32 idtcm_get_dco_delay(struct idtcm_channel *channel)
  1741. {
  1742. struct idtcm *idtcm = channel->idtcm;
  1743. u8 mbuf[8] = {0};
  1744. u8 nbuf[2] = {0};
  1745. u32 fodFreq;
  1746. int err;
  1747. u64 m;
  1748. u16 n;
  1749. err = idtcm_read(idtcm, channel->dpll_ctrl_n,
  1750. DPLL_CTRL_DPLL_FOD_FREQ, mbuf, 6);
  1751. if (err)
  1752. return 0;
  1753. err = idtcm_read(idtcm, channel->dpll_ctrl_n,
  1754. DPLL_CTRL_DPLL_FOD_FREQ + 6, nbuf, 2);
  1755. if (err)
  1756. return 0;
  1757. m = get_unaligned_le64(mbuf);
  1758. n = get_unaligned_le16(nbuf);
  1759. if (n == 0)
  1760. n = 1;
  1761. fodFreq = (u32)div_u64(m, n);
  1762. if (fodFreq >= 500000000)
  1763. return (u32)div_u64(18 * (u64)NSEC_PER_SEC, fodFreq);
  1764. return 0;
  1765. }
  1766. static int configure_channel_tod(struct idtcm_channel *channel, u32 index)
  1767. {
  1768. enum fw_version fw_ver = channel->idtcm->fw_ver;
  1769. /* Set tod addresses */
  1770. switch (index) {
  1771. case 0:
  1772. channel->tod_read_primary = IDTCM_FW_REG(fw_ver, V520, TOD_READ_PRIMARY_0);
  1773. channel->tod_read_secondary = IDTCM_FW_REG(fw_ver, V520, TOD_READ_SECONDARY_0);
  1774. channel->tod_write = IDTCM_FW_REG(fw_ver, V520, TOD_WRITE_0);
  1775. channel->tod_n = IDTCM_FW_REG(fw_ver, V520, TOD_0);
  1776. channel->sync_src = SYNC_SOURCE_DPLL0_TOD_PPS;
  1777. break;
  1778. case 1:
  1779. channel->tod_read_primary = IDTCM_FW_REG(fw_ver, V520, TOD_READ_PRIMARY_1);
  1780. channel->tod_read_secondary = IDTCM_FW_REG(fw_ver, V520, TOD_READ_SECONDARY_1);
  1781. channel->tod_write = IDTCM_FW_REG(fw_ver, V520, TOD_WRITE_1);
  1782. channel->tod_n = IDTCM_FW_REG(fw_ver, V520, TOD_1);
  1783. channel->sync_src = SYNC_SOURCE_DPLL1_TOD_PPS;
  1784. break;
  1785. case 2:
  1786. channel->tod_read_primary = IDTCM_FW_REG(fw_ver, V520, TOD_READ_PRIMARY_2);
  1787. channel->tod_read_secondary = IDTCM_FW_REG(fw_ver, V520, TOD_READ_SECONDARY_2);
  1788. channel->tod_write = IDTCM_FW_REG(fw_ver, V520, TOD_WRITE_2);
  1789. channel->tod_n = IDTCM_FW_REG(fw_ver, V520, TOD_2);
  1790. channel->sync_src = SYNC_SOURCE_DPLL2_TOD_PPS;
  1791. break;
  1792. case 3:
  1793. channel->tod_read_primary = IDTCM_FW_REG(fw_ver, V520, TOD_READ_PRIMARY_3);
  1794. channel->tod_read_secondary = IDTCM_FW_REG(fw_ver, V520, TOD_READ_SECONDARY_3);
  1795. channel->tod_write = IDTCM_FW_REG(fw_ver, V520, TOD_WRITE_3);
  1796. channel->tod_n = IDTCM_FW_REG(fw_ver, V520, TOD_3);
  1797. channel->sync_src = SYNC_SOURCE_DPLL3_TOD_PPS;
  1798. break;
  1799. default:
  1800. return -EINVAL;
  1801. }
  1802. return 0;
  1803. }
  1804. static int idtcm_enable_channel(struct idtcm *idtcm, u32 index)
  1805. {
  1806. struct idtcm_channel *channel;
  1807. int err;
  1808. int i;
  1809. if (!(index < MAX_TOD))
  1810. return -EINVAL;
  1811. channel = &idtcm->channel[index];
  1812. channel->idtcm = idtcm;
  1813. channel->current_freq_scaled_ppm = 0;
  1814. /* Set pll addresses */
  1815. err = configure_channel_pll(channel);
  1816. if (err)
  1817. return err;
  1818. /* Set tod addresses */
  1819. err = configure_channel_tod(channel, index);
  1820. if (err)
  1821. return err;
  1822. if (idtcm->fw_ver < V487)
  1823. channel->caps = idtcm_caps_deprecated;
  1824. else
  1825. channel->caps = idtcm_caps;
  1826. snprintf(channel->caps.name, sizeof(channel->caps.name),
  1827. "IDT CM TOD%u", index);
  1828. channel->caps.pin_config = pin_config[index];
  1829. for (i = 0; i < channel->caps.n_pins; ++i) {
  1830. struct ptp_pin_desc *ppd = &channel->caps.pin_config[i];
  1831. snprintf(ppd->name, sizeof(ppd->name), "input_ref%d", i);
  1832. ppd->index = i;
  1833. ppd->func = PTP_PF_NONE;
  1834. ppd->chan = index;
  1835. }
  1836. err = initialize_dco_operating_mode(channel);
  1837. if (err)
  1838. return err;
  1839. err = idtcm_enable_tod(channel);
  1840. if (err) {
  1841. dev_err(idtcm->dev,
  1842. "Failed at line %d in %s!", __LINE__, __func__);
  1843. return err;
  1844. }
  1845. channel->dco_delay = idtcm_get_dco_delay(channel);
  1846. channel->ptp_clock = ptp_clock_register(&channel->caps, NULL);
  1847. if (IS_ERR(channel->ptp_clock)) {
  1848. err = PTR_ERR(channel->ptp_clock);
  1849. channel->ptp_clock = NULL;
  1850. return err;
  1851. }
  1852. if (!channel->ptp_clock)
  1853. return -ENOTSUPP;
  1854. dev_info(idtcm->dev, "PLL%d registered as ptp%d",
  1855. index, channel->ptp_clock->index);
  1856. return 0;
  1857. }
  1858. static int idtcm_enable_extts_channel(struct idtcm *idtcm, u32 index)
  1859. {
  1860. struct idtcm_channel *channel;
  1861. int err;
  1862. if (!(index < MAX_TOD))
  1863. return -EINVAL;
  1864. channel = &idtcm->channel[index];
  1865. channel->idtcm = idtcm;
  1866. /* Set tod addresses */
  1867. err = configure_channel_tod(channel, index);
  1868. if (err)
  1869. return err;
  1870. channel->idtcm = idtcm;
  1871. return 0;
  1872. }
  1873. static void idtcm_extts_check(struct work_struct *work)
  1874. {
  1875. struct idtcm *idtcm = container_of(work, struct idtcm, extts_work.work);
  1876. struct idtcm_channel *channel;
  1877. u8 mask;
  1878. int err;
  1879. int i;
  1880. if (idtcm->extts_mask == 0)
  1881. return;
  1882. mutex_lock(idtcm->lock);
  1883. for (i = 0; i < MAX_TOD; i++) {
  1884. mask = 1 << i;
  1885. if ((idtcm->extts_mask & mask) == 0)
  1886. continue;
  1887. err = idtcm_extts_check_channel(idtcm, i);
  1888. if (err == 0) {
  1889. /* trigger clears itself, so clear the mask */
  1890. if (idtcm->extts_single_shot) {
  1891. idtcm->extts_mask &= ~mask;
  1892. } else {
  1893. /* Re-arm */
  1894. channel = &idtcm->channel[i];
  1895. arm_tod_read_trig_sel_refclk(channel, channel->refn);
  1896. }
  1897. }
  1898. }
  1899. if (idtcm->extts_mask)
  1900. schedule_delayed_work(&idtcm->extts_work,
  1901. msecs_to_jiffies(EXTTS_PERIOD_MS));
  1902. mutex_unlock(idtcm->lock);
  1903. }
  1904. static void ptp_clock_unregister_all(struct idtcm *idtcm)
  1905. {
  1906. u8 i;
  1907. struct idtcm_channel *channel;
  1908. for (i = 0; i < MAX_TOD; i++) {
  1909. channel = &idtcm->channel[i];
  1910. if (channel->ptp_clock)
  1911. ptp_clock_unregister(channel->ptp_clock);
  1912. }
  1913. }
  1914. static void set_default_masks(struct idtcm *idtcm)
  1915. {
  1916. idtcm->tod_mask = DEFAULT_TOD_MASK;
  1917. idtcm->extts_mask = 0;
  1918. idtcm->channel[0].tod = 0;
  1919. idtcm->channel[1].tod = 1;
  1920. idtcm->channel[2].tod = 2;
  1921. idtcm->channel[3].tod = 3;
  1922. idtcm->channel[0].pll = DEFAULT_TOD0_PTP_PLL;
  1923. idtcm->channel[1].pll = DEFAULT_TOD1_PTP_PLL;
  1924. idtcm->channel[2].pll = DEFAULT_TOD2_PTP_PLL;
  1925. idtcm->channel[3].pll = DEFAULT_TOD3_PTP_PLL;
  1926. idtcm->channel[0].output_mask = DEFAULT_OUTPUT_MASK_PLL0;
  1927. idtcm->channel[1].output_mask = DEFAULT_OUTPUT_MASK_PLL1;
  1928. idtcm->channel[2].output_mask = DEFAULT_OUTPUT_MASK_PLL2;
  1929. idtcm->channel[3].output_mask = DEFAULT_OUTPUT_MASK_PLL3;
  1930. }
  1931. static int idtcm_probe(struct platform_device *pdev)
  1932. {
  1933. struct rsmu_ddata *ddata = dev_get_drvdata(pdev->dev.parent);
  1934. struct idtcm *idtcm;
  1935. int err;
  1936. u8 i;
  1937. idtcm = devm_kzalloc(&pdev->dev, sizeof(struct idtcm), GFP_KERNEL);
  1938. if (!idtcm)
  1939. return -ENOMEM;
  1940. idtcm->dev = &pdev->dev;
  1941. idtcm->mfd = pdev->dev.parent;
  1942. idtcm->lock = &ddata->lock;
  1943. idtcm->regmap = ddata->regmap;
  1944. idtcm->calculate_overhead_flag = 0;
  1945. INIT_DELAYED_WORK(&idtcm->extts_work, idtcm_extts_check);
  1946. set_default_masks(idtcm);
  1947. mutex_lock(idtcm->lock);
  1948. idtcm_set_version_info(idtcm);
  1949. err = idtcm_load_firmware(idtcm, &pdev->dev);
  1950. if (err)
  1951. dev_warn(idtcm->dev, "loading firmware failed with %d", err);
  1952. wait_for_chip_ready(idtcm);
  1953. if (idtcm->tod_mask) {
  1954. for (i = 0; i < MAX_TOD; i++) {
  1955. if (idtcm->tod_mask & (1 << i))
  1956. err = idtcm_enable_channel(idtcm, i);
  1957. else
  1958. err = idtcm_enable_extts_channel(idtcm, i);
  1959. if (err) {
  1960. dev_err(idtcm->dev,
  1961. "idtcm_enable_channel %d failed!", i);
  1962. break;
  1963. }
  1964. }
  1965. } else {
  1966. dev_err(idtcm->dev,
  1967. "no PLLs flagged as PHCs, nothing to do");
  1968. err = -ENODEV;
  1969. }
  1970. mutex_unlock(idtcm->lock);
  1971. if (err) {
  1972. ptp_clock_unregister_all(idtcm);
  1973. return err;
  1974. }
  1975. platform_set_drvdata(pdev, idtcm);
  1976. return 0;
  1977. }
  1978. static int idtcm_remove(struct platform_device *pdev)
  1979. {
  1980. struct idtcm *idtcm = platform_get_drvdata(pdev);
  1981. idtcm->extts_mask = 0;
  1982. ptp_clock_unregister_all(idtcm);
  1983. cancel_delayed_work_sync(&idtcm->extts_work);
  1984. return 0;
  1985. }
  1986. static struct platform_driver idtcm_driver = {
  1987. .driver = {
  1988. .name = "8a3400x-phc",
  1989. },
  1990. .probe = idtcm_probe,
  1991. .remove = idtcm_remove,
  1992. };
  1993. module_platform_driver(idtcm_driver);