ptp_clockmatrix.c 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477
  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 <linux/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 <richardcochran@gmail.com>");
  25. MODULE_AUTHOR("IDT support-1588 <IDT-support-1588@lm.renesas.com>");
  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 nanoseconds
  1353. *
  1354. * Destination signed register is 32-bit register in resolution of 50ps
  1355. *
  1356. * 0x7fffffff * 50 = 2147483647 * 50 = 107374182350 ps
  1357. * Represent 107374182350 ps as 107374182 ns
  1358. */
  1359. static s32 idtcm_getmaxphase(struct ptp_clock_info *ptp __always_unused)
  1360. {
  1361. return MAX_ABS_WRITE_PHASE_NANOSECONDS;
  1362. }
  1363. /*
  1364. * Internal function for implementing support for write phase offset
  1365. *
  1366. * @channel: channel
  1367. * @delta_ns: delta in nanoseconds
  1368. */
  1369. static int _idtcm_adjphase(struct idtcm_channel *channel, s32 delta_ns)
  1370. {
  1371. struct idtcm *idtcm = channel->idtcm;
  1372. int err;
  1373. u8 i;
  1374. u8 buf[4] = {0};
  1375. s32 phase_50ps;
  1376. if (channel->mode != PTP_PLL_MODE_WRITE_PHASE) {
  1377. err = channel->configure_write_phase(channel);
  1378. if (err)
  1379. return err;
  1380. }
  1381. phase_50ps = div_s64((s64)delta_ns * 1000, 50);
  1382. for (i = 0; i < 4; i++) {
  1383. buf[i] = phase_50ps & 0xff;
  1384. phase_50ps >>= 8;
  1385. }
  1386. err = idtcm_write(idtcm, channel->dpll_phase, DPLL_WR_PHASE,
  1387. buf, sizeof(buf));
  1388. return err;
  1389. }
  1390. static int _idtcm_adjfine(struct idtcm_channel *channel, long scaled_ppm)
  1391. {
  1392. struct idtcm *idtcm = channel->idtcm;
  1393. u8 i;
  1394. int err;
  1395. u8 buf[6] = {0};
  1396. s64 fcw;
  1397. if (channel->mode != PTP_PLL_MODE_WRITE_FREQUENCY) {
  1398. err = channel->configure_write_frequency(channel);
  1399. if (err)
  1400. return err;
  1401. }
  1402. /*
  1403. * Frequency Control Word unit is: 1.11 * 10^-10 ppm
  1404. *
  1405. * adjfreq:
  1406. * ppb * 10^9
  1407. * FCW = ----------
  1408. * 111
  1409. *
  1410. * adjfine:
  1411. * ppm_16 * 5^12
  1412. * FCW = -------------
  1413. * 111 * 2^4
  1414. */
  1415. /* 2 ^ -53 = 1.1102230246251565404236316680908e-16 */
  1416. fcw = scaled_ppm * 244140625ULL;
  1417. fcw = div_s64(fcw, 1776);
  1418. for (i = 0; i < 6; i++) {
  1419. buf[i] = fcw & 0xff;
  1420. fcw >>= 8;
  1421. }
  1422. err = idtcm_write(idtcm, channel->dpll_freq, DPLL_WR_FREQ,
  1423. buf, sizeof(buf));
  1424. return err;
  1425. }
  1426. static int idtcm_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts)
  1427. {
  1428. struct idtcm_channel *channel = container_of(ptp, struct idtcm_channel, caps);
  1429. struct idtcm *idtcm = channel->idtcm;
  1430. int err;
  1431. mutex_lock(idtcm->lock);
  1432. err = _idtcm_gettime_immediate(channel, ts);
  1433. mutex_unlock(idtcm->lock);
  1434. if (err)
  1435. dev_err(idtcm->dev, "Failed at line %d in %s!",
  1436. __LINE__, __func__);
  1437. return err;
  1438. }
  1439. static int idtcm_settime_deprecated(struct ptp_clock_info *ptp,
  1440. const struct timespec64 *ts)
  1441. {
  1442. struct idtcm_channel *channel = container_of(ptp, struct idtcm_channel, caps);
  1443. struct idtcm *idtcm = channel->idtcm;
  1444. int err;
  1445. mutex_lock(idtcm->lock);
  1446. err = _idtcm_settime_deprecated(channel, ts);
  1447. mutex_unlock(idtcm->lock);
  1448. if (err)
  1449. dev_err(idtcm->dev,
  1450. "Failed at line %d in %s!", __LINE__, __func__);
  1451. return err;
  1452. }
  1453. static int idtcm_settime(struct ptp_clock_info *ptp,
  1454. const struct timespec64 *ts)
  1455. {
  1456. struct idtcm_channel *channel = container_of(ptp, struct idtcm_channel, caps);
  1457. struct idtcm *idtcm = channel->idtcm;
  1458. int err;
  1459. mutex_lock(idtcm->lock);
  1460. err = _idtcm_settime(channel, ts, SCSR_TOD_WR_TYPE_SEL_ABSOLUTE);
  1461. mutex_unlock(idtcm->lock);
  1462. if (err)
  1463. dev_err(idtcm->dev,
  1464. "Failed at line %d in %s!", __LINE__, __func__);
  1465. return err;
  1466. }
  1467. static int idtcm_adjtime_deprecated(struct ptp_clock_info *ptp, s64 delta)
  1468. {
  1469. struct idtcm_channel *channel = container_of(ptp, struct idtcm_channel, caps);
  1470. struct idtcm *idtcm = channel->idtcm;
  1471. int err;
  1472. mutex_lock(idtcm->lock);
  1473. err = _idtcm_adjtime_deprecated(channel, delta);
  1474. mutex_unlock(idtcm->lock);
  1475. if (err)
  1476. dev_err(idtcm->dev,
  1477. "Failed at line %d in %s!", __LINE__, __func__);
  1478. return err;
  1479. }
  1480. static int idtcm_adjtime(struct ptp_clock_info *ptp, s64 delta)
  1481. {
  1482. struct idtcm_channel *channel = container_of(ptp, struct idtcm_channel, caps);
  1483. struct idtcm *idtcm = channel->idtcm;
  1484. struct timespec64 ts;
  1485. enum scsr_tod_write_type_sel type;
  1486. int err;
  1487. if (channel->phase_pull_in == true)
  1488. return -EBUSY;
  1489. mutex_lock(idtcm->lock);
  1490. if (abs(delta) < PHASE_PULL_IN_THRESHOLD_NS) {
  1491. err = channel->do_phase_pull_in(channel, delta, 0);
  1492. } else {
  1493. if (delta >= 0) {
  1494. ts = ns_to_timespec64(delta);
  1495. type = SCSR_TOD_WR_TYPE_SEL_DELTA_PLUS;
  1496. } else {
  1497. ts = ns_to_timespec64(-delta);
  1498. type = SCSR_TOD_WR_TYPE_SEL_DELTA_MINUS;
  1499. }
  1500. err = _idtcm_settime(channel, &ts, type);
  1501. }
  1502. mutex_unlock(idtcm->lock);
  1503. if (err)
  1504. dev_err(idtcm->dev,
  1505. "Failed at line %d in %s!", __LINE__, __func__);
  1506. return err;
  1507. }
  1508. static int idtcm_adjphase(struct ptp_clock_info *ptp, s32 delta)
  1509. {
  1510. struct idtcm_channel *channel = container_of(ptp, struct idtcm_channel, caps);
  1511. struct idtcm *idtcm = channel->idtcm;
  1512. int err;
  1513. mutex_lock(idtcm->lock);
  1514. err = _idtcm_adjphase(channel, delta);
  1515. mutex_unlock(idtcm->lock);
  1516. if (err)
  1517. dev_err(idtcm->dev,
  1518. "Failed at line %d in %s!", __LINE__, __func__);
  1519. return err;
  1520. }
  1521. static int idtcm_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
  1522. {
  1523. struct idtcm_channel *channel = container_of(ptp, struct idtcm_channel, caps);
  1524. struct idtcm *idtcm = channel->idtcm;
  1525. int err;
  1526. if (channel->phase_pull_in == true)
  1527. return 0;
  1528. if (scaled_ppm == channel->current_freq_scaled_ppm)
  1529. return 0;
  1530. mutex_lock(idtcm->lock);
  1531. err = _idtcm_adjfine(channel, scaled_ppm);
  1532. mutex_unlock(idtcm->lock);
  1533. if (err)
  1534. dev_err(idtcm->dev,
  1535. "Failed at line %d in %s!", __LINE__, __func__);
  1536. else
  1537. channel->current_freq_scaled_ppm = scaled_ppm;
  1538. return err;
  1539. }
  1540. static int idtcm_enable(struct ptp_clock_info *ptp,
  1541. struct ptp_clock_request *rq, int on)
  1542. {
  1543. struct idtcm_channel *channel = container_of(ptp, struct idtcm_channel, caps);
  1544. struct idtcm *idtcm = channel->idtcm;
  1545. int err = -EOPNOTSUPP;
  1546. mutex_lock(idtcm->lock);
  1547. switch (rq->type) {
  1548. case PTP_CLK_REQ_PEROUT:
  1549. if (!on)
  1550. err = idtcm_perout_enable(channel, &rq->perout, false);
  1551. /* Only accept a 1-PPS aligned to the second. */
  1552. else if (rq->perout.start.nsec || rq->perout.period.sec != 1 ||
  1553. rq->perout.period.nsec)
  1554. err = -ERANGE;
  1555. else
  1556. err = idtcm_perout_enable(channel, &rq->perout, true);
  1557. break;
  1558. case PTP_CLK_REQ_EXTTS:
  1559. err = idtcm_extts_enable(channel, rq, on);
  1560. break;
  1561. default:
  1562. break;
  1563. }
  1564. mutex_unlock(idtcm->lock);
  1565. if (err)
  1566. dev_err(channel->idtcm->dev,
  1567. "Failed in %s with err %d!", __func__, err);
  1568. return err;
  1569. }
  1570. static int idtcm_enable_tod(struct idtcm_channel *channel)
  1571. {
  1572. struct idtcm *idtcm = channel->idtcm;
  1573. struct timespec64 ts = {0, 0};
  1574. u16 tod_cfg = IDTCM_FW_REG(idtcm->fw_ver, V520, TOD_CFG);
  1575. u8 cfg;
  1576. int err;
  1577. /*
  1578. * Start the TOD clock ticking.
  1579. */
  1580. err = idtcm_read(idtcm, channel->tod_n, tod_cfg, &cfg, sizeof(cfg));
  1581. if (err)
  1582. return err;
  1583. cfg |= TOD_ENABLE;
  1584. err = idtcm_write(idtcm, channel->tod_n, tod_cfg, &cfg, sizeof(cfg));
  1585. if (err)
  1586. return err;
  1587. if (idtcm->fw_ver < V487)
  1588. return _idtcm_settime_deprecated(channel, &ts);
  1589. else
  1590. return _idtcm_settime(channel, &ts,
  1591. SCSR_TOD_WR_TYPE_SEL_ABSOLUTE);
  1592. }
  1593. static void idtcm_set_version_info(struct idtcm *idtcm)
  1594. {
  1595. u8 major;
  1596. u8 minor;
  1597. u8 hotfix;
  1598. u16 product_id;
  1599. u8 hw_rev_id;
  1600. u8 config_select;
  1601. idtcm_read_major_release(idtcm, &major);
  1602. idtcm_read_minor_release(idtcm, &minor);
  1603. idtcm_read_hotfix_release(idtcm, &hotfix);
  1604. idtcm_read_product_id(idtcm, &product_id);
  1605. idtcm_read_hw_rev_id(idtcm, &hw_rev_id);
  1606. idtcm_read_otp_scsr_config_select(idtcm, &config_select);
  1607. snprintf(idtcm->version, sizeof(idtcm->version), "%u.%u.%u",
  1608. major, minor, hotfix);
  1609. idtcm->fw_ver = idtcm_fw_version(idtcm->version);
  1610. dev_info(idtcm->dev,
  1611. "%d.%d.%d, Id: 0x%04x HW Rev: %d OTP Config Select: %d",
  1612. major, minor, hotfix,
  1613. product_id, hw_rev_id, config_select);
  1614. }
  1615. static int idtcm_verify_pin(struct ptp_clock_info *ptp, unsigned int pin,
  1616. enum ptp_pin_function func, unsigned int chan)
  1617. {
  1618. switch (func) {
  1619. case PTP_PF_NONE:
  1620. case PTP_PF_EXTTS:
  1621. break;
  1622. case PTP_PF_PEROUT:
  1623. case PTP_PF_PHYSYNC:
  1624. return -1;
  1625. }
  1626. return 0;
  1627. }
  1628. static struct ptp_pin_desc pin_config[MAX_TOD][MAX_REF_CLK];
  1629. static const struct ptp_clock_info idtcm_caps = {
  1630. .owner = THIS_MODULE,
  1631. .max_adj = 244000,
  1632. .n_per_out = 12,
  1633. .n_ext_ts = MAX_TOD,
  1634. .n_pins = MAX_REF_CLK,
  1635. .adjphase = &idtcm_adjphase,
  1636. .getmaxphase = &idtcm_getmaxphase,
  1637. .adjfine = &idtcm_adjfine,
  1638. .adjtime = &idtcm_adjtime,
  1639. .gettime64 = &idtcm_gettime,
  1640. .settime64 = &idtcm_settime,
  1641. .enable = &idtcm_enable,
  1642. .verify = &idtcm_verify_pin,
  1643. .do_aux_work = &idtcm_work_handler,
  1644. };
  1645. static const struct ptp_clock_info idtcm_caps_deprecated = {
  1646. .owner = THIS_MODULE,
  1647. .max_adj = 244000,
  1648. .n_per_out = 12,
  1649. .n_ext_ts = MAX_TOD,
  1650. .n_pins = MAX_REF_CLK,
  1651. .adjphase = &idtcm_adjphase,
  1652. .getmaxphase = &idtcm_getmaxphase,
  1653. .adjfine = &idtcm_adjfine,
  1654. .adjtime = &idtcm_adjtime_deprecated,
  1655. .gettime64 = &idtcm_gettime,
  1656. .settime64 = &idtcm_settime_deprecated,
  1657. .enable = &idtcm_enable,
  1658. .verify = &idtcm_verify_pin,
  1659. .do_aux_work = &idtcm_work_handler,
  1660. };
  1661. static int configure_channel_pll(struct idtcm_channel *channel)
  1662. {
  1663. struct idtcm *idtcm = channel->idtcm;
  1664. int err = 0;
  1665. switch (channel->pll) {
  1666. case 0:
  1667. channel->dpll_freq = DPLL_FREQ_0;
  1668. channel->dpll_n = DPLL_0;
  1669. channel->hw_dpll_n = HW_DPLL_0;
  1670. channel->dpll_phase = DPLL_PHASE_0;
  1671. channel->dpll_ctrl_n = DPLL_CTRL_0;
  1672. channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_0;
  1673. break;
  1674. case 1:
  1675. channel->dpll_freq = DPLL_FREQ_1;
  1676. channel->dpll_n = DPLL_1;
  1677. channel->hw_dpll_n = HW_DPLL_1;
  1678. channel->dpll_phase = DPLL_PHASE_1;
  1679. channel->dpll_ctrl_n = DPLL_CTRL_1;
  1680. channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_1;
  1681. break;
  1682. case 2:
  1683. channel->dpll_freq = DPLL_FREQ_2;
  1684. channel->dpll_n = IDTCM_FW_REG(idtcm->fw_ver, V520, DPLL_2);
  1685. channel->hw_dpll_n = HW_DPLL_2;
  1686. channel->dpll_phase = DPLL_PHASE_2;
  1687. channel->dpll_ctrl_n = DPLL_CTRL_2;
  1688. channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_2;
  1689. break;
  1690. case 3:
  1691. channel->dpll_freq = DPLL_FREQ_3;
  1692. channel->dpll_n = DPLL_3;
  1693. channel->hw_dpll_n = HW_DPLL_3;
  1694. channel->dpll_phase = DPLL_PHASE_3;
  1695. channel->dpll_ctrl_n = DPLL_CTRL_3;
  1696. channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_3;
  1697. break;
  1698. case 4:
  1699. channel->dpll_freq = DPLL_FREQ_4;
  1700. channel->dpll_n = IDTCM_FW_REG(idtcm->fw_ver, V520, DPLL_4);
  1701. channel->hw_dpll_n = HW_DPLL_4;
  1702. channel->dpll_phase = DPLL_PHASE_4;
  1703. channel->dpll_ctrl_n = DPLL_CTRL_4;
  1704. channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_4;
  1705. break;
  1706. case 5:
  1707. channel->dpll_freq = DPLL_FREQ_5;
  1708. channel->dpll_n = DPLL_5;
  1709. channel->hw_dpll_n = HW_DPLL_5;
  1710. channel->dpll_phase = DPLL_PHASE_5;
  1711. channel->dpll_ctrl_n = DPLL_CTRL_5;
  1712. channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_5;
  1713. break;
  1714. case 6:
  1715. channel->dpll_freq = DPLL_FREQ_6;
  1716. channel->dpll_n = IDTCM_FW_REG(idtcm->fw_ver, V520, DPLL_6);
  1717. channel->hw_dpll_n = HW_DPLL_6;
  1718. channel->dpll_phase = DPLL_PHASE_6;
  1719. channel->dpll_ctrl_n = DPLL_CTRL_6;
  1720. channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_6;
  1721. break;
  1722. case 7:
  1723. channel->dpll_freq = DPLL_FREQ_7;
  1724. channel->dpll_n = DPLL_7;
  1725. channel->hw_dpll_n = HW_DPLL_7;
  1726. channel->dpll_phase = DPLL_PHASE_7;
  1727. channel->dpll_ctrl_n = DPLL_CTRL_7;
  1728. channel->dpll_phase_pull_in = DPLL_PHASE_PULL_IN_7;
  1729. break;
  1730. default:
  1731. err = -EINVAL;
  1732. }
  1733. return err;
  1734. }
  1735. /*
  1736. * Compensate for the PTP DCO input-to-output delay.
  1737. * This delay is 18 FOD cycles.
  1738. */
  1739. static u32 idtcm_get_dco_delay(struct idtcm_channel *channel)
  1740. {
  1741. struct idtcm *idtcm = channel->idtcm;
  1742. u8 mbuf[8] = {0};
  1743. u8 nbuf[2] = {0};
  1744. u32 fodFreq;
  1745. int err;
  1746. u64 m;
  1747. u16 n;
  1748. err = idtcm_read(idtcm, channel->dpll_ctrl_n,
  1749. DPLL_CTRL_DPLL_FOD_FREQ, mbuf, 6);
  1750. if (err)
  1751. return 0;
  1752. err = idtcm_read(idtcm, channel->dpll_ctrl_n,
  1753. DPLL_CTRL_DPLL_FOD_FREQ + 6, nbuf, 2);
  1754. if (err)
  1755. return 0;
  1756. m = get_unaligned_le64(mbuf);
  1757. n = get_unaligned_le16(nbuf);
  1758. if (n == 0)
  1759. n = 1;
  1760. fodFreq = (u32)div_u64(m, n);
  1761. if (fodFreq >= 500000000)
  1762. return (u32)div_u64(18 * (u64)NSEC_PER_SEC, fodFreq);
  1763. return 0;
  1764. }
  1765. static int configure_channel_tod(struct idtcm_channel *channel, u32 index)
  1766. {
  1767. enum fw_version fw_ver = channel->idtcm->fw_ver;
  1768. /* Set tod addresses */
  1769. switch (index) {
  1770. case 0:
  1771. channel->tod_read_primary = IDTCM_FW_REG(fw_ver, V520, TOD_READ_PRIMARY_0);
  1772. channel->tod_read_secondary = IDTCM_FW_REG(fw_ver, V520, TOD_READ_SECONDARY_0);
  1773. channel->tod_write = IDTCM_FW_REG(fw_ver, V520, TOD_WRITE_0);
  1774. channel->tod_n = IDTCM_FW_REG(fw_ver, V520, TOD_0);
  1775. channel->sync_src = SYNC_SOURCE_DPLL0_TOD_PPS;
  1776. break;
  1777. case 1:
  1778. channel->tod_read_primary = IDTCM_FW_REG(fw_ver, V520, TOD_READ_PRIMARY_1);
  1779. channel->tod_read_secondary = IDTCM_FW_REG(fw_ver, V520, TOD_READ_SECONDARY_1);
  1780. channel->tod_write = IDTCM_FW_REG(fw_ver, V520, TOD_WRITE_1);
  1781. channel->tod_n = IDTCM_FW_REG(fw_ver, V520, TOD_1);
  1782. channel->sync_src = SYNC_SOURCE_DPLL1_TOD_PPS;
  1783. break;
  1784. case 2:
  1785. channel->tod_read_primary = IDTCM_FW_REG(fw_ver, V520, TOD_READ_PRIMARY_2);
  1786. channel->tod_read_secondary = IDTCM_FW_REG(fw_ver, V520, TOD_READ_SECONDARY_2);
  1787. channel->tod_write = IDTCM_FW_REG(fw_ver, V520, TOD_WRITE_2);
  1788. channel->tod_n = IDTCM_FW_REG(fw_ver, V520, TOD_2);
  1789. channel->sync_src = SYNC_SOURCE_DPLL2_TOD_PPS;
  1790. break;
  1791. case 3:
  1792. channel->tod_read_primary = IDTCM_FW_REG(fw_ver, V520, TOD_READ_PRIMARY_3);
  1793. channel->tod_read_secondary = IDTCM_FW_REG(fw_ver, V520, TOD_READ_SECONDARY_3);
  1794. channel->tod_write = IDTCM_FW_REG(fw_ver, V520, TOD_WRITE_3);
  1795. channel->tod_n = IDTCM_FW_REG(fw_ver, V520, TOD_3);
  1796. channel->sync_src = SYNC_SOURCE_DPLL3_TOD_PPS;
  1797. break;
  1798. default:
  1799. return -EINVAL;
  1800. }
  1801. return 0;
  1802. }
  1803. static int idtcm_enable_channel(struct idtcm *idtcm, u32 index)
  1804. {
  1805. struct idtcm_channel *channel;
  1806. int err;
  1807. int i;
  1808. if (!(index < MAX_TOD))
  1809. return -EINVAL;
  1810. channel = &idtcm->channel[index];
  1811. channel->idtcm = idtcm;
  1812. channel->current_freq_scaled_ppm = 0;
  1813. /* Set pll addresses */
  1814. err = configure_channel_pll(channel);
  1815. if (err)
  1816. return err;
  1817. /* Set tod addresses */
  1818. err = configure_channel_tod(channel, index);
  1819. if (err)
  1820. return err;
  1821. if (idtcm->fw_ver < V487)
  1822. channel->caps = idtcm_caps_deprecated;
  1823. else
  1824. channel->caps = idtcm_caps;
  1825. snprintf(channel->caps.name, sizeof(channel->caps.name),
  1826. "IDT CM TOD%u", index);
  1827. channel->caps.pin_config = pin_config[index];
  1828. for (i = 0; i < channel->caps.n_pins; ++i) {
  1829. struct ptp_pin_desc *ppd = &channel->caps.pin_config[i];
  1830. snprintf(ppd->name, sizeof(ppd->name), "input_ref%d", i);
  1831. ppd->index = i;
  1832. ppd->func = PTP_PF_NONE;
  1833. ppd->chan = index;
  1834. }
  1835. err = initialize_dco_operating_mode(channel);
  1836. if (err)
  1837. return err;
  1838. err = idtcm_enable_tod(channel);
  1839. if (err) {
  1840. dev_err(idtcm->dev,
  1841. "Failed at line %d in %s!", __LINE__, __func__);
  1842. return err;
  1843. }
  1844. channel->dco_delay = idtcm_get_dco_delay(channel);
  1845. channel->ptp_clock = ptp_clock_register(&channel->caps, NULL);
  1846. if (IS_ERR(channel->ptp_clock)) {
  1847. err = PTR_ERR(channel->ptp_clock);
  1848. channel->ptp_clock = NULL;
  1849. return err;
  1850. }
  1851. if (!channel->ptp_clock)
  1852. return -ENOTSUPP;
  1853. dev_info(idtcm->dev, "PLL%d registered as ptp%d",
  1854. index, channel->ptp_clock->index);
  1855. return 0;
  1856. }
  1857. static int idtcm_enable_extts_channel(struct idtcm *idtcm, u32 index)
  1858. {
  1859. struct idtcm_channel *channel;
  1860. int err;
  1861. if (!(index < MAX_TOD))
  1862. return -EINVAL;
  1863. channel = &idtcm->channel[index];
  1864. channel->idtcm = idtcm;
  1865. /* Set tod addresses */
  1866. err = configure_channel_tod(channel, index);
  1867. if (err)
  1868. return err;
  1869. channel->idtcm = idtcm;
  1870. return 0;
  1871. }
  1872. static void idtcm_extts_check(struct work_struct *work)
  1873. {
  1874. struct idtcm *idtcm = container_of(work, struct idtcm, extts_work.work);
  1875. struct idtcm_channel *channel;
  1876. u8 mask;
  1877. int err;
  1878. int i;
  1879. if (idtcm->extts_mask == 0)
  1880. return;
  1881. mutex_lock(idtcm->lock);
  1882. for (i = 0; i < MAX_TOD; i++) {
  1883. mask = 1 << i;
  1884. if ((idtcm->extts_mask & mask) == 0)
  1885. continue;
  1886. err = idtcm_extts_check_channel(idtcm, i);
  1887. if (err == 0) {
  1888. /* trigger clears itself, so clear the mask */
  1889. if (idtcm->extts_single_shot) {
  1890. idtcm->extts_mask &= ~mask;
  1891. } else {
  1892. /* Re-arm */
  1893. channel = &idtcm->channel[i];
  1894. arm_tod_read_trig_sel_refclk(channel, channel->refn);
  1895. }
  1896. }
  1897. }
  1898. if (idtcm->extts_mask)
  1899. schedule_delayed_work(&idtcm->extts_work,
  1900. msecs_to_jiffies(EXTTS_PERIOD_MS));
  1901. mutex_unlock(idtcm->lock);
  1902. }
  1903. static void ptp_clock_unregister_all(struct idtcm *idtcm)
  1904. {
  1905. u8 i;
  1906. struct idtcm_channel *channel;
  1907. for (i = 0; i < MAX_TOD; i++) {
  1908. channel = &idtcm->channel[i];
  1909. if (channel->ptp_clock)
  1910. ptp_clock_unregister(channel->ptp_clock);
  1911. }
  1912. }
  1913. static void set_default_masks(struct idtcm *idtcm)
  1914. {
  1915. idtcm->tod_mask = DEFAULT_TOD_MASK;
  1916. idtcm->extts_mask = 0;
  1917. idtcm->channel[0].tod = 0;
  1918. idtcm->channel[1].tod = 1;
  1919. idtcm->channel[2].tod = 2;
  1920. idtcm->channel[3].tod = 3;
  1921. idtcm->channel[0].pll = DEFAULT_TOD0_PTP_PLL;
  1922. idtcm->channel[1].pll = DEFAULT_TOD1_PTP_PLL;
  1923. idtcm->channel[2].pll = DEFAULT_TOD2_PTP_PLL;
  1924. idtcm->channel[3].pll = DEFAULT_TOD3_PTP_PLL;
  1925. idtcm->channel[0].output_mask = DEFAULT_OUTPUT_MASK_PLL0;
  1926. idtcm->channel[1].output_mask = DEFAULT_OUTPUT_MASK_PLL1;
  1927. idtcm->channel[2].output_mask = DEFAULT_OUTPUT_MASK_PLL2;
  1928. idtcm->channel[3].output_mask = DEFAULT_OUTPUT_MASK_PLL3;
  1929. }
  1930. static int idtcm_probe(struct platform_device *pdev)
  1931. {
  1932. struct rsmu_ddata *ddata = dev_get_drvdata(pdev->dev.parent);
  1933. struct idtcm *idtcm;
  1934. int err;
  1935. u8 i;
  1936. idtcm = devm_kzalloc(&pdev->dev, sizeof(struct idtcm), GFP_KERNEL);
  1937. if (!idtcm)
  1938. return -ENOMEM;
  1939. idtcm->dev = &pdev->dev;
  1940. idtcm->mfd = pdev->dev.parent;
  1941. idtcm->lock = &ddata->lock;
  1942. idtcm->regmap = ddata->regmap;
  1943. idtcm->calculate_overhead_flag = 0;
  1944. INIT_DELAYED_WORK(&idtcm->extts_work, idtcm_extts_check);
  1945. set_default_masks(idtcm);
  1946. mutex_lock(idtcm->lock);
  1947. idtcm_set_version_info(idtcm);
  1948. err = idtcm_load_firmware(idtcm, &pdev->dev);
  1949. if (err)
  1950. dev_warn(idtcm->dev, "loading firmware failed with %d", err);
  1951. wait_for_chip_ready(idtcm);
  1952. if (idtcm->tod_mask) {
  1953. for (i = 0; i < MAX_TOD; i++) {
  1954. if (idtcm->tod_mask & (1 << i))
  1955. err = idtcm_enable_channel(idtcm, i);
  1956. else
  1957. err = idtcm_enable_extts_channel(idtcm, i);
  1958. if (err) {
  1959. dev_err(idtcm->dev,
  1960. "idtcm_enable_channel %d failed!", i);
  1961. break;
  1962. }
  1963. }
  1964. } else {
  1965. dev_err(idtcm->dev,
  1966. "no PLLs flagged as PHCs, nothing to do");
  1967. err = -ENODEV;
  1968. }
  1969. mutex_unlock(idtcm->lock);
  1970. if (err) {
  1971. ptp_clock_unregister_all(idtcm);
  1972. return err;
  1973. }
  1974. platform_set_drvdata(pdev, idtcm);
  1975. return 0;
  1976. }
  1977. static void idtcm_remove(struct platform_device *pdev)
  1978. {
  1979. struct idtcm *idtcm = platform_get_drvdata(pdev);
  1980. idtcm->extts_mask = 0;
  1981. ptp_clock_unregister_all(idtcm);
  1982. cancel_delayed_work_sync(&idtcm->extts_work);
  1983. }
  1984. static struct platform_driver idtcm_driver = {
  1985. .driver = {
  1986. .name = "8a3400x-phc",
  1987. },
  1988. .probe = idtcm_probe,
  1989. .remove_new = idtcm_remove,
  1990. };
  1991. module_platform_driver(idtcm_driver);