summaryrefslogtreecommitdiffstats
path: root/arch/arm/boards/protonic-imx6/board.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/boards/protonic-imx6/board.c')
-rw-r--r--arch/arm/boards/protonic-imx6/board.c339
1 files changed, 241 insertions, 98 deletions
diff --git a/arch/arm/boards/protonic-imx6/board.c b/arch/arm/boards/protonic-imx6/board.c
index 9b2a00c6c3..9e62dc1544 100644
--- a/arch/arm/boards/protonic-imx6/board.c
+++ b/arch/arm/boards/protonic-imx6/board.c
@@ -4,23 +4,27 @@
// SPDX-FileCopyrightText: 2020 Oleksij Rempel, Pengutronix
#include <bbu.h>
+#include <boot.h>
+#include <bootm.h>
#include <common.h>
#include <deep-probe.h>
#include <environment.h>
#include <fcntl.h>
+#include <globalvar.h>
#include <gpio.h>
#include <i2c/i2c.h>
-#include <mach/bbu.h>
-#include <mach/imx6.h>
+#include <mach/imx/bbu.h>
+#include <mach/imx/imx6.h>
+#include <mach/imx/ocotp-fusemap.h>
#include <mfd/imx6q-iomuxc-gpr.h>
#include <mfd/syscon.h>
#include <net.h>
#include <of_device.h>
-#include <regmap.h>
+#include <linux/regmap.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <unistd.h>
-#include <usb/usb.h>
+#include <linux/usb/usb.h>
#define GPIO_HW_REV_ID {\
{IMX_GPIO_NR(2, 8), GPIOF_DIR_IN | GPIOF_ACTIVE_LOW, "rev_id0"}, \
@@ -74,19 +78,19 @@ struct prt_machine_data {
unsigned int i2c_addr;
unsigned int i2c_adapter;
unsigned int emmc_usdhc;
+ unsigned int sd_usdhc;
unsigned int flags;
int (*init)(struct prt_imx6_priv *priv);
};
struct prt_imx6_priv {
- struct device_d *dev;
+ struct device *dev;
const struct prt_machine_data *dcfg;
unsigned int hw_id;
unsigned int hw_rev;
const char *name;
- struct poller_async poller;
- unsigned int usb_delay;
unsigned int no_usb_check;
+ char *ocotp_serial;
};
struct prti6q_rfid_contents {
@@ -123,11 +127,27 @@ static const struct gpio prt_imx6_kvg_gpios[] = {
},
};
+static int prt_of_fixup_hwrev(struct prt_imx6_priv *priv)
+{
+ const char *compat;
+ char *buf;
+
+ compat = of_device_get_match_compatible(priv->dev);
+
+ buf = xasprintf("%s-m%u-r%u", compat, priv->hw_id,
+ priv->hw_rev);
+ barebox_set_of_machine_compatible(buf);
+
+ free(buf);
+
+ return 0;
+}
+
static int prt_imx6_read_rfid(struct prt_imx6_priv *priv, void *buf,
size_t size)
{
const struct prt_machine_data *dcfg = priv->dcfg;
- struct device_d *dev = priv->dev;
+ struct device *dev = priv->dev;
struct i2c_client cl;
int ret;
@@ -167,7 +187,7 @@ static u8 prt_imx6_calc_rfid_cs(void *buf, size_t size)
static int prt_imx6_set_mac(struct prt_imx6_priv *priv,
struct prti6q_rfid_contents *rfid)
{
- struct device_d *dev = priv->dev;
+ struct device *dev = priv->dev;
struct device_node *node;
node = of_find_node_by_alias(of_get_root_node(), "ethernet0");
@@ -180,10 +200,7 @@ static int prt_imx6_set_mac(struct prt_imx6_priv *priv,
return 0;
if (!is_valid_ether_addr(&rfid->mac[0])) {
- unsigned char ethaddr_str[sizeof("xx:xx:xx:xx:xx:xx")];
-
- ethaddr_to_string(&rfid->mac[0], ethaddr_str);
- dev_err(dev, "bad MAC addr: %s\n", ethaddr_str);
+ dev_err(dev, "bad MAC addr: %pM\n", &rfid->mac[0]);
return -EILSEQ;
}
@@ -193,37 +210,18 @@ static int prt_imx6_set_mac(struct prt_imx6_priv *priv,
return 0;
}
-static int prt_of_fixup_serial(struct device_node *dstroot, void *arg)
-{
- struct device_node *srcroot = arg;
- const char *ser;
- int len;
-
- ser = of_get_property(srcroot, "serial-number", &len);
- return of_set_property(dstroot, "serial-number", ser, len, 1);
-}
-
-static void prt_oftree_fixup_serial(const char *serial)
-{
- struct device_node *root = of_get_root_node();
-
- of_set_property(root, "serial-number", serial, strlen(serial) + 1, 1);
- of_register_fixup(prt_of_fixup_serial, root);
-}
-
-static int prt_imx6_set_serial(struct prt_imx6_priv *priv,
- struct prti6q_rfid_contents *rfid)
+static int prt_imx6_set_serial(struct prt_imx6_priv *priv, char *serial)
{
- rfid->serial[9] = 0; /* Failsafe */
- dev_info(priv->dev, "Serial number: %s\n", rfid->serial);
- prt_oftree_fixup_serial(rfid->serial);
+ serial[9] = 0; /* Failsafe */
+ dev_info(priv->dev, "Serial number: %s\n", serial);
+ barebox_set_serial_number(serial);
return 0;
}
static int prt_imx6_read_i2c_mac_serial(struct prt_imx6_priv *priv)
{
- struct device_d *dev = priv->dev;
+ struct device *dev = priv->dev;
struct prti6q_rfid_contents rfid;
int ret;
@@ -240,16 +238,60 @@ static int prt_imx6_read_i2c_mac_serial(struct prt_imx6_priv *priv)
if (ret)
return ret;
- ret = prt_imx6_set_serial(priv, &rfid);
+ ret = prt_imx6_set_serial(priv, rfid.serial);
if (ret)
return ret;
return 0;
}
-static int prt_imx6_usb_mount(struct prt_imx6_priv *priv, char **usbdisk)
+#define PRT_IMX6_GP1_FMT_DEC BIT(31)
+
+static int prt_imx6_read_ocotp_serial(struct prt_imx6_priv *priv)
{
- struct device_d *dev = priv->dev;
+ int ret;
+ unsigned val;
+
+ ret = imx_ocotp_read_field(OCOTP_GP1, &val);
+ if (ret) {
+ dev_err(priv->dev, "Failed to read ocotp serial (%i)\n", ret);
+ return ret;
+ }
+
+ if (!(val & PRT_IMX6_GP1_FMT_DEC))
+ return -EINVAL;
+ val &= PRT_IMX6_GP1_FMT_DEC - 1;
+
+ priv->ocotp_serial = xasprintf("%u", val);
+
+ return prt_imx6_set_serial(priv, priv->ocotp_serial);
+}
+
+static int prt_imx6_set_ocotp_serial(struct param_d *param, void *driver_priv)
+{
+ struct prt_imx6_priv *priv = driver_priv;
+ int ret;
+ unsigned val;
+
+ ret = kstrtouint(priv->ocotp_serial, 10, &val);
+ if (ret)
+ return ret;
+
+ if (val & PRT_IMX6_GP1_FMT_DEC)
+ return -ERANGE;
+ val |= PRT_IMX6_GP1_FMT_DEC;
+
+ ret = imx_ocotp_write_field(OCOTP_GP1, val);
+ if (ret)
+ return ret;
+
+ barebox_set_serial_number(priv->ocotp_serial);
+ return 0;
+}
+
+static int prt_imx6_usb_mount(struct prt_imx6_priv *priv)
+{
+ struct device *dev = priv->dev;
const char *path;
struct stat s;
int ret;
@@ -266,8 +308,6 @@ static int prt_imx6_usb_mount(struct prt_imx6_priv *priv, char **usbdisk)
ret = mount(path, NULL, "usb", NULL);
if (ret)
goto exit_usb_mount;
-
- *usbdisk = strdup("disk0.0");
return 0;
}
@@ -277,8 +317,6 @@ static int prt_imx6_usb_mount(struct prt_imx6_priv *priv, char **usbdisk)
ret = mount(path, NULL, "usb", NULL);
if (ret)
goto exit_usb_mount;
-
- *usbdisk = strdup("disk0");
return 0;
}
@@ -289,25 +327,21 @@ exit_usb_mount:
#define OTG_PORTSC1 (MX6_OTG_BASE_ADDR+0x184)
-static void prt_imx6_check_usb_boot(void *data)
+static int prt_imx6_usb_boot(struct bootentry *entry, int verbose, int dryrun)
{
- struct prt_imx6_priv *priv = data;
- struct device_d *dev = priv->dev;
- char *second_word, *bootsrc, *usbdisk;
+ struct prt_imx6_priv *priv = prt_priv;
+ struct device *dev = priv->dev;
+ char *second_word;
char buf[sizeof("vicut1q recovery")] = {};
- unsigned int v;
+ struct bootm_data bootm_data = {};
ssize_t size;
int fd, ret;
- v = readl(OTG_PORTSC1);
- if ((v & 0x0c00) == 0) /* LS == SE0 ==> nothing connected */
- return;
-
usb_rescan();
- ret = prt_imx6_usb_mount(priv, &usbdisk);
+ ret = prt_imx6_usb_mount(priv);
if (ret)
- return;
+ return ret;
fd = open("/usb/boot_target", O_RDONLY);
if (fd < 0) {
@@ -346,37 +380,91 @@ static void prt_imx6_check_usb_boot(void *data)
goto exit_usb_boot;
}
+ bootm_data_init_defaults(&bootm_data);
+
second_word++;
if (strncmp(second_word, "usb", 3) == 0) {
- bootsrc = "usb";
+ dev_info(dev, "Booting from USB drive\n");
+ bootm_data.os_file = "/usb/linuximage.fit";
} else if (strncmp(second_word, "recovery", 8) == 0) {
- bootsrc = "recovery";
+ dev_info(dev, "Booting internal recovery OS\n");
+ bootm_data.os_file = "/dev/mmc2.5";
} else {
dev_err(dev, "Unknown boot target!\n");
ret = -ENODEV;
goto exit_usb_boot;
}
- dev_info(dev, "detected valid usb boot target file, overwriting boot to: %s\n", bootsrc);
- ret = setenv("global.boot.default", bootsrc);
+ ret = globalvar_add_simple("linux.bootargs.root",
+ "root=/dev/ram rw rootwait ramdisk_size=196608");
+ if (ret)
+ goto exit_usb_boot;
+
+ if (verbose)
+ bootm_data.verbose = verbose;
+ if (dryrun)
+ bootm_data.dryrun = dryrun;
+
+ ret = bootm_boot(&bootm_data);
if (ret)
goto exit_usb_boot;
- free(usbdisk);
- return;
+ return 0;
exit_usb_boot:
dev_err(dev, "Failed to run usb boot: %s\n", strerror(-ret));
- free(usbdisk);
- return;
+ return ret;
+}
+
+static void prt_imx6_bootentry_release(struct bootentry *entry)
+{
+ free(entry);
+}
+
+static int prt_imx6_bootentry_create(struct bootentries *bootentries, const char *name)
+{
+ struct bootentry *entry;
+
+ entry = xzalloc(sizeof(*entry));
+ if (!entry)
+ return -ENOMEM;
+
+ entry->me.type = MENU_ENTRY_NORMAL;
+ entry->release = prt_imx6_bootentry_release;
+ entry->boot = prt_imx6_usb_boot;
+ entry->title = xstrdup(name);
+ entry->description = xstrdup("Boot FIT image of a USB drive");
+ bootentries_add_entry(bootentries, entry);
+
+ return 0;
+}
+
+static int prt_imx6_bootentry_provider(struct bootentries *bootentries,
+ const char *name)
+{
+ int found = 0;
+ unsigned int v;
+
+ if (strncmp(name, "prt-usb", 7))
+ return found;
+
+ v = readl(OTG_PORTSC1);
+ if ((v & 0x0c00) == 0) /* No usb device detected */
+ return found;
+
+ if (!prt_imx6_bootentry_create(bootentries, name))
+ found = 1;
+
+ return found;
}
static int prt_imx6_env_init(struct prt_imx6_priv *priv)
{
const struct prt_machine_data *dcfg = priv->dcfg;
- struct device_d *dev = priv->dev;
- char *delay, *bootsrc;
+ struct device *dev = priv->dev;
+ char *delay, *bootsrc, *boot_targets;
+ unsigned int autoboot_timeout;
int ret;
ret = setenv("global.linux.bootargs.base", "consoleblank=0 vt.color=0x00");
@@ -387,13 +475,14 @@ static int prt_imx6_env_init(struct prt_imx6_priv *priv)
set_autoboot_state(AUTOBOOT_BOOT);
} else {
if (dcfg->flags & PRT_IMX6_USB_LONG_DELAY)
- priv->usb_delay = 4;
+ autoboot_timeout = 4;
else
- priv->usb_delay = 1;
+ autoboot_timeout = 1;
/* the usb_delay value is used for poller_call_async() */
- delay = basprintf("%d", priv->usb_delay);
+ delay = basprintf("%d", autoboot_timeout);
ret = setenv("global.autoboot_timeout", delay);
+ free(delay);
if (ret)
goto exit_env_init;
}
@@ -403,7 +492,13 @@ static int prt_imx6_env_init(struct prt_imx6_priv *priv)
else
bootsrc = "mmc2";
- ret = setenv("global.boot.default", bootsrc);
+ if (!priv->no_usb_check)
+ boot_targets = xasprintf("prt-usb %s", bootsrc);
+ else
+ boot_targets = xstrdup(bootsrc);
+
+ ret = setenv("global.boot.default", boot_targets);
+ free(boot_targets);
if (ret)
goto exit_env_init;
@@ -432,7 +527,7 @@ static int prt_imx6_bbu(struct prt_imx6_priv *priv)
emmc_flags = BBU_HANDLER_FLAG_DEFAULT;
}
- devicefile = basprintf("mmc%d", dcfg->emmc_usdhc);
+ devicefile = basprintf("/dev/mmc%d", dcfg->emmc_usdhc);
if (!devicefile) {
ret = -ENOMEM;
goto exit_bbu;
@@ -442,6 +537,16 @@ static int prt_imx6_bbu(struct prt_imx6_priv *priv)
if (ret)
goto exit_bbu;
+ devicefile = basprintf("/dev/mmc%d", dcfg->sd_usdhc);
+ if (!devicefile) {
+ ret = -ENOMEM;
+ goto exit_bbu;
+ }
+
+ ret = imx6_bbu_internal_mmc_register_handler("SD", devicefile, 0);
+ if (ret)
+ goto exit_bbu;
+
return 0;
exit_bbu:
dev_err(priv->dev, "Failed to register bbu: %pe\n", ERR_PTR(ret));
@@ -451,7 +556,8 @@ exit_bbu:
static int prt_imx6_devices_init(void)
{
struct prt_imx6_priv *priv = prt_priv;
- int ret;
+ struct device *ocotp_dev;
+ struct param_d *p;
if (!priv)
return 0;
@@ -461,19 +567,26 @@ static int prt_imx6_devices_init(void)
prt_imx6_bbu(priv);
- prt_imx6_read_i2c_mac_serial(priv);
+ /*
+ * Read serial number from fuses. On success we'll assume the imx_ocotp
+ * driver takes care of providing the mac address if needed. On
+ * failure we'll fallback to reading and setting serial and mac from an
+ * attached RFID eeprom.
+ */
+ if (prt_imx6_read_ocotp_serial(priv) != 0)
+ prt_imx6_read_i2c_mac_serial(priv);
+
+ bootentry_register_provider(prt_imx6_bootentry_provider);
prt_imx6_env_init(priv);
- if (!priv->no_usb_check) {
- ret = poller_async_register(&priv->poller, "usb-boot");
- if (ret) {
- dev_err(priv->dev, "can't setup poller\n");
- return ret;
- }
-
- poller_call_async(&priv->poller, priv->usb_delay * SECOND,
- &prt_imx6_check_usb_boot, priv);
+ ocotp_dev = get_device_by_name("ocotp0");
+ if (ocotp_dev) {
+ p = dev_add_param_string(ocotp_dev, "serial_number",
+ prt_imx6_set_ocotp_serial, NULL,
+ &priv->ocotp_serial, priv);
+ if (IS_ERR(p))
+ return PTR_ERR(p);
}
return 0;
@@ -499,7 +612,7 @@ static int prt_imx6_yaco_set_kvg_power_mode(struct prt_imx6_priv *priv,
const char *serial)
{
static const char command[] = "{\"command\":\"mode\",\"value\":\"kvg\",\"on2\":true}";
- struct device_d *dev = priv->dev;
+ struct device *dev = priv->dev;
struct console_device *yccon;
int ret;
@@ -643,6 +756,18 @@ static int prt_imx6_init_prtvt7(struct prt_imx6_priv *priv)
return 0;
}
+static int prt_imx6_init_prtwd3(struct prt_imx6_priv *priv)
+{
+ void __iomem *iomux = (void *)MX6_IOMUXC_BASE_ADDR;
+ uint32_t val;
+
+ val = readl(iomux + IOMUXC_GPR1);
+ val |= IMX6Q_GPR1_ENET_CLK_SEL_ANATOP;
+ writel(val, iomux + IOMUXC_GPR1);
+
+ return 0;
+}
+
static int prt_imx6_rfid_fixup(struct prt_imx6_priv *priv,
struct device_node *root)
{
@@ -660,24 +785,22 @@ static int prt_imx6_rfid_fixup(struct prt_imx6_priv *priv,
}
i2c_node = of_find_node_by_alias(root, alias);
+ kfree(alias);
if (!i2c_node) {
dev_err(priv->dev, "Unsupported i2c adapter\n");
- ret = -ENODEV;
- goto free_alias;
+ return -ENODEV;
}
eeprom_node_name = basprintf("/eeprom@%x", dcfg->i2c_addr);
if (!eeprom_node_name) {
- ret = -ENOMEM;
- goto free_alias;
+ return -ENOMEM;
}
node = of_create_node(i2c_node, eeprom_node_name);
if (!node) {
dev_err(priv->dev, "Failed to create node %s\n",
eeprom_node_name);
- ret = -ENOMEM;
- goto free_eeprom;
+ return -ENOMEM;
}
ret = of_property_write_string(node, "compatible", "atmel,24c256");
@@ -701,8 +824,6 @@ static int prt_imx6_rfid_fixup(struct prt_imx6_priv *priv,
return 0;
free_eeprom:
kfree(eeprom_node_name);
-free_alias:
- kfree(alias);
exit_error:
dev_err(priv->dev, "Failed to apply fixup: %pe\n", ERR_PTR(ret));
return ret;
@@ -736,7 +857,7 @@ static int prt_imx6_get_id(struct prt_imx6_priv *priv)
struct device_node *gpio_np = NULL;
int ret;
- gpio_np = of_find_node_by_name(NULL, "gpio@20a0000");
+ gpio_np = of_find_node_by_name_address(NULL, "gpio@20a0000");
if (!gpio_np)
return -ENODEV;
@@ -790,10 +911,9 @@ exit_get_dcfg:
return ret;
}
-static int prt_imx6_probe(struct device_d *dev)
+static int prt_imx6_probe(struct device *dev)
{
struct prt_imx6_priv *priv;
- const char *name, *ptr;
struct param_d *p;
int ret;
@@ -802,9 +922,7 @@ static int prt_imx6_probe(struct device_d *dev)
return -ENOMEM;
priv->dev = dev;
- name = of_device_get_match_compatible(priv->dev);
- ptr = strchr(name, ',');
- priv->name = ptr ? ptr + 1 : name;
+ priv->name = of_get_machine_compatible();
pr_info("Detected machine type: %s\n", priv->name);
@@ -814,6 +932,7 @@ static int prt_imx6_probe(struct device_d *dev)
pr_info(" HW type: %d\n", priv->hw_id);
pr_info(" HW revision: %d\n", priv->hw_rev);
+ prt_of_fixup_hwrev(priv);
ret = prt_imx6_get_dcfg(priv);
if (ret)
@@ -850,6 +969,7 @@ static const struct prt_machine_data prt_imx6_cfg_alti6p[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.flags = PRT_IMX6_BOOTSRC_EMMC,
}, {
.hw_id = UINT_MAX
@@ -863,6 +983,7 @@ static const struct prt_machine_data prt_imx6_cfg_victgo[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.init = prt_imx6_init_victgo,
.flags = PRT_IMX6_BOOTSRC_SPI_NOR,
}, {
@@ -877,6 +998,7 @@ static const struct prt_machine_data prt_imx6_cfg_vicut1[] = {
.i2c_addr = 0x50,
.i2c_adapter = 1,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.flags = PRT_IMX6_BOOTSRC_SPI_NOR,
}, {
.hw_id = HW_TYPE_VICUT1,
@@ -884,6 +1006,7 @@ static const struct prt_machine_data prt_imx6_cfg_vicut1[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.init = prt_imx6_init_kvg_yaco,
.flags = PRT_IMX6_BOOTSRC_SPI_NOR,
}, {
@@ -892,6 +1015,7 @@ static const struct prt_machine_data prt_imx6_cfg_vicut1[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.init = prt_imx6_init_kvg_new,
.flags = PRT_IMX6_BOOTSRC_SPI_NOR,
}, {
@@ -906,6 +1030,7 @@ static const struct prt_machine_data prt_imx6_cfg_vicut1q[] = {
.i2c_addr = 0x50,
.i2c_adapter = 1,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.flags = PRT_IMX6_BOOTSRC_SPI_NOR,
}, {
.hw_id = HW_TYPE_VICUT1,
@@ -913,6 +1038,7 @@ static const struct prt_machine_data prt_imx6_cfg_vicut1q[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.init = prt_imx6_init_kvg_yaco,
.flags = PRT_IMX6_BOOTSRC_SPI_NOR,
}, {
@@ -921,6 +1047,7 @@ static const struct prt_machine_data prt_imx6_cfg_vicut1q[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.init = prt_imx6_init_kvg_yaco,
.flags = PRT_IMX6_BOOTSRC_SPI_NOR,
}, {
@@ -929,6 +1056,7 @@ static const struct prt_machine_data prt_imx6_cfg_vicut1q[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.init = prt_imx6_init_kvg_new,
.flags = PRT_IMX6_BOOTSRC_SPI_NOR,
}, {
@@ -943,6 +1071,7 @@ static const struct prt_machine_data prt_imx6_cfg_vicutp[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.init = prt_imx6_init_kvg_new,
.flags = PRT_IMX6_BOOTSRC_SPI_NOR,
}, {
@@ -957,6 +1086,7 @@ static const struct prt_machine_data prt_imx6_cfg_lanmcu[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.flags = PRT_IMX6_BOOTSRC_EMMC | PRT_IMX6_BOOTCHOOSER,
}, {
.hw_id = UINT_MAX
@@ -970,6 +1100,7 @@ static const struct prt_machine_data prt_imx6_cfg_plybas[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.flags = PRT_IMX6_BOOTSRC_SPI_NOR | PRT_IMX6_USB_LONG_DELAY,
}, {
.hw_id = UINT_MAX
@@ -983,6 +1114,7 @@ static const struct prt_machine_data prt_imx6_cfg_plym2m[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.flags = PRT_IMX6_BOOTSRC_SPI_NOR | PRT_IMX6_USB_LONG_DELAY,
}, {
.hw_id = UINT_MAX
@@ -996,6 +1128,7 @@ static const struct prt_machine_data prt_imx6_cfg_prti6g[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 1,
+ .sd_usdhc = 0,
.init = prt_imx6_init_prti6g,
.flags = PRT_IMX6_BOOTSRC_EMMC | PRT_IMX6_BOOTCHOOSER,
}, {
@@ -1010,6 +1143,7 @@ static const struct prt_machine_data prt_imx6_cfg_prti6q[] = {
.i2c_addr = 0x51,
.i2c_adapter = 2,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.flags = PRT_IMX6_BOOTSRC_SPI_NOR,
}, {
.hw_id = HW_TYPE_PRTI6Q,
@@ -1017,6 +1151,7 @@ static const struct prt_machine_data prt_imx6_cfg_prti6q[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.flags = PRT_IMX6_BOOTSRC_SPI_NOR,
}, {
.hw_id = UINT_MAX
@@ -1030,6 +1165,7 @@ static const struct prt_machine_data prt_imx6_cfg_prtmvt[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.flags = PRT_IMX6_BOOTSRC_SPI_NOR,
}, {
.hw_id = UINT_MAX
@@ -1043,6 +1179,7 @@ static const struct prt_machine_data prt_imx6_cfg_prtrvt[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.flags = PRT_IMX6_BOOTSRC_SPI_NOR,
}, {
.hw_id = UINT_MAX
@@ -1056,6 +1193,7 @@ static const struct prt_machine_data prt_imx6_cfg_prtvt7[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.init = prt_imx6_init_prtvt7,
.flags = PRT_IMX6_BOOTSRC_EMMC | PRT_IMX6_BOOTCHOOSER |
PRT_IMX6_USB_LONG_DELAY,
@@ -1071,6 +1209,7 @@ static const struct prt_machine_data prt_imx6_cfg_prtwd2[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
.flags = PRT_IMX6_BOOTSRC_EMMC,
}, {
.hw_id = UINT_MAX
@@ -1084,6 +1223,8 @@ static const struct prt_machine_data prt_imx6_cfg_prtwd3[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 2,
+ .sd_usdhc = 0,
+ .init = prt_imx6_init_prtwd3,
.flags = PRT_IMX6_BOOTSRC_EMMC,
}, {
.hw_id = UINT_MAX
@@ -1097,6 +1238,7 @@ static const struct prt_machine_data prt_imx6_cfg_jozacp[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 0,
+ .sd_usdhc = 2,
.flags = PRT_IMX6_BOOTSRC_EMMC | PRT_IMX6_BOOTCHOOSER,
}, {
.hw_id = HW_TYPE_JOZACPP,
@@ -1104,6 +1246,7 @@ static const struct prt_machine_data prt_imx6_cfg_jozacp[] = {
.i2c_addr = 0x51,
.i2c_adapter = 0,
.emmc_usdhc = 0,
+ .sd_usdhc = 2,
.flags = PRT_IMX6_BOOTSRC_EMMC | PRT_IMX6_BOOTCHOOSER,
}, {
.hw_id = UINT_MAX
@@ -1116,7 +1259,7 @@ static const struct of_device_id prt_imx6_of_match[] = {
{ .compatible = "kvg,vicut1", .data = &prt_imx6_cfg_vicut1 },
{ .compatible = "kvg,vicut1q", .data = &prt_imx6_cfg_vicut1q },
{ .compatible = "kvg,vicutp", .data = &prt_imx6_cfg_vicutp },
- { .compatible = "lan,lanmcu", .data = &prt_imx6_cfg_lanmcu },
+ { .compatible = "vdl,lanmcu", .data = &prt_imx6_cfg_lanmcu },
{ .compatible = "ply,plybas", .data = &prt_imx6_cfg_plybas },
{ .compatible = "ply,plym2m", .data = &prt_imx6_cfg_plym2m },
{ .compatible = "prt,prti6g", .data = &prt_imx6_cfg_prti6g },
@@ -1131,7 +1274,7 @@ static const struct of_device_id prt_imx6_of_match[] = {
};
BAREBOX_DEEP_PROBE_ENABLE(prt_imx6_of_match);
-static struct driver_d prt_imx6_board_driver = {
+static struct driver prt_imx6_board_driver = {
.name = "board-protonic-imx6",
.probe = prt_imx6_probe,
.of_compatible = DRV_OF_COMPAT(prt_imx6_of_match),