ptp_qoriq.c 16 KB

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