ptp_qoriq.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * PTP 1588 clock for Freescale QorIQ 1588 timer
  4. *
  5. * Copyright (C) 2010 OMICRON electronics GmbH
  6. */
  7. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  8. #include <linux/device.h>
  9. #include <linux/hrtimer.h>
  10. #include <linux/kernel.h>
  11. #include <linux/module.h>
  12. #include <linux/of.h>
  13. #include <linux/platform_device.h>
  14. #include <linux/timex.h>
  15. #include <linux/slab.h>
  16. #include <linux/clk.h>
  17. #include <linux/fsl/ptp_qoriq.h>
  18. /*
  19. * Register access functions
  20. */
  21. /* Caller must hold ptp_qoriq->lock. */
  22. static u64 tmr_cnt_read(struct ptp_qoriq *ptp_qoriq)
  23. {
  24. struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
  25. u64 ns;
  26. u32 lo, hi;
  27. lo = ptp_qoriq->read(&regs->ctrl_regs->tmr_cnt_l);
  28. hi = ptp_qoriq->read(&regs->ctrl_regs->tmr_cnt_h);
  29. ns = ((u64) hi) << 32;
  30. ns |= lo;
  31. return ns;
  32. }
  33. /* Caller must hold ptp_qoriq->lock. */
  34. static void tmr_cnt_write(struct ptp_qoriq *ptp_qoriq, u64 ns)
  35. {
  36. struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
  37. u32 hi = ns >> 32;
  38. u32 lo = ns & 0xffffffff;
  39. ptp_qoriq->write(&regs->ctrl_regs->tmr_cnt_l, lo);
  40. ptp_qoriq->write(&regs->ctrl_regs->tmr_cnt_h, hi);
  41. }
  42. static u64 tmr_offset_read(struct ptp_qoriq *ptp_qoriq)
  43. {
  44. struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
  45. u32 lo, hi;
  46. u64 ns;
  47. lo = ptp_qoriq->read(&regs->ctrl_regs->tmroff_l);
  48. hi = ptp_qoriq->read(&regs->ctrl_regs->tmroff_h);
  49. ns = ((u64) hi) << 32;
  50. ns |= lo;
  51. return ns;
  52. }
  53. static void tmr_offset_write(struct ptp_qoriq *ptp_qoriq, u64 delta_ns)
  54. {
  55. struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
  56. u32 lo = delta_ns & 0xffffffff;
  57. u32 hi = delta_ns >> 32;
  58. ptp_qoriq->write(&regs->ctrl_regs->tmroff_l, lo);
  59. ptp_qoriq->write(&regs->ctrl_regs->tmroff_h, hi);
  60. }
  61. /* Caller must hold ptp_qoriq->lock. */
  62. static void set_alarm(struct ptp_qoriq *ptp_qoriq)
  63. {
  64. struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
  65. u64 ns;
  66. u32 lo, hi;
  67. ns = tmr_cnt_read(ptp_qoriq) + tmr_offset_read(ptp_qoriq)
  68. + 1500000000ULL;
  69. ns = div_u64(ns, 1000000000UL) * 1000000000ULL;
  70. ns -= ptp_qoriq->tclk_period;
  71. hi = ns >> 32;
  72. lo = ns & 0xffffffff;
  73. ptp_qoriq->write(&regs->alarm_regs->tmr_alarm1_l, lo);
  74. ptp_qoriq->write(&regs->alarm_regs->tmr_alarm1_h, hi);
  75. }
  76. /* Caller must hold ptp_qoriq->lock. */
  77. static void set_fipers(struct ptp_qoriq *ptp_qoriq)
  78. {
  79. struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
  80. set_alarm(ptp_qoriq);
  81. ptp_qoriq->write(&regs->fiper_regs->tmr_fiper1, ptp_qoriq->tmr_fiper1);
  82. ptp_qoriq->write(&regs->fiper_regs->tmr_fiper2, ptp_qoriq->tmr_fiper2);
  83. if (ptp_qoriq->fiper3_support)
  84. ptp_qoriq->write(&regs->fiper_regs->tmr_fiper3,
  85. ptp_qoriq->tmr_fiper3);
  86. }
  87. int extts_clean_up(struct ptp_qoriq *ptp_qoriq, int index, bool update_event)
  88. {
  89. struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
  90. struct ptp_clock_event event;
  91. void __iomem *reg_etts_l;
  92. void __iomem *reg_etts_h;
  93. u32 valid, lo, hi;
  94. switch (index) {
  95. case 0:
  96. valid = ETS1_VLD;
  97. reg_etts_l = &regs->etts_regs->tmr_etts1_l;
  98. reg_etts_h = &regs->etts_regs->tmr_etts1_h;
  99. break;
  100. case 1:
  101. valid = ETS2_VLD;
  102. reg_etts_l = &regs->etts_regs->tmr_etts2_l;
  103. reg_etts_h = &regs->etts_regs->tmr_etts2_h;
  104. break;
  105. default:
  106. return -EINVAL;
  107. }
  108. event.type = PTP_CLOCK_EXTTS;
  109. event.index = index;
  110. if (ptp_qoriq->extts_fifo_support)
  111. if (!(ptp_qoriq->read(&regs->ctrl_regs->tmr_stat) & valid))
  112. return 0;
  113. do {
  114. lo = ptp_qoriq->read(reg_etts_l);
  115. hi = ptp_qoriq->read(reg_etts_h);
  116. if (update_event) {
  117. event.timestamp = ((u64) hi) << 32;
  118. event.timestamp |= lo;
  119. ptp_clock_event(ptp_qoriq->clock, &event);
  120. }
  121. if (!ptp_qoriq->extts_fifo_support)
  122. break;
  123. } while (ptp_qoriq->read(&regs->ctrl_regs->tmr_stat) & valid);
  124. return 0;
  125. }
  126. EXPORT_SYMBOL_GPL(extts_clean_up);
  127. /*
  128. * Interrupt service routine
  129. */
  130. irqreturn_t ptp_qoriq_isr(int irq, void *priv)
  131. {
  132. struct ptp_qoriq *ptp_qoriq = priv;
  133. struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
  134. struct ptp_clock_event event;
  135. u32 ack = 0, mask, val, irqs;
  136. spin_lock(&ptp_qoriq->lock);
  137. val = ptp_qoriq->read(&regs->ctrl_regs->tmr_tevent);
  138. mask = ptp_qoriq->read(&regs->ctrl_regs->tmr_temask);
  139. spin_unlock(&ptp_qoriq->lock);
  140. irqs = val & mask;
  141. if (irqs & ETS1) {
  142. ack |= ETS1;
  143. extts_clean_up(ptp_qoriq, 0, true);
  144. }
  145. if (irqs & ETS2) {
  146. ack |= ETS2;
  147. extts_clean_up(ptp_qoriq, 1, true);
  148. }
  149. if (irqs & PP1) {
  150. ack |= PP1;
  151. event.type = PTP_CLOCK_PPS;
  152. ptp_clock_event(ptp_qoriq->clock, &event);
  153. }
  154. if (ack) {
  155. ptp_qoriq->write(&regs->ctrl_regs->tmr_tevent, ack);
  156. return IRQ_HANDLED;
  157. } else
  158. return IRQ_NONE;
  159. }
  160. EXPORT_SYMBOL_GPL(ptp_qoriq_isr);
  161. /*
  162. * PTP clock operations
  163. */
  164. int ptp_qoriq_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
  165. {
  166. u64 adj, diff;
  167. u32 tmr_add;
  168. int neg_adj = 0;
  169. struct ptp_qoriq *ptp_qoriq = container_of(ptp, struct ptp_qoriq, caps);
  170. struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
  171. if (scaled_ppm < 0) {
  172. neg_adj = 1;
  173. scaled_ppm = -scaled_ppm;
  174. }
  175. tmr_add = ptp_qoriq->tmr_add;
  176. adj = tmr_add;
  177. /*
  178. * Calculate diff and round() to the nearest integer
  179. *
  180. * diff = adj * (ppb / 1000000000)
  181. * = adj * scaled_ppm / 65536000000
  182. */
  183. diff = mul_u64_u64_div_u64(adj, scaled_ppm, 32768000000);
  184. diff = DIV64_U64_ROUND_UP(diff, 2);
  185. tmr_add = neg_adj ? tmr_add - diff : tmr_add + diff;
  186. ptp_qoriq->write(&regs->ctrl_regs->tmr_add, tmr_add);
  187. return 0;
  188. }
  189. EXPORT_SYMBOL_GPL(ptp_qoriq_adjfine);
  190. int ptp_qoriq_adjtime(struct ptp_clock_info *ptp, s64 delta)
  191. {
  192. struct ptp_qoriq *ptp_qoriq = container_of(ptp, struct ptp_qoriq, caps);
  193. s64 now, curr_delta;
  194. unsigned long flags;
  195. spin_lock_irqsave(&ptp_qoriq->lock, flags);
  196. /* On LS1021A, eTSEC2 and eTSEC3 do not take into account the TMR_OFF
  197. * adjustment
  198. */
  199. if (ptp_qoriq->etsec) {
  200. now = tmr_cnt_read(ptp_qoriq);
  201. now += delta;
  202. tmr_cnt_write(ptp_qoriq, now);
  203. } else {
  204. curr_delta = tmr_offset_read(ptp_qoriq);
  205. curr_delta += delta;
  206. tmr_offset_write(ptp_qoriq, curr_delta);
  207. }
  208. set_fipers(ptp_qoriq);
  209. spin_unlock_irqrestore(&ptp_qoriq->lock, flags);
  210. return 0;
  211. }
  212. EXPORT_SYMBOL_GPL(ptp_qoriq_adjtime);
  213. int ptp_qoriq_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts)
  214. {
  215. u64 ns;
  216. unsigned long flags;
  217. struct ptp_qoriq *ptp_qoriq = container_of(ptp, struct ptp_qoriq, caps);
  218. spin_lock_irqsave(&ptp_qoriq->lock, flags);
  219. ns = tmr_cnt_read(ptp_qoriq) + tmr_offset_read(ptp_qoriq);
  220. spin_unlock_irqrestore(&ptp_qoriq->lock, flags);
  221. *ts = ns_to_timespec64(ns);
  222. return 0;
  223. }
  224. EXPORT_SYMBOL_GPL(ptp_qoriq_gettime);
  225. int ptp_qoriq_settime(struct ptp_clock_info *ptp,
  226. const struct timespec64 *ts)
  227. {
  228. u64 ns;
  229. unsigned long flags;
  230. struct ptp_qoriq *ptp_qoriq = container_of(ptp, struct ptp_qoriq, caps);
  231. ns = timespec64_to_ns(ts);
  232. spin_lock_irqsave(&ptp_qoriq->lock, flags);
  233. tmr_offset_write(ptp_qoriq, 0);
  234. tmr_cnt_write(ptp_qoriq, ns);
  235. set_fipers(ptp_qoriq);
  236. spin_unlock_irqrestore(&ptp_qoriq->lock, flags);
  237. return 0;
  238. }
  239. EXPORT_SYMBOL_GPL(ptp_qoriq_settime);
  240. int ptp_qoriq_enable(struct ptp_clock_info *ptp,
  241. struct ptp_clock_request *rq, int on)
  242. {
  243. struct ptp_qoriq *ptp_qoriq = container_of(ptp, struct ptp_qoriq, caps);
  244. struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
  245. unsigned long flags;
  246. u32 bit, mask = 0;
  247. switch (rq->type) {
  248. case PTP_CLK_REQ_EXTTS:
  249. switch (rq->extts.index) {
  250. case 0:
  251. bit = ETS1EN;
  252. break;
  253. case 1:
  254. bit = ETS2EN;
  255. break;
  256. default:
  257. return -EINVAL;
  258. }
  259. if (on)
  260. extts_clean_up(ptp_qoriq, rq->extts.index, false);
  261. break;
  262. case PTP_CLK_REQ_PPS:
  263. bit = PP1EN;
  264. break;
  265. default:
  266. return -EOPNOTSUPP;
  267. }
  268. spin_lock_irqsave(&ptp_qoriq->lock, flags);
  269. mask = ptp_qoriq->read(&regs->ctrl_regs->tmr_temask);
  270. if (on) {
  271. mask |= bit;
  272. ptp_qoriq->write(&regs->ctrl_regs->tmr_tevent, bit);
  273. } else {
  274. mask &= ~bit;
  275. }
  276. ptp_qoriq->write(&regs->ctrl_regs->tmr_temask, mask);
  277. spin_unlock_irqrestore(&ptp_qoriq->lock, flags);
  278. return 0;
  279. }
  280. EXPORT_SYMBOL_GPL(ptp_qoriq_enable);
  281. static const struct ptp_clock_info ptp_qoriq_caps = {
  282. .owner = THIS_MODULE,
  283. .name = "qoriq ptp clock",
  284. .max_adj = 512000,
  285. .n_alarm = 0,
  286. .n_ext_ts = N_EXT_TS,
  287. .n_per_out = 0,
  288. .n_pins = 0,
  289. .pps = 1,
  290. .adjfine = ptp_qoriq_adjfine,
  291. .adjtime = ptp_qoriq_adjtime,
  292. .gettime64 = ptp_qoriq_gettime,
  293. .settime64 = ptp_qoriq_settime,
  294. .enable = ptp_qoriq_enable,
  295. };
  296. /**
  297. * ptp_qoriq_nominal_freq - calculate nominal frequency according to
  298. * reference clock frequency
  299. *
  300. * @clk_src: reference clock frequency
  301. *
  302. * The nominal frequency is the desired clock frequency.
  303. * It should be less than the reference clock frequency.
  304. * It should be a factor of 1000MHz.
  305. *
  306. * Return the nominal frequency
  307. */
  308. static u32 ptp_qoriq_nominal_freq(u32 clk_src)
  309. {
  310. u32 remainder = 0;
  311. clk_src /= 1000000;
  312. remainder = clk_src % 100;
  313. if (remainder) {
  314. clk_src -= remainder;
  315. clk_src += 100;
  316. }
  317. do {
  318. clk_src -= 100;
  319. } while (1000 % clk_src);
  320. return clk_src * 1000000;
  321. }
  322. /**
  323. * ptp_qoriq_auto_config - calculate a set of default configurations
  324. *
  325. * @ptp_qoriq: pointer to ptp_qoriq
  326. * @node: pointer to device_node
  327. *
  328. * If below dts properties are not provided, this function will be
  329. * called to calculate a set of default configurations for them.
  330. * "fsl,tclk-period"
  331. * "fsl,tmr-prsc"
  332. * "fsl,tmr-add"
  333. * "fsl,tmr-fiper1"
  334. * "fsl,tmr-fiper2"
  335. * "fsl,tmr-fiper3" (required only for DPAA2 and ENETC hardware)
  336. * "fsl,max-adj"
  337. *
  338. * Return 0 if success
  339. */
  340. static int ptp_qoriq_auto_config(struct ptp_qoriq *ptp_qoriq,
  341. struct device_node *node)
  342. {
  343. struct clk *clk;
  344. u64 freq_comp;
  345. u64 max_adj;
  346. u32 nominal_freq;
  347. u32 remainder = 0;
  348. u32 clk_src = 0;
  349. ptp_qoriq->cksel = DEFAULT_CKSEL;
  350. clk = of_clk_get(node, 0);
  351. if (!IS_ERR(clk)) {
  352. clk_src = clk_get_rate(clk);
  353. clk_put(clk);
  354. }
  355. if (clk_src <= 100000000UL) {
  356. pr_err("error reference clock value, or lower than 100MHz\n");
  357. return -EINVAL;
  358. }
  359. nominal_freq = ptp_qoriq_nominal_freq(clk_src);
  360. if (!nominal_freq)
  361. return -EINVAL;
  362. ptp_qoriq->tclk_period = 1000000000UL / nominal_freq;
  363. ptp_qoriq->tmr_prsc = DEFAULT_TMR_PRSC;
  364. /* Calculate initial frequency compensation value for TMR_ADD register.
  365. * freq_comp = ceil(2^32 / freq_ratio)
  366. * freq_ratio = reference_clock_freq / nominal_freq
  367. */
  368. freq_comp = ((u64)1 << 32) * nominal_freq;
  369. freq_comp = div_u64_rem(freq_comp, clk_src, &remainder);
  370. if (remainder)
  371. freq_comp++;
  372. ptp_qoriq->tmr_add = freq_comp;
  373. ptp_qoriq->tmr_fiper1 = DEFAULT_FIPER1_PERIOD - ptp_qoriq->tclk_period;
  374. ptp_qoriq->tmr_fiper2 = DEFAULT_FIPER2_PERIOD - ptp_qoriq->tclk_period;
  375. ptp_qoriq->tmr_fiper3 = DEFAULT_FIPER3_PERIOD - ptp_qoriq->tclk_period;
  376. /* max_adj = 1000000000 * (freq_ratio - 1.0) - 1
  377. * freq_ratio = reference_clock_freq / nominal_freq
  378. */
  379. max_adj = 1000000000ULL * (clk_src - nominal_freq);
  380. max_adj = div_u64(max_adj, nominal_freq) - 1;
  381. ptp_qoriq->caps.max_adj = max_adj;
  382. return 0;
  383. }
  384. int ptp_qoriq_init(struct ptp_qoriq *ptp_qoriq, void __iomem *base,
  385. const struct ptp_clock_info *caps)
  386. {
  387. struct device_node *node = ptp_qoriq->dev->of_node;
  388. struct ptp_qoriq_registers *regs;
  389. struct timespec64 now;
  390. unsigned long flags;
  391. u32 tmr_ctrl;
  392. if (!node)
  393. return -ENODEV;
  394. ptp_qoriq->base = base;
  395. ptp_qoriq->caps = *caps;
  396. if (of_property_read_u32(node, "fsl,cksel", &ptp_qoriq->cksel))
  397. ptp_qoriq->cksel = DEFAULT_CKSEL;
  398. if (of_property_read_bool(node, "fsl,extts-fifo"))
  399. ptp_qoriq->extts_fifo_support = true;
  400. else
  401. ptp_qoriq->extts_fifo_support = false;
  402. if (of_device_is_compatible(node, "fsl,dpaa2-ptp") ||
  403. of_device_is_compatible(node, "fsl,enetc-ptp"))
  404. ptp_qoriq->fiper3_support = true;
  405. if (of_property_read_u32(node,
  406. "fsl,tclk-period", &ptp_qoriq->tclk_period) ||
  407. of_property_read_u32(node,
  408. "fsl,tmr-prsc", &ptp_qoriq->tmr_prsc) ||
  409. of_property_read_u32(node,
  410. "fsl,tmr-add", &ptp_qoriq->tmr_add) ||
  411. of_property_read_u32(node,
  412. "fsl,tmr-fiper1", &ptp_qoriq->tmr_fiper1) ||
  413. of_property_read_u32(node,
  414. "fsl,tmr-fiper2", &ptp_qoriq->tmr_fiper2) ||
  415. of_property_read_u32(node,
  416. "fsl,max-adj", &ptp_qoriq->caps.max_adj) ||
  417. (ptp_qoriq->fiper3_support &&
  418. of_property_read_u32(node, "fsl,tmr-fiper3",
  419. &ptp_qoriq->tmr_fiper3))) {
  420. pr_warn("device tree node missing required elements, try automatic configuration\n");
  421. if (ptp_qoriq_auto_config(ptp_qoriq, node))
  422. return -ENODEV;
  423. }
  424. if (of_property_read_bool(node, "little-endian")) {
  425. ptp_qoriq->read = qoriq_read_le;
  426. ptp_qoriq->write = qoriq_write_le;
  427. } else {
  428. ptp_qoriq->read = qoriq_read_be;
  429. ptp_qoriq->write = qoriq_write_be;
  430. }
  431. /* The eTSEC uses differnt memory map with DPAA/ENETC */
  432. if (of_device_is_compatible(node, "fsl,etsec-ptp")) {
  433. ptp_qoriq->etsec = true;
  434. ptp_qoriq->regs.ctrl_regs = base + ETSEC_CTRL_REGS_OFFSET;
  435. ptp_qoriq->regs.alarm_regs = base + ETSEC_ALARM_REGS_OFFSET;
  436. ptp_qoriq->regs.fiper_regs = base + ETSEC_FIPER_REGS_OFFSET;
  437. ptp_qoriq->regs.etts_regs = base + ETSEC_ETTS_REGS_OFFSET;
  438. } else {
  439. ptp_qoriq->regs.ctrl_regs = base + CTRL_REGS_OFFSET;
  440. ptp_qoriq->regs.alarm_regs = base + ALARM_REGS_OFFSET;
  441. ptp_qoriq->regs.fiper_regs = base + FIPER_REGS_OFFSET;
  442. ptp_qoriq->regs.etts_regs = base + ETTS_REGS_OFFSET;
  443. }
  444. spin_lock_init(&ptp_qoriq->lock);
  445. ktime_get_real_ts64(&now);
  446. ptp_qoriq_settime(&ptp_qoriq->caps, &now);
  447. tmr_ctrl =
  448. (ptp_qoriq->tclk_period & TCLK_PERIOD_MASK) << TCLK_PERIOD_SHIFT |
  449. (ptp_qoriq->cksel & CKSEL_MASK) << CKSEL_SHIFT;
  450. spin_lock_irqsave(&ptp_qoriq->lock, flags);
  451. regs = &ptp_qoriq->regs;
  452. ptp_qoriq->write(&regs->ctrl_regs->tmr_ctrl, tmr_ctrl);
  453. ptp_qoriq->write(&regs->ctrl_regs->tmr_add, ptp_qoriq->tmr_add);
  454. ptp_qoriq->write(&regs->ctrl_regs->tmr_prsc, ptp_qoriq->tmr_prsc);
  455. ptp_qoriq->write(&regs->fiper_regs->tmr_fiper1, ptp_qoriq->tmr_fiper1);
  456. ptp_qoriq->write(&regs->fiper_regs->tmr_fiper2, ptp_qoriq->tmr_fiper2);
  457. if (ptp_qoriq->fiper3_support)
  458. ptp_qoriq->write(&regs->fiper_regs->tmr_fiper3,
  459. ptp_qoriq->tmr_fiper3);
  460. set_alarm(ptp_qoriq);
  461. ptp_qoriq->write(&regs->ctrl_regs->tmr_ctrl,
  462. tmr_ctrl|FIPERST|RTPE|TE|FRD);
  463. spin_unlock_irqrestore(&ptp_qoriq->lock, flags);
  464. ptp_qoriq->clock = ptp_clock_register(&ptp_qoriq->caps, ptp_qoriq->dev);
  465. if (IS_ERR(ptp_qoriq->clock))
  466. return PTR_ERR(ptp_qoriq->clock);
  467. ptp_qoriq->phc_index = ptp_clock_index(ptp_qoriq->clock);
  468. ptp_qoriq_create_debugfs(ptp_qoriq);
  469. return 0;
  470. }
  471. EXPORT_SYMBOL_GPL(ptp_qoriq_init);
  472. void ptp_qoriq_free(struct ptp_qoriq *ptp_qoriq)
  473. {
  474. struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
  475. ptp_qoriq->write(&regs->ctrl_regs->tmr_temask, 0);
  476. ptp_qoriq->write(&regs->ctrl_regs->tmr_ctrl, 0);
  477. ptp_qoriq_remove_debugfs(ptp_qoriq);
  478. ptp_clock_unregister(ptp_qoriq->clock);
  479. iounmap(ptp_qoriq->base);
  480. free_irq(ptp_qoriq->irq, ptp_qoriq);
  481. }
  482. EXPORT_SYMBOL_GPL(ptp_qoriq_free);
  483. static int ptp_qoriq_probe(struct platform_device *dev)
  484. {
  485. struct ptp_qoriq *ptp_qoriq;
  486. int err = -ENOMEM;
  487. void __iomem *base;
  488. ptp_qoriq = kzalloc(sizeof(*ptp_qoriq), GFP_KERNEL);
  489. if (!ptp_qoriq)
  490. goto no_memory;
  491. ptp_qoriq->dev = &dev->dev;
  492. err = -ENODEV;
  493. ptp_qoriq->irq = platform_get_irq(dev, 0);
  494. if (ptp_qoriq->irq < 0) {
  495. pr_err("irq not in device tree\n");
  496. goto no_node;
  497. }
  498. if (request_irq(ptp_qoriq->irq, ptp_qoriq_isr, IRQF_SHARED,
  499. DRIVER, ptp_qoriq)) {
  500. pr_err("request_irq failed\n");
  501. goto no_node;
  502. }
  503. ptp_qoriq->rsrc = platform_get_resource(dev, IORESOURCE_MEM, 0);
  504. if (!ptp_qoriq->rsrc) {
  505. pr_err("no resource\n");
  506. goto no_resource;
  507. }
  508. if (request_resource(&iomem_resource, ptp_qoriq->rsrc)) {
  509. pr_err("resource busy\n");
  510. goto no_resource;
  511. }
  512. base = ioremap(ptp_qoriq->rsrc->start,
  513. resource_size(ptp_qoriq->rsrc));
  514. if (!base) {
  515. pr_err("ioremap ptp registers failed\n");
  516. goto no_ioremap;
  517. }
  518. err = ptp_qoriq_init(ptp_qoriq, base, &ptp_qoriq_caps);
  519. if (err)
  520. goto no_clock;
  521. platform_set_drvdata(dev, ptp_qoriq);
  522. return 0;
  523. no_clock:
  524. iounmap(base);
  525. no_ioremap:
  526. release_resource(ptp_qoriq->rsrc);
  527. no_resource:
  528. free_irq(ptp_qoriq->irq, ptp_qoriq);
  529. no_node:
  530. kfree(ptp_qoriq);
  531. no_memory:
  532. return err;
  533. }
  534. static void ptp_qoriq_remove(struct platform_device *dev)
  535. {
  536. struct ptp_qoriq *ptp_qoriq = platform_get_drvdata(dev);
  537. ptp_qoriq_free(ptp_qoriq);
  538. release_resource(ptp_qoriq->rsrc);
  539. kfree(ptp_qoriq);
  540. }
  541. static const struct of_device_id match_table[] = {
  542. { .compatible = "fsl,etsec-ptp" },
  543. { .compatible = "fsl,fman-ptp-timer" },
  544. {},
  545. };
  546. MODULE_DEVICE_TABLE(of, match_table);
  547. static struct platform_driver ptp_qoriq_driver = {
  548. .driver = {
  549. .name = "ptp_qoriq",
  550. .of_match_table = match_table,
  551. },
  552. .probe = ptp_qoriq_probe,
  553. .remove_new = ptp_qoriq_remove,
  554. };
  555. module_platform_driver(ptp_qoriq_driver);
  556. MODULE_AUTHOR("Richard Cochran <richardcochran@gmail.com>");
  557. MODULE_DESCRIPTION("PTP clock for Freescale QorIQ 1588 timer");
  558. MODULE_LICENSE("GPL");