static int zynq_qspi_probe(struct udevice *bus) { struct zynq_qspi_platdata *plat = dev_get_platdata(bus); struct zynq_qspi_priv *priv = dev_get_priv(bus); debug("zynq_qspi_probe: bus:%p, priv:%p \n", bus, priv); #if defined(CONFIG_MARS_ZX) || defined(CONFIG_MERCURY_ZX) zx_set_storage(ZX_QSPI); #endif priv->regs = plat->regs; zynq_qspi_check_is_dual_flash(priv); if (priv->is_dual == -1) { debug("%s: No QSPI device detected based on MIO settings\n", __func__); return -1; } /* init the zynq spi hw */ zynq_qspi_init_hw(priv); return 0; }
struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs, unsigned int max_hz, unsigned int mode) { int is_dual; unsigned long lqspi_frequency; struct zynq_qspi_slave *qspi; debug("%s: bus: %d cs: %d max_hz: %d mode: %d\n", __func__, bus, cs, max_hz, mode); if (!spi_cs_is_valid(bus, cs)) return NULL; is_dual = zynq_qspi_check_is_dual_flash(); if (is_dual == MODE_UNKNOWN) { printf("%s: No QSPI device detected based on MIO settings\n", __func__); return NULL; } zynq_qspi_init_hw(is_dual, cs); qspi = spi_alloc_slave(struct zynq_qspi_slave, bus, cs); if (!qspi) { printf("%s: Fail to allocate zynq_qspi_slave\n", __func__); return NULL; } lqspi_frequency = zynq_clk_get_rate(lqspi_clk); if (!lqspi_frequency) { debug("Defaulting to 200000000 Hz qspi clk"); qspi->qspi.master.input_clk_hz = 200000000; } else { qspi->qspi.master.input_clk_hz = lqspi_frequency; debug("Qspi clk frequency set to %ld Hz\n", lqspi_frequency); } qspi->slave.is_dual = is_dual; qspi->slave.rd_cmd = READ_CMD_FULL; qspi->slave.wr_cmd = PAGE_PROGRAM | QUAD_PAGE_PROGRAM; qspi->qspi.master.speed_hz = qspi->qspi.master.input_clk_hz / 2; qspi->qspi.max_speed_hz = qspi->qspi.master.speed_hz; qspi->qspi.master.is_dual = is_dual; qspi->qspi.mode = mode; qspi->qspi.chip_select = 0; qspi->qspi.bits_per_word = 32; zynq_qspi_setup_transfer(&qspi->qspi, NULL); return &qspi->slave; }
static int zynq_qspi_probe(struct udevice *bus) { struct zynq_qspi_platdata *plat = dev_get_platdata(bus); struct zynq_qspi_priv *priv = dev_get_priv(bus); debug("zynq_qspi_probe: bus:%p, priv:%p \n", bus, priv); priv->regs = plat->regs; zynq_qspi_check_is_dual_flash(priv); if (priv->is_dual == -1) { debug("%s: No QSPI device detected based on MIO settings\n", __func__); return -1; } /* init the zynq spi hw */ zynq_qspi_init_hw(priv); return 0; }