Lines Matching +full:lx2160a +full:- +full:fspi
1 /*-
66 {"nxp,lx2160a-fspi", true},
136 return ((bus_read_4(sc->mem_res, offset)));
143 bus_write_4(sc->mem_res, offset, (value));
164 } while (condition && (--iterations > 0));
175 ret |= clk_disable(sc->fspi_clk_en);
176 ret |= clk_disable(sc->fspi_clk);
178 ret |= clk_set_freq(sc->fspi_clk, rate, 0);
179 sc->fspi_clk_hz = rate;
182 ret |= clk_enable(sc->fspi_clk_en);
183 ret |= clk_enable(sc->fspi_clk);
301 device_printf(sc->dev,
313 memcpy(buf + i, ®, size - i);
344 device_printf(sc->dev,
352 memcpy(®, buf + i, size - i);
409 } while (--cnt);
411 device_printf(sc->dev, "timed out waiting for command completion\n");
442 device_printf(sc->dev, "%s: timed out waiting for controller", __func__);
450 device_printf(sc->dev, "ERROR: failed to get flash status\n");
468 device_printf(sc->dev, "ERROR: failed to identify device\n");
473 while (finfo->jedecid != 0) {
474 if (id == finfo->jedecid) {
475 device_printf(sc->dev, "found %s Flash\n", finfo->name);
476 sc->sectorsize = finfo->sectorsize;
477 sc->sectorcount = finfo->sectorcount;
478 sc->erasesize = finfo->erasesize;
479 sc->fspi_max_clk = finfo->maxclk;
492 if (sc->quirks & FSPI_QUIRK_USE_IP_ONLY)
510 device_printf(sc->dev,
517 *(uint8_t*)data = bus_read_1(sc->ahb_mem_res, offset);
519 count--;
522 *(uint32_t*)data = bus_read_4(sc->ahb_mem_res, offset);
524 count -= 4;
540 count -= len;
557 device_printf(sc->dev, "ERROR: failed to enable writes\n");
562 /* per-sector write */
564 uint32_t sector_base = rounddown2(offset, sc->erasesize);
567 if (size_in_sector + offset > sector_base + sc->erasesize)
568 size_in_sector = sector_base + sc->erasesize - offset;
571 ret = flex_spi_read(sc, sector_base, sc->buf, sc->erasesize);
573 device_printf(sc->dev, "ERROR: failed to read sector %d\n",
583 device_printf(sc->dev, "ERROR: failed to erase sector %d\n",
589 memcpy(sc->buf + (offset - sector_base), data, size_in_sector);
593 * across 256-byte page boundary
595 for (ptr = 0; ptr < sc->erasesize; ptr += 32) {
598 sector_base + ptr, (void*)(sc->buf + ptr), 32, DIR_WRITE);
600 device_printf(sc->dev, "ERROR: failed to write address %ld\n",
607 size = size - size_in_sector;
612 ret = flex_spi_do_op(sc, LUT_FLASH_CMD_WRITE_DISABLE, offset, (void*)sc->buf,
615 device_printf(sc->dev, "ERROR: failed to disable writes\n");
643 device_printf(sc->dev, "time out waiting for reset");
680 /* AHB Read - Set lut sequence ID for all CS. */
700 if (!ofw_bus_search_compatible(dev, flex_spi_compat_data)->ocd_data)
717 sc->dev = dev;
719 mtx_init(&sc->disk_mtx, "flex_spi_DISK", "QSPI disk mtx", MTX_DEF);
723 sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
727 sc->ahb_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
730 if (sc->mem_res == NULL || sc->ahb_mem_res == NULL) {
737 if ((clk_get_by_ofw_name(dev, node, "fspi_en", &sc->fspi_clk_en) != 0)
738 || (clk_get_freq(sc->fspi_clk_en, &sc->fspi_clk_en_hz) != 0)) {
743 if ((clk_get_by_ofw_name(dev, node, "fspi", &sc->fspi_clk) != 0)
744 || (clk_get_freq(sc->fspi_clk, &sc->fspi_clk_hz) != 0)) {
745 device_printf(dev, "could not get fspi clock\n");
751 if (clk_enable(sc->fspi_clk_en) != 0 ||
752 clk_enable(sc->fspi_clk) != 0) {
765 device_printf(sc->dev, "Unable to initialize defaults\n");
772 device_printf(sc->dev, "Unable to identify Flash\n");
777 if (flex_spi_clk_setup(sc, sc->fspi_max_clk) != 0) {
778 device_printf(sc->dev, "Unable to set up SPI max clock\n");
783 sc->buf = malloc(sc->erasesize, SECTOR_BUFFER, M_WAITOK);
784 /* Move it to per-flash */
785 sc->disk = disk_alloc();
786 sc->disk->d_open = flex_spi_open;
787 sc->disk->d_close = flex_spi_close;
788 sc->disk->d_strategy = flex_spi_strategy;
789 sc->disk->d_getattr = flex_spi_getattr;
790 sc->disk->d_ioctl = flex_spi_ioctl;
791 sc->disk->d_name = "flash/qspi";
792 sc->disk->d_drv1 = sc;
794 sc->disk->d_maxsize = DFLTPHYS;
795 sc->disk->d_sectorsize = FLASH_SECTORSIZE;
796 sc->disk->d_unit = device_get_unit(sc->dev);
797 sc->disk->d_dump = NULL;
799 sc->disk->d_mediasize = sc->sectorsize * sc->sectorcount;
800 sc->disk->d_stripesize = sc->erasesize;
802 bioq_init(&sc->bio_queue);
803 sc->taskstate = TSTATE_RUNNING;
804 kproc_create(&flex_spi_task, sc, &sc->p, 0, 0, "task: qspi flash");
805 disk_create(sc->disk, DISK_VERSION);
822 mtx_lock(&sc->disk_mtx);
823 if (sc->taskstate == TSTATE_RUNNING) {
824 sc->taskstate = TSTATE_STOPPING;
825 wakeup(sc->disk);
826 while (err == 0 && sc->taskstate != TSTATE_STOPPED) {
827 err = mtx_sleep(sc->disk, &sc->disk_mtx, 0, "flex_spi",
830 sc->taskstate = TSTATE_RUNNING;
831 device_printf(sc->dev,
837 mtx_unlock(&sc->disk_mtx);
838 mtx_destroy(&sc->disk_mtx);
840 if (err == 0 && sc->taskstate == TSTATE_STOPPED) {
841 disk_destroy(sc->disk);
842 bioq_flush(&sc->bio_queue, NULL, ENXIO);
848 if (sc->mem_res != NULL)
850 rman_get_rid(sc->mem_res), sc->mem_res);
852 if (sc->ahb_mem_res != NULL)
854 rman_get_rid(sc->ahb_mem_res), sc->ahb_mem_res);
857 if (sc->fspi_clk_en_hz)
858 clk_disable(sc->fspi_clk_en);
859 if (sc->fspi_clk_hz)
860 clk_disable(sc->fspi_clk);
862 free(sc->buf, SECTOR_BUFFER);
894 sc = (struct flex_spi_softc *)bp->bio_disk->d_drv1;
895 mtx_lock(&sc->disk_mtx);
896 bioq_disksort(&sc->bio_queue, bp);
897 mtx_unlock(&sc->disk_mtx);
898 wakeup(sc->disk);
907 if (bp->bio_disk == NULL || bp->bio_disk->d_drv1 == NULL) {
911 sc = bp->bio_disk->d_drv1;
912 dev = sc->dev;
914 if (strcmp(bp->bio_attribute, "SPI::device") != 0) {
915 return (-1);
918 if (bp->bio_length != sizeof(dev)) {
922 bcopy(&dev, bp->bio_data, sizeof(dev));
935 mtx_lock(&sc->disk_mtx);
937 if (sc->taskstate == TSTATE_STOPPING) {
938 sc->taskstate = TSTATE_STOPPED;
939 mtx_unlock(&sc->disk_mtx);
940 wakeup(sc->disk);
943 bp = bioq_first(&sc->bio_queue);
945 mtx_sleep(sc->disk, &sc->disk_mtx, PRIBIO,
948 bioq_remove(&sc->bio_queue, bp);
949 mtx_unlock(&sc->disk_mtx);
951 switch (bp->bio_cmd) {
953 bp->bio_error = flex_spi_read(sc, bp->bio_offset,
954 bp->bio_data, bp->bio_bcount);
957 bp->bio_error = flex_spi_write(sc, bp->bio_offset,
958 bp->bio_data, bp->bio_bcount);
961 bp->bio_error = EINVAL;