ptp_clockmatrix.c 55 KB

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