summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYe Li <ye.li@nxp.com>2016-03-16 13:50:54 +0800
committerYe Li <ye.li@nxp.com>2020-04-26 23:24:26 -0700
commit078634b12912fd12bf603004eb206b74af7ccaf7 (patch)
tree463cb63a905a9bc5d863b374fa0958291ca99197
parent84ef4dfb0faa623f975cf4abc051808bc0f518a9 (diff)
MLK-12483-4 mx6: Modify drivers to disable fused modules
Add the fuse checking in drivers, when the module is disabled in fuse, the driver will not work. Changed drivers: BEE, GPMI, APBH-DMA, ESDHC, FEC, QSPI, ECSPI, I2C, USB-EHCI, GIS, LCDIF and EPDC. Signed-off-by: Ye Li <ye.li@nxp.com> (cherry picked from commit 1704e116f9b39aeb99201919a18bc2b1e19a980e) (cherry picked from commit 2d3b5df8530cd5ef883750378838dea7c40259af) (cherry picked from commit 6e8c9ae136bee8ec0121c1db4b935510caad09db) (cherry picked from commit 99b54a6965904a879afdb6883a519de726cb4e96)
-rw-r--r--arch/arm/mach-imx/mx6/bee.c14
-rw-r--r--drivers/dma/apbh_dma.c8
-rw-r--r--drivers/i2c/mxc_i2c.c18
-rw-r--r--drivers/mmc/fsl_esdhc_imx.c17
-rw-r--r--drivers/mtd/nand/raw/mxs_nand.c7
-rw-r--r--drivers/net/fec_mxc.c15
-rw-r--r--drivers/spi/fsl_qspi.c8
-rw-r--r--drivers/spi/mxc_spi.c10
-rw-r--r--drivers/usb/host/ehci-mx6.c15
-rw-r--r--drivers/video/mxc_epdc_fb.c20
-rw-r--r--drivers/video/mxc_gis.c16
-rw-r--r--drivers/video/mxsfb.c11
12 files changed, 150 insertions, 9 deletions
diff --git a/arch/arm/mach-imx/mx6/bee.c b/arch/arm/mach-imx/mx6/bee.c
index f3651e5049..0cd4ed436d 100644
--- a/arch/arm/mach-imx/mx6/bee.c
+++ b/arch/arm/mach-imx/mx6/bee.c
@@ -269,7 +269,7 @@ static int region_valid(u32 start, u32 size)
static int do_bee_init(cmd_tbl_t *cmdtp, int flag, int argc,
char * const argv[])
{
- u32 start, size, val;
+ u32 start, size;
int ret;
struct bee_parameters *p = &para;
@@ -282,14 +282,12 @@ static int do_bee_init(cmd_tbl_t *cmdtp, int flag, int argc,
if (argc > 5)
return CMD_RET_USAGE;
- if (fuse_read(0, 4, &val)) {
- puts("Can not get fuse bank 0, word 4\n");
- } else {
- if (val & (1 << 25)) {
- puts("BEE disabed in fuse!\n");
- return CMD_RET_FAILURE;
- }
+#ifdef CONFIG_MX6
+ if (check_module_fused(MX6_MODULE_BEE)) {
+ printf("BEE is fused, disable it!\n");
+ return CMD_RET_FAILURE;
}
+#endif
/* Cache enabled? */
if ((get_cr() & (CR_I | CR_C)) != (CR_I | CR_C)) {
diff --git a/drivers/dma/apbh_dma.c b/drivers/dma/apbh_dma.c
index 992ac942a0..285c07af58 100644
--- a/drivers/dma/apbh_dma.c
+++ b/drivers/dma/apbh_dma.c
@@ -576,6 +576,14 @@ void mxs_dma_init(void)
struct mxs_apbh_regs *apbh_regs =
(struct mxs_apbh_regs *)MXS_APBH_BASE;
+#ifdef CONFIG_MX6
+ if (check_module_fused(MX6_MODULE_APBHDMA)) {
+ printf("NAND APBH-DMA@0x%x is fused, disable it\n",
+ MXS_APBH_BASE);
+ return;
+ }
+#endif
+
mxs_reset_block(&apbh_regs->hw_apbh_ctrl0_reg);
#ifdef CONFIG_APBH_DMA_BURST8
diff --git a/drivers/i2c/mxc_i2c.c b/drivers/i2c/mxc_i2c.c
index a03c465c8f..c00f5901e7 100644
--- a/drivers/i2c/mxc_i2c.c
+++ b/drivers/i2c/mxc_i2c.c
@@ -5,6 +5,8 @@
* (c) 2007 Pengutronix, Sascha Hauer <s.hauer@pengutronix.de>
* (c) 2011 Marek Vasut <marek.vasut@gmail.com>
*
+ * Copyright (C) 2016 Freescale Semiconductor, Inc.
+ *
* Based on i2c-imx.c from linux kernel:
* Copyright (C) 2005 Torsten Koschorrek <koschorrek at synertronixx.de>
* Copyright (C) 2005 Matthias Blaschke <blaschke at synertronixx.de>
@@ -25,6 +27,7 @@
#include <dm.h>
#include <dm/pinctrl.h>
#include <fdtdec.h>
+#include <asm/arch/sys_proto.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -747,6 +750,14 @@ void bus_i2c_init(int index, int speed, int unused,
return;
}
+#ifdef CONFIG_MX6
+ if (mx6_i2c_fused((u32)mxc_i2c_buses[index].base)) {
+ printf("I2C@0x%x is fused, disable it\n",
+ (u32)mxc_i2c_buses[index].base);
+ return;
+ }
+#endif
+
/*
* Warning: Be careful to allow the assignment to a static
* variable here. This function could be called while U-Boot is
@@ -892,6 +903,13 @@ static int mxc_i2c_probe(struct udevice *bus)
if (addr == FDT_ADDR_T_NONE)
return -EINVAL;
+#ifdef CONFIG_MX6
+ if (mx6_i2c_fused(addr)) {
+ printf("I2C@0x%lx is fused, disable it\n", addr);
+ return -ENODEV;
+ }
+#endif
+
i2c_bus->base = addr;
i2c_bus->index = bus->seq;
i2c_bus->bus = bus;
diff --git a/drivers/mmc/fsl_esdhc_imx.c b/drivers/mmc/fsl_esdhc_imx.c
index 5555a86617..b99fcacd70 100644
--- a/drivers/mmc/fsl_esdhc_imx.c
+++ b/drivers/mmc/fsl_esdhc_imx.c
@@ -29,6 +29,7 @@
#include <dm.h>
#include <asm-generic/gpio.h>
#include <dm/pinctrl.h>
+#include <asm/arch/sys_proto.h>
#if !CONFIG_IS_ENABLED(BLK)
#include "mmc_private.h"
@@ -1324,6 +1325,14 @@ int fsl_esdhc_initialize(bd_t *bis, struct fsl_esdhc_cfg *cfg)
return ret;
}
+#ifdef CONFIG_MX6
+ if (mx6_esdhc_fused(cfg->esdhc_base)) {
+ printf("ESDHC@0x%lx is fused, disable it\n", cfg->esdhc_base);
+ free(priv);
+ return -ENODEV;
+ }
+#endif
+
ret = fsl_esdhc_init(priv, plat);
if (ret) {
debug("%s init failure\n", __func__);
@@ -1406,6 +1415,14 @@ static int fsl_esdhc_probe(struct udevice *dev)
addr = dev_read_addr(dev);
if (addr == FDT_ADDR_T_NONE)
return -EINVAL;
+
+#ifdef CONFIG_MX6
+ if (mx6_esdhc_fused(addr)) {
+ printf("ESDHC@0x%lx is fused, disable it\n", addr);
+ return -ENODEV;
+ }
+#endif
+
priv->esdhc_regs = (struct fsl_esdhc *)addr;
priv->dev = dev;
priv->mode = -1;
diff --git a/drivers/mtd/nand/raw/mxs_nand.c b/drivers/mtd/nand/raw/mxs_nand.c
index b93882e4f5..11cfe3b7a4 100644
--- a/drivers/mtd/nand/raw/mxs_nand.c
+++ b/drivers/mtd/nand/raw/mxs_nand.c
@@ -1243,6 +1243,13 @@ static int mxs_nand_init_dma(struct mxs_nand_info *info)
{
int i = 0, j, ret = 0;
+#ifdef CONFIG_MX6
+ if (check_module_fused(MX6_MODULE_GPMI)) {
+ printf("NAND GPMI@0x%x is fused, disable it\n", (u32)info->gpmi_regs);
+ return -EPERM;
+ }
+#endif
+
info->desc = malloc(sizeof(struct mxs_dma_desc *) *
MXS_NAND_DMA_DESCRIPTOR_COUNT);
if (!info->desc) {
diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c
index a4d268f0a1..d00df87a47 100644
--- a/drivers/net/fec_mxc.c
+++ b/drivers/net/fec_mxc.c
@@ -28,6 +28,7 @@
#include "fec_mxc.h"
#include <eth_phy.h>
+#include <asm/arch/sys_proto.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -1198,6 +1199,13 @@ int fecmxc_initialize_multi(bd_t *bd, int dev_id, int phy_id, uint32_t addr)
#endif
int ret;
+#ifdef CONFIG_MX6
+ if (mx6_enet_fused(addr)) {
+ printf("Ethernet@0x%x is fused, disable it\n", addr);
+ return -2;
+ }
+#endif
+
#ifdef CONFIG_FEC_MXC_MDIO_BASE
/*
* The i.MX28 has two ethernet interfaces, but they are not equal.
@@ -1337,6 +1345,13 @@ static int fecmxc_probe(struct udevice *dev)
uint32_t start;
int ret;
+#ifdef CONFIG_MX6
+ if (mx6_enet_fused((uint32_t)priv->eth)) {
+ printf("Ethernet@0x%x is fused, disable it\n", (uint32_t)priv->eth);
+ return -ENODEV;
+ }
+#endif
+
if (IS_ENABLED(CONFIG_IMX8)) {
struct clk clk_2x_txclk;
ret = clk_get_by_name(dev, "ipg", &priv->ipg_clk);
diff --git a/drivers/spi/fsl_qspi.c b/drivers/spi/fsl_qspi.c
index ac0ae63415..3e799ba337 100644
--- a/drivers/spi/fsl_qspi.c
+++ b/drivers/spi/fsl_qspi.c
@@ -16,6 +16,7 @@
#include <watchdog.h>
#include <wait_bit.h>
#include "fsl_qspi.h"
+#include <asm/arch/sys_proto.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -961,6 +962,13 @@ static int fsl_qspi_probe(struct udevice *bus)
struct dm_spi_bus *dm_spi_bus;
int i, ret;
+#ifdef CONFIG_MX6
+ if (mx6_qspi_fused(plat->reg_base)) {
+ printf("QSPI@0x%lx is fused, disable it\n", plat->reg_base);
+ return -ENODEV;
+ }
+#endif
+
dm_spi_bus = bus->uclass_priv;
dm_spi_bus->max_hz = plat->speed_hz;
diff --git a/drivers/spi/mxc_spi.c b/drivers/spi/mxc_spi.c
index 4d1317c364..c244f00037 100644
--- a/drivers/spi/mxc_spi.c
+++ b/drivers/spi/mxc_spi.c
@@ -1,6 +1,8 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (C) 2008, Guennadi Liakhovetski <lg@denx.de>
+ * Copyright (C) 2016 Freescale Semiconductor, Inc.
+ *
*/
#include <common.h>
@@ -14,6 +16,7 @@
#include <asm/arch/imx-regs.h>
#include <asm/arch/clock.h>
#include <asm/mach-imx/spi.h>
+#include <asm/arch/sys_proto.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -466,6 +469,13 @@ struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
return NULL;
}
+#ifdef CONFIG_MX6
+ if (mx6_ecspi_fused(spi_bases[bus])) {
+ printf("ECSPI@0x%lx is fused, disable it\n", spi_bases[bus]);
+ return NULL;
+ }
+#endif
+
mxcs = spi_alloc_slave(struct mxc_spi_slave, bus, cs);
if (!mxcs) {
puts("mxc_spi: SPI Slave not allocated !\n");
diff --git a/drivers/usb/host/ehci-mx6.c b/drivers/usb/host/ehci-mx6.c
index 352dc1fd49..1ba2e73af1 100644
--- a/drivers/usb/host/ehci-mx6.c
+++ b/drivers/usb/host/ehci-mx6.c
@@ -21,6 +21,7 @@
#include <asm/mach-types.h>
#include <power/regulator.h>
#include <linux/usb/otg.h>
+#include <asm/arch/sys_proto.h>
#include "ehci.h"
#if CONFIG_IS_ENABLED(POWER_DOMAIN)
@@ -484,6 +485,13 @@ int ehci_hcd_init(int index, enum usb_init_type init,
if (index > 3)
return -EINVAL;
+#if defined(CONFIG_MX6)
+ if (mx6_usb_fused((u32)ehci)) {
+ printf("USB@0x%x is fused, disable it\n", (u32)ehci);
+ return -ENODEV;
+ }
+#endif
+
ret = ehci_mx6_common_init(ehci, index);
if (ret)
return ret;
@@ -759,6 +767,13 @@ static int ehci_usb_probe(struct udevice *dev)
struct ehci_hcor *hcor;
int ret;
+#if defined(CONFIG_MX6)
+ if (mx6_usb_fused((u32)ehci)) {
+ printf("USB@0x%x is fused, disable it\n", (u32)ehci);
+ return -ENODEV;
+ }
+#endif
+
priv->ehci = ehci;
priv->portnr = dev->req_seq;
diff --git a/drivers/video/mxc_epdc_fb.c b/drivers/video/mxc_epdc_fb.c
index ef86c148cb..631b4ae7c5 100644
--- a/drivers/video/mxc_epdc_fb.c
+++ b/drivers/video/mxc_epdc_fb.c
@@ -16,6 +16,7 @@
#include <mxc_epdc_fb.h>
#include <cpu_func.h>
+#include <asm/arch/sys_proto.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -350,6 +351,12 @@ static void draw_splash_screen(void)
void lcd_enable(void)
{
+#ifdef CONFIG_MX6
+ if (check_module_fused(MX6_MODULE_EPDC)) {
+ return;
+ }
+#endif
+
if (board_setup_logo_file(lcd_base)) {
debug("Load logo failed!\n");
return;
@@ -367,6 +374,12 @@ void lcd_enable(void)
void lcd_disable(void)
{
+#ifdef CONFIG_MX6
+ if (check_module_fused(MX6_MODULE_EPDC)) {
+ return;
+ }
+#endif
+
debug("lcd_disable\n");
/* Disable clocks to EPDC */
@@ -382,6 +395,13 @@ void lcd_ctrl_init(void *lcdbase)
{
unsigned int val;
+#ifdef CONFIG_MX6
+ if (check_module_fused(MX6_MODULE_EPDC)) {
+ printf("EPDC@0x%x is fused, disable it\n", EPDC_BASE_ADDR);
+ return;
+ }
+#endif
+
/*
* We rely on lcdbase being a physical address, i.e., either MMU off,
* or 1-to-1 mapping. Might want to add some virt2phys here.
diff --git a/drivers/video/mxc_gis.c b/drivers/video/mxc_gis.c
index 415e1dcb21..ffaf929b59 100644
--- a/drivers/video/mxc_gis.c
+++ b/drivers/video/mxc_gis.c
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/*
- * Copyright (C) 2014 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright (C) 2014-2016 Freescale Semiconductor, Inc. All Rights Reserved.
*
*/
@@ -301,6 +301,20 @@ void mxc_enable_gis(void)
u32 csimemsize, pxpmemsize;
char const *gis_input = env_get("gis");
+#ifdef CONFIG_MX6
+ if (check_module_fused(MX6_MODULE_CSI)) {
+ printf("CSI@0x%x is fused, disable it\n", CSI1_BASE_ADDR);
+ return;
+ }
+#endif
+
+#ifdef CONFIG_MX6
+ if (check_module_fused(MX6_MODULE_PXP)) {
+ printf("PXP@0x%x is fused, disable it\n", PXP_BASE_ADDR);
+ return;
+ }
+#endif
+
gis_regs = (struct mxs_gis_regs *)GIS_BASE_ADDR;
pxp_regs = (struct mxs_pxp_regs *)PXP_BASE_ADDR;
csi_regs = (struct mxs_csi_regs *)CSI1_BASE_ADDR;
diff --git a/drivers/video/mxsfb.c b/drivers/video/mxsfb.c
index a8014ed89a..cf01ee6589 100644
--- a/drivers/video/mxsfb.c
+++ b/drivers/video/mxsfb.c
@@ -181,6 +181,11 @@ static int mxs_remove_common(phys_addr_t reg_base, u32 fb)
struct mxs_lcdif_regs *regs = (struct mxs_lcdif_regs *)(reg_base);
int timeout = 1000000;
+#ifdef CONFIG_MX6
+ if (check_module_fused(MX6_MODULE_LCDIF))
+ return -ENODEV;
+#endif
+
if (!fb)
return -EINVAL;
@@ -267,6 +272,12 @@ void *video_hw_init(void)
bpp = depth;
}
+#ifdef CONFIG_MX6
+ if (check_module_fused(MX6_MODULE_LCDIF)) {
+ printf("LCDIF@0x%x is fused, disable it\n", MXS_LCDIF_BASE);
+ return NULL;
+ }
+#endif
/* fill in Graphic device struct */
sprintf(panel.modeIdent, "%dx%dx%d", mode.xres, mode.yres, bpp);