Lines Matching defs:nemc
20 #include <linux/jz4780-nemc.h>
96 struct jz4780_nemc *nemc = dev_get_drvdata(dev->parent);
99 nfcsr = readl(nemc->base + NEMC_NFCSR);
112 writel(nfcsr, nemc->base + NEMC_NFCSR);
127 struct jz4780_nemc *nemc = dev_get_drvdata(dev->parent);
130 nfcsr = readl(nemc->base + NEMC_NFCSR);
137 writel(nfcsr, nemc->base + NEMC_NFCSR);
141 static uint32_t jz4780_nemc_clk_period(struct jz4780_nemc *nemc)
145 rate = clk_get_rate(nemc->clk);
153 static uint32_t jz4780_nemc_ns_to_cycles(struct jz4780_nemc *nemc, uint32_t ns)
155 return ((ns * 1000) + nemc->clk_period - 1) / nemc->clk_period;
158 static bool jz4780_nemc_configure_bank(struct jz4780_nemc *nemc,
187 smcr = readl(nemc->base + NEMC_SMCRn(bank));
190 if (!of_property_read_u32(node, "ingenic,nemc-bus-width", &val)) {
201 dev_err(nemc->dev, "unsupported bus width: %u\n", val);
206 if (of_property_read_u32(node, "ingenic,nemc-tAS", &val) == 0) {
208 cycles = jz4780_nemc_ns_to_cycles(nemc, val);
209 if (cycles > nemc->soc_info->tas_tah_cycles_max) {
210 dev_err(nemc->dev, "tAS %u is too high (%u cycles)\n",
218 if (of_property_read_u32(node, "ingenic,nemc-tAH", &val) == 0) {
220 cycles = jz4780_nemc_ns_to_cycles(nemc, val);
221 if (cycles > nemc->soc_info->tas_tah_cycles_max) {
222 dev_err(nemc->dev, "tAH %u is too high (%u cycles)\n",
230 if (of_property_read_u32(node, "ingenic,nemc-tBP", &val) == 0) {
232 cycles = jz4780_nemc_ns_to_cycles(nemc, val);
234 dev_err(nemc->dev, "tBP %u is too high (%u cycles)\n",
242 if (of_property_read_u32(node, "ingenic,nemc-tAW", &val) == 0) {
244 cycles = jz4780_nemc_ns_to_cycles(nemc, val);
246 dev_err(nemc->dev, "tAW %u is too high (%u cycles)\n",
254 if (of_property_read_u32(node, "ingenic,nemc-tSTRV", &val) == 0) {
256 cycles = jz4780_nemc_ns_to_cycles(nemc, val);
258 dev_err(nemc->dev, "tSTRV %u is too high (%u cycles)\n",
266 writel(smcr, nemc->base + NEMC_SMCRn(bank));
273 struct jz4780_nemc *nemc;
281 nemc = devm_kzalloc(dev, sizeof(*nemc), GFP_KERNEL);
282 if (!nemc)
285 nemc->soc_info = device_get_match_data(dev);
286 if (!nemc->soc_info)
289 spin_lock_init(&nemc->lock);
290 nemc->dev = dev;
307 nemc->base = devm_ioremap(dev, res->start, NEMC_REG_LEN);
308 if (!nemc->base) {
313 writel(0, nemc->base + NEMC_NFCSR);
315 nemc->clk = devm_clk_get(dev, NULL);
316 if (IS_ERR(nemc->clk)) {
318 return PTR_ERR(nemc->clk);
321 ret = clk_prepare_enable(nemc->clk);
327 nemc->clk_period = jz4780_nemc_clk_period(nemc);
328 if (!nemc->clk_period) {
330 clk_disable_unprepare(nemc->clk);
340 for_each_child_of_node(nemc->dev->of_node, child) {
346 dev_err(nemc->dev,
359 dev_err(nemc->dev, "%pOF has no addresses\n",
362 } else if (nemc->banks_present & referenced) {
363 dev_err(nemc->dev, "%pOF conflicts with another node\n",
370 if (!jz4780_nemc_configure_bank(nemc, bank, child)) {
377 if (of_platform_device_create(child, NULL, nemc->dev))
378 nemc->banks_present |= referenced;
382 platform_set_drvdata(pdev, nemc);
389 struct jz4780_nemc *nemc = platform_get_drvdata(pdev);
391 clk_disable_unprepare(nemc->clk);
404 { .compatible = "ingenic,jz4740-nemc", .data = &jz4740_soc_info, },
405 { .compatible = "ingenic,jz4780-nemc", .data = &jz4780_soc_info, },
413 .name = "jz4780-nemc",