void cadence_qspi_apb_delay(struct struct_cqspi *cadence_qspi, unsigned int ref_clk, unsigned int sclk_hz) { void __iomem *iobase = cadence_qspi->iobase; struct platform_device *pdev = cadence_qspi->pdev; struct cqspi_platform_data *pdata = pdev->dev.platform_data; struct cqspi_flash_pdata *f_pdata = &(pdata->f_pdata[cadence_qspi->current_cs]); unsigned int ref_clk_ns; unsigned int sclk_ns; unsigned int tshsl, tchsh, tslch, tsd2d; unsigned int reg; unsigned int tsclk; pr_debug("%s %d %d\n", __func__, ref_clk, sclk_hz); /* Convert to ns. */ ref_clk_ns = (1000000000) / pdata->master_ref_clk_hz; /* Convert to ns. */ sclk_ns = (1000000000) / sclk_hz; /* calculate the number of ref ticks for one sclk tick */ tsclk = (pdata->master_ref_clk_hz + sclk_hz - 1) / sclk_hz; tshsl = calculate_ticks_for_ns(pdata->master_ref_clk_hz, f_pdata->tshsl_ns); /* this particular value must be at least one sclk */ if (tshsl < tsclk) tshsl = tsclk; tchsh = calculate_ticks_for_ns(pdata->master_ref_clk_hz, f_pdata->tchsh_ns); tslch = calculate_ticks_for_ns(pdata->master_ref_clk_hz, f_pdata->tslch_ns); tsd2d = calculate_ticks_for_ns(pdata->master_ref_clk_hz, f_pdata->tsd2d_ns); pr_debug("%s tshsl %d tsd2d %d tchsh %d tslch %d\n", __func__, tshsl, tsd2d, tchsh, tslch); reg = ((tshsl & CQSPI_REG_DELAY_TSHSL_MASK) << CQSPI_REG_DELAY_TSHSL_LSB); reg |= ((tchsh & CQSPI_REG_DELAY_TCHSH_MASK) << CQSPI_REG_DELAY_TCHSH_LSB); reg |= ((tslch & CQSPI_REG_DELAY_TSLCH_MASK) << CQSPI_REG_DELAY_TSLCH_LSB); reg |= ((tsd2d & CQSPI_REG_DELAY_TSD2D_MASK) << CQSPI_REG_DELAY_TSD2D_LSB); CQSPI_WRITEL(reg, iobase + CQSPI_REG_DELAY); return; }
static void cqspi_delay(struct cqspi_st *cqspi, unsigned int ref_clk_hz, unsigned int sclk_hz) { void __iomem *reg_base = cqspi->iobase; struct cqspi_flash_pdata *f_pdata; unsigned int ref_clk_ns; unsigned int sclk_ns; unsigned int tshsl, tchsh, tslch, tsd2d; unsigned int reg; unsigned int tsclk; if (cqspi->no_reconfig) return; f_pdata = &cqspi->f_pdata[cqspi->current_cs]; /* Convert to ns. */ ref_clk_ns = NSEC_PER_SEC / ref_clk_hz; /* Convert to ns. */ sclk_ns = NSEC_PER_SEC / sclk_hz; /* calculate the number of ref ticks for one sclk tick */ tsclk = (ref_clk_hz + sclk_hz - 1) / sclk_hz; tshsl = calculate_ticks_for_ns(ref_clk_hz, f_pdata->tshsl_ns); /* this particular value must be at least one sclk */ if (tshsl < tsclk) tshsl = tsclk; tchsh = calculate_ticks_for_ns(ref_clk_hz, f_pdata->tchsh_ns); tslch = calculate_ticks_for_ns(ref_clk_hz, f_pdata->tslch_ns); tsd2d = calculate_ticks_for_ns(ref_clk_hz, f_pdata->tsd2d_ns); reg = ((tshsl & CQSPI_REG_DELAY_TSHSL_MASK) << CQSPI_REG_DELAY_TSHSL_LSB); reg |= ((tchsh & CQSPI_REG_DELAY_TCHSH_MASK) << CQSPI_REG_DELAY_TCHSH_LSB); reg |= ((tslch & CQSPI_REG_DELAY_TSLCH_MASK) << CQSPI_REG_DELAY_TSLCH_LSB); reg |= ((tsd2d & CQSPI_REG_DELAY_TSD2D_MASK) << CQSPI_REG_DELAY_TSD2D_LSB); writel(reg, reg_base + CQSPI_REG_DELAY); }