ptp_idt82p33.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // Copyright (C) 2018 Integrated Device Technology, Inc
  4. //
  5. #define pr_fmt(fmt) "IDT_82p33xxx: " fmt
  6. #include <linux/firmware.h>
  7. #include <linux/platform_device.h>
  8. #include <linux/module.h>
  9. #include <linux/ptp_clock_kernel.h>
  10. #include <linux/delay.h>
  11. #include <linux/jiffies.h>
  12. #include <linux/kernel.h>
  13. #include <linux/timekeeping.h>
  14. #include <linux/bitops.h>
  15. #include <linux/of.h>
  16. #include <linux/mfd/rsmu.h>
  17. #include <linux/mfd/idt82p33_reg.h>
  18. #include "ptp_private.h"
  19. #include "ptp_idt82p33.h"
  20. MODULE_DESCRIPTION("Driver for IDT 82p33xxx clock devices");
  21. MODULE_AUTHOR("IDT support-1588 <[email protected]>");
  22. MODULE_VERSION("1.0");
  23. MODULE_LICENSE("GPL");
  24. MODULE_FIRMWARE(FW_FILENAME);
  25. /* Module Parameters */
  26. static u32 phase_snap_threshold = SNAP_THRESHOLD_NS;
  27. module_param(phase_snap_threshold, uint, 0);
  28. MODULE_PARM_DESC(phase_snap_threshold,
  29. "threshold (10000ns by default) below which adjtime would use double dco");
  30. static char *firmware;
  31. module_param(firmware, charp, 0);
  32. static inline int idt82p33_read(struct idt82p33 *idt82p33, u16 regaddr,
  33. u8 *buf, u16 count)
  34. {
  35. return regmap_bulk_read(idt82p33->regmap, regaddr, buf, count);
  36. }
  37. static inline int idt82p33_write(struct idt82p33 *idt82p33, u16 regaddr,
  38. u8 *buf, u16 count)
  39. {
  40. return regmap_bulk_write(idt82p33->regmap, regaddr, buf, count);
  41. }
  42. static void idt82p33_byte_array_to_timespec(struct timespec64 *ts,
  43. u8 buf[TOD_BYTE_COUNT])
  44. {
  45. time64_t sec;
  46. s32 nsec;
  47. u8 i;
  48. nsec = buf[3];
  49. for (i = 0; i < 3; i++) {
  50. nsec <<= 8;
  51. nsec |= buf[2 - i];
  52. }
  53. sec = buf[9];
  54. for (i = 0; i < 5; i++) {
  55. sec <<= 8;
  56. sec |= buf[8 - i];
  57. }
  58. ts->tv_sec = sec;
  59. ts->tv_nsec = nsec;
  60. }
  61. static void idt82p33_timespec_to_byte_array(struct timespec64 const *ts,
  62. u8 buf[TOD_BYTE_COUNT])
  63. {
  64. time64_t sec;
  65. s32 nsec;
  66. u8 i;
  67. nsec = ts->tv_nsec;
  68. sec = ts->tv_sec;
  69. for (i = 0; i < 4; i++) {
  70. buf[i] = nsec & 0xff;
  71. nsec >>= 8;
  72. }
  73. for (i = 4; i < TOD_BYTE_COUNT; i++) {
  74. buf[i] = sec & 0xff;
  75. sec >>= 8;
  76. }
  77. }
  78. static int idt82p33_dpll_set_mode(struct idt82p33_channel *channel,
  79. enum pll_mode mode)
  80. {
  81. struct idt82p33 *idt82p33 = channel->idt82p33;
  82. u8 dpll_mode;
  83. int err;
  84. if (channel->pll_mode == mode)
  85. return 0;
  86. err = idt82p33_read(idt82p33, channel->dpll_mode_cnfg,
  87. &dpll_mode, sizeof(dpll_mode));
  88. if (err)
  89. return err;
  90. dpll_mode &= ~(PLL_MODE_MASK << PLL_MODE_SHIFT);
  91. dpll_mode |= (mode << PLL_MODE_SHIFT);
  92. err = idt82p33_write(idt82p33, channel->dpll_mode_cnfg,
  93. &dpll_mode, sizeof(dpll_mode));
  94. if (err)
  95. return err;
  96. channel->pll_mode = mode;
  97. return 0;
  98. }
  99. static int _idt82p33_gettime(struct idt82p33_channel *channel,
  100. struct timespec64 *ts)
  101. {
  102. struct idt82p33 *idt82p33 = channel->idt82p33;
  103. u8 buf[TOD_BYTE_COUNT];
  104. u8 trigger;
  105. int err;
  106. trigger = TOD_TRIGGER(HW_TOD_WR_TRIG_SEL_MSB_TOD_CNFG,
  107. HW_TOD_RD_TRIG_SEL_LSB_TOD_STS);
  108. err = idt82p33_write(idt82p33, channel->dpll_tod_trigger,
  109. &trigger, sizeof(trigger));
  110. if (err)
  111. return err;
  112. if (idt82p33->calculate_overhead_flag)
  113. idt82p33->start_time = ktime_get_raw();
  114. err = idt82p33_read(idt82p33, channel->dpll_tod_sts, buf, sizeof(buf));
  115. if (err)
  116. return err;
  117. idt82p33_byte_array_to_timespec(ts, buf);
  118. return 0;
  119. }
  120. /*
  121. * TOD Trigger:
  122. * Bits[7:4] Write 0x9, MSB write
  123. * Bits[3:0] Read 0x9, LSB read
  124. */
  125. static int _idt82p33_settime(struct idt82p33_channel *channel,
  126. struct timespec64 const *ts)
  127. {
  128. struct idt82p33 *idt82p33 = channel->idt82p33;
  129. struct timespec64 local_ts = *ts;
  130. char buf[TOD_BYTE_COUNT];
  131. s64 dynamic_overhead_ns;
  132. unsigned char trigger;
  133. int err;
  134. u8 i;
  135. trigger = TOD_TRIGGER(HW_TOD_WR_TRIG_SEL_MSB_TOD_CNFG,
  136. HW_TOD_RD_TRIG_SEL_LSB_TOD_STS);
  137. err = idt82p33_write(idt82p33, channel->dpll_tod_trigger,
  138. &trigger, sizeof(trigger));
  139. if (err)
  140. return err;
  141. if (idt82p33->calculate_overhead_flag) {
  142. dynamic_overhead_ns = ktime_to_ns(ktime_get_raw())
  143. - ktime_to_ns(idt82p33->start_time);
  144. timespec64_add_ns(&local_ts, dynamic_overhead_ns);
  145. idt82p33->calculate_overhead_flag = 0;
  146. }
  147. idt82p33_timespec_to_byte_array(&local_ts, buf);
  148. /*
  149. * Store the new time value.
  150. */
  151. for (i = 0; i < TOD_BYTE_COUNT; i++) {
  152. err = idt82p33_write(idt82p33, channel->dpll_tod_cnfg + i,
  153. &buf[i], sizeof(buf[i]));
  154. if (err)
  155. return err;
  156. }
  157. return err;
  158. }
  159. static int _idt82p33_adjtime(struct idt82p33_channel *channel, s64 delta_ns)
  160. {
  161. struct idt82p33 *idt82p33 = channel->idt82p33;
  162. struct timespec64 ts;
  163. s64 now_ns;
  164. int err;
  165. idt82p33->calculate_overhead_flag = 1;
  166. err = _idt82p33_gettime(channel, &ts);
  167. if (err)
  168. return err;
  169. now_ns = timespec64_to_ns(&ts);
  170. now_ns += delta_ns + idt82p33->tod_write_overhead_ns;
  171. ts = ns_to_timespec64(now_ns);
  172. err = _idt82p33_settime(channel, &ts);
  173. return err;
  174. }
  175. static int _idt82p33_adjfine(struct idt82p33_channel *channel, long scaled_ppm)
  176. {
  177. struct idt82p33 *idt82p33 = channel->idt82p33;
  178. unsigned char buf[5] = {0};
  179. int err, i;
  180. s64 fcw;
  181. if (scaled_ppm == channel->current_freq_ppb)
  182. return 0;
  183. /*
  184. * Frequency Control Word unit is: 1.68 * 10^-10 ppm
  185. *
  186. * adjfreq:
  187. * ppb * 10^9
  188. * FCW = ----------
  189. * 168
  190. *
  191. * adjfine:
  192. * scaled_ppm * 5^12
  193. * FCW = -------------
  194. * 168 * 2^4
  195. */
  196. fcw = scaled_ppm * 244140625ULL;
  197. fcw = div_s64(fcw, 2688);
  198. for (i = 0; i < 5; i++) {
  199. buf[i] = fcw & 0xff;
  200. fcw >>= 8;
  201. }
  202. err = idt82p33_dpll_set_mode(channel, PLL_MODE_DCO);
  203. if (err)
  204. return err;
  205. err = idt82p33_write(idt82p33, channel->dpll_freq_cnfg,
  206. buf, sizeof(buf));
  207. if (err == 0)
  208. channel->current_freq_ppb = scaled_ppm;
  209. return err;
  210. }
  211. static int idt82p33_measure_one_byte_write_overhead(
  212. struct idt82p33_channel *channel, s64 *overhead_ns)
  213. {
  214. struct idt82p33 *idt82p33 = channel->idt82p33;
  215. ktime_t start, stop;
  216. s64 total_ns;
  217. u8 trigger;
  218. int err;
  219. u8 i;
  220. total_ns = 0;
  221. *overhead_ns = 0;
  222. trigger = TOD_TRIGGER(HW_TOD_WR_TRIG_SEL_MSB_TOD_CNFG,
  223. HW_TOD_RD_TRIG_SEL_LSB_TOD_STS);
  224. for (i = 0; i < MAX_MEASURMENT_COUNT; i++) {
  225. start = ktime_get_raw();
  226. err = idt82p33_write(idt82p33, channel->dpll_tod_trigger,
  227. &trigger, sizeof(trigger));
  228. stop = ktime_get_raw();
  229. if (err)
  230. return err;
  231. total_ns += ktime_to_ns(stop) - ktime_to_ns(start);
  232. }
  233. *overhead_ns = div_s64(total_ns, MAX_MEASURMENT_COUNT);
  234. return err;
  235. }
  236. static int idt82p33_measure_tod_write_9_byte_overhead(
  237. struct idt82p33_channel *channel)
  238. {
  239. struct idt82p33 *idt82p33 = channel->idt82p33;
  240. u8 buf[TOD_BYTE_COUNT];
  241. ktime_t start, stop;
  242. s64 total_ns;
  243. int err = 0;
  244. u8 i, j;
  245. total_ns = 0;
  246. idt82p33->tod_write_overhead_ns = 0;
  247. for (i = 0; i < MAX_MEASURMENT_COUNT; i++) {
  248. start = ktime_get_raw();
  249. /* Need one less byte for applicable overhead */
  250. for (j = 0; j < (TOD_BYTE_COUNT - 1); j++) {
  251. err = idt82p33_write(idt82p33,
  252. channel->dpll_tod_cnfg + i,
  253. &buf[i], sizeof(buf[i]));
  254. if (err)
  255. return err;
  256. }
  257. stop = ktime_get_raw();
  258. total_ns += ktime_to_ns(stop) - ktime_to_ns(start);
  259. }
  260. idt82p33->tod_write_overhead_ns = div_s64(total_ns,
  261. MAX_MEASURMENT_COUNT);
  262. return err;
  263. }
  264. static int idt82p33_measure_settime_gettime_gap_overhead(
  265. struct idt82p33_channel *channel, s64 *overhead_ns)
  266. {
  267. struct timespec64 ts1 = {0, 0};
  268. struct timespec64 ts2;
  269. int err;
  270. *overhead_ns = 0;
  271. err = _idt82p33_settime(channel, &ts1);
  272. if (err)
  273. return err;
  274. err = _idt82p33_gettime(channel, &ts2);
  275. if (!err)
  276. *overhead_ns = timespec64_to_ns(&ts2) - timespec64_to_ns(&ts1);
  277. return err;
  278. }
  279. static int idt82p33_measure_tod_write_overhead(struct idt82p33_channel *channel)
  280. {
  281. s64 trailing_overhead_ns, one_byte_write_ns, gap_ns;
  282. struct idt82p33 *idt82p33 = channel->idt82p33;
  283. int err;
  284. idt82p33->tod_write_overhead_ns = 0;
  285. err = idt82p33_measure_settime_gettime_gap_overhead(channel, &gap_ns);
  286. if (err) {
  287. dev_err(idt82p33->dev,
  288. "Failed in %s with err %d!\n", __func__, err);
  289. return err;
  290. }
  291. err = idt82p33_measure_one_byte_write_overhead(channel,
  292. &one_byte_write_ns);
  293. if (err)
  294. return err;
  295. err = idt82p33_measure_tod_write_9_byte_overhead(channel);
  296. if (err)
  297. return err;
  298. trailing_overhead_ns = gap_ns - (2 * one_byte_write_ns);
  299. idt82p33->tod_write_overhead_ns -= trailing_overhead_ns;
  300. return err;
  301. }
  302. static int idt82p33_check_and_set_masks(struct idt82p33 *idt82p33,
  303. u8 page,
  304. u8 offset,
  305. u8 val)
  306. {
  307. int err = 0;
  308. if (page == PLLMASK_ADDR_HI && offset == PLLMASK_ADDR_LO) {
  309. if ((val & 0xfc) || !(val & 0x3)) {
  310. dev_err(idt82p33->dev,
  311. "Invalid PLL mask 0x%x\n", val);
  312. err = -EINVAL;
  313. } else {
  314. idt82p33->pll_mask = val;
  315. }
  316. } else if (page == PLL0_OUTMASK_ADDR_HI &&
  317. offset == PLL0_OUTMASK_ADDR_LO) {
  318. idt82p33->channel[0].output_mask = val;
  319. } else if (page == PLL1_OUTMASK_ADDR_HI &&
  320. offset == PLL1_OUTMASK_ADDR_LO) {
  321. idt82p33->channel[1].output_mask = val;
  322. }
  323. return err;
  324. }
  325. static void idt82p33_display_masks(struct idt82p33 *idt82p33)
  326. {
  327. u8 mask, i;
  328. dev_info(idt82p33->dev,
  329. "pllmask = 0x%02x\n", idt82p33->pll_mask);
  330. for (i = 0; i < MAX_PHC_PLL; i++) {
  331. mask = 1 << i;
  332. if (mask & idt82p33->pll_mask)
  333. dev_info(idt82p33->dev,
  334. "PLL%d output_mask = 0x%04x\n",
  335. i, idt82p33->channel[i].output_mask);
  336. }
  337. }
  338. static int idt82p33_sync_tod(struct idt82p33_channel *channel, bool enable)
  339. {
  340. struct idt82p33 *idt82p33 = channel->idt82p33;
  341. u8 sync_cnfg;
  342. int err;
  343. err = idt82p33_read(idt82p33, channel->dpll_sync_cnfg,
  344. &sync_cnfg, sizeof(sync_cnfg));
  345. if (err)
  346. return err;
  347. sync_cnfg &= ~SYNC_TOD;
  348. if (enable)
  349. sync_cnfg |= SYNC_TOD;
  350. return idt82p33_write(idt82p33, channel->dpll_sync_cnfg,
  351. &sync_cnfg, sizeof(sync_cnfg));
  352. }
  353. static int idt82p33_output_enable(struct idt82p33_channel *channel,
  354. bool enable, unsigned int outn)
  355. {
  356. struct idt82p33 *idt82p33 = channel->idt82p33;
  357. int err;
  358. u8 val;
  359. err = idt82p33_read(idt82p33, OUT_MUX_CNFG(outn), &val, sizeof(val));
  360. if (err)
  361. return err;
  362. if (enable)
  363. val &= ~SQUELCH_ENABLE;
  364. else
  365. val |= SQUELCH_ENABLE;
  366. return idt82p33_write(idt82p33, OUT_MUX_CNFG(outn), &val, sizeof(val));
  367. }
  368. static int idt82p33_output_mask_enable(struct idt82p33_channel *channel,
  369. bool enable)
  370. {
  371. u16 mask;
  372. int err;
  373. u8 outn;
  374. mask = channel->output_mask;
  375. outn = 0;
  376. while (mask) {
  377. if (mask & 0x1) {
  378. err = idt82p33_output_enable(channel, enable, outn);
  379. if (err)
  380. return err;
  381. }
  382. mask >>= 0x1;
  383. outn++;
  384. }
  385. return 0;
  386. }
  387. static int idt82p33_perout_enable(struct idt82p33_channel *channel,
  388. bool enable,
  389. struct ptp_perout_request *perout)
  390. {
  391. unsigned int flags = perout->flags;
  392. /* Enable/disable output based on output_mask */
  393. if (flags == PEROUT_ENABLE_OUTPUT_MASK)
  394. return idt82p33_output_mask_enable(channel, enable);
  395. /* Enable/disable individual output instead */
  396. return idt82p33_output_enable(channel, enable, perout->index);
  397. }
  398. static int idt82p33_enable_tod(struct idt82p33_channel *channel)
  399. {
  400. struct idt82p33 *idt82p33 = channel->idt82p33;
  401. struct timespec64 ts = {0, 0};
  402. int err;
  403. err = idt82p33_measure_tod_write_overhead(channel);
  404. if (err) {
  405. dev_err(idt82p33->dev,
  406. "Failed in %s with err %d!\n", __func__, err);
  407. return err;
  408. }
  409. err = _idt82p33_settime(channel, &ts);
  410. if (err)
  411. return err;
  412. return idt82p33_sync_tod(channel, true);
  413. }
  414. static void idt82p33_ptp_clock_unregister_all(struct idt82p33 *idt82p33)
  415. {
  416. struct idt82p33_channel *channel;
  417. u8 i;
  418. for (i = 0; i < MAX_PHC_PLL; i++) {
  419. channel = &idt82p33->channel[i];
  420. if (channel->ptp_clock)
  421. ptp_clock_unregister(channel->ptp_clock);
  422. }
  423. }
  424. static int idt82p33_enable(struct ptp_clock_info *ptp,
  425. struct ptp_clock_request *rq, int on)
  426. {
  427. struct idt82p33_channel *channel =
  428. container_of(ptp, struct idt82p33_channel, caps);
  429. struct idt82p33 *idt82p33 = channel->idt82p33;
  430. int err = -EOPNOTSUPP;
  431. mutex_lock(idt82p33->lock);
  432. if (rq->type == PTP_CLK_REQ_PEROUT) {
  433. if (!on)
  434. err = idt82p33_perout_enable(channel, false,
  435. &rq->perout);
  436. /* Only accept a 1-PPS aligned to the second. */
  437. else if (rq->perout.start.nsec || rq->perout.period.sec != 1 ||
  438. rq->perout.period.nsec)
  439. err = -ERANGE;
  440. else
  441. err = idt82p33_perout_enable(channel, true,
  442. &rq->perout);
  443. }
  444. mutex_unlock(idt82p33->lock);
  445. if (err)
  446. dev_err(idt82p33->dev,
  447. "Failed in %s with err %d!\n", __func__, err);
  448. return err;
  449. }
  450. static int idt82p33_adjwritephase(struct ptp_clock_info *ptp, s32 offset_ns)
  451. {
  452. struct idt82p33_channel *channel =
  453. container_of(ptp, struct idt82p33_channel, caps);
  454. struct idt82p33 *idt82p33 = channel->idt82p33;
  455. s64 offset_regval, offset_fs;
  456. u8 val[4] = {0};
  457. int err;
  458. offset_fs = (s64)(-offset_ns) * 1000000;
  459. if (offset_fs > WRITE_PHASE_OFFSET_LIMIT)
  460. offset_fs = WRITE_PHASE_OFFSET_LIMIT;
  461. else if (offset_fs < -WRITE_PHASE_OFFSET_LIMIT)
  462. offset_fs = -WRITE_PHASE_OFFSET_LIMIT;
  463. /* Convert from phaseoffset_fs to register value */
  464. offset_regval = div_s64(offset_fs * 1000, IDT_T0DPLL_PHASE_RESOL);
  465. val[0] = offset_regval & 0xFF;
  466. val[1] = (offset_regval >> 8) & 0xFF;
  467. val[2] = (offset_regval >> 16) & 0xFF;
  468. val[3] = (offset_regval >> 24) & 0x1F;
  469. val[3] |= PH_OFFSET_EN;
  470. mutex_lock(idt82p33->lock);
  471. err = idt82p33_dpll_set_mode(channel, PLL_MODE_WPH);
  472. if (err) {
  473. dev_err(idt82p33->dev,
  474. "Failed in %s with err %d!\n", __func__, err);
  475. goto out;
  476. }
  477. err = idt82p33_write(idt82p33, channel->dpll_phase_cnfg, val,
  478. sizeof(val));
  479. out:
  480. mutex_unlock(idt82p33->lock);
  481. return err;
  482. }
  483. static int idt82p33_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
  484. {
  485. struct idt82p33_channel *channel =
  486. container_of(ptp, struct idt82p33_channel, caps);
  487. struct idt82p33 *idt82p33 = channel->idt82p33;
  488. int err;
  489. mutex_lock(idt82p33->lock);
  490. err = _idt82p33_adjfine(channel, scaled_ppm);
  491. mutex_unlock(idt82p33->lock);
  492. if (err)
  493. dev_err(idt82p33->dev,
  494. "Failed in %s with err %d!\n", __func__, err);
  495. return err;
  496. }
  497. static int idt82p33_adjtime(struct ptp_clock_info *ptp, s64 delta_ns)
  498. {
  499. struct idt82p33_channel *channel =
  500. container_of(ptp, struct idt82p33_channel, caps);
  501. struct idt82p33 *idt82p33 = channel->idt82p33;
  502. int err;
  503. mutex_lock(idt82p33->lock);
  504. if (abs(delta_ns) < phase_snap_threshold) {
  505. mutex_unlock(idt82p33->lock);
  506. return 0;
  507. }
  508. err = _idt82p33_adjtime(channel, delta_ns);
  509. mutex_unlock(idt82p33->lock);
  510. if (err)
  511. dev_err(idt82p33->dev,
  512. "Failed in %s with err %d!\n", __func__, err);
  513. return err;
  514. }
  515. static int idt82p33_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts)
  516. {
  517. struct idt82p33_channel *channel =
  518. container_of(ptp, struct idt82p33_channel, caps);
  519. struct idt82p33 *idt82p33 = channel->idt82p33;
  520. int err;
  521. mutex_lock(idt82p33->lock);
  522. err = _idt82p33_gettime(channel, ts);
  523. mutex_unlock(idt82p33->lock);
  524. if (err)
  525. dev_err(idt82p33->dev,
  526. "Failed in %s with err %d!\n", __func__, err);
  527. return err;
  528. }
  529. static int idt82p33_settime(struct ptp_clock_info *ptp,
  530. const struct timespec64 *ts)
  531. {
  532. struct idt82p33_channel *channel =
  533. container_of(ptp, struct idt82p33_channel, caps);
  534. struct idt82p33 *idt82p33 = channel->idt82p33;
  535. int err;
  536. mutex_lock(idt82p33->lock);
  537. err = _idt82p33_settime(channel, ts);
  538. mutex_unlock(idt82p33->lock);
  539. if (err)
  540. dev_err(idt82p33->dev,
  541. "Failed in %s with err %d!\n", __func__, err);
  542. return err;
  543. }
  544. static int idt82p33_channel_init(struct idt82p33_channel *channel, int index)
  545. {
  546. switch (index) {
  547. case 0:
  548. channel->dpll_tod_cnfg = DPLL1_TOD_CNFG;
  549. channel->dpll_tod_trigger = DPLL1_TOD_TRIGGER;
  550. channel->dpll_tod_sts = DPLL1_TOD_STS;
  551. channel->dpll_mode_cnfg = DPLL1_OPERATING_MODE_CNFG;
  552. channel->dpll_freq_cnfg = DPLL1_HOLDOVER_FREQ_CNFG;
  553. channel->dpll_phase_cnfg = DPLL1_PHASE_OFFSET_CNFG;
  554. channel->dpll_sync_cnfg = DPLL1_SYNC_EDGE_CNFG;
  555. channel->dpll_input_mode_cnfg = DPLL1_INPUT_MODE_CNFG;
  556. break;
  557. case 1:
  558. channel->dpll_tod_cnfg = DPLL2_TOD_CNFG;
  559. channel->dpll_tod_trigger = DPLL2_TOD_TRIGGER;
  560. channel->dpll_tod_sts = DPLL2_TOD_STS;
  561. channel->dpll_mode_cnfg = DPLL2_OPERATING_MODE_CNFG;
  562. channel->dpll_freq_cnfg = DPLL2_HOLDOVER_FREQ_CNFG;
  563. channel->dpll_phase_cnfg = DPLL2_PHASE_OFFSET_CNFG;
  564. channel->dpll_sync_cnfg = DPLL2_SYNC_EDGE_CNFG;
  565. channel->dpll_input_mode_cnfg = DPLL2_INPUT_MODE_CNFG;
  566. break;
  567. default:
  568. return -EINVAL;
  569. }
  570. channel->current_freq_ppb = 0;
  571. return 0;
  572. }
  573. static void idt82p33_caps_init(struct ptp_clock_info *caps)
  574. {
  575. caps->owner = THIS_MODULE;
  576. caps->max_adj = DCO_MAX_PPB;
  577. caps->n_per_out = 11;
  578. caps->adjphase = idt82p33_adjwritephase;
  579. caps->adjfine = idt82p33_adjfine;
  580. caps->adjtime = idt82p33_adjtime;
  581. caps->gettime64 = idt82p33_gettime;
  582. caps->settime64 = idt82p33_settime;
  583. caps->enable = idt82p33_enable;
  584. }
  585. static int idt82p33_enable_channel(struct idt82p33 *idt82p33, u32 index)
  586. {
  587. struct idt82p33_channel *channel;
  588. int err;
  589. if (!(index < MAX_PHC_PLL))
  590. return -EINVAL;
  591. channel = &idt82p33->channel[index];
  592. err = idt82p33_channel_init(channel, index);
  593. if (err) {
  594. dev_err(idt82p33->dev,
  595. "Channel_init failed in %s with err %d!\n",
  596. __func__, err);
  597. return err;
  598. }
  599. channel->idt82p33 = idt82p33;
  600. idt82p33_caps_init(&channel->caps);
  601. snprintf(channel->caps.name, sizeof(channel->caps.name),
  602. "IDT 82P33 PLL%u", index);
  603. channel->ptp_clock = ptp_clock_register(&channel->caps, NULL);
  604. if (IS_ERR(channel->ptp_clock)) {
  605. err = PTR_ERR(channel->ptp_clock);
  606. channel->ptp_clock = NULL;
  607. return err;
  608. }
  609. if (!channel->ptp_clock)
  610. return -ENOTSUPP;
  611. err = idt82p33_dpll_set_mode(channel, PLL_MODE_DCO);
  612. if (err) {
  613. dev_err(idt82p33->dev,
  614. "Dpll_set_mode failed in %s with err %d!\n",
  615. __func__, err);
  616. return err;
  617. }
  618. err = idt82p33_enable_tod(channel);
  619. if (err) {
  620. dev_err(idt82p33->dev,
  621. "Enable_tod failed in %s with err %d!\n",
  622. __func__, err);
  623. return err;
  624. }
  625. dev_info(idt82p33->dev, "PLL%d registered as ptp%d\n",
  626. index, channel->ptp_clock->index);
  627. return 0;
  628. }
  629. static int idt82p33_load_firmware(struct idt82p33 *idt82p33)
  630. {
  631. const struct firmware *fw;
  632. struct idt82p33_fwrc *rec;
  633. u8 loaddr, page, val;
  634. int err;
  635. s32 len;
  636. dev_dbg(idt82p33->dev, "requesting firmware '%s'\n", FW_FILENAME);
  637. err = request_firmware(&fw, FW_FILENAME, idt82p33->dev);
  638. if (err) {
  639. dev_err(idt82p33->dev,
  640. "Failed in %s with err %d!\n", __func__, err);
  641. return err;
  642. }
  643. dev_dbg(idt82p33->dev, "firmware size %zu bytes\n", fw->size);
  644. rec = (struct idt82p33_fwrc *) fw->data;
  645. for (len = fw->size; len > 0; len -= sizeof(*rec)) {
  646. if (rec->reserved) {
  647. dev_err(idt82p33->dev,
  648. "bad firmware, reserved field non-zero\n");
  649. err = -EINVAL;
  650. } else {
  651. val = rec->value;
  652. loaddr = rec->loaddr;
  653. page = rec->hiaddr;
  654. rec++;
  655. err = idt82p33_check_and_set_masks(idt82p33, page,
  656. loaddr, val);
  657. }
  658. if (err == 0) {
  659. /* Page size 128, last 4 bytes of page skipped */
  660. if (loaddr > 0x7b)
  661. continue;
  662. err = idt82p33_write(idt82p33, REG_ADDR(page, loaddr),
  663. &val, sizeof(val));
  664. }
  665. if (err)
  666. goto out;
  667. }
  668. idt82p33_display_masks(idt82p33);
  669. out:
  670. release_firmware(fw);
  671. return err;
  672. }
  673. static int idt82p33_probe(struct platform_device *pdev)
  674. {
  675. struct rsmu_ddata *ddata = dev_get_drvdata(pdev->dev.parent);
  676. struct idt82p33 *idt82p33;
  677. int err;
  678. u8 i;
  679. idt82p33 = devm_kzalloc(&pdev->dev,
  680. sizeof(struct idt82p33), GFP_KERNEL);
  681. if (!idt82p33)
  682. return -ENOMEM;
  683. idt82p33->dev = &pdev->dev;
  684. idt82p33->mfd = pdev->dev.parent;
  685. idt82p33->lock = &ddata->lock;
  686. idt82p33->regmap = ddata->regmap;
  687. idt82p33->tod_write_overhead_ns = 0;
  688. idt82p33->calculate_overhead_flag = 0;
  689. idt82p33->pll_mask = DEFAULT_PLL_MASK;
  690. idt82p33->channel[0].output_mask = DEFAULT_OUTPUT_MASK_PLL0;
  691. idt82p33->channel[1].output_mask = DEFAULT_OUTPUT_MASK_PLL1;
  692. mutex_lock(idt82p33->lock);
  693. err = idt82p33_load_firmware(idt82p33);
  694. if (err)
  695. dev_warn(idt82p33->dev,
  696. "loading firmware failed with %d\n", err);
  697. if (idt82p33->pll_mask) {
  698. for (i = 0; i < MAX_PHC_PLL; i++) {
  699. if (idt82p33->pll_mask & (1 << i)) {
  700. err = idt82p33_enable_channel(idt82p33, i);
  701. if (err) {
  702. dev_err(idt82p33->dev,
  703. "Failed in %s with err %d!\n",
  704. __func__, err);
  705. break;
  706. }
  707. }
  708. }
  709. } else {
  710. dev_err(idt82p33->dev,
  711. "no PLLs flagged as PHCs, nothing to do\n");
  712. err = -ENODEV;
  713. }
  714. mutex_unlock(idt82p33->lock);
  715. if (err) {
  716. idt82p33_ptp_clock_unregister_all(idt82p33);
  717. return err;
  718. }
  719. platform_set_drvdata(pdev, idt82p33);
  720. return 0;
  721. }
  722. static int idt82p33_remove(struct platform_device *pdev)
  723. {
  724. struct idt82p33 *idt82p33 = platform_get_drvdata(pdev);
  725. idt82p33_ptp_clock_unregister_all(idt82p33);
  726. return 0;
  727. }
  728. static struct platform_driver idt82p33_driver = {
  729. .driver = {
  730. .name = "82p33x1x-phc",
  731. },
  732. .probe = idt82p33_probe,
  733. .remove = idt82p33_remove,
  734. };
  735. module_platform_driver(idt82p33_driver);