106-clk-at91-clk-sam9x60-pll-allow-runtime-changes-for-p.patch 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. From 6fe2927863de96edf35d8357712dbf83a489f556 Mon Sep 17 00:00:00 2001
  2. From: Claudiu Beznea <[email protected]>
  3. Date: Thu, 19 Nov 2020 17:43:12 +0200
  4. Subject: [PATCH 106/247] clk: at91: clk-sam9x60-pll: allow runtime changes for
  5. pll
  6. Allow runtime frequency changes for PLLs registered with proper flags.
  7. This is necessary for CPU PLL on SAMA7G5 which is used by DVFS.
  8. Signed-off-by: Claudiu Beznea <[email protected]>
  9. Link: https://lore.kernel.org/r/[email protected]
  10. Signed-off-by: Stephen Boyd <[email protected]>
  11. ---
  12. drivers/clk/at91/clk-sam9x60-pll.c | 145 +++++++++++++++++++++++++----
  13. drivers/clk/at91/pmc.h | 4 +-
  14. drivers/clk/at91/sam9x60.c | 22 ++++-
  15. drivers/clk/at91/sama7g5.c | 67 +++++++++----
  16. 4 files changed, 197 insertions(+), 41 deletions(-)
  17. --- a/drivers/clk/at91/clk-sam9x60-pll.c
  18. +++ b/drivers/clk/at91/clk-sam9x60-pll.c
  19. @@ -229,6 +229,57 @@ static int sam9x60_frac_pll_set_rate(str
  20. return sam9x60_frac_pll_compute_mul_frac(core, rate, parent_rate, true);
  21. }
  22. +static int sam9x60_frac_pll_set_rate_chg(struct clk_hw *hw, unsigned long rate,
  23. + unsigned long parent_rate)
  24. +{
  25. + struct sam9x60_pll_core *core = to_sam9x60_pll_core(hw);
  26. + struct sam9x60_frac *frac = to_sam9x60_frac(core);
  27. + struct regmap *regmap = core->regmap;
  28. + unsigned long irqflags;
  29. + unsigned int val, cfrac, cmul;
  30. + long ret;
  31. +
  32. + ret = sam9x60_frac_pll_compute_mul_frac(core, rate, parent_rate, true);
  33. + if (ret <= 0)
  34. + return ret;
  35. +
  36. + spin_lock_irqsave(core->lock, irqflags);
  37. +
  38. + regmap_update_bits(regmap, AT91_PMC_PLL_UPDT, AT91_PMC_PLL_UPDT_ID_MSK,
  39. + core->id);
  40. + regmap_read(regmap, AT91_PMC_PLL_CTRL1, &val);
  41. + cmul = (val & core->layout->mul_mask) >> core->layout->mul_shift;
  42. + cfrac = (val & core->layout->frac_mask) >> core->layout->frac_shift;
  43. +
  44. + if (cmul == frac->mul && cfrac == frac->frac)
  45. + goto unlock;
  46. +
  47. + regmap_write(regmap, AT91_PMC_PLL_CTRL1,
  48. + (frac->mul << core->layout->mul_shift) |
  49. + (frac->frac << core->layout->frac_shift));
  50. +
  51. + regmap_update_bits(regmap, AT91_PMC_PLL_UPDT,
  52. + AT91_PMC_PLL_UPDT_UPDATE | AT91_PMC_PLL_UPDT_ID_MSK,
  53. + AT91_PMC_PLL_UPDT_UPDATE | core->id);
  54. +
  55. + regmap_update_bits(regmap, AT91_PMC_PLL_CTRL0,
  56. + AT91_PMC_PLL_CTRL0_ENLOCK | AT91_PMC_PLL_CTRL0_ENPLL,
  57. + AT91_PMC_PLL_CTRL0_ENLOCK |
  58. + AT91_PMC_PLL_CTRL0_ENPLL);
  59. +
  60. + regmap_update_bits(regmap, AT91_PMC_PLL_UPDT,
  61. + AT91_PMC_PLL_UPDT_UPDATE | AT91_PMC_PLL_UPDT_ID_MSK,
  62. + AT91_PMC_PLL_UPDT_UPDATE | core->id);
  63. +
  64. + while (!sam9x60_pll_ready(regmap, core->id))
  65. + cpu_relax();
  66. +
  67. +unlock:
  68. + spin_unlock_irqrestore(core->lock, irqflags);
  69. +
  70. + return ret;
  71. +}
  72. +
  73. static const struct clk_ops sam9x60_frac_pll_ops = {
  74. .prepare = sam9x60_frac_pll_prepare,
  75. .unprepare = sam9x60_frac_pll_unprepare,
  76. @@ -238,6 +289,15 @@ static const struct clk_ops sam9x60_frac
  77. .set_rate = sam9x60_frac_pll_set_rate,
  78. };
  79. +static const struct clk_ops sam9x60_frac_pll_ops_chg = {
  80. + .prepare = sam9x60_frac_pll_prepare,
  81. + .unprepare = sam9x60_frac_pll_unprepare,
  82. + .is_prepared = sam9x60_frac_pll_is_prepared,
  83. + .recalc_rate = sam9x60_frac_pll_recalc_rate,
  84. + .round_rate = sam9x60_frac_pll_round_rate,
  85. + .set_rate = sam9x60_frac_pll_set_rate_chg,
  86. +};
  87. +
  88. static int sam9x60_div_pll_prepare(struct clk_hw *hw)
  89. {
  90. struct sam9x60_pll_core *core = to_sam9x60_pll_core(hw);
  91. @@ -384,6 +444,44 @@ static int sam9x60_div_pll_set_rate(stru
  92. return 0;
  93. }
  94. +static int sam9x60_div_pll_set_rate_chg(struct clk_hw *hw, unsigned long rate,
  95. + unsigned long parent_rate)
  96. +{
  97. + struct sam9x60_pll_core *core = to_sam9x60_pll_core(hw);
  98. + struct sam9x60_div *div = to_sam9x60_div(core);
  99. + struct regmap *regmap = core->regmap;
  100. + unsigned long irqflags;
  101. + unsigned int val, cdiv;
  102. +
  103. + div->div = DIV_ROUND_CLOSEST(parent_rate, rate) - 1;
  104. +
  105. + spin_lock_irqsave(core->lock, irqflags);
  106. + regmap_update_bits(regmap, AT91_PMC_PLL_UPDT, AT91_PMC_PLL_UPDT_ID_MSK,
  107. + core->id);
  108. + regmap_read(regmap, AT91_PMC_PLL_CTRL0, &val);
  109. + cdiv = (val & core->layout->div_mask) >> core->layout->div_shift;
  110. +
  111. + /* Stop if nothing changed. */
  112. + if (cdiv == div->div)
  113. + goto unlock;
  114. +
  115. + regmap_update_bits(regmap, AT91_PMC_PLL_CTRL0,
  116. + core->layout->div_mask,
  117. + (div->div << core->layout->div_shift));
  118. +
  119. + regmap_update_bits(regmap, AT91_PMC_PLL_UPDT,
  120. + AT91_PMC_PLL_UPDT_UPDATE | AT91_PMC_PLL_UPDT_ID_MSK,
  121. + AT91_PMC_PLL_UPDT_UPDATE | core->id);
  122. +
  123. + while (!sam9x60_pll_ready(regmap, core->id))
  124. + cpu_relax();
  125. +
  126. +unlock:
  127. + spin_unlock_irqrestore(core->lock, irqflags);
  128. +
  129. + return 0;
  130. +}
  131. +
  132. static const struct clk_ops sam9x60_div_pll_ops = {
  133. .prepare = sam9x60_div_pll_prepare,
  134. .unprepare = sam9x60_div_pll_unprepare,
  135. @@ -393,17 +491,26 @@ static const struct clk_ops sam9x60_div_
  136. .set_rate = sam9x60_div_pll_set_rate,
  137. };
  138. +static const struct clk_ops sam9x60_div_pll_ops_chg = {
  139. + .prepare = sam9x60_div_pll_prepare,
  140. + .unprepare = sam9x60_div_pll_unprepare,
  141. + .is_prepared = sam9x60_div_pll_is_prepared,
  142. + .recalc_rate = sam9x60_div_pll_recalc_rate,
  143. + .round_rate = sam9x60_div_pll_round_rate,
  144. + .set_rate = sam9x60_div_pll_set_rate_chg,
  145. +};
  146. +
  147. struct clk_hw * __init
  148. sam9x60_clk_register_frac_pll(struct regmap *regmap, spinlock_t *lock,
  149. const char *name, const char *parent_name,
  150. struct clk_hw *parent_hw, u8 id,
  151. const struct clk_pll_characteristics *characteristics,
  152. - const struct clk_pll_layout *layout, bool critical)
  153. + const struct clk_pll_layout *layout, u32 flags)
  154. {
  155. struct sam9x60_frac *frac;
  156. struct clk_hw *hw;
  157. struct clk_init_data init;
  158. - unsigned long parent_rate, flags;
  159. + unsigned long parent_rate, irqflags;
  160. unsigned int val;
  161. int ret;
  162. @@ -417,10 +524,12 @@ sam9x60_clk_register_frac_pll(struct reg
  163. init.name = name;
  164. init.parent_names = &parent_name;
  165. init.num_parents = 1;
  166. - init.ops = &sam9x60_frac_pll_ops;
  167. - init.flags = CLK_SET_RATE_GATE;
  168. - if (critical)
  169. - init.flags |= CLK_IS_CRITICAL;
  170. + if (flags & CLK_SET_RATE_GATE)
  171. + init.ops = &sam9x60_frac_pll_ops;
  172. + else
  173. + init.ops = &sam9x60_frac_pll_ops_chg;
  174. +
  175. + init.flags = flags;
  176. frac->core.id = id;
  177. frac->core.hw.init = &init;
  178. @@ -429,7 +538,7 @@ sam9x60_clk_register_frac_pll(struct reg
  179. frac->core.regmap = regmap;
  180. frac->core.lock = lock;
  181. - spin_lock_irqsave(frac->core.lock, flags);
  182. + spin_lock_irqsave(frac->core.lock, irqflags);
  183. if (sam9x60_pll_ready(regmap, id)) {
  184. regmap_update_bits(regmap, AT91_PMC_PLL_UPDT,
  185. AT91_PMC_PLL_UPDT_ID_MSK, id);
  186. @@ -457,7 +566,7 @@ sam9x60_clk_register_frac_pll(struct reg
  187. goto free;
  188. }
  189. }
  190. - spin_unlock_irqrestore(frac->core.lock, flags);
  191. + spin_unlock_irqrestore(frac->core.lock, irqflags);
  192. hw = &frac->core.hw;
  193. ret = clk_hw_register(NULL, hw);
  194. @@ -469,7 +578,7 @@ sam9x60_clk_register_frac_pll(struct reg
  195. return hw;
  196. free:
  197. - spin_unlock_irqrestore(frac->core.lock, flags);
  198. + spin_unlock_irqrestore(frac->core.lock, irqflags);
  199. kfree(frac);
  200. return hw;
  201. }
  202. @@ -478,12 +587,12 @@ struct clk_hw * __init
  203. sam9x60_clk_register_div_pll(struct regmap *regmap, spinlock_t *lock,
  204. const char *name, const char *parent_name, u8 id,
  205. const struct clk_pll_characteristics *characteristics,
  206. - const struct clk_pll_layout *layout, bool critical)
  207. + const struct clk_pll_layout *layout, u32 flags)
  208. {
  209. struct sam9x60_div *div;
  210. struct clk_hw *hw;
  211. struct clk_init_data init;
  212. - unsigned long flags;
  213. + unsigned long irqflags;
  214. unsigned int val;
  215. int ret;
  216. @@ -497,11 +606,11 @@ sam9x60_clk_register_div_pll(struct regm
  217. init.name = name;
  218. init.parent_names = &parent_name;
  219. init.num_parents = 1;
  220. - init.ops = &sam9x60_div_pll_ops;
  221. - init.flags = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
  222. - CLK_SET_RATE_PARENT;
  223. - if (critical)
  224. - init.flags |= CLK_IS_CRITICAL;
  225. + if (flags & CLK_SET_RATE_GATE)
  226. + init.ops = &sam9x60_div_pll_ops;
  227. + else
  228. + init.ops = &sam9x60_div_pll_ops_chg;
  229. + init.flags = flags;
  230. div->core.id = id;
  231. div->core.hw.init = &init;
  232. @@ -510,14 +619,14 @@ sam9x60_clk_register_div_pll(struct regm
  233. div->core.regmap = regmap;
  234. div->core.lock = lock;
  235. - spin_lock_irqsave(div->core.lock, flags);
  236. + spin_lock_irqsave(div->core.lock, irqflags);
  237. regmap_update_bits(regmap, AT91_PMC_PLL_UPDT,
  238. AT91_PMC_PLL_UPDT_ID_MSK, id);
  239. regmap_read(regmap, AT91_PMC_PLL_CTRL0, &val);
  240. div->div = FIELD_GET(PMC_PLL_CTRL0_DIV_MSK, val);
  241. - spin_unlock_irqrestore(div->core.lock, flags);
  242. + spin_unlock_irqrestore(div->core.lock, irqflags);
  243. hw = &div->core.hw;
  244. ret = clk_hw_register(NULL, hw);
  245. --- a/drivers/clk/at91/pmc.h
  246. +++ b/drivers/clk/at91/pmc.h
  247. @@ -190,14 +190,14 @@ struct clk_hw * __init
  248. sam9x60_clk_register_div_pll(struct regmap *regmap, spinlock_t *lock,
  249. const char *name, const char *parent_name, u8 id,
  250. const struct clk_pll_characteristics *characteristics,
  251. - const struct clk_pll_layout *layout, bool critical);
  252. + const struct clk_pll_layout *layout, u32 flags);
  253. struct clk_hw * __init
  254. sam9x60_clk_register_frac_pll(struct regmap *regmap, spinlock_t *lock,
  255. const char *name, const char *parent_name,
  256. struct clk_hw *parent_hw, u8 id,
  257. const struct clk_pll_characteristics *characteristics,
  258. - const struct clk_pll_layout *layout, bool critical);
  259. + const struct clk_pll_layout *layout, u32 flags);
  260. struct clk_hw * __init
  261. at91_clk_register_programmable(struct regmap *regmap, const char *name,
  262. --- a/drivers/clk/at91/sam9x60.c
  263. +++ b/drivers/clk/at91/sam9x60.c
  264. @@ -224,13 +224,24 @@ static void __init sam9x60_pmc_setup(str
  265. hw = sam9x60_clk_register_frac_pll(regmap, &pmc_pll_lock, "pllack_fracck",
  266. "mainck", sam9x60_pmc->chws[PMC_MAIN],
  267. 0, &plla_characteristics,
  268. - &pll_frac_layout, true);
  269. + &pll_frac_layout,
  270. + /*
  271. + * This feeds pllack_divck which
  272. + * feeds CPU. It should not be
  273. + * disabled.
  274. + */
  275. + CLK_IS_CRITICAL | CLK_SET_RATE_GATE);
  276. if (IS_ERR(hw))
  277. goto err_free;
  278. hw = sam9x60_clk_register_div_pll(regmap, &pmc_pll_lock, "pllack_divck",
  279. "pllack_fracck", 0, &plla_characteristics,
  280. - &pll_div_layout, true);
  281. + &pll_div_layout,
  282. + /*
  283. + * This feeds CPU. It should not
  284. + * be disabled.
  285. + */
  286. + CLK_IS_CRITICAL | CLK_SET_RATE_GATE);
  287. if (IS_ERR(hw))
  288. goto err_free;
  289. @@ -239,13 +250,16 @@ static void __init sam9x60_pmc_setup(str
  290. hw = sam9x60_clk_register_frac_pll(regmap, &pmc_pll_lock, "upllck_fracck",
  291. "main_osc", main_osc_hw, 1,
  292. &upll_characteristics,
  293. - &pll_frac_layout, false);
  294. + &pll_frac_layout, CLK_SET_RATE_GATE);
  295. if (IS_ERR(hw))
  296. goto err_free;
  297. hw = sam9x60_clk_register_div_pll(regmap, &pmc_pll_lock, "upllck_divck",
  298. "upllck_fracck", 1, &upll_characteristics,
  299. - &pll_div_layout, false);
  300. + &pll_div_layout,
  301. + CLK_SET_RATE_GATE |
  302. + CLK_SET_PARENT_GATE |
  303. + CLK_SET_RATE_PARENT);
  304. if (IS_ERR(hw))
  305. goto err_free;
  306. --- a/drivers/clk/at91/sama7g5.c
  307. +++ b/drivers/clk/at91/sama7g5.c
  308. @@ -95,15 +95,15 @@ static const struct clk_pll_layout pll_l
  309. * @p: clock parent
  310. * @l: clock layout
  311. * @t: clock type
  312. - * @f: true if clock is critical and cannot be disabled
  313. + * @f: clock flags
  314. * @eid: export index in sama7g5->chws[] array
  315. */
  316. static const struct {
  317. const char *n;
  318. const char *p;
  319. const struct clk_pll_layout *l;
  320. + unsigned long f;
  321. u8 t;
  322. - u8 c;
  323. u8 eid;
  324. } sama7g5_plls[][PLL_ID_MAX] = {
  325. [PLL_ID_CPU] = {
  326. @@ -111,13 +111,18 @@ static const struct {
  327. .p = "mainck",
  328. .l = &pll_layout_frac,
  329. .t = PLL_TYPE_FRAC,
  330. - .c = 1, },
  331. + /*
  332. + * This feeds cpupll_divpmcck which feeds CPU. It should
  333. + * not be disabled.
  334. + */
  335. + .f = CLK_IS_CRITICAL, },
  336. { .n = "cpupll_divpmcck",
  337. .p = "cpupll_fracck",
  338. .l = &pll_layout_divpmc,
  339. .t = PLL_TYPE_DIV,
  340. - .c = 1,
  341. + /* This feeds CPU. It should not be disabled. */
  342. + .f = CLK_IS_CRITICAL | CLK_SET_RATE_PARENT,
  343. .eid = PMC_CPUPLL, },
  344. },
  345. @@ -126,13 +131,22 @@ static const struct {
  346. .p = "mainck",
  347. .l = &pll_layout_frac,
  348. .t = PLL_TYPE_FRAC,
  349. - .c = 1, },
  350. + /*
  351. + * This feeds syspll_divpmcck which may feed critial parts
  352. + * of the systems like timers. Therefore it should not be
  353. + * disabled.
  354. + */
  355. + .f = CLK_IS_CRITICAL | CLK_SET_RATE_GATE, },
  356. { .n = "syspll_divpmcck",
  357. .p = "syspll_fracck",
  358. .l = &pll_layout_divpmc,
  359. .t = PLL_TYPE_DIV,
  360. - .c = 1,
  361. + /*
  362. + * This may feed critial parts of the systems like timers.
  363. + * Therefore it should not be disabled.
  364. + */
  365. + .f = CLK_IS_CRITICAL | CLK_SET_RATE_GATE,
  366. .eid = PMC_SYSPLL, },
  367. },
  368. @@ -141,55 +155,71 @@ static const struct {
  369. .p = "mainck",
  370. .l = &pll_layout_frac,
  371. .t = PLL_TYPE_FRAC,
  372. - .c = 1, },
  373. + /*
  374. + * This feeds ddrpll_divpmcck which feeds DDR. It should not
  375. + * be disabled.
  376. + */
  377. + .f = CLK_IS_CRITICAL | CLK_SET_RATE_GATE, },
  378. { .n = "ddrpll_divpmcck",
  379. .p = "ddrpll_fracck",
  380. .l = &pll_layout_divpmc,
  381. .t = PLL_TYPE_DIV,
  382. - .c = 1, },
  383. + /* This feeds DDR. It should not be disabled. */
  384. + .f = CLK_IS_CRITICAL | CLK_SET_RATE_GATE, },
  385. },
  386. [PLL_ID_IMG] = {
  387. { .n = "imgpll_fracck",
  388. .p = "mainck",
  389. .l = &pll_layout_frac,
  390. - .t = PLL_TYPE_FRAC, },
  391. + .t = PLL_TYPE_FRAC,
  392. + .f = CLK_SET_RATE_GATE, },
  393. { .n = "imgpll_divpmcck",
  394. .p = "imgpll_fracck",
  395. .l = &pll_layout_divpmc,
  396. - .t = PLL_TYPE_DIV, },
  397. + .t = PLL_TYPE_DIV,
  398. + .f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
  399. + CLK_SET_RATE_PARENT, },
  400. },
  401. [PLL_ID_BAUD] = {
  402. { .n = "baudpll_fracck",
  403. .p = "mainck",
  404. .l = &pll_layout_frac,
  405. - .t = PLL_TYPE_FRAC, },
  406. + .t = PLL_TYPE_FRAC,
  407. + .f = CLK_SET_RATE_GATE, },
  408. { .n = "baudpll_divpmcck",
  409. .p = "baudpll_fracck",
  410. .l = &pll_layout_divpmc,
  411. - .t = PLL_TYPE_DIV, },
  412. + .t = PLL_TYPE_DIV,
  413. + .f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
  414. + CLK_SET_RATE_PARENT, },
  415. },
  416. [PLL_ID_AUDIO] = {
  417. { .n = "audiopll_fracck",
  418. .p = "main_xtal",
  419. .l = &pll_layout_frac,
  420. - .t = PLL_TYPE_FRAC, },
  421. + .t = PLL_TYPE_FRAC,
  422. + .f = CLK_SET_RATE_GATE, },
  423. { .n = "audiopll_divpmcck",
  424. .p = "audiopll_fracck",
  425. .l = &pll_layout_divpmc,
  426. .t = PLL_TYPE_DIV,
  427. + .f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
  428. + CLK_SET_RATE_PARENT,
  429. .eid = PMC_AUDIOPMCPLL, },
  430. { .n = "audiopll_diviock",
  431. .p = "audiopll_fracck",
  432. .l = &pll_layout_divio,
  433. .t = PLL_TYPE_DIV,
  434. + .f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
  435. + CLK_SET_RATE_PARENT,
  436. .eid = PMC_AUDIOIOPLL, },
  437. },
  438. @@ -197,12 +227,15 @@ static const struct {
  439. { .n = "ethpll_fracck",
  440. .p = "main_xtal",
  441. .l = &pll_layout_frac,
  442. - .t = PLL_TYPE_FRAC, },
  443. + .t = PLL_TYPE_FRAC,
  444. + .f = CLK_SET_RATE_GATE, },
  445. { .n = "ethpll_divpmcck",
  446. .p = "ethpll_fracck",
  447. .l = &pll_layout_divpmc,
  448. - .t = PLL_TYPE_DIV, },
  449. + .t = PLL_TYPE_DIV,
  450. + .f = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
  451. + CLK_SET_RATE_PARENT, },
  452. },
  453. };
  454. @@ -890,7 +923,7 @@ static void __init sama7g5_pmc_setup(str
  455. sama7g5_plls[i][j].p, parent_hw, i,
  456. &pll_characteristics,
  457. sama7g5_plls[i][j].l,
  458. - sama7g5_plls[i][j].c);
  459. + sama7g5_plls[i][j].f);
  460. break;
  461. case PLL_TYPE_DIV:
  462. @@ -899,7 +932,7 @@ static void __init sama7g5_pmc_setup(str
  463. sama7g5_plls[i][j].p, i,
  464. &pll_characteristics,
  465. sama7g5_plls[i][j].l,
  466. - sama7g5_plls[i][j].c);
  467. + sama7g5_plls[i][j].f);
  468. break;
  469. default: