Linux Audio

Check our new training course

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