pwm-atmel-tcb.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) Overkiz SAS 2012
  4. *
  5. * Author: Boris BREZILLON <b.brezillon@overkiz.com>
  6. */
  7. #include <linux/module.h>
  8. #include <linux/init.h>
  9. #include <linux/clocksource.h>
  10. #include <linux/clockchips.h>
  11. #include <linux/interrupt.h>
  12. #include <linux/irq.h>
  13. #include <linux/clk.h>
  14. #include <linux/err.h>
  15. #include <linux/ioport.h>
  16. #include <linux/io.h>
  17. #include <linux/mfd/syscon.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/pwm.h>
  20. #include <linux/of.h>
  21. #include <linux/regmap.h>
  22. #include <linux/slab.h>
  23. #include <soc/at91/atmel_tcb.h>
  24. #define NPWM 2
  25. #define ATMEL_TC_ACMR_MASK (ATMEL_TC_ACPA | ATMEL_TC_ACPC | \
  26. ATMEL_TC_AEEVT | ATMEL_TC_ASWTRG)
  27. #define ATMEL_TC_BCMR_MASK (ATMEL_TC_BCPB | ATMEL_TC_BCPC | \
  28. ATMEL_TC_BEEVT | ATMEL_TC_BSWTRG)
  29. struct atmel_tcb_pwm_device {
  30. unsigned div; /* PWM clock divider */
  31. unsigned duty; /* PWM duty expressed in clk cycles */
  32. unsigned period; /* PWM period expressed in clk cycles */
  33. };
  34. struct atmel_tcb_channel {
  35. u32 enabled;
  36. u32 cmr;
  37. u32 ra;
  38. u32 rb;
  39. u32 rc;
  40. };
  41. struct atmel_tcb_pwm_chip {
  42. spinlock_t lock;
  43. u8 channel;
  44. u8 width;
  45. struct regmap *regmap;
  46. struct clk *clk;
  47. struct clk *gclk;
  48. struct clk *slow_clk;
  49. struct atmel_tcb_pwm_device pwms[NPWM];
  50. struct atmel_tcb_channel bkup;
  51. };
  52. static const u8 atmel_tcb_divisors[] = { 2, 8, 32, 128, 0, };
  53. static inline struct atmel_tcb_pwm_chip *to_tcb_chip(struct pwm_chip *chip)
  54. {
  55. return pwmchip_get_drvdata(chip);
  56. }
  57. static int atmel_tcb_pwm_request(struct pwm_chip *chip,
  58. struct pwm_device *pwm)
  59. {
  60. struct atmel_tcb_pwm_chip *tcbpwmc = to_tcb_chip(chip);
  61. struct atmel_tcb_pwm_device *tcbpwm = &tcbpwmc->pwms[pwm->hwpwm];
  62. unsigned cmr;
  63. int ret;
  64. ret = clk_prepare_enable(tcbpwmc->clk);
  65. if (ret)
  66. return ret;
  67. tcbpwm->duty = 0;
  68. tcbpwm->period = 0;
  69. tcbpwm->div = 0;
  70. guard(spinlock)(&tcbpwmc->lock);
  71. regmap_read(tcbpwmc->regmap, ATMEL_TC_REG(tcbpwmc->channel, CMR), &cmr);
  72. /*
  73. * Get init config from Timer Counter registers if
  74. * Timer Counter is already configured as a PWM generator.
  75. */
  76. if (cmr & ATMEL_TC_WAVE) {
  77. if (pwm->hwpwm == 0)
  78. regmap_read(tcbpwmc->regmap,
  79. ATMEL_TC_REG(tcbpwmc->channel, RA),
  80. &tcbpwm->duty);
  81. else
  82. regmap_read(tcbpwmc->regmap,
  83. ATMEL_TC_REG(tcbpwmc->channel, RB),
  84. &tcbpwm->duty);
  85. tcbpwm->div = cmr & ATMEL_TC_TCCLKS;
  86. regmap_read(tcbpwmc->regmap, ATMEL_TC_REG(tcbpwmc->channel, RC),
  87. &tcbpwm->period);
  88. cmr &= (ATMEL_TC_TCCLKS | ATMEL_TC_ACMR_MASK |
  89. ATMEL_TC_BCMR_MASK);
  90. } else
  91. cmr = 0;
  92. cmr |= ATMEL_TC_WAVE | ATMEL_TC_WAVESEL_UP_AUTO | ATMEL_TC_EEVT_XC0;
  93. regmap_write(tcbpwmc->regmap, ATMEL_TC_REG(tcbpwmc->channel, CMR), cmr);
  94. return 0;
  95. }
  96. static void atmel_tcb_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
  97. {
  98. struct atmel_tcb_pwm_chip *tcbpwmc = to_tcb_chip(chip);
  99. clk_disable_unprepare(tcbpwmc->clk);
  100. }
  101. static void atmel_tcb_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm,
  102. enum pwm_polarity polarity)
  103. {
  104. struct atmel_tcb_pwm_chip *tcbpwmc = to_tcb_chip(chip);
  105. struct atmel_tcb_pwm_device *tcbpwm = &tcbpwmc->pwms[pwm->hwpwm];
  106. unsigned cmr;
  107. /*
  108. * If duty is 0 the timer will be stopped and we have to
  109. * configure the output correctly on software trigger:
  110. * - set output to high if PWM_POLARITY_INVERSED
  111. * - set output to low if PWM_POLARITY_NORMAL
  112. *
  113. * This is why we're reverting polarity in this case.
  114. */
  115. if (tcbpwm->duty == 0)
  116. polarity = !polarity;
  117. regmap_read(tcbpwmc->regmap, ATMEL_TC_REG(tcbpwmc->channel, CMR), &cmr);
  118. /* flush old setting and set the new one */
  119. if (pwm->hwpwm == 0) {
  120. cmr &= ~ATMEL_TC_ACMR_MASK;
  121. if (polarity == PWM_POLARITY_INVERSED)
  122. cmr |= ATMEL_TC_ASWTRG_CLEAR;
  123. else
  124. cmr |= ATMEL_TC_ASWTRG_SET;
  125. } else {
  126. cmr &= ~ATMEL_TC_BCMR_MASK;
  127. if (polarity == PWM_POLARITY_INVERSED)
  128. cmr |= ATMEL_TC_BSWTRG_CLEAR;
  129. else
  130. cmr |= ATMEL_TC_BSWTRG_SET;
  131. }
  132. regmap_write(tcbpwmc->regmap, ATMEL_TC_REG(tcbpwmc->channel, CMR), cmr);
  133. /*
  134. * Use software trigger to apply the new setting.
  135. * If both PWM devices in this group are disabled we stop the clock.
  136. */
  137. if (!(cmr & (ATMEL_TC_ACPC | ATMEL_TC_BCPC))) {
  138. regmap_write(tcbpwmc->regmap,
  139. ATMEL_TC_REG(tcbpwmc->channel, CCR),
  140. ATMEL_TC_SWTRG | ATMEL_TC_CLKDIS);
  141. tcbpwmc->bkup.enabled = 1;
  142. } else {
  143. regmap_write(tcbpwmc->regmap,
  144. ATMEL_TC_REG(tcbpwmc->channel, CCR),
  145. ATMEL_TC_SWTRG);
  146. tcbpwmc->bkup.enabled = 0;
  147. }
  148. }
  149. static int atmel_tcb_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm,
  150. enum pwm_polarity polarity)
  151. {
  152. struct atmel_tcb_pwm_chip *tcbpwmc = to_tcb_chip(chip);
  153. struct atmel_tcb_pwm_device *tcbpwm = &tcbpwmc->pwms[pwm->hwpwm];
  154. u32 cmr;
  155. /*
  156. * If duty is 0 the timer will be stopped and we have to
  157. * configure the output correctly on software trigger:
  158. * - set output to high if PWM_POLARITY_INVERSED
  159. * - set output to low if PWM_POLARITY_NORMAL
  160. *
  161. * This is why we're reverting polarity in this case.
  162. */
  163. if (tcbpwm->duty == 0)
  164. polarity = !polarity;
  165. regmap_read(tcbpwmc->regmap, ATMEL_TC_REG(tcbpwmc->channel, CMR), &cmr);
  166. /* flush old setting and set the new one */
  167. cmr &= ~ATMEL_TC_TCCLKS;
  168. if (pwm->hwpwm == 0) {
  169. cmr &= ~ATMEL_TC_ACMR_MASK;
  170. /* Set CMR flags according to given polarity */
  171. if (polarity == PWM_POLARITY_INVERSED)
  172. cmr |= ATMEL_TC_ASWTRG_CLEAR;
  173. else
  174. cmr |= ATMEL_TC_ASWTRG_SET;
  175. } else {
  176. cmr &= ~ATMEL_TC_BCMR_MASK;
  177. if (polarity == PWM_POLARITY_INVERSED)
  178. cmr |= ATMEL_TC_BSWTRG_CLEAR;
  179. else
  180. cmr |= ATMEL_TC_BSWTRG_SET;
  181. }
  182. /*
  183. * If duty is 0 or equal to period there's no need to register
  184. * a specific action on RA/RB and RC compare.
  185. * The output will be configured on software trigger and keep
  186. * this config till next config call.
  187. */
  188. if (tcbpwm->duty != tcbpwm->period && tcbpwm->duty > 0) {
  189. if (pwm->hwpwm == 0) {
  190. if (polarity == PWM_POLARITY_INVERSED)
  191. cmr |= ATMEL_TC_ACPA_SET | ATMEL_TC_ACPC_CLEAR;
  192. else
  193. cmr |= ATMEL_TC_ACPA_CLEAR | ATMEL_TC_ACPC_SET;
  194. } else {
  195. if (polarity == PWM_POLARITY_INVERSED)
  196. cmr |= ATMEL_TC_BCPB_SET | ATMEL_TC_BCPC_CLEAR;
  197. else
  198. cmr |= ATMEL_TC_BCPB_CLEAR | ATMEL_TC_BCPC_SET;
  199. }
  200. }
  201. cmr |= (tcbpwm->div & ATMEL_TC_TCCLKS);
  202. regmap_write(tcbpwmc->regmap, ATMEL_TC_REG(tcbpwmc->channel, CMR), cmr);
  203. if (pwm->hwpwm == 0)
  204. regmap_write(tcbpwmc->regmap,
  205. ATMEL_TC_REG(tcbpwmc->channel, RA),
  206. tcbpwm->duty);
  207. else
  208. regmap_write(tcbpwmc->regmap,
  209. ATMEL_TC_REG(tcbpwmc->channel, RB),
  210. tcbpwm->duty);
  211. regmap_write(tcbpwmc->regmap, ATMEL_TC_REG(tcbpwmc->channel, RC),
  212. tcbpwm->period);
  213. /* Use software trigger to apply the new setting */
  214. regmap_write(tcbpwmc->regmap, ATMEL_TC_REG(tcbpwmc->channel, CCR),
  215. ATMEL_TC_SWTRG | ATMEL_TC_CLKEN);
  216. tcbpwmc->bkup.enabled = 1;
  217. return 0;
  218. }
  219. static int atmel_tcb_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
  220. int duty_ns, int period_ns)
  221. {
  222. struct atmel_tcb_pwm_chip *tcbpwmc = to_tcb_chip(chip);
  223. struct atmel_tcb_pwm_device *tcbpwm = &tcbpwmc->pwms[pwm->hwpwm];
  224. /* companion PWM sharing register values period and div */
  225. struct atmel_tcb_pwm_device *atcbpwm = &tcbpwmc->pwms[pwm->hwpwm ^ 1];
  226. int i = 0;
  227. int slowclk = 0;
  228. unsigned period;
  229. unsigned duty;
  230. unsigned rate = clk_get_rate(tcbpwmc->clk);
  231. unsigned long long min;
  232. unsigned long long max;
  233. /*
  234. * Find best clk divisor:
  235. * the smallest divisor which can fulfill the period_ns requirements.
  236. * If there is a gclk, the first divisor is actually the gclk selector
  237. */
  238. if (tcbpwmc->gclk)
  239. i = 1;
  240. for (; i < ARRAY_SIZE(atmel_tcb_divisors); ++i) {
  241. if (atmel_tcb_divisors[i] == 0) {
  242. slowclk = i;
  243. continue;
  244. }
  245. min = div_u64((u64)NSEC_PER_SEC * atmel_tcb_divisors[i], rate);
  246. max = min << tcbpwmc->width;
  247. if (max >= period_ns)
  248. break;
  249. }
  250. /*
  251. * If none of the divisor are small enough to represent period_ns
  252. * take slow clock (32KHz).
  253. */
  254. if (i == ARRAY_SIZE(atmel_tcb_divisors)) {
  255. i = slowclk;
  256. rate = clk_get_rate(tcbpwmc->slow_clk);
  257. min = div_u64(NSEC_PER_SEC, rate);
  258. max = min << tcbpwmc->width;
  259. /* If period is too big return ERANGE error */
  260. if (max < period_ns)
  261. return -ERANGE;
  262. }
  263. duty = div_u64(duty_ns, min);
  264. period = div_u64(period_ns, min);
  265. /*
  266. * PWM devices provided by the TCB driver are grouped by 2.
  267. * PWM devices in a given group must be configured with the
  268. * same period_ns.
  269. *
  270. * We're checking the period value of the second PWM device
  271. * in this group before applying the new config.
  272. */
  273. if ((atcbpwm->duty > 0 && atcbpwm->duty != atcbpwm->period) &&
  274. (atcbpwm->div != i || atcbpwm->period != period)) {
  275. dev_err(pwmchip_parent(chip),
  276. "failed to configure period_ns: PWM group already configured with a different value\n");
  277. return -EINVAL;
  278. }
  279. tcbpwm->period = period;
  280. tcbpwm->div = i;
  281. tcbpwm->duty = duty;
  282. return 0;
  283. }
  284. static int atmel_tcb_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
  285. const struct pwm_state *state)
  286. {
  287. struct atmel_tcb_pwm_chip *tcbpwmc = to_tcb_chip(chip);
  288. int duty_cycle, period;
  289. int ret;
  290. guard(spinlock)(&tcbpwmc->lock);
  291. if (!state->enabled) {
  292. atmel_tcb_pwm_disable(chip, pwm, state->polarity);
  293. return 0;
  294. }
  295. period = min(state->period, INT_MAX);
  296. duty_cycle = min(state->duty_cycle, INT_MAX);
  297. ret = atmel_tcb_pwm_config(chip, pwm, duty_cycle, period);
  298. if (ret)
  299. return ret;
  300. return atmel_tcb_pwm_enable(chip, pwm, state->polarity);
  301. }
  302. static const struct pwm_ops atmel_tcb_pwm_ops = {
  303. .request = atmel_tcb_pwm_request,
  304. .free = atmel_tcb_pwm_free,
  305. .apply = atmel_tcb_pwm_apply,
  306. };
  307. static struct atmel_tcb_config tcb_rm9200_config = {
  308. .counter_width = 16,
  309. };
  310. static struct atmel_tcb_config tcb_sam9x5_config = {
  311. .counter_width = 32,
  312. };
  313. static struct atmel_tcb_config tcb_sama5d2_config = {
  314. .counter_width = 32,
  315. .has_gclk = 1,
  316. };
  317. static const struct of_device_id atmel_tcb_of_match[] = {
  318. { .compatible = "atmel,at91rm9200-tcb", .data = &tcb_rm9200_config, },
  319. { .compatible = "atmel,at91sam9x5-tcb", .data = &tcb_sam9x5_config, },
  320. { .compatible = "atmel,sama5d2-tcb", .data = &tcb_sama5d2_config, },
  321. { /* sentinel */ }
  322. };
  323. static int atmel_tcb_pwm_probe(struct platform_device *pdev)
  324. {
  325. struct pwm_chip *chip;
  326. const struct of_device_id *match;
  327. struct atmel_tcb_pwm_chip *tcbpwmc;
  328. const struct atmel_tcb_config *config;
  329. struct device_node *np = pdev->dev.of_node;
  330. char clk_name[] = "t0_clk";
  331. int err;
  332. int channel;
  333. chip = devm_pwmchip_alloc(&pdev->dev, NPWM, sizeof(*tcbpwmc));
  334. if (IS_ERR(chip))
  335. return PTR_ERR(chip);
  336. tcbpwmc = to_tcb_chip(chip);
  337. err = of_property_read_u32(np, "reg", &channel);
  338. if (err < 0) {
  339. dev_err(&pdev->dev,
  340. "failed to get Timer Counter Block channel from device tree (error: %d)\n",
  341. err);
  342. return err;
  343. }
  344. tcbpwmc->regmap = syscon_node_to_regmap(np->parent);
  345. if (IS_ERR(tcbpwmc->regmap))
  346. return PTR_ERR(tcbpwmc->regmap);
  347. tcbpwmc->slow_clk = of_clk_get_by_name(np->parent, "slow_clk");
  348. if (IS_ERR(tcbpwmc->slow_clk))
  349. return PTR_ERR(tcbpwmc->slow_clk);
  350. clk_name[1] += channel;
  351. tcbpwmc->clk = of_clk_get_by_name(np->parent, clk_name);
  352. if (IS_ERR(tcbpwmc->clk))
  353. tcbpwmc->clk = of_clk_get_by_name(np->parent, "t0_clk");
  354. if (IS_ERR(tcbpwmc->clk)) {
  355. err = PTR_ERR(tcbpwmc->clk);
  356. goto err_slow_clk;
  357. }
  358. match = of_match_node(atmel_tcb_of_match, np->parent);
  359. config = match->data;
  360. if (config->has_gclk) {
  361. tcbpwmc->gclk = of_clk_get_by_name(np->parent, "gclk");
  362. if (IS_ERR(tcbpwmc->gclk)) {
  363. err = PTR_ERR(tcbpwmc->gclk);
  364. goto err_clk;
  365. }
  366. }
  367. chip->ops = &atmel_tcb_pwm_ops;
  368. tcbpwmc->channel = channel;
  369. tcbpwmc->width = config->counter_width;
  370. err = clk_prepare_enable(tcbpwmc->slow_clk);
  371. if (err)
  372. goto err_gclk;
  373. spin_lock_init(&tcbpwmc->lock);
  374. err = pwmchip_add(chip);
  375. if (err < 0)
  376. goto err_disable_clk;
  377. platform_set_drvdata(pdev, chip);
  378. return 0;
  379. err_disable_clk:
  380. clk_disable_unprepare(tcbpwmc->slow_clk);
  381. err_gclk:
  382. clk_put(tcbpwmc->gclk);
  383. err_clk:
  384. clk_put(tcbpwmc->clk);
  385. err_slow_clk:
  386. clk_put(tcbpwmc->slow_clk);
  387. return err;
  388. }
  389. static void atmel_tcb_pwm_remove(struct platform_device *pdev)
  390. {
  391. struct pwm_chip *chip = platform_get_drvdata(pdev);
  392. struct atmel_tcb_pwm_chip *tcbpwmc = to_tcb_chip(chip);
  393. pwmchip_remove(chip);
  394. clk_disable_unprepare(tcbpwmc->slow_clk);
  395. clk_put(tcbpwmc->gclk);
  396. clk_put(tcbpwmc->clk);
  397. clk_put(tcbpwmc->slow_clk);
  398. }
  399. static const struct of_device_id atmel_tcb_pwm_dt_ids[] = {
  400. { .compatible = "atmel,tcb-pwm", },
  401. { /* sentinel */ }
  402. };
  403. MODULE_DEVICE_TABLE(of, atmel_tcb_pwm_dt_ids);
  404. static int atmel_tcb_pwm_suspend(struct device *dev)
  405. {
  406. struct pwm_chip *chip = dev_get_drvdata(dev);
  407. struct atmel_tcb_pwm_chip *tcbpwmc = to_tcb_chip(chip);
  408. struct atmel_tcb_channel *chan = &tcbpwmc->bkup;
  409. unsigned int channel = tcbpwmc->channel;
  410. regmap_read(tcbpwmc->regmap, ATMEL_TC_REG(channel, CMR), &chan->cmr);
  411. regmap_read(tcbpwmc->regmap, ATMEL_TC_REG(channel, RA), &chan->ra);
  412. regmap_read(tcbpwmc->regmap, ATMEL_TC_REG(channel, RB), &chan->rb);
  413. regmap_read(tcbpwmc->regmap, ATMEL_TC_REG(channel, RC), &chan->rc);
  414. return 0;
  415. }
  416. static int atmel_tcb_pwm_resume(struct device *dev)
  417. {
  418. struct pwm_chip *chip = dev_get_drvdata(dev);
  419. struct atmel_tcb_pwm_chip *tcbpwmc = to_tcb_chip(chip);
  420. struct atmel_tcb_channel *chan = &tcbpwmc->bkup;
  421. unsigned int channel = tcbpwmc->channel;
  422. regmap_write(tcbpwmc->regmap, ATMEL_TC_REG(channel, CMR), chan->cmr);
  423. regmap_write(tcbpwmc->regmap, ATMEL_TC_REG(channel, RA), chan->ra);
  424. regmap_write(tcbpwmc->regmap, ATMEL_TC_REG(channel, RB), chan->rb);
  425. regmap_write(tcbpwmc->regmap, ATMEL_TC_REG(channel, RC), chan->rc);
  426. if (chan->enabled)
  427. regmap_write(tcbpwmc->regmap,
  428. ATMEL_TC_CLKEN | ATMEL_TC_SWTRG,
  429. ATMEL_TC_REG(channel, CCR));
  430. return 0;
  431. }
  432. static DEFINE_SIMPLE_DEV_PM_OPS(atmel_tcb_pwm_pm_ops, atmel_tcb_pwm_suspend,
  433. atmel_tcb_pwm_resume);
  434. static struct platform_driver atmel_tcb_pwm_driver = {
  435. .driver = {
  436. .name = "atmel-tcb-pwm",
  437. .of_match_table = atmel_tcb_pwm_dt_ids,
  438. .pm = pm_ptr(&atmel_tcb_pwm_pm_ops),
  439. },
  440. .probe = atmel_tcb_pwm_probe,
  441. .remove = atmel_tcb_pwm_remove,
  442. };
  443. module_platform_driver(atmel_tcb_pwm_driver);
  444. MODULE_AUTHOR("Boris BREZILLON <b.brezillon@overkiz.com>");
  445. MODULE_DESCRIPTION("Atmel Timer Counter Pulse Width Modulation Driver");
  446. MODULE_LICENSE("GPL v2");