clk-atlas7.c 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641
  1. /*
  2. * Clock tree for CSR SiRFAtlas7
  3. *
  4. * Copyright (c) 2014 Cambridge Silicon Radio Limited, a CSR plc group company.
  5. *
  6. * Licensed under GPLv2 or later.
  7. */
  8. #include <linux/bitops.h>
  9. #include <linux/io.h>
  10. #include <linux/clk-provider.h>
  11. #include <linux/delay.h>
  12. #include <linux/of_address.h>
  13. #include <linux/reset-controller.h>
  14. #include <linux/slab.h>
  15. #define SIRFSOC_CLKC_MEMPLL_AB_FREQ 0x0000
  16. #define SIRFSOC_CLKC_MEMPLL_AB_SSC 0x0004
  17. #define SIRFSOC_CLKC_MEMPLL_AB_CTRL0 0x0008
  18. #define SIRFSOC_CLKC_MEMPLL_AB_CTRL1 0x000c
  19. #define SIRFSOC_CLKC_MEMPLL_AB_STATUS 0x0010
  20. #define SIRFSOC_CLKC_MEMPLL_AB_SSRAM_ADDR 0x0014
  21. #define SIRFSOC_CLKC_MEMPLL_AB_SSRAM_DATA 0x0018
  22. #define SIRFSOC_CLKC_CPUPLL_AB_FREQ 0x001c
  23. #define SIRFSOC_CLKC_CPUPLL_AB_SSC 0x0020
  24. #define SIRFSOC_CLKC_CPUPLL_AB_CTRL0 0x0024
  25. #define SIRFSOC_CLKC_CPUPLL_AB_CTRL1 0x0028
  26. #define SIRFSOC_CLKC_CPUPLL_AB_STATUS 0x002c
  27. #define SIRFSOC_CLKC_SYS0PLL_AB_FREQ 0x0030
  28. #define SIRFSOC_CLKC_SYS0PLL_AB_SSC 0x0034
  29. #define SIRFSOC_CLKC_SYS0PLL_AB_CTRL0 0x0038
  30. #define SIRFSOC_CLKC_SYS0PLL_AB_CTRL1 0x003c
  31. #define SIRFSOC_CLKC_SYS0PLL_AB_STATUS 0x0040
  32. #define SIRFSOC_CLKC_SYS1PLL_AB_FREQ 0x0044
  33. #define SIRFSOC_CLKC_SYS1PLL_AB_SSC 0x0048
  34. #define SIRFSOC_CLKC_SYS1PLL_AB_CTRL0 0x004c
  35. #define SIRFSOC_CLKC_SYS1PLL_AB_CTRL1 0x0050
  36. #define SIRFSOC_CLKC_SYS1PLL_AB_STATUS 0x0054
  37. #define SIRFSOC_CLKC_SYS2PLL_AB_FREQ 0x0058
  38. #define SIRFSOC_CLKC_SYS2PLL_AB_SSC 0x005c
  39. #define SIRFSOC_CLKC_SYS2PLL_AB_CTRL0 0x0060
  40. #define SIRFSOC_CLKC_SYS2PLL_AB_CTRL1 0x0064
  41. #define SIRFSOC_CLKC_SYS2PLL_AB_STATUS 0x0068
  42. #define SIRFSOC_CLKC_SYS3PLL_AB_FREQ 0x006c
  43. #define SIRFSOC_CLKC_SYS3PLL_AB_SSC 0x0070
  44. #define SIRFSOC_CLKC_SYS3PLL_AB_CTRL0 0x0074
  45. #define SIRFSOC_CLKC_SYS3PLL_AB_CTRL1 0x0078
  46. #define SIRFSOC_CLKC_SYS3PLL_AB_STATUS 0x007c
  47. #define SIRFSOC_ABPLL_CTRL0_SSEN 0x00001000
  48. #define SIRFSOC_ABPLL_CTRL0_BYPASS 0x00000010
  49. #define SIRFSOC_ABPLL_CTRL0_RESET 0x00000001
  50. #define SIRFSOC_CLKC_AUDIO_DTO_INC 0x0088
  51. #define SIRFSOC_CLKC_DISP0_DTO_INC 0x008c
  52. #define SIRFSOC_CLKC_DISP1_DTO_INC 0x0090
  53. #define SIRFSOC_CLKC_AUDIO_DTO_SRC 0x0094
  54. #define SIRFSOC_CLKC_AUDIO_DTO_ENA 0x0098
  55. #define SIRFSOC_CLKC_AUDIO_DTO_DROFF 0x009c
  56. #define SIRFSOC_CLKC_DISP0_DTO_SRC 0x00a0
  57. #define SIRFSOC_CLKC_DISP0_DTO_ENA 0x00a4
  58. #define SIRFSOC_CLKC_DISP0_DTO_DROFF 0x00a8
  59. #define SIRFSOC_CLKC_DISP1_DTO_SRC 0x00ac
  60. #define SIRFSOC_CLKC_DISP1_DTO_ENA 0x00b0
  61. #define SIRFSOC_CLKC_DISP1_DTO_DROFF 0x00b4
  62. #define SIRFSOC_CLKC_I2S_CLK_SEL 0x00b8
  63. #define SIRFSOC_CLKC_I2S_SEL_STAT 0x00bc
  64. #define SIRFSOC_CLKC_USBPHY_CLKDIV_CFG 0x00c0
  65. #define SIRFSOC_CLKC_USBPHY_CLKDIV_ENA 0x00c4
  66. #define SIRFSOC_CLKC_USBPHY_CLK_SEL 0x00c8
  67. #define SIRFSOC_CLKC_USBPHY_CLK_SEL_STAT 0x00cc
  68. #define SIRFSOC_CLKC_BTSS_CLKDIV_CFG 0x00d0
  69. #define SIRFSOC_CLKC_BTSS_CLKDIV_ENA 0x00d4
  70. #define SIRFSOC_CLKC_BTSS_CLK_SEL 0x00d8
  71. #define SIRFSOC_CLKC_BTSS_CLK_SEL_STAT 0x00dc
  72. #define SIRFSOC_CLKC_RGMII_CLKDIV_CFG 0x00e0
  73. #define SIRFSOC_CLKC_RGMII_CLKDIV_ENA 0x00e4
  74. #define SIRFSOC_CLKC_RGMII_CLK_SEL 0x00e8
  75. #define SIRFSOC_CLKC_RGMII_CLK_SEL_STAT 0x00ec
  76. #define SIRFSOC_CLKC_CPU_CLKDIV_CFG 0x00f0
  77. #define SIRFSOC_CLKC_CPU_CLKDIV_ENA 0x00f4
  78. #define SIRFSOC_CLKC_CPU_CLK_SEL 0x00f8
  79. #define SIRFSOC_CLKC_CPU_CLK_SEL_STAT 0x00fc
  80. #define SIRFSOC_CLKC_SDPHY01_CLKDIV_CFG 0x0100
  81. #define SIRFSOC_CLKC_SDPHY01_CLKDIV_ENA 0x0104
  82. #define SIRFSOC_CLKC_SDPHY01_CLK_SEL 0x0108
  83. #define SIRFSOC_CLKC_SDPHY01_CLK_SEL_STAT 0x010c
  84. #define SIRFSOC_CLKC_SDPHY23_CLKDIV_CFG 0x0110
  85. #define SIRFSOC_CLKC_SDPHY23_CLKDIV_ENA 0x0114
  86. #define SIRFSOC_CLKC_SDPHY23_CLK_SEL 0x0118
  87. #define SIRFSOC_CLKC_SDPHY23_CLK_SEL_STAT 0x011c
  88. #define SIRFSOC_CLKC_SDPHY45_CLKDIV_CFG 0x0120
  89. #define SIRFSOC_CLKC_SDPHY45_CLKDIV_ENA 0x0124
  90. #define SIRFSOC_CLKC_SDPHY45_CLK_SEL 0x0128
  91. #define SIRFSOC_CLKC_SDPHY45_CLK_SEL_STAT 0x012c
  92. #define SIRFSOC_CLKC_SDPHY67_CLKDIV_CFG 0x0130
  93. #define SIRFSOC_CLKC_SDPHY67_CLKDIV_ENA 0x0134
  94. #define SIRFSOC_CLKC_SDPHY67_CLK_SEL 0x0138
  95. #define SIRFSOC_CLKC_SDPHY67_CLK_SEL_STAT 0x013c
  96. #define SIRFSOC_CLKC_CAN_CLKDIV_CFG 0x0140
  97. #define SIRFSOC_CLKC_CAN_CLKDIV_ENA 0x0144
  98. #define SIRFSOC_CLKC_CAN_CLK_SEL 0x0148
  99. #define SIRFSOC_CLKC_CAN_CLK_SEL_STAT 0x014c
  100. #define SIRFSOC_CLKC_DEINT_CLKDIV_CFG 0x0150
  101. #define SIRFSOC_CLKC_DEINT_CLKDIV_ENA 0x0154
  102. #define SIRFSOC_CLKC_DEINT_CLK_SEL 0x0158
  103. #define SIRFSOC_CLKC_DEINT_CLK_SEL_STAT 0x015c
  104. #define SIRFSOC_CLKC_NAND_CLKDIV_CFG 0x0160
  105. #define SIRFSOC_CLKC_NAND_CLKDIV_ENA 0x0164
  106. #define SIRFSOC_CLKC_NAND_CLK_SEL 0x0168
  107. #define SIRFSOC_CLKC_NAND_CLK_SEL_STAT 0x016c
  108. #define SIRFSOC_CLKC_DISP0_CLKDIV_CFG 0x0170
  109. #define SIRFSOC_CLKC_DISP0_CLKDIV_ENA 0x0174
  110. #define SIRFSOC_CLKC_DISP0_CLK_SEL 0x0178
  111. #define SIRFSOC_CLKC_DISP0_CLK_SEL_STAT 0x017c
  112. #define SIRFSOC_CLKC_DISP1_CLKDIV_CFG 0x0180
  113. #define SIRFSOC_CLKC_DISP1_CLKDIV_ENA 0x0184
  114. #define SIRFSOC_CLKC_DISP1_CLK_SEL 0x0188
  115. #define SIRFSOC_CLKC_DISP1_CLK_SEL_STAT 0x018c
  116. #define SIRFSOC_CLKC_GPU_CLKDIV_CFG 0x0190
  117. #define SIRFSOC_CLKC_GPU_CLKDIV_ENA 0x0194
  118. #define SIRFSOC_CLKC_GPU_CLK_SEL 0x0198
  119. #define SIRFSOC_CLKC_GPU_CLK_SEL_STAT 0x019c
  120. #define SIRFSOC_CLKC_GNSS_CLKDIV_CFG 0x01a0
  121. #define SIRFSOC_CLKC_GNSS_CLKDIV_ENA 0x01a4
  122. #define SIRFSOC_CLKC_GNSS_CLK_SEL 0x01a8
  123. #define SIRFSOC_CLKC_GNSS_CLK_SEL_STAT 0x01ac
  124. #define SIRFSOC_CLKC_SHARED_DIVIDER_CFG0 0x01b0
  125. #define SIRFSOC_CLKC_SHARED_DIVIDER_CFG1 0x01b4
  126. #define SIRFSOC_CLKC_SHARED_DIVIDER_ENA 0x01b8
  127. #define SIRFSOC_CLKC_SYS_CLK_SEL 0x01bc
  128. #define SIRFSOC_CLKC_SYS_CLK_SEL_STAT 0x01c0
  129. #define SIRFSOC_CLKC_IO_CLK_SEL 0x01c4
  130. #define SIRFSOC_CLKC_IO_CLK_SEL_STAT 0x01c8
  131. #define SIRFSOC_CLKC_G2D_CLK_SEL 0x01cc
  132. #define SIRFSOC_CLKC_G2D_CLK_SEL_STAT 0x01d0
  133. #define SIRFSOC_CLKC_JPENC_CLK_SEL 0x01d4
  134. #define SIRFSOC_CLKC_JPENC_CLK_SEL_STAT 0x01d8
  135. #define SIRFSOC_CLKC_VDEC_CLK_SEL 0x01dc
  136. #define SIRFSOC_CLKC_VDEC_CLK_SEL_STAT 0x01e0
  137. #define SIRFSOC_CLKC_GMAC_CLK_SEL 0x01e4
  138. #define SIRFSOC_CLKC_GMAC_CLK_SEL_STAT 0x01e8
  139. #define SIRFSOC_CLKC_USB_CLK_SEL 0x01ec
  140. #define SIRFSOC_CLKC_USB_CLK_SEL_STAT 0x01f0
  141. #define SIRFSOC_CLKC_KAS_CLK_SEL 0x01f4
  142. #define SIRFSOC_CLKC_KAS_CLK_SEL_STAT 0x01f8
  143. #define SIRFSOC_CLKC_SEC_CLK_SEL 0x01fc
  144. #define SIRFSOC_CLKC_SEC_CLK_SEL_STAT 0x0200
  145. #define SIRFSOC_CLKC_SDR_CLK_SEL 0x0204
  146. #define SIRFSOC_CLKC_SDR_CLK_SEL_STAT 0x0208
  147. #define SIRFSOC_CLKC_VIP_CLK_SEL 0x020c
  148. #define SIRFSOC_CLKC_VIP_CLK_SEL_STAT 0x0210
  149. #define SIRFSOC_CLKC_NOCD_CLK_SEL 0x0214
  150. #define SIRFSOC_CLKC_NOCD_CLK_SEL_STAT 0x0218
  151. #define SIRFSOC_CLKC_NOCR_CLK_SEL 0x021c
  152. #define SIRFSOC_CLKC_NOCR_CLK_SEL_STAT 0x0220
  153. #define SIRFSOC_CLKC_TPIU_CLK_SEL 0x0224
  154. #define SIRFSOC_CLKC_TPIU_CLK_SEL_STAT 0x0228
  155. #define SIRFSOC_CLKC_ROOT_CLK_EN0_SET 0x022c
  156. #define SIRFSOC_CLKC_ROOT_CLK_EN0_CLR 0x0230
  157. #define SIRFSOC_CLKC_ROOT_CLK_EN0_STAT 0x0234
  158. #define SIRFSOC_CLKC_ROOT_CLK_EN1_SET 0x0238
  159. #define SIRFSOC_CLKC_ROOT_CLK_EN1_CLR 0x023c
  160. #define SIRFSOC_CLKC_ROOT_CLK_EN1_STAT 0x0240
  161. #define SIRFSOC_CLKC_LEAF_CLK_EN0_SET 0x0244
  162. #define SIRFSOC_CLKC_LEAF_CLK_EN0_CLR 0x0248
  163. #define SIRFSOC_CLKC_LEAF_CLK_EN0_STAT 0x024c
  164. #define SIRFSOC_CLKC_RSTC_A7_SW_RST 0x0308
  165. #define SIRFSOC_CLKC_LEAF_CLK_EN1_SET 0x04a0
  166. #define SIRFSOC_CLKC_LEAF_CLK_EN2_SET 0x04b8
  167. #define SIRFSOC_CLKC_LEAF_CLK_EN3_SET 0x04d0
  168. #define SIRFSOC_CLKC_LEAF_CLK_EN4_SET 0x04e8
  169. #define SIRFSOC_CLKC_LEAF_CLK_EN5_SET 0x0500
  170. #define SIRFSOC_CLKC_LEAF_CLK_EN6_SET 0x0518
  171. #define SIRFSOC_CLKC_LEAF_CLK_EN7_SET 0x0530
  172. #define SIRFSOC_CLKC_LEAF_CLK_EN8_SET 0x0548
  173. static void __iomem *sirfsoc_clk_vbase;
  174. static struct clk_onecell_data clk_data;
  175. static const struct clk_div_table pll_div_table[] = {
  176. { .val = 0, .div = 1 },
  177. { .val = 1, .div = 2 },
  178. { .val = 2, .div = 4 },
  179. { .val = 3, .div = 8 },
  180. { .val = 4, .div = 16 },
  181. { .val = 5, .div = 32 },
  182. };
  183. struct clk_pll {
  184. struct clk_hw hw;
  185. u16 regofs; /* register offset */
  186. };
  187. #define to_pllclk(_hw) container_of(_hw, struct clk_pll, hw)
  188. struct clk_dto {
  189. struct clk_hw hw;
  190. u16 inc_offset; /* dto increment offset */
  191. u16 src_offset; /* dto src offset */
  192. };
  193. #define to_dtoclk(_hw) container_of(_hw, struct clk_dto, hw)
  194. struct clk_unit {
  195. struct clk_hw hw;
  196. u16 regofs;
  197. u16 bit;
  198. spinlock_t *lock;
  199. };
  200. #define to_unitclk(_hw) container_of(_hw, struct clk_unit, hw)
  201. struct atlas7_div_init_data {
  202. const char *div_name;
  203. const char *parent_name;
  204. const char *gate_name;
  205. unsigned long flags;
  206. u8 divider_flags;
  207. u8 gate_flags;
  208. u32 div_offset;
  209. u8 shift;
  210. u8 width;
  211. u32 gate_offset;
  212. u8 gate_bit;
  213. spinlock_t *lock;
  214. };
  215. struct atlas7_mux_init_data {
  216. const char *mux_name;
  217. const char * const *parent_names;
  218. u8 parent_num;
  219. unsigned long flags;
  220. u8 mux_flags;
  221. u32 mux_offset;
  222. u8 shift;
  223. u8 width;
  224. };
  225. struct atlas7_unit_init_data {
  226. u32 index;
  227. const char *unit_name;
  228. const char *parent_name;
  229. unsigned long flags;
  230. u32 regofs;
  231. u8 bit;
  232. spinlock_t *lock;
  233. };
  234. struct atlas7_reset_desc {
  235. const char *name;
  236. u32 clk_ofs;
  237. u8 clk_bit;
  238. u32 rst_ofs;
  239. u8 rst_bit;
  240. spinlock_t *lock;
  241. };
  242. static DEFINE_SPINLOCK(cpupll_ctrl1_lock);
  243. static DEFINE_SPINLOCK(mempll_ctrl1_lock);
  244. static DEFINE_SPINLOCK(sys0pll_ctrl1_lock);
  245. static DEFINE_SPINLOCK(sys1pll_ctrl1_lock);
  246. static DEFINE_SPINLOCK(sys2pll_ctrl1_lock);
  247. static DEFINE_SPINLOCK(sys3pll_ctrl1_lock);
  248. static DEFINE_SPINLOCK(usbphy_div_lock);
  249. static DEFINE_SPINLOCK(btss_div_lock);
  250. static DEFINE_SPINLOCK(rgmii_div_lock);
  251. static DEFINE_SPINLOCK(cpu_div_lock);
  252. static DEFINE_SPINLOCK(sdphy01_div_lock);
  253. static DEFINE_SPINLOCK(sdphy23_div_lock);
  254. static DEFINE_SPINLOCK(sdphy45_div_lock);
  255. static DEFINE_SPINLOCK(sdphy67_div_lock);
  256. static DEFINE_SPINLOCK(can_div_lock);
  257. static DEFINE_SPINLOCK(deint_div_lock);
  258. static DEFINE_SPINLOCK(nand_div_lock);
  259. static DEFINE_SPINLOCK(disp0_div_lock);
  260. static DEFINE_SPINLOCK(disp1_div_lock);
  261. static DEFINE_SPINLOCK(gpu_div_lock);
  262. static DEFINE_SPINLOCK(gnss_div_lock);
  263. /* gate register shared */
  264. static DEFINE_SPINLOCK(share_div_lock);
  265. static DEFINE_SPINLOCK(root0_gate_lock);
  266. static DEFINE_SPINLOCK(root1_gate_lock);
  267. static DEFINE_SPINLOCK(leaf0_gate_lock);
  268. static DEFINE_SPINLOCK(leaf1_gate_lock);
  269. static DEFINE_SPINLOCK(leaf2_gate_lock);
  270. static DEFINE_SPINLOCK(leaf3_gate_lock);
  271. static DEFINE_SPINLOCK(leaf4_gate_lock);
  272. static DEFINE_SPINLOCK(leaf5_gate_lock);
  273. static DEFINE_SPINLOCK(leaf6_gate_lock);
  274. static DEFINE_SPINLOCK(leaf7_gate_lock);
  275. static DEFINE_SPINLOCK(leaf8_gate_lock);
  276. static inline unsigned long clkc_readl(unsigned reg)
  277. {
  278. return readl(sirfsoc_clk_vbase + reg);
  279. }
  280. static inline void clkc_writel(u32 val, unsigned reg)
  281. {
  282. writel(val, sirfsoc_clk_vbase + reg);
  283. }
  284. /*
  285. * ABPLL
  286. * integer mode: Fvco = Fin * 2 * NF / NR
  287. * Spread Spectrum mode: Fvco = Fin * SSN / NR
  288. * SSN = 2^24 / (256 * ((ssdiv >> ssdepth) << ssdepth) + (ssmod << ssdepth))
  289. */
  290. static unsigned long pll_clk_recalc_rate(struct clk_hw *hw,
  291. unsigned long parent_rate)
  292. {
  293. unsigned long fin = parent_rate;
  294. struct clk_pll *clk = to_pllclk(hw);
  295. u64 rate;
  296. u32 regctrl0 = clkc_readl(clk->regofs + SIRFSOC_CLKC_MEMPLL_AB_CTRL0 -
  297. SIRFSOC_CLKC_MEMPLL_AB_FREQ);
  298. u32 regfreq = clkc_readl(clk->regofs);
  299. u32 regssc = clkc_readl(clk->regofs + SIRFSOC_CLKC_MEMPLL_AB_SSC -
  300. SIRFSOC_CLKC_MEMPLL_AB_FREQ);
  301. u32 nr = (regfreq >> 16 & (BIT(3) - 1)) + 1;
  302. u32 nf = (regfreq & (BIT(9) - 1)) + 1;
  303. u32 ssdiv = regssc >> 8 & (BIT(12) - 1);
  304. u32 ssdepth = regssc >> 20 & (BIT(2) - 1);
  305. u32 ssmod = regssc & (BIT(8) - 1);
  306. if (regctrl0 & SIRFSOC_ABPLL_CTRL0_BYPASS)
  307. return fin;
  308. if (regctrl0 & SIRFSOC_ABPLL_CTRL0_SSEN) {
  309. rate = fin;
  310. rate *= 1 << 24;
  311. do_div(rate, nr);
  312. do_div(rate, (256 * ((ssdiv >> ssdepth) << ssdepth)
  313. + (ssmod << ssdepth)));
  314. } else {
  315. rate = 2 * fin;
  316. rate *= nf;
  317. do_div(rate, nr);
  318. }
  319. return rate;
  320. }
  321. static const struct clk_ops ab_pll_ops = {
  322. .recalc_rate = pll_clk_recalc_rate,
  323. };
  324. static const char * const pll_clk_parents[] = {
  325. "xin",
  326. };
  327. static struct clk_init_data clk_cpupll_init = {
  328. .name = "cpupll_vco",
  329. .ops = &ab_pll_ops,
  330. .parent_names = pll_clk_parents,
  331. .num_parents = ARRAY_SIZE(pll_clk_parents),
  332. };
  333. static struct clk_pll clk_cpupll = {
  334. .regofs = SIRFSOC_CLKC_CPUPLL_AB_FREQ,
  335. .hw = {
  336. .init = &clk_cpupll_init,
  337. },
  338. };
  339. static struct clk_init_data clk_mempll_init = {
  340. .name = "mempll_vco",
  341. .ops = &ab_pll_ops,
  342. .parent_names = pll_clk_parents,
  343. .num_parents = ARRAY_SIZE(pll_clk_parents),
  344. };
  345. static struct clk_pll clk_mempll = {
  346. .regofs = SIRFSOC_CLKC_MEMPLL_AB_FREQ,
  347. .hw = {
  348. .init = &clk_mempll_init,
  349. },
  350. };
  351. static struct clk_init_data clk_sys0pll_init = {
  352. .name = "sys0pll_vco",
  353. .ops = &ab_pll_ops,
  354. .parent_names = pll_clk_parents,
  355. .num_parents = ARRAY_SIZE(pll_clk_parents),
  356. };
  357. static struct clk_pll clk_sys0pll = {
  358. .regofs = SIRFSOC_CLKC_SYS0PLL_AB_FREQ,
  359. .hw = {
  360. .init = &clk_sys0pll_init,
  361. },
  362. };
  363. static struct clk_init_data clk_sys1pll_init = {
  364. .name = "sys1pll_vco",
  365. .ops = &ab_pll_ops,
  366. .parent_names = pll_clk_parents,
  367. .num_parents = ARRAY_SIZE(pll_clk_parents),
  368. };
  369. static struct clk_pll clk_sys1pll = {
  370. .regofs = SIRFSOC_CLKC_SYS1PLL_AB_FREQ,
  371. .hw = {
  372. .init = &clk_sys1pll_init,
  373. },
  374. };
  375. static struct clk_init_data clk_sys2pll_init = {
  376. .name = "sys2pll_vco",
  377. .ops = &ab_pll_ops,
  378. .parent_names = pll_clk_parents,
  379. .num_parents = ARRAY_SIZE(pll_clk_parents),
  380. };
  381. static struct clk_pll clk_sys2pll = {
  382. .regofs = SIRFSOC_CLKC_SYS2PLL_AB_FREQ,
  383. .hw = {
  384. .init = &clk_sys2pll_init,
  385. },
  386. };
  387. static struct clk_init_data clk_sys3pll_init = {
  388. .name = "sys3pll_vco",
  389. .ops = &ab_pll_ops,
  390. .parent_names = pll_clk_parents,
  391. .num_parents = ARRAY_SIZE(pll_clk_parents),
  392. };
  393. static struct clk_pll clk_sys3pll = {
  394. .regofs = SIRFSOC_CLKC_SYS3PLL_AB_FREQ,
  395. .hw = {
  396. .init = &clk_sys3pll_init,
  397. },
  398. };
  399. /*
  400. * DTO in clkc, default enable double resolution mode
  401. * double resolution mode:fout = fin * finc / 2^29
  402. * normal mode:fout = fin * finc / 2^28
  403. */
  404. #define DTO_RESL_DOUBLE (1ULL << 29)
  405. #define DTO_RESL_NORMAL (1ULL << 28)
  406. static int dto_clk_is_enabled(struct clk_hw *hw)
  407. {
  408. struct clk_dto *clk = to_dtoclk(hw);
  409. int reg;
  410. reg = clk->src_offset + SIRFSOC_CLKC_AUDIO_DTO_ENA - SIRFSOC_CLKC_AUDIO_DTO_SRC;
  411. return !!(clkc_readl(reg) & BIT(0));
  412. }
  413. static int dto_clk_enable(struct clk_hw *hw)
  414. {
  415. u32 val, reg;
  416. struct clk_dto *clk = to_dtoclk(hw);
  417. reg = clk->src_offset + SIRFSOC_CLKC_AUDIO_DTO_ENA - SIRFSOC_CLKC_AUDIO_DTO_SRC;
  418. val = clkc_readl(reg) | BIT(0);
  419. clkc_writel(val, reg);
  420. return 0;
  421. }
  422. static void dto_clk_disable(struct clk_hw *hw)
  423. {
  424. u32 val, reg;
  425. struct clk_dto *clk = to_dtoclk(hw);
  426. reg = clk->src_offset + SIRFSOC_CLKC_AUDIO_DTO_ENA - SIRFSOC_CLKC_AUDIO_DTO_SRC;
  427. val = clkc_readl(reg) & ~BIT(0);
  428. clkc_writel(val, reg);
  429. }
  430. static unsigned long dto_clk_recalc_rate(struct clk_hw *hw,
  431. unsigned long parent_rate)
  432. {
  433. u64 rate = parent_rate;
  434. struct clk_dto *clk = to_dtoclk(hw);
  435. u32 finc = clkc_readl(clk->inc_offset);
  436. u32 droff = clkc_readl(clk->src_offset + SIRFSOC_CLKC_AUDIO_DTO_DROFF - SIRFSOC_CLKC_AUDIO_DTO_SRC);
  437. rate *= finc;
  438. if (droff & BIT(0))
  439. /* Double resolution off */
  440. do_div(rate, DTO_RESL_NORMAL);
  441. else
  442. do_div(rate, DTO_RESL_DOUBLE);
  443. return rate;
  444. }
  445. static long dto_clk_round_rate(struct clk_hw *hw, unsigned long rate,
  446. unsigned long *parent_rate)
  447. {
  448. u64 dividend = rate * DTO_RESL_DOUBLE;
  449. do_div(dividend, *parent_rate);
  450. dividend *= *parent_rate;
  451. do_div(dividend, DTO_RESL_DOUBLE);
  452. return dividend;
  453. }
  454. static int dto_clk_set_rate(struct clk_hw *hw, unsigned long rate,
  455. unsigned long parent_rate)
  456. {
  457. u64 dividend = rate * DTO_RESL_DOUBLE;
  458. struct clk_dto *clk = to_dtoclk(hw);
  459. do_div(dividend, parent_rate);
  460. clkc_writel(0, clk->src_offset + SIRFSOC_CLKC_AUDIO_DTO_DROFF - SIRFSOC_CLKC_AUDIO_DTO_SRC);
  461. clkc_writel(dividend, clk->inc_offset);
  462. return 0;
  463. }
  464. static u8 dto_clk_get_parent(struct clk_hw *hw)
  465. {
  466. struct clk_dto *clk = to_dtoclk(hw);
  467. return clkc_readl(clk->src_offset);
  468. }
  469. /*
  470. * dto need CLK_SET_PARENT_GATE
  471. */
  472. static int dto_clk_set_parent(struct clk_hw *hw, u8 index)
  473. {
  474. struct clk_dto *clk = to_dtoclk(hw);
  475. clkc_writel(index, clk->src_offset);
  476. return 0;
  477. }
  478. static const struct clk_ops dto_ops = {
  479. .is_enabled = dto_clk_is_enabled,
  480. .enable = dto_clk_enable,
  481. .disable = dto_clk_disable,
  482. .recalc_rate = dto_clk_recalc_rate,
  483. .round_rate = dto_clk_round_rate,
  484. .set_rate = dto_clk_set_rate,
  485. .get_parent = dto_clk_get_parent,
  486. .set_parent = dto_clk_set_parent,
  487. };
  488. /* dto parent clock as syspllvco/clk1 */
  489. static const char * const audiodto_clk_parents[] = {
  490. "sys0pll_clk1",
  491. "sys1pll_clk1",
  492. "sys3pll_clk1",
  493. };
  494. static struct clk_init_data clk_audiodto_init = {
  495. .name = "audio_dto",
  496. .ops = &dto_ops,
  497. .parent_names = audiodto_clk_parents,
  498. .num_parents = ARRAY_SIZE(audiodto_clk_parents),
  499. };
  500. static struct clk_dto clk_audio_dto = {
  501. .inc_offset = SIRFSOC_CLKC_AUDIO_DTO_INC,
  502. .src_offset = SIRFSOC_CLKC_AUDIO_DTO_SRC,
  503. .hw = {
  504. .init = &clk_audiodto_init,
  505. },
  506. };
  507. static const char * const disp0dto_clk_parents[] = {
  508. "sys0pll_clk1",
  509. "sys1pll_clk1",
  510. "sys3pll_clk1",
  511. };
  512. static struct clk_init_data clk_disp0dto_init = {
  513. .name = "disp0_dto",
  514. .ops = &dto_ops,
  515. .parent_names = disp0dto_clk_parents,
  516. .num_parents = ARRAY_SIZE(disp0dto_clk_parents),
  517. };
  518. static struct clk_dto clk_disp0_dto = {
  519. .inc_offset = SIRFSOC_CLKC_DISP0_DTO_INC,
  520. .src_offset = SIRFSOC_CLKC_DISP0_DTO_SRC,
  521. .hw = {
  522. .init = &clk_disp0dto_init,
  523. },
  524. };
  525. static const char * const disp1dto_clk_parents[] = {
  526. "sys0pll_clk1",
  527. "sys1pll_clk1",
  528. "sys3pll_clk1",
  529. };
  530. static struct clk_init_data clk_disp1dto_init = {
  531. .name = "disp1_dto",
  532. .ops = &dto_ops,
  533. .parent_names = disp1dto_clk_parents,
  534. .num_parents = ARRAY_SIZE(disp1dto_clk_parents),
  535. };
  536. static struct clk_dto clk_disp1_dto = {
  537. .inc_offset = SIRFSOC_CLKC_DISP1_DTO_INC,
  538. .src_offset = SIRFSOC_CLKC_DISP1_DTO_SRC,
  539. .hw = {
  540. .init = &clk_disp1dto_init,
  541. },
  542. };
  543. static struct atlas7_div_init_data divider_list[] __initdata = {
  544. /* div_name, parent_name, gate_name, clk_flag, divider_flag, gate_flag, div_offset, shift, wdith, gate_offset, bit_enable, lock */
  545. { "sys0pll_qa1", "sys0pll_fixdiv", "sys0pll_a1", 0, 0, 0, SIRFSOC_CLKC_USBPHY_CLKDIV_CFG, 0, 6, SIRFSOC_CLKC_USBPHY_CLKDIV_ENA, 0, &usbphy_div_lock },
  546. { "sys1pll_qa1", "sys1pll_fixdiv", "sys1pll_a1", 0, 0, 0, SIRFSOC_CLKC_USBPHY_CLKDIV_CFG, 8, 6, SIRFSOC_CLKC_USBPHY_CLKDIV_ENA, 4, &usbphy_div_lock },
  547. { "sys2pll_qa1", "sys2pll_fixdiv", "sys2pll_a1", 0, 0, 0, SIRFSOC_CLKC_USBPHY_CLKDIV_CFG, 16, 6, SIRFSOC_CLKC_USBPHY_CLKDIV_ENA, 8, &usbphy_div_lock },
  548. { "sys3pll_qa1", "sys3pll_fixdiv", "sys3pll_a1", 0, 0, 0, SIRFSOC_CLKC_USBPHY_CLKDIV_CFG, 24, 6, SIRFSOC_CLKC_USBPHY_CLKDIV_ENA, 12, &usbphy_div_lock },
  549. { "sys0pll_qa2", "sys0pll_fixdiv", "sys0pll_a2", 0, 0, 0, SIRFSOC_CLKC_BTSS_CLKDIV_CFG, 0, 6, SIRFSOC_CLKC_BTSS_CLKDIV_ENA, 0, &btss_div_lock },
  550. { "sys1pll_qa2", "sys1pll_fixdiv", "sys1pll_a2", 0, 0, 0, SIRFSOC_CLKC_BTSS_CLKDIV_CFG, 8, 6, SIRFSOC_CLKC_BTSS_CLKDIV_ENA, 4, &btss_div_lock },
  551. { "sys2pll_qa2", "sys2pll_fixdiv", "sys2pll_a2", 0, 0, 0, SIRFSOC_CLKC_BTSS_CLKDIV_CFG, 16, 6, SIRFSOC_CLKC_BTSS_CLKDIV_ENA, 8, &btss_div_lock },
  552. { "sys3pll_qa2", "sys3pll_fixdiv", "sys3pll_a2", 0, 0, 0, SIRFSOC_CLKC_BTSS_CLKDIV_CFG, 24, 6, SIRFSOC_CLKC_BTSS_CLKDIV_ENA, 12, &btss_div_lock },
  553. { "sys0pll_qa3", "sys0pll_fixdiv", "sys0pll_a3", 0, 0, 0, SIRFSOC_CLKC_RGMII_CLKDIV_CFG, 0, 6, SIRFSOC_CLKC_RGMII_CLKDIV_ENA, 0, &rgmii_div_lock },
  554. { "sys1pll_qa3", "sys1pll_fixdiv", "sys1pll_a3", 0, 0, 0, SIRFSOC_CLKC_RGMII_CLKDIV_CFG, 8, 6, SIRFSOC_CLKC_RGMII_CLKDIV_ENA, 4, &rgmii_div_lock },
  555. { "sys2pll_qa3", "sys2pll_fixdiv", "sys2pll_a3", 0, 0, 0, SIRFSOC_CLKC_RGMII_CLKDIV_CFG, 16, 6, SIRFSOC_CLKC_RGMII_CLKDIV_ENA, 8, &rgmii_div_lock },
  556. { "sys3pll_qa3", "sys3pll_fixdiv", "sys3pll_a3", 0, 0, 0, SIRFSOC_CLKC_RGMII_CLKDIV_CFG, 24, 6, SIRFSOC_CLKC_RGMII_CLKDIV_ENA, 12, &rgmii_div_lock },
  557. { "sys0pll_qa4", "sys0pll_fixdiv", "sys0pll_a4", 0, 0, 0, SIRFSOC_CLKC_CPU_CLKDIV_CFG, 0, 6, SIRFSOC_CLKC_CPU_CLKDIV_ENA, 0, &cpu_div_lock },
  558. { "sys1pll_qa4", "sys1pll_fixdiv", "sys1pll_a4", 0, 0, CLK_IGNORE_UNUSED, SIRFSOC_CLKC_CPU_CLKDIV_CFG, 8, 6, SIRFSOC_CLKC_CPU_CLKDIV_ENA, 4, &cpu_div_lock },
  559. { "sys0pll_qa5", "sys0pll_fixdiv", "sys0pll_a5", 0, 0, 0, SIRFSOC_CLKC_SDPHY01_CLKDIV_CFG, 0, 6, SIRFSOC_CLKC_SDPHY01_CLKDIV_ENA, 0, &sdphy01_div_lock },
  560. { "sys1pll_qa5", "sys1pll_fixdiv", "sys1pll_a5", 0, 0, 0, SIRFSOC_CLKC_SDPHY01_CLKDIV_CFG, 8, 6, SIRFSOC_CLKC_SDPHY01_CLKDIV_ENA, 4, &sdphy01_div_lock },
  561. { "sys2pll_qa5", "sys2pll_fixdiv", "sys2pll_a5", 0, 0, 0, SIRFSOC_CLKC_SDPHY01_CLKDIV_CFG, 16, 6, SIRFSOC_CLKC_SDPHY01_CLKDIV_ENA, 8, &sdphy01_div_lock },
  562. { "sys3pll_qa5", "sys3pll_fixdiv", "sys3pll_a5", 0, 0, 0, SIRFSOC_CLKC_SDPHY01_CLKDIV_CFG, 24, 6, SIRFSOC_CLKC_SDPHY01_CLKDIV_ENA, 12, &sdphy01_div_lock },
  563. { "sys0pll_qa6", "sys0pll_fixdiv", "sys0pll_a6", 0, 0, 0, SIRFSOC_CLKC_SDPHY23_CLKDIV_CFG, 0, 6, SIRFSOC_CLKC_SDPHY23_CLKDIV_ENA, 0, &sdphy23_div_lock },
  564. { "sys1pll_qa6", "sys1pll_fixdiv", "sys1pll_a6", 0, 0, 0, SIRFSOC_CLKC_SDPHY23_CLKDIV_CFG, 8, 6, SIRFSOC_CLKC_SDPHY23_CLKDIV_ENA, 4, &sdphy23_div_lock },
  565. { "sys2pll_qa6", "sys2pll_fixdiv", "sys2pll_a6", 0, 0, 0, SIRFSOC_CLKC_SDPHY23_CLKDIV_CFG, 16, 6, SIRFSOC_CLKC_SDPHY23_CLKDIV_ENA, 8, &sdphy23_div_lock },
  566. { "sys3pll_qa6", "sys3pll_fixdiv", "sys3pll_a6", 0, 0, 0, SIRFSOC_CLKC_SDPHY23_CLKDIV_CFG, 24, 6, SIRFSOC_CLKC_SDPHY23_CLKDIV_ENA, 12, &sdphy23_div_lock },
  567. { "sys0pll_qa7", "sys0pll_fixdiv", "sys0pll_a7", 0, 0, 0, SIRFSOC_CLKC_SDPHY45_CLKDIV_CFG, 0, 6, SIRFSOC_CLKC_SDPHY45_CLKDIV_ENA, 0, &sdphy45_div_lock },
  568. { "sys1pll_qa7", "sys1pll_fixdiv", "sys1pll_a7", 0, 0, 0, SIRFSOC_CLKC_SDPHY45_CLKDIV_CFG, 8, 6, SIRFSOC_CLKC_SDPHY45_CLKDIV_ENA, 4, &sdphy45_div_lock },
  569. { "sys2pll_qa7", "sys2pll_fixdiv", "sys2pll_a7", 0, 0, 0, SIRFSOC_CLKC_SDPHY45_CLKDIV_CFG, 16, 6, SIRFSOC_CLKC_SDPHY45_CLKDIV_ENA, 8, &sdphy45_div_lock },
  570. { "sys3pll_qa7", "sys3pll_fixdiv", "sys3pll_a7", 0, 0, 0, SIRFSOC_CLKC_SDPHY45_CLKDIV_CFG, 24, 6, SIRFSOC_CLKC_SDPHY45_CLKDIV_ENA, 12, &sdphy45_div_lock },
  571. { "sys0pll_qa8", "sys0pll_fixdiv", "sys0pll_a8", 0, 0, 0, SIRFSOC_CLKC_SDPHY67_CLKDIV_CFG, 0, 6, SIRFSOC_CLKC_SDPHY67_CLKDIV_ENA, 0, &sdphy67_div_lock },
  572. { "sys1pll_qa8", "sys1pll_fixdiv", "sys1pll_a8", 0, 0, 0, SIRFSOC_CLKC_SDPHY67_CLKDIV_CFG, 8, 6, SIRFSOC_CLKC_SDPHY67_CLKDIV_ENA, 4, &sdphy67_div_lock },
  573. { "sys2pll_qa8", "sys2pll_fixdiv", "sys2pll_a8", 0, 0, 0, SIRFSOC_CLKC_SDPHY67_CLKDIV_CFG, 16, 6, SIRFSOC_CLKC_SDPHY67_CLKDIV_ENA, 8, &sdphy67_div_lock },
  574. { "sys3pll_qa8", "sys3pll_fixdiv", "sys3pll_a8", 0, 0, 0, SIRFSOC_CLKC_SDPHY67_CLKDIV_CFG, 24, 6, SIRFSOC_CLKC_SDPHY67_CLKDIV_ENA, 12, &sdphy67_div_lock },
  575. { "sys0pll_qa9", "sys0pll_fixdiv", "sys0pll_a9", 0, 0, 0, SIRFSOC_CLKC_CAN_CLKDIV_CFG, 0, 6, SIRFSOC_CLKC_CAN_CLKDIV_ENA, 0, &can_div_lock },
  576. { "sys1pll_qa9", "sys1pll_fixdiv", "sys1pll_a9", 0, 0, 0, SIRFSOC_CLKC_CAN_CLKDIV_CFG, 8, 6, SIRFSOC_CLKC_CAN_CLKDIV_ENA, 4, &can_div_lock },
  577. { "sys2pll_qa9", "sys2pll_fixdiv", "sys2pll_a9", 0, 0, 0, SIRFSOC_CLKC_CAN_CLKDIV_CFG, 16, 6, SIRFSOC_CLKC_CAN_CLKDIV_ENA, 8, &can_div_lock },
  578. { "sys3pll_qa9", "sys3pll_fixdiv", "sys3pll_a9", 0, 0, 0, SIRFSOC_CLKC_CAN_CLKDIV_CFG, 24, 6, SIRFSOC_CLKC_CAN_CLKDIV_ENA, 12, &can_div_lock },
  579. { "sys0pll_qa10", "sys0pll_fixdiv", "sys0pll_a10", 0, 0, 0, SIRFSOC_CLKC_DEINT_CLKDIV_CFG, 0, 6, SIRFSOC_CLKC_DEINT_CLKDIV_ENA, 0, &deint_div_lock },
  580. { "sys1pll_qa10", "sys1pll_fixdiv", "sys1pll_a10", 0, 0, 0, SIRFSOC_CLKC_DEINT_CLKDIV_CFG, 8, 6, SIRFSOC_CLKC_DEINT_CLKDIV_ENA, 4, &deint_div_lock },
  581. { "sys2pll_qa10", "sys2pll_fixdiv", "sys2pll_a10", 0, 0, 0, SIRFSOC_CLKC_DEINT_CLKDIV_CFG, 16, 6, SIRFSOC_CLKC_DEINT_CLKDIV_ENA, 8, &deint_div_lock },
  582. { "sys3pll_qa10", "sys3pll_fixdiv", "sys3pll_a10", 0, 0, 0, SIRFSOC_CLKC_DEINT_CLKDIV_CFG, 24, 6, SIRFSOC_CLKC_DEINT_CLKDIV_ENA, 12, &deint_div_lock },
  583. { "sys0pll_qa11", "sys0pll_fixdiv", "sys0pll_a11", 0, 0, 0, SIRFSOC_CLKC_NAND_CLKDIV_CFG, 0, 6, SIRFSOC_CLKC_NAND_CLKDIV_ENA, 0, &nand_div_lock },
  584. { "sys1pll_qa11", "sys1pll_fixdiv", "sys1pll_a11", 0, 0, 0, SIRFSOC_CLKC_NAND_CLKDIV_CFG, 8, 6, SIRFSOC_CLKC_NAND_CLKDIV_ENA, 4, &nand_div_lock },
  585. { "sys2pll_qa11", "sys2pll_fixdiv", "sys2pll_a11", 0, 0, 0, SIRFSOC_CLKC_NAND_CLKDIV_CFG, 16, 6, SIRFSOC_CLKC_NAND_CLKDIV_ENA, 8, &nand_div_lock },
  586. { "sys3pll_qa11", "sys3pll_fixdiv", "sys3pll_a11", 0, 0, 0, SIRFSOC_CLKC_NAND_CLKDIV_CFG, 24, 6, SIRFSOC_CLKC_NAND_CLKDIV_ENA, 12, &nand_div_lock },
  587. { "sys0pll_qa12", "sys0pll_fixdiv", "sys0pll_a12", 0, 0, 0, SIRFSOC_CLKC_DISP0_CLKDIV_CFG, 0, 6, SIRFSOC_CLKC_DISP0_CLKDIV_ENA, 0, &disp0_div_lock },
  588. { "sys1pll_qa12", "sys1pll_fixdiv", "sys1pll_a12", 0, 0, 0, SIRFSOC_CLKC_DISP0_CLKDIV_CFG, 8, 6, SIRFSOC_CLKC_DISP0_CLKDIV_ENA, 4, &disp0_div_lock },
  589. { "sys2pll_qa12", "sys2pll_fixdiv", "sys2pll_a12", 0, 0, 0, SIRFSOC_CLKC_DISP0_CLKDIV_CFG, 16, 6, SIRFSOC_CLKC_DISP0_CLKDIV_ENA, 8, &disp0_div_lock },
  590. { "sys3pll_qa12", "sys3pll_fixdiv", "sys3pll_a12", 0, 0, 0, SIRFSOC_CLKC_DISP0_CLKDIV_CFG, 24, 6, SIRFSOC_CLKC_DISP0_CLKDIV_ENA, 12, &disp0_div_lock },
  591. { "sys0pll_qa13", "sys0pll_fixdiv", "sys0pll_a13", 0, 0, 0, SIRFSOC_CLKC_DISP1_CLKDIV_CFG, 0, 6, SIRFSOC_CLKC_DISP1_CLKDIV_ENA, 0, &disp1_div_lock },
  592. { "sys1pll_qa13", "sys1pll_fixdiv", "sys1pll_a13", 0, 0, 0, SIRFSOC_CLKC_DISP1_CLKDIV_CFG, 8, 6, SIRFSOC_CLKC_DISP1_CLKDIV_ENA, 4, &disp1_div_lock },
  593. { "sys2pll_qa13", "sys2pll_fixdiv", "sys2pll_a13", 0, 0, 0, SIRFSOC_CLKC_DISP1_CLKDIV_CFG, 16, 6, SIRFSOC_CLKC_DISP1_CLKDIV_ENA, 8, &disp1_div_lock },
  594. { "sys3pll_qa13", "sys3pll_fixdiv", "sys3pll_a13", 0, 0, 0, SIRFSOC_CLKC_DISP1_CLKDIV_CFG, 24, 6, SIRFSOC_CLKC_DISP1_CLKDIV_ENA, 12, &disp1_div_lock },
  595. { "sys0pll_qa14", "sys0pll_fixdiv", "sys0pll_a14", 0, 0, 0, SIRFSOC_CLKC_GPU_CLKDIV_CFG, 0, 6, SIRFSOC_CLKC_GPU_CLKDIV_ENA, 0, &gpu_div_lock },
  596. { "sys1pll_qa14", "sys1pll_fixdiv", "sys1pll_a14", 0, 0, 0, SIRFSOC_CLKC_GPU_CLKDIV_CFG, 8, 6, SIRFSOC_CLKC_GPU_CLKDIV_ENA, 4, &gpu_div_lock },
  597. { "sys2pll_qa14", "sys2pll_fixdiv", "sys2pll_a14", 0, 0, 0, SIRFSOC_CLKC_GPU_CLKDIV_CFG, 16, 6, SIRFSOC_CLKC_GPU_CLKDIV_ENA, 8, &gpu_div_lock },
  598. { "sys3pll_qa14", "sys3pll_fixdiv", "sys3pll_a14", 0, 0, 0, SIRFSOC_CLKC_GPU_CLKDIV_CFG, 24, 6, SIRFSOC_CLKC_GPU_CLKDIV_ENA, 12, &gpu_div_lock },
  599. { "sys0pll_qa15", "sys0pll_fixdiv", "sys0pll_a15", 0, 0, 0, SIRFSOC_CLKC_GNSS_CLKDIV_CFG, 0, 6, SIRFSOC_CLKC_GNSS_CLKDIV_ENA, 0, &gnss_div_lock },
  600. { "sys1pll_qa15", "sys1pll_fixdiv", "sys1pll_a15", 0, 0, 0, SIRFSOC_CLKC_GNSS_CLKDIV_CFG, 8, 6, SIRFSOC_CLKC_GNSS_CLKDIV_ENA, 4, &gnss_div_lock },
  601. { "sys2pll_qa15", "sys2pll_fixdiv", "sys2pll_a15", 0, 0, 0, SIRFSOC_CLKC_GNSS_CLKDIV_CFG, 16, 6, SIRFSOC_CLKC_GNSS_CLKDIV_ENA, 8, &gnss_div_lock },
  602. { "sys3pll_qa15", "sys3pll_fixdiv", "sys3pll_a15", 0, 0, 0, SIRFSOC_CLKC_GNSS_CLKDIV_CFG, 24, 6, SIRFSOC_CLKC_GNSS_CLKDIV_ENA, 12, &gnss_div_lock },
  603. { "sys1pll_qa18", "sys1pll_fixdiv", "sys1pll_a18", 0, 0, 0, SIRFSOC_CLKC_SHARED_DIVIDER_CFG0, 24, 6, SIRFSOC_CLKC_SHARED_DIVIDER_ENA, 12, &share_div_lock },
  604. { "sys1pll_qa19", "sys1pll_fixdiv", "sys1pll_a19", 0, 0, CLK_IGNORE_UNUSED, SIRFSOC_CLKC_SHARED_DIVIDER_CFG0, 16, 6, SIRFSOC_CLKC_SHARED_DIVIDER_ENA, 8, &share_div_lock },
  605. { "sys1pll_qa20", "sys1pll_fixdiv", "sys1pll_a20", 0, 0, 0, SIRFSOC_CLKC_SHARED_DIVIDER_CFG0, 8, 6, SIRFSOC_CLKC_SHARED_DIVIDER_ENA, 4, &share_div_lock },
  606. { "sys2pll_qa20", "sys2pll_fixdiv", "sys2pll_a20", 0, 0, 0, SIRFSOC_CLKC_SHARED_DIVIDER_CFG0, 0, 6, SIRFSOC_CLKC_SHARED_DIVIDER_ENA, 0, &share_div_lock },
  607. { "sys1pll_qa17", "sys1pll_fixdiv", "sys1pll_a17", 0, 0, CLK_IGNORE_UNUSED, SIRFSOC_CLKC_SHARED_DIVIDER_CFG1, 8, 6, SIRFSOC_CLKC_SHARED_DIVIDER_ENA, 20, &share_div_lock },
  608. { "sys0pll_qa20", "sys0pll_fixdiv", "sys0pll_a20", 0, 0, 0, SIRFSOC_CLKC_SHARED_DIVIDER_CFG1, 0, 6, SIRFSOC_CLKC_SHARED_DIVIDER_ENA, 16, &share_div_lock },
  609. };
  610. static const char * const i2s_clk_parents[] = {
  611. "xin",
  612. "xinw",
  613. "audio_dto",
  614. /* "pwm_i2s01" */
  615. };
  616. static const char * const usbphy_clk_parents[] = {
  617. "xin",
  618. "xinw",
  619. "sys0pll_a1",
  620. "sys1pll_a1",
  621. "sys2pll_a1",
  622. "sys3pll_a1",
  623. };
  624. static const char * const btss_clk_parents[] = {
  625. "xin",
  626. "xinw",
  627. "sys0pll_a2",
  628. "sys1pll_a2",
  629. "sys2pll_a2",
  630. "sys3pll_a2",
  631. };
  632. static const char * const rgmii_clk_parents[] = {
  633. "xin",
  634. "xinw",
  635. "sys0pll_a3",
  636. "sys1pll_a3",
  637. "sys2pll_a3",
  638. "sys3pll_a3",
  639. };
  640. static const char * const cpu_clk_parents[] = {
  641. "xin",
  642. "xinw",
  643. "sys0pll_a4",
  644. "sys1pll_a4",
  645. "cpupll_clk1",
  646. };
  647. static const char * const sdphy01_clk_parents[] = {
  648. "xin",
  649. "xinw",
  650. "sys0pll_a5",
  651. "sys1pll_a5",
  652. "sys2pll_a5",
  653. "sys3pll_a5",
  654. };
  655. static const char * const sdphy23_clk_parents[] = {
  656. "xin",
  657. "xinw",
  658. "sys0pll_a6",
  659. "sys1pll_a6",
  660. "sys2pll_a6",
  661. "sys3pll_a6",
  662. };
  663. static const char * const sdphy45_clk_parents[] = {
  664. "xin",
  665. "xinw",
  666. "sys0pll_a7",
  667. "sys1pll_a7",
  668. "sys2pll_a7",
  669. "sys3pll_a7",
  670. };
  671. static const char * const sdphy67_clk_parents[] = {
  672. "xin",
  673. "xinw",
  674. "sys0pll_a8",
  675. "sys1pll_a8",
  676. "sys2pll_a8",
  677. "sys3pll_a8",
  678. };
  679. static const char * const can_clk_parents[] = {
  680. "xin",
  681. "xinw",
  682. "sys0pll_a9",
  683. "sys1pll_a9",
  684. "sys2pll_a9",
  685. "sys3pll_a9",
  686. };
  687. static const char * const deint_clk_parents[] = {
  688. "xin",
  689. "xinw",
  690. "sys0pll_a10",
  691. "sys1pll_a10",
  692. "sys2pll_a10",
  693. "sys3pll_a10",
  694. };
  695. static const char * const nand_clk_parents[] = {
  696. "xin",
  697. "xinw",
  698. "sys0pll_a11",
  699. "sys1pll_a11",
  700. "sys2pll_a11",
  701. "sys3pll_a11",
  702. };
  703. static const char * const disp0_clk_parents[] = {
  704. "xin",
  705. "xinw",
  706. "sys0pll_a12",
  707. "sys1pll_a12",
  708. "sys2pll_a12",
  709. "sys3pll_a12",
  710. "disp0_dto",
  711. };
  712. static const char * const disp1_clk_parents[] = {
  713. "xin",
  714. "xinw",
  715. "sys0pll_a13",
  716. "sys1pll_a13",
  717. "sys2pll_a13",
  718. "sys3pll_a13",
  719. "disp1_dto",
  720. };
  721. static const char * const gpu_clk_parents[] = {
  722. "xin",
  723. "xinw",
  724. "sys0pll_a14",
  725. "sys1pll_a14",
  726. "sys2pll_a14",
  727. "sys3pll_a14",
  728. };
  729. static const char * const gnss_clk_parents[] = {
  730. "xin",
  731. "xinw",
  732. "sys0pll_a15",
  733. "sys1pll_a15",
  734. "sys2pll_a15",
  735. "sys3pll_a15",
  736. };
  737. static const char * const sys_clk_parents[] = {
  738. "xin",
  739. "xinw",
  740. "sys2pll_a20",
  741. "sys1pll_a20",
  742. "sys1pll_a19",
  743. "sys1pll_a18",
  744. "sys0pll_a20",
  745. "sys1pll_a17",
  746. };
  747. static const char * const io_clk_parents[] = {
  748. "xin",
  749. "xinw",
  750. "sys2pll_a20",
  751. "sys1pll_a20",
  752. "sys1pll_a19",
  753. "sys1pll_a18",
  754. "sys0pll_a20",
  755. "sys1pll_a17",
  756. };
  757. static const char * const g2d_clk_parents[] = {
  758. "xin",
  759. "xinw",
  760. "sys2pll_a20",
  761. "sys1pll_a20",
  762. "sys1pll_a19",
  763. "sys1pll_a18",
  764. "sys0pll_a20",
  765. "sys1pll_a17",
  766. };
  767. static const char * const jpenc_clk_parents[] = {
  768. "xin",
  769. "xinw",
  770. "sys2pll_a20",
  771. "sys1pll_a20",
  772. "sys1pll_a19",
  773. "sys1pll_a18",
  774. "sys0pll_a20",
  775. "sys1pll_a17",
  776. };
  777. static const char * const vdec_clk_parents[] = {
  778. "xin",
  779. "xinw",
  780. "sys2pll_a20",
  781. "sys1pll_a20",
  782. "sys1pll_a19",
  783. "sys1pll_a18",
  784. "sys0pll_a20",
  785. "sys1pll_a17",
  786. };
  787. static const char * const gmac_clk_parents[] = {
  788. "xin",
  789. "xinw",
  790. "sys2pll_a20",
  791. "sys1pll_a20",
  792. "sys1pll_a19",
  793. "sys1pll_a18",
  794. "sys0pll_a20",
  795. "sys1pll_a17",
  796. };
  797. static const char * const usb_clk_parents[] = {
  798. "xin",
  799. "xinw",
  800. "sys2pll_a20",
  801. "sys1pll_a20",
  802. "sys1pll_a19",
  803. "sys1pll_a18",
  804. "sys0pll_a20",
  805. "sys1pll_a17",
  806. };
  807. static const char * const kas_clk_parents[] = {
  808. "xin",
  809. "xinw",
  810. "sys2pll_a20",
  811. "sys1pll_a20",
  812. "sys1pll_a19",
  813. "sys1pll_a18",
  814. "sys0pll_a20",
  815. "sys1pll_a17",
  816. };
  817. static const char * const sec_clk_parents[] = {
  818. "xin",
  819. "xinw",
  820. "sys2pll_a20",
  821. "sys1pll_a20",
  822. "sys1pll_a19",
  823. "sys1pll_a18",
  824. "sys0pll_a20",
  825. "sys1pll_a17",
  826. };
  827. static const char * const sdr_clk_parents[] = {
  828. "xin",
  829. "xinw",
  830. "sys2pll_a20",
  831. "sys1pll_a20",
  832. "sys1pll_a19",
  833. "sys1pll_a18",
  834. "sys0pll_a20",
  835. "sys1pll_a17",
  836. };
  837. static const char * const vip_clk_parents[] = {
  838. "xin",
  839. "xinw",
  840. "sys2pll_a20",
  841. "sys1pll_a20",
  842. "sys1pll_a19",
  843. "sys1pll_a18",
  844. "sys0pll_a20",
  845. "sys1pll_a17",
  846. };
  847. static const char * const nocd_clk_parents[] = {
  848. "xin",
  849. "xinw",
  850. "sys2pll_a20",
  851. "sys1pll_a20",
  852. "sys1pll_a19",
  853. "sys1pll_a18",
  854. "sys0pll_a20",
  855. "sys1pll_a17",
  856. };
  857. static const char * const nocr_clk_parents[] = {
  858. "xin",
  859. "xinw",
  860. "sys2pll_a20",
  861. "sys1pll_a20",
  862. "sys1pll_a19",
  863. "sys1pll_a18",
  864. "sys0pll_a20",
  865. "sys1pll_a17",
  866. };
  867. static const char * const tpiu_clk_parents[] = {
  868. "xin",
  869. "xinw",
  870. "sys2pll_a20",
  871. "sys1pll_a20",
  872. "sys1pll_a19",
  873. "sys1pll_a18",
  874. "sys0pll_a20",
  875. "sys1pll_a17",
  876. };
  877. static struct atlas7_mux_init_data mux_list[] __initdata = {
  878. /* mux_name, parent_names, parent_num, flags, mux_flags, mux_offset, shift, width */
  879. { "i2s_mux", i2s_clk_parents, ARRAY_SIZE(i2s_clk_parents), 0, 0, SIRFSOC_CLKC_I2S_CLK_SEL, 0, 2 },
  880. { "usbphy_mux", usbphy_clk_parents, ARRAY_SIZE(usbphy_clk_parents), 0, 0, SIRFSOC_CLKC_I2S_CLK_SEL, 0, 3 },
  881. { "btss_mux", btss_clk_parents, ARRAY_SIZE(btss_clk_parents), 0, 0, SIRFSOC_CLKC_BTSS_CLK_SEL, 0, 3 },
  882. { "rgmii_mux", rgmii_clk_parents, ARRAY_SIZE(rgmii_clk_parents), 0, 0, SIRFSOC_CLKC_RGMII_CLK_SEL, 0, 3 },
  883. { "cpu_mux", cpu_clk_parents, ARRAY_SIZE(cpu_clk_parents), 0, 0, SIRFSOC_CLKC_CPU_CLK_SEL, 0, 3 },
  884. { "sdphy01_mux", sdphy01_clk_parents, ARRAY_SIZE(sdphy01_clk_parents), 0, 0, SIRFSOC_CLKC_SDPHY01_CLK_SEL, 0, 3 },
  885. { "sdphy23_mux", sdphy23_clk_parents, ARRAY_SIZE(sdphy23_clk_parents), 0, 0, SIRFSOC_CLKC_SDPHY23_CLK_SEL, 0, 3 },
  886. { "sdphy45_mux", sdphy45_clk_parents, ARRAY_SIZE(sdphy45_clk_parents), 0, 0, SIRFSOC_CLKC_SDPHY45_CLK_SEL, 0, 3 },
  887. { "sdphy67_mux", sdphy67_clk_parents, ARRAY_SIZE(sdphy67_clk_parents), 0, 0, SIRFSOC_CLKC_SDPHY67_CLK_SEL, 0, 3 },
  888. { "can_mux", can_clk_parents, ARRAY_SIZE(can_clk_parents), 0, 0, SIRFSOC_CLKC_CAN_CLK_SEL, 0, 3 },
  889. { "deint_mux", deint_clk_parents, ARRAY_SIZE(deint_clk_parents), 0, 0, SIRFSOC_CLKC_DEINT_CLK_SEL, 0, 3 },
  890. { "nand_mux", nand_clk_parents, ARRAY_SIZE(nand_clk_parents), 0, 0, SIRFSOC_CLKC_NAND_CLK_SEL, 0, 3 },
  891. { "disp0_mux", disp0_clk_parents, ARRAY_SIZE(disp0_clk_parents), 0, 0, SIRFSOC_CLKC_DISP0_CLK_SEL, 0, 3 },
  892. { "disp1_mux", disp1_clk_parents, ARRAY_SIZE(disp1_clk_parents), 0, 0, SIRFSOC_CLKC_DISP1_CLK_SEL, 0, 3 },
  893. { "gpu_mux", gpu_clk_parents, ARRAY_SIZE(gpu_clk_parents), 0, 0, SIRFSOC_CLKC_GPU_CLK_SEL, 0, 3 },
  894. { "gnss_mux", gnss_clk_parents, ARRAY_SIZE(gnss_clk_parents), 0, 0, SIRFSOC_CLKC_GNSS_CLK_SEL, 0, 3 },
  895. { "sys_mux", sys_clk_parents, ARRAY_SIZE(sys_clk_parents), 0, 0, SIRFSOC_CLKC_SYS_CLK_SEL, 0, 3 },
  896. { "io_mux", io_clk_parents, ARRAY_SIZE(io_clk_parents), 0, 0, SIRFSOC_CLKC_IO_CLK_SEL, 0, 3 },
  897. { "g2d_mux", g2d_clk_parents, ARRAY_SIZE(g2d_clk_parents), 0, 0, SIRFSOC_CLKC_G2D_CLK_SEL, 0, 3 },
  898. { "jpenc_mux", jpenc_clk_parents, ARRAY_SIZE(jpenc_clk_parents), 0, 0, SIRFSOC_CLKC_JPENC_CLK_SEL, 0, 3 },
  899. { "vdec_mux", vdec_clk_parents, ARRAY_SIZE(vdec_clk_parents), 0, 0, SIRFSOC_CLKC_VDEC_CLK_SEL, 0, 3 },
  900. { "gmac_mux", gmac_clk_parents, ARRAY_SIZE(gmac_clk_parents), 0, 0, SIRFSOC_CLKC_GMAC_CLK_SEL, 0, 3 },
  901. { "usb_mux", usb_clk_parents, ARRAY_SIZE(usb_clk_parents), 0, 0, SIRFSOC_CLKC_USB_CLK_SEL, 0, 3 },
  902. { "kas_mux", kas_clk_parents, ARRAY_SIZE(kas_clk_parents), 0, 0, SIRFSOC_CLKC_KAS_CLK_SEL, 0, 3 },
  903. { "sec_mux", sec_clk_parents, ARRAY_SIZE(sec_clk_parents), 0, 0, SIRFSOC_CLKC_SEC_CLK_SEL, 0, 3 },
  904. { "sdr_mux", sdr_clk_parents, ARRAY_SIZE(sdr_clk_parents), 0, 0, SIRFSOC_CLKC_SDR_CLK_SEL, 0, 3 },
  905. { "vip_mux", vip_clk_parents, ARRAY_SIZE(vip_clk_parents), 0, 0, SIRFSOC_CLKC_VIP_CLK_SEL, 0, 3 },
  906. { "nocd_mux", nocd_clk_parents, ARRAY_SIZE(nocd_clk_parents), 0, 0, SIRFSOC_CLKC_NOCD_CLK_SEL, 0, 3 },
  907. { "nocr_mux", nocr_clk_parents, ARRAY_SIZE(nocr_clk_parents), 0, 0, SIRFSOC_CLKC_NOCR_CLK_SEL, 0, 3 },
  908. { "tpiu_mux", tpiu_clk_parents, ARRAY_SIZE(tpiu_clk_parents), 0, 0, SIRFSOC_CLKC_TPIU_CLK_SEL, 0, 3 },
  909. };
  910. /* new unit should add start from the tail of list */
  911. static struct atlas7_unit_init_data unit_list[] __initdata = {
  912. /* unit_name, parent_name, flags, regofs, bit, lock */
  913. { 0, "audmscm_kas", "kas_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 0, &root0_gate_lock },
  914. { 1, "gnssm_gnss", "gnss_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 1, &root0_gate_lock },
  915. { 2, "gpum_gpu", "gpu_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 2, &root0_gate_lock },
  916. { 3, "mediam_g2d", "g2d_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 3, &root0_gate_lock },
  917. { 4, "mediam_jpenc", "jpenc_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 4, &root0_gate_lock },
  918. { 5, "vdifm_disp0", "disp0_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 5, &root0_gate_lock },
  919. { 6, "vdifm_disp1", "disp1_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 6, &root0_gate_lock },
  920. { 7, "audmscm_i2s", "i2s_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 8, &root0_gate_lock },
  921. { 8, "audmscm_io", "io_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 11, &root0_gate_lock },
  922. { 9, "vdifm_io", "io_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 12, &root0_gate_lock },
  923. { 10, "gnssm_io", "io_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 13, &root0_gate_lock },
  924. { 11, "mediam_io", "io_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 14, &root0_gate_lock },
  925. { 12, "btm_io", "io_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 17, &root0_gate_lock },
  926. { 13, "mediam_sdphy01", "sdphy01_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 18, &root0_gate_lock },
  927. { 14, "vdifm_sdphy23", "sdphy23_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 19, &root0_gate_lock },
  928. { 15, "vdifm_sdphy45", "sdphy45_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 20, &root0_gate_lock },
  929. { 16, "vdifm_sdphy67", "sdphy67_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 21, &root0_gate_lock },
  930. { 17, "audmscm_xin", "xin", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 22, &root0_gate_lock },
  931. { 18, "mediam_nand", "nand_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 27, &root0_gate_lock },
  932. { 19, "gnssm_sec", "sec_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 28, &root0_gate_lock },
  933. { 20, "cpum_cpu", "cpu_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 29, &root0_gate_lock },
  934. { 21, "gnssm_xin", "xin", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 30, &root0_gate_lock },
  935. { 22, "vdifm_vip", "vip_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN0_SET, 31, &root0_gate_lock },
  936. { 23, "btm_btss", "btss_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 0, &root1_gate_lock },
  937. { 24, "mediam_usbphy", "usbphy_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 1, &root1_gate_lock },
  938. { 25, "rtcm_kas", "kas_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 2, &root1_gate_lock },
  939. { 26, "audmscm_nocd", "nocd_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 3, &root1_gate_lock },
  940. { 27, "vdifm_nocd", "nocd_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 4, &root1_gate_lock },
  941. { 28, "gnssm_nocd", "nocd_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 5, &root1_gate_lock },
  942. { 29, "mediam_nocd", "nocd_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 6, &root1_gate_lock },
  943. { 30, "cpum_nocd", "nocd_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 8, &root1_gate_lock },
  944. { 31, "gpum_nocd", "nocd_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 9, &root1_gate_lock },
  945. { 32, "audmscm_nocr", "nocr_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 11, &root1_gate_lock },
  946. { 33, "vdifm_nocr", "nocr_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 12, &root1_gate_lock },
  947. { 34, "gnssm_nocr", "nocr_mux", CLK_IGNORE_UNUSED, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 13, &root1_gate_lock },
  948. { 35, "mediam_nocr", "nocr_mux", CLK_IGNORE_UNUSED, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 14, &root1_gate_lock },
  949. { 36, "ddrm_nocr", "nocr_mux", CLK_IGNORE_UNUSED, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 15, &root1_gate_lock },
  950. { 37, "cpum_tpiu", "tpiu_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 16, &root1_gate_lock },
  951. { 38, "gpum_nocr", "nocr_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 17, &root1_gate_lock },
  952. { 39, "gnssm_rgmii", "rgmii_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 20, &root1_gate_lock },
  953. { 40, "mediam_vdec", "vdec_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 21, &root1_gate_lock },
  954. { 41, "gpum_sdr", "sdr_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 22, &root1_gate_lock },
  955. { 42, "vdifm_deint", "deint_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 23, &root1_gate_lock },
  956. { 43, "gnssm_can", "can_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 26, &root1_gate_lock },
  957. { 44, "mediam_usb", "usb_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 28, &root1_gate_lock },
  958. { 45, "gnssm_gmac", "gmac_mux", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 29, &root1_gate_lock },
  959. { 46, "cvd_io", "audmscm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 0, &leaf1_gate_lock },
  960. { 47, "timer_io", "audmscm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 1, &leaf1_gate_lock },
  961. { 48, "pulse_io", "audmscm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 2, &leaf1_gate_lock },
  962. { 49, "tsc_io", "audmscm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 3, &leaf1_gate_lock },
  963. { 50, "tsc_xin", "audmscm_xin", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 21, &leaf1_gate_lock },
  964. { 51, "ioctop_io", "audmscm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 4, &leaf1_gate_lock },
  965. { 52, "rsc_io", "audmscm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 5, &leaf1_gate_lock },
  966. { 53, "dvm_io", "audmscm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 6, &leaf1_gate_lock },
  967. { 54, "lvds_xin", "audmscm_xin", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 7, &leaf1_gate_lock },
  968. { 55, "kas_kas", "audmscm_kas", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 8, &leaf1_gate_lock },
  969. { 56, "ac97_kas", "audmscm_kas", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 9, &leaf1_gate_lock },
  970. { 57, "usp0_kas", "audmscm_kas", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 10, &leaf1_gate_lock },
  971. { 58, "usp1_kas", "audmscm_kas", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 11, &leaf1_gate_lock },
  972. { 59, "usp2_kas", "audmscm_kas", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 12, &leaf1_gate_lock },
  973. { 60, "dmac2_kas", "audmscm_kas", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 13, &leaf1_gate_lock },
  974. { 61, "dmac3_kas", "audmscm_kas", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 14, &leaf1_gate_lock },
  975. { 62, "audioif_kas", "audmscm_kas", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 15, &leaf1_gate_lock },
  976. { 63, "i2s1_kas", "audmscm_kas", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 17, &leaf1_gate_lock },
  977. { 64, "thaudmscm_io", "audmscm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 22, &leaf1_gate_lock },
  978. { 65, "analogtest_xin", "audmscm_xin", 0, SIRFSOC_CLKC_LEAF_CLK_EN1_SET, 23, &leaf1_gate_lock },
  979. { 66, "sys2pci_io", "vdifm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 0, &leaf2_gate_lock },
  980. { 67, "pciarb_io", "vdifm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 1, &leaf2_gate_lock },
  981. { 68, "pcicopy_io", "vdifm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 2, &leaf2_gate_lock },
  982. { 69, "rom_io", "vdifm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 3, &leaf2_gate_lock },
  983. { 70, "sdio23_io", "vdifm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 4, &leaf2_gate_lock },
  984. { 71, "sdio45_io", "vdifm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 5, &leaf2_gate_lock },
  985. { 72, "sdio67_io", "vdifm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 6, &leaf2_gate_lock },
  986. { 73, "vip1_io", "vdifm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 7, &leaf2_gate_lock },
  987. { 74, "vip1_vip", "vdifm_vip", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 16, &leaf2_gate_lock },
  988. { 75, "sdio23_sdphy23", "vdifm_sdphy23", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 8, &leaf2_gate_lock },
  989. { 76, "sdio45_sdphy45", "vdifm_sdphy45", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 9, &leaf2_gate_lock },
  990. { 77, "sdio67_sdphy67", "vdifm_sdphy67", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 10, &leaf2_gate_lock },
  991. { 78, "vpp0_disp0", "vdifm_disp0", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 11, &leaf2_gate_lock },
  992. { 79, "lcd0_disp0", "vdifm_disp0", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 12, &leaf2_gate_lock },
  993. { 80, "vpp1_disp1", "vdifm_disp1", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 13, &leaf2_gate_lock },
  994. { 81, "lcd1_disp1", "vdifm_disp1", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 14, &leaf2_gate_lock },
  995. { 82, "dcu_deint", "vdifm_deint", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 15, &leaf2_gate_lock },
  996. { 83, "vdifm_dapa_r_nocr", "vdifm_nocr", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 17, &leaf2_gate_lock },
  997. { 84, "gpio1_io", "vdifm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 18, &leaf2_gate_lock },
  998. { 85, "thvdifm_io", "vdifm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN2_SET, 19, &leaf2_gate_lock },
  999. { 86, "gmac_rgmii", "gnssm_rgmii", 0, SIRFSOC_CLKC_LEAF_CLK_EN3_SET, 0, &leaf3_gate_lock },
  1000. { 87, "gmac_gmac", "gnssm_gmac", 0, SIRFSOC_CLKC_LEAF_CLK_EN3_SET, 1, &leaf3_gate_lock },
  1001. { 88, "uart1_io", "gnssm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN3_SET, 2, &leaf3_gate_lock },
  1002. { 89, "dmac0_io", "gnssm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN3_SET, 3, &leaf3_gate_lock },
  1003. { 90, "uart0_io", "gnssm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN3_SET, 4, &leaf3_gate_lock },
  1004. { 91, "uart2_io", "gnssm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN3_SET, 5, &leaf3_gate_lock },
  1005. { 92, "uart3_io", "gnssm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN3_SET, 6, &leaf3_gate_lock },
  1006. { 93, "uart4_io", "gnssm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN3_SET, 7, &leaf3_gate_lock },
  1007. { 94, "uart5_io", "gnssm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN3_SET, 8, &leaf3_gate_lock },
  1008. { 95, "spi1_io", "gnssm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN3_SET, 9, &leaf3_gate_lock },
  1009. { 96, "gnss_gnss", "gnssm_gnss", 0, SIRFSOC_CLKC_LEAF_CLK_EN3_SET, 10, &leaf3_gate_lock },
  1010. { 97, "canbus1_can", "gnssm_can", 0, SIRFSOC_CLKC_LEAF_CLK_EN3_SET, 12, &leaf3_gate_lock },
  1011. { 98, "ccsec_sec", "gnssm_sec", 0, SIRFSOC_CLKC_LEAF_CLK_EN3_SET, 15, &leaf3_gate_lock },
  1012. { 99, "ccpub_sec", "gnssm_sec", 0, SIRFSOC_CLKC_LEAF_CLK_EN3_SET, 16, &leaf3_gate_lock },
  1013. { 100, "gnssm_dapa_r_nocr", "gnssm_nocr", 0, SIRFSOC_CLKC_LEAF_CLK_EN3_SET, 13, &leaf3_gate_lock },
  1014. { 101, "thgnssm_io", "gnssm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN3_SET, 14, &leaf3_gate_lock },
  1015. { 102, "media_vdec", "mediam_vdec", 0, SIRFSOC_CLKC_LEAF_CLK_EN4_SET, 0, &leaf4_gate_lock },
  1016. { 103, "media_jpenc", "mediam_jpenc", 0, SIRFSOC_CLKC_LEAF_CLK_EN4_SET, 1, &leaf4_gate_lock },
  1017. { 104, "g2d_g2d", "mediam_g2d", 0, SIRFSOC_CLKC_LEAF_CLK_EN4_SET, 2, &leaf4_gate_lock },
  1018. { 105, "i2c0_io", "mediam_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN4_SET, 3, &leaf4_gate_lock },
  1019. { 106, "i2c1_io", "mediam_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN4_SET, 4, &leaf4_gate_lock },
  1020. { 107, "gpio0_io", "mediam_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN4_SET, 5, &leaf4_gate_lock },
  1021. { 108, "nand_io", "mediam_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN4_SET, 6, &leaf4_gate_lock },
  1022. { 109, "sdio01_io", "mediam_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN4_SET, 7, &leaf4_gate_lock },
  1023. { 110, "sys2pci2_io", "mediam_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN4_SET, 8, &leaf4_gate_lock },
  1024. { 111, "sdio01_sdphy01", "mediam_sdphy01", 0, SIRFSOC_CLKC_LEAF_CLK_EN4_SET, 9, &leaf4_gate_lock },
  1025. { 112, "nand_nand", "mediam_nand", 0, SIRFSOC_CLKC_LEAF_CLK_EN4_SET, 10, &leaf4_gate_lock },
  1026. { 113, "usb0_usb", "mediam_usb", 0, SIRFSOC_CLKC_LEAF_CLK_EN4_SET, 11, &leaf4_gate_lock },
  1027. { 114, "usb1_usb", "mediam_usb", 0, SIRFSOC_CLKC_LEAF_CLK_EN4_SET, 12, &leaf4_gate_lock },
  1028. { 115, "usbphy0_usbphy", "mediam_usbphy", 0, SIRFSOC_CLKC_LEAF_CLK_EN4_SET, 13, &leaf4_gate_lock },
  1029. { 116, "usbphy1_usbphy", "mediam_usbphy", 0, SIRFSOC_CLKC_LEAF_CLK_EN4_SET, 14, &leaf4_gate_lock },
  1030. { 117, "thmediam_io", "mediam_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN4_SET, 15, &leaf4_gate_lock },
  1031. { 118, "memc_mem", "mempll_clk1", CLK_IGNORE_UNUSED, SIRFSOC_CLKC_LEAF_CLK_EN5_SET, 0, &leaf5_gate_lock },
  1032. { 119, "dapa_mem", "mempll_clk1", 0, SIRFSOC_CLKC_LEAF_CLK_EN5_SET, 1, &leaf5_gate_lock },
  1033. { 120, "nocddrm_nocr", "ddrm_nocr", 0, SIRFSOC_CLKC_LEAF_CLK_EN5_SET, 2, &leaf5_gate_lock },
  1034. { 121, "thddrm_nocr", "ddrm_nocr", 0, SIRFSOC_CLKC_LEAF_CLK_EN5_SET, 3, &leaf5_gate_lock },
  1035. { 122, "spram1_cpudiv2", "cpum_cpu", 0, SIRFSOC_CLKC_LEAF_CLK_EN6_SET, 0, &leaf6_gate_lock },
  1036. { 123, "spram2_cpudiv2", "cpum_cpu", 0, SIRFSOC_CLKC_LEAF_CLK_EN6_SET, 1, &leaf6_gate_lock },
  1037. { 124, "coresight_cpudiv2", "cpum_cpu", 0, SIRFSOC_CLKC_LEAF_CLK_EN6_SET, 2, &leaf6_gate_lock },
  1038. { 125, "coresight_tpiu", "cpum_tpiu", 0, SIRFSOC_CLKC_LEAF_CLK_EN6_SET, 3, &leaf6_gate_lock },
  1039. { 126, "graphic_gpu", "gpum_gpu", 0, SIRFSOC_CLKC_LEAF_CLK_EN7_SET, 0, &leaf7_gate_lock },
  1040. { 127, "vss_sdr", "gpum_sdr", 0, SIRFSOC_CLKC_LEAF_CLK_EN7_SET, 1, &leaf7_gate_lock },
  1041. { 128, "thgpum_nocr", "gpum_nocr", 0, SIRFSOC_CLKC_LEAF_CLK_EN7_SET, 2, &leaf7_gate_lock },
  1042. { 129, "a7ca_btss", "btm_btss", 0, SIRFSOC_CLKC_LEAF_CLK_EN8_SET, 1, &leaf8_gate_lock },
  1043. { 130, "dmac4_io", "btm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN8_SET, 2, &leaf8_gate_lock },
  1044. { 131, "uart6_io", "btm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN8_SET, 3, &leaf8_gate_lock },
  1045. { 132, "usp3_io", "btm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN8_SET, 4, &leaf8_gate_lock },
  1046. { 133, "a7ca_io", "btm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN8_SET, 5, &leaf8_gate_lock },
  1047. { 134, "noc_btm_io", "btm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN8_SET, 6, &leaf8_gate_lock },
  1048. { 135, "thbtm_io", "btm_io", 0, SIRFSOC_CLKC_LEAF_CLK_EN8_SET, 7, &leaf8_gate_lock },
  1049. { 136, "btslow", "xinw_fixdiv_btslow", 0, SIRFSOC_CLKC_ROOT_CLK_EN1_SET, 25, &root1_gate_lock },
  1050. { 137, "a7ca_btslow", "btslow", 0, SIRFSOC_CLKC_LEAF_CLK_EN8_SET, 0, &leaf8_gate_lock },
  1051. { 138, "pwm_io", "io_mux", 0, SIRFSOC_CLKC_LEAF_CLK_EN0_SET, 0, &leaf0_gate_lock },
  1052. { 139, "pwm_xin", "xin", 0, SIRFSOC_CLKC_LEAF_CLK_EN0_SET, 1, &leaf0_gate_lock },
  1053. { 140, "pwm_xinw", "xinw", 0, SIRFSOC_CLKC_LEAF_CLK_EN0_SET, 2, &leaf0_gate_lock },
  1054. { 141, "thcgum_sys", "sys_mux", 0, SIRFSOC_CLKC_LEAF_CLK_EN0_SET, 3, &leaf0_gate_lock },
  1055. };
  1056. static struct clk *atlas7_clks[ARRAY_SIZE(unit_list) + ARRAY_SIZE(mux_list)];
  1057. static int unit_clk_is_enabled(struct clk_hw *hw)
  1058. {
  1059. struct clk_unit *clk = to_unitclk(hw);
  1060. u32 reg;
  1061. reg = clk->regofs + SIRFSOC_CLKC_ROOT_CLK_EN0_STAT - SIRFSOC_CLKC_ROOT_CLK_EN0_SET;
  1062. return !!(clkc_readl(reg) & BIT(clk->bit));
  1063. }
  1064. static int unit_clk_enable(struct clk_hw *hw)
  1065. {
  1066. u32 reg;
  1067. struct clk_unit *clk = to_unitclk(hw);
  1068. unsigned long flags;
  1069. reg = clk->regofs;
  1070. spin_lock_irqsave(clk->lock, flags);
  1071. clkc_writel(BIT(clk->bit), reg);
  1072. spin_unlock_irqrestore(clk->lock, flags);
  1073. return 0;
  1074. }
  1075. static void unit_clk_disable(struct clk_hw *hw)
  1076. {
  1077. u32 reg;
  1078. struct clk_unit *clk = to_unitclk(hw);
  1079. unsigned long flags;
  1080. reg = clk->regofs + SIRFSOC_CLKC_ROOT_CLK_EN0_CLR - SIRFSOC_CLKC_ROOT_CLK_EN0_SET;
  1081. spin_lock_irqsave(clk->lock, flags);
  1082. clkc_writel(BIT(clk->bit), reg);
  1083. spin_unlock_irqrestore(clk->lock, flags);
  1084. }
  1085. static const struct clk_ops unit_clk_ops = {
  1086. .is_enabled = unit_clk_is_enabled,
  1087. .enable = unit_clk_enable,
  1088. .disable = unit_clk_disable,
  1089. };
  1090. static struct clk * __init
  1091. atlas7_unit_clk_register(struct device *dev, const char *name,
  1092. const char * const parent_name, unsigned long flags,
  1093. u32 regofs, u8 bit, spinlock_t *lock)
  1094. {
  1095. struct clk *clk;
  1096. struct clk_unit *unit;
  1097. struct clk_init_data init;
  1098. unit = kzalloc(sizeof(*unit), GFP_KERNEL);
  1099. if (!unit)
  1100. return ERR_PTR(-ENOMEM);
  1101. init.name = name;
  1102. init.parent_names = &parent_name;
  1103. init.num_parents = 1;
  1104. init.ops = &unit_clk_ops;
  1105. init.flags = flags;
  1106. unit->hw.init = &init;
  1107. unit->regofs = regofs;
  1108. unit->bit = bit;
  1109. unit->lock = lock;
  1110. clk = clk_register(dev, &unit->hw);
  1111. if (IS_ERR(clk))
  1112. kfree(unit);
  1113. return clk;
  1114. }
  1115. static struct atlas7_reset_desc atlas7_reset_unit[] = {
  1116. { "PWM", 0x0244, 0, 0x0320, 0, &leaf0_gate_lock }, /* 0-5 */
  1117. { "THCGUM", 0x0244, 3, 0x0320, 1, &leaf0_gate_lock },
  1118. { "CVD", 0x04A0, 0, 0x032C, 0, &leaf1_gate_lock },
  1119. { "TIMER", 0x04A0, 1, 0x032C, 1, &leaf1_gate_lock },
  1120. { "PULSEC", 0x04A0, 2, 0x032C, 2, &leaf1_gate_lock },
  1121. { "TSC", 0x04A0, 3, 0x032C, 3, &leaf1_gate_lock },
  1122. { "IOCTOP", 0x04A0, 4, 0x032C, 4, &leaf1_gate_lock }, /* 6-10 */
  1123. { "RSC", 0x04A0, 5, 0x032C, 5, &leaf1_gate_lock },
  1124. { "DVM", 0x04A0, 6, 0x032C, 6, &leaf1_gate_lock },
  1125. { "LVDS", 0x04A0, 7, 0x032C, 7, &leaf1_gate_lock },
  1126. { "KAS", 0x04A0, 8, 0x032C, 8, &leaf1_gate_lock },
  1127. { "AC97", 0x04A0, 9, 0x032C, 9, &leaf1_gate_lock }, /* 11-15 */
  1128. { "USP0", 0x04A0, 10, 0x032C, 10, &leaf1_gate_lock },
  1129. { "USP1", 0x04A0, 11, 0x032C, 11, &leaf1_gate_lock },
  1130. { "USP2", 0x04A0, 12, 0x032C, 12, &leaf1_gate_lock },
  1131. { "DMAC2", 0x04A0, 13, 0x032C, 13, &leaf1_gate_lock },
  1132. { "DMAC3", 0x04A0, 14, 0x032C, 14, &leaf1_gate_lock }, /* 16-20 */
  1133. { "AUDIO", 0x04A0, 15, 0x032C, 15, &leaf1_gate_lock },
  1134. { "I2S1", 0x04A0, 17, 0x032C, 16, &leaf1_gate_lock },
  1135. { "PMU_AUDIO", 0x04A0, 22, 0x032C, 17, &leaf1_gate_lock },
  1136. { "THAUDMSCM", 0x04A0, 23, 0x032C, 18, &leaf1_gate_lock },
  1137. { "SYS2PCI", 0x04B8, 0, 0x0338, 0, &leaf2_gate_lock }, /* 21-25 */
  1138. { "PCIARB", 0x04B8, 1, 0x0338, 1, &leaf2_gate_lock },
  1139. { "PCICOPY", 0x04B8, 2, 0x0338, 2, &leaf2_gate_lock },
  1140. { "ROM", 0x04B8, 3, 0x0338, 3, &leaf2_gate_lock },
  1141. { "SDIO23", 0x04B8, 4, 0x0338, 4, &leaf2_gate_lock },
  1142. { "SDIO45", 0x04B8, 5, 0x0338, 5, &leaf2_gate_lock }, /* 26-30 */
  1143. { "SDIO67", 0x04B8, 6, 0x0338, 6, &leaf2_gate_lock },
  1144. { "VIP1", 0x04B8, 7, 0x0338, 7, &leaf2_gate_lock },
  1145. { "VPP0", 0x04B8, 11, 0x0338, 8, &leaf2_gate_lock },
  1146. { "LCD0", 0x04B8, 12, 0x0338, 9, &leaf2_gate_lock },
  1147. { "VPP1", 0x04B8, 13, 0x0338, 10, &leaf2_gate_lock }, /* 31-35 */
  1148. { "LCD1", 0x04B8, 14, 0x0338, 11, &leaf2_gate_lock },
  1149. { "DCU", 0x04B8, 15, 0x0338, 12, &leaf2_gate_lock },
  1150. { "GPIO", 0x04B8, 18, 0x0338, 13, &leaf2_gate_lock },
  1151. { "DAPA_VDIFM", 0x04B8, 17, 0x0338, 15, &leaf2_gate_lock },
  1152. { "THVDIFM", 0x04B8, 19, 0x0338, 16, &leaf2_gate_lock }, /* 36-40 */
  1153. { "RGMII", 0x04D0, 0, 0x0344, 0, &leaf3_gate_lock },
  1154. { "GMAC", 0x04D0, 1, 0x0344, 1, &leaf3_gate_lock },
  1155. { "UART1", 0x04D0, 2, 0x0344, 2, &leaf3_gate_lock },
  1156. { "DMAC0", 0x04D0, 3, 0x0344, 3, &leaf3_gate_lock },
  1157. { "UART0", 0x04D0, 4, 0x0344, 4, &leaf3_gate_lock }, /* 41-45 */
  1158. { "UART2", 0x04D0, 5, 0x0344, 5, &leaf3_gate_lock },
  1159. { "UART3", 0x04D0, 6, 0x0344, 6, &leaf3_gate_lock },
  1160. { "UART4", 0x04D0, 7, 0x0344, 7, &leaf3_gate_lock },
  1161. { "UART5", 0x04D0, 8, 0x0344, 8, &leaf3_gate_lock },
  1162. { "SPI1", 0x04D0, 9, 0x0344, 9, &leaf3_gate_lock }, /* 46-50 */
  1163. { "GNSS_SYS_M0", 0x04D0, 10, 0x0344, 10, &leaf3_gate_lock },
  1164. { "CANBUS1", 0x04D0, 12, 0x0344, 11, &leaf3_gate_lock },
  1165. { "CCSEC", 0x04D0, 15, 0x0344, 12, &leaf3_gate_lock },
  1166. { "CCPUB", 0x04D0, 16, 0x0344, 13, &leaf3_gate_lock },
  1167. { "DAPA_GNSSM", 0x04D0, 13, 0x0344, 14, &leaf3_gate_lock }, /* 51-55 */
  1168. { "THGNSSM", 0x04D0, 14, 0x0344, 15, &leaf3_gate_lock },
  1169. { "VDEC", 0x04E8, 0, 0x0350, 0, &leaf4_gate_lock },
  1170. { "JPENC", 0x04E8, 1, 0x0350, 1, &leaf4_gate_lock },
  1171. { "G2D", 0x04E8, 2, 0x0350, 2, &leaf4_gate_lock },
  1172. { "I2C0", 0x04E8, 3, 0x0350, 3, &leaf4_gate_lock }, /* 56-60 */
  1173. { "I2C1", 0x04E8, 4, 0x0350, 4, &leaf4_gate_lock },
  1174. { "GPIO0", 0x04E8, 5, 0x0350, 5, &leaf4_gate_lock },
  1175. { "NAND", 0x04E8, 6, 0x0350, 6, &leaf4_gate_lock },
  1176. { "SDIO01", 0x04E8, 7, 0x0350, 7, &leaf4_gate_lock },
  1177. { "SYS2PCI2", 0x04E8, 8, 0x0350, 8, &leaf4_gate_lock }, /* 61-65 */
  1178. { "USB0", 0x04E8, 11, 0x0350, 9, &leaf4_gate_lock },
  1179. { "USB1", 0x04E8, 12, 0x0350, 10, &leaf4_gate_lock },
  1180. { "THMEDIAM", 0x04E8, 15, 0x0350, 11, &leaf4_gate_lock },
  1181. { "MEMC_DDRPHY", 0x0500, 0, 0x035C, 0, &leaf5_gate_lock },
  1182. { "MEMC_UPCTL", 0x0500, 0, 0x035C, 1, &leaf5_gate_lock }, /* 66-70 */
  1183. { "DAPA_MEM", 0x0500, 1, 0x035C, 2, &leaf5_gate_lock },
  1184. { "MEMC_MEMDIV", 0x0500, 0, 0x035C, 3, &leaf5_gate_lock },
  1185. { "THDDRM", 0x0500, 3, 0x035C, 4, &leaf5_gate_lock },
  1186. { "CORESIGHT", 0x0518, 3, 0x0368, 13, &leaf6_gate_lock },
  1187. { "THCPUM", 0x0518, 4, 0x0368, 17, &leaf6_gate_lock }, /* 71-75 */
  1188. { "GRAPHIC", 0x0530, 0, 0x0374, 0, &leaf7_gate_lock },
  1189. { "VSS_SDR", 0x0530, 1, 0x0374, 1, &leaf7_gate_lock },
  1190. { "THGPUM", 0x0530, 2, 0x0374, 2, &leaf7_gate_lock },
  1191. { "DMAC4", 0x0548, 2, 0x0380, 1, &leaf8_gate_lock },
  1192. { "UART6", 0x0548, 3, 0x0380, 2, &leaf8_gate_lock }, /* 76- */
  1193. { "USP3", 0x0548, 4, 0x0380, 3, &leaf8_gate_lock },
  1194. { "THBTM", 0x0548, 5, 0x0380, 5, &leaf8_gate_lock },
  1195. { "A7CA", 0x0548, 1, 0x0380, 0, &leaf8_gate_lock },
  1196. { "A7CA_APB", 0x0548, 5, 0x0380, 4, &leaf8_gate_lock },
  1197. };
  1198. static int atlas7_reset_module(struct reset_controller_dev *rcdev,
  1199. unsigned long reset_idx)
  1200. {
  1201. struct atlas7_reset_desc *reset = &atlas7_reset_unit[reset_idx];
  1202. unsigned long flags;
  1203. /*
  1204. * HW suggest unit reset sequence:
  1205. * assert sw reset (0)
  1206. * setting sw clk_en to if the clock was disabled before reset
  1207. * delay 16 clocks
  1208. * disable clock (sw clk_en = 0)
  1209. * de-assert reset (1)
  1210. * after this sequence, restore clock or not is decided by SW
  1211. */
  1212. spin_lock_irqsave(reset->lock, flags);
  1213. /* clock enable or not */
  1214. if (clkc_readl(reset->clk_ofs + 8) & (1 << reset->clk_bit)) {
  1215. clkc_writel(1 << reset->rst_bit, reset->rst_ofs + 4);
  1216. udelay(2);
  1217. clkc_writel(1 << reset->clk_bit, reset->clk_ofs + 4);
  1218. clkc_writel(1 << reset->rst_bit, reset->rst_ofs);
  1219. /* restore clock enable */
  1220. clkc_writel(1 << reset->clk_bit, reset->clk_ofs);
  1221. } else {
  1222. clkc_writel(1 << reset->rst_bit, reset->rst_ofs + 4);
  1223. clkc_writel(1 << reset->clk_bit, reset->clk_ofs);
  1224. udelay(2);
  1225. clkc_writel(1 << reset->clk_bit, reset->clk_ofs + 4);
  1226. clkc_writel(1 << reset->rst_bit, reset->rst_ofs);
  1227. }
  1228. spin_unlock_irqrestore(reset->lock, flags);
  1229. return 0;
  1230. }
  1231. static struct reset_control_ops atlas7_rst_ops = {
  1232. .reset = atlas7_reset_module,
  1233. };
  1234. static struct reset_controller_dev atlas7_rst_ctlr = {
  1235. .ops = &atlas7_rst_ops,
  1236. .owner = THIS_MODULE,
  1237. .of_reset_n_cells = 1,
  1238. };
  1239. static void __init atlas7_clk_init(struct device_node *np)
  1240. {
  1241. struct clk *clk;
  1242. struct atlas7_div_init_data *div;
  1243. struct atlas7_mux_init_data *mux;
  1244. struct atlas7_unit_init_data *unit;
  1245. int i;
  1246. int ret;
  1247. sirfsoc_clk_vbase = of_iomap(np, 0);
  1248. if (!sirfsoc_clk_vbase)
  1249. panic("unable to map clkc registers\n");
  1250. of_node_put(np);
  1251. clk = clk_register(NULL, &clk_cpupll.hw);
  1252. BUG_ON(!clk);
  1253. clk = clk_register(NULL, &clk_mempll.hw);
  1254. BUG_ON(!clk);
  1255. clk = clk_register(NULL, &clk_sys0pll.hw);
  1256. BUG_ON(!clk);
  1257. clk = clk_register(NULL, &clk_sys1pll.hw);
  1258. BUG_ON(!clk);
  1259. clk = clk_register(NULL, &clk_sys2pll.hw);
  1260. BUG_ON(!clk);
  1261. clk = clk_register(NULL, &clk_sys3pll.hw);
  1262. BUG_ON(!clk);
  1263. clk = clk_register_divider_table(NULL, "cpupll_div1", "cpupll_vco", 0,
  1264. sirfsoc_clk_vbase + SIRFSOC_CLKC_CPUPLL_AB_CTRL1, 0, 3, 0,
  1265. pll_div_table, &cpupll_ctrl1_lock);
  1266. BUG_ON(!clk);
  1267. clk = clk_register_divider_table(NULL, "cpupll_div2", "cpupll_vco", 0,
  1268. sirfsoc_clk_vbase + SIRFSOC_CLKC_CPUPLL_AB_CTRL1, 4, 3, 0,
  1269. pll_div_table, &cpupll_ctrl1_lock);
  1270. BUG_ON(!clk);
  1271. clk = clk_register_divider_table(NULL, "cpupll_div3", "cpupll_vco", 0,
  1272. sirfsoc_clk_vbase + SIRFSOC_CLKC_CPUPLL_AB_CTRL1, 8, 3, 0,
  1273. pll_div_table, &cpupll_ctrl1_lock);
  1274. BUG_ON(!clk);
  1275. clk = clk_register_divider_table(NULL, "mempll_div1", "mempll_vco", 0,
  1276. sirfsoc_clk_vbase + SIRFSOC_CLKC_MEMPLL_AB_CTRL1, 0, 3, 0,
  1277. pll_div_table, &mempll_ctrl1_lock);
  1278. BUG_ON(!clk);
  1279. clk = clk_register_divider_table(NULL, "mempll_div2", "mempll_vco", 0,
  1280. sirfsoc_clk_vbase + SIRFSOC_CLKC_MEMPLL_AB_CTRL1, 4, 3, 0,
  1281. pll_div_table, &mempll_ctrl1_lock);
  1282. BUG_ON(!clk);
  1283. clk = clk_register_divider_table(NULL, "mempll_div3", "mempll_vco", 0,
  1284. sirfsoc_clk_vbase + SIRFSOC_CLKC_MEMPLL_AB_CTRL1, 8, 3, 0,
  1285. pll_div_table, &mempll_ctrl1_lock);
  1286. BUG_ON(!clk);
  1287. clk = clk_register_divider_table(NULL, "sys0pll_div1", "sys0pll_vco", 0,
  1288. sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS0PLL_AB_CTRL1, 0, 3, 0,
  1289. pll_div_table, &sys0pll_ctrl1_lock);
  1290. BUG_ON(!clk);
  1291. clk = clk_register_divider_table(NULL, "sys0pll_div2", "sys0pll_vco", 0,
  1292. sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS0PLL_AB_CTRL1, 4, 3, 0,
  1293. pll_div_table, &sys0pll_ctrl1_lock);
  1294. BUG_ON(!clk);
  1295. clk = clk_register_divider_table(NULL, "sys0pll_div3", "sys0pll_vco", 0,
  1296. sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS0PLL_AB_CTRL1, 8, 3, 0,
  1297. pll_div_table, &sys0pll_ctrl1_lock);
  1298. BUG_ON(!clk);
  1299. clk = clk_register_fixed_factor(NULL, "sys0pll_fixdiv", "sys0pll_vco",
  1300. CLK_SET_RATE_PARENT, 1, 2);
  1301. clk = clk_register_divider_table(NULL, "sys1pll_div1", "sys1pll_vco", 0,
  1302. sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS1PLL_AB_CTRL1, 0, 3, 0,
  1303. pll_div_table, &sys1pll_ctrl1_lock);
  1304. BUG_ON(!clk);
  1305. clk = clk_register_divider_table(NULL, "sys1pll_div2", "sys1pll_vco", 0,
  1306. sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS1PLL_AB_CTRL1, 4, 3, 0,
  1307. pll_div_table, &sys1pll_ctrl1_lock);
  1308. BUG_ON(!clk);
  1309. clk = clk_register_divider_table(NULL, "sys1pll_div3", "sys1pll_vco", 0,
  1310. sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS1PLL_AB_CTRL1, 8, 3, 0,
  1311. pll_div_table, &sys1pll_ctrl1_lock);
  1312. BUG_ON(!clk);
  1313. clk = clk_register_fixed_factor(NULL, "sys1pll_fixdiv", "sys1pll_vco",
  1314. CLK_SET_RATE_PARENT, 1, 2);
  1315. clk = clk_register_divider_table(NULL, "sys2pll_div1", "sys2pll_vco", 0,
  1316. sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS2PLL_AB_CTRL1, 0, 3, 0,
  1317. pll_div_table, &sys2pll_ctrl1_lock);
  1318. BUG_ON(!clk);
  1319. clk = clk_register_divider_table(NULL, "sys2pll_div2", "sys2pll_vco", 0,
  1320. sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS2PLL_AB_CTRL1, 4, 3, 0,
  1321. pll_div_table, &sys2pll_ctrl1_lock);
  1322. BUG_ON(!clk);
  1323. clk = clk_register_divider_table(NULL, "sys2pll_div3", "sys2pll_vco", 0,
  1324. sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS2PLL_AB_CTRL1, 8, 3, 0,
  1325. pll_div_table, &sys2pll_ctrl1_lock);
  1326. BUG_ON(!clk);
  1327. clk = clk_register_fixed_factor(NULL, "sys2pll_fixdiv", "sys2pll_vco",
  1328. CLK_SET_RATE_PARENT, 1, 2);
  1329. clk = clk_register_divider_table(NULL, "sys3pll_div1", "sys3pll_vco", 0,
  1330. sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS3PLL_AB_CTRL1, 0, 3, 0,
  1331. pll_div_table, &sys3pll_ctrl1_lock);
  1332. BUG_ON(!clk);
  1333. clk = clk_register_divider_table(NULL, "sys3pll_div2", "sys3pll_vco", 0,
  1334. sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS3PLL_AB_CTRL1, 4, 3, 0,
  1335. pll_div_table, &sys3pll_ctrl1_lock);
  1336. BUG_ON(!clk);
  1337. clk = clk_register_divider_table(NULL, "sys3pll_div3", "sys3pll_vco", 0,
  1338. sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS3PLL_AB_CTRL1, 8, 3, 0,
  1339. pll_div_table, &sys3pll_ctrl1_lock);
  1340. BUG_ON(!clk);
  1341. clk = clk_register_fixed_factor(NULL, "sys3pll_fixdiv", "sys3pll_vco",
  1342. CLK_SET_RATE_PARENT, 1, 2);
  1343. BUG_ON(!clk);
  1344. clk = clk_register_fixed_factor(NULL, "xinw_fixdiv_btslow", "xinw",
  1345. CLK_SET_RATE_PARENT, 1, 4);
  1346. BUG_ON(!clk);
  1347. clk = clk_register_gate(NULL, "cpupll_clk1", "cpupll_div1",
  1348. CLK_SET_RATE_PARENT, sirfsoc_clk_vbase + SIRFSOC_CLKC_CPUPLL_AB_CTRL1,
  1349. 12, 0, &cpupll_ctrl1_lock);
  1350. BUG_ON(!clk);
  1351. clk = clk_register_gate(NULL, "cpupll_clk2", "cpupll_div2",
  1352. CLK_SET_RATE_PARENT, sirfsoc_clk_vbase + SIRFSOC_CLKC_CPUPLL_AB_CTRL1,
  1353. 13, 0, &cpupll_ctrl1_lock);
  1354. BUG_ON(!clk);
  1355. clk = clk_register_gate(NULL, "cpupll_clk3", "cpupll_div3",
  1356. CLK_SET_RATE_PARENT, sirfsoc_clk_vbase + SIRFSOC_CLKC_CPUPLL_AB_CTRL1,
  1357. 14, 0, &cpupll_ctrl1_lock);
  1358. BUG_ON(!clk);
  1359. clk = clk_register_gate(NULL, "mempll_clk1", "mempll_div1",
  1360. CLK_SET_RATE_PARENT | CLK_IGNORE_UNUSED,
  1361. sirfsoc_clk_vbase + SIRFSOC_CLKC_MEMPLL_AB_CTRL1,
  1362. 12, 0, &mempll_ctrl1_lock);
  1363. BUG_ON(!clk);
  1364. clk = clk_register_gate(NULL, "mempll_clk2", "mempll_div2",
  1365. CLK_SET_RATE_PARENT, sirfsoc_clk_vbase + SIRFSOC_CLKC_MEMPLL_AB_CTRL1,
  1366. 13, 0, &mempll_ctrl1_lock);
  1367. BUG_ON(!clk);
  1368. clk = clk_register_gate(NULL, "mempll_clk3", "mempll_div3",
  1369. CLK_SET_RATE_PARENT, sirfsoc_clk_vbase + SIRFSOC_CLKC_MEMPLL_AB_CTRL1,
  1370. 14, 0, &mempll_ctrl1_lock);
  1371. BUG_ON(!clk);
  1372. clk = clk_register_gate(NULL, "sys0pll_clk1", "sys0pll_div1",
  1373. CLK_SET_RATE_PARENT, sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS0PLL_AB_CTRL1,
  1374. 12, 0, &sys0pll_ctrl1_lock);
  1375. BUG_ON(!clk);
  1376. clk = clk_register_gate(NULL, "sys0pll_clk2", "sys0pll_div2",
  1377. CLK_SET_RATE_PARENT, sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS0PLL_AB_CTRL1,
  1378. 13, 0, &sys0pll_ctrl1_lock);
  1379. BUG_ON(!clk);
  1380. clk = clk_register_gate(NULL, "sys0pll_clk3", "sys0pll_div3",
  1381. CLK_SET_RATE_PARENT, sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS0PLL_AB_CTRL1,
  1382. 14, 0, &sys0pll_ctrl1_lock);
  1383. BUG_ON(!clk);
  1384. clk = clk_register_gate(NULL, "sys1pll_clk1", "sys1pll_div1",
  1385. CLK_SET_RATE_PARENT, sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS1PLL_AB_CTRL1,
  1386. 12, 0, &sys1pll_ctrl1_lock);
  1387. BUG_ON(!clk);
  1388. clk = clk_register_gate(NULL, "sys1pll_clk2", "sys1pll_div2",
  1389. CLK_SET_RATE_PARENT, sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS1PLL_AB_CTRL1,
  1390. 13, 0, &sys1pll_ctrl1_lock);
  1391. BUG_ON(!clk);
  1392. clk = clk_register_gate(NULL, "sys1pll_clk3", "sys1pll_div3",
  1393. CLK_SET_RATE_PARENT, sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS1PLL_AB_CTRL1,
  1394. 14, 0, &sys1pll_ctrl1_lock);
  1395. BUG_ON(!clk);
  1396. clk = clk_register_gate(NULL, "sys2pll_clk1", "sys2pll_div1",
  1397. CLK_SET_RATE_PARENT, sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS2PLL_AB_CTRL1,
  1398. 12, 0, &sys2pll_ctrl1_lock);
  1399. BUG_ON(!clk);
  1400. clk = clk_register_gate(NULL, "sys2pll_clk2", "sys2pll_div2",
  1401. CLK_SET_RATE_PARENT, sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS2PLL_AB_CTRL1,
  1402. 13, 0, &sys2pll_ctrl1_lock);
  1403. BUG_ON(!clk);
  1404. clk = clk_register_gate(NULL, "sys2pll_clk3", "sys2pll_div3",
  1405. CLK_SET_RATE_PARENT, sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS2PLL_AB_CTRL1,
  1406. 14, 0, &sys2pll_ctrl1_lock);
  1407. BUG_ON(!clk);
  1408. clk = clk_register_gate(NULL, "sys3pll_clk1", "sys3pll_div1",
  1409. CLK_SET_RATE_PARENT, sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS3PLL_AB_CTRL1,
  1410. 12, 0, &sys3pll_ctrl1_lock);
  1411. BUG_ON(!clk);
  1412. clk = clk_register_gate(NULL, "sys3pll_clk2", "sys3pll_div2",
  1413. CLK_SET_RATE_PARENT, sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS3PLL_AB_CTRL1,
  1414. 13, 0, &sys3pll_ctrl1_lock);
  1415. BUG_ON(!clk);
  1416. clk = clk_register_gate(NULL, "sys3pll_clk3", "sys3pll_div3",
  1417. CLK_SET_RATE_PARENT, sirfsoc_clk_vbase + SIRFSOC_CLKC_SYS3PLL_AB_CTRL1,
  1418. 14, 0, &sys3pll_ctrl1_lock);
  1419. BUG_ON(!clk);
  1420. clk = clk_register(NULL, &clk_audio_dto.hw);
  1421. BUG_ON(!clk);
  1422. clk = clk_register(NULL, &clk_disp0_dto.hw);
  1423. BUG_ON(!clk);
  1424. clk = clk_register(NULL, &clk_disp1_dto.hw);
  1425. BUG_ON(!clk);
  1426. for (i = 0; i < ARRAY_SIZE(divider_list); i++) {
  1427. div = &divider_list[i];
  1428. clk = clk_register_divider(NULL, div->div_name,
  1429. div->parent_name, div->divider_flags, sirfsoc_clk_vbase + div->div_offset,
  1430. div->shift, div->width, 0, div->lock);
  1431. BUG_ON(!clk);
  1432. clk = clk_register_gate(NULL, div->gate_name, div->div_name,
  1433. div->gate_flags, sirfsoc_clk_vbase + div->gate_offset,
  1434. div->gate_bit, 0, div->lock);
  1435. BUG_ON(!clk);
  1436. }
  1437. /* ignore selector status register check */
  1438. for (i = 0; i < ARRAY_SIZE(mux_list); i++) {
  1439. mux = &mux_list[i];
  1440. clk = clk_register_mux(NULL, mux->mux_name, mux->parent_names,
  1441. mux->parent_num, mux->flags,
  1442. sirfsoc_clk_vbase + mux->mux_offset,
  1443. mux->shift, mux->width,
  1444. mux->mux_flags, NULL);
  1445. atlas7_clks[ARRAY_SIZE(unit_list) + i] = clk;
  1446. BUG_ON(!clk);
  1447. }
  1448. for (i = 0; i < ARRAY_SIZE(unit_list); i++) {
  1449. unit = &unit_list[i];
  1450. atlas7_clks[i] = atlas7_unit_clk_register(NULL, unit->unit_name, unit->parent_name,
  1451. unit->flags, unit->regofs, unit->bit, unit->lock);
  1452. BUG_ON(!atlas7_clks[i]);
  1453. }
  1454. clk_data.clks = atlas7_clks;
  1455. clk_data.clk_num = ARRAY_SIZE(unit_list) + ARRAY_SIZE(mux_list);
  1456. ret = of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data);
  1457. BUG_ON(ret);
  1458. atlas7_rst_ctlr.of_node = np;
  1459. atlas7_rst_ctlr.nr_resets = ARRAY_SIZE(atlas7_reset_unit);
  1460. reset_controller_register(&atlas7_rst_ctlr);
  1461. }
  1462. CLK_OF_DECLARE(atlas7_clk, "sirf,atlas7-car", atlas7_clk_init);