Lines Matching refs:ebi
171 int (*check)(struct stm32_fmc2_ebi *ebi,
173 u32 (*calculate)(struct stm32_fmc2_ebi *ebi, int cs, u32 setup);
174 int (*set)(struct stm32_fmc2_ebi *ebi,
179 static int stm32_fmc2_ebi_check_mux(struct stm32_fmc2_ebi *ebi,
185 regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
193 static int stm32_fmc2_ebi_check_waitcfg(struct stm32_fmc2_ebi *ebi,
199 regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
207 static int stm32_fmc2_ebi_check_sync_trans(struct stm32_fmc2_ebi *ebi,
213 regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
221 static int stm32_fmc2_ebi_check_async_trans(struct stm32_fmc2_ebi *ebi,
227 regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
235 static int stm32_fmc2_ebi_check_cpsize(struct stm32_fmc2_ebi *ebi,
241 regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
249 static int stm32_fmc2_ebi_check_address_hold(struct stm32_fmc2_ebi *ebi,
255 regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
257 regmap_read(ebi->regmap, FMC2_BWTR(cs), &bxtr);
259 regmap_read(ebi->regmap, FMC2_BTR(cs), &bxtr);
268 static int stm32_fmc2_ebi_check_clk_period(struct stm32_fmc2_ebi *ebi,
274 regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
276 regmap_read(ebi->regmap, FMC2_BCR1, &bcr1);
286 static int stm32_fmc2_ebi_check_cclk(struct stm32_fmc2_ebi *ebi,
293 return stm32_fmc2_ebi_check_sync_trans(ebi, prop, cs);
296 static u32 stm32_fmc2_ebi_ns_to_clock_cycles(struct stm32_fmc2_ebi *ebi,
299 unsigned long hclk = clk_get_rate(ebi->clk);
305 static u32 stm32_fmc2_ebi_ns_to_clk_period(struct stm32_fmc2_ebi *ebi,
308 u32 nb_clk_cycles = stm32_fmc2_ebi_ns_to_clock_cycles(ebi, cs, setup);
311 regmap_read(ebi->regmap, FMC2_BCR1, &bcr);
313 regmap_read(ebi->regmap, FMC2_BTR1, &btr);
315 regmap_read(ebi->regmap, FMC2_BTR(cs), &btr);
344 static int stm32_fmc2_ebi_set_bit_field(struct stm32_fmc2_ebi *ebi,
355 regmap_update_bits(ebi->regmap, reg, prop->reg_mask,
361 static int stm32_fmc2_ebi_set_trans_type(struct stm32_fmc2_ebi *ebi,
486 regmap_update_bits(ebi->regmap, FMC2_BWTR(cs),
488 regmap_update_bits(ebi->regmap, FMC2_BTR(cs), btr_mask, btr);
489 regmap_update_bits(ebi->regmap, FMC2_BCR(cs), bcr_mask, bcr);
494 static int stm32_fmc2_ebi_set_buswidth(struct stm32_fmc2_ebi *ebi,
512 regmap_update_bits(ebi->regmap, FMC2_BCR(cs), FMC2_BCR_MWID, val);
517 static int stm32_fmc2_ebi_set_cpsize(struct stm32_fmc2_ebi *ebi,
544 regmap_update_bits(ebi->regmap, FMC2_BCR(cs), FMC2_BCR_CPSIZE, val);
549 static int stm32_fmc2_ebi_set_bl_setup(struct stm32_fmc2_ebi *ebi,
557 regmap_update_bits(ebi->regmap, FMC2_BCR(cs), FMC2_BCR_NBLSET, val);
562 static int stm32_fmc2_ebi_set_address_setup(struct stm32_fmc2_ebi *ebi,
574 regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
576 regmap_read(ebi->regmap, FMC2_BWTR(cs), &bxtr);
578 regmap_read(ebi->regmap, FMC2_BTR(cs), &bxtr);
585 regmap_update_bits(ebi->regmap, reg, FMC2_BXTR_ADDSET, val);
590 static int stm32_fmc2_ebi_set_address_hold(struct stm32_fmc2_ebi *ebi,
603 regmap_update_bits(ebi->regmap, reg, FMC2_BXTR_ADDHLD, val);
608 static int stm32_fmc2_ebi_set_data_setup(struct stm32_fmc2_ebi *ebi,
621 regmap_update_bits(ebi->regmap, reg, FMC2_BXTR_DATAST, val);
626 static int stm32_fmc2_ebi_set_bus_turnaround(struct stm32_fmc2_ebi *ebi,
639 regmap_update_bits(ebi->regmap, reg, FMC2_BXTR_BUSTURN, val);
644 static int stm32_fmc2_ebi_set_data_hold(struct stm32_fmc2_ebi *ebi,
660 regmap_update_bits(ebi->regmap, reg, FMC2_BXTR_DATAHLD, val);
665 static int stm32_fmc2_ebi_set_clk_period(struct stm32_fmc2_ebi *ebi,
673 regmap_update_bits(ebi->regmap, FMC2_BTR(cs), FMC2_BTR_CLKDIV, val);
678 static int stm32_fmc2_ebi_set_data_latency(struct stm32_fmc2_ebi *ebi,
686 regmap_update_bits(ebi->regmap, FMC2_BTR(cs), FMC2_BTR_DATLAT, val);
691 static int stm32_fmc2_ebi_set_max_low_pulse(struct stm32_fmc2_ebi *ebi,
700 regmap_read(ebi->regmap, FMC2_PCSCNTR, &pcscntr);
703 regmap_update_bits(ebi->regmap, FMC2_PCSCNTR,
714 regmap_update_bits(ebi->regmap, FMC2_PCSCNTR,
721 /* st,fmc2-ebi-cs-trans-type must be the first property */
723 .name = "st,fmc2-ebi-cs-transaction-type",
728 .name = "st,fmc2-ebi-cs-cclk-enable",
736 .name = "st,fmc2-ebi-cs-mux-enable",
744 .name = "st,fmc2-ebi-cs-buswidth",
749 .name = "st,fmc2-ebi-cs-waitpol-high",
756 .name = "st,fmc2-ebi-cs-waitcfg-enable",
764 .name = "st,fmc2-ebi-cs-wait-enable",
772 .name = "st,fmc2-ebi-cs-asyncwait-enable",
780 .name = "st,fmc2-ebi-cs-cpsize",
785 .name = "st,fmc2-ebi-cs-byte-lane-setup-ns",
790 .name = "st,fmc2-ebi-cs-address-setup-ns",
798 .name = "st,fmc2-ebi-cs-address-hold-ns",
806 .name = "st,fmc2-ebi-cs-data-setup-ns",
814 .name = "st,fmc2-ebi-cs-bus-turnaround-ns",
821 .name = "st,fmc2-ebi-cs-data-hold-ns",
828 .name = "st,fmc2-ebi-cs-clk-period-ns",
835 .name = "st,fmc2-ebi-cs-data-latency-ns",
841 .name = "st,fmc2-ebi-cs-write-address-setup-ns",
849 .name = "st,fmc2-ebi-cs-write-address-hold-ns",
857 .name = "st,fmc2-ebi-cs-write-data-setup-ns",
865 .name = "st,fmc2-ebi-cs-write-bus-turnaround-ns",
872 .name = "st,fmc2-ebi-cs-write-data-hold-ns",
879 .name = "st,fmc2-ebi-cs-max-low-pulse-ns",
885 static int stm32_fmc2_ebi_parse_prop(struct stm32_fmc2_ebi *ebi,
890 struct device *dev = ebi->dev;
898 if (prop->check && prop->check(ebi, prop, cs))
928 setup = prop->calculate(ebi, cs, val);
933 return prop->set(ebi, prop, cs, setup);
936 static void stm32_fmc2_ebi_enable_bank(struct stm32_fmc2_ebi *ebi, int cs)
938 regmap_update_bits(ebi->regmap, FMC2_BCR(cs),
942 static void stm32_fmc2_ebi_disable_bank(struct stm32_fmc2_ebi *ebi, int cs)
944 regmap_update_bits(ebi->regmap, FMC2_BCR(cs), FMC2_BCR_MBKEN, 0);
947 static void stm32_fmc2_ebi_save_setup(struct stm32_fmc2_ebi *ebi)
952 regmap_read(ebi->regmap, FMC2_BCR(cs), &ebi->bcr[cs]);
953 regmap_read(ebi->regmap, FMC2_BTR(cs), &ebi->btr[cs]);
954 regmap_read(ebi->regmap, FMC2_BWTR(cs), &ebi->bwtr[cs]);
957 regmap_read(ebi->regmap, FMC2_PCSCNTR, &ebi->pcscntr);
960 static void stm32_fmc2_ebi_set_setup(struct stm32_fmc2_ebi *ebi)
965 regmap_write(ebi->regmap, FMC2_BCR(cs), ebi->bcr[cs]);
966 regmap_write(ebi->regmap, FMC2_BTR(cs), ebi->btr[cs]);
967 regmap_write(ebi->regmap, FMC2_BWTR(cs), ebi->bwtr[cs]);
970 regmap_write(ebi->regmap, FMC2_PCSCNTR, ebi->pcscntr);
973 static void stm32_fmc2_ebi_disable_banks(struct stm32_fmc2_ebi *ebi)
978 if (!(ebi->bank_assigned & BIT(cs)))
981 stm32_fmc2_ebi_disable_bank(ebi, cs);
986 static bool stm32_fmc2_ebi_nwait_used_by_ctrls(struct stm32_fmc2_ebi *ebi)
992 if (!(ebi->bank_assigned & BIT(cs)))
995 regmap_read(ebi->regmap, FMC2_BCR(cs), &bcr);
997 ebi->bank_assigned & BIT(FMC2_NAND))
1004 static void stm32_fmc2_ebi_enable(struct stm32_fmc2_ebi *ebi)
1006 regmap_update_bits(ebi->regmap, FMC2_BCR1,
1010 static void stm32_fmc2_ebi_disable(struct stm32_fmc2_ebi *ebi)
1012 regmap_update_bits(ebi->regmap, FMC2_BCR1, FMC2_BCR1_FMC2EN, 0);
1015 static int stm32_fmc2_ebi_setup_cs(struct stm32_fmc2_ebi *ebi,
1022 stm32_fmc2_ebi_disable_bank(ebi, cs);
1027 ret = stm32_fmc2_ebi_parse_prop(ebi, dev_node, p, cs);
1029 dev_err(ebi->dev, "property %s could not be set: %d\n",
1035 stm32_fmc2_ebi_enable_bank(ebi, cs);
1040 static int stm32_fmc2_ebi_parse_dt(struct stm32_fmc2_ebi *ebi)
1042 struct device *dev = ebi->dev;
1063 if (ebi->bank_assigned & BIT(bank)) {
1070 ret = stm32_fmc2_ebi_setup_cs(ebi, child, bank);
1079 ebi->bank_assigned |= BIT(bank);
1088 if (stm32_fmc2_ebi_nwait_used_by_ctrls(ebi)) {
1093 stm32_fmc2_ebi_enable(ebi);
1101 struct stm32_fmc2_ebi *ebi;
1105 ebi = devm_kzalloc(&pdev->dev, sizeof(*ebi), GFP_KERNEL);
1106 if (!ebi)
1109 ebi->dev = dev;
1111 ebi->regmap = device_node_to_regmap(dev->of_node);
1112 if (IS_ERR(ebi->regmap))
1113 return PTR_ERR(ebi->regmap);
1115 ebi->clk = devm_clk_get(dev, NULL);
1116 if (IS_ERR(ebi->clk))
1117 return PTR_ERR(ebi->clk);
1123 ret = clk_prepare_enable(ebi->clk);
1132 ret = stm32_fmc2_ebi_parse_dt(ebi);
1136 stm32_fmc2_ebi_save_setup(ebi);
1137 platform_set_drvdata(pdev, ebi);
1142 stm32_fmc2_ebi_disable_banks(ebi);
1143 stm32_fmc2_ebi_disable(ebi);
1144 clk_disable_unprepare(ebi->clk);
1151 struct stm32_fmc2_ebi *ebi = platform_get_drvdata(pdev);
1154 stm32_fmc2_ebi_disable_banks(ebi);
1155 stm32_fmc2_ebi_disable(ebi);
1156 clk_disable_unprepare(ebi->clk);
1163 struct stm32_fmc2_ebi *ebi = dev_get_drvdata(dev);
1165 stm32_fmc2_ebi_disable(ebi);
1166 clk_disable_unprepare(ebi->clk);
1174 struct stm32_fmc2_ebi *ebi = dev_get_drvdata(dev);
1179 ret = clk_prepare_enable(ebi->clk);
1183 stm32_fmc2_ebi_set_setup(ebi);
1184 stm32_fmc2_ebi_enable(ebi);
1193 {.compatible = "st,stm32mp1-fmc2-ebi"},
1211 MODULE_DESCRIPTION("STMicroelectronics STM32 FMC2 ebi driver");