stm32-fmc2-ebi.c 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) STMicroelectronics 2020
  4. */
  5. #include <linux/bitfield.h>
  6. #include <linux/clk.h>
  7. #include <linux/mfd/syscon.h>
  8. #include <linux/module.h>
  9. #include <linux/of.h>
  10. #include <linux/of_platform.h>
  11. #include <linux/pinctrl/consumer.h>
  12. #include <linux/platform_device.h>
  13. #include <linux/pm_runtime.h>
  14. #include <linux/regmap.h>
  15. #include <linux/reset.h>
  16. /* FMC2 Controller Registers */
  17. #define FMC2_BCR1 0x0
  18. #define FMC2_BTR1 0x4
  19. #define FMC2_BCR(x) ((x) * 0x8 + FMC2_BCR1)
  20. #define FMC2_BTR(x) ((x) * 0x8 + FMC2_BTR1)
  21. #define FMC2_PCSCNTR 0x20
  22. #define FMC2_CFGR 0x20
  23. #define FMC2_SR 0x84
  24. #define FMC2_BWTR1 0x104
  25. #define FMC2_BWTR(x) ((x) * 0x8 + FMC2_BWTR1)
  26. #define FMC2_SECCFGR 0x300
  27. #define FMC2_CIDCFGR0 0x30c
  28. #define FMC2_CIDCFGR(x) ((x) * 0x8 + FMC2_CIDCFGR0)
  29. #define FMC2_SEMCR0 0x310
  30. #define FMC2_SEMCR(x) ((x) * 0x8 + FMC2_SEMCR0)
  31. /* Register: FMC2_BCR1 */
  32. #define FMC2_BCR1_CCLKEN BIT(20)
  33. #define FMC2_BCR1_FMC2EN BIT(31)
  34. /* Register: FMC2_BCRx */
  35. #define FMC2_BCR_MBKEN BIT(0)
  36. #define FMC2_BCR_MUXEN BIT(1)
  37. #define FMC2_BCR_MTYP GENMASK(3, 2)
  38. #define FMC2_BCR_MWID GENMASK(5, 4)
  39. #define FMC2_BCR_FACCEN BIT(6)
  40. #define FMC2_BCR_BURSTEN BIT(8)
  41. #define FMC2_BCR_WAITPOL BIT(9)
  42. #define FMC2_BCR_WAITCFG BIT(11)
  43. #define FMC2_BCR_WREN BIT(12)
  44. #define FMC2_BCR_WAITEN BIT(13)
  45. #define FMC2_BCR_EXTMOD BIT(14)
  46. #define FMC2_BCR_ASYNCWAIT BIT(15)
  47. #define FMC2_BCR_CPSIZE GENMASK(18, 16)
  48. #define FMC2_BCR_CBURSTRW BIT(19)
  49. #define FMC2_BCR_CSCOUNT GENMASK(21, 20)
  50. #define FMC2_BCR_NBLSET GENMASK(23, 22)
  51. /* Register: FMC2_BTRx/FMC2_BWTRx */
  52. #define FMC2_BXTR_ADDSET GENMASK(3, 0)
  53. #define FMC2_BXTR_ADDHLD GENMASK(7, 4)
  54. #define FMC2_BXTR_DATAST GENMASK(15, 8)
  55. #define FMC2_BXTR_BUSTURN GENMASK(19, 16)
  56. #define FMC2_BTR_CLKDIV GENMASK(23, 20)
  57. #define FMC2_BTR_DATLAT GENMASK(27, 24)
  58. #define FMC2_BXTR_ACCMOD GENMASK(29, 28)
  59. #define FMC2_BXTR_DATAHLD GENMASK(31, 30)
  60. /* Register: FMC2_PCSCNTR */
  61. #define FMC2_PCSCNTR_CSCOUNT GENMASK(15, 0)
  62. #define FMC2_PCSCNTR_CNTBEN(x) BIT((x) + 16)
  63. /* Register: FMC2_CFGR */
  64. #define FMC2_CFGR_CLKDIV GENMASK(19, 16)
  65. #define FMC2_CFGR_CCLKEN BIT(20)
  66. #define FMC2_CFGR_FMC2EN BIT(31)
  67. /* Register: FMC2_SR */
  68. #define FMC2_SR_ISOST GENMASK(1, 0)
  69. /* Register: FMC2_CIDCFGR */
  70. #define FMC2_CIDCFGR_CFEN BIT(0)
  71. #define FMC2_CIDCFGR_SEMEN BIT(1)
  72. #define FMC2_CIDCFGR_SCID GENMASK(6, 4)
  73. #define FMC2_CIDCFGR_SEMWLC1 BIT(17)
  74. /* Register: FMC2_SEMCR */
  75. #define FMC2_SEMCR_SEM_MUTEX BIT(0)
  76. #define FMC2_SEMCR_SEMCID GENMASK(6, 4)
  77. #define FMC2_MAX_EBI_CE 4
  78. #define FMC2_MAX_BANKS 5
  79. #define FMC2_MAX_RESOURCES 6
  80. #define FMC2_CID1 1
  81. #define FMC2_BCR_CPSIZE_0 0x0
  82. #define FMC2_BCR_CPSIZE_128 0x1
  83. #define FMC2_BCR_CPSIZE_256 0x2
  84. #define FMC2_BCR_CPSIZE_512 0x3
  85. #define FMC2_BCR_CPSIZE_1024 0x4
  86. #define FMC2_BCR_MWID_8 0x0
  87. #define FMC2_BCR_MWID_16 0x1
  88. #define FMC2_BCR_MTYP_SRAM 0x0
  89. #define FMC2_BCR_MTYP_PSRAM 0x1
  90. #define FMC2_BCR_MTYP_NOR 0x2
  91. #define FMC2_BCR_CSCOUNT_0 0x0
  92. #define FMC2_BCR_CSCOUNT_1 0x1
  93. #define FMC2_BCR_CSCOUNT_64 0x2
  94. #define FMC2_BCR_CSCOUNT_256 0x3
  95. #define FMC2_BXTR_EXTMOD_A 0x0
  96. #define FMC2_BXTR_EXTMOD_B 0x1
  97. #define FMC2_BXTR_EXTMOD_C 0x2
  98. #define FMC2_BXTR_EXTMOD_D 0x3
  99. #define FMC2_BCR_NBLSET_MAX 0x3
  100. #define FMC2_BXTR_ADDSET_MAX 0xf
  101. #define FMC2_BXTR_ADDHLD_MAX 0xf
  102. #define FMC2_BXTR_DATAST_MAX 0xff
  103. #define FMC2_BXTR_BUSTURN_MAX 0xf
  104. #define FMC2_BXTR_DATAHLD_MAX 0x3
  105. #define FMC2_BTR_CLKDIV_MAX 0xf
  106. #define FMC2_BTR_DATLAT_MAX 0xf
  107. #define FMC2_PCSCNTR_CSCOUNT_MAX 0xff
  108. #define FMC2_CFGR_CLKDIV_MAX 0xf
  109. enum stm32_fmc2_ebi_bank {
  110. FMC2_EBI1 = 0,
  111. FMC2_EBI2,
  112. FMC2_EBI3,
  113. FMC2_EBI4,
  114. FMC2_NAND
  115. };
  116. enum stm32_fmc2_ebi_register_type {
  117. FMC2_REG_BCR = 1,
  118. FMC2_REG_BTR,
  119. FMC2_REG_BWTR,
  120. FMC2_REG_PCSCNTR,
  121. FMC2_REG_CFGR
  122. };
  123. enum stm32_fmc2_ebi_transaction_type {
  124. FMC2_ASYNC_MODE_1_SRAM = 0,
  125. FMC2_ASYNC_MODE_1_PSRAM,
  126. FMC2_ASYNC_MODE_A_SRAM,
  127. FMC2_ASYNC_MODE_A_PSRAM,
  128. FMC2_ASYNC_MODE_2_NOR,
  129. FMC2_ASYNC_MODE_B_NOR,
  130. FMC2_ASYNC_MODE_C_NOR,
  131. FMC2_ASYNC_MODE_D_NOR,
  132. FMC2_SYNC_READ_SYNC_WRITE_PSRAM,
  133. FMC2_SYNC_READ_ASYNC_WRITE_PSRAM,
  134. FMC2_SYNC_READ_SYNC_WRITE_NOR,
  135. FMC2_SYNC_READ_ASYNC_WRITE_NOR
  136. };
  137. enum stm32_fmc2_ebi_buswidth {
  138. FMC2_BUSWIDTH_8 = 8,
  139. FMC2_BUSWIDTH_16 = 16
  140. };
  141. enum stm32_fmc2_ebi_cpsize {
  142. FMC2_CPSIZE_0 = 0,
  143. FMC2_CPSIZE_128 = 128,
  144. FMC2_CPSIZE_256 = 256,
  145. FMC2_CPSIZE_512 = 512,
  146. FMC2_CPSIZE_1024 = 1024
  147. };
  148. enum stm32_fmc2_ebi_cscount {
  149. FMC2_CSCOUNT_0 = 0,
  150. FMC2_CSCOUNT_1 = 1,
  151. FMC2_CSCOUNT_64 = 64,
  152. FMC2_CSCOUNT_256 = 256
  153. };
  154. struct stm32_fmc2_ebi;
  155. struct stm32_fmc2_ebi_data {
  156. const struct stm32_fmc2_prop *child_props;
  157. unsigned int nb_child_props;
  158. u32 fmc2_enable_reg;
  159. u32 fmc2_enable_bit;
  160. int (*nwait_used_by_ctrls)(struct stm32_fmc2_ebi *ebi);
  161. void (*set_setup)(struct stm32_fmc2_ebi *ebi);
  162. int (*save_setup)(struct stm32_fmc2_ebi *ebi);
  163. int (*check_rif)(struct stm32_fmc2_ebi *ebi, u32 resource);
  164. void (*put_sems)(struct stm32_fmc2_ebi *ebi);
  165. void (*get_sems)(struct stm32_fmc2_ebi *ebi);
  166. };
  167. struct stm32_fmc2_ebi {
  168. struct device *dev;
  169. struct clk *clk;
  170. struct regmap *regmap;
  171. const struct stm32_fmc2_ebi_data *data;
  172. u8 bank_assigned;
  173. u8 sem_taken;
  174. bool access_granted;
  175. u32 bcr[FMC2_MAX_EBI_CE];
  176. u32 btr[FMC2_MAX_EBI_CE];
  177. u32 bwtr[FMC2_MAX_EBI_CE];
  178. u32 pcscntr;
  179. u32 cfgr;
  180. };
  181. /*
  182. * struct stm32_fmc2_prop - STM32 FMC2 EBI property
  183. * @name: the device tree binding name of the property
  184. * @bprop: indicate that it is a boolean property
  185. * @mprop: indicate that it is a mandatory property
  186. * @reg_type: the register that have to be modified
  187. * @reg_mask: the bit that have to be modified in the selected register
  188. * in case of it is a boolean property
  189. * @reset_val: the default value that have to be set in case the property
  190. * has not been defined in the device tree
  191. * @check: this callback ckecks that the property is compliant with the
  192. * transaction type selected
  193. * @calculate: this callback is called to calculate for exemple a timing
  194. * set in nanoseconds in the device tree in clock cycles or in
  195. * clock period
  196. * @set: this callback applies the values in the registers
  197. */
  198. struct stm32_fmc2_prop {
  199. const char *name;
  200. bool bprop;
  201. bool mprop;
  202. int reg_type;
  203. u32 reg_mask;
  204. u32 reset_val;
  205. int (*check)(struct stm32_fmc2_ebi *ebi,
  206. const struct stm32_fmc2_prop *prop, int cs);
  207. u32 (*calculate)(struct stm32_fmc2_ebi *ebi, int cs, u32 setup);
  208. int (*set)(struct stm32_fmc2_ebi *ebi,
  209. const struct stm32_fmc2_prop *prop,
  210. int cs, u32 setup);
  211. };
  212. static int stm32_fmc2_ebi_check_mux(struct stm32_fmc2_ebi *ebi,
  213. const struct stm32_fmc2_prop *prop,
  214. int cs)
  215. {
  216. u32 bcr;
  217. int ret;
  218. ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
  219. if (ret)
  220. return ret;
  221. if (bcr & FMC2_BCR_MTYP)
  222. return 0;
  223. return -EINVAL;
  224. }
  225. static int stm32_fmc2_ebi_check_waitcfg(struct stm32_fmc2_ebi *ebi,
  226. const struct stm32_fmc2_prop *prop,
  227. int cs)
  228. {
  229. u32 bcr, val = FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
  230. int ret;
  231. ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
  232. if (ret)
  233. return ret;
  234. if ((bcr & FMC2_BCR_MTYP) == val && bcr & FMC2_BCR_BURSTEN)
  235. return 0;
  236. return -EINVAL;
  237. }
  238. static int stm32_fmc2_ebi_check_sync_trans(struct stm32_fmc2_ebi *ebi,
  239. const struct stm32_fmc2_prop *prop,
  240. int cs)
  241. {
  242. u32 bcr;
  243. int ret;
  244. ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
  245. if (ret)
  246. return ret;
  247. if (bcr & FMC2_BCR_BURSTEN)
  248. return 0;
  249. return -EINVAL;
  250. }
  251. static int stm32_fmc2_ebi_mp25_check_cclk(struct stm32_fmc2_ebi *ebi,
  252. const struct stm32_fmc2_prop *prop,
  253. int cs)
  254. {
  255. if (!ebi->access_granted)
  256. return -EACCES;
  257. return stm32_fmc2_ebi_check_sync_trans(ebi, prop, cs);
  258. }
  259. static int stm32_fmc2_ebi_mp25_check_clk_period(struct stm32_fmc2_ebi *ebi,
  260. const struct stm32_fmc2_prop *prop,
  261. int cs)
  262. {
  263. u32 cfgr;
  264. int ret;
  265. ret = regmap_read(ebi->regmap, FMC2_CFGR, &cfgr);
  266. if (ret)
  267. return ret;
  268. if (cfgr & FMC2_CFGR_CCLKEN && !ebi->access_granted)
  269. return -EACCES;
  270. return stm32_fmc2_ebi_check_sync_trans(ebi, prop, cs);
  271. }
  272. static int stm32_fmc2_ebi_check_async_trans(struct stm32_fmc2_ebi *ebi,
  273. const struct stm32_fmc2_prop *prop,
  274. int cs)
  275. {
  276. u32 bcr;
  277. int ret;
  278. ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
  279. if (ret)
  280. return ret;
  281. if (!(bcr & FMC2_BCR_BURSTEN) || !(bcr & FMC2_BCR_CBURSTRW))
  282. return 0;
  283. return -EINVAL;
  284. }
  285. static int stm32_fmc2_ebi_check_cpsize(struct stm32_fmc2_ebi *ebi,
  286. const struct stm32_fmc2_prop *prop,
  287. int cs)
  288. {
  289. u32 bcr, val = FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_PSRAM);
  290. int ret;
  291. ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
  292. if (ret)
  293. return ret;
  294. if ((bcr & FMC2_BCR_MTYP) == val && bcr & FMC2_BCR_BURSTEN)
  295. return 0;
  296. return -EINVAL;
  297. }
  298. static int stm32_fmc2_ebi_check_address_hold(struct stm32_fmc2_ebi *ebi,
  299. const struct stm32_fmc2_prop *prop,
  300. int cs)
  301. {
  302. u32 bcr, bxtr, val = FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_D);
  303. int ret;
  304. ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
  305. if (ret)
  306. return ret;
  307. if (prop->reg_type == FMC2_REG_BWTR)
  308. ret = regmap_read(ebi->regmap, FMC2_BWTR(cs), &bxtr);
  309. else
  310. ret = regmap_read(ebi->regmap, FMC2_BTR(cs), &bxtr);
  311. if (ret)
  312. return ret;
  313. if ((!(bcr & FMC2_BCR_BURSTEN) || !(bcr & FMC2_BCR_CBURSTRW)) &&
  314. ((bxtr & FMC2_BXTR_ACCMOD) == val || bcr & FMC2_BCR_MUXEN))
  315. return 0;
  316. return -EINVAL;
  317. }
  318. static int stm32_fmc2_ebi_check_clk_period(struct stm32_fmc2_ebi *ebi,
  319. const struct stm32_fmc2_prop *prop,
  320. int cs)
  321. {
  322. u32 bcr, bcr1;
  323. int ret;
  324. ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
  325. if (ret)
  326. return ret;
  327. if (cs) {
  328. ret = regmap_read(ebi->regmap, FMC2_BCR1, &bcr1);
  329. if (ret)
  330. return ret;
  331. } else {
  332. bcr1 = bcr;
  333. }
  334. if (bcr & FMC2_BCR_BURSTEN && (!cs || !(bcr1 & FMC2_BCR1_CCLKEN)))
  335. return 0;
  336. return -EINVAL;
  337. }
  338. static int stm32_fmc2_ebi_check_cclk(struct stm32_fmc2_ebi *ebi,
  339. const struct stm32_fmc2_prop *prop,
  340. int cs)
  341. {
  342. if (cs)
  343. return -EINVAL;
  344. return stm32_fmc2_ebi_check_sync_trans(ebi, prop, cs);
  345. }
  346. static u32 stm32_fmc2_ebi_ns_to_clock_cycles(struct stm32_fmc2_ebi *ebi,
  347. int cs, u32 setup)
  348. {
  349. unsigned long hclk = clk_get_rate(ebi->clk);
  350. unsigned long hclkp = NSEC_PER_SEC / (hclk / 1000);
  351. return DIV_ROUND_UP(setup * 1000, hclkp);
  352. }
  353. static u32 stm32_fmc2_ebi_ns_to_clk_period(struct stm32_fmc2_ebi *ebi,
  354. int cs, u32 setup)
  355. {
  356. u32 nb_clk_cycles = stm32_fmc2_ebi_ns_to_clock_cycles(ebi, cs, setup);
  357. u32 bcr, btr, clk_period;
  358. int ret;
  359. ret = regmap_read(ebi->regmap, FMC2_BCR1, &bcr);
  360. if (ret)
  361. return ret;
  362. if (bcr & FMC2_BCR1_CCLKEN || !cs)
  363. ret = regmap_read(ebi->regmap, FMC2_BTR1, &btr);
  364. else
  365. ret = regmap_read(ebi->regmap, FMC2_BTR(cs), &btr);
  366. if (ret)
  367. return ret;
  368. clk_period = FIELD_GET(FMC2_BTR_CLKDIV, btr) + 1;
  369. return DIV_ROUND_UP(nb_clk_cycles, clk_period);
  370. }
  371. static u32 stm32_fmc2_ebi_mp25_ns_to_clk_period(struct stm32_fmc2_ebi *ebi,
  372. int cs, u32 setup)
  373. {
  374. u32 nb_clk_cycles = stm32_fmc2_ebi_ns_to_clock_cycles(ebi, cs, setup);
  375. u32 cfgr, btr, clk_period;
  376. int ret;
  377. ret = regmap_read(ebi->regmap, FMC2_CFGR, &cfgr);
  378. if (ret)
  379. return ret;
  380. if (cfgr & FMC2_CFGR_CCLKEN) {
  381. clk_period = FIELD_GET(FMC2_CFGR_CLKDIV, cfgr) + 1;
  382. } else {
  383. ret = regmap_read(ebi->regmap, FMC2_BTR(cs), &btr);
  384. if (ret)
  385. return ret;
  386. clk_period = FIELD_GET(FMC2_BTR_CLKDIV, btr) + 1;
  387. }
  388. return DIV_ROUND_UP(nb_clk_cycles, clk_period);
  389. }
  390. static int stm32_fmc2_ebi_get_reg(int reg_type, int cs, u32 *reg)
  391. {
  392. switch (reg_type) {
  393. case FMC2_REG_BCR:
  394. *reg = FMC2_BCR(cs);
  395. break;
  396. case FMC2_REG_BTR:
  397. *reg = FMC2_BTR(cs);
  398. break;
  399. case FMC2_REG_BWTR:
  400. *reg = FMC2_BWTR(cs);
  401. break;
  402. case FMC2_REG_PCSCNTR:
  403. *reg = FMC2_PCSCNTR;
  404. break;
  405. case FMC2_REG_CFGR:
  406. *reg = FMC2_CFGR;
  407. break;
  408. default:
  409. return -EINVAL;
  410. }
  411. return 0;
  412. }
  413. static int stm32_fmc2_ebi_set_bit_field(struct stm32_fmc2_ebi *ebi,
  414. const struct stm32_fmc2_prop *prop,
  415. int cs, u32 setup)
  416. {
  417. u32 reg;
  418. int ret;
  419. ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, &reg);
  420. if (ret)
  421. return ret;
  422. regmap_update_bits(ebi->regmap, reg, prop->reg_mask,
  423. setup ? prop->reg_mask : 0);
  424. return 0;
  425. }
  426. static int stm32_fmc2_ebi_set_trans_type(struct stm32_fmc2_ebi *ebi,
  427. const struct stm32_fmc2_prop *prop,
  428. int cs, u32 setup)
  429. {
  430. u32 bcr_mask, bcr = FMC2_BCR_WREN;
  431. u32 btr_mask, btr = 0;
  432. u32 bwtr_mask, bwtr = 0;
  433. bwtr_mask = FMC2_BXTR_ACCMOD;
  434. btr_mask = FMC2_BXTR_ACCMOD;
  435. bcr_mask = FMC2_BCR_MUXEN | FMC2_BCR_MTYP | FMC2_BCR_FACCEN |
  436. FMC2_BCR_WREN | FMC2_BCR_WAITEN | FMC2_BCR_BURSTEN |
  437. FMC2_BCR_EXTMOD | FMC2_BCR_CBURSTRW;
  438. switch (setup) {
  439. case FMC2_ASYNC_MODE_1_SRAM:
  440. bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_SRAM);
  441. /*
  442. * MUXEN = 0, MTYP = 0, FACCEN = 0, BURSTEN = 0, WAITEN = 0,
  443. * WREN = 1, EXTMOD = 0, CBURSTRW = 0, ACCMOD = 0
  444. */
  445. break;
  446. case FMC2_ASYNC_MODE_1_PSRAM:
  447. /*
  448. * MUXEN = 0, MTYP = 1, FACCEN = 0, BURSTEN = 0, WAITEN = 0,
  449. * WREN = 1, EXTMOD = 0, CBURSTRW = 0, ACCMOD = 0
  450. */
  451. bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_PSRAM);
  452. break;
  453. case FMC2_ASYNC_MODE_A_SRAM:
  454. /*
  455. * MUXEN = 0, MTYP = 0, FACCEN = 0, BURSTEN = 0, WAITEN = 0,
  456. * WREN = 1, EXTMOD = 1, CBURSTRW = 0, ACCMOD = 0
  457. */
  458. bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_SRAM);
  459. bcr |= FMC2_BCR_EXTMOD;
  460. btr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_A);
  461. bwtr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_A);
  462. break;
  463. case FMC2_ASYNC_MODE_A_PSRAM:
  464. /*
  465. * MUXEN = 0, MTYP = 1, FACCEN = 0, BURSTEN = 0, WAITEN = 0,
  466. * WREN = 1, EXTMOD = 1, CBURSTRW = 0, ACCMOD = 0
  467. */
  468. bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_PSRAM);
  469. bcr |= FMC2_BCR_EXTMOD;
  470. btr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_A);
  471. bwtr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_A);
  472. break;
  473. case FMC2_ASYNC_MODE_2_NOR:
  474. /*
  475. * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 0, WAITEN = 0,
  476. * WREN = 1, EXTMOD = 0, CBURSTRW = 0, ACCMOD = 0
  477. */
  478. bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
  479. bcr |= FMC2_BCR_FACCEN;
  480. break;
  481. case FMC2_ASYNC_MODE_B_NOR:
  482. /*
  483. * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 0, WAITEN = 0,
  484. * WREN = 1, EXTMOD = 1, CBURSTRW = 0, ACCMOD = 1
  485. */
  486. bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
  487. bcr |= FMC2_BCR_FACCEN | FMC2_BCR_EXTMOD;
  488. btr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_B);
  489. bwtr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_B);
  490. break;
  491. case FMC2_ASYNC_MODE_C_NOR:
  492. /*
  493. * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 0, WAITEN = 0,
  494. * WREN = 1, EXTMOD = 1, CBURSTRW = 0, ACCMOD = 2
  495. */
  496. bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
  497. bcr |= FMC2_BCR_FACCEN | FMC2_BCR_EXTMOD;
  498. btr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_C);
  499. bwtr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_C);
  500. break;
  501. case FMC2_ASYNC_MODE_D_NOR:
  502. /*
  503. * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 0, WAITEN = 0,
  504. * WREN = 1, EXTMOD = 1, CBURSTRW = 0, ACCMOD = 3
  505. */
  506. bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
  507. bcr |= FMC2_BCR_FACCEN | FMC2_BCR_EXTMOD;
  508. btr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_D);
  509. bwtr |= FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_D);
  510. break;
  511. case FMC2_SYNC_READ_SYNC_WRITE_PSRAM:
  512. /*
  513. * MUXEN = 0, MTYP = 1, FACCEN = 0, BURSTEN = 1, WAITEN = 0,
  514. * WREN = 1, EXTMOD = 0, CBURSTRW = 1, ACCMOD = 0
  515. */
  516. bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_PSRAM);
  517. bcr |= FMC2_BCR_BURSTEN | FMC2_BCR_CBURSTRW;
  518. break;
  519. case FMC2_SYNC_READ_ASYNC_WRITE_PSRAM:
  520. /*
  521. * MUXEN = 0, MTYP = 1, FACCEN = 0, BURSTEN = 1, WAITEN = 0,
  522. * WREN = 1, EXTMOD = 0, CBURSTRW = 0, ACCMOD = 0
  523. */
  524. bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_PSRAM);
  525. bcr |= FMC2_BCR_BURSTEN;
  526. break;
  527. case FMC2_SYNC_READ_SYNC_WRITE_NOR:
  528. /*
  529. * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 1, WAITEN = 0,
  530. * WREN = 1, EXTMOD = 0, CBURSTRW = 1, ACCMOD = 0
  531. */
  532. bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
  533. bcr |= FMC2_BCR_FACCEN | FMC2_BCR_BURSTEN | FMC2_BCR_CBURSTRW;
  534. break;
  535. case FMC2_SYNC_READ_ASYNC_WRITE_NOR:
  536. /*
  537. * MUXEN = 0, MTYP = 2, FACCEN = 1, BURSTEN = 1, WAITEN = 0,
  538. * WREN = 1, EXTMOD = 0, CBURSTRW = 0, ACCMOD = 0
  539. */
  540. bcr |= FIELD_PREP(FMC2_BCR_MTYP, FMC2_BCR_MTYP_NOR);
  541. bcr |= FMC2_BCR_FACCEN | FMC2_BCR_BURSTEN;
  542. break;
  543. default:
  544. /* Type of transaction not supported */
  545. return -EINVAL;
  546. }
  547. if (bcr & FMC2_BCR_EXTMOD)
  548. regmap_update_bits(ebi->regmap, FMC2_BWTR(cs),
  549. bwtr_mask, bwtr);
  550. regmap_update_bits(ebi->regmap, FMC2_BTR(cs), btr_mask, btr);
  551. regmap_update_bits(ebi->regmap, FMC2_BCR(cs), bcr_mask, bcr);
  552. return 0;
  553. }
  554. static int stm32_fmc2_ebi_set_buswidth(struct stm32_fmc2_ebi *ebi,
  555. const struct stm32_fmc2_prop *prop,
  556. int cs, u32 setup)
  557. {
  558. u32 val;
  559. switch (setup) {
  560. case FMC2_BUSWIDTH_8:
  561. val = FIELD_PREP(FMC2_BCR_MWID, FMC2_BCR_MWID_8);
  562. break;
  563. case FMC2_BUSWIDTH_16:
  564. val = FIELD_PREP(FMC2_BCR_MWID, FMC2_BCR_MWID_16);
  565. break;
  566. default:
  567. /* Buswidth not supported */
  568. return -EINVAL;
  569. }
  570. regmap_update_bits(ebi->regmap, FMC2_BCR(cs), FMC2_BCR_MWID, val);
  571. return 0;
  572. }
  573. static int stm32_fmc2_ebi_set_cpsize(struct stm32_fmc2_ebi *ebi,
  574. const struct stm32_fmc2_prop *prop,
  575. int cs, u32 setup)
  576. {
  577. u32 val;
  578. switch (setup) {
  579. case FMC2_CPSIZE_0:
  580. val = FIELD_PREP(FMC2_BCR_CPSIZE, FMC2_BCR_CPSIZE_0);
  581. break;
  582. case FMC2_CPSIZE_128:
  583. val = FIELD_PREP(FMC2_BCR_CPSIZE, FMC2_BCR_CPSIZE_128);
  584. break;
  585. case FMC2_CPSIZE_256:
  586. val = FIELD_PREP(FMC2_BCR_CPSIZE, FMC2_BCR_CPSIZE_256);
  587. break;
  588. case FMC2_CPSIZE_512:
  589. val = FIELD_PREP(FMC2_BCR_CPSIZE, FMC2_BCR_CPSIZE_512);
  590. break;
  591. case FMC2_CPSIZE_1024:
  592. val = FIELD_PREP(FMC2_BCR_CPSIZE, FMC2_BCR_CPSIZE_1024);
  593. break;
  594. default:
  595. /* Cpsize not supported */
  596. return -EINVAL;
  597. }
  598. regmap_update_bits(ebi->regmap, FMC2_BCR(cs), FMC2_BCR_CPSIZE, val);
  599. return 0;
  600. }
  601. static int stm32_fmc2_ebi_set_bl_setup(struct stm32_fmc2_ebi *ebi,
  602. const struct stm32_fmc2_prop *prop,
  603. int cs, u32 setup)
  604. {
  605. u32 val;
  606. val = min_t(u32, setup, FMC2_BCR_NBLSET_MAX);
  607. val = FIELD_PREP(FMC2_BCR_NBLSET, val);
  608. regmap_update_bits(ebi->regmap, FMC2_BCR(cs), FMC2_BCR_NBLSET, val);
  609. return 0;
  610. }
  611. static int stm32_fmc2_ebi_set_address_setup(struct stm32_fmc2_ebi *ebi,
  612. const struct stm32_fmc2_prop *prop,
  613. int cs, u32 setup)
  614. {
  615. u32 bcr, bxtr, reg;
  616. u32 val = FIELD_PREP(FMC2_BXTR_ACCMOD, FMC2_BXTR_EXTMOD_D);
  617. int ret;
  618. ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, &reg);
  619. if (ret)
  620. return ret;
  621. ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
  622. if (ret)
  623. return ret;
  624. if (prop->reg_type == FMC2_REG_BWTR)
  625. ret = regmap_read(ebi->regmap, FMC2_BWTR(cs), &bxtr);
  626. else
  627. ret = regmap_read(ebi->regmap, FMC2_BTR(cs), &bxtr);
  628. if (ret)
  629. return ret;
  630. if ((bxtr & FMC2_BXTR_ACCMOD) == val || bcr & FMC2_BCR_MUXEN)
  631. val = clamp_val(setup, 1, FMC2_BXTR_ADDSET_MAX);
  632. else
  633. val = min_t(u32, setup, FMC2_BXTR_ADDSET_MAX);
  634. val = FIELD_PREP(FMC2_BXTR_ADDSET, val);
  635. regmap_update_bits(ebi->regmap, reg, FMC2_BXTR_ADDSET, val);
  636. return 0;
  637. }
  638. static int stm32_fmc2_ebi_set_address_hold(struct stm32_fmc2_ebi *ebi,
  639. const struct stm32_fmc2_prop *prop,
  640. int cs, u32 setup)
  641. {
  642. u32 val, reg;
  643. int ret;
  644. ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, &reg);
  645. if (ret)
  646. return ret;
  647. val = clamp_val(setup, 1, FMC2_BXTR_ADDHLD_MAX);
  648. val = FIELD_PREP(FMC2_BXTR_ADDHLD, val);
  649. regmap_update_bits(ebi->regmap, reg, FMC2_BXTR_ADDHLD, val);
  650. return 0;
  651. }
  652. static int stm32_fmc2_ebi_set_data_setup(struct stm32_fmc2_ebi *ebi,
  653. const struct stm32_fmc2_prop *prop,
  654. int cs, u32 setup)
  655. {
  656. u32 val, reg;
  657. int ret;
  658. ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, &reg);
  659. if (ret)
  660. return ret;
  661. val = clamp_val(setup, 1, FMC2_BXTR_DATAST_MAX);
  662. val = FIELD_PREP(FMC2_BXTR_DATAST, val);
  663. regmap_update_bits(ebi->regmap, reg, FMC2_BXTR_DATAST, val);
  664. return 0;
  665. }
  666. static int stm32_fmc2_ebi_set_bus_turnaround(struct stm32_fmc2_ebi *ebi,
  667. const struct stm32_fmc2_prop *prop,
  668. int cs, u32 setup)
  669. {
  670. u32 val, reg;
  671. int ret;
  672. ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, &reg);
  673. if (ret)
  674. return ret;
  675. val = setup ? min_t(u32, setup - 1, FMC2_BXTR_BUSTURN_MAX) : 0;
  676. val = FIELD_PREP(FMC2_BXTR_BUSTURN, val);
  677. regmap_update_bits(ebi->regmap, reg, FMC2_BXTR_BUSTURN, val);
  678. return 0;
  679. }
  680. static int stm32_fmc2_ebi_set_data_hold(struct stm32_fmc2_ebi *ebi,
  681. const struct stm32_fmc2_prop *prop,
  682. int cs, u32 setup)
  683. {
  684. u32 val, reg;
  685. int ret;
  686. ret = stm32_fmc2_ebi_get_reg(prop->reg_type, cs, &reg);
  687. if (ret)
  688. return ret;
  689. if (prop->reg_type == FMC2_REG_BWTR)
  690. val = setup ? min_t(u32, setup - 1, FMC2_BXTR_DATAHLD_MAX) : 0;
  691. else
  692. val = min_t(u32, setup, FMC2_BXTR_DATAHLD_MAX);
  693. val = FIELD_PREP(FMC2_BXTR_DATAHLD, val);
  694. regmap_update_bits(ebi->regmap, reg, FMC2_BXTR_DATAHLD, val);
  695. return 0;
  696. }
  697. static int stm32_fmc2_ebi_set_clk_period(struct stm32_fmc2_ebi *ebi,
  698. const struct stm32_fmc2_prop *prop,
  699. int cs, u32 setup)
  700. {
  701. u32 val;
  702. val = setup ? clamp_val(setup - 1, 1, FMC2_BTR_CLKDIV_MAX) : 1;
  703. val = FIELD_PREP(FMC2_BTR_CLKDIV, val);
  704. regmap_update_bits(ebi->regmap, FMC2_BTR(cs), FMC2_BTR_CLKDIV, val);
  705. return 0;
  706. }
  707. static int stm32_fmc2_ebi_mp25_set_clk_period(struct stm32_fmc2_ebi *ebi,
  708. const struct stm32_fmc2_prop *prop,
  709. int cs, u32 setup)
  710. {
  711. u32 val, cfgr;
  712. int ret;
  713. ret = regmap_read(ebi->regmap, FMC2_CFGR, &cfgr);
  714. if (ret)
  715. return ret;
  716. if (cfgr & FMC2_CFGR_CCLKEN) {
  717. val = setup ? clamp_val(setup - 1, 1, FMC2_CFGR_CLKDIV_MAX) : 1;
  718. val = FIELD_PREP(FMC2_CFGR_CLKDIV, val);
  719. regmap_update_bits(ebi->regmap, FMC2_CFGR, FMC2_CFGR_CLKDIV, val);
  720. } else {
  721. val = setup ? clamp_val(setup - 1, 1, FMC2_BTR_CLKDIV_MAX) : 1;
  722. val = FIELD_PREP(FMC2_BTR_CLKDIV, val);
  723. regmap_update_bits(ebi->regmap, FMC2_BTR(cs), FMC2_BTR_CLKDIV, val);
  724. }
  725. return 0;
  726. }
  727. static int stm32_fmc2_ebi_set_data_latency(struct stm32_fmc2_ebi *ebi,
  728. const struct stm32_fmc2_prop *prop,
  729. int cs, u32 setup)
  730. {
  731. u32 val;
  732. val = setup > 1 ? min_t(u32, setup - 2, FMC2_BTR_DATLAT_MAX) : 0;
  733. val = FIELD_PREP(FMC2_BTR_DATLAT, val);
  734. regmap_update_bits(ebi->regmap, FMC2_BTR(cs), FMC2_BTR_DATLAT, val);
  735. return 0;
  736. }
  737. static int stm32_fmc2_ebi_set_max_low_pulse(struct stm32_fmc2_ebi *ebi,
  738. const struct stm32_fmc2_prop *prop,
  739. int cs, u32 setup)
  740. {
  741. u32 old_val, new_val, pcscntr;
  742. int ret;
  743. if (setup < 1)
  744. return 0;
  745. ret = regmap_read(ebi->regmap, FMC2_PCSCNTR, &pcscntr);
  746. if (ret)
  747. return ret;
  748. /* Enable counter for the bank */
  749. regmap_update_bits(ebi->regmap, FMC2_PCSCNTR,
  750. FMC2_PCSCNTR_CNTBEN(cs),
  751. FMC2_PCSCNTR_CNTBEN(cs));
  752. new_val = min_t(u32, setup - 1, FMC2_PCSCNTR_CSCOUNT_MAX);
  753. old_val = FIELD_GET(FMC2_PCSCNTR_CSCOUNT, pcscntr);
  754. if (old_val && new_val > old_val)
  755. /* Keep current counter value */
  756. return 0;
  757. new_val = FIELD_PREP(FMC2_PCSCNTR_CSCOUNT, new_val);
  758. regmap_update_bits(ebi->regmap, FMC2_PCSCNTR,
  759. FMC2_PCSCNTR_CSCOUNT, new_val);
  760. return 0;
  761. }
  762. static int stm32_fmc2_ebi_mp25_set_max_low_pulse(struct stm32_fmc2_ebi *ebi,
  763. const struct stm32_fmc2_prop *prop,
  764. int cs, u32 setup)
  765. {
  766. u32 val;
  767. if (setup == FMC2_CSCOUNT_0)
  768. val = FIELD_PREP(FMC2_BCR_CSCOUNT, FMC2_BCR_CSCOUNT_0);
  769. else if (setup == FMC2_CSCOUNT_1)
  770. val = FIELD_PREP(FMC2_BCR_CSCOUNT, FMC2_BCR_CSCOUNT_1);
  771. else if (setup <= FMC2_CSCOUNT_64)
  772. val = FIELD_PREP(FMC2_BCR_CSCOUNT, FMC2_BCR_CSCOUNT_64);
  773. else
  774. val = FIELD_PREP(FMC2_BCR_CSCOUNT, FMC2_BCR_CSCOUNT_256);
  775. regmap_update_bits(ebi->regmap, FMC2_BCR(cs),
  776. FMC2_BCR_CSCOUNT, val);
  777. return 0;
  778. }
  779. static const struct stm32_fmc2_prop stm32_fmc2_child_props[] = {
  780. /* st,fmc2-ebi-cs-trans-type must be the first property */
  781. {
  782. .name = "st,fmc2-ebi-cs-transaction-type",
  783. .mprop = true,
  784. .set = stm32_fmc2_ebi_set_trans_type,
  785. },
  786. {
  787. .name = "st,fmc2-ebi-cs-cclk-enable",
  788. .bprop = true,
  789. .reg_type = FMC2_REG_BCR,
  790. .reg_mask = FMC2_BCR1_CCLKEN,
  791. .check = stm32_fmc2_ebi_check_cclk,
  792. .set = stm32_fmc2_ebi_set_bit_field,
  793. },
  794. {
  795. .name = "st,fmc2-ebi-cs-mux-enable",
  796. .bprop = true,
  797. .reg_type = FMC2_REG_BCR,
  798. .reg_mask = FMC2_BCR_MUXEN,
  799. .check = stm32_fmc2_ebi_check_mux,
  800. .set = stm32_fmc2_ebi_set_bit_field,
  801. },
  802. {
  803. .name = "st,fmc2-ebi-cs-buswidth",
  804. .reset_val = FMC2_BUSWIDTH_16,
  805. .set = stm32_fmc2_ebi_set_buswidth,
  806. },
  807. {
  808. .name = "st,fmc2-ebi-cs-waitpol-high",
  809. .bprop = true,
  810. .reg_type = FMC2_REG_BCR,
  811. .reg_mask = FMC2_BCR_WAITPOL,
  812. .set = stm32_fmc2_ebi_set_bit_field,
  813. },
  814. {
  815. .name = "st,fmc2-ebi-cs-waitcfg-enable",
  816. .bprop = true,
  817. .reg_type = FMC2_REG_BCR,
  818. .reg_mask = FMC2_BCR_WAITCFG,
  819. .check = stm32_fmc2_ebi_check_waitcfg,
  820. .set = stm32_fmc2_ebi_set_bit_field,
  821. },
  822. {
  823. .name = "st,fmc2-ebi-cs-wait-enable",
  824. .bprop = true,
  825. .reg_type = FMC2_REG_BCR,
  826. .reg_mask = FMC2_BCR_WAITEN,
  827. .check = stm32_fmc2_ebi_check_sync_trans,
  828. .set = stm32_fmc2_ebi_set_bit_field,
  829. },
  830. {
  831. .name = "st,fmc2-ebi-cs-asyncwait-enable",
  832. .bprop = true,
  833. .reg_type = FMC2_REG_BCR,
  834. .reg_mask = FMC2_BCR_ASYNCWAIT,
  835. .check = stm32_fmc2_ebi_check_async_trans,
  836. .set = stm32_fmc2_ebi_set_bit_field,
  837. },
  838. {
  839. .name = "st,fmc2-ebi-cs-cpsize",
  840. .check = stm32_fmc2_ebi_check_cpsize,
  841. .set = stm32_fmc2_ebi_set_cpsize,
  842. },
  843. {
  844. .name = "st,fmc2-ebi-cs-byte-lane-setup-ns",
  845. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  846. .set = stm32_fmc2_ebi_set_bl_setup,
  847. },
  848. {
  849. .name = "st,fmc2-ebi-cs-address-setup-ns",
  850. .reg_type = FMC2_REG_BTR,
  851. .reset_val = FMC2_BXTR_ADDSET_MAX,
  852. .check = stm32_fmc2_ebi_check_async_trans,
  853. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  854. .set = stm32_fmc2_ebi_set_address_setup,
  855. },
  856. {
  857. .name = "st,fmc2-ebi-cs-address-hold-ns",
  858. .reg_type = FMC2_REG_BTR,
  859. .reset_val = FMC2_BXTR_ADDHLD_MAX,
  860. .check = stm32_fmc2_ebi_check_address_hold,
  861. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  862. .set = stm32_fmc2_ebi_set_address_hold,
  863. },
  864. {
  865. .name = "st,fmc2-ebi-cs-data-setup-ns",
  866. .reg_type = FMC2_REG_BTR,
  867. .reset_val = FMC2_BXTR_DATAST_MAX,
  868. .check = stm32_fmc2_ebi_check_async_trans,
  869. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  870. .set = stm32_fmc2_ebi_set_data_setup,
  871. },
  872. {
  873. .name = "st,fmc2-ebi-cs-bus-turnaround-ns",
  874. .reg_type = FMC2_REG_BTR,
  875. .reset_val = FMC2_BXTR_BUSTURN_MAX + 1,
  876. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  877. .set = stm32_fmc2_ebi_set_bus_turnaround,
  878. },
  879. {
  880. .name = "st,fmc2-ebi-cs-data-hold-ns",
  881. .reg_type = FMC2_REG_BTR,
  882. .check = stm32_fmc2_ebi_check_async_trans,
  883. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  884. .set = stm32_fmc2_ebi_set_data_hold,
  885. },
  886. {
  887. .name = "st,fmc2-ebi-cs-clk-period-ns",
  888. .reset_val = FMC2_BTR_CLKDIV_MAX + 1,
  889. .check = stm32_fmc2_ebi_check_clk_period,
  890. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  891. .set = stm32_fmc2_ebi_set_clk_period,
  892. },
  893. {
  894. .name = "st,fmc2-ebi-cs-data-latency-ns",
  895. .check = stm32_fmc2_ebi_check_sync_trans,
  896. .calculate = stm32_fmc2_ebi_ns_to_clk_period,
  897. .set = stm32_fmc2_ebi_set_data_latency,
  898. },
  899. {
  900. .name = "st,fmc2-ebi-cs-write-address-setup-ns",
  901. .reg_type = FMC2_REG_BWTR,
  902. .reset_val = FMC2_BXTR_ADDSET_MAX,
  903. .check = stm32_fmc2_ebi_check_async_trans,
  904. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  905. .set = stm32_fmc2_ebi_set_address_setup,
  906. },
  907. {
  908. .name = "st,fmc2-ebi-cs-write-address-hold-ns",
  909. .reg_type = FMC2_REG_BWTR,
  910. .reset_val = FMC2_BXTR_ADDHLD_MAX,
  911. .check = stm32_fmc2_ebi_check_address_hold,
  912. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  913. .set = stm32_fmc2_ebi_set_address_hold,
  914. },
  915. {
  916. .name = "st,fmc2-ebi-cs-write-data-setup-ns",
  917. .reg_type = FMC2_REG_BWTR,
  918. .reset_val = FMC2_BXTR_DATAST_MAX,
  919. .check = stm32_fmc2_ebi_check_async_trans,
  920. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  921. .set = stm32_fmc2_ebi_set_data_setup,
  922. },
  923. {
  924. .name = "st,fmc2-ebi-cs-write-bus-turnaround-ns",
  925. .reg_type = FMC2_REG_BWTR,
  926. .reset_val = FMC2_BXTR_BUSTURN_MAX + 1,
  927. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  928. .set = stm32_fmc2_ebi_set_bus_turnaround,
  929. },
  930. {
  931. .name = "st,fmc2-ebi-cs-write-data-hold-ns",
  932. .reg_type = FMC2_REG_BWTR,
  933. .check = stm32_fmc2_ebi_check_async_trans,
  934. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  935. .set = stm32_fmc2_ebi_set_data_hold,
  936. },
  937. {
  938. .name = "st,fmc2-ebi-cs-max-low-pulse-ns",
  939. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  940. .set = stm32_fmc2_ebi_set_max_low_pulse,
  941. },
  942. };
  943. static const struct stm32_fmc2_prop stm32_fmc2_mp25_child_props[] = {
  944. /* st,fmc2-ebi-cs-trans-type must be the first property */
  945. {
  946. .name = "st,fmc2-ebi-cs-transaction-type",
  947. .mprop = true,
  948. .set = stm32_fmc2_ebi_set_trans_type,
  949. },
  950. {
  951. .name = "st,fmc2-ebi-cs-cclk-enable",
  952. .bprop = true,
  953. .reg_type = FMC2_REG_CFGR,
  954. .reg_mask = FMC2_CFGR_CCLKEN,
  955. .check = stm32_fmc2_ebi_mp25_check_cclk,
  956. .set = stm32_fmc2_ebi_set_bit_field,
  957. },
  958. {
  959. .name = "st,fmc2-ebi-cs-mux-enable",
  960. .bprop = true,
  961. .reg_type = FMC2_REG_BCR,
  962. .reg_mask = FMC2_BCR_MUXEN,
  963. .check = stm32_fmc2_ebi_check_mux,
  964. .set = stm32_fmc2_ebi_set_bit_field,
  965. },
  966. {
  967. .name = "st,fmc2-ebi-cs-buswidth",
  968. .reset_val = FMC2_BUSWIDTH_16,
  969. .set = stm32_fmc2_ebi_set_buswidth,
  970. },
  971. {
  972. .name = "st,fmc2-ebi-cs-waitpol-high",
  973. .bprop = true,
  974. .reg_type = FMC2_REG_BCR,
  975. .reg_mask = FMC2_BCR_WAITPOL,
  976. .set = stm32_fmc2_ebi_set_bit_field,
  977. },
  978. {
  979. .name = "st,fmc2-ebi-cs-waitcfg-enable",
  980. .bprop = true,
  981. .reg_type = FMC2_REG_BCR,
  982. .reg_mask = FMC2_BCR_WAITCFG,
  983. .check = stm32_fmc2_ebi_check_waitcfg,
  984. .set = stm32_fmc2_ebi_set_bit_field,
  985. },
  986. {
  987. .name = "st,fmc2-ebi-cs-wait-enable",
  988. .bprop = true,
  989. .reg_type = FMC2_REG_BCR,
  990. .reg_mask = FMC2_BCR_WAITEN,
  991. .check = stm32_fmc2_ebi_check_sync_trans,
  992. .set = stm32_fmc2_ebi_set_bit_field,
  993. },
  994. {
  995. .name = "st,fmc2-ebi-cs-asyncwait-enable",
  996. .bprop = true,
  997. .reg_type = FMC2_REG_BCR,
  998. .reg_mask = FMC2_BCR_ASYNCWAIT,
  999. .check = stm32_fmc2_ebi_check_async_trans,
  1000. .set = stm32_fmc2_ebi_set_bit_field,
  1001. },
  1002. {
  1003. .name = "st,fmc2-ebi-cs-cpsize",
  1004. .check = stm32_fmc2_ebi_check_cpsize,
  1005. .set = stm32_fmc2_ebi_set_cpsize,
  1006. },
  1007. {
  1008. .name = "st,fmc2-ebi-cs-byte-lane-setup-ns",
  1009. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  1010. .set = stm32_fmc2_ebi_set_bl_setup,
  1011. },
  1012. {
  1013. .name = "st,fmc2-ebi-cs-address-setup-ns",
  1014. .reg_type = FMC2_REG_BTR,
  1015. .reset_val = FMC2_BXTR_ADDSET_MAX,
  1016. .check = stm32_fmc2_ebi_check_async_trans,
  1017. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  1018. .set = stm32_fmc2_ebi_set_address_setup,
  1019. },
  1020. {
  1021. .name = "st,fmc2-ebi-cs-address-hold-ns",
  1022. .reg_type = FMC2_REG_BTR,
  1023. .reset_val = FMC2_BXTR_ADDHLD_MAX,
  1024. .check = stm32_fmc2_ebi_check_address_hold,
  1025. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  1026. .set = stm32_fmc2_ebi_set_address_hold,
  1027. },
  1028. {
  1029. .name = "st,fmc2-ebi-cs-data-setup-ns",
  1030. .reg_type = FMC2_REG_BTR,
  1031. .reset_val = FMC2_BXTR_DATAST_MAX,
  1032. .check = stm32_fmc2_ebi_check_async_trans,
  1033. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  1034. .set = stm32_fmc2_ebi_set_data_setup,
  1035. },
  1036. {
  1037. .name = "st,fmc2-ebi-cs-bus-turnaround-ns",
  1038. .reg_type = FMC2_REG_BTR,
  1039. .reset_val = FMC2_BXTR_BUSTURN_MAX + 1,
  1040. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  1041. .set = stm32_fmc2_ebi_set_bus_turnaround,
  1042. },
  1043. {
  1044. .name = "st,fmc2-ebi-cs-data-hold-ns",
  1045. .reg_type = FMC2_REG_BTR,
  1046. .check = stm32_fmc2_ebi_check_async_trans,
  1047. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  1048. .set = stm32_fmc2_ebi_set_data_hold,
  1049. },
  1050. {
  1051. .name = "st,fmc2-ebi-cs-clk-period-ns",
  1052. .reset_val = FMC2_CFGR_CLKDIV_MAX + 1,
  1053. .check = stm32_fmc2_ebi_mp25_check_clk_period,
  1054. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  1055. .set = stm32_fmc2_ebi_mp25_set_clk_period,
  1056. },
  1057. {
  1058. .name = "st,fmc2-ebi-cs-data-latency-ns",
  1059. .check = stm32_fmc2_ebi_check_sync_trans,
  1060. .calculate = stm32_fmc2_ebi_mp25_ns_to_clk_period,
  1061. .set = stm32_fmc2_ebi_set_data_latency,
  1062. },
  1063. {
  1064. .name = "st,fmc2-ebi-cs-write-address-setup-ns",
  1065. .reg_type = FMC2_REG_BWTR,
  1066. .reset_val = FMC2_BXTR_ADDSET_MAX,
  1067. .check = stm32_fmc2_ebi_check_async_trans,
  1068. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  1069. .set = stm32_fmc2_ebi_set_address_setup,
  1070. },
  1071. {
  1072. .name = "st,fmc2-ebi-cs-write-address-hold-ns",
  1073. .reg_type = FMC2_REG_BWTR,
  1074. .reset_val = FMC2_BXTR_ADDHLD_MAX,
  1075. .check = stm32_fmc2_ebi_check_address_hold,
  1076. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  1077. .set = stm32_fmc2_ebi_set_address_hold,
  1078. },
  1079. {
  1080. .name = "st,fmc2-ebi-cs-write-data-setup-ns",
  1081. .reg_type = FMC2_REG_BWTR,
  1082. .reset_val = FMC2_BXTR_DATAST_MAX,
  1083. .check = stm32_fmc2_ebi_check_async_trans,
  1084. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  1085. .set = stm32_fmc2_ebi_set_data_setup,
  1086. },
  1087. {
  1088. .name = "st,fmc2-ebi-cs-write-bus-turnaround-ns",
  1089. .reg_type = FMC2_REG_BWTR,
  1090. .reset_val = FMC2_BXTR_BUSTURN_MAX + 1,
  1091. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  1092. .set = stm32_fmc2_ebi_set_bus_turnaround,
  1093. },
  1094. {
  1095. .name = "st,fmc2-ebi-cs-write-data-hold-ns",
  1096. .reg_type = FMC2_REG_BWTR,
  1097. .check = stm32_fmc2_ebi_check_async_trans,
  1098. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  1099. .set = stm32_fmc2_ebi_set_data_hold,
  1100. },
  1101. {
  1102. .name = "st,fmc2-ebi-cs-max-low-pulse-ns",
  1103. .calculate = stm32_fmc2_ebi_ns_to_clock_cycles,
  1104. .set = stm32_fmc2_ebi_mp25_set_max_low_pulse,
  1105. },
  1106. };
  1107. static int stm32_fmc2_ebi_mp25_check_rif(struct stm32_fmc2_ebi *ebi, u32 resource)
  1108. {
  1109. u32 seccfgr, cidcfgr, semcr;
  1110. int cid, ret;
  1111. if (resource >= FMC2_MAX_RESOURCES)
  1112. return -EINVAL;
  1113. ret = regmap_read(ebi->regmap, FMC2_SECCFGR, &seccfgr);
  1114. if (ret)
  1115. return ret;
  1116. if (seccfgr & BIT(resource)) {
  1117. if (resource)
  1118. dev_err(ebi->dev, "resource %d is configured as secure\n",
  1119. resource);
  1120. return -EACCES;
  1121. }
  1122. ret = regmap_read(ebi->regmap, FMC2_CIDCFGR(resource), &cidcfgr);
  1123. if (ret)
  1124. return ret;
  1125. if (!(cidcfgr & FMC2_CIDCFGR_CFEN))
  1126. /* CID filtering is turned off: access granted */
  1127. return 0;
  1128. if (!(cidcfgr & FMC2_CIDCFGR_SEMEN)) {
  1129. /* Static CID mode */
  1130. cid = FIELD_GET(FMC2_CIDCFGR_SCID, cidcfgr);
  1131. if (cid != FMC2_CID1) {
  1132. if (resource)
  1133. dev_err(ebi->dev, "static CID%d set for resource %d\n",
  1134. cid, resource);
  1135. return -EACCES;
  1136. }
  1137. return 0;
  1138. }
  1139. /* Pass-list with semaphore mode */
  1140. if (!(cidcfgr & FMC2_CIDCFGR_SEMWLC1)) {
  1141. if (resource)
  1142. dev_err(ebi->dev, "CID1 is block-listed for resource %d\n",
  1143. resource);
  1144. return -EACCES;
  1145. }
  1146. ret = regmap_read(ebi->regmap, FMC2_SEMCR(resource), &semcr);
  1147. if (ret)
  1148. return ret;
  1149. if (!(semcr & FMC2_SEMCR_SEM_MUTEX)) {
  1150. regmap_update_bits(ebi->regmap, FMC2_SEMCR(resource),
  1151. FMC2_SEMCR_SEM_MUTEX, FMC2_SEMCR_SEM_MUTEX);
  1152. ret = regmap_read(ebi->regmap, FMC2_SEMCR(resource), &semcr);
  1153. if (ret)
  1154. return ret;
  1155. }
  1156. cid = FIELD_GET(FMC2_SEMCR_SEMCID, semcr);
  1157. if (cid != FMC2_CID1) {
  1158. if (resource)
  1159. dev_err(ebi->dev, "resource %d is already used by CID%d\n",
  1160. resource, cid);
  1161. return -EACCES;
  1162. }
  1163. ebi->sem_taken |= BIT(resource);
  1164. return 0;
  1165. }
  1166. static void stm32_fmc2_ebi_mp25_put_sems(struct stm32_fmc2_ebi *ebi)
  1167. {
  1168. unsigned int resource;
  1169. for (resource = 0; resource < FMC2_MAX_RESOURCES; resource++) {
  1170. if (!(ebi->sem_taken & BIT(resource)))
  1171. continue;
  1172. regmap_update_bits(ebi->regmap, FMC2_SEMCR(resource),
  1173. FMC2_SEMCR_SEM_MUTEX, 0);
  1174. }
  1175. }
  1176. static void stm32_fmc2_ebi_mp25_get_sems(struct stm32_fmc2_ebi *ebi)
  1177. {
  1178. unsigned int resource;
  1179. for (resource = 0; resource < FMC2_MAX_RESOURCES; resource++) {
  1180. if (!(ebi->sem_taken & BIT(resource)))
  1181. continue;
  1182. regmap_update_bits(ebi->regmap, FMC2_SEMCR(resource),
  1183. FMC2_SEMCR_SEM_MUTEX, FMC2_SEMCR_SEM_MUTEX);
  1184. }
  1185. }
  1186. static int stm32_fmc2_ebi_parse_prop(struct stm32_fmc2_ebi *ebi,
  1187. struct device_node *dev_node,
  1188. const struct stm32_fmc2_prop *prop,
  1189. int cs)
  1190. {
  1191. struct device *dev = ebi->dev;
  1192. u32 setup = 0;
  1193. if (!prop->set) {
  1194. dev_err(dev, "property %s is not well defined\n", prop->name);
  1195. return -EINVAL;
  1196. }
  1197. if (prop->check && prop->check(ebi, prop, cs))
  1198. /* Skeep this property */
  1199. return 0;
  1200. if (prop->bprop) {
  1201. bool bprop;
  1202. bprop = of_property_read_bool(dev_node, prop->name);
  1203. if (prop->mprop && !bprop) {
  1204. dev_err(dev, "mandatory property %s not defined in the device tree\n",
  1205. prop->name);
  1206. return -EINVAL;
  1207. }
  1208. if (bprop)
  1209. setup = 1;
  1210. } else {
  1211. u32 val;
  1212. int ret;
  1213. ret = of_property_read_u32(dev_node, prop->name, &val);
  1214. if (prop->mprop && ret) {
  1215. dev_err(dev, "mandatory property %s not defined in the device tree\n",
  1216. prop->name);
  1217. return ret;
  1218. }
  1219. if (ret)
  1220. setup = prop->reset_val;
  1221. else if (prop->calculate)
  1222. setup = prop->calculate(ebi, cs, val);
  1223. else
  1224. setup = val;
  1225. }
  1226. return prop->set(ebi, prop, cs, setup);
  1227. }
  1228. static void stm32_fmc2_ebi_enable_bank(struct stm32_fmc2_ebi *ebi, int cs)
  1229. {
  1230. regmap_update_bits(ebi->regmap, FMC2_BCR(cs),
  1231. FMC2_BCR_MBKEN, FMC2_BCR_MBKEN);
  1232. }
  1233. static void stm32_fmc2_ebi_disable_bank(struct stm32_fmc2_ebi *ebi, int cs)
  1234. {
  1235. regmap_update_bits(ebi->regmap, FMC2_BCR(cs), FMC2_BCR_MBKEN, 0);
  1236. }
  1237. static int stm32_fmc2_ebi_save_setup(struct stm32_fmc2_ebi *ebi)
  1238. {
  1239. unsigned int cs;
  1240. int ret;
  1241. for (cs = 0; cs < FMC2_MAX_EBI_CE; cs++) {
  1242. if (!(ebi->bank_assigned & BIT(cs)))
  1243. continue;
  1244. ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &ebi->bcr[cs]);
  1245. ret |= regmap_read(ebi->regmap, FMC2_BTR(cs), &ebi->btr[cs]);
  1246. ret |= regmap_read(ebi->regmap, FMC2_BWTR(cs), &ebi->bwtr[cs]);
  1247. if (ret)
  1248. return ret;
  1249. }
  1250. return 0;
  1251. }
  1252. static int stm32_fmc2_ebi_mp1_save_setup(struct stm32_fmc2_ebi *ebi)
  1253. {
  1254. int ret;
  1255. ret = stm32_fmc2_ebi_save_setup(ebi);
  1256. if (ret)
  1257. return ret;
  1258. return regmap_read(ebi->regmap, FMC2_PCSCNTR, &ebi->pcscntr);
  1259. }
  1260. static int stm32_fmc2_ebi_mp25_save_setup(struct stm32_fmc2_ebi *ebi)
  1261. {
  1262. int ret;
  1263. ret = stm32_fmc2_ebi_save_setup(ebi);
  1264. if (ret)
  1265. return ret;
  1266. if (ebi->access_granted)
  1267. ret = regmap_read(ebi->regmap, FMC2_CFGR, &ebi->cfgr);
  1268. return ret;
  1269. }
  1270. static void stm32_fmc2_ebi_set_setup(struct stm32_fmc2_ebi *ebi)
  1271. {
  1272. unsigned int cs;
  1273. for (cs = 0; cs < FMC2_MAX_EBI_CE; cs++) {
  1274. if (!(ebi->bank_assigned & BIT(cs)))
  1275. continue;
  1276. regmap_write(ebi->regmap, FMC2_BCR(cs), ebi->bcr[cs]);
  1277. regmap_write(ebi->regmap, FMC2_BTR(cs), ebi->btr[cs]);
  1278. regmap_write(ebi->regmap, FMC2_BWTR(cs), ebi->bwtr[cs]);
  1279. }
  1280. }
  1281. static void stm32_fmc2_ebi_mp1_set_setup(struct stm32_fmc2_ebi *ebi)
  1282. {
  1283. stm32_fmc2_ebi_set_setup(ebi);
  1284. regmap_write(ebi->regmap, FMC2_PCSCNTR, ebi->pcscntr);
  1285. }
  1286. static void stm32_fmc2_ebi_mp25_set_setup(struct stm32_fmc2_ebi *ebi)
  1287. {
  1288. stm32_fmc2_ebi_set_setup(ebi);
  1289. if (ebi->access_granted)
  1290. regmap_write(ebi->regmap, FMC2_CFGR, ebi->cfgr);
  1291. }
  1292. static void stm32_fmc2_ebi_disable_banks(struct stm32_fmc2_ebi *ebi)
  1293. {
  1294. unsigned int cs;
  1295. for (cs = 0; cs < FMC2_MAX_EBI_CE; cs++) {
  1296. if (!(ebi->bank_assigned & BIT(cs)))
  1297. continue;
  1298. stm32_fmc2_ebi_disable_bank(ebi, cs);
  1299. }
  1300. }
  1301. /* NWAIT signal can not be connected to EBI controller and NAND controller */
  1302. static int stm32_fmc2_ebi_nwait_used_by_ctrls(struct stm32_fmc2_ebi *ebi)
  1303. {
  1304. struct device *dev = ebi->dev;
  1305. unsigned int cs;
  1306. u32 bcr;
  1307. int ret;
  1308. for (cs = 0; cs < FMC2_MAX_EBI_CE; cs++) {
  1309. if (!(ebi->bank_assigned & BIT(cs)))
  1310. continue;
  1311. ret = regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
  1312. if (ret)
  1313. return ret;
  1314. if ((bcr & FMC2_BCR_WAITEN || bcr & FMC2_BCR_ASYNCWAIT) &&
  1315. ebi->bank_assigned & BIT(FMC2_NAND)) {
  1316. dev_err(dev, "NWAIT signal connected to EBI and NAND controllers\n");
  1317. return -EINVAL;
  1318. }
  1319. }
  1320. return 0;
  1321. }
  1322. static void stm32_fmc2_ebi_enable(struct stm32_fmc2_ebi *ebi)
  1323. {
  1324. if (!ebi->access_granted)
  1325. return;
  1326. regmap_update_bits(ebi->regmap, ebi->data->fmc2_enable_reg,
  1327. ebi->data->fmc2_enable_bit,
  1328. ebi->data->fmc2_enable_bit);
  1329. }
  1330. static void stm32_fmc2_ebi_disable(struct stm32_fmc2_ebi *ebi)
  1331. {
  1332. if (!ebi->access_granted)
  1333. return;
  1334. regmap_update_bits(ebi->regmap, ebi->data->fmc2_enable_reg,
  1335. ebi->data->fmc2_enable_bit, 0);
  1336. }
  1337. static int stm32_fmc2_ebi_setup_cs(struct stm32_fmc2_ebi *ebi,
  1338. struct device_node *dev_node,
  1339. u32 cs)
  1340. {
  1341. unsigned int i;
  1342. int ret;
  1343. stm32_fmc2_ebi_disable_bank(ebi, cs);
  1344. for (i = 0; i < ebi->data->nb_child_props; i++) {
  1345. const struct stm32_fmc2_prop *p = &ebi->data->child_props[i];
  1346. ret = stm32_fmc2_ebi_parse_prop(ebi, dev_node, p, cs);
  1347. if (ret) {
  1348. dev_err(ebi->dev, "property %s could not be set: %d\n",
  1349. p->name, ret);
  1350. return ret;
  1351. }
  1352. }
  1353. stm32_fmc2_ebi_enable_bank(ebi, cs);
  1354. return 0;
  1355. }
  1356. static int stm32_fmc2_ebi_parse_dt(struct stm32_fmc2_ebi *ebi)
  1357. {
  1358. struct device *dev = ebi->dev;
  1359. bool child_found = false;
  1360. u32 bank;
  1361. int ret;
  1362. for_each_available_child_of_node_scoped(dev->of_node, child) {
  1363. ret = of_property_read_u32(child, "reg", &bank);
  1364. if (ret)
  1365. return dev_err_probe(dev, ret, "could not retrieve reg property\n");
  1366. if (bank >= FMC2_MAX_BANKS) {
  1367. dev_err(dev, "invalid reg value: %d\n", bank);
  1368. return -EINVAL;
  1369. }
  1370. if (ebi->bank_assigned & BIT(bank)) {
  1371. dev_err(dev, "bank already assigned: %d\n", bank);
  1372. return -EINVAL;
  1373. }
  1374. if (ebi->data->check_rif) {
  1375. ret = ebi->data->check_rif(ebi, bank + 1);
  1376. if (ret) {
  1377. dev_err(dev, "bank access failed: %d\n", bank);
  1378. return ret;
  1379. }
  1380. }
  1381. if (bank < FMC2_MAX_EBI_CE) {
  1382. ret = stm32_fmc2_ebi_setup_cs(ebi, child, bank);
  1383. if (ret)
  1384. return dev_err_probe(dev, ret,
  1385. "setup chip select %d failed\n", bank);
  1386. }
  1387. ebi->bank_assigned |= BIT(bank);
  1388. child_found = true;
  1389. }
  1390. if (!child_found) {
  1391. dev_warn(dev, "no subnodes found, disable the driver.\n");
  1392. return -ENODEV;
  1393. }
  1394. if (ebi->data->nwait_used_by_ctrls) {
  1395. ret = ebi->data->nwait_used_by_ctrls(ebi);
  1396. if (ret)
  1397. return ret;
  1398. }
  1399. stm32_fmc2_ebi_enable(ebi);
  1400. return of_platform_populate(dev->of_node, NULL, NULL, dev);
  1401. }
  1402. static int stm32_fmc2_ebi_probe(struct platform_device *pdev)
  1403. {
  1404. struct device *dev = &pdev->dev;
  1405. struct stm32_fmc2_ebi *ebi;
  1406. struct reset_control *rstc;
  1407. int ret;
  1408. ebi = devm_kzalloc(&pdev->dev, sizeof(*ebi), GFP_KERNEL);
  1409. if (!ebi)
  1410. return -ENOMEM;
  1411. ebi->dev = dev;
  1412. platform_set_drvdata(pdev, ebi);
  1413. ebi->data = of_device_get_match_data(dev);
  1414. if (!ebi->data)
  1415. return -EINVAL;
  1416. ebi->regmap = device_node_to_regmap(dev->of_node);
  1417. if (IS_ERR(ebi->regmap))
  1418. return PTR_ERR(ebi->regmap);
  1419. ebi->clk = devm_clk_get(dev, NULL);
  1420. if (IS_ERR(ebi->clk))
  1421. return PTR_ERR(ebi->clk);
  1422. rstc = devm_reset_control_get(dev, NULL);
  1423. if (PTR_ERR(rstc) == -EPROBE_DEFER)
  1424. return -EPROBE_DEFER;
  1425. ret = devm_pm_runtime_enable(dev);
  1426. if (ret)
  1427. return ret;
  1428. ret = pm_runtime_resume_and_get(dev);
  1429. if (ret < 0)
  1430. return ret;
  1431. if (!IS_ERR(rstc)) {
  1432. reset_control_assert(rstc);
  1433. reset_control_deassert(rstc);
  1434. }
  1435. /* Check if CFGR register can be modified */
  1436. ebi->access_granted = true;
  1437. if (ebi->data->check_rif) {
  1438. ret = ebi->data->check_rif(ebi, 0);
  1439. if (ret) {
  1440. u32 sr;
  1441. ebi->access_granted = false;
  1442. ret = regmap_read(ebi->regmap, FMC2_SR, &sr);
  1443. if (ret)
  1444. goto err_release;
  1445. /* In case of CFGR is secure, just check that the FMC2 is enabled */
  1446. if (sr & FMC2_SR_ISOST) {
  1447. dev_err(dev, "FMC2 is not ready to be used.\n");
  1448. ret = -EACCES;
  1449. goto err_release;
  1450. }
  1451. }
  1452. }
  1453. ret = stm32_fmc2_ebi_parse_dt(ebi);
  1454. if (ret)
  1455. goto err_release;
  1456. ret = ebi->data->save_setup(ebi);
  1457. if (ret)
  1458. goto err_release;
  1459. return 0;
  1460. err_release:
  1461. stm32_fmc2_ebi_disable_banks(ebi);
  1462. stm32_fmc2_ebi_disable(ebi);
  1463. if (ebi->data->put_sems)
  1464. ebi->data->put_sems(ebi);
  1465. pm_runtime_put_sync_suspend(dev);
  1466. return ret;
  1467. }
  1468. static void stm32_fmc2_ebi_remove(struct platform_device *pdev)
  1469. {
  1470. struct stm32_fmc2_ebi *ebi = platform_get_drvdata(pdev);
  1471. of_platform_depopulate(&pdev->dev);
  1472. stm32_fmc2_ebi_disable_banks(ebi);
  1473. stm32_fmc2_ebi_disable(ebi);
  1474. if (ebi->data->put_sems)
  1475. ebi->data->put_sems(ebi);
  1476. pm_runtime_put_sync_suspend(&pdev->dev);
  1477. }
  1478. static int __maybe_unused stm32_fmc2_ebi_runtime_suspend(struct device *dev)
  1479. {
  1480. struct stm32_fmc2_ebi *ebi = dev_get_drvdata(dev);
  1481. clk_disable_unprepare(ebi->clk);
  1482. return 0;
  1483. }
  1484. static int __maybe_unused stm32_fmc2_ebi_runtime_resume(struct device *dev)
  1485. {
  1486. struct stm32_fmc2_ebi *ebi = dev_get_drvdata(dev);
  1487. return clk_prepare_enable(ebi->clk);
  1488. }
  1489. static int __maybe_unused stm32_fmc2_ebi_suspend(struct device *dev)
  1490. {
  1491. struct stm32_fmc2_ebi *ebi = dev_get_drvdata(dev);
  1492. stm32_fmc2_ebi_disable(ebi);
  1493. if (ebi->data->put_sems)
  1494. ebi->data->put_sems(ebi);
  1495. pm_runtime_put_sync_suspend(dev);
  1496. pinctrl_pm_select_sleep_state(dev);
  1497. return 0;
  1498. }
  1499. static int __maybe_unused stm32_fmc2_ebi_resume(struct device *dev)
  1500. {
  1501. struct stm32_fmc2_ebi *ebi = dev_get_drvdata(dev);
  1502. int ret;
  1503. pinctrl_pm_select_default_state(dev);
  1504. ret = pm_runtime_resume_and_get(dev);
  1505. if (ret < 0)
  1506. return ret;
  1507. if (ebi->data->get_sems)
  1508. ebi->data->get_sems(ebi);
  1509. ebi->data->set_setup(ebi);
  1510. stm32_fmc2_ebi_enable(ebi);
  1511. return 0;
  1512. }
  1513. static const struct dev_pm_ops stm32_fmc2_ebi_pm_ops = {
  1514. SET_RUNTIME_PM_OPS(stm32_fmc2_ebi_runtime_suspend,
  1515. stm32_fmc2_ebi_runtime_resume, NULL)
  1516. SET_SYSTEM_SLEEP_PM_OPS(stm32_fmc2_ebi_suspend, stm32_fmc2_ebi_resume)
  1517. };
  1518. static const struct stm32_fmc2_ebi_data stm32_fmc2_ebi_mp1_data = {
  1519. .child_props = stm32_fmc2_child_props,
  1520. .nb_child_props = ARRAY_SIZE(stm32_fmc2_child_props),
  1521. .fmc2_enable_reg = FMC2_BCR1,
  1522. .fmc2_enable_bit = FMC2_BCR1_FMC2EN,
  1523. .nwait_used_by_ctrls = stm32_fmc2_ebi_nwait_used_by_ctrls,
  1524. .set_setup = stm32_fmc2_ebi_mp1_set_setup,
  1525. .save_setup = stm32_fmc2_ebi_mp1_save_setup,
  1526. };
  1527. static const struct stm32_fmc2_ebi_data stm32_fmc2_ebi_mp25_data = {
  1528. .child_props = stm32_fmc2_mp25_child_props,
  1529. .nb_child_props = ARRAY_SIZE(stm32_fmc2_mp25_child_props),
  1530. .fmc2_enable_reg = FMC2_CFGR,
  1531. .fmc2_enable_bit = FMC2_CFGR_FMC2EN,
  1532. .set_setup = stm32_fmc2_ebi_mp25_set_setup,
  1533. .save_setup = stm32_fmc2_ebi_mp25_save_setup,
  1534. .check_rif = stm32_fmc2_ebi_mp25_check_rif,
  1535. .put_sems = stm32_fmc2_ebi_mp25_put_sems,
  1536. .get_sems = stm32_fmc2_ebi_mp25_get_sems,
  1537. };
  1538. static const struct of_device_id stm32_fmc2_ebi_match[] = {
  1539. {
  1540. .compatible = "st,stm32mp1-fmc2-ebi",
  1541. .data = &stm32_fmc2_ebi_mp1_data,
  1542. },
  1543. {
  1544. .compatible = "st,stm32mp25-fmc2-ebi",
  1545. .data = &stm32_fmc2_ebi_mp25_data,
  1546. },
  1547. {}
  1548. };
  1549. MODULE_DEVICE_TABLE(of, stm32_fmc2_ebi_match);
  1550. static struct platform_driver stm32_fmc2_ebi_driver = {
  1551. .probe = stm32_fmc2_ebi_probe,
  1552. .remove_new = stm32_fmc2_ebi_remove,
  1553. .driver = {
  1554. .name = "stm32_fmc2_ebi",
  1555. .of_match_table = stm32_fmc2_ebi_match,
  1556. .pm = &stm32_fmc2_ebi_pm_ops,
  1557. },
  1558. };
  1559. module_platform_driver(stm32_fmc2_ebi_driver);
  1560. MODULE_ALIAS("platform:stm32_fmc2_ebi");
  1561. MODULE_AUTHOR("Christophe Kerello <christophe.kerello@st.com>");
  1562. MODULE_DESCRIPTION("STMicroelectronics STM32 FMC2 ebi driver");
  1563. MODULE_LICENSE("GPL v2");