summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/clk/at91/clk-main.c3
-rw-r--r--drivers/clk/at91/clk-master.c4
-rw-r--r--drivers/clk/at91/sckc.c8
-rw-r--r--drivers/clk/exynos/clk-exynos7420.c2
-rw-r--r--drivers/clk/rockchip/clk_rk3528.c1
-rw-r--r--drivers/clk/rockchip/clk_rk3576.c2
-rw-r--r--drivers/dma/ti/k3-udma.c6
-rw-r--r--drivers/fpga/ACEX1K.c245
-rw-r--r--drivers/fpga/Kconfig12
-rw-r--r--drivers/fpga/Makefile2
-rw-r--r--drivers/fpga/altera.c5
-rw-r--r--drivers/fpga/cyclon2.c5
-rw-r--r--drivers/fpga/fpga.c23
-rw-r--r--drivers/fpga/ivm_core.c3149
-rw-r--r--drivers/fpga/lattice.c379
-rw-r--r--drivers/fpga/xilinx.c3
-rw-r--r--drivers/mailbox/zynqmp-ipi.c8
-rw-r--r--drivers/mfd/atmel-smc.c2
-rw-r--r--drivers/mmc/gen_atmel_mci.c28
-rw-r--r--drivers/mmc/rockchip_sdhci.c2
-rw-r--r--drivers/mmc/stm32_sdmmc2.c16
-rw-r--r--drivers/mtd/nand/core.c7
-rw-r--r--drivers/mtd/nand/raw/cadence_nand.c2
-rw-r--r--drivers/mtd/nand/raw/stm32_fmc2_nand.c1
-rw-r--r--drivers/net/MAINTAINERS6
-rw-r--r--drivers/net/cortina_ni.c2
-rw-r--r--drivers/net/designware.c4
-rw-r--r--drivers/net/ks8851_mll.c5
-rw-r--r--drivers/net/ldpaa_eth/ldpaa_eth.c2
-rw-r--r--drivers/net/mtk_eth/mtk_eth.c2
-rw-r--r--drivers/net/mv88e6xxx.c2
-rw-r--r--drivers/net/mvpp2.c9
-rw-r--r--drivers/net/octeontx/nicvf_main.c51
-rw-r--r--drivers/net/octeontx/smi.c12
-rw-r--r--drivers/net/octeontx2/nix.c2
-rw-r--r--drivers/net/octeontx2/rvu_af.c2
-rw-r--r--drivers/net/phy/broadcom.c37
-rw-r--r--drivers/net/phy/vitesse.c2
-rw-r--r--drivers/net/xilinx_axi_emac.c8
-rw-r--r--drivers/phy/Kconfig6
-rw-r--r--drivers/phy/cadence/phy-cadence-sierra.c13
-rw-r--r--drivers/phy/cadence/phy-cadence-torrent.c1
-rw-r--r--drivers/phy/marvell/comphy_core.c4
-rw-r--r--drivers/phy/marvell/comphy_core.h4
-rw-r--r--drivers/phy/phy-imx8mq-usb.c91
-rw-r--r--drivers/phy/rockchip/phy-rockchip-inno-usb2.c47
-rw-r--r--drivers/phy/rockchip/phy-rockchip-naneng-combphy.c368
-rw-r--r--drivers/phy/rockchip/phy-rockchip-typec.c2
-rw-r--r--drivers/phy/rockchip/phy-rockchip-usbdp.c101
-rw-r--r--drivers/pinctrl/pinctrl-zynqmp.c6
-rw-r--r--drivers/pinctrl/renesas/rzg2l-pfc.c4
-rw-r--r--drivers/power/pmic/rk8xx.c21
-rw-r--r--drivers/ram/renesas/dbsc5/dram.c10
-rw-r--r--drivers/remoteproc/k3_system_controller.c2
-rw-r--r--drivers/rng/rockchip_rng.c4
-rw-r--r--drivers/serial/serial_efi.c2
-rw-r--r--drivers/soc/soc_xilinx_zynqmp.c2
-rw-r--r--drivers/spi/atmel-quadspi.c15
-rw-r--r--drivers/spi/exynos_spi.c10
-rw-r--r--drivers/usb/cdns3/gadget.c4
-rw-r--r--drivers/usb/common/dwc2_core.c2
-rw-r--r--drivers/usb/dwc3/dwc3-generic.c2
-rw-r--r--drivers/usb/dwc3/ep0.c4
-rw-r--r--drivers/usb/gadget/Kconfig14
-rw-r--r--drivers/usb/host/dwc3-of-simple.c1
-rw-r--r--drivers/usb/host/ehci-mx6.c2
66 files changed, 675 insertions, 4128 deletions
diff --git a/drivers/clk/at91/clk-main.c b/drivers/clk/at91/clk-main.c
index a5186f885f0..0542b066788 100644
--- a/drivers/clk/at91/clk-main.c
+++ b/drivers/clk/at91/clk-main.c
@@ -315,7 +315,8 @@ static int clk_sam9x5_main_set_parent(struct clk *clk, struct clk *parent)
{
struct clk_main *main = to_clk_main(clk);
void __iomem *reg = main->reg;
- unsigned int tmp, index;
+ unsigned int tmp;
+ int index;
index = at91_clk_mux_val_to_index(main->clk_mux_table,
main->num_parents, AT91_CLK_ID_TO_DID(parent->id));
diff --git a/drivers/clk/at91/clk-master.c b/drivers/clk/at91/clk-master.c
index cdc5271fa83..530205b8c6b 100644
--- a/drivers/clk/at91/clk-master.c
+++ b/drivers/clk/at91/clk-master.c
@@ -335,8 +335,8 @@ struct clk *at91_clk_sama7g5_register_master(void __iomem *base,
{
struct clk_master *master;
struct clk *clk;
- u32 val, index;
- int ret;
+ u32 val;
+ int ret, index;
if (!base || !name || !num_parents || !parent_names ||
!mux_table || !clk_mux_table || id > MASTER_MAX_ID)
diff --git a/drivers/clk/at91/sckc.c b/drivers/clk/at91/sckc.c
index 6d6f12578db..3fde8ea7138 100644
--- a/drivers/clk/at91/sckc.c
+++ b/drivers/clk/at91/sckc.c
@@ -74,8 +74,8 @@ static struct clk *at91_sam9x60_clk_register_td_slck(struct sam9x60_sckc *sckc,
int num_parents)
{
struct clk *clk;
- int ret = -ENOMEM;
- u32 val, i;
+ int ret = -ENOMEM, i;
+ u32 val;
if (!sckc || !name || !parent_names || num_parents != 2)
return ERR_PTR(-EINVAL);
@@ -99,8 +99,10 @@ static struct clk *at91_sam9x60_clk_register_td_slck(struct sam9x60_sckc *sckc,
clk = &sckc->clk;
ret = clk_register(clk, UBOOT_DM_CLK_AT91_SAM9X60_TD_SLCK, name,
parent_names[val]);
- if (ret)
+ if (ret) {
+ i--;
goto free;
+ }
return clk;
diff --git a/drivers/clk/exynos/clk-exynos7420.c b/drivers/clk/exynos/clk-exynos7420.c
index 3aa751bf4e4..7de4e688f03 100644
--- a/drivers/clk/exynos/clk-exynos7420.c
+++ b/drivers/clk/exynos/clk-exynos7420.c
@@ -192,7 +192,7 @@ static int exynos7420_clk_top0_probe(struct udevice *dev)
static ulong exynos7420_peric1_get_rate(struct clk *clk)
{
struct clk in_clk;
- unsigned int ret;
+ int ret;
unsigned long freq = 0;
switch (clk->id) {
diff --git a/drivers/clk/rockchip/clk_rk3528.c b/drivers/clk/rockchip/clk_rk3528.c
index 06f20895acc..d58557ff56d 100644
--- a/drivers/clk/rockchip/clk_rk3528.c
+++ b/drivers/clk/rockchip/clk_rk3528.c
@@ -1535,6 +1535,7 @@ static ulong rk3528_clk_set_rate(struct clk *clk, ulong rate)
/* Might occur in cru assigned-clocks, can be ignored here */
case ACLK_BUS_VOPGL_ROOT:
case BCLK_EMMC:
+ case CLK_REF_PCIE_INNER_PHY:
case XIN_OSC0_DIV:
ret = 0;
break;
diff --git a/drivers/clk/rockchip/clk_rk3576.c b/drivers/clk/rockchip/clk_rk3576.c
index e84a0943a94..125b08ee832 100644
--- a/drivers/clk/rockchip/clk_rk3576.c
+++ b/drivers/clk/rockchip/clk_rk3576.c
@@ -2168,6 +2168,8 @@ static ulong rk3576_clk_set_rate(struct clk *clk, ulong rate)
case CLK_CPLL_DIV10:
case FCLK_DDR_CM0_CORE:
case ACLK_PHP_ROOT:
+ case CLK_REF_PCIE0_PHY:
+ case CLK_REF_PCIE1_PHY:
ret = 0;
break;
#ifndef CONFIG_SPL_BUILD
diff --git a/drivers/dma/ti/k3-udma.c b/drivers/dma/ti/k3-udma.c
index 723265ab2e5..01824310995 100644
--- a/drivers/dma/ti/k3-udma.c
+++ b/drivers/dma/ti/k3-udma.c
@@ -2327,7 +2327,7 @@ static int udma_send(struct dma *dma, void *src, size_t len, void *metadata)
{
struct udma_dev *ud = dev_get_priv(dma->dev);
struct cppi5_host_desc_t *desc_tx;
- dma_addr_t dma_src = (dma_addr_t)src;
+ dma_addr_t dma_src = (uintptr_t)src;
struct ti_udma_drv_packet_data packet_data = { 0 };
dma_addr_t paddr;
struct udma_chan *uc;
@@ -2426,7 +2426,7 @@ static int udma_receive(struct dma *dma, void **dst, void *metadata)
cppi5_desc_get_tags_ids(&desc_rx->hdr, &port_id, NULL);
- *dst = (void *)buf_dma;
+ *dst = (void *)(uintptr_t)buf_dma;
uc->num_rx_bufs--;
return pkt_len;
@@ -2518,7 +2518,7 @@ int udma_prepare_rcv_buf(struct dma *dma, void *dst, size_t size)
desc_num = uc->desc_rx_cur % UDMA_RX_DESC_NUM;
desc_rx = uc->desc_rx + (desc_num * uc->config.hdesc_size);
- dma_dst = (dma_addr_t)dst;
+ dma_dst = (uintptr_t)dst;
cppi5_hdesc_reset_hbdesc(desc_rx);
diff --git a/drivers/fpga/ACEX1K.c b/drivers/fpga/ACEX1K.c
deleted file mode 100644
index e1514fc56d0..00000000000
--- a/drivers/fpga/ACEX1K.c
+++ /dev/null
@@ -1,245 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * (C) Copyright 2003
- * Steven Scholz, imc Measurement & Control, steven.scholz@imc-berlin.de
- *
- * (C) Copyright 2002
- * Rich Ireland, Enterasys Networks, rireland@enterasys.com.
- */
-
-#define LOG_CATEGORY UCLASS_FPGA
-
-#include <config.h> /* core U-Boot definitions */
-#include <console.h>
-#include <log.h>
-#include <ACEX1K.h> /* ACEX device family */
-#include <linux/delay.h>
-#include <time.h>
-
-/* Note: The assumption is that we cannot possibly run fast enough to
- * overrun the device (the Slave Parallel mode can free run at 50MHz).
- * If there is a need to operate slower, define CFG_FPGA_DELAY in
- * the board config file to slow things down.
- */
-#ifndef CFG_FPGA_DELAY
-#define CFG_FPGA_DELAY()
-#endif
-
-#ifndef CFG_SYS_FPGA_WAIT
-#define CFG_SYS_FPGA_WAIT CONFIG_SYS_HZ/10 /* 100 ms */
-#endif
-
-static int ACEX1K_ps_load(Altera_desc *desc, const void *buf, size_t bsize);
-static int ACEX1K_ps_dump(Altera_desc *desc, const void *buf, size_t bsize);
-/* static int ACEX1K_ps_info(Altera_desc *desc); */
-
-/* ------------------------------------------------------------------------- */
-/* ACEX1K Generic Implementation */
-int ACEX1K_load(Altera_desc *desc, const void *buf, size_t bsize)
-{
- int ret_val = FPGA_FAIL;
-
- switch (desc->iface) {
- case passive_serial:
- log_debug("Launching Passive Serial Loader\n");
- ret_val = ACEX1K_ps_load (desc, buf, bsize);
- break;
-
- /* Add new interface types here */
-
- default:
- printf ("%s: Unsupported interface type, %d\n",
- __FUNCTION__, desc->iface);
- }
-
- return ret_val;
-}
-
-int ACEX1K_dump(Altera_desc *desc, const void *buf, size_t bsize)
-{
- int ret_val = FPGA_FAIL;
-
- switch (desc->iface) {
- case passive_serial:
- log_debug("Launching Passive Serial Dump\n");
- ret_val = ACEX1K_ps_dump (desc, buf, bsize);
- break;
-
- /* Add new interface types here */
-
- default:
- printf ("%s: Unsupported interface type, %d\n",
- __FUNCTION__, desc->iface);
- }
-
- return ret_val;
-}
-
-int ACEX1K_info( Altera_desc *desc )
-{
- return FPGA_SUCCESS;
-}
-
-/* ------------------------------------------------------------------------- */
-/* ACEX1K Passive Serial Generic Implementation */
-
-static int ACEX1K_ps_load(Altera_desc *desc, const void *buf, size_t bsize)
-{
- int ret_val = FPGA_FAIL; /* assume the worst */
- Altera_ACEX1K_Passive_Serial_fns *fn = desc->iface_fns;
- int i;
-
- log_debug("start with interface functions @ 0x%p\n", fn);
-
- if (fn) {
- size_t bytecount = 0;
- unsigned char *data = (unsigned char *) buf;
- int cookie = desc->cookie; /* make a local copy */
- unsigned long ts; /* timestamp */
-
- log_debug("Function Table:\n"
- "ptr:\t0x%p\n"
- "struct: 0x%p\n"
- "config:\t0x%p\n"
- "status:\t0x%p\n"
- "clk:\t0x%p\n"
- "data:\t0x%p\n"
- "done:\t0x%p\n\n",
- &fn, fn, fn->config, fn->status,
- fn->clk, fn->data, fn->done);
-#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
- printf ("Loading FPGA Device %d...", cookie);
-#endif
-
- /*
- * Run the pre configuration function if there is one.
- */
- if (*fn->pre) {
- (*fn->pre) (cookie);
- }
-
- /* Establish the initial state */
- (*fn->config) (true, true, cookie); /* Assert nCONFIG */
-
- udelay(2); /* T_cfg > 2us */
-
- /* nSTATUS should be asserted now */
- (*fn->done) (cookie);
- if ( !(*fn->status) (cookie) ) {
- puts ("** nSTATUS is not asserted.\n");
- (*fn->abort) (cookie);
- return FPGA_FAIL;
- }
-
- (*fn->config) (false, true, cookie); /* Deassert nCONFIG */
- udelay(2); /* T_cf2st1 < 4us */
-
- /* Wait for nSTATUS to be released (i.e. deasserted) */
- ts = get_timer (0); /* get current time */
- do {
- CFG_FPGA_DELAY ();
- if (get_timer (ts) > CFG_SYS_FPGA_WAIT) { /* check the time */
- puts ("** Timeout waiting for STATUS to go high.\n");
- (*fn->abort) (cookie);
- return FPGA_FAIL;
- }
- (*fn->done) (cookie);
- } while ((*fn->status) (cookie));
-
- /* Get ready for the burn */
- CFG_FPGA_DELAY ();
-
- /* Load the data */
- while (bytecount < bsize) {
- unsigned char val=0;
-#ifdef CONFIG_SYS_FPGA_CHECK_CTRLC
- if (ctrlc ()) {
- (*fn->abort) (cookie);
- return FPGA_FAIL;
- }
-#endif
- /* Altera detects an error if INIT goes low (active)
- while DONE is low (inactive) */
-#if 0 /* not yet implemented */
- if ((*fn->done) (cookie) == 0 && (*fn->init) (cookie)) {
- puts ("** CRC error during FPGA load.\n");
- (*fn->abort) (cookie);
- return (FPGA_FAIL);
- }
-#endif
- val = data [bytecount ++ ];
- i = 8;
- do {
- /* Deassert the clock */
- (*fn->clk) (false, true, cookie);
- CFG_FPGA_DELAY ();
- /* Write data */
- (*fn->data) ((val & 0x01), true, cookie);
- CFG_FPGA_DELAY ();
- /* Assert the clock */
- (*fn->clk) (true, true, cookie);
- CFG_FPGA_DELAY ();
- val >>= 1;
- i --;
- } while (i > 0);
-
-#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
- if (bytecount % (bsize / 40) == 0)
- putc ('.'); /* let them know we are alive */
-#endif
- }
-
- CFG_FPGA_DELAY ();
-
-#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
- putc (' '); /* terminate the dotted line */
-#endif
-
- /*
- * Checking FPGA's CONF_DONE signal - correctly booted ?
- */
-
- if ( ! (*fn->done) (cookie) ) {
- puts ("** Booting failed! CONF_DONE is still deasserted.\n");
- (*fn->abort) (cookie);
- return (FPGA_FAIL);
- }
-
- /*
- * "DCLK must be clocked an additional 10 times fpr ACEX 1K..."
- */
-
- for (i = 0; i < 12; i++) {
- CFG_FPGA_DELAY ();
- (*fn->clk) (true, true, cookie); /* Assert the clock pin */
- CFG_FPGA_DELAY ();
- (*fn->clk) (false, true, cookie); /* Deassert the clock pin */
- }
-
- ret_val = FPGA_SUCCESS;
-
-#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
- if (ret_val == FPGA_SUCCESS) {
- puts ("Done.\n");
- }
- else {
- puts ("Fail.\n");
- }
-#endif
- (*fn->post) (cookie);
-
- } else {
- printf ("%s: NULL Interface function table!\n", __FUNCTION__);
- }
-
- return ret_val;
-}
-
-static int ACEX1K_ps_dump(Altera_desc *desc, const void *buf, size_t bsize)
-{
- /* Readback is only available through the Slave Parallel and */
- /* boundary-scan interfaces. */
- printf ("%s: Passive Serial Dumping is unavailable\n",
- __FUNCTION__);
- return FPGA_FAIL;
-}
diff --git a/drivers/fpga/Kconfig b/drivers/fpga/Kconfig
index 9456ca3149a..e2593057fac 100644
--- a/drivers/fpga/Kconfig
+++ b/drivers/fpga/Kconfig
@@ -34,12 +34,6 @@ config FPGA_STRATIX_V
help
Say Y here to enable the Altera Stratix V FPGA specific driver.
-config FPGA_ACEX1K
- bool "Enable Altera ACEX 1K driver"
- depends on FPGA_ALTERA
- help
- Say Y here to enable the Altera ACEX 1K FPGA specific driver.
-
config FPGA_CYCLON2
bool "Enable Altera FPGA driver for Cyclone II"
depends on FPGA_ALTERA
@@ -61,12 +55,6 @@ config FPGA_INTEL_SDM_MAILBOX
Enable FPGA driver for writing full bitstream into Intel FPGA
devices through SDM (Secure Device Manager) Mailbox.
-config FPGA_LATTICE
- bool "Enable Lattice FPGA driver"
- help
- This is used for the lattice FPGAs. Please check the source code as
- there is no documentation for this at present.
-
config FPGA_XILINX
bool "Enable Xilinx FPGA drivers"
select FPGA
diff --git a/drivers/fpga/Makefile b/drivers/fpga/Makefile
index 610c168fc35..f22d3b3d86e 100644
--- a/drivers/fpga/Makefile
+++ b/drivers/fpga/Makefile
@@ -14,10 +14,8 @@ obj-$(CONFIG_FPGA_VIRTEX2) += virtex2.o
obj-$(CONFIG_FPGA_ZYNQPL) += zynqpl.o
obj-$(CONFIG_FPGA_ZYNQMPPL) += zynqmppl.o
obj-$(CONFIG_FPGA_XILINX) += xilinx.o
-obj-$(CONFIG_FPGA_LATTICE) += ivm_core.o lattice.o
ifdef CONFIG_FPGA_ALTERA
obj-y += altera.o
-obj-$(CONFIG_FPGA_ACEX1K) += ACEX1K.o
obj-$(CONFIG_FPGA_CYCLON2) += cyclon2.o
obj-$(CONFIG_FPGA_INTEL_SDM_MAILBOX) += intel_sdm_mb.o
obj-$(CONFIG_FPGA_STRATIX_II) += stratixII.o
diff --git a/drivers/fpga/altera.c b/drivers/fpga/altera.c
index 64fda3a307c..4a9aa74357e 100644
--- a/drivers/fpga/altera.c
+++ b/drivers/fpga/altera.c
@@ -28,10 +28,7 @@ static const struct altera_fpga {
int (*dump)(Altera_desc *, const void *, size_t);
int (*info)(Altera_desc *);
} altera_fpga[] = {
-#if defined(CONFIG_FPGA_ACEX1K)
- { Altera_ACEX1K, "ACEX1K", ACEX1K_load, ACEX1K_dump, ACEX1K_info },
- { Altera_CYC2, "ACEX1K", ACEX1K_load, ACEX1K_dump, ACEX1K_info },
-#elif defined(CONFIG_FPGA_CYCLON2)
+#if defined(CONFIG_FPGA_CYCLON2)
{ Altera_ACEX1K, "CycloneII", CYC2_load, CYC2_dump, CYC2_info },
{ Altera_CYC2, "CycloneII", CYC2_load, CYC2_dump, CYC2_info },
#endif
diff --git a/drivers/fpga/cyclon2.c b/drivers/fpga/cyclon2.c
index 7e78d6e2d6c..1c464c1e912 100644
--- a/drivers/fpga/cyclon2.c
+++ b/drivers/fpga/cyclon2.c
@@ -174,10 +174,7 @@ static int CYC2_ps_load(Altera_desc *desc, const void *buf, size_t bsize)
ret_val = FPGA_SUCCESS;
#ifdef CONFIG_SYS_FPGA_PROG_FEEDBACK
- if (ret_val == FPGA_SUCCESS)
- puts("Done.\n");
- else
- puts("Fail.\n");
+ puts("Done.\n");
#endif
/*
diff --git a/drivers/fpga/fpga.c b/drivers/fpga/fpga.c
index 2297fefd149..b4e3896d2e8 100644
--- a/drivers/fpga/fpga.c
+++ b/drivers/fpga/fpga.c
@@ -9,7 +9,6 @@
#include <log.h>
#include <xilinx.h> /* xilinx specific definitions */
#include <altera.h> /* altera specific definitions */
-#include <lattice.h>
#include <dm/device_compat.h>
/* Local static data */
@@ -81,14 +80,6 @@ static int fpga_dev_info(int devnum)
log_err("No support for Altera devices.\n");
#endif
break;
- case fpga_lattice:
-#if defined(CONFIG_FPGA_LATTICE)
- log_info("Lattice Device\nDescriptor @ 0x%p\n", desc);
- ret_val = lattice_info(desc->devdesc);
-#else
- log_err("No support for Lattice devices.\n");
-#endif
- break;
default:
log_err("Invalid or unsupported device type %d\n",
desc->devtype);
@@ -267,13 +258,6 @@ int fpga_load(int devnum, const void *buf, size_t bsize, bitstream_type bstype,
log_err("No support for Altera devices.\n");
#endif
break;
- case fpga_lattice:
-#if defined(CONFIG_FPGA_LATTICE)
- ret_val = lattice_load(desc->devdesc, buf, bsize);
-#else
- log_err("No support for Lattice devices.\n");
-#endif
- break;
default:
log_err("Invalid or unsupported device type %d\n",
desc->devtype);
@@ -312,13 +296,6 @@ int fpga_dump(int devnum, const void *buf, size_t bsize)
log_err("No support for Altera devices.\n");
#endif
break;
- case fpga_lattice:
-#if defined(CONFIG_FPGA_LATTICE)
- ret_val = lattice_dump(desc->devdesc, buf, bsize);
-#else
- log_err("No support for Lattice devices.\n");
-#endif
- break;
default:
log_err("Invalid or unsupported device type %d\n",
desc->devtype);
diff --git a/drivers/fpga/ivm_core.c b/drivers/fpga/ivm_core.c
deleted file mode 100644
index 37d5c5ec9ec..00000000000
--- a/drivers/fpga/ivm_core.c
+++ /dev/null
@@ -1,3149 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * Porting to u-boot:
- *
- * (C) Copyright 2010
- * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
- *
- * Lattice ispVME Embedded code to load Lattice's FPGA:
- *
- * Copyright 2009 Lattice Semiconductor Corp.
- *
- * ispVME Embedded allows programming of Lattice's suite of FPGA
- * devices on embedded systems through the JTAG port. The software
- * is distributed in source code form and is open to re - distribution
- * and modification where applicable.
- *
- * Revision History of ivm_core.c module:
- * 4/25/06 ht Change some variables from unsigned short or int
- * to long int to make the code compiler independent.
- * 5/24/06 ht Support using RESET (TRST) pin as a special purpose
- * control pin such as triggering the loading of known
- * state exit.
- * 3/6/07 ht added functions to support output to terminals
- *
- * 09/11/07 NN Type cast mismatch variables
- * Moved the sclock() function to hardware.c
- * 08/28/08 NN Added Calculate checksum support.
- * 4/1/09 Nguyen replaced the recursive function call codes on
- * the ispVMLCOUNT function
- */
-
-#include <log.h>
-#include <linux/string.h>
-#include <malloc.h>
-#include <lattice.h>
-#include <vsprintf.h>
-
-#define vme_out_char(c) printf("%c", c)
-#define vme_out_hex(c) printf("%x", c)
-#define vme_out_string(s) printf("%s", s)
-
-/*
- *
- * Global variables used to specify the flow control and data type.
- *
- * g_usFlowControl: flow control register. Each bit in the
- * register can potentially change the
- * personality of the embedded engine.
- * g_usDataType: holds the data type of the current row.
- *
- */
-
-static unsigned short g_usFlowControl;
-unsigned short g_usDataType;
-
-/*
- *
- * Global variables used to specify the ENDDR and ENDIR.
- *
- * g_ucEndDR: the state that the device goes to after SDR.
- * g_ucEndIR: the state that the device goes to after SIR.
- *
- */
-
-unsigned char g_ucEndDR = DRPAUSE;
-unsigned char g_ucEndIR = IRPAUSE;
-
-/*
- *
- * Global variables used to support header/trailer.
- *
- * g_usHeadDR: the number of lead devices in bypass.
- * g_usHeadIR: the sum of IR length of lead devices.
- * g_usTailDR: the number of tail devices in bypass.
- * g_usTailIR: the sum of IR length of tail devices.
- *
- */
-
-static unsigned short g_usHeadDR;
-static unsigned short g_usHeadIR;
-static unsigned short g_usTailDR;
-static unsigned short g_usTailIR;
-
-/*
- *
- * Global variable to store the number of bits of data or instruction
- * to be shifted into or out from the device.
- *
- */
-
-static unsigned short g_usiDataSize;
-
-/*
- *
- * Stores the frequency. Default to 1 MHz.
- *
- */
-
-static int g_iFrequency = 1000;
-
-/*
- *
- * Stores the maximum amount of ram needed to hold a row of data.
- *
- */
-
-static unsigned short g_usMaxSize;
-
-/*
- *
- * Stores the LSH or RSH value.
- *
- */
-
-static unsigned short g_usShiftValue;
-
-/*
- *
- * Stores the current repeat loop value.
- *
- */
-
-static unsigned short g_usRepeatLoops;
-
-/*
- *
- * Stores the current vendor.
- *
- */
-
-static signed char g_cVendor = LATTICE;
-
-/*
- *
- * Stores the VME file CRC.
- *
- */
-
-unsigned short g_usCalculatedCRC;
-
-/*
- *
- * Stores the Device Checksum.
- *
- */
-/* 08/28/08 NN Added Calculate checksum support. */
-unsigned long g_usChecksum;
-static unsigned int g_uiChecksumIndex;
-
-/*
- *
- * Stores the current state of the JTAG state machine.
- *
- */
-
-static signed char g_cCurrentJTAGState;
-
-/*
- *
- * Global variables used to support looping.
- *
- * g_pucHeapMemory: holds the entire repeat loop.
- * g_iHeapCounter: points to the current byte in the repeat loop.
- * g_iHEAPSize: the current size of the repeat in bytes.
- *
- */
-
-unsigned char *g_pucHeapMemory;
-unsigned short g_iHeapCounter;
-unsigned short g_iHEAPSize;
-static unsigned short previous_size;
-
-/*
- *
- * Global variables used to support intelligent programming.
- *
- * g_usIntelDataIndex: points to the current byte of the
- * intelligent buffer.
- * g_usIntelBufferSize: holds the size of the intelligent
- * buffer.
- *
- */
-
-unsigned short g_usIntelDataIndex;
-unsigned short g_usIntelBufferSize;
-
-/*
- *
- * Supported VME versions.
- *
- */
-
-const char *const g_szSupportedVersions[] = {
- "__VME2.0", "__VME3.0", "____12.0", "____12.1", 0};
-
-/*
- *
- * Holds the maximum size of each respective buffer. These variables are used
- * to write the HEX files when converting VME to HEX.
- *
-*/
-
-static unsigned short g_usTDOSize;
-static unsigned short g_usMASKSize;
-static unsigned short g_usTDISize;
-static unsigned short g_usDMASKSize;
-static unsigned short g_usLCOUNTSize;
-static unsigned short g_usHDRSize;
-static unsigned short g_usTDRSize;
-static unsigned short g_usHIRSize;
-static unsigned short g_usTIRSize;
-static unsigned short g_usHeapSize;
-
-/*
- *
- * Global variables used to store data.
- *
- * g_pucOutMaskData: local RAM to hold one row of MASK data.
- * g_pucInData: local RAM to hold one row of TDI data.
- * g_pucOutData: local RAM to hold one row of TDO data.
- * g_pucHIRData: local RAM to hold the current SIR header.
- * g_pucTIRData: local RAM to hold the current SIR trailer.
- * g_pucHDRData: local RAM to hold the current SDR header.
- * g_pucTDRData: local RAM to hold the current SDR trailer.
- * g_pucIntelBuffer: local RAM to hold the current intelligent buffer
- * g_pucOutDMaskData: local RAM to hold one row of DMASK data.
- *
- */
-
-unsigned char *g_pucOutMaskData = NULL,
- *g_pucInData = NULL,
- *g_pucOutData = NULL,
- *g_pucHIRData = NULL,
- *g_pucTIRData = NULL,
- *g_pucHDRData = NULL,
- *g_pucTDRData = NULL,
- *g_pucIntelBuffer = NULL,
- *g_pucOutDMaskData = NULL;
-
-/*
- *
- * JTAG state machine transition table.
- *
- */
-
-struct {
- unsigned char CurState; /* From this state */
- unsigned char NextState; /* Step to this state */
- unsigned char Pattern; /* The tragetory of TMS */
- unsigned char Pulses; /* The number of steps */
-} g_JTAGTransistions[25] = {
-{ RESET, RESET, 0xFC, 6 }, /* Transitions from RESET */
-{ RESET, IDLE, 0x00, 1 },
-{ RESET, DRPAUSE, 0x50, 5 },
-{ RESET, IRPAUSE, 0x68, 6 },
-{ IDLE, RESET, 0xE0, 3 }, /* Transitions from IDLE */
-{ IDLE, DRPAUSE, 0xA0, 4 },
-{ IDLE, IRPAUSE, 0xD0, 5 },
-{ DRPAUSE, RESET, 0xF8, 5 }, /* Transitions from DRPAUSE */
-{ DRPAUSE, IDLE, 0xC0, 3 },
-{ DRPAUSE, IRPAUSE, 0xF4, 7 },
-{ DRPAUSE, DRPAUSE, 0xE8, 6 },/* 06/14/06 Support POLL STATUS LOOP*/
-{ IRPAUSE, RESET, 0xF8, 5 }, /* Transitions from IRPAUSE */
-{ IRPAUSE, IDLE, 0xC0, 3 },
-{ IRPAUSE, DRPAUSE, 0xE8, 6 },
-{ DRPAUSE, SHIFTDR, 0x80, 2 }, /* Extra transitions using SHIFTDR */
-{ IRPAUSE, SHIFTDR, 0xE0, 5 },
-{ SHIFTDR, DRPAUSE, 0x80, 2 },
-{ SHIFTDR, IDLE, 0xC0, 3 },
-{ IRPAUSE, SHIFTIR, 0x80, 2 },/* Extra transitions using SHIFTIR */
-{ SHIFTIR, IRPAUSE, 0x80, 2 },
-{ SHIFTIR, IDLE, 0xC0, 3 },
-{ DRPAUSE, DRCAPTURE, 0xE0, 4 }, /* 11/15/05 Support DRCAPTURE*/
-{ DRCAPTURE, DRPAUSE, 0x80, 2 },
-{ IDLE, DRCAPTURE, 0x80, 2 },
-{ IRPAUSE, DRCAPTURE, 0xE0, 4 }
-};
-
-/*
- *
- * List to hold all LVDS pairs.
- *
- */
-
-LVDSPair *g_pLVDSList;
-unsigned short g_usLVDSPairCount;
-
-/*
- *
- * Function prototypes.
- *
- */
-
-static signed char ispVMDataCode(void);
-static long ispVMDataSize(void);
-static void ispVMData(unsigned char *Data);
-static signed char ispVMShift(signed char Code);
-static signed char ispVMAmble(signed char Code);
-static signed char ispVMLoop(unsigned short a_usLoopCount);
-static signed char ispVMBitShift(signed char mode, unsigned short bits);
-static void ispVMComment(unsigned short a_usCommentSize);
-static void ispVMHeader(unsigned short a_usHeaderSize);
-static signed char ispVMLCOUNT(unsigned short a_usCountSize);
-static void ispVMClocks(unsigned short Clocks);
-static void ispVMBypass(signed char ScanType, unsigned short Bits);
-static void ispVMStateMachine(signed char NextState);
-static signed char ispVMSend(unsigned short int);
-static signed char ispVMRead(unsigned short int);
-static signed char ispVMReadandSave(unsigned short int);
-static signed char ispVMProcessLVDS(unsigned short a_usLVDSCount);
-static void ispVMMemManager(signed char types, unsigned short size);
-
-/*
- *
- * External variables and functions in hardware.c module
- *
- */
-static signed char g_cCurrentJTAGState;
-
-#ifdef DEBUG
-
-/*
- *
- * GetState
- *
- * Returns the state as a string based on the opcode. Only used
- * for debugging purposes.
- *
- */
-
-const char *GetState(unsigned char a_ucState)
-{
- switch (a_ucState) {
- case RESET:
- return "RESET";
- case IDLE:
- return "IDLE";
- case IRPAUSE:
- return "IRPAUSE";
- case DRPAUSE:
- return "DRPAUSE";
- case SHIFTIR:
- return "SHIFTIR";
- case SHIFTDR:
- return "SHIFTDR";
- case DRCAPTURE:/* 11/15/05 support DRCAPTURE*/
- return "DRCAPTURE";
- default:
- break;
- }
-
- return 0;
-}
-
-/*
- *
- * PrintData
- *
- * Prints the data. Only used for debugging purposes.
- *
- */
-
-void PrintData(unsigned short a_iDataSize, unsigned char *a_pucData)
-{
- /* 09/11/07 NN added local variables initialization */
- unsigned short usByteSize = 0;
- unsigned short usBitIndex = 0;
- signed short usByteIndex = 0;
- unsigned char ucByte = 0;
- unsigned char ucFlipByte = 0;
-
- if (a_iDataSize % 8) {
- /* 09/11/07 NN Type cast mismatch variables */
- usByteSize = (unsigned short)(a_iDataSize / 8 + 1);
- } else {
- /* 09/11/07 NN Type cast mismatch variables */
- usByteSize = (unsigned short)(a_iDataSize / 8);
- }
- puts("(");
- /* 09/11/07 NN Type cast mismatch variables */
- for (usByteIndex = (signed short)(usByteSize - 1);
- usByteIndex >= 0; usByteIndex--) {
- ucByte = a_pucData[usByteIndex];
- ucFlipByte = 0x00;
-
- /*
- *
- * Flip each byte.
- *
- */
-
- for (usBitIndex = 0; usBitIndex < 8; usBitIndex++) {
- ucFlipByte <<= 1;
- if (ucByte & 0x1) {
- ucFlipByte |= 0x1;
- }
-
- ucByte >>= 1;
- }
-
- /*
- *
- * Print the flipped byte.
- *
- */
-
- printf("%.02X", ucFlipByte);
- if ((usByteSize - usByteIndex) % 40 == 39) {
- puts("\n\t\t");
- }
- if (usByteIndex < 0)
- break;
- }
- puts(")");
-}
-#endif /* DEBUG */
-
-void ispVMMemManager(signed char cTarget, unsigned short usSize)
-{
- switch (cTarget) {
- case XTDI:
- case TDI:
- if (g_pucInData != NULL) {
- if (previous_size == usSize) {/*memory exist*/
- break;
- } else {
- free(g_pucInData);
- g_pucInData = NULL;
- }
- }
- g_pucInData = (unsigned char *) malloc(usSize / 8 + 2);
- previous_size = usSize;
- case XTDO:
- case TDO:
- if (g_pucOutData != NULL) {
- if (previous_size == usSize) { /*already exist*/
- break;
- } else {
- free(g_pucOutData);
- g_pucOutData = NULL;
- }
- }
- g_pucOutData = (unsigned char *) malloc(usSize / 8 + 2);
- previous_size = usSize;
- break;
- case MASK:
- if (g_pucOutMaskData != NULL) {
- if (previous_size == usSize) {/*already allocated*/
- break;
- } else {
- free(g_pucOutMaskData);
- g_pucOutMaskData = NULL;
- }
- }
- g_pucOutMaskData = (unsigned char *) malloc(usSize / 8 + 2);
- previous_size = usSize;
- break;
- case HIR:
- if (g_pucHIRData != NULL) {
- free(g_pucHIRData);
- g_pucHIRData = NULL;
- }
- g_pucHIRData = (unsigned char *) malloc(usSize / 8 + 2);
- break;
- case TIR:
- if (g_pucTIRData != NULL) {
- free(g_pucTIRData);
- g_pucTIRData = NULL;
- }
- g_pucTIRData = (unsigned char *) malloc(usSize / 8 + 2);
- break;
- case HDR:
- if (g_pucHDRData != NULL) {
- free(g_pucHDRData);
- g_pucHDRData = NULL;
- }
- g_pucHDRData = (unsigned char *) malloc(usSize / 8 + 2);
- break;
- case TDR:
- if (g_pucTDRData != NULL) {
- free(g_pucTDRData);
- g_pucTDRData = NULL;
- }
- g_pucTDRData = (unsigned char *) malloc(usSize / 8 + 2);
- break;
- case HEAP:
- if (g_pucHeapMemory != NULL) {
- free(g_pucHeapMemory);
- g_pucHeapMemory = NULL;
- }
- g_pucHeapMemory = (unsigned char *) malloc(usSize + 2);
- break;
- case DMASK:
- if (g_pucOutDMaskData != NULL) {
- if (previous_size == usSize) { /*already allocated*/
- break;
- } else {
- free(g_pucOutDMaskData);
- g_pucOutDMaskData = NULL;
- }
- }
- g_pucOutDMaskData = (unsigned char *) malloc(usSize / 8 + 2);
- previous_size = usSize;
- break;
- case LHEAP:
- if (g_pucIntelBuffer != NULL) {
- free(g_pucIntelBuffer);
- g_pucIntelBuffer = NULL;
- }
- g_pucIntelBuffer = (unsigned char *) malloc(usSize + 2);
- break;
- case LVDS:
- if (g_pLVDSList != NULL) {
- free(g_pLVDSList);
- g_pLVDSList = NULL;
- }
- g_pLVDSList = (LVDSPair *) malloc(usSize * sizeof(LVDSPair));
- if (g_pLVDSList)
- memset(g_pLVDSList, 0, usSize * sizeof(LVDSPair));
- break;
- default:
- return;
- }
-}
-
-void ispVMFreeMem(void)
-{
- if (g_pucHeapMemory != NULL) {
- free(g_pucHeapMemory);
- g_pucHeapMemory = NULL;
- }
-
- if (g_pucOutMaskData != NULL) {
- free(g_pucOutMaskData);
- g_pucOutMaskData = NULL;
- }
-
- if (g_pucInData != NULL) {
- free(g_pucInData);
- g_pucInData = NULL;
- }
-
- if (g_pucOutData != NULL) {
- free(g_pucOutData);
- g_pucOutData = NULL;
- }
-
- if (g_pucHIRData != NULL) {
- free(g_pucHIRData);
- g_pucHIRData = NULL;
- }
-
- if (g_pucTIRData != NULL) {
- free(g_pucTIRData);
- g_pucTIRData = NULL;
- }
-
- if (g_pucHDRData != NULL) {
- free(g_pucHDRData);
- g_pucHDRData = NULL;
- }
-
- if (g_pucTDRData != NULL) {
- free(g_pucTDRData);
- g_pucTDRData = NULL;
- }
-
- if (g_pucOutDMaskData != NULL) {
- free(g_pucOutDMaskData);
- g_pucOutDMaskData = NULL;
- }
-
- if (g_pucIntelBuffer != NULL) {
- free(g_pucIntelBuffer);
- g_pucIntelBuffer = NULL;
- }
-
- if (g_pLVDSList != NULL) {
- free(g_pLVDSList);
- g_pLVDSList = NULL;
- }
-}
-
-/*
- *
- * ispVMDataSize
- *
- * Returns a VME-encoded number, usually used to indicate the
- * bit length of an SIR/SDR command.
- *
- */
-
-long ispVMDataSize(void)
-{
- /* 09/11/07 NN added local variables initialization */
- long int iSize = 0;
- signed char cCurrentByte = 0;
- signed char cIndex = 0;
- cIndex = 0;
- while ((cCurrentByte = GetByte()) & 0x80) {
- iSize |= ((long int) (cCurrentByte & 0x7F)) << cIndex;
- cIndex += 7;
- }
- iSize |= ((long int) (cCurrentByte & 0x7F)) << cIndex;
- return iSize;
-}
-
-/*
- *
- * ispVMCode
- *
- * This is the heart of the embedded engine. All the high-level opcodes
- * are extracted here. Once they have been identified, then it
- * will call other functions to handle the processing.
- *
- */
-
-signed char ispVMCode(void)
-{
- /* 09/11/07 NN added local variables initialization */
- unsigned short iRepeatSize = 0;
- signed char cOpcode = 0;
- signed char cRetCode = 0;
- unsigned char ucState = 0;
- unsigned short usDelay = 0;
- unsigned short usToggle = 0;
- unsigned char usByte = 0;
-
- /*
- *
- * Check the compression flag only if this is the first time
- * this function is entered. Do not check the compression flag if
- * it is being called recursively from other functions within
- * the embedded engine.
- *
- */
-
- if (!(g_usDataType & LHEAP_IN) && !(g_usDataType & HEAP_IN)) {
- usByte = GetByte();
- if (usByte == 0xf1) {
- g_usDataType |= COMPRESS;
- } else if (usByte == 0xf2) {
- g_usDataType &= ~COMPRESS;
- } else {
- return VME_INVALID_FILE;
- }
- }
-
- /*
- *
- * Begin looping through all the VME opcodes.
- *
- */
-
- while ((cOpcode = GetByte()) >= 0) {
-
- switch (cOpcode) {
- case STATE:
-
- /*
- * Step the JTAG state machine.
- */
-
- ucState = GetByte();
-
- /*
- * Step the JTAG state machine to DRCAPTURE
- * to support Looping.
- */
-
- if ((g_usDataType & LHEAP_IN) &&
- (ucState == DRPAUSE) &&
- (g_cCurrentJTAGState == ucState)) {
- ispVMStateMachine(DRCAPTURE);
- }
-
- ispVMStateMachine(ucState);
-
-#ifdef DEBUG
- if (g_usDataType & LHEAP_IN) {
- debug("LDELAY %s ", GetState(ucState));
- } else {
- debug("STATE %s;\n", GetState(ucState));
- }
-#endif /* DEBUG */
- break;
- case SIR:
- case SDR:
- case XSDR:
-
-#ifdef DEBUG
- switch (cOpcode) {
- case SIR:
- puts("SIR ");
- break;
- case SDR:
- case XSDR:
- if (g_usDataType & LHEAP_IN) {
- puts("LSDR ");
- } else {
- puts("SDR ");
- }
- break;
- }
-#endif /* DEBUG */
- /*
- *
- * Shift in data into the device.
- *
- */
-
- cRetCode = ispVMShift(cOpcode);
- if (cRetCode != 0) {
- return cRetCode;
- }
- break;
- case WAIT:
-
- /*
- *
- * Observe delay.
- *
- */
-
- /* 09/11/07 NN Type cast mismatch variables */
- usDelay = (unsigned short) ispVMDataSize();
- ispVMDelay(usDelay);
-
-#ifdef DEBUG
- if (usDelay & 0x8000) {
-
- /*
- * Since MSB is set, the delay time must be
- * decoded to millisecond. The SVF2VME encodes
- * the MSB to represent millisecond.
- */
-
- usDelay &= ~0x8000;
- if (g_usDataType & LHEAP_IN) {
- printf("%.2E SEC;\n",
- (float) usDelay / 1000);
- } else {
- printf("RUNTEST %.2E SEC;\n",
- (float) usDelay / 1000);
- }
- } else {
- /*
- * Since MSB is not set, the delay time
- * is given as microseconds.
- */
-
- if (g_usDataType & LHEAP_IN) {
- printf("%.2E SEC;\n",
- (float) usDelay / 1000000);
- } else {
- printf("RUNTEST %.2E SEC;\n",
- (float) usDelay / 1000000);
- }
- }
-#endif /* DEBUG */
- break;
- case TCK:
-
- /*
- * Issue clock toggles.
- */
-
- /* 09/11/07 NN Type cast mismatch variables */
- usToggle = (unsigned short) ispVMDataSize();
- ispVMClocks(usToggle);
-
-#ifdef DEBUG
- printf("RUNTEST %d TCK;\n", usToggle);
-#endif /* DEBUG */
- break;
- case ENDDR:
-
- /*
- *
- * Set the ENDDR.
- *
- */
-
- g_ucEndDR = GetByte();
-
-#ifdef DEBUG
- printf("ENDDR %s;\n", GetState(g_ucEndDR));
-#endif /* DEBUG */
- break;
- case ENDIR:
-
- /*
- *
- * Set the ENDIR.
- *
- */
-
- g_ucEndIR = GetByte();
-
-#ifdef DEBUG
- printf("ENDIR %s;\n", GetState(g_ucEndIR));
-#endif /* DEBUG */
- break;
- case HIR:
- case TIR:
- case HDR:
- case TDR:
-
-#ifdef DEBUG
- switch (cOpcode) {
- case HIR:
- puts("HIR ");
- break;
- case TIR:
- puts("TIR ");
- break;
- case HDR:
- puts("HDR ");
- break;
- case TDR:
- puts("TDR ");
- break;
- }
-#endif /* DEBUG */
- /*
- * Set the header/trailer of the device in order
- * to bypass
- * successfully.
- */
-
- cRetCode = ispVMAmble(cOpcode);
- if (cRetCode != 0) {
- return cRetCode;
- }
-
-#ifdef DEBUG
- puts(";\n");
-#endif /* DEBUG */
- break;
- case MEM:
-
- /*
- * The maximum RAM required to support
- * processing one row of the VME file.
- */
-
- /* 09/11/07 NN Type cast mismatch variables */
- g_usMaxSize = (unsigned short) ispVMDataSize();
-
-#ifdef DEBUG
- printf("// MEMSIZE %d\n", g_usMaxSize);
-#endif /* DEBUG */
- break;
- case VENDOR:
-
- /*
- *
- * Set the VENDOR type.
- *
- */
-
- cOpcode = GetByte();
- switch (cOpcode) {
- case LATTICE:
-#ifdef DEBUG
- puts("// VENDOR LATTICE\n");
-#endif /* DEBUG */
- g_cVendor = LATTICE;
- break;
- case ALTERA:
-#ifdef DEBUG
- puts("// VENDOR ALTERA\n");
-#endif /* DEBUG */
- g_cVendor = ALTERA;
- break;
- case XILINX:
-#ifdef DEBUG
- puts("// VENDOR XILINX\n");
-#endif /* DEBUG */
- g_cVendor = XILINX;
- break;
- default:
- break;
- }
- break;
- case SETFLOW:
-
- /*
- * Set the flow control. Flow control determines
- * the personality of the embedded engine.
- */
-
- /* 09/11/07 NN Type cast mismatch variables */
- g_usFlowControl |= (unsigned short) ispVMDataSize();
- break;
- case RESETFLOW:
-
- /*
- *
- * Unset the flow control.
- *
- */
-
- /* 09/11/07 NN Type cast mismatch variables */
- g_usFlowControl &= (unsigned short) ~(ispVMDataSize());
- break;
- case HEAP:
-
- /*
- *
- * Allocate heap size to store loops.
- *
- */
-
- cRetCode = GetByte();
- if (cRetCode != SECUREHEAP) {
- return VME_INVALID_FILE;
- }
- /* 09/11/07 NN Type cast mismatch variables */
- g_iHEAPSize = (unsigned short) ispVMDataSize();
-
- /*
- * Store the maximum size of the HEAP buffer.
- * Used to convert VME to HEX.
- */
-
- if (g_iHEAPSize > g_usHeapSize) {
- g_usHeapSize = g_iHEAPSize;
- }
-
- ispVMMemManager(HEAP, (unsigned short) g_iHEAPSize);
- break;
- case REPEAT:
-
- /*
- *
- * Execute loops.
- *
- */
-
- g_usRepeatLoops = 0;
-
- /* 09/11/07 NN Type cast mismatch variables */
- iRepeatSize = (unsigned short) ispVMDataSize();
-
- cRetCode = ispVMLoop((unsigned short) iRepeatSize);
- if (cRetCode != 0) {
- return cRetCode;
- }
- break;
- case ENDLOOP:
-
- /*
- *
- * Exit point from processing loops.
- *
- */
-
- return cRetCode;
- case ENDVME:
-
- /*
- * The only valid exit point that indicates
- * end of programming.
- */
-
- return cRetCode;
- case SHR:
-
- /*
- *
- * Right-shift address.
- *
- */
-
- g_usFlowControl |= SHIFTRIGHT;
-
- /* 09/11/07 NN Type cast mismatch variables */
- g_usShiftValue = (unsigned short) (g_usRepeatLoops *
- (unsigned short)GetByte());
- break;
- case SHL:
-
- /*
- * Left-shift address.
- */
-
- g_usFlowControl |= SHIFTLEFT;
-
- /* 09/11/07 NN Type cast mismatch variables */
- g_usShiftValue = (unsigned short) (g_usRepeatLoops *
- (unsigned short)GetByte());
- break;
- case FREQUENCY:
-
- /*
- *
- * Set the frequency.
- *
- */
-
- /* 09/11/07 NN Type cast mismatch variables */
- g_iFrequency = (int) (ispVMDataSize() / 1000);
- if (g_iFrequency == 1)
- g_iFrequency = 1000;
-
-#ifdef DEBUG
- printf("FREQUENCY %.2E HZ;\n",
- (float) g_iFrequency * 1000);
-#endif /* DEBUG */
- break;
- case LCOUNT:
-
- /*
- *
- * Process LCOUNT command.
- *
- */
-
- cRetCode = ispVMLCOUNT((unsigned short)ispVMDataSize());
- if (cRetCode != 0) {
- return cRetCode;
- }
- break;
- case VUES:
-
- /*
- *
- * Set the flow control to verify USERCODE.
- *
- */
-
- g_usFlowControl |= VERIFYUES;
- break;
- case COMMENT:
-
- /*
- *
- * Display comment.
- *
- */
-
- ispVMComment((unsigned short) ispVMDataSize());
- break;
- case LVDS:
-
- /*
- *
- * Process LVDS command.
- *
- */
-
- ispVMProcessLVDS((unsigned short) ispVMDataSize());
- break;
- case HEADER:
-
- /*
- *
- * Discard header.
- *
- */
-
- ispVMHeader((unsigned short) ispVMDataSize());
- break;
- /* 03/14/06 Support Toggle ispENABLE signal*/
- case ispEN:
- ucState = GetByte();
- if ((ucState == ON) || (ucState == 0x01))
- writePort(g_ucPinENABLE, 0x01);
- else
- writePort(g_ucPinENABLE, 0x00);
- ispVMDelay(1);
- break;
- /* 05/24/06 support Toggle TRST pin*/
- case TRST:
- ucState = GetByte();
- if (ucState == 0x01)
- writePort(g_ucPinTRST, 0x01);
- else
- writePort(g_ucPinTRST, 0x00);
- ispVMDelay(1);
- break;
- default:
-
- /*
- *
- * Invalid opcode encountered.
- *
- */
-
-#ifdef DEBUG
- printf("\nINVALID OPCODE: 0x%.2X\n", cOpcode);
-#endif /* DEBUG */
-
- return VME_INVALID_FILE;
- }
- }
-
- /*
- *
- * Invalid exit point. Processing the token 'ENDVME' is the only
- * valid way to exit the embedded engine.
- *
- */
-
- return VME_INVALID_FILE;
-}
-
-/*
- *
- * ispVMDataCode
- *
- * Processes the TDI/TDO/MASK/DMASK etc of an SIR/SDR command.
- *
- */
-
-signed char ispVMDataCode(void)
-{
- /* 09/11/07 NN added local variables initialization */
- signed char cDataByte = 0;
- signed char siDataSource = 0; /*source of data from file by default*/
-
- if (g_usDataType & HEAP_IN) {
- siDataSource = 1; /*the source of data from memory*/
- }
-
- /*
- *
- * Clear the data type register.
- *
- **/
-
- g_usDataType &= ~(MASK_DATA + TDI_DATA +
- TDO_DATA + DMASK_DATA + CMASK_DATA);
-
- /*
- * Iterate through SIR/SDR command and look for TDI,
- * TDO, MASK, etc.
- */
-
- while ((cDataByte = GetByte()) >= 0) {
- ispVMMemManager(cDataByte, g_usMaxSize);
- switch (cDataByte) {
- case TDI:
-
- /*
- * Store the maximum size of the TDI buffer.
- * Used to convert VME to HEX.
- */
-
- if (g_usiDataSize > g_usTDISize) {
- g_usTDISize = g_usiDataSize;
- }
- /*
- * Updated data type register to indicate that
- * TDI data is currently being used. Process the
- * data in the VME file into the TDI buffer.
- */
-
- g_usDataType |= TDI_DATA;
- ispVMData(g_pucInData);
- break;
- case XTDO:
-
- /*
- * Store the maximum size of the TDO buffer.
- * Used to convert VME to HEX.
- */
-
- if (g_usiDataSize > g_usTDOSize) {
- g_usTDOSize = g_usiDataSize;
- }
-
- /*
- * Updated data type register to indicate that
- * TDO data is currently being used.
- */
-
- g_usDataType |= TDO_DATA;
- break;
- case TDO:
-
- /*
- * Store the maximum size of the TDO buffer.
- * Used to convert VME to HEX.
- */
-
- if (g_usiDataSize > g_usTDOSize) {
- g_usTDOSize = g_usiDataSize;
- }
-
- /*
- * Updated data type register to indicate
- * that TDO data is currently being used.
- * Process the data in the VME file into the
- * TDO buffer.
- */
-
- g_usDataType |= TDO_DATA;
- ispVMData(g_pucOutData);
- break;
- case MASK:
-
- /*
- * Store the maximum size of the MASK buffer.
- * Used to convert VME to HEX.
- */
-
- if (g_usiDataSize > g_usMASKSize) {
- g_usMASKSize = g_usiDataSize;
- }
-
- /*
- * Updated data type register to indicate that
- * MASK data is currently being used. Process
- * the data in the VME file into the MASK buffer
- */
-
- g_usDataType |= MASK_DATA;
- ispVMData(g_pucOutMaskData);
- break;
- case DMASK:
-
- /*
- * Store the maximum size of the DMASK buffer.
- * Used to convert VME to HEX.
- */
-
- if (g_usiDataSize > g_usDMASKSize) {
- g_usDMASKSize = g_usiDataSize;
- }
-
- /*
- * Updated data type register to indicate that
- * DMASK data is currently being used. Process
- * the data in the VME file into the DMASK
- * buffer.
- */
-
- g_usDataType |= DMASK_DATA;
- ispVMData(g_pucOutDMaskData);
- break;
- case CMASK:
-
- /*
- * Updated data type register to indicate that
- * MASK data is currently being used. Process
- * the data in the VME file into the MASK buffer
- */
-
- g_usDataType |= CMASK_DATA;
- ispVMData(g_pucOutMaskData);
- break;
- case CONTINUE:
- return 0;
- default:
- /*
- * Encountered invalid opcode.
- */
- return VME_INVALID_FILE;
- }
-
- switch (cDataByte) {
- case TDI:
-
- /*
- * Left bit shift. Used when performing
- * algorithm looping.
- */
-
- if (g_usFlowControl & SHIFTLEFT) {
- ispVMBitShift(SHL, g_usShiftValue);
- g_usFlowControl &= ~SHIFTLEFT;
- }
-
- /*
- * Right bit shift. Used when performing
- * algorithm looping.
- */
-
- if (g_usFlowControl & SHIFTRIGHT) {
- ispVMBitShift(SHR, g_usShiftValue);
- g_usFlowControl &= ~SHIFTRIGHT;
- }
- default:
- break;
- }
-
- if (siDataSource) {
- g_usDataType |= HEAP_IN; /*restore from memory*/
- }
- }
-
- if (siDataSource) { /*fetch data from heap memory upon return*/
- g_usDataType |= HEAP_IN;
- }
-
- if (cDataByte < 0) {
-
- /*
- * Encountered invalid opcode.
- */
-
- return VME_INVALID_FILE;
- } else {
- return 0;
- }
-}
-
-/*
- *
- * ispVMData
- * Extract one row of data operand from the current data type opcode. Perform
- * the decompression if necessary. Extra RAM is not required for the
- * decompression process. The decompression scheme employed in this module
- * is on row by row basis. The format of the data stream:
- * [compression code][compressed data stream]
- * 0x00 --No compression
- * 0x01 --Compress by 0x00.
- * Example:
- * Original stream: 0x000000000000000000000001
- * Compressed stream: 0x01000901
- * Detail: 0x01 is the code, 0x00 is the key,
- * 0x09 is the count of 0x00 bytes,
- * 0x01 is the uncompressed byte.
- * 0x02 --Compress by 0xFF.
- * Example:
- * Original stream: 0xFFFFFFFFFFFFFFFFFFFFFF01
- * Compressed stream: 0x02FF0901
- * Detail: 0x02 is the code, 0xFF is the key,
- * 0x09 is the count of 0xFF bytes,
- * 0x01 is the uncompressed byte.
- * 0x03
- * : :
- * 0xFE -- Compress by nibble blocks.
- * Example:
- * Original stream: 0x84210842108421084210
- * Compressed stream: 0x0584210
- * Detail: 0x05 is the code, means 5 nibbles block.
- * 0x84210 is the 5 nibble blocks.
- * The whole row is 80 bits given by g_usiDataSize.
- * The number of times the block repeat itself
- * is found by g_usiDataSize/(4*0x05) which is 4.
- * 0xFF -- Compress by the most frequently happen byte.
- * Example:
- * Original stream: 0x04020401030904040404
- * Compressed stream: 0xFF04(0,1,0x02,0,1,0x01,1,0x03,1,0x09,0,0,0)
- * or: 0xFF044090181C240
- * Detail: 0xFF is the code, 0x04 is the key.
- * a bit of 0 represent the key shall be put into
- * the current bit position and a bit of 1
- * represent copying the next of 8 bits of data
- * in.
- *
- */
-
-void ispVMData(unsigned char *ByteData)
-{
- /* 09/11/07 NN added local variables initialization */
- unsigned short size = 0;
- unsigned short i, j, m, getData = 0;
- unsigned char cDataByte = 0;
- unsigned char compress = 0;
- unsigned short FFcount = 0;
- unsigned char compr_char = 0xFF;
- unsigned short index = 0;
- signed char compression = 0;
-
- /*convert number in bits to bytes*/
- if (g_usiDataSize % 8 > 0) {
- /* 09/11/07 NN Type cast mismatch variables */
- size = (unsigned short)(g_usiDataSize / 8 + 1);
- } else {
- /* 09/11/07 NN Type cast mismatch variables */
- size = (unsigned short)(g_usiDataSize / 8);
- }
-
- /*
- * If there is compression, then check if compress by key
- * of 0x00 or 0xFF or by other keys or by nibble blocks
- */
-
- if (g_usDataType & COMPRESS) {
- compression = 1;
- compress = GetByte();
- if ((compress == VAR) && (g_usDataType & HEAP_IN)) {
- getData = 1;
- g_usDataType &= ~(HEAP_IN);
- compress = GetByte();
- }
-
- switch (compress) {
- case 0x00:
- /* No compression */
- compression = 0;
- break;
- case 0x01:
- /* Compress by byte 0x00 */
- compr_char = 0x00;
- break;
- case 0x02:
- /* Compress by byte 0xFF */
- compr_char = 0xFF;
- break;
- case 0xFF:
- /* Huffman encoding */
- compr_char = GetByte();
- i = 8;
- for (index = 0; index < size; index++) {
- ByteData[index] = 0x00;
- if (i > 7) {
- cDataByte = GetByte();
- i = 0;
- }
- if ((cDataByte << i++) & 0x80)
- m = 8;
- else {
- ByteData[index] = compr_char;
- m = 0;
- }
-
- for (j = 0; j < m; j++) {
- if (i > 7) {
- cDataByte = GetByte();
- i = 0;
- }
- ByteData[index] |=
- ((cDataByte << i++) & 0x80) >> j;
- }
- }
- size = 0;
- break;
- default:
- for (index = 0; index < size; index++)
- ByteData[index] = 0x00;
- for (index = 0; index < compress; index++) {
- if (index % 2 == 0)
- cDataByte = GetByte();
- for (i = 0; i < size * 2 / compress; i++) {
- j = (unsigned short)(index +
- (i * (unsigned short)compress));
- /*clear the nibble to zero first*/
- if (j%2) {
- if (index % 2)
- ByteData[j/2] |=
- cDataByte & 0xF;
- else
- ByteData[j/2] |=
- cDataByte >> 4;
- } else {
- if (index % 2)
- ByteData[j/2] |=
- cDataByte << 4;
- else
- ByteData[j/2] |=
- cDataByte & 0xF0;
- }
- }
- }
- size = 0;
- break;
- }
- }
-
- FFcount = 0;
-
- /* Decompress by byte 0x00 or 0xFF */
- for (index = 0; index < size; index++) {
- if (FFcount <= 0) {
- cDataByte = GetByte();
- if ((cDataByte == VAR) && (g_usDataType&HEAP_IN) &&
- !getData && !(g_usDataType&COMPRESS)) {
- getData = 1;
- g_usDataType &= ~(HEAP_IN);
- cDataByte = GetByte();
- }
- ByteData[index] = cDataByte;
- if ((compression) && (cDataByte == compr_char))
- /* 09/11/07 NN Type cast mismatch variables */
- FFcount = (unsigned short) ispVMDataSize();
- /*The number of 0xFF or 0x00 bytes*/
- } else {
- FFcount--; /*Use up the 0xFF chain first*/
- ByteData[index] = compr_char;
- }
- }
-
- if (getData) {
- g_usDataType |= HEAP_IN;
- getData = 0;
- }
-}
-
-/*
- *
- * ispVMShift
- *
- * Processes the SDR/XSDR/SIR commands.
- *
- */
-
-signed char ispVMShift(signed char a_cCode)
-{
- /* 09/11/07 NN added local variables initialization */
- unsigned short iDataIndex = 0;
- unsigned short iReadLoop = 0;
- signed char cRetCode = 0;
-
- cRetCode = 0;
- /* 09/11/07 NN Type cast mismatch variables */
- g_usiDataSize = (unsigned short) ispVMDataSize();
-
- /*clear the flags first*/
- g_usDataType &= ~(SIR_DATA + EXPRESS + SDR_DATA);
- switch (a_cCode) {
- case SIR:
- g_usDataType |= SIR_DATA;
- /*
- * 1/15/04 If performing cascading, then go directly to SHIFTIR.
- * Else, go to IRPAUSE before going to SHIFTIR
- */
- if (g_usFlowControl & CASCADE) {
- ispVMStateMachine(SHIFTIR);
- } else {
- ispVMStateMachine(IRPAUSE);
- ispVMStateMachine(SHIFTIR);
- if (g_usHeadIR > 0) {
- ispVMBypass(HIR, g_usHeadIR);
- sclock();
- }
- }
- break;
- case XSDR:
- g_usDataType |= EXPRESS; /*mark simultaneous in and out*/
- case SDR:
- g_usDataType |= SDR_DATA;
- /*
- * 1/15/04 If already in SHIFTDR, then do not move state or
- * shift in header. This would imply that the previously
- * shifted frame was a cascaded frame.
- */
- if (g_cCurrentJTAGState != SHIFTDR) {
- /*
- * 1/15/04 If performing cascading, then go directly
- * to SHIFTDR. Else, go to DRPAUSE before going
- * to SHIFTDR
- */
- if (g_usFlowControl & CASCADE) {
- if (g_cCurrentJTAGState == DRPAUSE) {
- ispVMStateMachine(SHIFTDR);
- /*
- * 1/15/04 If cascade flag has been seat
- * and the current state is DRPAUSE,
- * this implies that the first cascaded
- * frame is about to be shifted in. The
- * header must be shifted prior to
- * shifting the first cascaded frame.
- */
- if (g_usHeadDR > 0) {
- ispVMBypass(HDR, g_usHeadDR);
- sclock();
- }
- } else {
- ispVMStateMachine(SHIFTDR);
- }
- } else {
- ispVMStateMachine(DRPAUSE);
- ispVMStateMachine(SHIFTDR);
- if (g_usHeadDR > 0) {
- ispVMBypass(HDR, g_usHeadDR);
- sclock();
- }
- }
- }
- break;
- default:
- return VME_INVALID_FILE;
- }
-
- cRetCode = ispVMDataCode();
-
- if (cRetCode != 0) {
- return VME_INVALID_FILE;
- }
-
-#ifdef DEBUG
- printf("%d ", g_usiDataSize);
-
- if (g_usDataType & TDI_DATA) {
- puts("TDI ");
- PrintData(g_usiDataSize, g_pucInData);
- }
-
- if (g_usDataType & TDO_DATA) {
- puts("\n\t\tTDO ");
- PrintData(g_usiDataSize, g_pucOutData);
- }
-
- if (g_usDataType & MASK_DATA) {
- puts("\n\t\tMASK ");
- PrintData(g_usiDataSize, g_pucOutMaskData);
- }
-
- if (g_usDataType & DMASK_DATA) {
- puts("\n\t\tDMASK ");
- PrintData(g_usiDataSize, g_pucOutDMaskData);
- }
-
- puts(";\n");
-#endif /* DEBUG */
-
- if (g_usDataType & TDO_DATA || g_usDataType & DMASK_DATA) {
- if (g_usDataType & DMASK_DATA) {
- cRetCode = ispVMReadandSave(g_usiDataSize);
- if (!cRetCode) {
- if (g_usTailDR > 0) {
- sclock();
- ispVMBypass(TDR, g_usTailDR);
- }
- ispVMStateMachine(DRPAUSE);
- ispVMStateMachine(SHIFTDR);
- if (g_usHeadDR > 0) {
- ispVMBypass(HDR, g_usHeadDR);
- sclock();
- }
- for (iDataIndex = 0;
- iDataIndex < g_usiDataSize / 8 + 1;
- iDataIndex++)
- g_pucInData[iDataIndex] =
- g_pucOutData[iDataIndex];
- g_usDataType &= ~(TDO_DATA + DMASK_DATA);
- cRetCode = ispVMSend(g_usiDataSize);
- }
- } else {
- cRetCode = ispVMRead(g_usiDataSize);
- if (cRetCode == -1 && g_cVendor == XILINX) {
- for (iReadLoop = 0; iReadLoop < 30;
- iReadLoop++) {
- cRetCode = ispVMRead(g_usiDataSize);
- if (!cRetCode) {
- break;
- } else {
- /* Always DRPAUSE */
- ispVMStateMachine(DRPAUSE);
- /*
- * Bypass other devices
- * when appropriate
- */
- ispVMBypass(TDR, g_usTailDR);
- ispVMStateMachine(g_ucEndDR);
- ispVMStateMachine(IDLE);
- ispVMDelay(1000);
- }
- }
- }
- }
- } else { /*TDI only*/
- cRetCode = ispVMSend(g_usiDataSize);
- }
-
- /*transfer the input data to the output buffer for the next verify*/
- if ((g_usDataType & EXPRESS) || (a_cCode == SDR)) {
- if (g_pucOutData) {
- for (iDataIndex = 0; iDataIndex < g_usiDataSize / 8 + 1;
- iDataIndex++)
- g_pucOutData[iDataIndex] =
- g_pucInData[iDataIndex];
- }
- }
-
- switch (a_cCode) {
- case SIR:
- /* 1/15/04 If not performing cascading, then shift ENDIR */
- if (!(g_usFlowControl & CASCADE)) {
- if (g_usTailIR > 0) {
- sclock();
- ispVMBypass(TIR, g_usTailIR);
- }
- ispVMStateMachine(g_ucEndIR);
- }
- break;
- case XSDR:
- case SDR:
- /* 1/15/04 If not performing cascading, then shift ENDDR */
- if (!(g_usFlowControl & CASCADE)) {
- if (g_usTailDR > 0) {
- sclock();
- ispVMBypass(TDR, g_usTailDR);
- }
- ispVMStateMachine(g_ucEndDR);
- }
- break;
- default:
- break;
- }
-
- return cRetCode;
-}
-
-/*
- *
- * ispVMAmble
- *
- * This routine is to extract Header and Trailer parameter for SIR and
- * SDR operations.
- *
- * The Header and Trailer parameter are the pre-amble and post-amble bit
- * stream need to be shifted into TDI or out of TDO of the devices. Mostly
- * is for the purpose of bypassing the leading or trailing devices. ispVM
- * supports only shifting data into TDI to bypass the devices.
- *
- * For a single device, the header and trailer parameters are all set to 0
- * as default by ispVM. If it is for multiple devices, the header and trailer
- * value will change as specified by the VME file.
- *
- */
-
-signed char ispVMAmble(signed char Code)
-{
- signed char compress = 0;
- /* 09/11/07 NN Type cast mismatch variables */
- g_usiDataSize = (unsigned short)ispVMDataSize();
-
-#ifdef DEBUG
- printf("%d", g_usiDataSize);
-#endif /* DEBUG */
-
- if (g_usiDataSize) {
-
- /*
- * Discard the TDI byte and set the compression bit in the data
- * type register to false if compression is set because TDI data
- * after HIR/HDR/TIR/TDR is not compressed.
- */
-
- GetByte();
- if (g_usDataType & COMPRESS) {
- g_usDataType &= ~(COMPRESS);
- compress = 1;
- }
- }
-
- switch (Code) {
- case HIR:
-
- /*
- * Store the maximum size of the HIR buffer.
- * Used to convert VME to HEX.
- */
-
- if (g_usiDataSize > g_usHIRSize) {
- g_usHIRSize = g_usiDataSize;
- }
-
- /*
- * Assign the HIR value and allocate memory.
- */
-
- g_usHeadIR = g_usiDataSize;
- if (g_usHeadIR) {
- ispVMMemManager(HIR, g_usHeadIR);
- ispVMData(g_pucHIRData);
-
-#ifdef DEBUG
- puts(" TDI ");
- PrintData(g_usHeadIR, g_pucHIRData);
-#endif /* DEBUG */
- }
- break;
- case TIR:
-
- /*
- * Store the maximum size of the TIR buffer.
- * Used to convert VME to HEX.
- */
-
- if (g_usiDataSize > g_usTIRSize) {
- g_usTIRSize = g_usiDataSize;
- }
-
- /*
- * Assign the TIR value and allocate memory.
- */
-
- g_usTailIR = g_usiDataSize;
- if (g_usTailIR) {
- ispVMMemManager(TIR, g_usTailIR);
- ispVMData(g_pucTIRData);
-
-#ifdef DEBUG
- puts(" TDI ");
- PrintData(g_usTailIR, g_pucTIRData);
-#endif /* DEBUG */
- }
- break;
- case HDR:
-
- /*
- * Store the maximum size of the HDR buffer.
- * Used to convert VME to HEX.
- */
-
- if (g_usiDataSize > g_usHDRSize) {
- g_usHDRSize = g_usiDataSize;
- }
-
- /*
- * Assign the HDR value and allocate memory.
- *
- */
-
- g_usHeadDR = g_usiDataSize;
- if (g_usHeadDR) {
- ispVMMemManager(HDR, g_usHeadDR);
- ispVMData(g_pucHDRData);
-
-#ifdef DEBUG
- puts(" TDI ");
- PrintData(g_usHeadDR, g_pucHDRData);
-#endif /* DEBUG */
- }
- break;
- case TDR:
-
- /*
- * Store the maximum size of the TDR buffer.
- * Used to convert VME to HEX.
- */
-
- if (g_usiDataSize > g_usTDRSize) {
- g_usTDRSize = g_usiDataSize;
- }
-
- /*
- * Assign the TDR value and allocate memory.
- *
- */
-
- g_usTailDR = g_usiDataSize;
- if (g_usTailDR) {
- ispVMMemManager(TDR, g_usTailDR);
- ispVMData(g_pucTDRData);
-
-#ifdef DEBUG
- puts(" TDI ");
- PrintData(g_usTailDR, g_pucTDRData);
-#endif /* DEBUG */
- }
- break;
- default:
- break;
- }
-
- /*
- *
- * Re-enable compression if it was previously set.
- *
- **/
-
- if (compress) {
- g_usDataType |= COMPRESS;
- }
-
- if (g_usiDataSize) {
- Code = GetByte();
- if (Code == CONTINUE) {
- return 0;
- } else {
-
- /*
- * Encountered invalid opcode.
- */
-
- return VME_INVALID_FILE;
- }
- }
-
- return 0;
-}
-
-/*
- *
- * ispVMLoop
- *
- * Perform the function call upon by the REPEAT opcode.
- * Memory is to be allocated to store the entire loop from REPEAT to ENDLOOP.
- * After the loop is stored then execution begin. The REPEATLOOP flag is set
- * on the g_usFlowControl register to indicate the repeat loop is in session
- * and therefore fetch opcode from the memory instead of from the file.
- *
- */
-
-signed char ispVMLoop(unsigned short a_usLoopCount)
-{
- /* 09/11/07 NN added local variables initialization */
- signed char cRetCode = 0;
- unsigned short iHeapIndex = 0;
- unsigned short iLoopIndex = 0;
-
- g_usShiftValue = 0;
- for (iHeapIndex = 0; iHeapIndex < g_iHEAPSize; iHeapIndex++) {
- g_pucHeapMemory[iHeapIndex] = GetByte();
- }
-
- if (g_pucHeapMemory[iHeapIndex - 1] != ENDLOOP) {
- return VME_INVALID_FILE;
- }
-
- g_usFlowControl |= REPEATLOOP;
- g_usDataType |= HEAP_IN;
-
- for (iLoopIndex = 0; iLoopIndex < a_usLoopCount; iLoopIndex++) {
- g_iHeapCounter = 0;
- cRetCode = ispVMCode();
- g_usRepeatLoops++;
- if (cRetCode < 0) {
- break;
- }
- }
-
- g_usDataType &= ~(HEAP_IN);
- g_usFlowControl &= ~(REPEATLOOP);
- return cRetCode;
-}
-
-/*
- *
- * ispVMBitShift
- *
- * Shift the TDI stream left or right by the number of bits. The data in
- * *g_pucInData is of the VME format, so the actual shifting is the reverse of
- * IEEE 1532 or SVF format.
- *
- */
-
-signed char ispVMBitShift(signed char mode, unsigned short bits)
-{
- /* 09/11/07 NN added local variables initialization */
- unsigned short i = 0;
- unsigned short size = 0;
- unsigned short tmpbits = 0;
-
- if (g_usiDataSize % 8 > 0) {
- /* 09/11/07 NN Type cast mismatch variables */
- size = (unsigned short)(g_usiDataSize / 8 + 1);
- } else {
- /* 09/11/07 NN Type cast mismatch variables */
- size = (unsigned short)(g_usiDataSize / 8);
- }
-
- switch (mode) {
- case SHR:
- for (i = 0; i < size; i++) {
- if (g_pucInData[i] != 0) {
- tmpbits = bits;
- while (tmpbits > 0) {
- g_pucInData[i] <<= 1;
- if (g_pucInData[i] == 0) {
- i--;
- g_pucInData[i] = 1;
- }
- tmpbits--;
- }
- }
- }
- break;
- case SHL:
- for (i = 0; i < size; i++) {
- if (g_pucInData[i] != 0) {
- tmpbits = bits;
- while (tmpbits > 0) {
- g_pucInData[i] >>= 1;
- if (g_pucInData[i] == 0) {
- i--;
- g_pucInData[i] = 8;
- }
- tmpbits--;
- }
- }
- }
- break;
- default:
- return VME_INVALID_FILE;
- }
-
- return 0;
-}
-
-/*
- *
- * ispVMComment
- *
- * Displays the SVF comments.
- *
- */
-
-void ispVMComment(unsigned short a_usCommentSize)
-{
- char cCurByte = 0;
- for (; a_usCommentSize > 0; a_usCommentSize--) {
- /*
- *
- * Print character to the terminal.
- *
- **/
- cCurByte = GetByte();
- vme_out_char(cCurByte);
- }
- cCurByte = '\n';
- vme_out_char(cCurByte);
-}
-
-/*
- *
- * ispVMHeader
- *
- * Iterate the length of the header and discard it.
- *
- */
-
-void ispVMHeader(unsigned short a_usHeaderSize)
-{
- for (; a_usHeaderSize > 0; a_usHeaderSize--) {
- GetByte();
- }
-}
-
-/*
- *
- * ispVMCalculateCRC32
- *
- * Calculate the 32-bit CRC.
- *
- */
-
-void ispVMCalculateCRC32(unsigned char a_ucData)
-{
- /* 09/11/07 NN added local variables initialization */
- unsigned char ucIndex = 0;
- unsigned char ucFlipData = 0;
- unsigned short usCRCTableEntry = 0;
- unsigned int crc_table[16] = {
- 0x0000, 0xCC01, 0xD801,
- 0x1400, 0xF001, 0x3C00,
- 0x2800, 0xE401, 0xA001,
- 0x6C00, 0x7800, 0xB401,
- 0x5000, 0x9C01, 0x8801,
- 0x4400
- };
-
- for (ucIndex = 0; ucIndex < 8; ucIndex++) {
- ucFlipData <<= 1;
- if (a_ucData & 0x01) {
- ucFlipData |= 0x01;
- }
- a_ucData >>= 1;
- }
-
- /* 09/11/07 NN Type cast mismatch variables */
- usCRCTableEntry = (unsigned short)(crc_table[g_usCalculatedCRC & 0xF]);
- g_usCalculatedCRC = (unsigned short)((g_usCalculatedCRC >> 4) & 0x0FFF);
- g_usCalculatedCRC = (unsigned short)(g_usCalculatedCRC ^
- usCRCTableEntry ^ crc_table[ucFlipData & 0xF]);
- usCRCTableEntry = (unsigned short)(crc_table[g_usCalculatedCRC & 0xF]);
- g_usCalculatedCRC = (unsigned short)((g_usCalculatedCRC >> 4) & 0x0FFF);
- g_usCalculatedCRC = (unsigned short)(g_usCalculatedCRC ^
- usCRCTableEntry ^ crc_table[(ucFlipData >> 4) & 0xF]);
-}
-
-/*
- *
- * ispVMLCOUNT
- *
- * Process the intelligent programming loops.
- *
- */
-
-signed char ispVMLCOUNT(unsigned short a_usCountSize)
-{
- unsigned short usContinue = 1;
- unsigned short usIntelBufferIndex = 0;
- unsigned short usCountIndex = 0;
- signed char cRetCode = 0;
- signed char cRepeatHeap = 0;
- signed char cOpcode = 0;
- unsigned char ucState = 0;
- unsigned short usDelay = 0;
- unsigned short usToggle = 0;
-
- g_usIntelBufferSize = (unsigned short)ispVMDataSize();
-
- /*
- * Allocate memory for intel buffer.
- *
- */
-
- ispVMMemManager(LHEAP, g_usIntelBufferSize);
-
- /*
- * Store the maximum size of the intelligent buffer.
- * Used to convert VME to HEX.
- */
-
- if (g_usIntelBufferSize > g_usLCOUNTSize) {
- g_usLCOUNTSize = g_usIntelBufferSize;
- }
-
- /*
- * Copy intel data to the buffer.
- */
-
- for (usIntelBufferIndex = 0; usIntelBufferIndex < g_usIntelBufferSize;
- usIntelBufferIndex++) {
- g_pucIntelBuffer[usIntelBufferIndex] = GetByte();
- }
-
- /*
- * Set the data type register to get data from the intelligent
- * data buffer.
- */
-
- g_usDataType |= LHEAP_IN;
-
- /*
- *
- * If the HEAP_IN flag is set, temporarily unset the flag so data will be
- * retrieved from the status buffer.
- *
- **/
-
- if (g_usDataType & HEAP_IN) {
- g_usDataType &= ~HEAP_IN;
- cRepeatHeap = 1;
- }
-
-#ifdef DEBUG
- printf("LCOUNT %d;\n", a_usCountSize);
-#endif /* DEBUG */
-
- /*
- * Iterate through the intelligent programming command.
- */
-
- for (usCountIndex = 0; usCountIndex < a_usCountSize; usCountIndex++) {
-
- /*
- *
- * Initialize the intel data index to 0 before each iteration.
- *
- **/
-
- g_usIntelDataIndex = 0;
- cOpcode = 0;
- ucState = 0;
- usDelay = 0;
- usToggle = 0;
- usContinue = 1;
-
- /*
- *
- * Begin looping through all the VME opcodes.
- *
- */
- /*
- * 4/1/09 Nguyen replaced the recursive function call codes on
- * the ispVMLCOUNT function
- *
- */
- while (usContinue) {
- cOpcode = GetByte();
- switch (cOpcode) {
- case HIR:
- case TIR:
- case HDR:
- case TDR:
- /*
- * Set the header/trailer of the device in order
- * to bypass successfully.
- */
-
- ispVMAmble(cOpcode);
- break;
- case STATE:
-
- /*
- * Step the JTAG state machine.
- */
-
- ucState = GetByte();
- /*
- * Step the JTAG state machine to DRCAPTURE
- * to support Looping.
- */
-
- if ((g_usDataType & LHEAP_IN) &&
- (ucState == DRPAUSE) &&
- (g_cCurrentJTAGState == ucState)) {
- ispVMStateMachine(DRCAPTURE);
- }
- ispVMStateMachine(ucState);
-#ifdef DEBUG
- printf("LDELAY %s ", GetState(ucState));
-#endif /* DEBUG */
- break;
- case SIR:
-#ifdef DEBUG
- printf("SIR ");
-#endif /* DEBUG */
- /*
- * Shift in data into the device.
- */
-
- cRetCode = ispVMShift(cOpcode);
- break;
- case SDR:
-
-#ifdef DEBUG
- printf("LSDR ");
-#endif /* DEBUG */
- /*
- * Shift in data into the device.
- */
-
- cRetCode = ispVMShift(cOpcode);
- break;
- case WAIT:
-
- /*
- *
- * Observe delay.
- *
- */
-
- usDelay = (unsigned short)ispVMDataSize();
- ispVMDelay(usDelay);
-
-#ifdef DEBUG
- if (usDelay & 0x8000) {
-
- /*
- * Since MSB is set, the delay time must
- * be decoded to millisecond. The
- * SVF2VME encodes the MSB to represent
- * millisecond.
- */
-
- usDelay &= ~0x8000;
- printf("%.2E SEC;\n",
- (float) usDelay / 1000);
- } else {
- /*
- * Since MSB is not set, the delay time
- * is given as microseconds.
- */
-
- printf("%.2E SEC;\n",
- (float) usDelay / 1000000);
- }
-#endif /* DEBUG */
- break;
- case TCK:
-
- /*
- * Issue clock toggles.
- */
-
- usToggle = (unsigned short)ispVMDataSize();
- ispVMClocks(usToggle);
-
-#ifdef DEBUG
- printf("RUNTEST %d TCK;\n", usToggle);
-#endif /* DEBUG */
- break;
- case ENDLOOP:
-
- /*
- * Exit point from processing loops.
- */
- usContinue = 0;
- break;
-
- case COMMENT:
-
- /*
- * Display comment.
- */
-
- ispVMComment((unsigned short) ispVMDataSize());
- break;
- case ispEN:
- ucState = GetByte();
- if ((ucState == ON) || (ucState == 0x01))
- writePort(g_ucPinENABLE, 0x01);
- else
- writePort(g_ucPinENABLE, 0x00);
- ispVMDelay(1);
- break;
- case TRST:
- if (GetByte() == 0x01)
- writePort(g_ucPinTRST, 0x01);
- else
- writePort(g_ucPinTRST, 0x00);
- ispVMDelay(1);
- break;
- default:
-
- /*
- * Invalid opcode encountered.
- */
-
- debug("\nINVALID OPCODE: 0x%.2X\n", cOpcode);
-
- return VME_INVALID_FILE;
- }
- }
- if (cRetCode >= 0) {
- /*
- * Break if intelligent programming is successful.
- */
-
- break;
- }
-
- }
- /*
- * If HEAP_IN flag was temporarily disabled,
- * re-enable it before exiting
- */
-
- if (cRepeatHeap) {
- g_usDataType |= HEAP_IN;
- }
-
- /*
- * Set the data type register to not get data from the
- * intelligent data buffer.
- */
-
- g_usDataType &= ~LHEAP_IN;
- return cRetCode;
-}
-/*
- *
- * ispVMClocks
- *
- * Applies the specified number of pulses to TCK.
- *
- */
-
-void ispVMClocks(unsigned short Clocks)
-{
- unsigned short iClockIndex = 0;
- for (iClockIndex = 0; iClockIndex < Clocks; iClockIndex++) {
- sclock();
- }
-}
-
-/*
- *
- * ispVMBypass
- *
- * This procedure takes care of the HIR, HDR, TIR, TDR for the
- * purpose of putting the other devices into Bypass mode. The
- * current state is checked to find out if it is at DRPAUSE or
- * IRPAUSE. If it is at DRPAUSE, perform bypass register scan.
- * If it is at IRPAUSE, scan into instruction registers the bypass
- * instruction.
- *
- */
-
-void ispVMBypass(signed char ScanType, unsigned short Bits)
-{
- /* 09/11/07 NN added local variables initialization */
- unsigned short iIndex = 0;
- unsigned short iSourceIndex = 0;
- unsigned char cBitState = 0;
- unsigned char cCurByte = 0;
- unsigned char *pcSource = NULL;
-
- if (Bits <= 0) {
- return;
- }
-
- switch (ScanType) {
- case HIR:
- pcSource = g_pucHIRData;
- break;
- case TIR:
- pcSource = g_pucTIRData;
- break;
- case HDR:
- pcSource = g_pucHDRData;
- break;
- case TDR:
- pcSource = g_pucTDRData;
- break;
- default:
- break;
- }
-
- iSourceIndex = 0;
- cBitState = 0;
- for (iIndex = 0; iIndex < Bits - 1; iIndex++) {
- /* Scan instruction or bypass register */
- if (iIndex % 8 == 0) {
- cCurByte = pcSource[iSourceIndex++];
- }
- cBitState = (unsigned char) (((cCurByte << iIndex % 8) & 0x80)
- ? 0x01 : 0x00);
- writePort(g_ucPinTDI, cBitState);
- sclock();
- }
-
- if (iIndex % 8 == 0) {
- cCurByte = pcSource[iSourceIndex++];
- }
-
- cBitState = (unsigned char) (((cCurByte << iIndex % 8) & 0x80)
- ? 0x01 : 0x00);
- writePort(g_ucPinTDI, cBitState);
-}
-
-/*
- *
- * ispVMStateMachine
- *
- * This procedure steps all devices in the daisy chain from a given
- * JTAG state to the next desirable state. If the next state is TLR,
- * the JTAG state machine is brute forced into TLR by driving TMS
- * high and pulse TCK 6 times.
- *
- */
-
-void ispVMStateMachine(signed char cNextJTAGState)
-{
- /* 09/11/07 NN added local variables initialization */
- signed char cPathIndex = 0;
- signed char cStateIndex = 0;
-
- if ((g_cCurrentJTAGState == cNextJTAGState) &&
- (cNextJTAGState != RESET)) {
- return;
- }
-
- for (cStateIndex = 0; cStateIndex < 25; cStateIndex++) {
- if ((g_cCurrentJTAGState ==
- g_JTAGTransistions[cStateIndex].CurState) &&
- (cNextJTAGState ==
- g_JTAGTransistions[cStateIndex].NextState)) {
- break;
- }
- }
-
- g_cCurrentJTAGState = cNextJTAGState;
- for (cPathIndex = 0;
- cPathIndex < g_JTAGTransistions[cStateIndex].Pulses;
- cPathIndex++) {
- if ((g_JTAGTransistions[cStateIndex].Pattern << cPathIndex)
- & 0x80) {
- writePort(g_ucPinTMS, (unsigned char) 0x01);
- } else {
- writePort(g_ucPinTMS, (unsigned char) 0x00);
- }
- sclock();
- }
-
- writePort(g_ucPinTDI, 0x00);
- writePort(g_ucPinTMS, 0x00);
-}
-
-/*
- *
- * ispVMStart
- *
- * Enable the port to the device and set the state to RESET (TLR).
- *
- */
-
-void ispVMStart(void)
-{
-#ifdef DEBUG
- printf("// ISPVM EMBEDDED ADDED\n");
- printf("STATE RESET;\n");
-#endif
- g_usFlowControl = 0;
- g_usDataType = g_uiChecksumIndex = g_cCurrentJTAGState = 0;
- g_usHeadDR = g_usHeadIR = g_usTailDR = g_usTailIR = 0;
- g_usMaxSize = g_usShiftValue = g_usRepeatLoops = 0;
- g_usTDOSize = g_usMASKSize = g_usTDISize = 0;
- g_usDMASKSize = g_usLCOUNTSize = g_usHDRSize = 0;
- g_usTDRSize = g_usHIRSize = g_usTIRSize = g_usHeapSize = 0;
- g_pLVDSList = NULL;
- g_usLVDSPairCount = 0;
- previous_size = 0;
-
- ispVMStateMachine(RESET); /*step devices to RESET state*/
-}
-
-/*
- *
- * ispVMEnd
- *
- * Set the state of devices to RESET to enable the devices and disable
- * the port.
- *
- */
-
-void ispVMEnd(void)
-{
-#ifdef DEBUG
- printf("// ISPVM EMBEDDED ADDED\n");
- printf("STATE RESET;\n");
- printf("RUNTEST 1.00E-001 SEC;\n");
-#endif
-
- ispVMStateMachine(RESET); /*step devices to RESET state */
- ispVMDelay(1000); /*wake up devices*/
-}
-
-/*
- *
- * ispVMSend
- *
- * Send the TDI data stream to devices. The data stream can be
- * instructions or data.
- *
- */
-
-signed char ispVMSend(unsigned short a_usiDataSize)
-{
- /* 09/11/07 NN added local variables initialization */
- unsigned short iIndex = 0;
- unsigned short iInDataIndex = 0;
- unsigned char cCurByte = 0;
- unsigned char cBitState = 0;
-
- for (iIndex = 0; iIndex < a_usiDataSize - 1; iIndex++) {
- if (iIndex % 8 == 0) {
- cCurByte = g_pucInData[iInDataIndex++];
- }
- cBitState = (unsigned char)(((cCurByte << iIndex % 8) & 0x80)
- ? 0x01 : 0x00);
- writePort(g_ucPinTDI, cBitState);
- sclock();
- }
-
- if (iIndex % 8 == 0) {
- /* Take care of the last bit */
- cCurByte = g_pucInData[iInDataIndex];
- }
-
- cBitState = (unsigned char) (((cCurByte << iIndex % 8) & 0x80)
- ? 0x01 : 0x00);
-
- writePort(g_ucPinTDI, cBitState);
- if (g_usFlowControl & CASCADE) {
- /*1/15/04 Clock in last bit for the first n-1 cascaded frames */
- sclock();
- }
-
- return 0;
-}
-
-/*
- *
- * ispVMRead
- *
- * Read the data stream from devices and verify.
- *
- */
-
-signed char ispVMRead(unsigned short a_usiDataSize)
-{
- /* 09/11/07 NN added local variables initialization */
- unsigned short usDataSizeIndex = 0;
- unsigned short usErrorCount = 0;
- unsigned short usLastBitIndex = 0;
- unsigned char cDataByte = 0;
- unsigned char cMaskByte = 0;
- unsigned char cInDataByte = 0;
- unsigned char cCurBit = 0;
- unsigned char cByteIndex = 0;
- unsigned short usBufferIndex = 0;
- unsigned char ucDisplayByte = 0x00;
- unsigned char ucDisplayFlag = 0x01;
- char StrChecksum[256] = {0};
- unsigned char g_usCalculateChecksum = 0x00;
-
- /* 09/11/07 NN Type cast mismatch variables */
- usLastBitIndex = (unsigned short)(a_usiDataSize - 1);
-
-#ifndef DEBUG
- /*
- * If mask is not all zeros, then set the display flag to 0x00,
- * otherwise it shall be set to 0x01 to indicate that data read
- * from the device shall be displayed. If DEBUG is defined,
- * always display data.
- */
-
- for (usDataSizeIndex = 0; usDataSizeIndex < (a_usiDataSize + 7) / 8;
- usDataSizeIndex++) {
- if (g_usDataType & MASK_DATA) {
- if (g_pucOutMaskData[usDataSizeIndex] != 0x00) {
- ucDisplayFlag = 0x00;
- break;
- }
- } else if (g_usDataType & CMASK_DATA) {
- g_usCalculateChecksum = 0x01;
- ucDisplayFlag = 0x00;
- break;
- } else {
- ucDisplayFlag = 0x00;
- break;
- }
- }
-#endif /* DEBUG */
-
- /*
- *
- * Begin shifting data in and out of the device.
- *
- **/
-
- for (usDataSizeIndex = 0; usDataSizeIndex < a_usiDataSize;
- usDataSizeIndex++) {
- if (cByteIndex == 0) {
-
- /*
- * Grab byte from TDO buffer.
- */
-
- if (g_usDataType & TDO_DATA) {
- cDataByte = g_pucOutData[usBufferIndex];
- }
-
- /*
- * Grab byte from MASK buffer.
- */
-
- if (g_usDataType & MASK_DATA) {
- cMaskByte = g_pucOutMaskData[usBufferIndex];
- } else {
- cMaskByte = 0xFF;
- }
-
- /*
- * Grab byte from CMASK buffer.
- */
-
- if (g_usDataType & CMASK_DATA) {
- cMaskByte = 0x00;
- g_usCalculateChecksum = 0x01;
- }
-
- /*
- * Grab byte from TDI buffer.
- */
-
- if (g_usDataType & TDI_DATA) {
- cInDataByte = g_pucInData[usBufferIndex];
- }
-
- usBufferIndex++;
- }
-
- cCurBit = readPort();
-
- if (ucDisplayFlag) {
- ucDisplayByte <<= 1;
- ucDisplayByte |= cCurBit;
- }
-
- /*
- * Check if data read from port matches with expected TDO.
- */
-
- if (g_usDataType & TDO_DATA) {
- /* 08/28/08 NN Added Calculate checksum support. */
- if (g_usCalculateChecksum) {
- if (cCurBit == 0x01)
- g_usChecksum +=
- (1 << (g_uiChecksumIndex % 8));
- g_uiChecksumIndex++;
- } else {
- if ((((cMaskByte << cByteIndex) & 0x80)
- ? 0x01 : 0x00)) {
- if (cCurBit != (unsigned char)
- (((cDataByte << cByteIndex) & 0x80)
- ? 0x01 : 0x00)) {
- usErrorCount++;
- }
- }
- }
- }
-
- /*
- * Write TDI data to the port.
- */
-
- writePort(g_ucPinTDI,
- (unsigned char)(((cInDataByte << cByteIndex) & 0x80)
- ? 0x01 : 0x00));
-
- if (usDataSizeIndex < usLastBitIndex) {
-
- /*
- * Clock data out from the data shift register.
- */
-
- sclock();
- } else if (g_usFlowControl & CASCADE) {
-
- /*
- * Clock in last bit for the first N - 1 cascaded frames
- */
-
- sclock();
- }
-
- /*
- * Increment the byte index. If it exceeds 7, then reset it back
- * to zero.
- */
-
- cByteIndex++;
- if (cByteIndex >= 8) {
- if (ucDisplayFlag) {
-
- /*
- * Store displayed data in the TDO buffer. By reusing
- * the TDO buffer to store displayed data, there is no
- * need to allocate a buffer simply to hold display
- * data. This will not cause any false verification
- * errors because the true TDO byte has already
- * been consumed.
- */
-
- g_pucOutData[usBufferIndex - 1] = ucDisplayByte;
- ucDisplayByte = 0;
- }
-
- cByteIndex = 0;
- }
- /* 09/12/07 Nguyen changed to display the 1 bit expected data */
- else if (a_usiDataSize == 1) {
- if (ucDisplayFlag) {
-
- /*
- * Store displayed data in the TDO buffer.
- * By reusing the TDO buffer to store displayed
- * data, there is no need to allocate
- * a buffer simply to hold display data. This
- * will not cause any false verification errors
- * because the true TDO byte has already
- * been consumed.
- */
-
- /*
- * Flip ucDisplayByte and store it in cDataByte.
- */
- cDataByte = 0x00;
- for (usBufferIndex = 0; usBufferIndex < 8;
- usBufferIndex++) {
- cDataByte <<= 1;
- if (ucDisplayByte & 0x01) {
- cDataByte |= 0x01;
- }
- ucDisplayByte >>= 1;
- }
- g_pucOutData[0] = cDataByte;
- ucDisplayByte = 0;
- }
-
- cByteIndex = 0;
- }
- }
-
- if (ucDisplayFlag) {
-
-#ifdef DEBUG
- debug("RECEIVED TDO (");
-#else
- vme_out_string("Display Data: 0x");
-#endif /* DEBUG */
-
- /* 09/11/07 NN Type cast mismatch variables */
- for (usDataSizeIndex = (unsigned short)
- ((a_usiDataSize + 7) / 8);
- usDataSizeIndex > 0 ; usDataSizeIndex--) {
- cMaskByte = g_pucOutData[usDataSizeIndex - 1];
- cDataByte = 0x00;
-
- /*
- * Flip cMaskByte and store it in cDataByte.
- */
-
- for (usBufferIndex = 0; usBufferIndex < 8;
- usBufferIndex++) {
- cDataByte <<= 1;
- if (cMaskByte & 0x01) {
- cDataByte |= 0x01;
- }
- cMaskByte >>= 1;
- }
-#ifdef DEBUG
- printf("%.2X", cDataByte);
- if ((((a_usiDataSize + 7) / 8) - usDataSizeIndex)
- % 40 == 39) {
- printf("\n\t\t");
- }
-#else
- vme_out_hex(cDataByte);
-#endif /* DEBUG */
- }
-
-#ifdef DEBUG
- printf(")\n\n");
-#else
- vme_out_string("\n\n");
-#endif /* DEBUG */
- /* 09/02/08 Nguyen changed to display the data Checksum */
- if (g_usChecksum != 0) {
- g_usChecksum &= 0xFFFF;
- sprintf(StrChecksum, "Data Checksum: %.4lX\n\n",
- g_usChecksum);
- vme_out_string(StrChecksum);
- g_usChecksum = 0;
- }
- }
-
- if (usErrorCount > 0) {
- if (g_usFlowControl & VERIFYUES) {
- vme_out_string(
- "USERCODE verification failed. "
- "Continue programming......\n\n");
- g_usFlowControl &= ~(VERIFYUES);
- return 0;
- } else {
-
-#ifdef DEBUG
- printf("TOTAL ERRORS: %d\n", usErrorCount);
-#endif /* DEBUG */
-
- return VME_VERIFICATION_FAILURE;
- }
- } else {
- if (g_usFlowControl & VERIFYUES) {
- vme_out_string("USERCODE verification passed. "
- "Programming aborted.\n\n");
- g_usFlowControl &= ~(VERIFYUES);
- return 1;
- } else {
- return 0;
- }
- }
-}
-
-/*
- *
- * ispVMReadandSave
- *
- * Support dynamic I/O.
- *
- */
-
-signed char ispVMReadandSave(unsigned short int a_usiDataSize)
-{
- /* 09/11/07 NN added local variables initialization */
- unsigned short int usDataSizeIndex = 0;
- unsigned short int usLastBitIndex = 0;
- unsigned short int usBufferIndex = 0;
- unsigned short int usOutBitIndex = 0;
- unsigned short int usLVDSIndex = 0;
- unsigned char cDataByte = 0;
- unsigned char cDMASKByte = 0;
- unsigned char cInDataByte = 0;
- unsigned char cCurBit = 0;
- unsigned char cByteIndex = 0;
- signed char cLVDSByteIndex = 0;
-
- /* 09/11/07 NN Type cast mismatch variables */
- usLastBitIndex = (unsigned short) (a_usiDataSize - 1);
-
- /*
- *
- * Iterate through the data bits.
- *
- */
-
- for (usDataSizeIndex = 0; usDataSizeIndex < a_usiDataSize;
- usDataSizeIndex++) {
- if (cByteIndex == 0) {
-
- /*
- * Grab byte from DMASK buffer.
- */
-
- if (g_usDataType & DMASK_DATA) {
- cDMASKByte = g_pucOutDMaskData[usBufferIndex];
- } else {
- cDMASKByte = 0x00;
- }
-
- /*
- * Grab byte from TDI buffer.
- */
-
- if (g_usDataType & TDI_DATA) {
- cInDataByte = g_pucInData[usBufferIndex];
- }
-
- usBufferIndex++;
- }
-
- cCurBit = readPort();
- cDataByte = (unsigned char)(((cInDataByte << cByteIndex) & 0x80)
- ? 0x01 : 0x00);
-
- /*
- * Initialize the byte to be zero.
- */
-
- if (usOutBitIndex % 8 == 0) {
- g_pucOutData[usOutBitIndex / 8] = 0x00;
- }
-
- /*
- * Use TDI, DMASK, and device TDO to create new TDI (actually
- * stored in g_pucOutData).
- */
-
- if ((((cDMASKByte << cByteIndex) & 0x80) ? 0x01 : 0x00)) {
-
- if (g_pLVDSList) {
- for (usLVDSIndex = 0;
- usLVDSIndex < g_usLVDSPairCount;
- usLVDSIndex++) {
- if (g_pLVDSList[usLVDSIndex].
- usNegativeIndex ==
- usDataSizeIndex) {
- g_pLVDSList[usLVDSIndex].
- ucUpdate = 0x01;
- break;
- }
- }
- }
-
- /*
- * DMASK bit is 1, use TDI.
- */
-
- g_pucOutData[usOutBitIndex / 8] |= (unsigned char)
- (((cDataByte & 0x1) ? 0x01 : 0x00) <<
- (7 - usOutBitIndex % 8));
- } else {
-
- /*
- * DMASK bit is 0, use device TDO.
- */
-
- g_pucOutData[usOutBitIndex / 8] |= (unsigned char)
- (((cCurBit & 0x1) ? 0x01 : 0x00) <<
- (7 - usOutBitIndex % 8));
- }
-
- /*
- * Shift in TDI in order to get TDO out.
- */
-
- usOutBitIndex++;
- writePort(g_ucPinTDI, cDataByte);
- if (usDataSizeIndex < usLastBitIndex) {
- sclock();
- }
-
- /*
- * Increment the byte index. If it exceeds 7, then reset it back
- * to zero.
- */
-
- cByteIndex++;
- if (cByteIndex >= 8) {
- cByteIndex = 0;
- }
- }
-
- /*
- * If g_pLVDSList exists and pairs need updating, then update
- * the negative-pair to receive the flipped positive-pair value.
- */
-
- if (g_pLVDSList) {
- for (usLVDSIndex = 0; usLVDSIndex < g_usLVDSPairCount;
- usLVDSIndex++) {
- if (g_pLVDSList[usLVDSIndex].ucUpdate) {
-
- /*
- * Read the positive value and flip it.
- */
-
- cDataByte = (unsigned char)
- (((g_pucOutData[g_pLVDSList[usLVDSIndex].
- usPositiveIndex / 8]
- << (g_pLVDSList[usLVDSIndex].
- usPositiveIndex % 8)) & 0x80) ?
- 0x01 : 0x00);
- /* 09/11/07 NN Type cast mismatch variables */
- cDataByte = (unsigned char) (!cDataByte);
-
- /*
- * Get the byte that needs modification.
- */
-
- cInDataByte =
- g_pucOutData[g_pLVDSList[usLVDSIndex].
- usNegativeIndex / 8];
-
- if (cDataByte) {
-
- /*
- * Copy over the current byte and
- * set the negative bit to 1.
- */
-
- cDataByte = 0x00;
- for (cLVDSByteIndex = 7;
- cLVDSByteIndex >= 0;
- cLVDSByteIndex--) {
- cDataByte <<= 1;
- if (7 -
- (g_pLVDSList[usLVDSIndex].
- usNegativeIndex % 8) ==
- cLVDSByteIndex) {
-
- /*
- * Set negative bit to 1
- */
-
- cDataByte |= 0x01;
- } else if (cInDataByte & 0x80) {
- cDataByte |= 0x01;
- }
-
- cInDataByte <<= 1;
- }
-
- /*
- * Store the modified byte.
- */
-
- g_pucOutData[g_pLVDSList[usLVDSIndex].
- usNegativeIndex / 8] = cDataByte;
- } else {
-
- /*
- * Copy over the current byte and set
- * the negative bit to 0.
- */
-
- cDataByte = 0x00;
- for (cLVDSByteIndex = 7;
- cLVDSByteIndex >= 0;
- cLVDSByteIndex--) {
- cDataByte <<= 1;
- if (7 -
- (g_pLVDSList[usLVDSIndex].
- usNegativeIndex % 8) ==
- cLVDSByteIndex) {
-
- /*
- * Set negative bit to 0
- */
-
- cDataByte |= 0x00;
- } else if (cInDataByte & 0x80) {
- cDataByte |= 0x01;
- }
-
- cInDataByte <<= 1;
- }
-
- /*
- * Store the modified byte.
- */
-
- g_pucOutData[g_pLVDSList[usLVDSIndex].
- usNegativeIndex / 8] = cDataByte;
- }
-
- break;
- }
- }
- }
-
- return 0;
-}
-
-signed char ispVMProcessLVDS(unsigned short a_usLVDSCount)
-{
- unsigned short usLVDSIndex = 0;
-
- /*
- * Allocate memory to hold LVDS pairs.
- */
-
- ispVMMemManager(LVDS, a_usLVDSCount);
- g_usLVDSPairCount = a_usLVDSCount;
-
-#ifdef DEBUG
- printf("LVDS %d (", a_usLVDSCount);
-#endif /* DEBUG */
-
- /*
- * Iterate through each given LVDS pair.
- */
-
- for (usLVDSIndex = 0; usLVDSIndex < g_usLVDSPairCount; usLVDSIndex++) {
-
- /*
- * Assign the positive and negative indices of the LVDS pair.
- */
-
- /* 09/11/07 NN Type cast mismatch variables */
- g_pLVDSList[usLVDSIndex].usPositiveIndex =
- (unsigned short) ispVMDataSize();
- /* 09/11/07 NN Type cast mismatch variables */
- g_pLVDSList[usLVDSIndex].usNegativeIndex =
- (unsigned short)ispVMDataSize();
-
-#ifdef DEBUG
- if (usLVDSIndex < g_usLVDSPairCount - 1) {
- printf("%d:%d, ",
- g_pLVDSList[usLVDSIndex].usPositiveIndex,
- g_pLVDSList[usLVDSIndex].usNegativeIndex);
- } else {
- printf("%d:%d",
- g_pLVDSList[usLVDSIndex].usPositiveIndex,
- g_pLVDSList[usLVDSIndex].usNegativeIndex);
- }
-#endif /* DEBUG */
-
- }
-
-#ifdef DEBUG
- printf(");\n");
-#endif /* DEBUG */
-
- return 0;
-}
diff --git a/drivers/fpga/lattice.c b/drivers/fpga/lattice.c
deleted file mode 100644
index 29cf2f60974..00000000000
--- a/drivers/fpga/lattice.c
+++ /dev/null
@@ -1,379 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0+
-/*
- * (C) Copyright 2010
- * Stefano Babic, DENX Software Engineering, sbabic@denx.de.
- *
- * (C) Copyright 2002
- * Rich Ireland, Enterasys Networks, rireland@enterasys.com.
- *
- * ispVM functions adapted from Lattice's ispmVMEmbedded code:
- * Copyright 2009 Lattice Semiconductor Corp.
- */
-
-#include <log.h>
-#include <malloc.h>
-#include <fpga.h>
-#include <lattice.h>
-#include <linux/delay.h>
-
-static lattice_board_specific_func *pfns;
-static const char *fpga_image;
-static unsigned long read_bytes;
-static unsigned long bufsize;
-static unsigned short expectedCRC;
-
-/*
- * External variables and functions declared in ivm_core.c module.
- */
-extern unsigned short g_usCalculatedCRC;
-extern unsigned short g_usDataType;
-extern unsigned char *g_pucIntelBuffer;
-extern unsigned char *g_pucHeapMemory;
-extern unsigned short g_iHeapCounter;
-extern unsigned short g_iHEAPSize;
-extern unsigned short g_usIntelDataIndex;
-extern unsigned short g_usIntelBufferSize;
-extern char *const g_szSupportedVersions[];
-
-/*
- * ispVMDelay
- *
- * Users must implement a delay to observe a_usTimeDelay, where
- * bit 15 of the a_usTimeDelay defines the unit.
- * 1 = milliseconds
- * 0 = microseconds
- * Example:
- * a_usTimeDelay = 0x0001 = 1 microsecond delay.
- * a_usTimeDelay = 0x8001 = 1 millisecond delay.
- *
- * This subroutine is called upon to provide a delay from 1 millisecond to a few
- * hundreds milliseconds each time.
- * It is understood that due to a_usTimeDelay is defined as unsigned short, a 16
- * bits integer, this function is restricted to produce a delay to 64000
- * micro-seconds or 32000 milli-second maximum. The VME file will never pass on
- * to this function a delay time > those maximum number. If it needs more than
- * those maximum, the VME file will launch the delay function several times to
- * realize a larger delay time cummulatively.
- * It is perfectly alright to provide a longer delay than required. It is not
- * acceptable if the delay is shorter.
- */
-void ispVMDelay(unsigned short delay)
-{
- if (delay & 0x8000)
- delay = (delay & ~0x8000) * 1000;
- udelay(delay);
-}
-
-void writePort(unsigned char a_ucPins, unsigned char a_ucValue)
-{
- a_ucValue = a_ucValue ? 1 : 0;
-
- switch (a_ucPins) {
- case g_ucPinTDI:
- pfns->jtag_set_tdi(a_ucValue);
- break;
- case g_ucPinTCK:
- pfns->jtag_set_tck(a_ucValue);
- break;
- case g_ucPinTMS:
- pfns->jtag_set_tms(a_ucValue);
- break;
- default:
- printf("%s: requested unknown pin\n", __func__);
- }
-}
-
-unsigned char readPort(void)
-{
- return pfns->jtag_get_tdo();
-}
-
-void sclock(void)
-{
- writePort(g_ucPinTCK, 0x01);
- writePort(g_ucPinTCK, 0x00);
-}
-
-void calibration(void)
-{
- /* Apply 2 pulses to TCK. */
- writePort(g_ucPinTCK, 0x00);
- writePort(g_ucPinTCK, 0x01);
- writePort(g_ucPinTCK, 0x00);
- writePort(g_ucPinTCK, 0x01);
- writePort(g_ucPinTCK, 0x00);
-
- ispVMDelay(0x8001);
-
- /* Apply 2 pulses to TCK. */
- writePort(g_ucPinTCK, 0x01);
- writePort(g_ucPinTCK, 0x00);
- writePort(g_ucPinTCK, 0x01);
- writePort(g_ucPinTCK, 0x00);
-}
-
-/*
- * GetByte
- *
- * Returns a byte to the caller. The returned byte depends on the
- * g_usDataType register. If the HEAP_IN bit is set, then the byte
- * is returned from the HEAP. If the LHEAP_IN bit is set, then
- * the byte is returned from the intelligent buffer. Otherwise,
- * the byte is returned directly from the VME file.
- */
-unsigned char GetByte(void)
-{
- unsigned char ucData;
- unsigned int block_size = 4 * 1024;
-
- if (g_usDataType & HEAP_IN) {
-
- /*
- * Get data from repeat buffer.
- */
-
- if (g_iHeapCounter > g_iHEAPSize) {
-
- /*
- * Data over-run.
- */
-
- return 0xFF;
- }
-
- ucData = g_pucHeapMemory[g_iHeapCounter++];
- } else if (g_usDataType & LHEAP_IN) {
-
- /*
- * Get data from intel buffer.
- */
-
- if (g_usIntelDataIndex >= g_usIntelBufferSize) {
- return 0xFF;
- }
-
- ucData = g_pucIntelBuffer[g_usIntelDataIndex++];
- } else {
- if (read_bytes == bufsize) {
- return 0xFF;
- }
- ucData = *fpga_image++;
- read_bytes++;
-
- if (!(read_bytes % block_size)) {
- printf("Downloading FPGA %ld/%ld completed\r",
- read_bytes,
- bufsize);
- }
-
- if (expectedCRC != 0) {
- ispVMCalculateCRC32(ucData);
- }
- }
-
- return ucData;
-}
-
-signed char ispVM(void)
-{
- char szFileVersion[9] = { 0 };
- signed char cRetCode = 0;
- signed char cIndex = 0;
- signed char cVersionIndex = 0;
- unsigned char ucReadByte = 0;
- unsigned short crc;
-
- g_pucHeapMemory = NULL;
- g_iHeapCounter = 0;
- g_iHEAPSize = 0;
- g_usIntelDataIndex = 0;
- g_usIntelBufferSize = 0;
- g_usCalculatedCRC = 0;
- expectedCRC = 0;
- ucReadByte = GetByte();
- switch (ucReadByte) {
- case FILE_CRC:
- crc = (unsigned char)GetByte();
- crc <<= 8;
- crc |= GetByte();
- expectedCRC = crc;
-
- for (cIndex = 0; cIndex < 8; cIndex++)
- szFileVersion[cIndex] = GetByte();
-
- break;
- default:
- szFileVersion[0] = (signed char) ucReadByte;
- for (cIndex = 1; cIndex < 8; cIndex++)
- szFileVersion[cIndex] = GetByte();
-
- break;
- }
-
- /*
- *
- * Compare the VME file version against the supported version.
- *
- */
-
- for (cVersionIndex = 0; g_szSupportedVersions[cVersionIndex] != 0;
- cVersionIndex++) {
- for (cIndex = 0; cIndex < 8; cIndex++) {
- if (szFileVersion[cIndex] !=
- g_szSupportedVersions[cVersionIndex][cIndex]) {
- cRetCode = VME_VERSION_FAILURE;
- break;
- }
- cRetCode = 0;
- }
-
- if (cRetCode == 0) {
- break;
- }
- }
-
- if (cRetCode < 0) {
- return VME_VERSION_FAILURE;
- }
-
- printf("VME file checked: starting downloading to FPGA\n");
-
- ispVMStart();
-
- cRetCode = ispVMCode();
-
- ispVMEnd();
- ispVMFreeMem();
- puts("\n");
-
- if (cRetCode == 0 && expectedCRC != 0 &&
- (expectedCRC != g_usCalculatedCRC)) {
- printf("Expected CRC: 0x%.4X\n", expectedCRC);
- printf("Calculated CRC: 0x%.4X\n", g_usCalculatedCRC);
- return VME_CRC_FAILURE;
- }
- return cRetCode;
-}
-
-static int lattice_validate(Lattice_desc *desc, const char *fn)
-{
- int ret_val = false;
-
- if (desc) {
- if ((desc->family > min_lattice_type) &&
- (desc->family < max_lattice_type)) {
- if ((desc->iface > min_lattice_iface_type) &&
- (desc->iface < max_lattice_iface_type)) {
- if (desc->size) {
- ret_val = true;
- } else {
- printf("%s: NULL part size\n", fn);
- }
- } else {
- printf("%s: Invalid Interface type, %d\n",
- fn, desc->iface);
- }
- } else {
- printf("%s: Invalid family type, %d\n",
- fn, desc->family);
- }
- } else {
- printf("%s: NULL descriptor!\n", fn);
- }
-
- return ret_val;
-}
-
-int lattice_load(Lattice_desc *desc, const void *buf, size_t bsize)
-{
- int ret_val = FPGA_FAIL;
-
- if (!lattice_validate(desc, (char *)__func__)) {
- printf("%s: Invalid device descriptor\n", __func__);
- } else {
- pfns = desc->iface_fns;
-
- switch (desc->family) {
- case Lattice_XP2:
- fpga_image = buf;
- read_bytes = 0;
- bufsize = bsize;
- debug("%s: Launching the Lattice ISPVME Loader:"
- " addr %p size 0x%lx...\n",
- __func__, fpga_image, bufsize);
- ret_val = ispVM();
- if (ret_val)
- printf("%s: error %d downloading FPGA image\n",
- __func__, ret_val);
- else
- puts("FPGA downloaded successfully\n");
- break;
- default:
- printf("%s: Unsupported family type, %d\n",
- __func__, desc->family);
- }
- }
-
- return ret_val;
-}
-
-int lattice_dump(Lattice_desc *desc, const void *buf, size_t bsize)
-{
- puts("Dump not supported for Lattice FPGA\n");
-
- return FPGA_FAIL;
-
-}
-
-int lattice_info(Lattice_desc *desc)
-{
- int ret_val = FPGA_FAIL;
-
- if (lattice_validate(desc, (char *)__func__)) {
- printf("Family: \t");
- switch (desc->family) {
- case Lattice_XP2:
- puts("XP2\n");
- break;
- /* Add new family types here */
- default:
- printf("Unknown family type, %d\n", desc->family);
- }
-
- puts("Interface type:\t");
- switch (desc->iface) {
- case lattice_jtag_mode:
- puts("JTAG Mode\n");
- break;
- /* Add new interface types here */
- default:
- printf("Unsupported interface type, %d\n", desc->iface);
- }
-
- printf("Device Size: \t%zu bytes\n",
- desc->size);
-
- if (desc->iface_fns) {
- printf("Device Function Table @ 0x%p\n",
- desc->iface_fns);
- switch (desc->family) {
- case Lattice_XP2:
- break;
- /* Add new family types here */
- default:
- break;
- }
- } else {
- puts("No Device Function Table.\n");
- }
-
- if (desc->desc)
- printf("Model: \t%s\n", desc->desc);
-
- ret_val = FPGA_SUCCESS;
- } else {
- printf("%s: Invalid device descriptor\n", __func__);
- }
-
- return ret_val;
-}
diff --git a/drivers/fpga/xilinx.c b/drivers/fpga/xilinx.c
index 28c68faba55..25b348648ef 100644
--- a/drivers/fpga/xilinx.c
+++ b/drivers/fpga/xilinx.c
@@ -50,6 +50,9 @@ int fpga_loadbitstream(int devnum, char *fpgadata, size_t size,
dataptr = (unsigned char *)fpgadata;
/* Find out fpga_description */
desc = fpga_validate(devnum, dataptr, 0);
+ if (!desc)
+ return FPGA_FAIL;
+
/* Assign xilinx device description */
xdesc = desc->devdesc;
diff --git a/drivers/mailbox/zynqmp-ipi.c b/drivers/mailbox/zynqmp-ipi.c
index 851aa737c03..f62277385fb 100644
--- a/drivers/mailbox/zynqmp-ipi.c
+++ b/drivers/mailbox/zynqmp-ipi.c
@@ -188,7 +188,7 @@ static int zynqmp_ipi_dest_probe(struct udevice *dev)
return -EINVAL;
};
zynqmp->local_req_regs = devm_ioremap(dev, res.start,
- (res.start - res.end));
+ resource_size(&res));
if (!zynqmp->local_req_regs)
return -EINVAL;
@@ -197,7 +197,7 @@ static int zynqmp_ipi_dest_probe(struct udevice *dev)
return -EINVAL;
};
zynqmp->local_res_regs = devm_ioremap(dev, res.start,
- (res.start - res.end));
+ resource_size(&res));
if (!zynqmp->local_res_regs)
return -EINVAL;
@@ -206,7 +206,7 @@ static int zynqmp_ipi_dest_probe(struct udevice *dev)
return -EINVAL;
};
zynqmp->remote_req_regs = devm_ioremap(dev, res.start,
- (res.start - res.end));
+ resource_size(&res));
if (!zynqmp->remote_req_regs)
return -EINVAL;
@@ -215,7 +215,7 @@ static int zynqmp_ipi_dest_probe(struct udevice *dev)
return -EINVAL;
};
zynqmp->remote_res_regs = devm_ioremap(dev, res.start,
- (res.start - res.end));
+ resource_size(&res));
if (!zynqmp->remote_res_regs)
return -EINVAL;
diff --git a/drivers/mfd/atmel-smc.c b/drivers/mfd/atmel-smc.c
index 15296f71a16..94e5e7b67a0 100644
--- a/drivers/mfd/atmel-smc.c
+++ b/drivers/mfd/atmel-smc.c
@@ -347,7 +347,7 @@ const struct atmel_hsmc_reg_layout *
atmel_hsmc_get_reg_layout(ofnode np)
{
int i;
- const struct udevice_id *match;
+ const struct udevice_id *match = NULL;
const char *name;
int len;
diff --git a/drivers/mmc/gen_atmel_mci.c b/drivers/mmc/gen_atmel_mci.c
index 6a531fa0961..838b4f4a65a 100644
--- a/drivers/mmc/gen_atmel_mci.c
+++ b/drivers/mmc/gen_atmel_mci.c
@@ -206,10 +206,9 @@ static u32 mci_data_read(atmel_mci_t *mci, u32* data, u32 error_flags)
goto io_fail;
} while (!(status & MMCI_BIT(RXRDY)));
- if (status & MMCI_BIT(RXRDY)) {
- *data = readl(&mci->rdr);
- status = 0;
- }
+ *data = readl(&mci->rdr);
+ status = 0;
+
io_fail:
return status;
}
@@ -225,10 +224,9 @@ static u32 mci_data_write(atmel_mci_t *mci, u32* data, u32 error_flags)
goto io_fail;
} while (!(status & MMCI_BIT(TXRDY)));
- if (status & MMCI_BIT(TXRDY)) {
- writel(*data, &mci->tdr);
- status = 0;
- }
+ writel(*data, &mci->tdr);
+ status = 0;
+
io_fail:
return status;
}
@@ -265,13 +263,15 @@ mci_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
/* Figure out the transfer arguments */
cmdr = mci_encode_cmd(cmd, data, &error_flags);
- mci_set_blklen(mci, data->blocksize);
+ if (data) {
+ mci_set_blklen(mci, data->blocksize);
- /* For multi blocks read/write, set the block register */
- if ((cmd->cmdidx == MMC_CMD_READ_MULTIPLE_BLOCK)
- || (cmd->cmdidx == MMC_CMD_WRITE_MULTIPLE_BLOCK))
- writel(data->blocks | MMCI_BF(BLKLEN, data->blocksize),
- &mci->blkr);
+ /* For multi blocks read/write, set the block register */
+ if (cmd->cmdidx == MMC_CMD_READ_MULTIPLE_BLOCK ||
+ cmd->cmdidx == MMC_CMD_WRITE_MULTIPLE_BLOCK)
+ writel(data->blocks | MMCI_BF(BLKLEN, data->blocksize),
+ &mci->blkr);
+ }
/* Send the command */
writel(cmd->cmdarg, &mci->argr);
diff --git a/drivers/mmc/rockchip_sdhci.c b/drivers/mmc/rockchip_sdhci.c
index 761e3619329..5e025d76a82 100644
--- a/drivers/mmc/rockchip_sdhci.c
+++ b/drivers/mmc/rockchip_sdhci.c
@@ -500,7 +500,7 @@ static int rockchip_sdhci_execute_tuning(struct mmc *mmc, u8 opcode)
{
struct rockchip_sdhc *priv = dev_get_priv(mmc->dev);
struct sdhci_host *host = &priv->host;
- char tuning_loop_counter = SDHCI_TUNING_LOOP_COUNT;
+ s8 tuning_loop_counter = SDHCI_TUNING_LOOP_COUNT;
struct mmc_cmd cmd;
u32 ctrl, blk_size;
int ret;
diff --git a/drivers/mmc/stm32_sdmmc2.c b/drivers/mmc/stm32_sdmmc2.c
index 9483fb57daf..122690aef3e 100644
--- a/drivers/mmc/stm32_sdmmc2.c
+++ b/drivers/mmc/stm32_sdmmc2.c
@@ -385,15 +385,29 @@ static int stm32_sdmmc2_end_data(struct udevice *dev,
u32 mask = SDMMC_STA_DCRCFAIL | SDMMC_STA_DTIMEOUT |
SDMMC_STA_IDMATE | SDMMC_STA_DATAEND;
u32 status;
+ unsigned long timeout_msecs = ctx->data_length >> 8;
+ unsigned long start_timeout;
+
+ /* At least, a timeout of 2 seconds is set */
+ if (timeout_msecs < 2000)
+ timeout_msecs = 2000;
if (data->flags & MMC_DATA_READ)
mask |= SDMMC_STA_RXOVERR;
else
mask |= SDMMC_STA_TXUNDERR;
+ start_timeout = get_timer(0);
status = readl(plat->base + SDMMC_STA);
- while (!(status & mask))
+ while (!(status & mask)) {
+ if (get_timer(start_timeout) > timeout_msecs) {
+ ctx->dpsm_abort = true;
+ return -ETIMEDOUT;
+ }
+
+ schedule();
status = readl(plat->base + SDMMC_STA);
+ }
/*
* Need invalidate the dcache again to avoid any
diff --git a/drivers/mtd/nand/core.c b/drivers/mtd/nand/core.c
index 472ad0bdefb..01ff6e3befa 100644
--- a/drivers/mtd/nand/core.c
+++ b/drivers/mtd/nand/core.c
@@ -201,8 +201,8 @@ EXPORT_SYMBOL_GPL(nanddev_mtd_erase);
int nanddev_init(struct nand_device *nand, const struct nand_ops *ops,
struct module *owner)
{
- struct mtd_info *mtd = nanddev_to_mtd(nand);
- struct nand_memory_organization *memorg = nanddev_get_memorg(nand);
+ struct mtd_info *mtd;
+ struct nand_memory_organization *memorg;
if (!nand || !ops)
return -EINVAL;
@@ -210,6 +210,9 @@ int nanddev_init(struct nand_device *nand, const struct nand_ops *ops,
if (!ops->erase || !ops->markbad || !ops->isbad)
return -EINVAL;
+ mtd = nanddev_to_mtd(nand);
+ memorg = nanddev_get_memorg(nand);
+
if (!memorg->bits_per_cell || !memorg->pagesize ||
!memorg->pages_per_eraseblock || !memorg->eraseblocks_per_lun ||
!memorg->planes_per_lun || !memorg->luns_per_target ||
diff --git a/drivers/mtd/nand/raw/cadence_nand.c b/drivers/mtd/nand/raw/cadence_nand.c
index 27aa7f97a45..4771440d1de 100644
--- a/drivers/mtd/nand/raw/cadence_nand.c
+++ b/drivers/mtd/nand/raw/cadence_nand.c
@@ -2196,7 +2196,7 @@ static int cadence_nand_chip_init(struct cadence_nand_info *cadence, ofnode node
chip->controller = &cadence->controller;
nand_set_flash_node(chip, node);
mtd = nand_to_mtd(chip);
- mtd->dev->parent = cadence->dev;
+ mtd->dev = cadence->dev;
chip->options |= NAND_BUSWIDTH_AUTO;
chip->select_chip = cadence_nand_select_chip;
diff --git a/drivers/mtd/nand/raw/stm32_fmc2_nand.c b/drivers/mtd/nand/raw/stm32_fmc2_nand.c
index d1c88643c98..21e3c88a55a 100644
--- a/drivers/mtd/nand/raw/stm32_fmc2_nand.c
+++ b/drivers/mtd/nand/raw/stm32_fmc2_nand.c
@@ -1034,6 +1034,7 @@ static int stm32_fmc2_nfc_probe(struct udevice *dev)
ecclayout->eccpos[i] = oob_index;
ecclayout->oobfree->offset = oob_index;
ecclayout->oobfree->length = mtd->oobsize - ecclayout->oobfree->offset;
+ ecclayout->oobavail = ecclayout->oobfree->length;
chip->ecc.layout = ecclayout;
if (chip->options & NAND_BUSWIDTH_16)
diff --git a/drivers/net/MAINTAINERS b/drivers/net/MAINTAINERS
new file mode 100644
index 00000000000..fd002295d0c
--- /dev/null
+++ b/drivers/net/MAINTAINERS
@@ -0,0 +1,6 @@
+NETWORK DW XGMAC
+M: Boon Khai Ng <boon.khai.ng@altera.com>
+S: Supported
+F: drivers/net/dwc_eth_xgmac.c
+F: drivers/net/dwc_eth_xgmac.h
+F: drivers/net/dwc_eth_xgmac_socfpga.c
diff --git a/drivers/net/cortina_ni.c b/drivers/net/cortina_ni.c
index 79026882800..21b7089176c 100644
--- a/drivers/net/cortina_ni.c
+++ b/drivers/net/cortina_ni.c
@@ -499,7 +499,7 @@ static int ca_phy_probe(struct udevice *dev)
dev, priv->phy_interface);
if (ext_phydev) {
ext_phydev->supported &= PHY_GBIT_FEATURES;
- ext_phydev->advertising = int_phydev->supported;
+ ext_phydev->advertising = ext_phydev->supported;
phy_config(ext_phydev);
} else {
printf("CA NI %s: There is no external phy device\n", __func__);
diff --git a/drivers/net/designware.c b/drivers/net/designware.c
index fce3ef910cb..7ecedc3d7f0 100644
--- a/drivers/net/designware.c
+++ b/drivers/net/designware.c
@@ -486,7 +486,7 @@ static int dw_adjust_link(struct dw_eth_dev *priv, struct eth_mac_regs *mac_p,
#ifdef CONFIG_ARCH_NPCM8XX
if (phydev->interface == PHY_INTERFACE_MODE_SGMII) {
- unsigned int start;
+ ulong start;
/* Indirect access to VR_MII_MMD registers */
writew((VR_MII_MMD >> 9), PCS_BA + PCS_IND_AC);
@@ -532,7 +532,7 @@ int designware_eth_init(struct dw_eth_dev *priv, u8 *enetaddr)
{
struct eth_mac_regs *mac_p = priv->mac_regs_p;
struct eth_dma_regs *dma_p = priv->dma_regs_p;
- unsigned int start;
+ ulong start;
int ret;
writel(readl(&dma_p->busmode) | DMAMAC_SRST, &dma_p->busmode);
diff --git a/drivers/net/ks8851_mll.c b/drivers/net/ks8851_mll.c
index cc2e826257a..2c956154d09 100644
--- a/drivers/net/ks8851_mll.c
+++ b/drivers/net/ks8851_mll.c
@@ -347,11 +347,6 @@ static int ks8851_mll_detect_chip(struct ks_net *ks)
debug("Read back KS8851 id 0x%x\n", val);
- if ((val & 0xfff0) != CIDER_ID) {
- printf(DRIVERNAME ": Unknown chip ID %04x\n", val);
- return -1;
- }
-
return 0;
}
diff --git a/drivers/net/ldpaa_eth/ldpaa_eth.c b/drivers/net/ldpaa_eth/ldpaa_eth.c
index b72198ca530..94e62748239 100644
--- a/drivers/net/ldpaa_eth/ldpaa_eth.c
+++ b/drivers/net/ldpaa_eth/ldpaa_eth.c
@@ -458,7 +458,7 @@ static int ldpaa_eth_open(struct udevice *dev)
link_state.up == 1 ? printf("up\n") : printf("error state\n");
#endif
- memset(&d_queue, 0, sizeof(struct dpni_queue));
+ memset(&d_queue, 0, sizeof(struct dpni_queue_id));
err = dpni_get_queue(dflt_mc_io, MC_CMD_NO_FLAGS,
dflt_dpni->dpni_handle, DPNI_QUEUE_RX,
0, 0, &d_queue_cfg, &d_queue);
diff --git a/drivers/net/mtk_eth/mtk_eth.c b/drivers/net/mtk_eth/mtk_eth.c
index 5d6a42bceb4..b172838ba3a 100644
--- a/drivers/net/mtk_eth/mtk_eth.c
+++ b/drivers/net/mtk_eth/mtk_eth.c
@@ -1461,7 +1461,7 @@ static int mtk_eth_of_to_plat(struct udevice *dev)
priv->phy_addr = ofnode_read_s32_default(args.node, "reg", -1);
if (priv->phy_addr < 0) {
printf("error: phy address is not specified\n");
- return ret;
+ return priv->phy_addr;
}
}
diff --git a/drivers/net/mv88e6xxx.c b/drivers/net/mv88e6xxx.c
index 557b6b2c8f6..f06c73c20f8 100644
--- a/drivers/net/mv88e6xxx.c
+++ b/drivers/net/mv88e6xxx.c
@@ -631,7 +631,7 @@ static int mv88e6xxx_port_enable(struct udevice *dev, int port, struct phy_devic
dev_dbg(dev, "configure internal RGMII delays\n");
/* RGMII delays */
- val &= ~(PORT_REG_PHYS_CTRL_RGMII_DELAY_RXCLK ||
+ val &= ~(PORT_REG_PHYS_CTRL_RGMII_DELAY_RXCLK |
PORT_REG_PHYS_CTRL_RGMII_DELAY_TXCLK);
if (phy->interface == PHY_INTERFACE_MODE_RGMII_ID ||
phy->interface == PHY_INTERFACE_MODE_RGMII_RXID)
diff --git a/drivers/net/mvpp2.c b/drivers/net/mvpp2.c
index 184c1f9a46a..f9e979c4d58 100644
--- a/drivers/net/mvpp2.c
+++ b/drivers/net/mvpp2.c
@@ -1722,8 +1722,7 @@ static struct mvpp2_prs_entry *mvpp2_prs_flow_find(struct mvpp2 *priv, int flow)
}
/* Return first free tcam index, seeking from start to end */
-static int mvpp2_prs_tcam_first_free(struct mvpp2 *priv, unsigned char start,
- unsigned char end)
+static int mvpp2_prs_tcam_first_free(struct mvpp2 *priv, int start, int end)
{
int tid;
@@ -2330,7 +2329,7 @@ static int mvpp2_prs_mac_da_accept(struct mvpp2 *priv, int port,
pe = kzalloc(sizeof(*pe), GFP_KERNEL);
if (!pe)
- return -1;
+ return -ENOMEM;
mvpp2_prs_tcam_lu_set(pe, MVPP2_PRS_LU_MAC);
pe->index = tid;
@@ -4735,7 +4734,7 @@ static int phy_info_parse(struct udevice *dev, struct mvpp2_port *port)
int port_node = dev_of_offset(dev);
int phy_node;
u32 id;
- u32 phyaddr = 0;
+ int phyaddr = 0;
int fixed_link = 0;
int ret;
@@ -5354,7 +5353,7 @@ static int mvpp2_probe(struct udevice *dev)
} else {
port->gop_id = fdtdec_get_int(gd->fdt_blob, dev_of_offset(dev),
"gop-port-id", -1);
- if (port->id == -1) {
+ if (port->gop_id == -1) {
dev_err(dev, "missing gop-port-id value\n");
return -EINVAL;
}
diff --git a/drivers/net/octeontx/nicvf_main.c b/drivers/net/octeontx/nicvf_main.c
index 27d0327c88a..94e5d827614 100644
--- a/drivers/net/octeontx/nicvf_main.c
+++ b/drivers/net/octeontx/nicvf_main.c
@@ -232,7 +232,7 @@ static int nicvf_rcv_pkt_handler(struct nicvf *nic,
size_t pkt_len;
struct cqe_rx_t *cqe_rx = (struct cqe_rx_t *)cq_desc;
- int err = 0;
+ int err;
/* Check for errors */
err = nicvf_check_cqe_rx_errs(nic, cq, cq_desc);
@@ -245,8 +245,7 @@ static int nicvf_rcv_pkt_handler(struct nicvf *nic,
return -1;
}
- if (pkt)
- *ppkt = pkt;
+ *ppkt = pkt;
return pkt_len;
}
@@ -274,31 +273,29 @@ int nicvf_cq_handler(struct nicvf *nic, void **ppkt, int *pkt_len)
cqe_head >>= 9;
cqe_head &= 0xFFFF;
- if (cqe_count) {
- /* Get the CQ descriptor */
- cq_desc = (struct cqe_rx_t *)GET_CQ_DESC(cq, cqe_head);
- cqe_head++;
- cqe_head &= (cq->dmem.q_len - 1);
-
- switch (cq_desc->cqe_type) {
- case CQE_TYPE_RX:
- debug("%s: Got Rx CQE\n", nic->dev->name);
- *pkt_len = nicvf_rcv_pkt_handler(nic, cq, cq_desc,
- ppkt, CQE_TYPE_RX);
- processed_rq_cqe++;
- break;
- case CQE_TYPE_SEND:
- debug("%s: Got Tx CQE\n", nic->dev->name);
- nicvf_snd_pkt_handler(nic, cq, cq_desc, CQE_TYPE_SEND);
- processed_sq_cqe++;
- break;
- default:
- debug("%s: Got CQ type %u\n", nic->dev->name,
- cq_desc->cqe_type);
- break;
- }
- processed_cqe++;
+ /* Get the CQ descriptor */
+ cq_desc = (struct cqe_rx_t *)GET_CQ_DESC(cq, cqe_head);
+ cqe_head++;
+ cqe_head &= (cq->dmem.q_len - 1);
+
+ switch (cq_desc->cqe_type) {
+ case CQE_TYPE_RX:
+ debug("%s: Got Rx CQE\n", nic->dev->name);
+ *pkt_len = nicvf_rcv_pkt_handler(nic, cq, cq_desc,
+ ppkt, CQE_TYPE_RX);
+ processed_rq_cqe++;
+ break;
+ case CQE_TYPE_SEND:
+ debug("%s: Got Tx CQE\n", nic->dev->name);
+ nicvf_snd_pkt_handler(nic, cq, cq_desc, CQE_TYPE_SEND);
+ processed_sq_cqe++;
+ break;
+ default:
+ debug("%s: Got CQ type %u\n", nic->dev->name,
+ cq_desc->cqe_type);
+ break;
}
+ processed_cqe++;
/* Dequeue CQE */
nicvf_queue_reg_write(nic, NIC_QSET_CQ_0_7_DOOR,
diff --git a/drivers/net/octeontx/smi.c b/drivers/net/octeontx/smi.c
index 233c26f7319..217bcac2ce2 100644
--- a/drivers/net/octeontx/smi.c
+++ b/drivers/net/octeontx/smi.c
@@ -338,7 +338,8 @@ int octeontx_smi_probe(struct udevice *dev)
if (!bus || !priv) {
printf("Failed to allocate OcteonTX MDIO bus # %u\n",
dev_seq(dev));
- return -1;
+ ret = -ENOMEM;
+ goto error_ret;
}
bus->read = octeontx_phy_read;
@@ -355,9 +356,16 @@ int octeontx_smi_probe(struct udevice *dev)
ret = mdio_register(bus);
if (ret)
- return ret;
+ goto error_ret;
}
return 0;
+
+error_ret:
+ if (bus)
+ free(bus);
+ if (priv)
+ free(priv);
+ return ret;
}
static const struct udevice_id octeontx_smi_ids[] = {
diff --git a/drivers/net/octeontx2/nix.c b/drivers/net/octeontx2/nix.c
index f596b6bca87..87d1f7a5dbf 100644
--- a/drivers/net/octeontx2/nix.c
+++ b/drivers/net/octeontx2/nix.c
@@ -298,6 +298,8 @@ int nix_lf_setup(struct nix *nix)
goto error;
}
+ err = -1;
+
/* Alloc memory for Qints HW contexts */
nix->qint_base = nix_memalloc(nix_af->qints, nix_af->qint_ctx_sz,
"Qint CTX");
diff --git a/drivers/net/octeontx2/rvu_af.c b/drivers/net/octeontx2/rvu_af.c
index 0d3a9ffe9ee..7bdfbc52e3b 100644
--- a/drivers/net/octeontx2/rvu_af.c
+++ b/drivers/net/octeontx2/rvu_af.c
@@ -114,7 +114,7 @@ struct nix_af *rvu_af_init(struct rvu_af *rvu_af)
return nix_af;
error:
- if (nix_af->npa_af) {
+ if (nix_af && nix_af->npa_af) {
free(nix_af->npa_af);
memset(nix_af, 0, sizeof(*nix_af));
}
diff --git a/drivers/net/phy/broadcom.c b/drivers/net/phy/broadcom.c
index 0a49015eb89..1c02e3efedc 100644
--- a/drivers/net/phy/broadcom.c
+++ b/drivers/net/phy/broadcom.c
@@ -134,6 +134,33 @@ static void bcm_phy_write_misc(struct phy_device *phydev,
phy_write(phydev, MDIO_DEVAD_NONE, MIIM_BCM54XX_EXP_DATA, value);
}
+/* Broadcom BCM54612E */
+static int bcm54612e_config(struct phy_device *phydev)
+{
+ u32 reg = 0;
+
+ genphy_config_aneg(phydev);
+
+ phy_reset(phydev);
+
+ /* 125Mhz Clock Output Enable */
+ reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_BCM54XX_EXP_SEL);
+ reg |= 0xD34;
+ phy_write(phydev, MDIO_DEVAD_NONE, MIIM_BCM54XX_EXP_SEL, reg);
+
+ reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_BCM54XX_EXP_DATA);
+ reg |= (1 << 1);
+ phy_write(phydev, MDIO_DEVAD_NONE, MIIM_BCM54XX_EXP_DATA, reg);
+
+ reg = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_BCM54XX_EXP_SEL);
+ reg &= 0xfffff000;
+ phy_write(phydev, MDIO_DEVAD_NONE, MIIM_BCM54XX_EXP_SEL, reg);
+
+ genphy_restart_aneg(phydev);
+
+ return 0;
+}
+
/* Broadcom BCM5461S */
static int bcm5461_config(struct phy_device *phydev)
{
@@ -434,6 +461,16 @@ U_BOOT_PHY_DRIVER(bcm5461s) = {
.shutdown = &genphy_shutdown,
};
+U_BOOT_PHY_DRIVER(bcm54612e) = {
+ .name = "Broadcom BCM54612E",
+ .uid = 0x03625e6a,
+ .mask = 0xfffff0,
+ .features = PHY_GBIT_FEATURES,
+ .config = &bcm54612e_config,
+ .startup = &bcm54xx_startup,
+ .shutdown = &genphy_shutdown,
+};
+
U_BOOT_PHY_DRIVER(bcm5464s) = {
.name = "Broadcom BCM5464S",
.uid = 0x2060b0,
diff --git a/drivers/net/phy/vitesse.c b/drivers/net/phy/vitesse.c
index 4867d1931b4..821d3878236 100644
--- a/drivers/net/phy/vitesse.c
+++ b/drivers/net/phy/vitesse.c
@@ -239,7 +239,7 @@ static int vsc8514_config(struct phy_device *phydev)
while ((val & MIIM_VSC8514_18G_CMDSTAT) && timeout--)
val = phy_read(phydev, MDIO_DEVAD_NONE, MIIM_VSC8514_GENERAL18);
- if (0 == timeout) {
+ if (timeout == -1) {
printf("PHY 8514 config failed\n");
return -1;
}
diff --git a/drivers/net/xilinx_axi_emac.c b/drivers/net/xilinx_axi_emac.c
index c8038ddef1b..22e119370c8 100644
--- a/drivers/net/xilinx_axi_emac.c
+++ b/drivers/net/xilinx_axi_emac.c
@@ -558,7 +558,7 @@ static int axiemac_write_hwaddr(struct udevice *dev)
/* Reset DMA engine */
static void axi_dma_init(struct axidma_priv *priv)
{
- u32 timeout = 500;
+ int timeout = 500;
/* Reset the engine so the hardware starts from a known state */
writel(XAXIDMA_CR_RESET_MASK, &priv->dmatx->control);
@@ -571,11 +571,11 @@ static void axi_dma_init(struct axidma_priv *priv)
if (!((readl(&priv->dmatx->control) |
readl(&priv->dmarx->control))
& XAXIDMA_CR_RESET_MASK)) {
- break;
+ return;
}
}
- if (!timeout)
- printf("%s: Timeout\n", __func__);
+
+ printf("%s: Timeout\n", __func__);
}
static int axiemac_start(struct udevice *dev)
diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
index c297fa03ea7..d36a5f00ef8 100644
--- a/drivers/phy/Kconfig
+++ b/drivers/phy/Kconfig
@@ -289,11 +289,11 @@ config PHY_NPCM_USB
Support the USB PHY in NPCM SoCs
config PHY_IMX8MQ_USB
- bool "NXP i.MX8MQ/i.MX8MP USB PHY Driver"
+ bool "NXP i.MX8MQ/i.MX8MP/i.MX95 USB PHY Driver"
depends on PHY
- depends on IMX8MQ || IMX8MP
+ depends on IMX8MQ || IMX8MP || IMX95
help
- Support the USB3.0 PHY in NXP i.MX8MQ or i.MX8MP SoC
+ Support the USB3.0 PHY in NXP i.MX8MQ, i.MX8MP, and i.MX95 SoC
config PHY_IMX8M_PCIE
bool "NXP i.MX8MM/i.MX8MP PCIe PHY Driver"
diff --git a/drivers/phy/cadence/phy-cadence-sierra.c b/drivers/phy/cadence/phy-cadence-sierra.c
index 2c9d5a12127..bd7ab9d1b77 100644
--- a/drivers/phy/cadence/phy-cadence-sierra.c
+++ b/drivers/phy/cadence/phy-cadence-sierra.c
@@ -225,11 +225,6 @@ static const struct reg_field pllctrl_lock =
static const struct reg_field phy_iso_link_ctrl_1 =
REG_FIELD(SIERRA_PHY_ISO_LINK_CTRL, 1, 1);
-static const char * const clk_names[] = {
- [CDNS_SIERRA_PLL_CMNLC] = "pll_cmnlc",
- [CDNS_SIERRA_PLL_CMNLC1] = "pll_cmnlc1",
-};
-
enum cdns_sierra_cmn_plllc {
CMN_PLLLC,
CMN_PLLLC1,
@@ -602,7 +597,7 @@ static int cdns_sierra_pll_bind_of_clocks(struct cdns_sierra_phy *sp)
struct udevice *dev = sp->dev;
struct driver *cdns_sierra_clk_drv;
struct cdns_sierra_pll_mux_sel *data = pll_clk_mux_sel;
- int i, rc;
+ int rc;
cdns_sierra_clk_drv = lists_driver_lookup_name("cdns_sierra_mux_clk");
if (!cdns_sierra_clk_drv) {
@@ -612,10 +607,8 @@ static int cdns_sierra_pll_bind_of_clocks(struct cdns_sierra_phy *sp)
rc = device_bind(dev, cdns_sierra_clk_drv, "pll_mux_clk",
data, dev_ofnode(dev), NULL);
- if (rc) {
- dev_err(dev, "cannot bind driver for clock %s\n",
- clk_names[i]);
- }
+ if (rc)
+ dev_err(dev, "cannot bind driver for clock pll_mux_clk\n");
return 0;
}
diff --git a/drivers/phy/cadence/phy-cadence-torrent.c b/drivers/phy/cadence/phy-cadence-torrent.c
index 1f566d082f9..28fe026223c 100644
--- a/drivers/phy/cadence/phy-cadence-torrent.c
+++ b/drivers/phy/cadence/phy-cadence-torrent.c
@@ -719,6 +719,7 @@ static int cdns_torrent_phy_probe(struct udevice *dev)
if (total_num_lanes > MAX_NUM_LANES) {
dev_err(dev, "Invalid lane configuration\n");
+ ret = -EINVAL;
goto put_lnk_rst;
}
diff --git a/drivers/phy/marvell/comphy_core.c b/drivers/phy/marvell/comphy_core.c
index a666a4e794e..a4121423873 100644
--- a/drivers/phy/marvell/comphy_core.c
+++ b/drivers/phy/marvell/comphy_core.c
@@ -28,7 +28,7 @@ static const char *get_speed_string(u32 speed)
"10.3125 Gbps"
};
- if (speed < 0 || speed > COMPHY_SPEED_MAX)
+ if (speed < 0 || speed >= COMPHY_SPEED_MAX)
return "invalid";
return speed_strings[speed];
@@ -44,7 +44,7 @@ static const char *get_type_string(u32 type)
"IGNORE"
};
- if (type < 0 || type > COMPHY_TYPE_MAX)
+ if (type < 0 || type >= COMPHY_TYPE_MAX)
return "invalid";
return type_strings[type];
diff --git a/drivers/phy/marvell/comphy_core.h b/drivers/phy/marvell/comphy_core.h
index f3d04939387..086a4d82f26 100644
--- a/drivers/phy/marvell/comphy_core.h
+++ b/drivers/phy/marvell/comphy_core.h
@@ -47,8 +47,8 @@ struct chip_serdes_phy_config {
int (*rx_training)(struct chip_serdes_phy_config *, u32);
void __iomem *comphy_base_addr;
void __iomem *hpipe3_base_addr;
- u32 comphy_lanes_count;
- u32 comphy_mux_bitcount;
+ int comphy_lanes_count;
+ int comphy_mux_bitcount;
const fdt32_t *comphy_mux_lane_order;
u32 cp_index;
struct comphy_map comphy_map_data[MAX_LANE_OPTIONS];
diff --git a/drivers/phy/phy-imx8mq-usb.c b/drivers/phy/phy-imx8mq-usb.c
index 75763046adc..387db843c50 100644
--- a/drivers/phy/phy-imx8mq-usb.c
+++ b/drivers/phy/phy-imx8mq-usb.c
@@ -71,9 +71,57 @@
#define PHY_STS0_FSVPLUS BIT(3)
#define PHY_STS0_FSVMINUS BIT(2)
+#define TCA_CLK_RST 0x00
+#define TCA_CLK_RST_SW BIT(9)
+#define TCA_CLK_RST_REF_CLK_EN BIT(1)
+#define TCA_CLK_RST_SUSPEND_CLK_EN BIT(0)
+
+#define TCA_INTR_EN 0x04
+#define TCA_INTR_STS 0x08
+
+#define TCA_GCFG 0x10
+#define TCA_GCFG_ROLE_HSTDEV BIT(4)
+#define TCA_GCFG_OP_MODE GENMASK(1, 0)
+#define TCA_GCFG_OP_MODE_SYSMODE 0
+#define TCA_GCFG_OP_MODE_SYNCMODE 1
+
+#define TCA_TCPC 0x14
+#define TCA_TCPC_VALID BIT(4)
+#define TCA_TCPC_LOW_POWER_EN BIT(3)
+#define TCA_TCPC_ORIENTATION_NORMAL BIT(2)
+#define TCA_TCPC_MUX_CONTRL GENMASK(1, 0)
+#define TCA_TCPC_MUX_CONTRL_NO_CONN 0
+#define TCA_TCPC_MUX_CONTRL_USB_CONN 1
+
+#define TCA_SYSMODE_CFG 0x18
+#define TCA_SYSMODE_TCPC_DISABLE BIT(3)
+#define TCA_SYSMODE_TCPC_FLIP BIT(2)
+
+#define TCA_CTRLSYNCMODE_CFG0 0x20
+#define TCA_CTRLSYNCMODE_CFG1 0x20
+
+#define TCA_PSTATE 0x30
+#define TCA_PSTATE_CM_STS BIT(4)
+#define TCA_PSTATE_TX_STS BIT(3)
+#define TCA_PSTATE_RX_PLL_STS BIT(2)
+#define TCA_PSTATE_PIPE0_POWER_DOWN GENMASK(1, 0)
+
+#define TCA_GEN_STATUS 0x34
+#define TCA_GEN_DEV_POR BIT(12)
+#define TCA_GEN_REF_CLK_SEL BIT(8)
+#define TCA_GEN_TYPEC_FLIP_INVERT BIT(4)
+#define TCA_GEN_PHY_TYPEC_DISABLE BIT(3)
+#define TCA_GEN_PHY_TYPEC_FLIP BIT(2)
+
+#define TCA_VBUS_CTRL 0x40
+#define TCA_VBUS_STATUS 0x44
+
+#define TCA_INFO 0xfc
+
enum imx8mpq_phy_type {
IMX8MQ_PHY,
IMX8MP_PHY,
+ IMX95_PHY,
};
struct imx8mq_usb_phy {
@@ -81,14 +129,49 @@ struct imx8mq_usb_phy {
void __iomem *base;
enum imx8mpq_phy_type type;
struct udevice *vbus_supply;
+ void __iomem *tca_base;
};
static const struct udevice_id imx8mq_usb_phy_of_match[] = {
{ .compatible = "fsl,imx8mq-usb-phy", .data = IMX8MQ_PHY },
{ .compatible = "fsl,imx8mp-usb-phy", .data = IMX8MP_PHY },
+ { .compatible = "fsl,imx95-usb-phy", .data = IMX95_PHY },
{},
};
+static void tca_blk_init(struct phy *usb_phy)
+{
+ struct udevice *dev = usb_phy->dev;
+ struct imx8mq_usb_phy *imx_phy = dev_get_priv(dev);
+ void __iomem *base = imx_phy->tca_base;
+ u32 val;
+
+ /* reset XBar block */
+ val = readl(base + TCA_CLK_RST);
+ val &= ~TCA_CLK_RST_SW;
+ writel(val, base + TCA_CLK_RST);
+
+ udelay(100);
+
+ /* clear reset */
+ val |= TCA_CLK_RST_SW;
+ writel(val, base + TCA_CLK_RST);
+
+ /*
+ * use Controller Synced Mode for TCA low power enable and
+ * put PHY to USB safe state.
+ */
+ val = FIELD_PREP(TCA_GCFG_OP_MODE, TCA_GCFG_OP_MODE_SYNCMODE);
+ writel(val, base + TCA_GCFG);
+
+ val = TCA_TCPC_VALID | TCA_TCPC_LOW_POWER_EN;
+ writel(val, base + TCA_TCPC);
+
+ /* use System Configuration Mode for TCA mux control. */
+ val = FIELD_PREP(TCA_GCFG_OP_MODE, TCA_GCFG_OP_MODE_SYSMODE);
+ writel(val, base + TCA_GCFG);
+}
+
static int imx8mq_usb_phy_init(struct phy *usb_phy)
{
struct udevice *dev = usb_phy->dev;
@@ -154,6 +237,9 @@ static int imx8mp_usb_phy_init(struct phy *usb_phy)
value &= ~(PHY_CTRL1_RESET | PHY_CTRL1_ATERESET);
writel(value, imx_phy->base + PHY_CTRL1);
+ if (imx_phy->tca_base)
+ tca_blk_init(usb_phy);
+
return 0;
}
@@ -162,7 +248,7 @@ static int imx8mpq_usb_phy_init(struct phy *usb_phy)
struct udevice *dev = usb_phy->dev;
struct imx8mq_usb_phy *imx_phy = dev_get_priv(dev);
- if (imx_phy->type == IMX8MP_PHY)
+ if (imx_phy->type == IMX8MP_PHY || imx_phy->type == IMX95_PHY)
return imx8mp_usb_phy_init(usb_phy);
else
return imx8mq_usb_phy_init(usb_phy);
@@ -264,6 +350,9 @@ int imx8mq_usb_phy_probe(struct udevice *dev)
}
}
+ if (priv->type == IMX95_PHY)
+ priv->tca_base = dev_read_addr_index_ptr(dev, 1);
+
return 0;
}
diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
index 88b33de1b2a..4ea6600ce7f 100644
--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
+++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
@@ -167,20 +167,27 @@ static struct phy_ops rockchip_usb2phy_ops = {
.of_xlate = rockchip_usb2phy_of_xlate,
};
-static void rockchip_usb2phy_clkout_ctl(struct clk *clk, struct regmap **base,
- const struct usb2phy_reg **clkout_ctl)
+static int rockchip_usb2phy_clkout_ctl(struct clk *clk, struct regmap **base,
+ const struct usb2phy_reg **clkout_ctl)
{
struct udevice *parent = dev_get_parent(clk->dev);
struct rockchip_usb2phy *priv = dev_get_priv(parent);
const struct rockchip_usb2phy_cfg *phy_cfg = priv->phy_cfg;
- if (priv->phy_cfg->clkout_ctl_phy.enable) {
+ // phy_cfg can be NULL if this function called before probe (when parent
+ // clocks are enabled)
+ if (!phy_cfg)
+ return -EINVAL;
+
+ if (phy_cfg->clkout_ctl_phy.enable) {
*base = priv->phy_base;
*clkout_ctl = &phy_cfg->clkout_ctl_phy;
} else {
*base = priv->reg_base;
*clkout_ctl = &phy_cfg->clkout_ctl;
}
+
+ return 0;
}
/**
@@ -206,7 +213,8 @@ int rockchip_usb2phy_clk_enable(struct clk *clk)
const struct usb2phy_reg *clkout_ctl;
struct regmap *base;
- rockchip_usb2phy_clkout_ctl(clk, &base, &clkout_ctl);
+ if (rockchip_usb2phy_clkout_ctl(clk, &base, &clkout_ctl))
+ return -ENOSYS;
/* turn on 480m clk output if it is off */
if (!property_enabled(base, clkout_ctl)) {
@@ -230,7 +238,8 @@ int rockchip_usb2phy_clk_disable(struct clk *clk)
const struct usb2phy_reg *clkout_ctl;
struct regmap *base;
- rockchip_usb2phy_clkout_ctl(clk, &base, &clkout_ctl);
+ if (rockchip_usb2phy_clkout_ctl(clk, &base, &clkout_ctl))
+ return -ENOSYS;
/* turn off 480m clk output */
property_enable(base, clkout_ctl, false);
@@ -456,6 +465,28 @@ static const struct rockchip_usb2phy_cfg rk3568_phy_cfgs[] = {
{ /* sentinel */ }
};
+static const struct rockchip_usb2phy_cfg rk3576_phy_cfgs[] = {
+ {
+ .reg = 0x0000,
+ .clkout_ctl = { 0x0008, 0, 0, 1, 0 },
+ .port_cfgs = {
+ [USB2PHY_PORT_OTG] = {
+ .phy_sus = { 0x0000, 1, 0, 2, 1 },
+ }
+ },
+ },
+ {
+ .reg = 0x2000,
+ .clkout_ctl = { 0x2008, 0, 0, 1, 0 },
+ .port_cfgs = {
+ [USB2PHY_PORT_OTG] = {
+ .phy_sus = { 0x2000, 1, 0, 2, 1 },
+ }
+ },
+ },
+ { /* sentinel */ }
+};
+
static const struct rockchip_usb2phy_cfg rk3588_phy_cfgs[] = {
{
.reg = 0x0000,
@@ -518,6 +549,10 @@ static const struct udevice_id rockchip_usb2phy_ids[] = {
.data = (ulong)&rk3568_phy_cfgs,
},
{
+ .compatible = "rockchip,rk3576-usb2phy",
+ .data = (ulong)&rk3576_phy_cfgs,
+ },
+ {
.compatible = "rockchip,rk3588-usb2phy",
.data = (ulong)&rk3588_phy_cfgs,
},
@@ -538,7 +573,7 @@ U_BOOT_DRIVER(rockchip_usb2phy_clock) = {
U_BOOT_DRIVER(rockchip_usb2phy) = {
.name = "rockchip_usb2phy",
- .id = UCLASS_PHY,
+ .id = UCLASS_NOP,
.of_match = rockchip_usb2phy_ids,
.probe = rockchip_usb2phy_probe,
.bind = rockchip_usb2phy_bind,
diff --git a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
index 5145b517aa4..d602f965d6a 100644
--- a/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
+++ b/drivers/phy/rockchip/phy-rockchip-naneng-combphy.c
@@ -37,6 +37,7 @@ struct rockchip_combphy_grfcfg {
struct combphy_reg pipe_rxterm_set;
struct combphy_reg pipe_txelec_set;
struct combphy_reg pipe_txcomp_set;
+ struct combphy_reg pipe_clk_24m;
struct combphy_reg pipe_clk_25m;
struct combphy_reg pipe_clk_100m;
struct combphy_reg pipe_phymode_sel;
@@ -98,104 +99,41 @@ static int param_write(struct regmap *base,
return regmap_write(base, reg->offset, val);
}
-static int rockchip_combphy_pcie_init(struct rockchip_combphy_priv *priv)
-{
- int ret = 0;
-
- if (priv->cfg->combphy_cfg) {
- ret = priv->cfg->combphy_cfg(priv);
- if (ret) {
- dev_err(priv->dev, "failed to init phy for pcie\n");
- return ret;
- }
- }
-
- return ret;
-}
-
-static int rockchip_combphy_usb3_init(struct rockchip_combphy_priv *priv)
-{
- int ret = 0;
-
- if (priv->cfg->combphy_cfg) {
- ret = priv->cfg->combphy_cfg(priv);
- if (ret) {
- dev_err(priv->dev, "failed to init phy for usb3\n");
- return ret;
- }
- }
-
- return ret;
-}
-
-static int rockchip_combphy_sata_init(struct rockchip_combphy_priv *priv)
-{
- int ret = 0;
-
- if (priv->cfg->combphy_cfg) {
- ret = priv->cfg->combphy_cfg(priv);
- if (ret) {
- dev_err(priv->dev, "failed to init phy for sata\n");
- return ret;
- }
- }
-
- return ret;
-}
-
-static int rockchip_combphy_sgmii_init(struct rockchip_combphy_priv *priv)
+static int rockchip_combphy_init(struct phy *phy)
{
- int ret = 0;
-
- if (priv->cfg->combphy_cfg) {
- ret = priv->cfg->combphy_cfg(priv);
- if (ret) {
- dev_err(priv->dev, "failed to init phy for sgmii\n");
- return ret;
- }
- }
+ struct rockchip_combphy_priv *priv = dev_get_priv(phy->dev);
+ int ret;
- return ret;
-}
+ ret = clk_enable(&priv->ref_clk);
+ if (ret < 0 && ret != -ENOSYS)
+ return ret;
-static int rockchip_combphy_set_mode(struct rockchip_combphy_priv *priv)
-{
switch (priv->mode) {
case PHY_TYPE_PCIE:
- rockchip_combphy_pcie_init(priv);
- break;
case PHY_TYPE_USB3:
- rockchip_combphy_usb3_init(priv);
- break;
case PHY_TYPE_SATA:
- rockchip_combphy_sata_init(priv);
- break;
case PHY_TYPE_SGMII:
case PHY_TYPE_QSGMII:
- return rockchip_combphy_sgmii_init(priv);
+ if (priv->cfg->combphy_cfg)
+ ret = priv->cfg->combphy_cfg(priv);
+ else
+ ret = 0;
+ break;
default:
dev_err(priv->dev, "incompatible PHY type\n");
- return -EINVAL;
+ ret = -EINVAL;
+ break;
}
- return 0;
-}
-
-static int rockchip_combphy_init(struct phy *phy)
-{
- struct rockchip_combphy_priv *priv = dev_get_priv(phy->dev);
- int ret;
-
- ret = clk_enable(&priv->ref_clk);
- if (ret < 0 && ret != -ENOSYS)
- return ret;
+ if (ret) {
+ dev_err(priv->dev, "failed to init phy for phy type %x\n", priv->mode);
+ goto err_clk;
+ }
- ret = rockchip_combphy_set_mode(priv);
+ ret = reset_deassert_bulk(&priv->phy_rsts);
if (ret)
goto err_clk;
- reset_deassert_bulk(&priv->phy_rsts);
-
return 0;
err_clk:
@@ -223,6 +161,7 @@ static int rockchip_combphy_xlate(struct phy *phy, struct ofnode_phandle_args *a
return -EINVAL;
}
+ phy->id = priv->id;
priv->mode = args->args[0];
return 0;
@@ -237,22 +176,19 @@ static const struct phy_ops rockchip_combphy_ops = {
static int rockchip_combphy_parse_dt(struct udevice *dev,
struct rockchip_combphy_priv *priv)
{
- struct udevice *syscon;
int ret;
- ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,pipe-grf", &syscon);
- if (ret) {
- dev_err(dev, "failed to find peri_ctrl pipe-grf regmap");
- return ret;
+ priv->pipe_grf = syscon_regmap_lookup_by_phandle(dev, "rockchip,pipe-grf");
+ if (IS_ERR(priv->pipe_grf)) {
+ dev_err(dev, "failed to find peri_ctrl pipe-grf regmap\n");
+ return PTR_ERR(priv->pipe_grf);
}
- priv->pipe_grf = syscon_get_regmap(syscon);
- ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev, "rockchip,pipe-phy-grf", &syscon);
- if (ret) {
+ priv->phy_grf = syscon_regmap_lookup_by_phandle(dev, "rockchip,pipe-phy-grf");
+ if (IS_ERR(priv->phy_grf)) {
dev_err(dev, "failed to find peri_ctrl pipe-phy-grf regmap\n");
- return ret;
+ return PTR_ERR(priv->phy_grf);
}
- priv->phy_grf = syscon_get_regmap(syscon);
ret = clk_get_by_index(dev, 0, &priv->ref_clk);
if (ret) {
@@ -304,12 +240,109 @@ static int rockchip_combphy_probe(struct udevice *udev)
}
priv->dev = udev;
- priv->mode = PHY_TYPE_SATA;
+ priv->mode = PHY_NONE;
priv->cfg = phy_cfg;
return rockchip_combphy_parse_dt(udev, priv);
}
+static int rk3528_combphy_cfg(struct rockchip_combphy_priv *priv)
+{
+ const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
+ u32 val;
+
+ switch (priv->mode) {
+ case PHY_TYPE_PCIE:
+ /* Set SSC downward spread spectrum */
+ val = readl(priv->mmio + 0x18);
+ val &= ~GENMASK(5, 4);
+ val |= 0x01 << 4;
+ writel(val, priv->mmio + 0x18);
+
+ param_write(priv->phy_grf, &cfg->con0_for_pcie, true);
+ param_write(priv->phy_grf, &cfg->con1_for_pcie, true);
+ param_write(priv->phy_grf, &cfg->con2_for_pcie, true);
+ param_write(priv->phy_grf, &cfg->con3_for_pcie, true);
+ break;
+ case PHY_TYPE_USB3:
+ /* Set SSC downward spread spectrum */
+ val = readl(priv->mmio + 0x18);
+ val &= ~GENMASK(5, 4);
+ val |= 0x01 << 4;
+ writel(val, priv->mmio + 0x18);
+
+ /* Enable adaptive CTLE for USB3.0 Rx */
+ val = readl(priv->mmio + 0x200);
+ val &= ~GENMASK(17, 17);
+ val |= 0x01 << 17;
+ writel(val, priv->mmio + 0x200);
+
+ /* Set Rx squelch input filler bandwidth */
+ val = readl(priv->mmio + 0x20c);
+ val &= ~GENMASK(2, 0);
+ val |= 0x06;
+ writel(val, priv->mmio + 0x20c);
+
+ param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false);
+ param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false);
+ param_write(priv->phy_grf, &cfg->usb_mode_set, true);
+ param_write(priv->pipe_grf, &cfg->u3otg0_port_en, true);
+ break;
+ default:
+ dev_err(priv->dev, "incompatible PHY type\n");
+ return -EINVAL;
+ }
+
+ param_write(priv->phy_grf, &cfg->pipe_clk_100m, true);
+
+ if (priv->mode == PHY_TYPE_PCIE) {
+ /* PLL KVCO tuning fine */
+ val = readl(priv->mmio + 0x18);
+ val &= ~(0x7 << 10);
+ val |= 0x2 << 10;
+ writel(val, priv->mmio + 0x18);
+
+ /* su_trim[6:4]=111, [10:7]=1001, [2:0]=000 */
+ val = readl(priv->mmio + 0x108);
+ val &= ~(0x7f7);
+ val |= 0x4f0;
+ writel(val, priv->mmio + 0x108);
+ }
+
+ return 0;
+}
+
+static const struct rockchip_combphy_grfcfg rk3528_combphy_grfcfgs = {
+ /* pipe-phy-grf */
+ .pcie_mode_set = { 0x0000, 5, 0, 0x00, 0x11 },
+ .usb_mode_set = { 0x0000, 5, 0, 0x00, 0x04 },
+ .pipe_rxterm_set = { 0x0000, 12, 12, 0x00, 0x01 },
+ .pipe_txelec_set = { 0x0004, 1, 1, 0x00, 0x01 },
+ .pipe_txcomp_set = { 0x0004, 4, 4, 0x00, 0x01 },
+ .pipe_clk_24m = { 0x0004, 14, 13, 0x00, 0x00 },
+ .pipe_clk_100m = { 0x0004, 14, 13, 0x00, 0x02 },
+ .pipe_rxterm_sel = { 0x0008, 8, 8, 0x00, 0x01 },
+ .pipe_txelec_sel = { 0x0008, 12, 12, 0x00, 0x01 },
+ .pipe_txcomp_sel = { 0x0008, 15, 15, 0x00, 0x01 },
+ .pipe_clk_ext = { 0x000c, 9, 8, 0x02, 0x01 },
+ .pipe_phy_status = { 0x0034, 6, 6, 0x01, 0x00 },
+ .con0_for_pcie = { 0x0000, 15, 0, 0x00, 0x110 },
+ .con1_for_pcie = { 0x0004, 15, 0, 0x00, 0x00 },
+ .con2_for_pcie = { 0x0008, 15, 0, 0x00, 0x101 },
+ .con3_for_pcie = { 0x000c, 15, 0, 0x00, 0x0200 },
+ /* pipe-grf */
+ .u3otg0_port_en = { 0x0044, 15, 0, 0x0181, 0x1100 },
+};
+
+static const struct rockchip_combphy_cfg rk3528_combphy_cfgs = {
+ .num_phys = 1,
+ .phy_ids = {
+ 0xffdc0000,
+ },
+ .grfcfg = &rk3528_combphy_grfcfgs,
+ .combphy_cfg = rk3528_combphy_cfg,
+};
+
static int rk3568_combphy_cfg(struct rockchip_combphy_priv *priv)
{
const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
@@ -453,6 +486,149 @@ static const struct rockchip_combphy_cfg rk3568_combphy_cfgs = {
.combphy_cfg = rk3568_combphy_cfg,
};
+static int rk3576_combphy_cfg(struct rockchip_combphy_priv *priv)
+{
+ const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
+ u32 val;
+
+ switch (priv->mode) {
+ case PHY_TYPE_PCIE:
+ param_write(priv->phy_grf, &cfg->con0_for_pcie, true);
+ param_write(priv->phy_grf, &cfg->con1_for_pcie, true);
+ param_write(priv->phy_grf, &cfg->con2_for_pcie, true);
+ param_write(priv->phy_grf, &cfg->con3_for_pcie, true);
+ break;
+ case PHY_TYPE_USB3:
+ /* Set SSC downward spread spectrum */
+ val = readl(priv->mmio + (0x1f << 2));
+ val &= ~GENMASK(5, 4);
+ val |= 0x01 << 4;
+ writel(val, priv->mmio + 0x7c);
+
+ /* Enable adaptive CTLE for USB3.0 Rx */
+ val = readl(priv->mmio + (0x0e << 2));
+ val &= ~GENMASK(0, 0);
+ val |= 0x01;
+ writel(val, priv->mmio + (0x0e << 2));
+
+ /* Set PLL KVCO fine tuning signals */
+ val = readl(priv->mmio + (0x20 << 2));
+ val &= ~(0x7 << 2);
+ val |= 0x2 << 2;
+ writel(val, priv->mmio + (0x20 << 2));
+
+ /* Set PLL LPF R1 to su_trim[10:7]=1001 */
+ writel(0x4, priv->mmio + (0xb << 2));
+
+ /* Set PLL input clock divider 1/2 */
+ val = readl(priv->mmio + (0x5 << 2));
+ val &= ~(0x3 << 6);
+ val |= 0x1 << 6;
+ writel(val, priv->mmio + (0x5 << 2));
+
+ /* Set PLL loop divider */
+ writel(0x32, priv->mmio + (0x11 << 2));
+
+ /* Set PLL KVCO to min and set PLL charge pump current to max */
+ writel(0xf0, priv->mmio + (0xa << 2));
+
+ /* Set Rx squelch input filler bandwidth */
+ writel(0x0d, priv->mmio + (0x14 << 2));
+
+ param_write(priv->phy_grf, &cfg->pipe_txcomp_sel, false);
+ param_write(priv->phy_grf, &cfg->pipe_txelec_sel, false);
+ param_write(priv->phy_grf, &cfg->usb_mode_set, true);
+ param_write(priv->pipe_grf, &cfg->u3otg1_port_en, true);
+ break;
+ case PHY_TYPE_SATA:
+ /* Enable adaptive CTLE for SATA Rx */
+ val = readl(priv->mmio + (0x0e << 2));
+ val &= ~GENMASK(0, 0);
+ val |= 0x01;
+ writel(val, priv->mmio + (0x0e << 2));
+ /* Set tx_rterm = 50 ohm and rx_rterm = 43.5 ohm */
+ writel(0x8F, priv->mmio + (0x06 << 2));
+
+ param_write(priv->phy_grf, &cfg->con0_for_sata, true);
+ param_write(priv->phy_grf, &cfg->con1_for_sata, true);
+ param_write(priv->phy_grf, &cfg->con2_for_sata, true);
+ param_write(priv->phy_grf, &cfg->con3_for_sata, true);
+ param_write(priv->pipe_grf, &cfg->pipe_con0_for_sata, true);
+ param_write(priv->pipe_grf, &cfg->pipe_con1_for_sata, true);
+ break;
+ case PHY_TYPE_SGMII:
+ case PHY_TYPE_QSGMII:
+ default:
+ dev_err(priv->dev, "incompatible PHY type\n");
+ return -EINVAL;
+ }
+
+ /* 100MHz refclock signal is good */
+ clk_set_rate(&priv->ref_clk, 100000000);
+ param_write(priv->phy_grf, &cfg->pipe_clk_100m, true);
+ if (priv->mode == PHY_TYPE_PCIE) {
+ /* gate_tx_pck_sel length select work for L1SS */
+ writel(0xc0, priv->mmio + 0x74);
+
+ /* PLL KVCO tuning fine */
+ val = readl(priv->mmio + (0x20 << 2));
+ val &= ~(0x7 << 2);
+ val |= 0x2 << 2;
+ writel(val, priv->mmio + (0x20 << 2));
+
+ /* Set up rx_trim: PLL LPF C1 85pf R1 1.25kohm */
+ writel(0x4c, priv->mmio + (0x1b << 2));
+
+ /* Set up su_trim: T3_P1 650mv */
+ writel(0x90, priv->mmio + (0xa << 2));
+ writel(0x43, priv->mmio + (0xb << 2));
+ writel(0x88, priv->mmio + (0xc << 2));
+ writel(0x56, priv->mmio + (0xd << 2));
+ }
+
+ return 0;
+}
+
+static const struct rockchip_combphy_grfcfg rk3576_combphy_grfcfgs = {
+ /* pipe-phy-grf */
+ .pcie_mode_set = { 0x0000, 5, 0, 0x00, 0x11 },
+ .usb_mode_set = { 0x0000, 5, 0, 0x00, 0x04 },
+ .pipe_rxterm_set = { 0x0000, 12, 12, 0x00, 0x01 },
+ .pipe_txelec_set = { 0x0004, 1, 1, 0x00, 0x01 },
+ .pipe_txcomp_set = { 0x0004, 4, 4, 0x00, 0x01 },
+ .pipe_clk_25m = { 0x0004, 14, 13, 0x00, 0x01 },
+ .pipe_clk_100m = { 0x0004, 14, 13, 0x00, 0x02 },
+ .pipe_phymode_sel = { 0x0008, 1, 1, 0x00, 0x01 },
+ .pipe_rate_sel = { 0x0008, 2, 2, 0x00, 0x01 },
+ .pipe_rxterm_sel = { 0x0008, 8, 8, 0x00, 0x01 },
+ .pipe_txelec_sel = { 0x0008, 12, 12, 0x00, 0x01 },
+ .pipe_txcomp_sel = { 0x0008, 15, 15, 0x00, 0x01 },
+ .pipe_clk_ext = { 0x000c, 9, 8, 0x02, 0x01 },
+ .pipe_phy_status = { 0x0034, 6, 6, 0x01, 0x00 },
+ .con0_for_pcie = { 0x0000, 15, 0, 0x00, 0x1000 },
+ .con1_for_pcie = { 0x0004, 15, 0, 0x00, 0x0000 },
+ .con2_for_pcie = { 0x0008, 15, 0, 0x00, 0x0101 },
+ .con3_for_pcie = { 0x000c, 15, 0, 0x00, 0x0200 },
+ .con0_for_sata = { 0x0000, 15, 0, 0x00, 0x0129 },
+ .con1_for_sata = { 0x0004, 15, 0, 0x00, 0x0000 },
+ .con2_for_sata = { 0x0008, 15, 0, 0x00, 0x80c1 },
+ .con3_for_sata = { 0x000c, 15, 0, 0x00, 0x0407 },
+ /* php-grf */
+ .pipe_con0_for_sata = { 0x001C, 2, 0, 0x00, 0x2 },
+ .pipe_con1_for_sata = { 0x0020, 2, 0, 0x00, 0x2 },
+ .u3otg1_port_en = { 0x0038, 15, 0, 0x0181, 0x1100 },
+};
+
+static const struct rockchip_combphy_cfg rk3576_combphy_cfgs = {
+ .num_phys = 2,
+ .phy_ids = {
+ 0x2b050000,
+ 0x2b060000,
+ },
+ .grfcfg = &rk3576_combphy_grfcfgs,
+ .combphy_cfg = rk3576_combphy_cfg,
+};
+
static int rk3588_combphy_cfg(struct rockchip_combphy_priv *priv)
{
const struct rockchip_combphy_grfcfg *cfg = priv->cfg->grfcfg;
@@ -561,10 +737,18 @@ static const struct rockchip_combphy_cfg rk3588_combphy_cfgs = {
static const struct udevice_id rockchip_combphy_ids[] = {
{
+ .compatible = "rockchip,rk3528-naneng-combphy",
+ .data = (ulong)&rk3528_combphy_cfgs
+ },
+ {
.compatible = "rockchip,rk3568-naneng-combphy",
.data = (ulong)&rk3568_combphy_cfgs
},
{
+ .compatible = "rockchip,rk3576-naneng-combphy",
+ .data = (ulong)&rk3576_combphy_cfgs
+ },
+ {
.compatible = "rockchip,rk3588-naneng-combphy",
.data = (ulong)&rk3588_combphy_cfgs
},
diff --git a/drivers/phy/rockchip/phy-rockchip-typec.c b/drivers/phy/rockchip/phy-rockchip-typec.c
index c48a5cd5267..66d1d32d25c 100644
--- a/drivers/phy/rockchip/phy-rockchip-typec.c
+++ b/drivers/phy/rockchip/phy-rockchip-typec.c
@@ -788,7 +788,7 @@ U_BOOT_DRIVER(rockchip_tcphy_usb3_port) = {
U_BOOT_DRIVER(rockchip_typec_phy) = {
.name = "rockchip_typec_phy",
- .id = UCLASS_PHY,
+ .id = UCLASS_NOP,
.of_match = rockchip_typec_phy_ids,
.probe = rockchip_tcphy_probe,
.bind = rockchip_tcphy_bind,
diff --git a/drivers/phy/rockchip/phy-rockchip-usbdp.c b/drivers/phy/rockchip/phy-rockchip-usbdp.c
index 9deec47ae46..cca67dd3611 100644
--- a/drivers/phy/rockchip/phy-rockchip-usbdp.c
+++ b/drivers/phy/rockchip/phy-rockchip-usbdp.c
@@ -96,9 +96,7 @@ struct rockchip_udphy {
/* PHY status management */
bool flip;
- bool mode_change;
u8 mode;
- u8 status;
/* utilized for USB */
bool hs; /* flag for high-speed */
@@ -525,80 +523,26 @@ static int udphy_parse_dt(struct rockchip_udphy *udphy, struct udevice *dev)
return 0;
}
-static int udphy_power_on(struct rockchip_udphy *udphy, u8 mode)
-{
- int ret;
-
- if (!(udphy->mode & mode)) {
- dev_info(udphy->dev, "mode 0x%02x is not support\n", mode);
- return 0;
- }
-
- if (udphy->status == UDPHY_MODE_NONE) {
- udphy->mode_change = false;
- ret = udphy_setup(udphy);
- if (ret)
- return ret;
-
- if (udphy->mode & UDPHY_MODE_USB)
- udphy_u3_port_disable(udphy, false);
- } else if (udphy->mode_change) {
- udphy->mode_change = false;
- udphy->status = UDPHY_MODE_NONE;
- if (udphy->mode == UDPHY_MODE_DP)
- udphy_u3_port_disable(udphy, true);
-
- ret = udphy_disable(udphy);
- if (ret)
- return ret;
- ret = udphy_setup(udphy);
- if (ret)
- return ret;
- }
-
- udphy->status |= mode;
-
- return 0;
-}
-
-static int udphy_power_off(struct rockchip_udphy *udphy, u8 mode)
-{
- int ret;
-
- if (!(udphy->mode & mode)) {
- dev_info(udphy->dev, "mode 0x%02x is not supported\n", mode);
- return 0;
- }
-
- if (!udphy->status)
- return 0;
-
- udphy->status &= ~mode;
-
- if (udphy->status == UDPHY_MODE_NONE) {
- ret = udphy_disable(udphy);
- if (ret)
- return ret;
- }
-
- return 0;
-}
-
static int rockchip_u3phy_of_xlate(struct phy *phy,
struct ofnode_phandle_args *args)
{
+ struct rockchip_udphy *udphy = dev_get_priv(phy->dev);
+
if (args->args_count == 0)
return -EINVAL;
if (args->args[0] != PHY_TYPE_USB3)
return -EINVAL;
+ phy->id = udphy->id;
+
return 0;
}
static int rockchip_u3phy_init(struct phy *phy)
{
struct rockchip_udphy *udphy = dev_get_priv(phy->dev);
+ int ret;
/* DP only or high-speed, disable U3 port */
if (!(udphy->mode & UDPHY_MODE_USB) || udphy->hs) {
@@ -606,7 +550,12 @@ static int rockchip_u3phy_init(struct phy *phy)
return 0;
}
- return udphy_power_on(udphy, UDPHY_MODE_USB);
+ ret = udphy_setup(udphy);
+ if (ret)
+ return ret;
+
+ udphy_u3_port_disable(udphy, false);
+ return 0;
}
static int rockchip_u3phy_exit(struct phy *phy)
@@ -617,7 +566,7 @@ static int rockchip_u3phy_exit(struct phy *phy)
if (!(udphy->mode & UDPHY_MODE_USB) || udphy->hs)
return 0;
- return udphy_power_off(udphy, UDPHY_MODE_USB);
+ return udphy_disable(udphy);
}
static const struct phy_ops rockchip_u3phy_ops = {
@@ -813,6 +762,28 @@ static const char * const rk3588_udphy_rst_l[] = {
"init", "cmn", "lane", "pcs_apb", "pma_apb"
};
+static const struct rockchip_udphy_cfg rk3576_udphy_cfgs = {
+ .num_phys = 1,
+ .phy_ids = {
+ 0x2b010000,
+ },
+ .num_rsts = ARRAY_SIZE(rk3588_udphy_rst_l),
+ .rst_list = rk3588_udphy_rst_l,
+ .grfcfg = {
+ /* u2phy-grf */
+ .bvalid_phy_con = { 0x0010, 1, 0, 0x2, 0x3 },
+ .bvalid_grf_con = { 0x0000, 15, 14, 0x1, 0x3 },
+
+ /* usb-grf */
+ .usb3otg0_cfg = { 0x0030, 15, 0, 0x1100, 0x0188 },
+
+ /* usbdpphy-grf */
+ .low_pwrn = { 0x0004, 13, 13, 0, 1 },
+ .rx_lfps = { 0x0004, 14, 14, 0, 1 },
+ },
+ .combophy_init = rk3588_udphy_init,
+};
+
static const struct rockchip_udphy_cfg rk3588_udphy_cfgs = {
.num_phys = 2,
.phy_ids = {
@@ -839,6 +810,10 @@ static const struct rockchip_udphy_cfg rk3588_udphy_cfgs = {
static const struct udevice_id rockchip_udphy_dt_match[] = {
{
+ .compatible = "rockchip,rk3576-usbdp-phy",
+ .data = (ulong)&rk3576_udphy_cfgs
+ },
+ {
.compatible = "rockchip,rk3588-usbdp-phy",
.data = (ulong)&rk3588_udphy_cfgs
},
diff --git a/drivers/pinctrl/pinctrl-zynqmp.c b/drivers/pinctrl/pinctrl-zynqmp.c
index 6fa203a3b86..665b76a7d4d 100644
--- a/drivers/pinctrl/pinctrl-zynqmp.c
+++ b/drivers/pinctrl/pinctrl-zynqmp.c
@@ -204,7 +204,7 @@ static int zynqmp_pinctrl_prepare_func_groups(u32 fid,
const char **fgroups;
char name[MAX_GROUP_NAME_LEN];
u16 resp[NUM_GROUPS_PER_RESP] = {0};
- int ret, index, i;
+ int ret = 0, index, i;
fgroups = kcalloc(func->ngroups, sizeof(*fgroups), GFP_KERNEL);
if (!fgroups)
@@ -460,14 +460,14 @@ static int zynqmp_pinconf_set(struct udevice *dev, unsigned int pin,
case PIN_CFG_IOSTANDARD:
param = PM_PINCTRL_CONFIG_VOLTAGE_STATUS;
ret = zynqmp_pm_pinctrl_get_config(pin, param, &value);
- if (arg != value)
+ if (!ret && arg != value)
dev_warn(dev, "Invalid IO Standard requested for pin %d\n",
pin);
break;
case PIN_CONFIG_POWER_SOURCE:
param = PM_PINCTRL_CONFIG_VOLTAGE_STATUS;
ret = zynqmp_pm_pinctrl_get_config(pin, param, &value);
- if (arg != value)
+ if (!ret && arg != value)
dev_warn(dev, "Invalid IO Standard requested for pin %d\n",
pin);
break;
diff --git a/drivers/pinctrl/renesas/rzg2l-pfc.c b/drivers/pinctrl/renesas/rzg2l-pfc.c
index 3c751e9473a..4a75e0b2372 100644
--- a/drivers/pinctrl/renesas/rzg2l-pfc.c
+++ b/drivers/pinctrl/renesas/rzg2l-pfc.c
@@ -353,7 +353,7 @@ static int rzg2l_pinconf_set(struct udevice *dev, unsigned int pin_selector,
/* The pin selector refers to a multiplexed pin */
int port = rzg2l_selector_decode(data, pin_selector, &pin);
if (port < 0) {
- dev_err(dev, "Invalid pin selector %u:%u\n", port, pin);
+ dev_err(dev, "Invalid pin selector %u\n", pin_selector);
return port;
}
@@ -550,7 +550,7 @@ static int rzg2l_get_pin_muxing(struct udevice *dev, unsigned int selector,
port = rzg2l_selector_decode(data, selector, &pin);
if (port < 0) {
- dev_err(dev, "Invalid pin selector %u:%u\n", port, pin);
+ dev_err(dev, "Invalid pin selector %u\n", selector);
return port;
}
diff --git a/drivers/power/pmic/rk8xx.c b/drivers/power/pmic/rk8xx.c
index 3bc696d4caa..d11f7a7886e 100644
--- a/drivers/power/pmic/rk8xx.c
+++ b/drivers/power/pmic/rk8xx.c
@@ -89,11 +89,6 @@ void rk8xx_off_for_plugin(struct udevice *dev)
}
}
-static struct reg_data rk806_init_reg[] = {
- /* RST_FUN */
- { RK806_REG_SYS_CFG3, BIT(7), GENMASK(7, 6)},
-};
-
static struct reg_data rk817_init_reg[] = {
/* enable the under-voltage protection,
* the under-voltage protection will shutdown the LDO3 and reset the PMIC
@@ -306,12 +301,20 @@ static int rk8xx_probe(struct udevice *dev)
value = (power_en2 & 0x0f) | ((power_en3 & 0x0f) << 4);
pmic_reg_write(dev, RK817_POWER_EN_SAVE1, value);
break;
- case RK806_ID:
+ case RK806_ID: {
+ u32 rst_fun = 2;
+
on_source = RK806_ON_SOURCE;
off_source = RK806_OFF_SOURCE;
- init_data = rk806_init_reg;
- init_data_num = ARRAY_SIZE(rk806_init_reg);
- break;
+
+ ret = dev_read_u32(dev, "rockchip,reset-mode", &rst_fun);
+ if (ret)
+ debug("rockchip,reset-mode property missing, defaulting to %d\n",
+ rst_fun);
+
+ pmic_clrsetbits(dev, RK806_REG_SYS_CFG3, RK806_RST_FUN_MSK,
+ FIELD_PREP(RK806_RST_FUN_MSK, rst_fun));
+ break; }
default:
printf("Unknown PMIC: RK%x!!\n", show_variant);
return -EINVAL;
diff --git a/drivers/ram/renesas/dbsc5/dram.c b/drivers/ram/renesas/dbsc5/dram.c
index ca8a7fb4783..3ed02e11f9e 100644
--- a/drivers/ram/renesas/dbsc5/dram.c
+++ b/drivers/ram/renesas/dbsc5/dram.c
@@ -3735,7 +3735,7 @@ static u32 dbsc5_read_vref_training(struct udevice *dev)
if (vref_stop_index > 0x80)
return 0;
- for (i = 0; i <= vref_stop_index; i++) {
+ for (i = 0; i < vref_stop_index; i++) {
r_foreach_vch(dev, ch) {
reg = dbsc5_ddr_getval_slice(dev, ch, 0, PHY_PAD_VREF_CTRL_DQ);
reg &= 0xF << 10;
@@ -3819,7 +3819,7 @@ static u32 dbsc5_read_vref_training(struct udevice *dev)
best_vref_byte0_index = 0;
best_dvw_min_byte0 = dvw_min_byte0_table[ch][0];
- for (i = 0; i <= vref_stop_index; i++) {
+ for (i = 0; i < vref_stop_index; i++) {
if (best_dvw_min_byte0 >= dvw_min_byte0_table[ch][i])
continue;
@@ -3858,7 +3858,7 @@ static u32 dbsc5_read_vref_training(struct udevice *dev)
vref_outlier = dbsc5_ddr_getval_slice(dev, ch, 0, PHY_RDLVL_VREF_OUTLIER);
best_upper_vref = best_vref_byte0;
outlier_cnt = vref_outlier;
- for (i = best_vref_byte0_index; i <= vref_stop_index; i++) {
+ for (i = best_vref_byte0_index; i < vref_stop_index; i++) {
if (dvw_min_byte0_table[ch][i] <= 0)
break;
@@ -3879,7 +3879,7 @@ static u32 dbsc5_read_vref_training(struct udevice *dev)
best_vref_byte1 = vref_start;
best_vref_byte1_index = 0;
best_dvw_min_byte1 = dvw_min_byte1_table[ch][0];
- for (i = 0; i <= vref_stop_index; i++) {
+ for (i = 0; i < vref_stop_index; i++) {
if (best_dvw_min_byte1 >= dvw_min_byte1_table[ch][i])
continue;
@@ -3918,7 +3918,7 @@ static u32 dbsc5_read_vref_training(struct udevice *dev)
vref_outlier = dbsc5_ddr_getval_slice(dev, ch, 1, PHY_RDLVL_VREF_OUTLIER);
best_upper_vref = best_vref_byte1;
outlier_cnt = vref_outlier;
- for (i = best_vref_byte1_index; i <= vref_stop_index; i++) {
+ for (i = best_vref_byte1_index; i < vref_stop_index; i++) {
if (dvw_min_byte1_table[ch][i] <= 0)
break;
diff --git a/drivers/remoteproc/k3_system_controller.c b/drivers/remoteproc/k3_system_controller.c
index 71238a6058a..e59c010de7e 100644
--- a/drivers/remoteproc/k3_system_controller.c
+++ b/drivers/remoteproc/k3_system_controller.c
@@ -327,7 +327,7 @@ static const struct k3_sysctrler_desc k3_sysctrler_am654_desc = {
static const struct udevice_id k3_sysctrler_ids[] = {
{
- .compatible = "ti,am654-system-controller",
+ .compatible = "ti,am654-tisci-rproc-r5",
.data = (ulong)&k3_sysctrler_am654_desc,
},
{}
diff --git a/drivers/rng/rockchip_rng.c b/drivers/rng/rockchip_rng.c
index d854ea90044..8cf750e043c 100644
--- a/drivers/rng/rockchip_rng.c
+++ b/drivers/rng/rockchip_rng.c
@@ -394,6 +394,10 @@ static const struct udevice_id rockchip_rng_match[] = {
.data = (ulong)&rk_trngv1_soc_data,
},
{
+ .compatible = "rockchip,rk3576-rng",
+ .data = (ulong)&rkrng_soc_data,
+ },
+ {
.compatible = "rockchip,rkrng",
.data = (ulong)&rkrng_soc_data,
},
diff --git a/drivers/serial/serial_efi.c b/drivers/serial/serial_efi.c
index 5733eaaf9d4..d3cd4de34a2 100644
--- a/drivers/serial/serial_efi.c
+++ b/drivers/serial/serial_efi.c
@@ -33,7 +33,7 @@ int serial_efi_setbrg(struct udevice *dev, int baudrate)
static int serial_efi_get_key(struct serial_efi_priv *priv)
{
- int ret;
+ efi_status_t ret;
if (priv->have_key)
return 0;
diff --git a/drivers/soc/soc_xilinx_zynqmp.c b/drivers/soc/soc_xilinx_zynqmp.c
index 0c45c781fef..4b69ff3de13 100644
--- a/drivers/soc/soc_xilinx_zynqmp.c
+++ b/drivers/soc/soc_xilinx_zynqmp.c
@@ -63,7 +63,7 @@ static const struct zynqmp_device zynqmp_devices[] = {
{
.id = 0x04688093,
.device = 1,
- .variants = ZYNQMP_VARIANT_EG,
+ .variants = ZYNQMP_VARIANT_EG | ZYNQMP_VARIANT_CG,
},
{
.id = 0x04689093,
diff --git a/drivers/spi/atmel-quadspi.c b/drivers/spi/atmel-quadspi.c
index 8aa7a83aef4..b2b96e1c4b9 100644
--- a/drivers/spi/atmel-quadspi.c
+++ b/drivers/spi/atmel-quadspi.c
@@ -615,7 +615,8 @@ static int atmel_qspi_set_cfg(struct atmel_qspi *aq,
static int atmel_qspi_transfer(struct atmel_qspi *aq,
const struct spi_mem_op *op, u32 offset)
{
- u32 sr, imr;
+ u32 imr, val = 0;
+ unsigned long timeout;
/* Skip to the final steps if there is no data */
if (op->data.nbytes) {
@@ -636,8 +637,16 @@ static int atmel_qspi_transfer(struct atmel_qspi *aq,
/* Poll INSTruction End and Chip Select Rise flags. */
imr = QSPI_SR_INSTRE | QSPI_SR_CSR;
- return readl_poll_timeout(aq->regs + QSPI_SR, sr, (sr & imr) == imr,
- ATMEL_QSPI_TIMEOUT);
+
+ timeout = timer_get_us() + ATMEL_QSPI_TIMEOUT;
+ while (1) {
+ val |= readl(aq->regs + QSPI_SR) & imr;
+ if ((val & imr) == imr)
+ return 0;
+
+ if (time_after(timer_get_us(), timeout))
+ return -ETIMEDOUT;
+ }
}
static int atmel_qspi_sama7g5_set_cfg(struct atmel_qspi *aq,
diff --git a/drivers/spi/exynos_spi.c b/drivers/spi/exynos_spi.c
index 1b9bf004b7c..7f2965f8321 100644
--- a/drivers/spi/exynos_spi.c
+++ b/drivers/spi/exynos_spi.c
@@ -105,14 +105,10 @@ static int spi_rx_tx(struct exynos_spi_priv *priv, int todo,
uint out_bytes, in_bytes;
int toread;
unsigned start = get_timer(0);
- int stopping;
int step;
out_bytes = in_bytes = todo;
- stopping = priv->skip_preamble && (flags & SPI_XFER_END) &&
- !(priv->mode & SPI_SLAVE);
-
/*
* Try to transfer words if we can. This helps read performance at
* SPI clock speeds above about 20MHz.
@@ -161,12 +157,10 @@ static int spi_rx_tx(struct exynos_spi_priv *priv, int todo,
while (rx_lvl >= step) {
temp = readl(&regs->rx_data);
if (priv->skip_preamble) {
- if (temp == SPI_PREAMBLE_END_BYTE) {
+ if (temp == SPI_PREAMBLE_END_BYTE)
priv->skip_preamble = 0;
- stopping = 0;
- }
} else {
- if (rxp || stopping) {
+ if (rxp) {
if (step == 4)
*(uint32_t *)rxp = temp;
else
diff --git a/drivers/usb/cdns3/gadget.c b/drivers/usb/cdns3/gadget.c
index a30c40ef80e..9eaf7e40ab6 100644
--- a/drivers/usb/cdns3/gadget.c
+++ b/drivers/usb/cdns3/gadget.c
@@ -557,10 +557,10 @@ static void cdns3_wa2_remove_old_request(struct cdns3_endpoint *priv_ep)
trace_cdns3_wa2(priv_ep, "removes eldest request");
+ list_del_init(&priv_req->list);
kfree(priv_req->request.buf);
cdns3_gadget_ep_free_request(&priv_ep->endpoint,
&priv_req->request);
- list_del_init(&priv_req->list);
--priv_ep->wa2_counter;
if (!chain)
@@ -1959,10 +1959,10 @@ static int cdns3_gadget_ep_disable(struct usb_ep *ep)
while (!list_empty(&priv_ep->wa2_descmiss_req_list)) {
priv_req = cdns3_next_priv_request(&priv_ep->wa2_descmiss_req_list);
+ list_del_init(&priv_req->list);
kfree(priv_req->request.buf);
cdns3_gadget_ep_free_request(&priv_ep->endpoint,
&priv_req->request);
- list_del_init(&priv_req->list);
--priv_ep->wa2_counter;
}
diff --git a/drivers/usb/common/dwc2_core.c b/drivers/usb/common/dwc2_core.c
index 63062d5cc94..37007134e5b 100644
--- a/drivers/usb/common/dwc2_core.c
+++ b/drivers/usb/common/dwc2_core.c
@@ -17,7 +17,7 @@ int dwc2_core_reset(struct dwc2_core_regs *regs)
bool host_mode = false;
if (!(readl(&regs->global_regs.gotgctl) & GOTGCTL_CONID_B) ||
- (readl(&regs->global_regs.gusbcfg) & GUSBCFG_FORCEDEVMODE))
+ (readl(&regs->global_regs.gusbcfg) & GUSBCFG_FORCEHOSTMODE))
host_mode = true;
/* Core Soft Reset */
diff --git a/drivers/usb/dwc3/dwc3-generic.c b/drivers/usb/dwc3/dwc3-generic.c
index 3cda2b74b7e..c09014aec60 100644
--- a/drivers/usb/dwc3/dwc3-generic.c
+++ b/drivers/usb/dwc3/dwc3-generic.c
@@ -698,7 +698,9 @@ static const struct udevice_id dwc3_glue_ids[] = {
{ .compatible = "ti,am654-dwc3" },
{ .compatible = "rockchip,rk3328-dwc3", .data = (ulong)&rk_ops },
{ .compatible = "rockchip,rk3399-dwc3" },
+ { .compatible = "rockchip,rk3528-dwc3", .data = (ulong)&rk_ops },
{ .compatible = "rockchip,rk3568-dwc3", .data = (ulong)&rk_ops },
+ { .compatible = "rockchip,rk3576-dwc3", .data = (ulong)&rk_ops },
{ .compatible = "rockchip,rk3588-dwc3", .data = (ulong)&rk_ops },
{ .compatible = "qcom,dwc3", .data = (ulong)&qcom_ops },
{ .compatible = "fsl,imx8mp-dwc3", .data = (ulong)&imx8mp_ops },
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c
index 531f0b522af..c656cbe25ce 100644
--- a/drivers/usb/dwc3/ep0.c
+++ b/drivers/usb/dwc3/ep0.c
@@ -380,7 +380,7 @@ static int dwc3_ep0_handle_status(struct dwc3 *dwc,
dep = dwc->eps[0];
dwc->ep0_usb_req.dep = dep;
dwc->ep0_usb_req.request.length = sizeof(*response_pkt);
- dwc->ep0_usb_req.request.buf = (void *)dwc->setup_buf_addr;
+ dwc->ep0_usb_req.request.buf = (void *)(uintptr_t)dwc->setup_buf_addr;
dwc->ep0_usb_req.request.complete = dwc3_ep0_status_cmpl;
return __dwc3_gadget_ep0_queue(dep, &dwc->ep0_usb_req);
@@ -662,7 +662,7 @@ static int dwc3_ep0_set_sel(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl)
dep = dwc->eps[0];
dwc->ep0_usb_req.dep = dep;
dwc->ep0_usb_req.request.length = dep->endpoint.maxpacket;
- dwc->ep0_usb_req.request.buf = (void *)dwc->setup_buf_addr;
+ dwc->ep0_usb_req.request.buf = (void *)(uintptr_t)dwc->setup_buf_addr;
dwc->ep0_usb_req.request.complete = dwc3_ep0_set_sel_cmpl;
return __dwc3_gadget_ep0_queue(dep, &dwc->ep0_usb_req);
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig
index 46a83141481..0121f9872ae 100644
--- a/drivers/usb/gadget/Kconfig
+++ b/drivers/usb/gadget/Kconfig
@@ -86,6 +86,7 @@ config USB_GADGET_PRODUCT_NUM
default 0x350a if ROCKCHIP_RK3568
default 0x350b if ROCKCHIP_RK3588
default 0x350c if ROCKCHIP_RK3528
+ default 0x350e if ROCKCHIP_RK3576
default 0x0
help
Product ID of the USB device emulated, reported to the host device.
@@ -201,12 +202,13 @@ config USB_FUNCTION_MASS_STORAGE
the eMMC/SD card content to HOST PC so it can be mounted.
config USB_FUNCTION_ROCKUSB
- bool "Enable USB rockusb gadget"
- help
- Rockusb protocol is widely used by Rockchip SoC based devices. It can
- read/write info, image to/from devices. This enables the USB part of
- the rockusb gadget.for more detail about Rockusb protocol, please see
- doc/README.rockusb
+ bool "Enable USB rockusb gadget"
+ depends on ARCH_ROCKCHIP
+ help
+ Rockusb protocol is widely used by Rockchip SoC based devices. It can
+ read/write info, image to/from devices. This enables the USB part of
+ the rockusb gadget.for more detail about Rockusb protocol, please see
+ doc/README.rockusb
config USB_FUNCTION_SDP
bool "Enable USB SDP (Serial Download Protocol)"
diff --git a/drivers/usb/host/dwc3-of-simple.c b/drivers/usb/host/dwc3-of-simple.c
index d52e7d22d1a..362178b7900 100644
--- a/drivers/usb/host/dwc3-of-simple.c
+++ b/drivers/usb/host/dwc3-of-simple.c
@@ -91,6 +91,7 @@ static int dwc3_of_simple_remove(struct udevice *dev)
static const struct udevice_id dwc3_of_simple_ids[] = {
{ .compatible = "amlogic,meson-gxl-dwc3" },
{ .compatible = "rockchip,rk3399-dwc3" },
+ { .compatible = "samsung,exynos850-dwusb3" },
{ .compatible = "ti,dwc3" },
{ }
};
diff --git a/drivers/usb/host/ehci-mx6.c b/drivers/usb/host/ehci-mx6.c
index a8748cef7ad..25907f22612 100644
--- a/drivers/usb/host/ehci-mx6.c
+++ b/drivers/usb/host/ehci-mx6.c
@@ -537,7 +537,7 @@ static int ehci_usb_phy_mode(struct udevice *dev)
plat->init_type = USB_INIT_DEVICE;
else
plat->init_type = USB_INIT_HOST;
- } else if (is_mx7() || is_imx8mm() || is_imx8mn() || is_imx93()) {
+ } else if (is_mx7() || is_imx8mm() || is_imx8mn() || is_imx9()) {
phy_status = (void __iomem *)(addr +
USBNC_PHY_STATUS_OFFSET);
val = readl(phy_status);