exynos4_bus.c 27 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132
  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 __devinit 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 = kzalloc(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. goto err_regulator;
  845. data->vdd_int = regulator_get(dev, "vdd_int");
  846. if (IS_ERR(data->vdd_int)) {
  847. dev_err(dev, "Cannot get the regulator \"vdd_int\"\n");
  848. err = PTR_ERR(data->vdd_int);
  849. goto err_regulator;
  850. }
  851. if (data->type == TYPE_BUSF_EXYNOS4x12) {
  852. data->vdd_mif = regulator_get(dev, "vdd_mif");
  853. if (IS_ERR(data->vdd_mif)) {
  854. dev_err(dev, "Cannot get the regulator \"vdd_mif\"\n");
  855. err = PTR_ERR(data->vdd_mif);
  856. regulator_put(data->vdd_int);
  857. goto err_regulator;
  858. }
  859. }
  860. opp = opp_find_freq_floor(dev, &exynos4_devfreq_profile.initial_freq);
  861. if (IS_ERR(opp)) {
  862. dev_err(dev, "Invalid initial frequency %lu kHz.\n",
  863. exynos4_devfreq_profile.initial_freq);
  864. err = PTR_ERR(opp);
  865. goto err_opp_add;
  866. }
  867. data->curr_opp = opp;
  868. platform_set_drvdata(pdev, data);
  869. busfreq_mon_reset(data);
  870. data->devfreq = devfreq_add_device(dev, &exynos4_devfreq_profile,
  871. &devfreq_simple_ondemand, NULL);
  872. if (IS_ERR(data->devfreq)) {
  873. err = PTR_ERR(data->devfreq);
  874. goto err_opp_add;
  875. }
  876. devfreq_register_opp_notifier(dev, data->devfreq);
  877. err = register_pm_notifier(&data->pm_notifier);
  878. if (err) {
  879. dev_err(dev, "Failed to setup pm notifier\n");
  880. goto err_devfreq_add;
  881. }
  882. return 0;
  883. err_devfreq_add:
  884. devfreq_remove_device(data->devfreq);
  885. err_opp_add:
  886. if (data->vdd_mif)
  887. regulator_put(data->vdd_mif);
  888. regulator_put(data->vdd_int);
  889. err_regulator:
  890. kfree(data);
  891. return err;
  892. }
  893. static __devexit int exynos4_busfreq_remove(struct platform_device *pdev)
  894. {
  895. struct busfreq_data *data = platform_get_drvdata(pdev);
  896. unregister_pm_notifier(&data->pm_notifier);
  897. devfreq_remove_device(data->devfreq);
  898. regulator_put(data->vdd_int);
  899. if (data->vdd_mif)
  900. regulator_put(data->vdd_mif);
  901. kfree(data);
  902. return 0;
  903. }
  904. static int exynos4_busfreq_resume(struct device *dev)
  905. {
  906. struct busfreq_data *data = dev_get_drvdata(dev);
  907. busfreq_mon_reset(data);
  908. return 0;
  909. }
  910. static const struct dev_pm_ops exynos4_busfreq_pm = {
  911. .resume = exynos4_busfreq_resume,
  912. };
  913. static const struct platform_device_id exynos4_busfreq_id[] = {
  914. { "exynos4210-busfreq", TYPE_BUSF_EXYNOS4210 },
  915. { "exynos4412-busfreq", TYPE_BUSF_EXYNOS4x12 },
  916. { "exynos4212-busfreq", TYPE_BUSF_EXYNOS4x12 },
  917. { },
  918. };
  919. static struct platform_driver exynos4_busfreq_driver = {
  920. .probe = exynos4_busfreq_probe,
  921. .remove = __devexit_p(exynos4_busfreq_remove),
  922. .id_table = exynos4_busfreq_id,
  923. .driver = {
  924. .name = "exynos4-busfreq",
  925. .owner = THIS_MODULE,
  926. .pm = &exynos4_busfreq_pm,
  927. },
  928. };
  929. static int __init exynos4_busfreq_init(void)
  930. {
  931. return platform_driver_register(&exynos4_busfreq_driver);
  932. }
  933. late_initcall(exynos4_busfreq_init);
  934. static void __exit exynos4_busfreq_exit(void)
  935. {
  936. platform_driver_unregister(&exynos4_busfreq_driver);
  937. }
  938. module_exit(exynos4_busfreq_exit);
  939. MODULE_LICENSE("GPL");
  940. MODULE_DESCRIPTION("EXYNOS4 busfreq driver with devfreq framework");
  941. MODULE_AUTHOR("MyungJoo Ham <myungjoo.ham@samsung.com>");