exynos4_bus.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113
  1. /* drivers/devfreq/exynos4210_memorybus.c
  2. *
  3. * Copyright (c) 2011 Samsung Electronics Co., Ltd.
  4. * http://www.samsung.com/
  5. * MyungJoo Ham <myungjoo.ham@samsung.com>
  6. *
  7. * EXYNOS4 - Memory/Bus clock frequency scaling support in DEVFREQ framework
  8. * This version supports EXYNOS4210 only. This changes bus frequencies
  9. * and vddint voltages. Exynos4412/4212 should be able to be supported
  10. * with minor modifications.
  11. *
  12. * This program is free software; you can redistribute it and/or modify
  13. * it under the terms of the GNU General Public License version 2 as
  14. * published by the Free Software Foundation.
  15. *
  16. */
  17. #include <linux/io.h>
  18. #include <linux/slab.h>
  19. #include <linux/mutex.h>
  20. #include <linux/suspend.h>
  21. #include <linux/opp.h>
  22. #include <linux/devfreq.h>
  23. #include <linux/platform_device.h>
  24. #include <linux/regulator/consumer.h>
  25. #include <linux/module.h>
  26. /* Exynos4 ASV has been in the mailing list, but not upstreamed, yet. */
  27. #ifdef CONFIG_EXYNOS_ASV
  28. extern unsigned int exynos_result_of_asv;
  29. #endif
  30. #include <mach/regs-clock.h>
  31. #include <plat/map-s5p.h>
  32. #define MAX_SAFEVOLT 1200000 /* 1.2V */
  33. enum exynos4_busf_type {
  34. TYPE_BUSF_EXYNOS4210,
  35. TYPE_BUSF_EXYNOS4x12,
  36. };
  37. /* Assume that the bus is saturated if the utilization is 40% */
  38. #define BUS_SATURATION_RATIO 40
  39. enum ppmu_counter {
  40. PPMU_PMNCNT0 = 0,
  41. PPMU_PMCCNT1,
  42. PPMU_PMNCNT2,
  43. PPMU_PMNCNT3,
  44. PPMU_PMNCNT_MAX,
  45. };
  46. struct exynos4_ppmu {
  47. void __iomem *hw_base;
  48. unsigned int ccnt;
  49. unsigned int event;
  50. unsigned int count[PPMU_PMNCNT_MAX];
  51. bool ccnt_overflow;
  52. bool count_overflow[PPMU_PMNCNT_MAX];
  53. };
  54. enum busclk_level_idx {
  55. LV_0 = 0,
  56. LV_1,
  57. LV_2,
  58. LV_3,
  59. LV_4,
  60. _LV_END
  61. };
  62. #define EX4210_LV_MAX LV_2
  63. #define EX4x12_LV_MAX LV_4
  64. #define EX4210_LV_NUM (LV_2 + 1)
  65. #define EX4x12_LV_NUM (LV_4 + 1)
  66. struct busfreq_data {
  67. enum exynos4_busf_type type;
  68. struct device *dev;
  69. struct devfreq *devfreq;
  70. bool disabled;
  71. struct regulator *vdd_int;
  72. struct regulator *vdd_mif; /* Exynos4412/4212 only */
  73. struct opp *curr_opp;
  74. struct exynos4_ppmu dmc[2];
  75. struct notifier_block pm_notifier;
  76. struct mutex lock;
  77. /* Dividers calculated at boot/probe-time */
  78. unsigned int dmc_divtable[_LV_END]; /* DMC0 */
  79. unsigned int top_divtable[_LV_END];
  80. };
  81. struct bus_opp_table {
  82. unsigned int idx;
  83. unsigned long clk;
  84. unsigned long volt;
  85. };
  86. /* 4210 controls clock of mif and voltage of int */
  87. static struct bus_opp_table exynos4210_busclk_table[] = {
  88. {LV_0, 400000, 1150000},
  89. {LV_1, 267000, 1050000},
  90. {LV_2, 133000, 1025000},
  91. {0, 0, 0},
  92. };
  93. /*
  94. * MIF is the main control knob clock for exynox4x12 MIF/INT
  95. * clock and voltage of both mif/int are controlled.
  96. */
  97. static struct bus_opp_table exynos4x12_mifclk_table[] = {
  98. {LV_0, 400000, 1100000},
  99. {LV_1, 267000, 1000000},
  100. {LV_2, 160000, 950000},
  101. {LV_3, 133000, 950000},
  102. {LV_4, 100000, 950000},
  103. {0, 0, 0},
  104. };
  105. /*
  106. * INT is not the control knob of 4x12. LV_x is not meant to represent
  107. * the current performance. (MIF does)
  108. */
  109. static struct bus_opp_table exynos4x12_intclk_table[] = {
  110. {LV_0, 200000, 1000000},
  111. {LV_1, 160000, 950000},
  112. {LV_2, 133000, 925000},
  113. {LV_3, 100000, 900000},
  114. {0, 0, 0},
  115. };
  116. /* TODO: asv volt definitions are "__initdata"? */
  117. /* Some chips have different operating voltages */
  118. static unsigned int exynos4210_asv_volt[][EX4210_LV_NUM] = {
  119. {1150000, 1050000, 1050000},
  120. {1125000, 1025000, 1025000},
  121. {1100000, 1000000, 1000000},
  122. {1075000, 975000, 975000},
  123. {1050000, 950000, 950000},
  124. };
  125. static unsigned int exynos4x12_mif_step_50[][EX4x12_LV_NUM] = {
  126. /* 400 267 160 133 100 */
  127. {1050000, 950000, 900000, 900000, 900000}, /* ASV0 */
  128. {1050000, 950000, 900000, 900000, 900000}, /* ASV1 */
  129. {1050000, 950000, 900000, 900000, 900000}, /* ASV2 */
  130. {1050000, 900000, 900000, 900000, 900000}, /* ASV3 */
  131. {1050000, 900000, 900000, 900000, 850000}, /* ASV4 */
  132. {1050000, 900000, 900000, 850000, 850000}, /* ASV5 */
  133. {1050000, 900000, 850000, 850000, 850000}, /* ASV6 */
  134. {1050000, 900000, 850000, 850000, 850000}, /* ASV7 */
  135. {1050000, 900000, 850000, 850000, 850000}, /* ASV8 */
  136. };
  137. static unsigned int exynos4x12_int_volt[][EX4x12_LV_NUM] = {
  138. /* 200 160 133 100 */
  139. {1000000, 950000, 925000, 900000}, /* ASV0 */
  140. {975000, 925000, 925000, 900000}, /* ASV1 */
  141. {950000, 925000, 900000, 875000}, /* ASV2 */
  142. {950000, 900000, 900000, 875000}, /* ASV3 */
  143. {925000, 875000, 875000, 875000}, /* ASV4 */
  144. {900000, 850000, 850000, 850000}, /* ASV5 */
  145. {900000, 850000, 850000, 850000}, /* ASV6 */
  146. {900000, 850000, 850000, 850000}, /* ASV7 */
  147. {900000, 850000, 850000, 850000}, /* ASV8 */
  148. };
  149. /*** Clock Divider Data for Exynos4210 ***/
  150. static unsigned int exynos4210_clkdiv_dmc0[][8] = {
  151. /*
  152. * Clock divider value for following
  153. * { DIVACP, DIVACP_PCLK, DIVDPHY, DIVDMC, DIVDMCD
  154. * DIVDMCP, DIVCOPY2, DIVCORE_TIMERS }
  155. */
  156. /* DMC L0: 400MHz */
  157. { 3, 1, 1, 1, 1, 1, 3, 1 },
  158. /* DMC L1: 266.7MHz */
  159. { 4, 1, 1, 2, 1, 1, 3, 1 },
  160. /* DMC L2: 133MHz */
  161. { 5, 1, 1, 5, 1, 1, 3, 1 },
  162. };
  163. static unsigned int exynos4210_clkdiv_top[][5] = {
  164. /*
  165. * Clock divider value for following
  166. * { DIVACLK200, DIVACLK100, DIVACLK160, DIVACLK133, DIVONENAND }
  167. */
  168. /* ACLK200 L0: 200MHz */
  169. { 3, 7, 4, 5, 1 },
  170. /* ACLK200 L1: 160MHz */
  171. { 4, 7, 5, 6, 1 },
  172. /* ACLK200 L2: 133MHz */
  173. { 5, 7, 7, 7, 1 },
  174. };
  175. static unsigned int exynos4210_clkdiv_lr_bus[][2] = {
  176. /*
  177. * Clock divider value for following
  178. * { DIVGDL/R, DIVGPL/R }
  179. */
  180. /* ACLK_GDL/R L1: 200MHz */
  181. { 3, 1 },
  182. /* ACLK_GDL/R L2: 160MHz */
  183. { 4, 1 },
  184. /* ACLK_GDL/R L3: 133MHz */
  185. { 5, 1 },
  186. };
  187. /*** Clock Divider Data for Exynos4212/4412 ***/
  188. static unsigned int exynos4x12_clkdiv_dmc0[][6] = {
  189. /*
  190. * Clock divider value for following
  191. * { DIVACP, DIVACP_PCLK, DIVDPHY, DIVDMC, DIVDMCD
  192. * DIVDMCP}
  193. */
  194. /* DMC L0: 400MHz */
  195. {3, 1, 1, 1, 1, 1},
  196. /* DMC L1: 266.7MHz */
  197. {4, 1, 1, 2, 1, 1},
  198. /* DMC L2: 160MHz */
  199. {5, 1, 1, 4, 1, 1},
  200. /* DMC L3: 133MHz */
  201. {5, 1, 1, 5, 1, 1},
  202. /* DMC L4: 100MHz */
  203. {7, 1, 1, 7, 1, 1},
  204. };
  205. static unsigned int exynos4x12_clkdiv_dmc1[][6] = {
  206. /*
  207. * Clock divider value for following
  208. * { G2DACP, DIVC2C, DIVC2C_ACLK }
  209. */
  210. /* DMC L0: 400MHz */
  211. {3, 1, 1},
  212. /* DMC L1: 266.7MHz */
  213. {4, 2, 1},
  214. /* DMC L2: 160MHz */
  215. {5, 4, 1},
  216. /* DMC L3: 133MHz */
  217. {5, 5, 1},
  218. /* DMC L4: 100MHz */
  219. {7, 7, 1},
  220. };
  221. static unsigned int exynos4x12_clkdiv_top[][5] = {
  222. /*
  223. * Clock divider value for following
  224. * { DIVACLK266_GPS, DIVACLK100, DIVACLK160,
  225. DIVACLK133, DIVONENAND }
  226. */
  227. /* ACLK_GDL/R L0: 200MHz */
  228. {2, 7, 4, 5, 1},
  229. /* ACLK_GDL/R L1: 200MHz */
  230. {2, 7, 4, 5, 1},
  231. /* ACLK_GDL/R L2: 160MHz */
  232. {4, 7, 5, 7, 1},
  233. /* ACLK_GDL/R L3: 133MHz */
  234. {4, 7, 5, 7, 1},
  235. /* ACLK_GDL/R L4: 100MHz */
  236. {7, 7, 7, 7, 1},
  237. };
  238. static unsigned int exynos4x12_clkdiv_lr_bus[][2] = {
  239. /*
  240. * Clock divider value for following
  241. * { DIVGDL/R, DIVGPL/R }
  242. */
  243. /* ACLK_GDL/R L0: 200MHz */
  244. {3, 1},
  245. /* ACLK_GDL/R L1: 200MHz */
  246. {3, 1},
  247. /* ACLK_GDL/R L2: 160MHz */
  248. {4, 1},
  249. /* ACLK_GDL/R L3: 133MHz */
  250. {5, 1},
  251. /* ACLK_GDL/R L4: 100MHz */
  252. {7, 1},
  253. };
  254. static unsigned int exynos4x12_clkdiv_sclkip[][3] = {
  255. /*
  256. * Clock divider value for following
  257. * { DIVMFC, DIVJPEG, DIVFIMC0~3}
  258. */
  259. /* SCLK_MFC: 200MHz */
  260. {3, 3, 4},
  261. /* SCLK_MFC: 200MHz */
  262. {3, 3, 4},
  263. /* SCLK_MFC: 160MHz */
  264. {4, 4, 5},
  265. /* SCLK_MFC: 133MHz */
  266. {5, 5, 5},
  267. /* SCLK_MFC: 100MHz */
  268. {7, 7, 7},
  269. };
  270. static int exynos4210_set_busclk(struct busfreq_data *data, struct opp *opp)
  271. {
  272. unsigned int index;
  273. unsigned int tmp;
  274. for (index = LV_0; index < EX4210_LV_NUM; index++)
  275. if (opp_get_freq(opp) == exynos4210_busclk_table[index].clk)
  276. break;
  277. if (index == EX4210_LV_NUM)
  278. return -EINVAL;
  279. /* Change Divider - DMC0 */
  280. tmp = data->dmc_divtable[index];
  281. __raw_writel(tmp, EXYNOS4_CLKDIV_DMC0);
  282. do {
  283. tmp = __raw_readl(EXYNOS4_CLKDIV_STAT_DMC0);
  284. } while (tmp & 0x11111111);
  285. /* Change Divider - TOP */
  286. tmp = data->top_divtable[index];
  287. __raw_writel(tmp, EXYNOS4_CLKDIV_TOP);
  288. do {
  289. tmp = __raw_readl(EXYNOS4_CLKDIV_STAT_TOP);
  290. } while (tmp & 0x11111);
  291. /* Change Divider - LEFTBUS */
  292. tmp = __raw_readl(EXYNOS4_CLKDIV_LEFTBUS);
  293. tmp &= ~(EXYNOS4_CLKDIV_BUS_GDLR_MASK | EXYNOS4_CLKDIV_BUS_GPLR_MASK);
  294. tmp |= ((exynos4210_clkdiv_lr_bus[index][0] <<
  295. EXYNOS4_CLKDIV_BUS_GDLR_SHIFT) |
  296. (exynos4210_clkdiv_lr_bus[index][1] <<
  297. EXYNOS4_CLKDIV_BUS_GPLR_SHIFT));
  298. __raw_writel(tmp, EXYNOS4_CLKDIV_LEFTBUS);
  299. do {
  300. tmp = __raw_readl(EXYNOS4_CLKDIV_STAT_LEFTBUS);
  301. } while (tmp & 0x11);
  302. /* Change Divider - RIGHTBUS */
  303. tmp = __raw_readl(EXYNOS4_CLKDIV_RIGHTBUS);
  304. tmp &= ~(EXYNOS4_CLKDIV_BUS_GDLR_MASK | EXYNOS4_CLKDIV_BUS_GPLR_MASK);
  305. tmp |= ((exynos4210_clkdiv_lr_bus[index][0] <<
  306. EXYNOS4_CLKDIV_BUS_GDLR_SHIFT) |
  307. (exynos4210_clkdiv_lr_bus[index][1] <<
  308. EXYNOS4_CLKDIV_BUS_GPLR_SHIFT));
  309. __raw_writel(tmp, EXYNOS4_CLKDIV_RIGHTBUS);
  310. do {
  311. tmp = __raw_readl(EXYNOS4_CLKDIV_STAT_RIGHTBUS);
  312. } while (tmp & 0x11);
  313. return 0;
  314. }
  315. static int exynos4x12_set_busclk(struct busfreq_data *data, struct opp *opp)
  316. {
  317. unsigned int index;
  318. unsigned int tmp;
  319. for (index = LV_0; index < EX4x12_LV_NUM; index++)
  320. if (opp_get_freq(opp) == exynos4x12_mifclk_table[index].clk)
  321. break;
  322. if (index == EX4x12_LV_NUM)
  323. return -EINVAL;
  324. /* Change Divider - DMC0 */
  325. tmp = data->dmc_divtable[index];
  326. __raw_writel(tmp, EXYNOS4_CLKDIV_DMC0);
  327. do {
  328. tmp = __raw_readl(EXYNOS4_CLKDIV_STAT_DMC0);
  329. } while (tmp & 0x11111111);
  330. /* Change Divider - DMC1 */
  331. tmp = __raw_readl(EXYNOS4_CLKDIV_DMC1);
  332. tmp &= ~(EXYNOS4_CLKDIV_DMC1_G2D_ACP_MASK |
  333. EXYNOS4_CLKDIV_DMC1_C2C_MASK |
  334. EXYNOS4_CLKDIV_DMC1_C2CACLK_MASK);
  335. tmp |= ((exynos4x12_clkdiv_dmc1[index][0] <<
  336. EXYNOS4_CLKDIV_DMC1_G2D_ACP_SHIFT) |
  337. (exynos4x12_clkdiv_dmc1[index][1] <<
  338. EXYNOS4_CLKDIV_DMC1_C2C_SHIFT) |
  339. (exynos4x12_clkdiv_dmc1[index][2] <<
  340. EXYNOS4_CLKDIV_DMC1_C2CACLK_SHIFT));
  341. __raw_writel(tmp, EXYNOS4_CLKDIV_DMC1);
  342. do {
  343. tmp = __raw_readl(EXYNOS4_CLKDIV_STAT_DMC1);
  344. } while (tmp & 0x111111);
  345. /* Change Divider - TOP */
  346. tmp = __raw_readl(EXYNOS4_CLKDIV_TOP);
  347. tmp &= ~(EXYNOS4_CLKDIV_TOP_ACLK266_GPS_MASK |
  348. EXYNOS4_CLKDIV_TOP_ACLK100_MASK |
  349. EXYNOS4_CLKDIV_TOP_ACLK160_MASK |
  350. EXYNOS4_CLKDIV_TOP_ACLK133_MASK |
  351. EXYNOS4_CLKDIV_TOP_ONENAND_MASK);
  352. tmp |= ((exynos4x12_clkdiv_top[index][0] <<
  353. EXYNOS4_CLKDIV_TOP_ACLK266_GPS_SHIFT) |
  354. (exynos4x12_clkdiv_top[index][1] <<
  355. EXYNOS4_CLKDIV_TOP_ACLK100_SHIFT) |
  356. (exynos4x12_clkdiv_top[index][2] <<
  357. EXYNOS4_CLKDIV_TOP_ACLK160_SHIFT) |
  358. (exynos4x12_clkdiv_top[index][3] <<
  359. EXYNOS4_CLKDIV_TOP_ACLK133_SHIFT) |
  360. (exynos4x12_clkdiv_top[index][4] <<
  361. EXYNOS4_CLKDIV_TOP_ONENAND_SHIFT));
  362. __raw_writel(tmp, EXYNOS4_CLKDIV_TOP);
  363. do {
  364. tmp = __raw_readl(EXYNOS4_CLKDIV_STAT_TOP);
  365. } while (tmp & 0x11111);
  366. /* Change Divider - LEFTBUS */
  367. tmp = __raw_readl(EXYNOS4_CLKDIV_LEFTBUS);
  368. tmp &= ~(EXYNOS4_CLKDIV_BUS_GDLR_MASK | EXYNOS4_CLKDIV_BUS_GPLR_MASK);
  369. tmp |= ((exynos4x12_clkdiv_lr_bus[index][0] <<
  370. EXYNOS4_CLKDIV_BUS_GDLR_SHIFT) |
  371. (exynos4x12_clkdiv_lr_bus[index][1] <<
  372. EXYNOS4_CLKDIV_BUS_GPLR_SHIFT));
  373. __raw_writel(tmp, EXYNOS4_CLKDIV_LEFTBUS);
  374. do {
  375. tmp = __raw_readl(EXYNOS4_CLKDIV_STAT_LEFTBUS);
  376. } while (tmp & 0x11);
  377. /* Change Divider - RIGHTBUS */
  378. tmp = __raw_readl(EXYNOS4_CLKDIV_RIGHTBUS);
  379. tmp &= ~(EXYNOS4_CLKDIV_BUS_GDLR_MASK | EXYNOS4_CLKDIV_BUS_GPLR_MASK);
  380. tmp |= ((exynos4x12_clkdiv_lr_bus[index][0] <<
  381. EXYNOS4_CLKDIV_BUS_GDLR_SHIFT) |
  382. (exynos4x12_clkdiv_lr_bus[index][1] <<
  383. EXYNOS4_CLKDIV_BUS_GPLR_SHIFT));
  384. __raw_writel(tmp, EXYNOS4_CLKDIV_RIGHTBUS);
  385. do {
  386. tmp = __raw_readl(EXYNOS4_CLKDIV_STAT_RIGHTBUS);
  387. } while (tmp & 0x11);
  388. /* Change Divider - MFC */
  389. tmp = __raw_readl(EXYNOS4_CLKDIV_MFC);
  390. tmp &= ~(EXYNOS4_CLKDIV_MFC_MASK);
  391. tmp |= ((exynos4x12_clkdiv_sclkip[index][0] <<
  392. EXYNOS4_CLKDIV_MFC_SHIFT));
  393. __raw_writel(tmp, EXYNOS4_CLKDIV_MFC);
  394. do {
  395. tmp = __raw_readl(EXYNOS4_CLKDIV_STAT_MFC);
  396. } while (tmp & 0x1);
  397. /* Change Divider - JPEG */
  398. tmp = __raw_readl(EXYNOS4_CLKDIV_CAM1);
  399. tmp &= ~(EXYNOS4_CLKDIV_CAM1_JPEG_MASK);
  400. tmp |= ((exynos4x12_clkdiv_sclkip[index][1] <<
  401. EXYNOS4_CLKDIV_CAM1_JPEG_SHIFT));
  402. __raw_writel(tmp, EXYNOS4_CLKDIV_CAM1);
  403. do {
  404. tmp = __raw_readl(EXYNOS4_CLKDIV_STAT_CAM1);
  405. } while (tmp & 0x1);
  406. /* Change Divider - FIMC0~3 */
  407. tmp = __raw_readl(EXYNOS4_CLKDIV_CAM);
  408. tmp &= ~(EXYNOS4_CLKDIV_CAM_FIMC0_MASK | EXYNOS4_CLKDIV_CAM_FIMC1_MASK |
  409. EXYNOS4_CLKDIV_CAM_FIMC2_MASK | EXYNOS4_CLKDIV_CAM_FIMC3_MASK);
  410. tmp |= ((exynos4x12_clkdiv_sclkip[index][2] <<
  411. EXYNOS4_CLKDIV_CAM_FIMC0_SHIFT) |
  412. (exynos4x12_clkdiv_sclkip[index][2] <<
  413. EXYNOS4_CLKDIV_CAM_FIMC1_SHIFT) |
  414. (exynos4x12_clkdiv_sclkip[index][2] <<
  415. EXYNOS4_CLKDIV_CAM_FIMC2_SHIFT) |
  416. (exynos4x12_clkdiv_sclkip[index][2] <<
  417. EXYNOS4_CLKDIV_CAM_FIMC3_SHIFT));
  418. __raw_writel(tmp, EXYNOS4_CLKDIV_CAM);
  419. do {
  420. tmp = __raw_readl(EXYNOS4_CLKDIV_STAT_CAM1);
  421. } while (tmp & 0x1111);
  422. return 0;
  423. }
  424. static void busfreq_mon_reset(struct busfreq_data *data)
  425. {
  426. unsigned int i;
  427. for (i = 0; i < 2; i++) {
  428. void __iomem *ppmu_base = data->dmc[i].hw_base;
  429. /* Reset PPMU */
  430. __raw_writel(0x8000000f, ppmu_base + 0xf010);
  431. __raw_writel(0x8000000f, ppmu_base + 0xf050);
  432. __raw_writel(0x6, ppmu_base + 0xf000);
  433. __raw_writel(0x0, ppmu_base + 0xf100);
  434. /* Set PPMU Event */
  435. data->dmc[i].event = 0x6;
  436. __raw_writel(((data->dmc[i].event << 12) | 0x1),
  437. ppmu_base + 0xfc);
  438. /* Start PPMU */
  439. __raw_writel(0x1, ppmu_base + 0xf000);
  440. }
  441. }
  442. static void exynos4_read_ppmu(struct busfreq_data *data)
  443. {
  444. int i, j;
  445. for (i = 0; i < 2; i++) {
  446. void __iomem *ppmu_base = data->dmc[i].hw_base;
  447. u32 overflow;
  448. /* Stop PPMU */
  449. __raw_writel(0x0, ppmu_base + 0xf000);
  450. /* Update local data from PPMU */
  451. overflow = __raw_readl(ppmu_base + 0xf050);
  452. data->dmc[i].ccnt = __raw_readl(ppmu_base + 0xf100);
  453. data->dmc[i].ccnt_overflow = overflow & (1 << 31);
  454. for (j = 0; j < PPMU_PMNCNT_MAX; j++) {
  455. data->dmc[i].count[j] = __raw_readl(
  456. ppmu_base + (0xf110 + (0x10 * j)));
  457. data->dmc[i].count_overflow[j] = overflow & (1 << j);
  458. }
  459. }
  460. busfreq_mon_reset(data);
  461. }
  462. static int exynos4x12_get_intspec(unsigned long mifclk)
  463. {
  464. int i = 0;
  465. while (exynos4x12_intclk_table[i].clk) {
  466. if (exynos4x12_intclk_table[i].clk <= mifclk)
  467. return i;
  468. i++;
  469. }
  470. return -EINVAL;
  471. }
  472. static int exynos4_bus_setvolt(struct busfreq_data *data, struct opp *opp,
  473. struct opp *oldopp)
  474. {
  475. int err = 0, tmp;
  476. unsigned long volt = opp_get_voltage(opp);
  477. switch (data->type) {
  478. case TYPE_BUSF_EXYNOS4210:
  479. /* OPP represents DMC clock + INT voltage */
  480. err = regulator_set_voltage(data->vdd_int, volt,
  481. MAX_SAFEVOLT);
  482. break;
  483. case TYPE_BUSF_EXYNOS4x12:
  484. /* OPP represents MIF clock + MIF voltage */
  485. err = regulator_set_voltage(data->vdd_mif, volt,
  486. MAX_SAFEVOLT);
  487. if (err)
  488. break;
  489. tmp = exynos4x12_get_intspec(opp_get_freq(opp));
  490. if (tmp < 0) {
  491. err = tmp;
  492. regulator_set_voltage(data->vdd_mif,
  493. opp_get_voltage(oldopp),
  494. MAX_SAFEVOLT);
  495. break;
  496. }
  497. err = regulator_set_voltage(data->vdd_int,
  498. exynos4x12_intclk_table[tmp].volt,
  499. MAX_SAFEVOLT);
  500. /* Try to recover */
  501. if (err)
  502. regulator_set_voltage(data->vdd_mif,
  503. opp_get_voltage(oldopp),
  504. MAX_SAFEVOLT);
  505. break;
  506. default:
  507. err = -EINVAL;
  508. }
  509. return err;
  510. }
  511. static int exynos4_bus_target(struct device *dev, unsigned long *_freq,
  512. u32 flags)
  513. {
  514. int err = 0;
  515. struct platform_device *pdev = container_of(dev, struct platform_device,
  516. dev);
  517. struct busfreq_data *data = platform_get_drvdata(pdev);
  518. struct opp *opp = devfreq_recommended_opp(dev, _freq, flags);
  519. unsigned long freq = opp_get_freq(opp);
  520. unsigned long old_freq = opp_get_freq(data->curr_opp);
  521. if (IS_ERR(opp))
  522. return PTR_ERR(opp);
  523. if (old_freq == freq)
  524. return 0;
  525. dev_dbg(dev, "targetting %lukHz %luuV\n", freq, opp_get_voltage(opp));
  526. mutex_lock(&data->lock);
  527. if (data->disabled)
  528. goto out;
  529. if (old_freq < freq)
  530. err = exynos4_bus_setvolt(data, opp, data->curr_opp);
  531. if (err)
  532. goto out;
  533. if (old_freq != freq) {
  534. switch (data->type) {
  535. case TYPE_BUSF_EXYNOS4210:
  536. err = exynos4210_set_busclk(data, opp);
  537. break;
  538. case TYPE_BUSF_EXYNOS4x12:
  539. err = exynos4x12_set_busclk(data, opp);
  540. break;
  541. default:
  542. err = -EINVAL;
  543. }
  544. }
  545. if (err)
  546. goto out;
  547. if (old_freq > freq)
  548. err = exynos4_bus_setvolt(data, opp, data->curr_opp);
  549. if (err)
  550. goto out;
  551. data->curr_opp = opp;
  552. out:
  553. mutex_unlock(&data->lock);
  554. return err;
  555. }
  556. static int exynos4_get_busier_dmc(struct busfreq_data *data)
  557. {
  558. u64 p0 = data->dmc[0].count[0];
  559. u64 p1 = data->dmc[1].count[0];
  560. p0 *= data->dmc[1].ccnt;
  561. p1 *= data->dmc[0].ccnt;
  562. if (data->dmc[1].ccnt == 0)
  563. return 0;
  564. if (p0 > p1)
  565. return 0;
  566. return 1;
  567. }
  568. static int exynos4_bus_get_dev_status(struct device *dev,
  569. struct devfreq_dev_status *stat)
  570. {
  571. struct busfreq_data *data = dev_get_drvdata(dev);
  572. int busier_dmc;
  573. int cycles_x2 = 2; /* 2 x cycles */
  574. void __iomem *addr;
  575. u32 timing;
  576. u32 memctrl;
  577. exynos4_read_ppmu(data);
  578. busier_dmc = exynos4_get_busier_dmc(data);
  579. stat->current_frequency = opp_get_freq(data->curr_opp);
  580. if (busier_dmc)
  581. addr = S5P_VA_DMC1;
  582. else
  583. addr = S5P_VA_DMC0;
  584. memctrl = __raw_readl(addr + 0x04); /* one of DDR2/3/LPDDR2 */
  585. timing = __raw_readl(addr + 0x38); /* CL or WL/RL values */
  586. switch ((memctrl >> 8) & 0xf) {
  587. case 0x4: /* DDR2 */
  588. cycles_x2 = ((timing >> 16) & 0xf) * 2;
  589. break;
  590. case 0x5: /* LPDDR2 */
  591. case 0x6: /* DDR3 */
  592. cycles_x2 = ((timing >> 8) & 0xf) + ((timing >> 0) & 0xf);
  593. break;
  594. default:
  595. pr_err("%s: Unknown Memory Type(%d).\n", __func__,
  596. (memctrl >> 8) & 0xf);
  597. return -EINVAL;
  598. }
  599. /* Number of cycles spent on memory access */
  600. stat->busy_time = data->dmc[busier_dmc].count[0] / 2 * (cycles_x2 + 2);
  601. stat->busy_time *= 100 / BUS_SATURATION_RATIO;
  602. stat->total_time = data->dmc[busier_dmc].ccnt;
  603. /* If the counters have overflown, retry */
  604. if (data->dmc[busier_dmc].ccnt_overflow ||
  605. data->dmc[busier_dmc].count_overflow[0])
  606. return -EAGAIN;
  607. return 0;
  608. }
  609. static void exynos4_bus_exit(struct device *dev)
  610. {
  611. struct busfreq_data *data = dev_get_drvdata(dev);
  612. devfreq_unregister_opp_notifier(dev, data->devfreq);
  613. }
  614. static struct devfreq_dev_profile exynos4_devfreq_profile = {
  615. .initial_freq = 400000,
  616. .polling_ms = 50,
  617. .target = exynos4_bus_target,
  618. .get_dev_status = exynos4_bus_get_dev_status,
  619. .exit = exynos4_bus_exit,
  620. };
  621. static int exynos4210_init_tables(struct busfreq_data *data)
  622. {
  623. u32 tmp;
  624. int mgrp;
  625. int i, err = 0;
  626. tmp = __raw_readl(EXYNOS4_CLKDIV_DMC0);
  627. for (i = LV_0; i < EX4210_LV_NUM; i++) {
  628. tmp &= ~(EXYNOS4_CLKDIV_DMC0_ACP_MASK |
  629. EXYNOS4_CLKDIV_DMC0_ACPPCLK_MASK |
  630. EXYNOS4_CLKDIV_DMC0_DPHY_MASK |
  631. EXYNOS4_CLKDIV_DMC0_DMC_MASK |
  632. EXYNOS4_CLKDIV_DMC0_DMCD_MASK |
  633. EXYNOS4_CLKDIV_DMC0_DMCP_MASK |
  634. EXYNOS4_CLKDIV_DMC0_COPY2_MASK |
  635. EXYNOS4_CLKDIV_DMC0_CORETI_MASK);
  636. tmp |= ((exynos4210_clkdiv_dmc0[i][0] <<
  637. EXYNOS4_CLKDIV_DMC0_ACP_SHIFT) |
  638. (exynos4210_clkdiv_dmc0[i][1] <<
  639. EXYNOS4_CLKDIV_DMC0_ACPPCLK_SHIFT) |
  640. (exynos4210_clkdiv_dmc0[i][2] <<
  641. EXYNOS4_CLKDIV_DMC0_DPHY_SHIFT) |
  642. (exynos4210_clkdiv_dmc0[i][3] <<
  643. EXYNOS4_CLKDIV_DMC0_DMC_SHIFT) |
  644. (exynos4210_clkdiv_dmc0[i][4] <<
  645. EXYNOS4_CLKDIV_DMC0_DMCD_SHIFT) |
  646. (exynos4210_clkdiv_dmc0[i][5] <<
  647. EXYNOS4_CLKDIV_DMC0_DMCP_SHIFT) |
  648. (exynos4210_clkdiv_dmc0[i][6] <<
  649. EXYNOS4_CLKDIV_DMC0_COPY2_SHIFT) |
  650. (exynos4210_clkdiv_dmc0[i][7] <<
  651. EXYNOS4_CLKDIV_DMC0_CORETI_SHIFT));
  652. data->dmc_divtable[i] = tmp;
  653. }
  654. tmp = __raw_readl(EXYNOS4_CLKDIV_TOP);
  655. for (i = LV_0; i < EX4210_LV_NUM; i++) {
  656. tmp &= ~(EXYNOS4_CLKDIV_TOP_ACLK200_MASK |
  657. EXYNOS4_CLKDIV_TOP_ACLK100_MASK |
  658. EXYNOS4_CLKDIV_TOP_ACLK160_MASK |
  659. EXYNOS4_CLKDIV_TOP_ACLK133_MASK |
  660. EXYNOS4_CLKDIV_TOP_ONENAND_MASK);
  661. tmp |= ((exynos4210_clkdiv_top[i][0] <<
  662. EXYNOS4_CLKDIV_TOP_ACLK200_SHIFT) |
  663. (exynos4210_clkdiv_top[i][1] <<
  664. EXYNOS4_CLKDIV_TOP_ACLK100_SHIFT) |
  665. (exynos4210_clkdiv_top[i][2] <<
  666. EXYNOS4_CLKDIV_TOP_ACLK160_SHIFT) |
  667. (exynos4210_clkdiv_top[i][3] <<
  668. EXYNOS4_CLKDIV_TOP_ACLK133_SHIFT) |
  669. (exynos4210_clkdiv_top[i][4] <<
  670. EXYNOS4_CLKDIV_TOP_ONENAND_SHIFT));
  671. data->top_divtable[i] = tmp;
  672. }
  673. #ifdef CONFIG_EXYNOS_ASV
  674. tmp = exynos4_result_of_asv;
  675. #else
  676. tmp = 0; /* Max voltages for the reliability of the unknown */
  677. #endif
  678. pr_debug("ASV Group of Exynos4 is %d\n", tmp);
  679. /* Use merged grouping for voltage */
  680. switch (tmp) {
  681. case 0:
  682. mgrp = 0;
  683. break;
  684. case 1:
  685. case 2:
  686. mgrp = 1;
  687. break;
  688. case 3:
  689. case 4:
  690. mgrp = 2;
  691. break;
  692. case 5:
  693. case 6:
  694. mgrp = 3;
  695. break;
  696. case 7:
  697. mgrp = 4;
  698. break;
  699. default:
  700. pr_warn("Unknown ASV Group. Use max voltage.\n");
  701. mgrp = 0;
  702. }
  703. for (i = LV_0; i < EX4210_LV_NUM; i++)
  704. exynos4210_busclk_table[i].volt = exynos4210_asv_volt[mgrp][i];
  705. for (i = LV_0; i < EX4210_LV_NUM; i++) {
  706. err = opp_add(data->dev, exynos4210_busclk_table[i].clk,
  707. exynos4210_busclk_table[i].volt);
  708. if (err) {
  709. dev_err(data->dev, "Cannot add opp entries.\n");
  710. return err;
  711. }
  712. }
  713. return 0;
  714. }
  715. static int exynos4x12_init_tables(struct busfreq_data *data)
  716. {
  717. unsigned int i;
  718. unsigned int tmp;
  719. int ret;
  720. /* Enable pause function for DREX2 DVFS */
  721. tmp = __raw_readl(EXYNOS4_DMC_PAUSE_CTRL);
  722. tmp |= EXYNOS4_DMC_PAUSE_ENABLE;
  723. __raw_writel(tmp, EXYNOS4_DMC_PAUSE_CTRL);
  724. tmp = __raw_readl(EXYNOS4_CLKDIV_DMC0);
  725. for (i = 0; i < EX4x12_LV_NUM; i++) {
  726. tmp &= ~(EXYNOS4_CLKDIV_DMC0_ACP_MASK |
  727. EXYNOS4_CLKDIV_DMC0_ACPPCLK_MASK |
  728. EXYNOS4_CLKDIV_DMC0_DPHY_MASK |
  729. EXYNOS4_CLKDIV_DMC0_DMC_MASK |
  730. EXYNOS4_CLKDIV_DMC0_DMCD_MASK |
  731. EXYNOS4_CLKDIV_DMC0_DMCP_MASK);
  732. tmp |= ((exynos4x12_clkdiv_dmc0[i][0] <<
  733. EXYNOS4_CLKDIV_DMC0_ACP_SHIFT) |
  734. (exynos4x12_clkdiv_dmc0[i][1] <<
  735. EXYNOS4_CLKDIV_DMC0_ACPPCLK_SHIFT) |
  736. (exynos4x12_clkdiv_dmc0[i][2] <<
  737. EXYNOS4_CLKDIV_DMC0_DPHY_SHIFT) |
  738. (exynos4x12_clkdiv_dmc0[i][3] <<
  739. EXYNOS4_CLKDIV_DMC0_DMC_SHIFT) |
  740. (exynos4x12_clkdiv_dmc0[i][4] <<
  741. EXYNOS4_CLKDIV_DMC0_DMCD_SHIFT) |
  742. (exynos4x12_clkdiv_dmc0[i][5] <<
  743. EXYNOS4_CLKDIV_DMC0_DMCP_SHIFT));
  744. data->dmc_divtable[i] = tmp;
  745. }
  746. #ifdef CONFIG_EXYNOS_ASV
  747. tmp = exynos4_result_of_asv;
  748. #else
  749. tmp = 0; /* Max voltages for the reliability of the unknown */
  750. #endif
  751. if (tmp > 8)
  752. tmp = 0;
  753. pr_debug("ASV Group of Exynos4x12 is %d\n", tmp);
  754. for (i = 0; i < EX4x12_LV_NUM; i++) {
  755. exynos4x12_mifclk_table[i].volt =
  756. exynos4x12_mif_step_50[tmp][i];
  757. exynos4x12_intclk_table[i].volt =
  758. exynos4x12_int_volt[tmp][i];
  759. }
  760. for (i = 0; i < EX4x12_LV_NUM; i++) {
  761. ret = opp_add(data->dev, exynos4x12_mifclk_table[i].clk,
  762. exynos4x12_mifclk_table[i].volt);
  763. if (ret) {
  764. dev_err(data->dev, "Fail to add opp entries.\n");
  765. return ret;
  766. }
  767. }
  768. return 0;
  769. }
  770. static int exynos4_busfreq_pm_notifier_event(struct notifier_block *this,
  771. unsigned long event, void *ptr)
  772. {
  773. struct busfreq_data *data = container_of(this, struct busfreq_data,
  774. pm_notifier);
  775. struct opp *opp;
  776. unsigned long maxfreq = ULONG_MAX;
  777. int err = 0;
  778. switch (event) {
  779. case PM_SUSPEND_PREPARE:
  780. /* Set Fastest and Deactivate DVFS */
  781. mutex_lock(&data->lock);
  782. data->disabled = true;
  783. opp = opp_find_freq_floor(data->dev, &maxfreq);
  784. err = exynos4_bus_setvolt(data, opp, data->curr_opp);
  785. if (err)
  786. goto unlock;
  787. switch (data->type) {
  788. case TYPE_BUSF_EXYNOS4210:
  789. err = exynos4210_set_busclk(data, opp);
  790. break;
  791. case TYPE_BUSF_EXYNOS4x12:
  792. err = exynos4x12_set_busclk(data, opp);
  793. break;
  794. default:
  795. err = -EINVAL;
  796. }
  797. if (err)
  798. goto unlock;
  799. data->curr_opp = opp;
  800. unlock:
  801. mutex_unlock(&data->lock);
  802. if (err)
  803. return err;
  804. return NOTIFY_OK;
  805. case PM_POST_RESTORE:
  806. case PM_POST_SUSPEND:
  807. /* Reactivate */
  808. mutex_lock(&data->lock);
  809. data->disabled = false;
  810. mutex_unlock(&data->lock);
  811. return NOTIFY_OK;
  812. }
  813. return NOTIFY_DONE;
  814. }
  815. static int exynos4_busfreq_probe(struct platform_device *pdev)
  816. {
  817. struct busfreq_data *data;
  818. struct opp *opp;
  819. struct device *dev = &pdev->dev;
  820. int err = 0;
  821. data = devm_kzalloc(&pdev->dev, sizeof(struct busfreq_data), GFP_KERNEL);
  822. if (data == NULL) {
  823. dev_err(dev, "Cannot allocate memory.\n");
  824. return -ENOMEM;
  825. }
  826. data->type = pdev->id_entry->driver_data;
  827. data->dmc[0].hw_base = S5P_VA_DMC0;
  828. data->dmc[1].hw_base = S5P_VA_DMC1;
  829. data->pm_notifier.notifier_call = exynos4_busfreq_pm_notifier_event;
  830. data->dev = dev;
  831. mutex_init(&data->lock);
  832. switch (data->type) {
  833. case TYPE_BUSF_EXYNOS4210:
  834. err = exynos4210_init_tables(data);
  835. break;
  836. case TYPE_BUSF_EXYNOS4x12:
  837. err = exynos4x12_init_tables(data);
  838. break;
  839. default:
  840. dev_err(dev, "Cannot determine the device id %d\n", data->type);
  841. err = -EINVAL;
  842. }
  843. if (err)
  844. return err;
  845. data->vdd_int = devm_regulator_get(dev, "vdd_int");
  846. if (IS_ERR(data->vdd_int)) {
  847. dev_err(dev, "Cannot get the regulator \"vdd_int\"\n");
  848. return PTR_ERR(data->vdd_int);
  849. }
  850. if (data->type == TYPE_BUSF_EXYNOS4x12) {
  851. data->vdd_mif = devm_regulator_get(dev, "vdd_mif");
  852. if (IS_ERR(data->vdd_mif)) {
  853. dev_err(dev, "Cannot get the regulator \"vdd_mif\"\n");
  854. return PTR_ERR(data->vdd_mif);
  855. }
  856. }
  857. opp = opp_find_freq_floor(dev, &exynos4_devfreq_profile.initial_freq);
  858. if (IS_ERR(opp)) {
  859. dev_err(dev, "Invalid initial frequency %lu kHz.\n",
  860. exynos4_devfreq_profile.initial_freq);
  861. return PTR_ERR(opp);
  862. }
  863. data->curr_opp = opp;
  864. platform_set_drvdata(pdev, data);
  865. busfreq_mon_reset(data);
  866. data->devfreq = devfreq_add_device(dev, &exynos4_devfreq_profile,
  867. "simple_ondemand", NULL);
  868. if (IS_ERR(data->devfreq))
  869. return PTR_ERR(data->devfreq);
  870. devfreq_register_opp_notifier(dev, data->devfreq);
  871. err = register_pm_notifier(&data->pm_notifier);
  872. if (err) {
  873. dev_err(dev, "Failed to setup pm notifier\n");
  874. devfreq_remove_device(data->devfreq);
  875. return err;
  876. }
  877. return 0;
  878. }
  879. static int exynos4_busfreq_remove(struct platform_device *pdev)
  880. {
  881. struct busfreq_data *data = platform_get_drvdata(pdev);
  882. unregister_pm_notifier(&data->pm_notifier);
  883. devfreq_remove_device(data->devfreq);
  884. return 0;
  885. }
  886. static int exynos4_busfreq_resume(struct device *dev)
  887. {
  888. struct busfreq_data *data = dev_get_drvdata(dev);
  889. busfreq_mon_reset(data);
  890. return 0;
  891. }
  892. static const struct dev_pm_ops exynos4_busfreq_pm = {
  893. .resume = exynos4_busfreq_resume,
  894. };
  895. static const struct platform_device_id exynos4_busfreq_id[] = {
  896. { "exynos4210-busfreq", TYPE_BUSF_EXYNOS4210 },
  897. { "exynos4412-busfreq", TYPE_BUSF_EXYNOS4x12 },
  898. { "exynos4212-busfreq", TYPE_BUSF_EXYNOS4x12 },
  899. { },
  900. };
  901. static struct platform_driver exynos4_busfreq_driver = {
  902. .probe = exynos4_busfreq_probe,
  903. .remove = exynos4_busfreq_remove,
  904. .id_table = exynos4_busfreq_id,
  905. .driver = {
  906. .name = "exynos4-busfreq",
  907. .owner = THIS_MODULE,
  908. .pm = &exynos4_busfreq_pm,
  909. },
  910. };
  911. static int __init exynos4_busfreq_init(void)
  912. {
  913. return platform_driver_register(&exynos4_busfreq_driver);
  914. }
  915. late_initcall(exynos4_busfreq_init);
  916. static void __exit exynos4_busfreq_exit(void)
  917. {
  918. platform_driver_unregister(&exynos4_busfreq_driver);
  919. }
  920. module_exit(exynos4_busfreq_exit);
  921. MODULE_LICENSE("GPL");
  922. MODULE_DESCRIPTION("EXYNOS4 busfreq driver with devfreq framework");
  923. MODULE_AUTHOR("MyungJoo Ham <myungjoo.ham@samsung.com>");