* [PATCH v5 00/12] prepare Protonic board code for mainline @ 2020-08-20 7:34 Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 01/12] of: base: register DT root as device Oleksij Rempel ` (12 more replies) 0 siblings, 13 replies; 14+ messages in thread From: Oleksij Rempel @ 2020-08-20 7:34 UTC (permalink / raw) To: barebox, david; +Cc: Oleksij Rempel changes v5: - board: apply requested changes - add PHY and rs458 devicetree fixes for lanmcu and plym2m changes v4: - follow suggestion provided by Ahmad and open-code the root node registration and call it machine.of - board: rename crc and cs - board: ignore most of init related errors. Even if one part will fail, we should be able to get as mach as possible. changes v3: - remove barebox-serial driver and use read the rfid directy from board code (as was done in initial implementation) - use initcall instead of registering driver in the board code - add delayed USB scan - add rampoops node - add partition tables changes v2: - add power init support for KvG boards - spell fixes - do not print error on probe exit - add of_console_get_by_alias() helper - free requested gpio array - exit fec init only in case of PROBE_DEFERED This patch series is a preparation and actual Protonic board code. Following changes was made in the main code: - register DT root node as device to make it possible to loade board code as usual driver - provide helpers to read ethernet mac from nvmem cell register in a devicetree. - provide barebox-serial driver which should be a nvmem cell consumer and serial-number DT property provider. - provide gpio helper to read gpio based board revision. Oleksij Rempel (12): of: base: register DT root as device gpiolib: add gpio_array_to_id helper to get ID out of GPIO array common: console_common: add of_console_get_by_alias() helper of: of_device_get_match_compatible() helper ARM: protonic-imx6: port Protonic specific board code ARM: dts: unify barebox and barebox,env partitions for all Protonic boards ARM: dts: imx6q-prti6q: add pstore/ramoops node ARM: dts: protonic: lanmcu: add eMMC partition table ARM: dts: protonic: add fixed clock for the FEC node ARM: dts: protonic: lanmcu: use UART_CTS instead of GPIO based CTS ARM: dts: protonic: properly define PHY nodes on lanmcu and plym2m boards ARM: dts: protonic: lanmcu: add uart-has-rtscts to enable rs485 functionality arch/arm/boards/protonic-imx6/Makefile | 1 + arch/arm/boards/protonic-imx6/board.c | 1034 ++++++++++++++++++++++++ arch/arm/dts/imx6dl-lanmcu.dts | 50 +- arch/arm/dts/imx6dl-plym2m.dts | 51 +- arch/arm/dts/imx6dl-prtrvt.dts | 1 + arch/arm/dts/imx6q-prti6q.dts | 24 +- arch/arm/dts/imx6qdl-prti6q-nor.dtsi | 10 + arch/arm/dts/imx6qdl-prti6q.dtsi | 31 + arch/arm/dts/imx6qdl-vicut1.dtsi | 26 + common/console_common.c | 18 + drivers/gpio/gpiolib.c | 31 + drivers/of/base.c | 17 + drivers/of/device.c | 12 + include/console.h | 1 + include/gpio.h | 5 + include/of_device.h | 6 + 16 files changed, 1282 insertions(+), 36 deletions(-) create mode 100644 arch/arm/boards/protonic-imx6/board.c create mode 100644 arch/arm/dts/imx6qdl-prti6q-nor.dtsi -- 2.28.0 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5 01/12] of: base: register DT root as device 2020-08-20 7:34 [PATCH v5 00/12] prepare Protonic board code for mainline Oleksij Rempel @ 2020-08-20 7:34 ` Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 02/12] gpiolib: add gpio_array_to_id helper to get ID out of GPIO array Oleksij Rempel ` (11 subsequent siblings) 12 siblings, 0 replies; 14+ messages in thread From: Oleksij Rempel @ 2020-08-20 7:34 UTC (permalink / raw) To: barebox, david; +Cc: Oleksij Rempel A usual board file contains at least one of_machine_is_compatible(). Some of the have a rather long list with complicated version logic. To avoid own implementation for driver management, register the root node of device tree as platform device. So, the main platform bus can attach proper board driver. After this patch a typical board.c file can reuse existing driver infrastructure. After this patch, you will be able to see all registered board drivers with drvinfo as fallow: ... board-embest-riot board-protonic-imx6 machine ... With devinfo, you'll be able to get some board specific information, if this is implemented: barebox@Protonic PRTI6Q board:/ devinfo machine Driver: board-protonic-imx6 Bus: platform Parameters: boardid: 0 (type: uint32) boardrev: 1 (type: uint32) Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- drivers/of/base.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/drivers/of/base.c b/drivers/of/base.c index 2fc87528eb..222d72947e 100644 --- a/drivers/of/base.c +++ b/drivers/of/base.c @@ -2136,6 +2136,21 @@ static int of_probe_memory(void) } mem_initcall(of_probe_memory); +static void of_platform_device_create_root(struct device_node *np) +{ + struct device_d *dev; + int ret; + + dev = xzalloc(sizeof(*dev)); + dev->id = DEVICE_ID_SINGLE; + dev->device_node = np; + dev_set_name(dev, "machine"); + + ret = platform_device_register(dev); + if (ret) + free(dev); +} + int of_probe(void) { struct device_node *firmware; @@ -2153,6 +2168,8 @@ int of_probe(void) if (firmware) of_platform_populate(firmware, NULL, NULL); + of_platform_device_create_root(root_node); + of_clk_init(root_node, NULL); of_platform_populate(root_node, of_default_bus_match_table, NULL); -- 2.28.0 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5 02/12] gpiolib: add gpio_array_to_id helper to get ID out of GPIO array 2020-08-20 7:34 [PATCH v5 00/12] prepare Protonic board code for mainline Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 01/12] of: base: register DT root as device Oleksij Rempel @ 2020-08-20 7:34 ` Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 03/12] common: console_common: add of_console_get_by_alias() helper Oleksij Rempel ` (10 subsequent siblings) 12 siblings, 0 replies; 14+ messages in thread From: Oleksij Rempel @ 2020-08-20 7:34 UTC (permalink / raw) To: barebox, david; +Cc: Oleksij Rempel Some boards provide a board version and/or ID coded by pull-up/down resistors connected to the gpio pins (or pins which can be multiplexed at some point as gpio). In this case every one implements own gpio id reader function. To avoid it, provide the common helper function to extract a value out of provided gpio array. Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- drivers/gpio/gpiolib.c | 31 +++++++++++++++++++++++++++++++ include/gpio.h | 5 +++++ 2 files changed, 36 insertions(+) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 27674af54c..6088cadd8a 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -381,6 +381,37 @@ void gpio_free_array(const struct gpio *array, size_t num) } EXPORT_SYMBOL_GPL(gpio_free_array); +int gpio_array_to_id(const struct gpio *array, size_t num, u32 *val) +{ + u32 id = 0; + int ret, i; + + if (num > 32) + return -EOVERFLOW; + + ret = gpio_request_array(array, num); + if (ret) + return ret; + + /* Wait until logic level will be stable */ + udelay(5); + for (i = 0; i < num; i++) { + ret = gpio_is_active(array[i].gpio); + if (ret < 0) + goto free_array; + if (ret) + id |= 1UL << i; + } + + *val = id; + ret = 0; + +free_array: + gpio_free_array(array, num); + return ret; +} +EXPORT_SYMBOL(gpio_array_to_id); + static int gpiochip_find_base(int start, int ngpio) { int i; diff --git a/include/gpio.h b/include/gpio.h index 98c5b93ba2..81beb47309 100644 --- a/include/gpio.h +++ b/include/gpio.h @@ -145,6 +145,10 @@ static inline void gpio_free_array(const struct gpio *array, size_t num) /* GPIO can never have been requested */ WARN_ON(1); } +static inline int gpio_array_to_id(const struct gpio *array, size_t num, u32 *val) +{ + return -EINVAL; +} #else int gpio_request(unsigned gpio, const char *label); int gpio_find_by_name(const char *name); @@ -153,6 +157,7 @@ void gpio_free(unsigned gpio); int gpio_request_one(unsigned gpio, unsigned long flags, const char *label); int gpio_request_array(const struct gpio *array, size_t num); void gpio_free_array(const struct gpio *array, size_t num); +int gpio_array_to_id(const struct gpio *array, size_t num, u32 *val); #endif struct gpio_chip; -- 2.28.0 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5 03/12] common: console_common: add of_console_get_by_alias() helper 2020-08-20 7:34 [PATCH v5 00/12] prepare Protonic board code for mainline Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 01/12] of: base: register DT root as device Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 02/12] gpiolib: add gpio_array_to_id helper to get ID out of GPIO array Oleksij Rempel @ 2020-08-20 7:34 ` Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 04/12] of: of_device_get_match_compatible() helper Oleksij Rempel ` (9 subsequent siblings) 12 siblings, 0 replies; 14+ messages in thread From: Oleksij Rempel @ 2020-08-20 7:34 UTC (permalink / raw) To: barebox, david; +Cc: Oleksij Rempel Add helper function to get console device by devicetree alias Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- common/console_common.c | 18 ++++++++++++++++++ include/console.h | 1 + 2 files changed, 19 insertions(+) diff --git a/common/console_common.c b/common/console_common.c index a174c2deed..8cd57e623d 100644 --- a/common/console_common.c +++ b/common/console_common.c @@ -23,6 +23,7 @@ #include <environment.h> #include <globalvar.h> #include <magicvar.h> +#include <of.h> #include <password.h> #include <clock.h> #include <malloc.h> @@ -323,6 +324,23 @@ struct console_device *console_get_first_active(void) } EXPORT_SYMBOL(console_get_first_active); +struct console_device *of_console_get_by_alias(const char *alias) +{ + struct device_node *node; + struct device_d *dev; + + node = of_find_node_by_alias(NULL, alias); + if (!node) + return NULL; + + dev = of_find_device_by_node(node); + if (!dev) + return NULL; + + return console_get_by_dev(dev); +} +EXPORT_SYMBOL(of_console_get_by_alias); + #endif /* !CONFIG_CONSOLE_NONE */ int dprintf(int file, const char *fmt, ...) diff --git a/include/console.h b/include/console.h index 5b5c037026..a71d0da42e 100644 --- a/include/console.h +++ b/include/console.h @@ -87,6 +87,7 @@ int console_unregister(struct console_device *cdev); struct console_device *console_get_by_dev(struct device_d *dev); struct console_device *console_get_by_name(const char *name); +struct console_device *of_console_get_by_alias(const char *alias); extern struct list_head console_list; #define for_each_console(console) list_for_each_entry(console, &console_list, list) -- 2.28.0 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5 04/12] of: of_device_get_match_compatible() helper 2020-08-20 7:34 [PATCH v5 00/12] prepare Protonic board code for mainline Oleksij Rempel ` (2 preceding siblings ...) 2020-08-20 7:34 ` [PATCH v5 03/12] common: console_common: add of_console_get_by_alias() helper Oleksij Rempel @ 2020-08-20 7:34 ` Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 05/12] ARM: protonic-imx6: port Protonic specific board code Oleksij Rempel ` (8 subsequent siblings) 12 siblings, 0 replies; 14+ messages in thread From: Oleksij Rempel @ 2020-08-20 7:34 UTC (permalink / raw) To: barebox, david; +Cc: Oleksij Rempel Some times we need to know, against which compatible did the driver was registered. So, instead of coding it in the driver, add generic helper for all drivers. Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- drivers/of/device.c | 12 ++++++++++++ include/of_device.h | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/drivers/of/device.c b/drivers/of/device.c index 67a67bd565..b3f522e1fa 100644 --- a/drivers/of/device.c +++ b/drivers/of/device.c @@ -31,3 +31,15 @@ const void *of_device_get_match_data(const struct device_d *dev) return match->data; } EXPORT_SYMBOL(of_device_get_match_data); + +const char *of_device_get_match_compatible(const struct device_d *dev) +{ + const struct of_device_id *match; + + match = of_match_device(dev->driver->of_compatible, dev); + if (!match) + return NULL; + + return match->compatible; +} +EXPORT_SYMBOL(of_device_get_match_compatible); diff --git a/include/of_device.h b/include/of_device.h index 244f5fcbbb..cef6d5b5cc 100644 --- a/include/of_device.h +++ b/include/of_device.h @@ -22,6 +22,7 @@ static inline int of_driver_match_device(struct device_d *dev, } extern const void *of_device_get_match_data(const struct device_d *dev); +extern const char *of_device_get_match_compatible(const struct device_d *dev); #else /* CONFIG_OFTREE */ @@ -36,6 +37,11 @@ static inline const void *of_device_get_match_data(const struct device_d *dev) return NULL; } +static inline const char *of_device_get_match_compatible(const struct device_d *dev) +{ + return NULL; +} + static inline const struct of_device_id *__of_match_device( const struct of_device_id *matches, const struct device_d *dev) { -- 2.28.0 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5 05/12] ARM: protonic-imx6: port Protonic specific board code 2020-08-20 7:34 [PATCH v5 00/12] prepare Protonic board code for mainline Oleksij Rempel ` (3 preceding siblings ...) 2020-08-20 7:34 ` [PATCH v5 04/12] of: of_device_get_match_compatible() helper Oleksij Rempel @ 2020-08-20 7:34 ` Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 06/12] ARM: dts: unify barebox and barebox, env partitions for all Protonic boards Oleksij Rempel ` (7 subsequent siblings) 12 siblings, 0 replies; 14+ messages in thread From: Oleksij Rempel @ 2020-08-20 7:34 UTC (permalink / raw) To: barebox, david; +Cc: Oleksij Rempel Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- arch/arm/boards/protonic-imx6/Makefile | 1 + arch/arm/boards/protonic-imx6/board.c | 1034 ++++++++++++++++++++++++ 2 files changed, 1035 insertions(+) create mode 100644 arch/arm/boards/protonic-imx6/board.c diff --git a/arch/arm/boards/protonic-imx6/Makefile b/arch/arm/boards/protonic-imx6/Makefile index b08c4a93ca..01c7a259e9 100644 --- a/arch/arm/boards/protonic-imx6/Makefile +++ b/arch/arm/boards/protonic-imx6/Makefile @@ -1 +1,2 @@ +obj-y += board.o lwl-y += lowlevel.o diff --git a/arch/arm/boards/protonic-imx6/board.c b/arch/arm/boards/protonic-imx6/board.c new file mode 100644 index 0000000000..163d0e1b1a --- /dev/null +++ b/arch/arm/boards/protonic-imx6/board.c @@ -0,0 +1,1034 @@ +// SPDX-License-Identifier: GPL-2.0-only +// SPDX-FileCopyrightText: 2012 Steffen Trumtrar, Pengutronix +// SPDX-FileCopyrightText: 2014 Protonic Holland +// SPDX-FileCopyrightText: 2020 Oleksij Rempel, Pengutronix + +#include <bbu.h> +#include <common.h> +#include <environment.h> +#include <fcntl.h> +#include <gpio.h> +#include <i2c/i2c.h> +#include <mach/bbu.h> +#include <mach/imx6.h> +#include <net.h> +#include <of_device.h> +#include <sys/mount.h> +#include <sys/stat.h> +#include <unistd.h> +#include <usb/usb.h> + +#define GPIO_HW_REV_ID {\ + {IMX_GPIO_NR(2, 8), GPIOF_DIR_IN | GPIOF_ACTIVE_LOW, "rev_id0"}, \ + {IMX_GPIO_NR(2, 9), GPIOF_DIR_IN | GPIOF_ACTIVE_LOW, "rev_id1"}, \ + {IMX_GPIO_NR(2, 10), GPIOF_DIR_IN | GPIOF_ACTIVE_LOW, "rev_id2"} \ +} + +#define GPIO_HW_TYPE_ID {\ + {IMX_GPIO_NR(2, 11), GPIOF_DIR_IN | GPIOF_ACTIVE_LOW, "hw_id0"}, \ + {IMX_GPIO_NR(2, 12), GPIOF_DIR_IN | GPIOF_ACTIVE_LOW, "hw_id1"}, \ + {IMX_GPIO_NR(2, 13), GPIOF_DIR_IN | GPIOF_ACTIVE_LOW, "hw_id2"}, \ + {IMX_GPIO_NR(2, 14), GPIOF_DIR_IN | GPIOF_ACTIVE_LOW, "hw_id3"}, \ + {IMX_GPIO_NR(2, 15), GPIOF_DIR_IN | GPIOF_ACTIVE_LOW, "hw_id4"} \ +} + +enum { + HW_TYPE_PRTI6Q = 0, + HW_TYPE_PRTWD2 = 1, + HW_TYPE_ALTI6S = 2, + HW_TYPE_VICUT1 = 4, + HW_TYPE_ALTI6P = 6, + HW_TYPE_PRTMVT = 8, + HW_TYPE_PRTI6G = 10, + HW_TYPE_PRTRVT = 12, + HW_TYPE_VICUT2 = 16, + HW_TYPE_PLYM2M = 20, + HW_TYPE_PRTVT7 = 22, + HW_TYPE_LANMCU = 23, + HW_TYPE_PLYBAS = 24, + HW_TYPE_VICTGO = 28, +}; + +enum prt_imx6_kvg_pw_mode { + PW_MODE_KVG_WITH_YACO = 0, + PW_MODE_KVG_NEW = 1, + PW_MODE_KUBOTA = 2, +}; + +/* board specific flags */ +#define PRT_IMX6_BOOTCHOOSER BIT(3) +#define PRT_IMX6_USB_LONG_DELAY BIT(2) +#define PRT_IMX6_BOOTSRC_EMMC BIT(1) +#define PRT_IMX6_BOOTSRC_SPI_NOR BIT(0) + +static struct prt_imx6_priv *prt_priv; +struct prt_machine_data { + unsigned int hw_id; + unsigned int hw_rev; + unsigned int i2c_addr; + unsigned int i2c_adapter; + unsigned int flags; + int (*init)(struct prt_imx6_priv *priv); +}; + +struct prt_imx6_priv { + struct device_d *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; +}; + +struct prti6q_rfid_contents { + u8 mac[6]; + char serial[10]; + u8 cs; +} __attribute__ ((packed)); + +#define GPIO_DIP1_FB IMX_GPIO_NR(4, 18) +#define GPIO_FORCE_ON1 IMX_GPIO_NR(2, 30) +#define GPIO_ON1_CTRL IMX_GPIO_NR(4, 21) +#define GPIO_ON2_CTRL IMX_GPIO_NR(4, 22) + +static const struct gpio prt_imx6_kvg_gpios[] = { + { + .gpio = GPIO_DIP1_FB, + .flags = GPIOF_IN, + .label = "DIP1_FB", + }, + { + .gpio = GPIO_FORCE_ON1, + .flags = GPIOF_OUT_INIT_HIGH, + .label = "FORCE_ON1", + }, + { + .gpio = GPIO_ON1_CTRL, + .flags = GPIOF_IN, + .label = "ON1_CTRL", + }, + { + .gpio = GPIO_ON2_CTRL, + .flags = GPIOF_IN, + .label = "ON2_CTRL", + }, +}; + +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 i2c_client cl; + int ret; + + cl.addr = dcfg->i2c_addr; + cl.adapter = i2c_get_adapter(dcfg->i2c_adapter); + if (!cl.adapter) { + dev_err(dev, "i2c bus not found\n"); + return -ENODEV; + } + + /* 0x6000 user storage in the RFID tag */ + ret = i2c_read_reg(&cl, 0x6000 | I2C_ADDR_16_BIT, buf, size); + if (ret < 0) { + dev_err(dev, "Filed to read the RFID: %i\n", ret); + return ret; + } + + return 0; +} + +static u8 prt_imx6_calc_rfid_cs(void *buf, size_t size) +{ + unsigned int cs = 0; + u8 *dat = buf; + int t; + + for (t = 0; t < size - 1; t++) { + cs += dat[t]; + } + + cs ^= 0xff; + + return cs & 0xff; + +} + +static int prt_imx6_set_mac(struct prt_imx6_priv *priv, + struct prti6q_rfid_contents *rfid) +{ + struct device_d *dev = priv->dev; + struct device_node *node; + + node = of_find_node_by_alias(of_get_root_node(), "ethernet0"); + if (!node) { + dev_err(dev, "Cannot find FEC!\n"); + return -ENODEV; + } + + 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); + + return -EILSEQ; + } + + of_eth_register_ethaddr(node, &rfid->mac[0]); + + 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) +{ + rfid->serial[9] = 0; /* Failsafe */ + dev_info(priv->dev, "Serial number: %s\n", rfid->serial); + prt_oftree_fixup_serial(rfid->serial); + + return 0; +} + +static int prt_imx6_read_i2c_mac_serial(struct prt_imx6_priv *priv) +{ + struct device_d *dev = priv->dev; + struct prti6q_rfid_contents rfid; + int ret; + + ret = prt_imx6_read_rfid(priv, &rfid, sizeof(rfid)); + if (ret) + return ret; + + if (rfid.cs != prt_imx6_calc_rfid_cs(&rfid, sizeof(rfid))) { + dev_err(dev, "RFID: bad checksum!\n"); + return -EBADMSG; + } + + ret = prt_imx6_set_mac(priv, &rfid); + if (ret) + return ret; + + ret = prt_imx6_set_serial(priv, &rfid); + if (ret) + return ret; + + return 0; +} + +static int prt_imx6_usb_mount(struct prt_imx6_priv *priv, char **usbdisk) +{ + struct device_d *dev = priv->dev; + const char *path; + struct stat s; + int ret; + + ret = mkdir("/usb", 0); + if (ret) { + dev_err(dev, "Cannot mkdir /usb\n"); + return ret; + } + + path = "/dev/disk0.0"; + ret = stat(path, &s); + if (!ret) { + ret = mount(path, NULL, "usb", NULL); + if (ret) + goto exit_usb_mount; + + *usbdisk = strdup("disk0.0"); + return 0; + } + + path = "/dev/disk0"; + ret = stat(path, &s); + if (!ret) { + ret = mount(path, NULL, "usb", NULL); + if (ret) + goto exit_usb_mount; + + *usbdisk = strdup("disk0"); + return 0; + } + +exit_usb_mount: + dev_err(dev, "Filed to mount %s with error (%i)\n", path, ret); + return ret; +} + +#define OTG_PORTSC1 (MX6_OTG_BASE_ADDR+0x184) + +static void prt_imx6_check_usb_boot(void *data) +{ + struct prt_imx6_priv *priv = data; + struct device_d *dev = priv->dev; + char *second_word, *bootsrc, *usbdisk; + char buf[sizeof("vicut1q recovery")] = {}; + unsigned int v; + 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); + if (ret) + return; + + fd = open("/usb/boot_target", O_RDONLY); + if (fd < 0) { + dev_warn(dev, "Can't open /usb/boot_target file, continue with normal boot\n"); + ret = fd; + goto exit_usb_boot; + } + + size = read(fd, buf, sizeof(buf) - 1); + close(fd); + if (size < 0) { + ret = size; + goto exit_usb_boot; + } + + /* Length of "vicut1 usb", the shortest possible target. */ + if (size < strlen("vicut1 usb")) { + dev_err(dev, "Invalid boot target file!\n"); + ret = -EINVAL; + goto exit_usb_boot; + } + + second_word = strchr(buf, ' '); + if (!second_word) { + dev_err(dev, "Cant find boot target in the boot target file!\n"); + ret = -ENODEV; + goto exit_usb_boot; + } + + *second_word = 0; + + if (strcmp(buf, priv->name)) { + dev_err(dev, "Boot target for a different board! (got: %s expected: %s)\n", + buf, priv->name); + ret = -EINVAL; + goto exit_usb_boot; + } + + second_word++; + if (strncmp(second_word, "usb", 3) == 0) { + bootsrc = usbdisk; + } else if (strncmp(second_word, "recovery", 8) == 0) { + bootsrc = "recovery"; + } 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); + if (ret) + goto exit_usb_boot; + + free(usbdisk); + return; + +exit_usb_boot: + dev_err(dev, "Failed to run usb boot: %s\n", strerror(-ret)); + free(usbdisk); + + return; +} + +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; + int ret; + + ret = setenv("global.linux.bootargs.base", "consoleblank=0 vt.color=0x00"); + if (ret) + goto exit_env_init; + + if (dcfg->flags & PRT_IMX6_USB_LONG_DELAY) + priv->usb_delay = 4; + else + priv->usb_delay = 1; + + /* the usb_delay value is used for poller_call_async() */ + delay = basprintf("%d", priv->usb_delay); + ret = setenv("global.autoboot_timeout", delay); + if (ret) + goto exit_env_init; + + if (dcfg->flags & PRT_IMX6_BOOTCHOOSER) + bootsrc = "bootchooser"; + else + bootsrc = "mmc2"; + + ret = setenv("global.boot.default", bootsrc); + if (ret) + goto exit_env_init; + + dev_info(dev, "Board specific env init is done\n"); + return 0; + +exit_env_init: + dev_err(dev, "Failed to set env: %i\n", ret); + + return ret; +} + +static int prt_imx6_bbu(struct prt_imx6_priv *priv) +{ + const struct prt_machine_data *dcfg = priv->dcfg; + u32 emmc_flags = 0; + int ret; + + if (dcfg->flags & PRT_IMX6_BOOTSRC_SPI_NOR) { + ret = imx6_bbu_internal_spi_i2c_register_handler("SPI", "/dev/m25p0.barebox", + BBU_HANDLER_FLAG_DEFAULT); + if (ret) + goto exit_bbu; + } else { + emmc_flags = BBU_HANDLER_FLAG_DEFAULT; + } + + ret = imx6_bbu_internal_mmcboot_register_handler("eMMC", "/dev/mmc2", + emmc_flags); + if (ret) + goto exit_bbu; + + ret = imx6_bbu_internal_mmc_register_handler("SD", "/dev/mmc0", 0); + if (ret) + goto exit_bbu; + + return 0; +exit_bbu: + dev_err(priv->dev, "Failed to register bbu: %i\n", ret); + return ret; +} + +static int prt_imx6_devices_init(void) +{ + struct prt_imx6_priv *priv = prt_priv; + int ret; + + if (!priv) + return 0; + + if (priv->dcfg->init) + priv->dcfg->init(priv); + + prt_imx6_bbu(priv); + + prt_imx6_read_i2c_mac_serial(priv); + + prt_imx6_env_init(priv); + + 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); + + return 0; +} +late_initcall(prt_imx6_devices_init); + +static int prt_imx6_init_kvg_set_ctrl(struct prt_imx6_priv *priv, bool val) +{ + int ret; + + ret = gpio_direction_output(GPIO_ON1_CTRL, val); + if (ret) + return ret; + + ret = gpio_direction_output(GPIO_ON2_CTRL, val); + if (ret) + return ret; + + return 0; +} + +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 console_device *yccon; + int ret; + + yccon = of_console_get_by_alias(serial); + if (!yccon) { + dev_dbg(dev, "Cant find the %s node, try later\n", serial); + return -EPROBE_DEFER; + } + + ret = console_set_baudrate(yccon, 115200); + if (ret) + goto exit_yaco_set_kvg_power_mode; + + yccon->puts(yccon, command, sizeof(command)); + + dev_info(dev, "Send YaCO power init sequence to %s\n", serial); + return 0; + +exit_yaco_set_kvg_power_mode: + dev_err(dev, "Failed to set YaCO pw mode: %i", ret); + + return ret; +} + +static int prt_imx6_init_kvg_power(struct prt_imx6_priv *priv, + enum prt_imx6_kvg_pw_mode pw_mode) +{ + const char *mode; + int ret; + + ret = gpio_request_array(prt_imx6_kvg_gpios, + ARRAY_SIZE(prt_imx6_kvg_gpios)); + if (ret) + goto exit_init_kvg_vicut; + + mdelay(1); + + if (!gpio_get_value(GPIO_DIP1_FB)) + pw_mode = PW_MODE_KUBOTA; + + switch (pw_mode) { + case PW_MODE_KVG_WITH_YACO: + mode = "KVG (with YaCO)"; + + /* GPIO_ON1_CTRL and GPIO_ON2_CTRL are N.C. on the SoC for + * older revisions */ + + /* Inform YaCO of power mode */ + ret = prt_imx6_yaco_set_kvg_power_mode(priv, "serial0"); + break; + case PW_MODE_KVG_NEW: + mode = "KVG (new)"; + + ret = prt_imx6_init_kvg_set_ctrl(priv, true); + if (ret) + goto exit_init_kvg_vicut; + break; + case PW_MODE_KUBOTA: + mode = "Kubota"; + ret = prt_imx6_init_kvg_set_ctrl(priv, false); + if (ret) + goto exit_init_kvg_vicut; + break; + default: + ret = -ENODEV; + goto exit_init_kvg_vicut; + } + + dev_info(priv->dev, "Power mode: %s\n", mode); + + return 0; + +exit_init_kvg_vicut: + dev_err(priv->dev, "KvG power init failed: %i\n", ret); + + return ret; +} + +static int prt_imx6_init_victgo(struct prt_imx6_priv *priv) +{ + int ret = 0; + + /* Bit 1 of HW-REV is pulled low by 2k2, but must be high on some + * revisions + */ + if (priv->hw_rev & 2) { + ret = gpio_direction_output(IMX_GPIO_NR(2, 9), 1); + if (ret) { + dev_err(priv->dev, "Failed to set gpio up\n"); + return ret; + } + } + + return prt_imx6_init_kvg_power(priv, PW_MODE_KVG_NEW); +} + +static int prt_imx6_init_kvg_new(struct prt_imx6_priv *priv) +{ + return prt_imx6_init_kvg_power(priv, PW_MODE_KVG_NEW); +} + +static int prt_imx6_init_kvg_yaco(struct prt_imx6_priv *priv) +{ + return prt_imx6_init_kvg_power(priv, PW_MODE_KVG_WITH_YACO); +} + +static int prt_imx6_rfid_fixup(struct prt_imx6_priv *priv, + struct device_node *root) +{ + const struct prt_machine_data *dcfg = priv->dcfg; + struct device_node *node, *i2c_node; + char *eeprom_node_name, *alias; + int na, ns, len = 0; + int ret; + u8 *tmp; + + alias = basprintf("i2c%d", dcfg->i2c_adapter); + if (!alias) { + ret = -ENOMEM; + goto exit_error; + } + + i2c_node = of_find_node_by_alias(root, alias); + if (!i2c_node) { + dev_err(priv->dev, "Unsupported i2c adapter\n"); + ret = -ENODEV; + goto free_alias; + } + + eeprom_node_name = basprintf("/eeprom@%x", dcfg->i2c_addr); + if (!eeprom_node_name) { + ret = -ENOMEM; + goto free_alias; + } + + 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; + } + + ret = of_property_write_string(node, "compatible", "atmel,24c256"); + if (ret) + goto free_eeprom; + + na = of_n_addr_cells(node); + ns = of_n_size_cells(node); + tmp = xzalloc((na + ns) * 4); + + of_write_number(tmp + len, dcfg->i2c_addr, na); + len += na * 4; + of_write_number(tmp + len, 0, ns); + len += ns * 4; + + ret = of_set_property(node, "reg", tmp, len, 1); + kfree(tmp); + if (ret) + goto free_eeprom; + + return 0; +free_eeprom: + kfree(eeprom_node_name); +free_alias: + kfree(alias); +exit_error: + dev_err(priv->dev, "Failed to apply fixup: %i\n", ret); + return ret; +} + +static int prt_imx6_of_fixup(struct device_node *root, void *data) +{ + struct prt_imx6_priv *priv = data; + int ret; + + if (!root) { + dev_err(priv->dev, "Unable to find the root node\n"); + dump_stack(); + return -ENODEV; + } + + ret = prt_imx6_rfid_fixup(priv, root); + if (ret) + goto exit_of_fixups; + + return 0; +exit_of_fixups: + dev_err(priv->dev, "Failed to apply OF fixups: %i\n", ret); + return ret; +} + +static int prt_imx6_get_id(struct prt_imx6_priv *priv) +{ + struct gpio gpios_type[] = GPIO_HW_TYPE_ID; + struct gpio gpios_rev[] = GPIO_HW_REV_ID; + int ret; + + ret = gpio_array_to_id(gpios_type, ARRAY_SIZE(gpios_type), &priv->hw_id); + if (ret) + goto exit_get_id; + + ret = gpio_array_to_id(gpios_rev, ARRAY_SIZE(gpios_rev), &priv->hw_rev); + if (ret) + goto exit_get_id; + + return 0; +exit_get_id: + dev_err(priv->dev, "Failed to read gpio ID: %i\n", ret); + return ret; +} + +static int prt_imx6_get_dcfg(struct prt_imx6_priv *priv) +{ + const struct prt_machine_data *dcfg, *found = NULL; + int ret; + + dcfg = of_device_get_match_data(priv->dev); + if (!dcfg) { + ret = -EINVAL; + goto exit_get_dcfg; + } + + for (; dcfg->hw_id != UINT_MAX; dcfg++) { + if (dcfg->hw_id != priv->hw_id) + continue; + if (dcfg->hw_rev > priv->hw_rev) + break; + found = dcfg; + } + + if (!found) { + ret = -ENODEV; + goto exit_get_dcfg; + } + + priv->dcfg = found; + + return 0; +exit_get_dcfg: + dev_err(priv->dev, "Failed to get dcfg: %i\n", ret); + return ret; +} + +static int prt_imx6_probe(struct device_d *dev) +{ + struct prt_imx6_priv *priv; + const char *name, *ptr; + struct param_d *p; + int ret; + + priv = xzalloc(sizeof(*priv)); + if (!priv) + return -ENOMEM; + + priv->dev = dev; + name = of_device_get_match_compatible(priv->dev); + ptr = strchr(name, ','); + priv->name = ptr ? ptr + 1 : name; + + pr_info("Detected machine type: %s\n", priv->name); + + ret = prt_imx6_get_id(priv); + if (ret) + goto free_priv; + + pr_info(" HW type: %d\n", priv->hw_id); + pr_info(" HW revision: %d\n", priv->hw_rev); + + ret = prt_imx6_get_dcfg(priv); + if (ret) + goto free_priv; + + p = dev_add_param_uint32_ro(dev, "boardrev", &priv->hw_rev, "%u"); + if (IS_ERR(p)) { + ret = PTR_ERR(p); + goto free_priv; + } + + p = dev_add_param_uint32_ro(dev, "boardid", &priv->hw_id, "%u"); + if (IS_ERR(p)) { + ret = PTR_ERR(p); + goto free_priv; + } + + ret = prt_imx6_of_fixup(of_get_root_node(), priv); + if (ret) + goto free_priv; + + ret = of_register_fixup(prt_imx6_of_fixup, priv); + if (ret) { + dev_err(dev, "Failed to register fixup\n"); + goto free_priv; + } + + prt_priv = priv; + + return 0; +free_priv: + kfree(priv); + return ret; +} + +static const struct prt_machine_data prt_imx6_cfg_alti6p[] = { + { + .hw_id = HW_TYPE_ALTI6P, + .hw_rev = 0, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .flags = PRT_IMX6_BOOTSRC_EMMC, + }, { + .hw_id = UINT_MAX + }, +}; + +static const struct prt_machine_data prt_imx6_cfg_victgo[] = { + { + .hw_id = HW_TYPE_VICTGO, + .hw_rev = 0, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .init = prt_imx6_init_victgo, + .flags = PRT_IMX6_BOOTSRC_SPI_NOR, + }, { + .hw_id = UINT_MAX + }, +}; + +static const struct prt_machine_data prt_imx6_cfg_vicut1[] = { + { + .hw_id = HW_TYPE_VICUT1, + .hw_rev = 0, + .i2c_addr = 0x50, + .i2c_adapter = 1, + .flags = PRT_IMX6_BOOTSRC_SPI_NOR, + }, { + .hw_id = HW_TYPE_VICUT1, + .hw_rev = 1, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .init = prt_imx6_init_kvg_yaco, + .flags = PRT_IMX6_BOOTSRC_SPI_NOR, + }, { + .hw_id = HW_TYPE_VICUT2, + .hw_rev = 1, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .init = prt_imx6_init_kvg_new, + .flags = PRT_IMX6_BOOTSRC_SPI_NOR, + }, { + .hw_id = UINT_MAX + }, +}; + +static const struct prt_machine_data prt_imx6_cfg_vicut1q[] = { + { + .hw_id = HW_TYPE_VICUT1, + .hw_rev = 0, + .i2c_addr = 0x50, + .i2c_adapter = 1, + .flags = PRT_IMX6_BOOTSRC_SPI_NOR, + }, { + .hw_id = HW_TYPE_VICUT1, + .hw_rev = 1, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .init = prt_imx6_init_kvg_yaco, + .flags = PRT_IMX6_BOOTSRC_SPI_NOR, + }, { + .hw_id = HW_TYPE_VICUT2, + .hw_rev = 0, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .init = prt_imx6_init_kvg_yaco, + .flags = PRT_IMX6_BOOTSRC_SPI_NOR, + }, { + .hw_id = HW_TYPE_VICUT2, + .hw_rev = 1, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .init = prt_imx6_init_kvg_new, + .flags = PRT_IMX6_BOOTSRC_SPI_NOR, + }, { + .hw_id = UINT_MAX + }, +}; + +static const struct prt_machine_data prt_imx6_cfg_vicutp[] = { + { + .hw_id = HW_TYPE_VICUT2, + .hw_rev = 1, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .init = prt_imx6_init_kvg_new, + .flags = PRT_IMX6_BOOTSRC_SPI_NOR, + }, { + .hw_id = UINT_MAX + }, +}; + +static const struct prt_machine_data prt_imx6_cfg_lanmcu[] = { + { + .hw_id = HW_TYPE_LANMCU, + .hw_rev = 0, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .flags = PRT_IMX6_BOOTSRC_EMMC | PRT_IMX6_BOOTCHOOSER, + }, { + .hw_id = UINT_MAX + }, +}; + +static const struct prt_machine_data prt_imx6_cfg_plybas[] = { + { + .hw_id = HW_TYPE_PLYBAS, + .hw_rev = 0, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .flags = PRT_IMX6_BOOTSRC_SPI_NOR | PRT_IMX6_USB_LONG_DELAY, + }, { + .hw_id = UINT_MAX + }, +}; + +static const struct prt_machine_data prt_imx6_cfg_plym2m[] = { + { + .hw_id = HW_TYPE_PLYM2M, + .hw_rev = 0, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .flags = PRT_IMX6_BOOTSRC_SPI_NOR | PRT_IMX6_USB_LONG_DELAY, + }, { + .hw_id = UINT_MAX + }, +}; + +static const struct prt_machine_data prt_imx6_cfg_prti6g[] = { + { + .hw_id = HW_TYPE_PRTI6G, + .hw_rev = 0, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .flags = PRT_IMX6_BOOTSRC_EMMC, + }, { + .hw_id = UINT_MAX + }, +}; + +static const struct prt_machine_data prt_imx6_cfg_prti6q[] = { + { + .hw_id = HW_TYPE_PRTI6Q, + .hw_rev = 0, + .i2c_addr = 0x51, + .i2c_adapter = 2, + .flags = PRT_IMX6_BOOTSRC_SPI_NOR, + }, { + .hw_id = HW_TYPE_PRTI6Q, + .hw_rev = 1, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .flags = PRT_IMX6_BOOTSRC_SPI_NOR, + }, { + .hw_id = UINT_MAX + }, +}; + +static const struct prt_machine_data prt_imx6_cfg_prtmvt[] = { + { + .hw_id = HW_TYPE_PRTMVT, + .hw_rev = 0, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .flags = PRT_IMX6_BOOTSRC_SPI_NOR, + }, { + .hw_id = UINT_MAX + }, +}; + +static const struct prt_machine_data prt_imx6_cfg_prtrvt[] = { + { + .hw_id = HW_TYPE_PRTRVT, + .hw_rev = 0, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .flags = PRT_IMX6_BOOTSRC_SPI_NOR, + }, { + .hw_id = UINT_MAX + }, +}; + +static const struct prt_machine_data prt_imx6_cfg_prtvt7[] = { + { + .hw_id = HW_TYPE_PRTVT7, + .hw_rev = 0, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .flags = PRT_IMX6_BOOTSRC_EMMC | PRT_IMX6_BOOTCHOOSER, + }, { + .hw_id = UINT_MAX + }, +}; + +static const struct prt_machine_data prt_imx6_cfg_prtwd2[] = { + { + .hw_id = HW_TYPE_PRTWD2, + .hw_rev = 0, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .flags = PRT_IMX6_BOOTSRC_EMMC, + }, { + .hw_id = UINT_MAX + }, +}; + +static const struct prt_machine_data prt_imx6_cfg_prtwd3[] = { + { + .hw_id = HW_TYPE_PRTWD2, + .hw_rev = 2, + .i2c_addr = 0x51, + .i2c_adapter = 0, + .flags = PRT_IMX6_BOOTSRC_EMMC, + }, { + .hw_id = UINT_MAX + }, +}; + +static const struct of_device_id prt_imx6_of_match[] = { + { .compatible = "alt,alti6p", .data = &prt_imx6_cfg_alti6p }, + { .compatible = "kvg,victgo", .data = &prt_imx6_cfg_victgo }, + { .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 = "ply,plybas", .data = &prt_imx6_cfg_plybas }, + { .compatible = "ply,plym2m", .data = &prt_imx6_cfg_plym2m }, + { .compatible = "prt,prti6g", .data = &prt_imx6_cfg_prti6g }, + { .compatible = "prt,prti6q", .data = &prt_imx6_cfg_prti6q }, + { .compatible = "prt,prtmvt", .data = &prt_imx6_cfg_prtmvt }, + { .compatible = "prt,prtrvt", .data = &prt_imx6_cfg_prtrvt }, + { .compatible = "prt,prtvt7", .data = &prt_imx6_cfg_prtvt7 }, + { .compatible = "prt,prtwd2", .data = &prt_imx6_cfg_prtwd2 }, + { .compatible = "prt,prtwd3", .data = &prt_imx6_cfg_prtwd3 }, + { /* sentinel */ }, +}; + +static struct driver_d prt_imx6_board_driver = { + .name = "board-protonic-imx6", + .probe = prt_imx6_probe, + .of_compatible = DRV_OF_COMPAT(prt_imx6_of_match), +}; +postcore_platform_driver(prt_imx6_board_driver); -- 2.28.0 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5 06/12] ARM: dts: unify barebox and barebox, env partitions for all Protonic boards 2020-08-20 7:34 [PATCH v5 00/12] prepare Protonic board code for mainline Oleksij Rempel ` (4 preceding siblings ...) 2020-08-20 7:34 ` [PATCH v5 05/12] ARM: protonic-imx6: port Protonic specific board code Oleksij Rempel @ 2020-08-20 7:34 ` Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 07/12] ARM: dts: imx6q-prti6q: add pstore/ramoops node Oleksij Rempel ` (6 subsequent siblings) 12 siblings, 0 replies; 14+ messages in thread From: Oleksij Rempel @ 2020-08-20 7:34 UTC (permalink / raw) To: barebox, david; +Cc: Oleksij Rempel Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- arch/arm/dts/imx6dl-plym2m.dts | 25 +++++++++++++++++++++++++ arch/arm/dts/imx6dl-prtrvt.dts | 1 + arch/arm/dts/imx6q-prti6q.dts | 24 +----------------------- arch/arm/dts/imx6qdl-prti6q-nor.dtsi | 10 ++++++++++ arch/arm/dts/imx6qdl-prti6q.dtsi | 20 ++++++++++++++++++++ arch/arm/dts/imx6qdl-vicut1.dtsi | 26 ++++++++++++++++++++++++++ 6 files changed, 83 insertions(+), 23 deletions(-) create mode 100644 arch/arm/dts/imx6qdl-prti6q-nor.dtsi diff --git a/arch/arm/dts/imx6dl-plym2m.dts b/arch/arm/dts/imx6dl-plym2m.dts index b66321fb46..335cb6f342 100644 --- a/arch/arm/dts/imx6dl-plym2m.dts +++ b/arch/arm/dts/imx6dl-plym2m.dts @@ -6,6 +6,7 @@ /dts-v1/; #include <arm/imx6dl.dtsi> #include "imx6qdl-prti6q.dtsi" +#include "imx6qdl-prti6q-nor.dtsi" / { model = "Plymovent M2M board"; @@ -28,6 +29,20 @@ }; }; +&ecspi1 { + cs-gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_ecspi1>; + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <20000000>; + #address-cells = <1>; + #size-cells = <1>; + }; +}; &fec { pinctrl-names = "default"; @@ -58,6 +73,16 @@ >; }; + pinctrl_ecspi1: ecspi1grp { + fsl,pins = < + MX6QDL_PAD_EIM_D17__ECSPI1_MISO 0x100b1 + MX6QDL_PAD_EIM_D18__ECSPI1_MOSI 0x100b1 + MX6QDL_PAD_EIM_D16__ECSPI1_SCLK 0x100b1 + /* CS */ + MX6QDL_PAD_EIM_D19__GPIO3_IO19 0x000b1 + >; + }; + pinctrl_usbotg: usbotggrp { fsl,pins = < MX6QDL_PAD_EIM_D21__USB_OTG_OC 0x1b0b0 diff --git a/arch/arm/dts/imx6dl-prtrvt.dts b/arch/arm/dts/imx6dl-prtrvt.dts index 802bd50ae6..c403ba3ea7 100644 --- a/arch/arm/dts/imx6dl-prtrvt.dts +++ b/arch/arm/dts/imx6dl-prtrvt.dts @@ -6,6 +6,7 @@ /dts-v1/; #include <arm/imx6dl.dtsi> #include "imx6qdl-prti6q.dtsi" +#include "imx6qdl-prti6q-nor.dtsi" #include <dt-bindings/leds/common.h> / { diff --git a/arch/arm/dts/imx6q-prti6q.dts b/arch/arm/dts/imx6q-prti6q.dts index 76bb4d53d3..63a02149f1 100644 --- a/arch/arm/dts/imx6q-prti6q.dts +++ b/arch/arm/dts/imx6q-prti6q.dts @@ -6,6 +6,7 @@ /dts-v1/; #include <arm/imx6q.dtsi> #include "imx6qdl-prti6q.dtsi" +#include "imx6qdl-prti6q-nor.dtsi" #include <dt-bindings/leds/common.h> #include <dt-bindings/sound/fsl-imx-audmux.h> @@ -13,13 +14,6 @@ model = "Protonic PRTI6Q board"; compatible = "prt,prti6q", "fsl,imx6q"; - chosen { - environment { - compatible = "barebox,environment"; - device-path = &ecspi1, "partname:env"; - }; - }; - memory@10000000 { device_type = "memory"; reg = <0x10000000 0xf0000000>; @@ -161,24 +155,8 @@ compatible = "jedec,spi-nor"; reg = <0>; spi-max-frequency = <20000000>; - #address-cells = <1>; #size-cells = <1>; - - partition@0 { - label = "boot"; - reg = <0x0 0x100000>; - }; - - partition@100000 { - label = "env"; - reg = <0x100000 0x10000>; - }; - - partition@110000 { - label = "spare"; - reg = <0x110000 0x2f0000>; - }; }; }; diff --git a/arch/arm/dts/imx6qdl-prti6q-nor.dtsi b/arch/arm/dts/imx6qdl-prti6q-nor.dtsi new file mode 100644 index 0000000000..ad718ce421 --- /dev/null +++ b/arch/arm/dts/imx6qdl-prti6q-nor.dtsi @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +&ecspi1 { + flash@0 { + partition@0 { + label = "barebox"; + reg = <0x0 0x100000>; + }; + }; +}; diff --git a/arch/arm/dts/imx6qdl-prti6q.dtsi b/arch/arm/dts/imx6qdl-prti6q.dtsi index ed526d185f..19acca042d 100644 --- a/arch/arm/dts/imx6qdl-prti6q.dtsi +++ b/arch/arm/dts/imx6qdl-prti6q.dtsi @@ -9,6 +9,11 @@ / { chosen { stdout-path = &uart4; + + environment-emmc { + compatible = "barebox,environment"; + device-path = &usdhc3, "partname:barebox-environment"; + }; }; reg_1v8: regulator-1v8 { @@ -105,7 +110,22 @@ pinctrl-0 = <&pinctrl_usdhc3>; bus-width = <8>; non-removable; + no-sdio; + no-sd; status = "okay"; + + #address-cells = <1>; + #size-cells = <1>; + + partition@100000 { + label = "barebox-environment"; + reg = <0x100000 0x100000>; + }; + + partition@200000 { + label = "state"; + reg = <0x200000 0x100000>; + }; }; &iomuxc { diff --git a/arch/arm/dts/imx6qdl-vicut1.dtsi b/arch/arm/dts/imx6qdl-vicut1.dtsi index dc18614f89..dbfcf2527c 100644 --- a/arch/arm/dts/imx6qdl-vicut1.dtsi +++ b/arch/arm/dts/imx6qdl-vicut1.dtsi @@ -4,6 +4,7 @@ */ #include "imx6qdl-prti6q.dtsi" +#include "imx6qdl-prti6q-nor.dtsi" #include <dt-bindings/input/input.h> / { @@ -74,6 +75,21 @@ }; }; +&ecspi1 { + cs-gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_ecspi1>; + status = "okay"; + + flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <20000000>; + #address-cells = <1>; + #size-cells = <1>; + }; +}; + &iomuxc { pinctrl_hog: hoggrp { fsl,pins = < @@ -151,6 +167,16 @@ >; }; + pinctrl_ecspi1: ecspi1grp { + fsl,pins = < + MX6QDL_PAD_EIM_D17__ECSPI1_MISO 0x100b1 + MX6QDL_PAD_EIM_D18__ECSPI1_MOSI 0x100b1 + MX6QDL_PAD_EIM_D16__ECSPI1_SCLK 0x100b1 + /* CS */ + MX6QDL_PAD_EIM_D19__GPIO3_IO19 0x000b1 + >; + }; + pinctrl_usbotg: usbotggrp { fsl,pins = < MX6QDL_PAD_EIM_D21__USB_OTG_OC 0x1b0b0 -- 2.28.0 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5 07/12] ARM: dts: imx6q-prti6q: add pstore/ramoops node 2020-08-20 7:34 [PATCH v5 00/12] prepare Protonic board code for mainline Oleksij Rempel ` (5 preceding siblings ...) 2020-08-20 7:34 ` [PATCH v5 06/12] ARM: dts: unify barebox and barebox, env partitions for all Protonic boards Oleksij Rempel @ 2020-08-20 7:34 ` Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 08/12] ARM: dts: protonic: lanmcu: add eMMC partition table Oleksij Rempel ` (5 subsequent siblings) 12 siblings, 0 replies; 14+ messages in thread From: Oleksij Rempel @ 2020-08-20 7:34 UTC (permalink / raw) To: barebox, david; +Cc: Oleksij Rempel Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- arch/arm/dts/imx6qdl-prti6q.dtsi | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/arch/arm/dts/imx6qdl-prti6q.dtsi b/arch/arm/dts/imx6qdl-prti6q.dtsi index 19acca042d..f2b36553d4 100644 --- a/arch/arm/dts/imx6qdl-prti6q.dtsi +++ b/arch/arm/dts/imx6qdl-prti6q.dtsi @@ -16,6 +16,17 @@ }; }; + reserved-memory { + #address-cells = <1>; + #size-cells = <1>; + ranges; + + /* Address will be determined by the bootloader */ + ramoops { + compatible = "ramoops"; + }; + }; + reg_1v8: regulator-1v8 { compatible = "regulator-fixed"; regulator-name = "1v8"; -- 2.28.0 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5 08/12] ARM: dts: protonic: lanmcu: add eMMC partition table 2020-08-20 7:34 [PATCH v5 00/12] prepare Protonic board code for mainline Oleksij Rempel ` (6 preceding siblings ...) 2020-08-20 7:34 ` [PATCH v5 07/12] ARM: dts: imx6q-prti6q: add pstore/ramoops node Oleksij Rempel @ 2020-08-20 7:34 ` Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 09/12] ARM: dts: protonic: add fixed clock for the FEC node Oleksij Rempel ` (4 subsequent siblings) 12 siblings, 0 replies; 14+ messages in thread From: Oleksij Rempel @ 2020-08-20 7:34 UTC (permalink / raw) To: barebox, david; +Cc: Oleksij Rempel Since this board do not including imx6qdl-prti6q.dtsi, it will not get partition table which was added for other Protonic boards. So, add it separately. Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- arch/arm/dts/imx6dl-lanmcu.dts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/arch/arm/dts/imx6dl-lanmcu.dts b/arch/arm/dts/imx6dl-lanmcu.dts index b05ed9c3ba..06d47bdc0d 100644 --- a/arch/arm/dts/imx6dl-lanmcu.dts +++ b/arch/arm/dts/imx6dl-lanmcu.dts @@ -13,6 +13,11 @@ chosen { stdout-path = &uart4; + + environment-emmc { + compatible = "barebox,environment"; + device-path = &usdhc3, "partname:barebox-environment"; + }; }; memory { @@ -414,9 +419,14 @@ #size-cells = <1>; #address-cells = <1>; - bootstate_backend: bootstate_backend@f0000 { - reg = <0xf0000 0x10000>; - label = "bootstate"; + partition@100000 { + label = "barebox-environment"; + reg = <0x100000 0x100000>; + }; + + partition@200000 { + label = "state"; + reg = <0x200000 0x100000>; }; }; }; -- 2.28.0 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5 09/12] ARM: dts: protonic: add fixed clock for the FEC node 2020-08-20 7:34 [PATCH v5 00/12] prepare Protonic board code for mainline Oleksij Rempel ` (7 preceding siblings ...) 2020-08-20 7:34 ` [PATCH v5 08/12] ARM: dts: protonic: lanmcu: add eMMC partition table Oleksij Rempel @ 2020-08-20 7:34 ` Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 10/12] ARM: dts: protonic: lanmcu: use UART_CTS instead of GPIO based CTS Oleksij Rempel ` (3 subsequent siblings) 12 siblings, 0 replies; 14+ messages in thread From: Oleksij Rempel @ 2020-08-20 7:34 UTC (permalink / raw) To: barebox, david; +Cc: Oleksij Rempel Add fixed clock for the FEC nodes to workaround HW TX checksum issues in case a PHY is used as the clock source for RMII connection. By default the FEC node is using 3 clock sources, one of which is named "ptp" clock. If ptp clock has same source as "enet_ref" clock, then the ENET_REF_CLK input will become output. See [1]. The default configuration will work only if iMX is the clock provider for the PHY chip. In case PHY has own XTAL, then the PHY should be used as clock provider for the iMX/FEC. In case "ptp" clock is removed, the PHY clock will be used and most of communication will work as expected. But will trigger other issue - the HW generated checksums for UDP and TCP packets will be zero. It is kernel specific issue, not reproducible on barebox. Since, currently, most of PHY drivers are not defined as clock provider, we should define dummy fixed clock and use it. This workaround is used in some other devicetrees [2]. But it may imply the next hidden issue - the PHY can be suspended, reseted or reconfigured any time and this may add clock glitches on the ENET_REF_CLK line and put FEC in undefined state. [1] https://elixir.bootlin.com/linux/latest/source/arch/arm/mach-imx/mach-imx6q.c#L164 [2] https://elixir.bootlin.com/linux/latest/source/arch/arm/boot/dts/imx6dl-eckelmann-ci4x10.dts#L300 Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- arch/arm/dts/imx6dl-lanmcu.dts | 11 +++++++++-- arch/arm/dts/imx6dl-plym2m.dts | 11 +++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/arch/arm/dts/imx6dl-lanmcu.dts b/arch/arm/dts/imx6dl-lanmcu.dts index 06d47bdc0d..65f6cbf395 100644 --- a/arch/arm/dts/imx6dl-lanmcu.dts +++ b/arch/arm/dts/imx6dl-lanmcu.dts @@ -97,6 +97,12 @@ linux,default-trigger = "heartbeat"; }; }; + + clk50m_phy: phy_clock { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <50000000>; + }; }; &iomuxc { @@ -304,8 +310,9 @@ phy-mode = "rmii"; phy-reset-gpios = <&gpio5 22 GPIO_ACTIVE_LOW>; clocks = <&clks IMX6QDL_CLK_ENET>, - <&clks IMX6QDL_CLK_ENET>; - clock-names = "ipg", "ahb"; + <&clks IMX6QDL_CLK_ENET>, + <&clk50m_phy>; + clock-names = "ipg", "ahb", "ptp"; status = "okay"; }; diff --git a/arch/arm/dts/imx6dl-plym2m.dts b/arch/arm/dts/imx6dl-plym2m.dts index 335cb6f342..d04137e282 100644 --- a/arch/arm/dts/imx6dl-plym2m.dts +++ b/arch/arm/dts/imx6dl-plym2m.dts @@ -27,6 +27,12 @@ linux,default-trigger = "heartbeat"; }; }; + + clk50m_phy: phy_clock { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <50000000>; + }; }; &ecspi1 { @@ -50,8 +56,9 @@ phy-mode = "rmii"; phy-reset-gpios = <&gpio5 22 GPIO_ACTIVE_LOW>; clocks = <&clks IMX6QDL_CLK_ENET>, - <&clks IMX6QDL_CLK_ENET>; - clock-names = "ipg", "ahb"; + <&clks IMX6QDL_CLK_ENET>, + <&clk50m_phy>; + clock-names = "ipg", "ahb", "ptp"; status = "okay"; }; -- 2.28.0 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5 10/12] ARM: dts: protonic: lanmcu: use UART_CTS instead of GPIO based CTS 2020-08-20 7:34 [PATCH v5 00/12] prepare Protonic board code for mainline Oleksij Rempel ` (8 preceding siblings ...) 2020-08-20 7:34 ` [PATCH v5 09/12] ARM: dts: protonic: add fixed clock for the FEC node Oleksij Rempel @ 2020-08-20 7:34 ` Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 11/12] ARM: dts: protonic: properly define PHY nodes on lanmcu and plym2m boards Oleksij Rempel ` (2 subsequent siblings) 12 siblings, 0 replies; 14+ messages in thread From: Oleksij Rempel @ 2020-08-20 7:34 UTC (permalink / raw) To: barebox, david; +Cc: Oleksij Rempel Sync it with Protonic PLYBAS board to have same, reproducible behavior on all boards. Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- arch/arm/dts/imx6dl-lanmcu.dts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/arch/arm/dts/imx6dl-lanmcu.dts b/arch/arm/dts/imx6dl-lanmcu.dts index 65f6cbf395..42f8c91ece 100644 --- a/arch/arm/dts/imx6dl-lanmcu.dts +++ b/arch/arm/dts/imx6dl-lanmcu.dts @@ -201,7 +201,7 @@ fsl,pins = < MX6QDL_PAD_EIM_D26__UART2_RX_DATA 0x1b0b1 MX6QDL_PAD_EIM_D27__UART2_TX_DATA 0x1b0b1 - MX6QDL_PAD_EIM_D28__GPIO3_IO28 0x130b1 + MX6QDL_PAD_EIM_D28__UART2_CTS_B 0x130b1 >; }; @@ -209,7 +209,7 @@ fsl,pins = < MX6QDL_PAD_EIM_D24__UART3_TX_DATA 0x1b0b1 MX6QDL_PAD_EIM_D25__UART3_RX_DATA 0x1b0b1 - MX6QDL_PAD_EIM_D30__GPIO3_IO30 0x130b1 + MX6QDL_PAD_EIM_D30__UART3_CTS_B 0x130b1 >; }; @@ -320,7 +320,6 @@ pinctrl-names = "default"; pinctrl-0 = <&pinctrl_uart2>; linux,rs485-enabled-at-boot-time; - rts-gpios = <&gpio3 28 GPIO_ACTIVE_HIGH>; status = "okay"; }; @@ -328,7 +327,6 @@ pinctrl-names = "default"; pinctrl-0 = <&pinctrl_uart3>; linux,rs485-enabled-at-boot-time; - rts-gpios = <&gpio3 30 GPIO_ACTIVE_HIGH>; status = "okay"; }; -- 2.28.0 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5 11/12] ARM: dts: protonic: properly define PHY nodes on lanmcu and plym2m boards 2020-08-20 7:34 [PATCH v5 00/12] prepare Protonic board code for mainline Oleksij Rempel ` (9 preceding siblings ...) 2020-08-20 7:34 ` [PATCH v5 10/12] ARM: dts: protonic: lanmcu: use UART_CTS instead of GPIO based CTS Oleksij Rempel @ 2020-08-20 7:34 ` Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 12/12] ARM: dts: protonic: lanmcu: add uart-has-rtscts to enable rs485 functionality Oleksij Rempel 2020-08-24 6:51 ` [PATCH v5 00/12] prepare Protonic board code for mainline Sascha Hauer 12 siblings, 0 replies; 14+ messages in thread From: Oleksij Rempel @ 2020-08-20 7:34 UTC (permalink / raw) To: barebox, david; +Cc: Oleksij Rempel Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- arch/arm/dts/imx6dl-lanmcu.dts | 15 ++++++++++++++- arch/arm/dts/imx6dl-plym2m.dts | 15 ++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/arch/arm/dts/imx6dl-lanmcu.dts b/arch/arm/dts/imx6dl-lanmcu.dts index 42f8c91ece..67139930f9 100644 --- a/arch/arm/dts/imx6dl-lanmcu.dts +++ b/arch/arm/dts/imx6dl-lanmcu.dts @@ -308,12 +308,25 @@ pinctrl-names = "default"; pinctrl-0 = <&pinctrl_enet>; phy-mode = "rmii"; - phy-reset-gpios = <&gpio5 22 GPIO_ACTIVE_LOW>; clocks = <&clks IMX6QDL_CLK_ENET>, <&clks IMX6QDL_CLK_ENET>, <&clk50m_phy>; clock-names = "ipg", "ahb", "ptp"; status = "okay"; + + mdio { + #address-cells = <1>; + #size-cells = <0>; + + /* Microchip KSZ8081RNA PHY */ + rgmii_phy: ethernet-phy@0 { + reg = <0>; + interrupts-extended = <&gpio5 23 IRQ_TYPE_LEVEL_LOW>; + reset-gpios = <&gpio5 22 GPIO_ACTIVE_LOW>; + reset-assert-us = <10000>; + reset-deassert-us = <300>; + }; + }; }; &uart2 { diff --git a/arch/arm/dts/imx6dl-plym2m.dts b/arch/arm/dts/imx6dl-plym2m.dts index d04137e282..e944a14dce 100644 --- a/arch/arm/dts/imx6dl-plym2m.dts +++ b/arch/arm/dts/imx6dl-plym2m.dts @@ -54,12 +54,25 @@ pinctrl-names = "default"; pinctrl-0 = <&pinctrl_enet>; phy-mode = "rmii"; - phy-reset-gpios = <&gpio5 22 GPIO_ACTIVE_LOW>; clocks = <&clks IMX6QDL_CLK_ENET>, <&clks IMX6QDL_CLK_ENET>, <&clk50m_phy>; clock-names = "ipg", "ahb", "ptp"; status = "okay"; + + mdio { + #address-cells = <1>; + #size-cells = <0>; + + /* Microchip KSZ8081RNA PHY */ + rgmii_phy: ethernet-phy@0 { + reg = <0>; + interrupts-extended = <&gpio5 23 IRQ_TYPE_LEVEL_LOW>; + reset-gpios = <&gpio5 22 GPIO_ACTIVE_LOW>; + reset-assert-us = <10000>; + reset-deassert-us = <300>; + }; + }; }; &iomuxc { -- 2.28.0 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5 12/12] ARM: dts: protonic: lanmcu: add uart-has-rtscts to enable rs485 functionality 2020-08-20 7:34 [PATCH v5 00/12] prepare Protonic board code for mainline Oleksij Rempel ` (10 preceding siblings ...) 2020-08-20 7:34 ` [PATCH v5 11/12] ARM: dts: protonic: properly define PHY nodes on lanmcu and plym2m boards Oleksij Rempel @ 2020-08-20 7:34 ` Oleksij Rempel 2020-08-24 6:51 ` [PATCH v5 00/12] prepare Protonic board code for mainline Sascha Hauer 12 siblings, 0 replies; 14+ messages in thread From: Oleksij Rempel @ 2020-08-20 7:34 UTC (permalink / raw) To: barebox, david; +Cc: Oleksij Rempel Without this flag the kernel was ignoring linux,rs485-enabled-at-boot-time property. Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de> --- arch/arm/dts/imx6dl-lanmcu.dts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm/dts/imx6dl-lanmcu.dts b/arch/arm/dts/imx6dl-lanmcu.dts index 67139930f9..12fa816ca4 100644 --- a/arch/arm/dts/imx6dl-lanmcu.dts +++ b/arch/arm/dts/imx6dl-lanmcu.dts @@ -333,6 +333,7 @@ pinctrl-names = "default"; pinctrl-0 = <&pinctrl_uart2>; linux,rs485-enabled-at-boot-time; + uart-has-rtscts; status = "okay"; }; @@ -340,6 +341,7 @@ pinctrl-names = "default"; pinctrl-0 = <&pinctrl_uart3>; linux,rs485-enabled-at-boot-time; + uart-has-rtscts; status = "okay"; }; -- 2.28.0 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v5 00/12] prepare Protonic board code for mainline 2020-08-20 7:34 [PATCH v5 00/12] prepare Protonic board code for mainline Oleksij Rempel ` (11 preceding siblings ...) 2020-08-20 7:34 ` [PATCH v5 12/12] ARM: dts: protonic: lanmcu: add uart-has-rtscts to enable rs485 functionality Oleksij Rempel @ 2020-08-24 6:51 ` Sascha Hauer 12 siblings, 0 replies; 14+ messages in thread From: Sascha Hauer @ 2020-08-24 6:51 UTC (permalink / raw) To: Oleksij Rempel; +Cc: barebox, david On Thu, Aug 20, 2020 at 09:34:42AM +0200, Oleksij Rempel wrote: > changes v5: > - board: apply requested changes > - add PHY and rs458 devicetree fixes for lanmcu and plym2m > > changes v4: > - follow suggestion provided by Ahmad and open-code the root node > registration and call it machine.of > - board: rename crc and cs > - board: ignore most of init related errors. Even if one part will fail, > we should be able to get as mach as possible. > > changes v3: > - remove barebox-serial driver and use read the rfid directy from board > code (as was done in initial implementation) > - use initcall instead of registering driver in the board code > - add delayed USB scan > - add rampoops node > - add partition tables > > changes v2: > - add power init support for KvG boards > - spell fixes > - do not print error on probe exit > - add of_console_get_by_alias() helper > - free requested gpio array > - exit fec init only in case of PROBE_DEFERED > > This patch series is a preparation and actual Protonic board code. > Following changes was made in the main code: > - register DT root node as device to make it possible to loade board > code as usual driver > - provide helpers to read ethernet mac from nvmem cell register in a > devicetree. > - provide barebox-serial driver which should be a nvmem cell consumer > and > serial-number DT property provider. > - provide gpio helper to read gpio based board revision. > > Oleksij Rempel (12): > of: base: register DT root as device > gpiolib: add gpio_array_to_id helper to get ID out of GPIO array > common: console_common: add of_console_get_by_alias() helper > of: of_device_get_match_compatible() helper > ARM: protonic-imx6: port Protonic specific board code > ARM: dts: unify barebox and barebox,env partitions for all Protonic > boards > ARM: dts: imx6q-prti6q: add pstore/ramoops node > ARM: dts: protonic: lanmcu: add eMMC partition table > ARM: dts: protonic: add fixed clock for the FEC node > ARM: dts: protonic: lanmcu: use UART_CTS instead of GPIO based CTS > ARM: dts: protonic: properly define PHY nodes on lanmcu and plym2m > boards > ARM: dts: protonic: lanmcu: add uart-has-rtscts to enable rs485 > functionality Applied, thanks Sascha -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2020-08-24 6:51 UTC | newest] Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-08-20 7:34 [PATCH v5 00/12] prepare Protonic board code for mainline Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 01/12] of: base: register DT root as device Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 02/12] gpiolib: add gpio_array_to_id helper to get ID out of GPIO array Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 03/12] common: console_common: add of_console_get_by_alias() helper Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 04/12] of: of_device_get_match_compatible() helper Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 05/12] ARM: protonic-imx6: port Protonic specific board code Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 06/12] ARM: dts: unify barebox and barebox, env partitions for all Protonic boards Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 07/12] ARM: dts: imx6q-prti6q: add pstore/ramoops node Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 08/12] ARM: dts: protonic: lanmcu: add eMMC partition table Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 09/12] ARM: dts: protonic: add fixed clock for the FEC node Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 10/12] ARM: dts: protonic: lanmcu: use UART_CTS instead of GPIO based CTS Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 11/12] ARM: dts: protonic: properly define PHY nodes on lanmcu and plym2m boards Oleksij Rempel 2020-08-20 7:34 ` [PATCH v5 12/12] ARM: dts: protonic: lanmcu: add uart-has-rtscts to enable rs485 functionality Oleksij Rempel 2020-08-24 6:51 ` [PATCH v5 00/12] prepare Protonic board code for mainline Sascha Hauer
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox