コード例 #1
0
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;
}
コード例 #2
0
ファイル: cadence-quadspi.c プロジェクト: jiangxilong/barebox
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);
}